970 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			970 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
; do *NOT* use register4 to register7 during time slicing
 | 
						|
graphicsMode        EQU     register0
 | 
						|
waitVBlankNum       EQU     register0
 | 
						|
 | 
						|
drawHLine_x1        EQU     register0
 | 
						|
drawHLine_y1        EQU     register1
 | 
						|
drawHLine_x2        EQU     register2
 | 
						|
drawHLine_x4        EQU     register3
 | 
						|
 | 
						|
drawVLine_x1        EQU     register0
 | 
						|
drawVLine_y1        EQU     register1
 | 
						|
drawVLine_y2        EQU     register2
 | 
						|
drawVLine_y8        EQU     register3
 | 
						|
 | 
						|
drawLine_x1         EQU     register0
 | 
						|
drawLine_y1         EQU     register1
 | 
						|
drawLine_x2         EQU     register2
 | 
						|
drawLine_y2         EQU     register3
 | 
						|
drawLine_xy1        EQU     register0
 | 
						|
drawLine_xy2        EQU     register1
 | 
						|
drawLine_dxy1       EQU     register2
 | 
						|
drawLine_dxy2       EQU     register3
 | 
						|
drawLine_dx1        EQU     register4                       ; register4 to register7 used for temp values, state will be invalidated during time slicing
 | 
						|
drawLine_dy1        EQU     register5
 | 
						|
drawLine_dx2        EQU     register6
 | 
						|
drawLine_dy2        EQU     register7
 | 
						|
drawLine_sx         EQU     register8
 | 
						|
drawLine_sy         EQU     register9
 | 
						|
drawLine_h          EQU     register10
 | 
						|
drawLine_num        EQU     register11
 | 
						|
drawLine_count      EQU     register12
 | 
						|
drawLine_tmp        EQU     register13
 | 
						|
drawLine_dx         EQU     register2
 | 
						|
drawLine_dy         EQU     register3
 | 
						|
drawLine_u          EQU     register8
 | 
						|
drawLine_v          EQU     register9
 | 
						|
drawLine_addr       EQU     register10
 | 
						|
 | 
						|
drawPixel_xy        EQU     register15
 | 
						|
readPixel_xy        EQU     register15
 | 
						|
 | 
						|
drawCircle_cx       EQU     register0
 | 
						|
drawCircle_cy       EQU     register1
 | 
						|
drawCircle_r        EQU     register2
 | 
						|
drawCircle_a        EQU     register3
 | 
						|
drawCircle_d        EQU     register8
 | 
						|
drawCircle_x        EQU     register9
 | 
						|
drawCircle_y        EQU     register10
 | 
						|
drawCircle_ch0      EQU     register11
 | 
						|
drawCircle_ch1      EQU     register12
 | 
						|
drawCircle_ch2      EQU     register13
 | 
						|
drawCircle_ch3      EQU     register14
 | 
						|
 | 
						|
drawCircleF_x1      EQU     register0
 | 
						|
drawCircleF_y1      EQU     register1
 | 
						|
drawCircleF_x2      EQU     register2
 | 
						|
drawCircleF_cx      EQU     register15
 | 
						|
drawCircleF_cy      EQU     register10
 | 
						|
drawCircleF_r       EQU     register11
 | 
						|
drawCircleF_v       EQU     register8
 | 
						|
drawCircleF_w       EQU     register9
 | 
						|
 | 
						|
drawRect_x1         EQU     register7
 | 
						|
drawRect_y1         EQU     register10
 | 
						|
drawRect_x2         EQU     register11
 | 
						|
drawRect_y2         EQU     register15
 | 
						|
 | 
						|
drawRectF_x1        EQU     register0
 | 
						|
drawRectF_y1        EQU     register1
 | 
						|
drawRectF_x2        EQU     register2
 | 
						|
drawRectF_y2        EQU     register7
 | 
						|
 | 
						|
drawPoly_mode       EQU     register14
 | 
						|
drawPoly_addr       EQU     register15
 | 
						|
 | 
						|
    
 | 
						|
%SUB                scanlineMode
 | 
						|
scanlineMode        LDWI    SYS_SetMode_v2_80
 | 
						|
                    STW     giga_sysFn
 | 
						|
                    LDW     graphicsMode
 | 
						|
                    SYS     80
 | 
						|
                    RET
 | 
						|
%ENDS   
 | 
						|
    
 | 
						|
%SUB                waitVBlanks
 | 
						|
waitVBlanks         PUSH
 | 
						|
 | 
						|
waitVB_loop         LDW     waitVBlankNum
 | 
						|
                    SUBI    0x01
 | 
						|
                    STW     waitVBlankNum
 | 
						|
                    BGE     waitVB_vblank
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
    
 | 
						|
waitVB_vblank       LDWI    waitVBlank
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    BRA     waitVB_loop
 | 
						|
%ENDS   
 | 
						|
 | 
						|
%SUB                waitVBlank
 | 
						|
waitVBlank          LD      giga_videoY
 | 
						|
                    XORI    179
 | 
						|
                    BNE     waitVBlank
 | 
						|
%if TIME_SLICING
 | 
						|
                    PUSH
 | 
						|
                    CALL    realTimeStubAddr
 | 
						|
                    POP
 | 
						|
