gigatron/rom/Apps/Racer/SYS_Racer_v1.py
2025-01-28 19:17:01 +03:00

106 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
#-----------------------------------------------------------------------
#
# Racer-specific SYS extensions
#
#-----------------------------------------------------------------------
from __future__ import (
absolute_import,
division,
print_function,
unicode_literals,
)
from asm import *
# Peek into the ROM's symbol table
sysArgs = symbol('sysArgs0')
vTmp = symbol('vTmp')
vPC = symbol('vPC')
vAC = symbol('vAC')
#-----------------------------------------------------------------------
# SYS_RacerUpdateVideoX_40
#-----------------------------------------------------------------------
# Updates the odd videoTable entries for rendering the road curvature.
# This SYS call self-repeats for a total of 47 times and is equivalent to:
# [do
# q, X- p. p 4- p=
# q, X= q<++
# q<, if<>0loop]
#
label('SYS_RacerUpdateVideoX_40')
ld([sysArgs+2],X) #15 q,
ld([sysArgs+3],Y) #16
ld([Y,X]) #17
st([vTmp]) #18
suba([sysArgs+4]) #19 X-
ld([sysArgs+0],X) #20 p.
ld([sysArgs+1],Y) #21
st([Y,X]) #22
ld([sysArgs+0]) #23 p 4- p=
suba(4) #24
st([sysArgs+0]) #25
ld([vTmp]) #26 q,
st([sysArgs+4]) #27 X=
ld([sysArgs+2]) #28 <q++
adda(1) #29
st([sysArgs+2]) #30
bne('.sysRacer0') #31 Self-repeat by adjusting vPC
ld([vPC]) #32
bra('.sysRacer1') #33
nop() #34
label('.sysRacer0')
suba(2) #33
st([vPC]) #34
label('.sysRacer1')
ld(hi('REENTER'),Y) #35
jmp(Y,'REENTER') #36
ld(-40//2) #37
#-----------------------------------------------------------------------
# SYS_RacerUpdateVideoY_40
#-----------------------------------------------------------------------
# Updates an even videoTable entry for rendering grass and curbstone color.
# Native Gigatron accelaration for inner loop body:
#
# 8& [if<>0 1] tmp=
# SegmentY 254& tmp+ p.
# p<++ p<++
# SegmentY<++
# p<, 238^
label('SYS_RacerUpdateVideoY_40')
ld([sysArgs+3]) #15 8&
anda(8) #16
bne(pc()+3) #17 [if<>0 1]
bra(pc()+3) #18
ld(0) #19
ld(1) #19(!)
st([vTmp]) #20 tmp=
ld([sysArgs+1],Y) #21
ld([sysArgs+0]) #22 <p++ <p++
adda(2) #23
st([sysArgs+0],X) #24
xora(238) #25 238^
st([vAC]) #26
st([vAC+1]) #27
ld([sysArgs+2]) #28 SegmentY
anda(254) #29 254&
adda([vTmp]) #30 tmp+
st([Y,X]) #31
ld([sysArgs+2]) #32 <SegmentY++
adda(1) #33
st([sysArgs+2]) #34
ld(hi('REENTER'),Y) #35
jmp(Y,'REENTER') #36
ld(-40//2) #37
#-----------------------------------------------------------------------
#
#-----------------------------------------------------------------------