229 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			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
 |