%endif
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                readPixel
 | 
						|
readPixel           LD      readPixel_xy + 1                ; pixel = peek(peek(256 + 2*y)*256 + x)
 | 
						|
                    LSLW
 | 
						|
                    INC     giga_vAC + 1
 | 
						|
                    PEEK
 | 
						|
                    ST      readPixel_xy + 1
 | 
						|
                    LDW     readPixel_xy
 | 
						|
                    PEEK
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawPixel
 | 
						|
drawPixel           LD      drawPixel_xy + 1                ; poke peek(256 + 2*y)*256 + x, fg_colour
 | 
						|
                    LSLW
 | 
						|
                    INC     giga_vAC + 1
 | 
						|
                    PEEK
 | 
						|
                    ST      drawPixel_xy + 1
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawPixel_xy
 | 
						|
                    RET
 | 
						|
%ENDS   
 | 
						|
 | 
						|
%SUB                drawHLine
 | 
						|
drawHLine           PUSH
 | 
						|
                    LD      drawHLine_x1
 | 
						|
                    ST      giga_sysArg2                    ; low start address
 | 
						|
                    LD      drawHLine_x2
 | 
						|
                    SUBW    drawHLine_x1
 | 
						|
                    BGE     drawHL_cont
 | 
						|
                    LD      drawHLine_x2
 | 
						|
                    ST      giga_sysArg2                    ; low start address
 | 
						|
                    LD      drawHLine_x1
 | 
						|
                    SUBW    drawHLine_x2
 | 
						|
                    
 | 
						|
drawHL_cont         ADDI    1
 | 
						|
                    ST      giga_sysArg0                    ; count
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    ST      giga_sysArg1                    ; fill value
 | 
						|
                    LD      drawHLine_y1
 | 
						|
                    ADDI    8
 | 
						|
                    ST      giga_sysArg3                    ; high start address
 | 
						|
                    LDWI    SYS_SetMemory_v2_54
 | 
						|
                    STW     giga_sysFn
 | 
						|
                    SYS     54                              ; fill memory
 | 
						|
%if TIME_SLICING
 | 
						|
                    CALL    realTimeStubAddr
 | 
						|
%endif
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawVLine
 | 
						|
drawVLine           PUSH
 | 
						|
                    LDW     drawVLine_y2
 | 
						|
                    SUBW    drawVLine_y1
 | 
						|
                    BGE     drawVL_cont
 | 
						|
                    LDW     drawVLine_y2
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawVLine_y1
 | 
						|
                    STW     drawVLine_y2
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawVLine_y1                    ; if y2 < y1 then swap y2 with y1
 | 
						|
                    
 | 
						|
drawVL_cont         LD      drawVLine_x1
 | 
						|
                    ST      giga_sysArg4
 | 
						|
                    LD      drawVLine_y1
 | 
						|
                    ADDI    8
 | 
						|
                    ST      drawVLine_y1
 | 
						|
                    ST      giga_sysArg5
 | 
						|
                    LDW     drawVLine_y2
 | 
						|
                    ADDI    8
 | 
						|
                    ST      drawVLine_y2
 | 
						|
                    SUBW    drawVLine_y1
 | 
						|
                    SUBI    8
 | 
						|
                    BLT     drawVL_loop1
 | 
						|
                    
 | 
						|
                    LDW     fgbgColour
 | 
						|
                    STW     giga_sysArg0
 | 
						|
                    LDWI    SYS_VDrawBits_134
 | 
						|
                    STW     giga_sysFn                      ; setup 8 pixel SYS routine
 | 
						|
                    
 | 
						|
                    LDW     drawVLine_y2
 | 
						|
                    SUBI    7
 | 
						|
                    STW     drawVLine_y8                    ; 8 pixel chunks limit
 | 
						|
 | 
						|
drawVL_loop0        LDI     0xFF
 | 
						|
                    ST      giga_sysArg2                    ; 8 pixels of fg and bg colour
 | 
						|
                    SYS     134                             ; SYS_VDrawBits_134, 270 - 134/2 = 0xCB
 | 
						|
%if TIME_SLICING
 | 
						|
                    CALL    realTimeStubAddr
 | 
						|
%endif
 | 
						|
                    LD      giga_sysArg5
 | 
						|
                    ADDI    8
 | 
						|
                    ST      giga_sysArg5
 | 
						|
                    SUBW    drawVLine_y8
 | 
						|
                    BLT     drawVL_loop0                    ; all 8 pixel chunks
 | 
						|
                    
 | 
						|
drawVL_loop1        LD      fgbgColour + 1
 | 
						|
                    POKE    giga_sysArg4
 | 
						|
                    INC     giga_sysArg5
 | 
						|
                    LD      giga_sysArg5
 | 
						|
                    SUBW    drawVLine_y2
 | 
						|
                    BLE     drawVL_loop1                    ; remaining pixels
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawLine
 | 
						|
