gigatron/rom/Contrib/at67/gbas/runtime/clear_screen.i
2025-01-28 19:17:01 +03:00

229 lines
7.7 KiB
OpenEdge ABL

; do *NOT* use register4 to register7 during time slicing
xreset EQU register0
xcount EQU register1
ycount EQU register2
treset EQU register3
breset EQU register8
top EQU register9
bot EQU register10
vramAddr EQU register11
evenAddr EQU register12
clsAddress EQU register13
varAddress EQU register13
clrAddress EQU register10
clrLines EQU register11
clrWidth EQU register12
clrStart EQU register13
clrEnd EQU register14
clrRem EQU register15
%SUB resetVars
resetVars LDI 0
DOKE varAddress
INC varAddress
INC varAddress
LD varAddress
XORI giga_One ; end of user vars
BNE resetVars
RET
%ENDS
%SUB resetVideoFlags
resetVideoFlags LDI giga_CursorX ; cursor x start
STW cursorXY
LDWI ON_BOTTOM_ROW_MSK
ANDW miscFlags
STW miscFlags ; reset on bottom row flag
RET
%ENDS
%SUB resetVideoTable
; resets video table pointers
resetVideoTable PUSH
LDI 8
STW vramAddr
LDWI giga_videoTable
STW evenAddr
%if TIME_SLICING
resetVT_loop CALL realTimeStubAddr
LDW vramAddr
%else
resetVT_loop LDW vramAddr
%endif
DOKE evenAddr
INC evenAddr
INC evenAddr
INC vramAddr
LD vramAddr
SUBI giga_yres + 8
BLT resetVT_loop
LDWI resetVideoFlags
CALL giga_vAC
POP
RET
%ENDS
%SUB initClearFuncs
initClearFuncs PUSH
LDWI resetVideoFlags
CALL giga_vAC
LD fgbgColour
ST giga_sysArg0
ST giga_sysArg0 + 1
ST giga_sysArg2
ST giga_sysArg2 + 1 ; 4 pixels of bg colour
LDWI SYS_Draw4_30 ; setup 4 pixel SYS routine
STW giga_sysFn
POP
RET
%ENDS
%SUB clearScreen
; clears the viewable screen, (unrolled 4 times with a SYS call doing 4 pixels, so 16 pixels per loop)
clearScreen PUSH
LDWI initClearFuncs
CALL giga_vAC
LDW clsAddress
STW giga_sysArg4
LDWI (giga_yres - 1) * 256
ADDW clsAddress
STW clsAddress ; end address
%if TIME_SLICING
clearS_loop CALL realTimeStubAddr
LD giga_sysArg4
%else
clearS_loop LD giga_sysArg4
%endif
SYS 30
ADDI 0x04
ST giga_sysArg4
SYS 30
ADDI 0x04
ST giga_sysArg4
SYS 30
ADDI 0x04
ST giga_sysArg4
SYS 30
ADDI 0x04
ST giga_sysArg4
SUBI giga_xres
BLT clearS_loop
LDI 0
ST giga_sysArg4
INC giga_sysArg4 + 1 ; next top line
LDW giga_sysArg4
SUBW clsAddress
BLE clearS_loop
POP
RET
%ENDS
%SUB clearRect
; clears a rectangle on the viewable screen
clearRect PUSH
LDWI initClearFuncs
CALL giga_vAC
LDW clrAddress
STW giga_sysArg4
LD giga_sysArg4 + 1
ADDW clrLines
STW clrLines
LD giga_sysArg4 ; clr start
STW clrStart
ADDW clrWidth
STW clrEnd
clearR_loop LDWI clearLine
CALL giga_vAC
INC giga_sysArg4 + 1 ; next line
LD giga_sysArg4 + 1
SUBW clrLines
BLT clearR_loop
POP
RET
%ENDS
%SUB clearLine
clearLine PUSH
LD clrStart
ST giga_sysArg4
LD clrWidth
ANDI 0xFC
BEQ clearL_remloop
STW clrRem
clearL_modloop SYS 30
%if TIME_SLICING
CALL realTimeStubAddr
%endif
LD giga_sysArg4
ADDI 4
ST giga_sysArg4
SUBW clrEnd
ADDW clrRem
BLT clearL_modloop ; all 4 pixel chunks
BEQ clearL_exit
LD giga_sysArg4
SUBI 4
ST giga_sysArg4
clearL_remloop LD fgbgColour
POKE giga_sysArg4
INC giga_sysArg4
LD giga_sysArg4
SUBW clrEnd
BLT clearL_remloop ; remaining pixels
clearL_exit POP
RET
%ENDS
%SUB clearVertBlinds
; clears the viewable screen using a vertical blinds effect
clearVertBlinds PUSH
LDWI initClearFuncs
CALL giga_vAC
LDWI giga_vram
STW giga_sysArg4
LD giga_sysArg4 + 1
ST top
%if TIME_SLICING
clearVB_loop CALL realTimeStubAddr
LD top
%else
clearVB_loop LD top
%endif
ST giga_sysArg4 + 1 ; top line
SYS 30
LDWI giga_yres - 1 + 16
SUBW top
ST giga_sysArg4 + 1 ; bottom line
SYS 30
LD giga_sysArg4
ADDI 0x04
ST giga_sysArg4
SUBI giga_xres
BLT clearVB_loop
LDI 0
ST giga_sysArg4
INC top ; next top line
LD top
SUBI giga_yres / 2 + 8
BLT clearVB_loop
POP
RET
%ENDS