drawLine            PUSH                                    ; matches drawLineLoop's POP
 | 
						|
                    LDI     1
 | 
						|
                    STW     drawLine_dx1
 | 
						|
                    STW     drawLine_dx2
 | 
						|
                    STW     drawLine_dy1
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawLine_dy2                
 | 
						|
    
 | 
						|
                    LDWI    0x8000
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    
 | 
						|
                    LDW     drawLine_x2                     ; sx = x2 - x1
 | 
						|
                    SUBW    drawLine_x1
 | 
						|
                    STW     drawLine_sx
 | 
						|
                    ANDW    drawLine_tmp        
 | 
						|
                    BEQ     drawL_dy
 | 
						|
                    LDWI    -1
 | 
						|
                    STW     drawLine_dx1        
 | 
						|
                    STW     drawLine_dx2                    ; dx1 = dx2 = (sx & 0x8000) ? -1 : 1
 | 
						|
                    LDI     0                               ; sx = (sx & 0x8000) ? 0 - sx : sx
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    STW     drawLine_sx                
 | 
						|
                    
 | 
						|
drawL_dy            LDW     drawLine_y2
 | 
						|
                    SUBW    drawLine_y1
 | 
						|
                    STW     drawLine_sy
 | 
						|
                    STW     drawLine_h                      ; h = sy
 | 
						|
                    ANDW    drawLine_tmp
 | 
						|
                    BEQ     drawL_ext
 | 
						|
                    
 | 
						|
                    LDWI    -1
 | 
						|
                    STW     drawLine_dy1                    ; dy1 = (sy & 0x8000) ? -1 : 1
 | 
						|
                    LDI     0                   
 | 
						|
                    SUBW    drawLine_sy
 | 
						|
                    STW     drawLine_sy                     ; sy = (sy & 0x8000) ? 0 - sy : sy
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawL_ext           
 | 
						|
                    LDW     drawLine_dy1
 | 
						|
                    STW     drawLine_dy2                    ; if(sx < sy) dy2 = -1
 | 
						|
    
 | 
						|
drawL_ext           LDWI    drawLineLoadXY
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDWI    drawLineExt
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS   
 | 
						|
                    
 | 
						|
%SUB                drawLineExt
 | 
						|
drawLineExt         LDW     drawLine_sy
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawL_num
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawLine_dx2                    ; if(sx < sy) dx2 = 0
 | 
						|
                    LDW     drawLine_sy       
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawLine_sx
 | 
						|
                    STW     drawLine_sy
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawLine_sx                     ; swap sx with sy
 | 
						|
                    LDW     drawLine_h
 | 
						|
                    BLE     drawL_num
 | 
						|
                    LDI     1
 | 
						|
                    STW     drawLine_dy2                    ; if(h > 0) dy2 = 1
 | 
						|
    
 | 
						|
drawL_num           LDWI    SYS_LSRW1_48
 | 
						|
                    STW     giga_sysFn          
 | 
						|
                    LDW     drawLine_sx
 | 
						|
                    SYS     48
 | 
						|
                    ADDI    1
 | 
						|
                    STW     drawLine_num                    ; numerator = sx>>1
 | 
						|
                    STW     drawLine_count                  ; for(count=sx>>1; counti>=0; --i)
 | 
						|
                    
 | 
						|
                    LDWI    drawLineLoadDXY
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDWI    drawLineLoop
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawLineLoop
 | 
						|
drawLineLoop        LD      fgbgColour + 1
 | 
						|
                    POKE    drawLine_xy1                    ; plot start pixel
 | 
						|
                    POKE    drawLine_xy2                    ; plot end pixel, (meet in middle)
 | 
						|
                    
 | 
						|
                    LDW     drawLine_num                    ; numerator += sy
 | 
						|
                    ADDW    drawLine_sy
 | 
						|
                    STW     drawLine_num
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawL_flip                      ; if(numerator <= sx) goto flip
 | 
						|
                    STW     drawLine_num                    ; numerator -= sx
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy1
 | 
						|
                    ADDW    drawLine_dxy1
 | 
						|
                    STW     drawLine_xy1                    ; xy1 += dxy1
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy2
 | 
						|
                    SUBW    drawLine_dxy1
 | 
						|
                    STW     drawLine_xy2                    ; xy2 -= dxy1
 | 
						|
                    BRA     drawL_count
 | 
						|
                    
 | 
						|
drawL_flip          LDW     drawLine_xy1        
 | 
						|
                    ADDW    drawLine_dxy2
 | 
						|
                    STW     drawLine_xy1                    ; xy1 += dxy2
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy2        
 | 
						|
                    SUBW    drawLine_dxy2
 | 
						|
                    STW     drawLine_xy2                    ; xy2 -= dxy2
 | 
						|
 | 
						|
%if TIME_SLICING
 | 
						|
drawL_count         CALL    realTimeStubAddr
 | 
						|
                    LDW     drawLine_count
 | 
						|
%else
 | 
						|
drawL_count         LDW     drawLine_count
 | 
						|
%endif
 | 
						|
                    SUBI    0x01
 | 
						|
                    STW     drawLine_count
 | 
						|
                    BGT     drawLineLoop
 | 
						|
                    POP                                     ;matches drawLine's PUSH
 | 
						|
                    RET
 | 
						|
%ENDS   
 | 
						|
    
 | 
						|
%SUB                drawLineLoadXY
 | 
						|
drawLineLoadXY      LD      drawLine_x1
 | 
						|
                    ST      drawLine_xy1
 | 
						|
                    LD      drawLine_y1
 | 
						|
                    ADDI    8
 | 
						|
                    ST      drawLine_xy1 + 1                ;xy1 = x1 | ((y1+8)<<8)
 | 
						|
                    
 | 
						|
                    LD      drawLine_x2
 | 
						|
                    ST      drawLine_xy2
 | 
						|
                    LD      drawLine_y2
 | 
						|
                    ADDI    8
 | 
						|
                    ST      drawLine_xy2 + 1                ;xy2 = x2 | ((y2+8)<<8)
 | 
						|
                    RET
 | 
						|
                    
 | 
						|
drawLineLoadDXY     LDWI    SYS_LSLW8_24
 | 
						|
                    STW     giga_sysFn          
 | 
						|
                    LDW     drawLine_dy1
 | 
						|
                    SYS     28
 | 
						|
                    ADDW    drawLine_dx1
 | 
						|
                    STW     drawLine_dxy1                   ;dxy1 = dx1 + (dy1<<8)
 | 
						|
    
 | 
						|
                    LDW     drawLine_dy2
 | 
						|
                    SYS     28
 | 
						|
                    ADDW    drawLine_dx2
 | 
						|
                    STW     drawLine_dxy2                   ;dxy2 = dx2 + (dy2<<8)
 | 
						|
                    RET
 | 
						|
%ENDS   
 | 
						|
 | 
						|
%SUB                drawLineSlow
 | 
						|
drawLineSlow        PUSH
 | 
						|
                    LDI     1
 | 
						|
                    STW     drawLine_u
 | 
						|
                    LDW     drawLine_x2
 | 
						|
                    SUBW    drawLine_x1                     ; dx = x2 - x1
 | 
						|
                    BGE     drawLS_dxp
 | 
						|
                    LDWI    -1
 | 
						|
                    STW     drawLine_u
 | 
						|
                    LDW     drawLine_x1
 | 
						|
                    SUBW    drawLine_x2                     ; dx = x1 - x2
 | 
						|
                    
 | 
						|
drawLS_dxp          STW     drawLine_dx
 | 
						|
                    LDWI    256
 | 
						|
                    STW     drawLine_v
 | 
						|
                    LDW     drawLine_y2
 | 
						|
                    SUBW    drawLine_y1                     ; dy = y2 - y1
 | 
						|
                    BGE     drawLS_dyp
 | 
						|
                    LDWI    -256
 | 
						|
                    STW     drawLine_v
 | 
						|
                    LDW     drawLine_y1
 | 
						|
                    SUBW    drawLine_y2                     ; sy = y1 - y2
 | 
						|
                    
 | 
						|
drawLS_dyp          STW     drawLine_dy
 | 
						|
                    LDWI    drawLineSlowExt
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawLineSlowExt
 | 
						|
drawLineSlowExt     LD      drawLine_x1
 | 
						|
                    ST      drawLine_addr
 | 
						|
                    LD      drawLine_y1
 | 
						|
                    ADDI    8
 | 
						|
                    ST      drawLine_addr + 1
 | 
						|
                    LDW     drawLine_dx
 | 
						|
                    SUBW    drawLine_dy
 | 
						|
                    BGE     drawLS_noswap
 | 
						|
                    LDWI    drawLineSlowSwap
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    
 | 
						|
drawLS_noswap       LDI     0
 | 
						|
                    SUBW    drawLine_dx
 | 
						|
                    STW     drawLine_count
 | 
						|
                    STW     drawLine_num
 | 
						|
                    LDW     drawLine_dx
 | 
						|
                    ADDW    drawLine_dx
 | 
						|
                    STW     drawLine_dx
 | 
						|
                    LDW     drawLine_dy
 | 
						|
                    ADDW    drawLine_dy
 | 
						|
                    STW     drawLine_dy
 | 
						|
                    LDWI    drawLineSlowLoop
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawLineSlowLoop
 | 
						|
drawLineSlowLoop    LD      fgbgColour + 1
 | 
						|
                    POKE    drawLine_addr
 | 
						|
                    LDW     drawLine_count
 | 
						|
                    ADDW    drawLine_dy
 | 
						|
                    STW     drawLine_count
 | 
						|
                    BLE     drawLLS_xy
 | 
						|
                    SUBW    drawLine_dx
 | 
						|
                    STW     drawLine_count
 | 
						|
                    LDW     drawLine_addr
 | 
						|
                    ADDW    drawLine_v
 | 
						|
                    STW     drawLine_addr
 | 
						|
 | 
						|
drawLLS_xy          LDW     drawLine_addr
 | 
						|
                    ADDW    drawLine_u
 | 
						|
                    STW     drawLine_addr
 | 
						|
%if TIME_SLICING
 | 
						|
                    CALL    realTimeStubAddr
 | 
						|
%endif
 | 
						|
                    LDW     drawLine_num
 | 
						|
                    ADDI    1
 | 
						|
                    STW     drawLine_num
 | 
						|
                    BLE     drawLineSlowLoop
 | 
						|
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawLineSlowSwap
 | 
						|
drawLineSlowSwap    LDW     drawLine_dx
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawLine_dy
 | 
						|
                    STW     drawLine_dx
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawLine_dy
 | 
						|
                    LDW     drawLine_u
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawLine_v
 | 
						|
                    STW     drawLine_u
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawLine_v
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawVTLine
 | 
						|
drawVTLine          PUSH                                    ;matches drawVTLineLoop's POP
 | 
						|
                    LDI     1
 | 
						|
                    STW     drawLine_dx1
 | 
						|
                    STW     drawLine_dx2
 | 
						|
                    STW     drawLine_dy1
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawLine_dy2                
 | 
						|
    
 | 
						|
                    LDWI    0x8000
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    
 | 
						|
                    LDW     drawLine_x2                     ;sx = x2 - x1
 | 
						|
                    SUBW    drawLine_x1
 | 
						|
                    STW     drawLine_sx
 | 
						|
                    ANDW    drawLine_tmp        
 | 
						|
                    BEQ     drawVTL_dy
 | 
						|
                    LDWI    -1
 | 
						|
                    STW     drawLine_dx1        
 | 
						|
                    STW     drawLine_dx2                    ;dx1 = dx2 = (sx & 0x8000) ? -1 : 1
 | 
						|
                    LDI     0                               ;sx = (sx & 0x8000) ? 0 - sx : sx
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    STW     drawLine_sx                
 | 
						|
                    
 | 
						|
drawVTL_dy          LDW     drawLine_y2
 | 
						|
                    SUBW    drawLine_y1
 | 
						|
                    STW     drawLine_sy
 | 
						|
                    STW     drawLine_h                      ;h = sy
 | 
						|
                    ANDW    drawLine_tmp
 | 
						|
                    BEQ     drawVTL_ext
 | 
						|
                    
 | 
						|
                    LDWI    -1
 | 
						|
                    STW     drawLine_dy1                    ;dy1 = (sy & 0x8000) ? -1 : 1
 | 
						|
                    LDI     0                   
 | 
						|
                    SUBW    drawLine_sy
 | 
						|
                    STW     drawLine_sy                     ;sy = (sy & 0x8000) ? 0 - sy : sy
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawVTL_ext           
 | 
						|
                    LDW     drawLine_dy1
 | 
						|
                    STW     drawLine_dy2                    ;if(sx < sy) dy2 = -1
 | 
						|
    
 | 
						|
drawVTL_ext         LDWI    drawVTLineLoadXY
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDWI    drawVTLineExt
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS   
 | 
						|
                    
 | 
						|
%SUB                drawVTLineExt
 | 
						|
drawVTLineExt       LDW     drawLine_sy
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawVTL_num
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawLine_dx2                    ;if(sx < sy) dx2 = 0
 | 
						|
                    LDW     drawLine_sy       
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawLine_sx
 | 
						|
                    STW     drawLine_sy
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawLine_sx                     ;swap sx with sy
 | 
						|
                    LDW     drawLine_h
 | 
						|
                    BLE     drawVTL_num
 | 
						|
                    LDI     1
 | 
						|
                    STW     drawLine_dy2                    ;if(h > 0) dy2 = 1
 | 
						|
    
 | 
						|
drawVTL_num         LDWI    SYS_LSRW1_48
 | 
						|
                    STW     giga_sysFn          
 | 
						|
                    LDW     drawLine_sx
 | 
						|
                    SYS     48
 | 
						|
                    ADDI    1
 | 
						|
                    STW     drawLine_num                    ;numerator = sx>>1
 | 
						|
                    STW     drawLine_count                  ;for(count=sx>>1; counti>=0; --i)
 | 
						|
                    
 | 
						|
                    LDWI    drawVTLineLoadDXY
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDWI    drawVTLineLoop
 | 
						|
                    CALL    giga_vAC
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawVTLineLoop
 | 
						|
drawVTLineLoop      LDW     drawLine_xy1
 | 
						|
                    STW     drawPixel_xy
 | 
						|
                    LDWI    drawPixel
 | 
						|
                    CALL    giga_vAC                        ;plot start pixel
 | 
						|
 | 
						|
                    LDW     drawLine_xy2
 | 
						|
                    STW     drawPixel_xy
 | 
						|
                    LDWI    drawPixel
 | 
						|
                    CALL    giga_vAC                        ;plot end pixel, (meet in middle)
 | 
						|
                    
 | 
						|
                    LDW     drawLine_num                    ;numerator += sy
 | 
						|
                    ADDW    drawLine_sy
 | 
						|
                    STW     drawLine_num
 | 
						|
                    SUBW    drawLine_sx
 | 
						|
                    BLE     drawVTL_flip                    ;if(numerator <= sx) goto flip
 | 
						|
                    STW     drawLine_num                    ;numerator -= sx
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy1
 | 
						|
                    ADDW    drawLine_dxy1
 | 
						|
                    STW     drawLine_xy1                    ;xy1 += dxy1
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy2
 | 
						|
                    SUBW    drawLine_dxy1
 | 
						|
                    STW     drawLine_xy2                    ;xy2 -= dxy1
 | 
						|
                    BRA     drawVTL_count
 | 
						|
                    
 | 
						|
drawVTL_flip        LDW     drawLine_xy1        
 | 
						|
                    ADDW    drawLine_dxy2
 | 
						|
                    STW     drawLine_xy1                    ;xy1 += dxy2
 | 
						|
                    
 | 
						|
                    LDW     drawLine_xy2        
 | 
						|
                    SUBW    drawLine_dxy2
 | 
						|
                    STW     drawLine_xy2                    ;xy2 -= dxy2
 | 
						|
 | 
						|
%if TIME_SLICING
 | 
						|
drawVTL_count       CALL    realTimeStubAddr
 | 
						|
                    LDW     drawLine_count
 | 
						|
%else
 | 
						|
drawVTL_count       LDW     drawLine_count
 | 
						|
%endif
 | 
						|
                    SUBI    0x01
 | 
						|
                    STW     drawLine_count
 | 
						|
                    BGT     drawVTLineLoop
 | 
						|
                    POP                                     ;matches drawVTLine's PUSH
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawVTLineLoadXY
 | 
						|
drawVTLineLoadXY    LD      drawLine_x1
 | 
						|
                    ST      drawLine_xy1
 | 
						|
                    LD      drawLine_y1
 | 
						|
                    ST      drawLine_xy1 + 1                ;xy1 = x1 | (y1<<8)
 | 
						|
                    
 | 
						|
                    LD      drawLine_x2
 | 
						|
                    ST      drawLine_xy2
 | 
						|
                    LD      drawLine_y2
 | 
						|
                    ST      drawLine_xy2 + 1                ;xy2 = x2 | (y2<<8)
 | 
						|
                    RET
 | 
						|
                    
 | 
						|
drawVTLineLoadDXY   LDWI    SYS_LSLW8_24
 | 
						|
                    STW     giga_sysFn          
 | 
						|
                    LDW     drawLine_dy1
 | 
						|
                    SYS     28
 | 
						|
                    ADDW    drawLine_dx1
 | 
						|
                    STW     drawLine_dxy1                   ;dxy1 = dx1 + (dy1<<8)
 | 
						|
    
 | 
						|
                    LDW     drawLine_dy2
 | 
						|
                    SYS     28
 | 
						|
                    ADDW    drawLine_dx2
 | 
						|
                    STW     drawLine_dxy2                   ;dxy2 = dx2 + (dy2<<8)
 | 
						|
                    RET
 | 
						|
%ENDS   
 | 
						|
 | 
						|
%SUB                drawCircle
 | 
						|
drawCircle          PUSH
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawCircle_ch0
 | 
						|
                    STW     drawCircle_ch1
 | 
						|
                    STW     drawCircle_ch2
 | 
						|
                    STW     drawCircle_ch3
 | 
						|
                    STW     drawCircle_x
 | 
						|
                    LDW     drawCircle_r
 | 
						|
                    STW     drawCircle_y
 | 
						|
                    LDI     1
 | 
						|
                    SUBW    drawCircle_r
 | 
						|
                    STW     drawCircle_d
 | 
						|
                    
 | 
						|
drawC_loop          LDWI    drawCircleExt1
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    
 | 
						|
                    LDW     drawCircle_d
 | 
						|
                    BGE     drawC_skip
 | 
						|
                    LDW     drawCircle_x
 | 
						|
                    LSLW
 | 
						|
                    LSLW
 | 
						|
                    ADDW    drawCircle_d
 | 
						|
                    ADDI    3
 | 
						|
                    STW     drawCircle_d
 | 
						|
                    BRA     drawC_cont
 | 
						|
                    
 | 
						|
drawC_skip          LDW     drawCircle_x
 | 
						|
                    SUBW    drawCircle_y
 | 
						|
                    LSLW
 | 
						|
                    LSLW
 | 
						|
                    ADDW    drawCircle_d
 | 
						|
                    ADDI    5
 | 
						|
                    STW     drawCircle_d
 | 
						|
                    LDW     drawCircle_y
 | 
						|
                    SUBI    1
 | 
						|
                    STW     drawCircle_y
 | 
						|
 | 
						|
drawC_cont          INC     drawCircle_x
 | 
						|
                    LDW     drawCircle_x
 | 
						|
                    SUBW    drawCircle_y
 | 
						|
                    BLE     drawC_loop
 | 
						|
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawCircleExt1
 | 
						|
drawCircleExt1      PUSH
 | 
						|
                    LDW     drawCircle_cy
 | 
						|
                    ADDW    drawCircle_y
 | 
						|
                    ST      drawCircle_ch0 + 1
 | 
						|
                    LDW     drawCircle_cy
 | 
						|
                    SUBW    drawCircle_y
 | 
						|
                    ST      drawCircle_ch1 + 1
 | 
						|
                    LDW     drawCircle_cy
 | 
						|
                    ADDW    drawCircle_x
 | 
						|
                    ST      drawCircle_ch2 + 1
 | 
						|
                    LDW     drawCircle_cy
 | 
						|
                    SUBW    drawCircle_x
 | 
						|
                    ST      drawCircle_ch3 + 1
 | 
						|
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    ADDW    drawCircle_x
 | 
						|
                    ADDW    drawCircle_ch0
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    SUBW    drawCircle_x
 | 
						|
                    ADDW    drawCircle_ch0
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
                    
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    ADDW    drawCircle_x
 | 
						|
                    ADDW    drawCircle_ch1
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    SUBW    drawCircle_x
 | 
						|
                    ADDW    drawCircle_ch1
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
                    
 | 
						|
                    LDWI    drawCircleExt2
 | 
						|
                    CALL    giga_vAC                        ;doesn't return to here
 | 
						|
%ENDS
 | 
						|
                    
 | 
						|
%SUB                drawCircleExt2
 | 
						|
drawCircleExt2      LDW     drawCircle_cx
 | 
						|
                    ADDW    drawCircle_y
 | 
						|
                    ADDW    drawCircle_ch2
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    SUBW    drawCircle_y
 | 
						|
                    ADDW    drawCircle_ch2
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
                    
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    ADDW    drawCircle_y
 | 
						|
                    ADDW    drawCircle_ch3
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
 | 
						|
                    LDW     drawCircle_cx
 | 
						|
                    SUBW    drawCircle_y
 | 
						|
                    ADDW    drawCircle_ch3
 | 
						|
                    STW     drawCircle_a
 | 
						|
                    LD      fgbgColour + 1
 | 
						|
                    POKE    drawCircle_a
 | 
						|
                    
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawCircleF
 | 
						|
drawCircleF         PUSH
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawCircleF_v
 | 
						|
                    STW     drawCircleF_w
 | 
						|
                    
 | 
						|
drawCF_wloop        LDW     drawCircleF_cx
 | 
						|
                    SUBW    drawCircleF_r
 | 
						|
                    STW     drawCircleF_x1
 | 
						|
                    LDW     drawCircleF_cx
 | 
						|
                    ADDW    drawCircleF_r
 | 
						|
                    STW     drawCircleF_x2
 | 
						|
                    LDW     drawCircleF_cy
 | 
						|
                    SUBW    drawCircleF_v
 | 
						|
                    STW     drawCircleF_y1
 | 
						|
                    LDWI    drawHLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDW     drawCircleF_cy
 | 
						|
                    ADDW    drawCircleF_v
 | 
						|
                    STW     drawCircleF_y1
 | 
						|
                    LDWI    drawHLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    
 | 
						|
                    LDW     drawCircleF_w
 | 
						|
                    ADDW    drawCircleF_v
 | 
						|
                    ADDW    drawCircleF_v
 | 
						|
                    ADDI    1
 | 
						|
                    STW     drawCircleF_w
 | 
						|
                    INC     drawCircleF_v
 | 
						|
                    
 | 
						|
drawCF_rloop        LDW     drawCircleF_w
 | 
						|
                    BLT     drawCF_wloop
 | 
						|
                    LDW     drawCircleF_w
 | 
						|
                    SUBW    drawCircleF_r
 | 
						|
                    SUBW    drawCircleF_r
 | 
						|
                    ADDI    1
 | 
						|
                    STW     drawCircleF_w
 | 
						|
                    LDW     drawCircleF_r
 | 
						|
                    SUBI    1
 | 
						|
                    STW     drawCircleF_r
 | 
						|
                    BGT     drawCF_rloop
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawRect
 | 
						|
drawRect            PUSH
 | 
						|
                    LDW     drawRect_x1
 | 
						|
                    STW     drawHLine_x1
 | 
						|
                    LDW     drawRect_y1
 | 
						|
                    STW     drawHLine_y1
 | 
						|
                    LDW     drawRect_x2
 | 
						|
                    STW     drawHLine_x2
 | 
						|
                    LDWI    drawHLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDW     drawRect_y2
 | 
						|
                    STW     drawHLine_y1
 | 
						|
                    LDWI    drawHLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
 | 
						|
                    LDW     drawRect_x1
 | 
						|
                    STW     drawVLine_x1
 | 
						|
                    LDW     drawRect_y1
 | 
						|
                    STW     drawVLine_y1
 | 
						|
                    LDW     drawRect_y2
 | 
						|
                    STW     drawVLine_y2
 | 
						|
                    LDWI    drawVLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDW     drawRect_x2
 | 
						|
                    STW     drawVLine_x1
 | 
						|
                    LDW     drawRect_y1
 | 
						|
                    STW     drawVLine_y1
 | 
						|
                    LDW     drawRect_y2
 | 
						|
                    STW     drawVLine_y2
 | 
						|
                    LDWI    drawVLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawRectF
 | 
						|
drawRectF           PUSH
 | 
						|
                    LDW     drawRectF_y2
 | 
						|
                    SUBW    drawRectF_y1
 | 
						|
                    BGE     drawRF_loop
 | 
						|
                    LDW     drawRectF_y2
 | 
						|
                    STW     drawLine_tmp
 | 
						|
                    LDW     drawRectF_y1
 | 
						|
                    STW     drawRectF_y2
 | 
						|
                    LDW     drawLine_tmp
 | 
						|
                    STW     drawRectF_y1                    ;if y2 < y1 then swap y2 with y1
 | 
						|
                    
 | 
						|
drawRF_loop         LDW     drawRectF_y1
 | 
						|
                    STW     drawHLine_y1
 | 
						|
                    LDWI    drawHLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    INC     drawRectF_y1
 | 
						|
                    LDW     drawRectF_y1
 | 
						|
                    SUBW    drawRectF_y2
 | 
						|
                    BLE     drawRF_loop
 | 
						|
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawPoly
 | 
						|
drawPoly            PUSH
 | 
						|
 | 
						|
drawP_loop          LD      cursorXY
 | 
						|
                    STW     drawLine_x1
 | 
						|
                    LD      cursorXY + 1
 | 
						|
                    STW     drawLine_y1
 | 
						|
                    LDW     drawPoly_addr
 | 
						|
                    PEEK
 | 
						|
                    STW     drawLine_x2
 | 
						|
                    SUBI    255
 | 
						|
                    BEQ     drawP_exit
 | 
						|
                    LDW     drawLine_x2
 | 
						|
                    ST      cursorXY
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    LDW     drawPoly_addr
 | 
						|
                    PEEK
 | 
						|
                    STW     drawLine_y2
 | 
						|
                    ST      cursorXY + 1
 | 
						|
                    LDWI    drawLine
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    BRA     drawP_loop
 | 
						|
                    
 | 
						|
drawP_exit          POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                drawPolyRel
 | 
						|
drawPolyRel         PUSH
 | 
						|
 | 
						|
drawPR_loop         LD      cursorXY
 | 
						|
                    STW     drawLine_x1
 | 
						|
                    LD      cursorXY + 1
 | 
						|
                    STW     drawLine_y1
 | 
						|
                    LDW     drawPoly_addr
 | 
						|
                    DEEK
 | 
						|
                    STW     drawLine_x2
 | 
						|
                    SUBI    255
 | 
						|
                    BEQ     drawPR_exit
 | 
						|
                    LDW     drawLine_x1
 | 
						|
drawPR_x2           ADDW    drawLine_x2                     ;relative X mode
 | 
						|
                    STW     drawLine_x2
 | 
						|
                    ST      cursorXY
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    LDW     drawPoly_addr
 | 
						|
                    DEEK
 | 
						|
                    STW     drawLine_y2
 | 
						|
                    LDW     drawLine_y1
 | 
						|
drawPR_y2           ADDW    drawLine_y2                     ;relative Y mode
 | 
						|
                    STW     drawLine_y2
 | 
						|
                    ST      cursorXY + 1
 | 
						|
                    LDWI    drawLineSlow
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    INC     drawPoly_addr
 | 
						|
                    BRA     drawPR_loop
 | 
						|
                    
 | 
						|
drawPR_exit         LDI     0x99                            ;ADDW
 | 
						|
                    ST      drawPoly_mode
 | 
						|
                    LDWI    setPolyRelFlipX
 | 
						|
                    CALL    giga_vAC
 | 
						|
                    LDWI    setPolyRelFlipY
 | 
						|
                    CALL    giga_vAC                        ;reset X and Y modes
 | 
						|
                    POP
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                setPolyRelFlipX
 | 
						|
setPolyRelFlipX     LDWI    drawPR_x2
 | 
						|
                    STW     drawPoly_addr
 | 
						|
                    LD      drawPoly_mode
 | 
						|
                    POKE    drawPoly_addr
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                setPolyRelFlipY
 | 
						|
setPolyRelFlipY     LDWI    drawPR_y2
 | 
						|
                    STW     drawPoly_addr
 | 
						|
                    LD      drawPoly_mode
 | 
						|
                    POKE    drawPoly_addr
 | 
						|
                    RET
 | 
						|
%ENDS
 | 
						|
 | 
						|
%SUB                atLineCursor
 | 
						|
atLineCursor        LD      cursorXY
 | 
						|
                    STW     drawLine_x1
 | 
						|
                    SUBI    giga_xres
 | 
						|
                    BLT     atLC_x1good
 | 
						|
                    LDI     0
 | 
						|
                    STW     drawLine_x1
 | 
						|
                    
 | 
						|
atLC_x1good         LD      cursorXY
 | 
						|
                    ADDW    drawLine_x2
 | 
						|
                    SUBI    giga_xres
 | 
						|
                    BLT     atLC_x2good
 | 
						|
                    LDWI    -giga_xres
 | 
						|
                    
 | 
						|
atLC_x2good         ADDI    giga_xres
 | 
						|
                    STW     drawLine_x2
 | 
						|
                    ST      cursorXY
 | 
						|
 | 
						|
                    LD      cursorXY + 1
 | 
						|
                    STW     drawLine_y1
 | 
						|
                    SUBI    giga_yres
 | 
						|
                    BLT     atLC_y1good
 | 
						|
                    LDI     giga_yres - 1
 | 
						|
                    STW     drawLine_y1
 | 
						|
                    
 | 
						|
atLC_y1good         LD      cursorXY + 1
 | 
						|
                    ADDW    drawLine_y2
 | 
						|
                    SUBI    giga_yres
 | 
						|
                    BLT     atLC_y2good
 | 
						|
                    LDWI    -1
 | 
						|
                    
 | 
						|
atLC_y2good         ADDI    giga_yres
 | 
						|
                    STW     drawLine_y2
 | 
						|
                    ST      cursorXY + 1
 | 
						|
                    RET
 | 
						|
%ENDS |