594 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			594 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
; **************************************************************************************************
 | 
						|
; **************************************************************************************************
 | 
						|
;  THIS WILL NOT RUN ON REAL HARDWARE UNLESS YOU BURN THE NATIVE CODE AT THE BOTTOM
 | 
						|
;  OF THIS FILE INTO THE GIGATRONS ROM AT THE CORRECT ADDRESS, EMULATION ONLY!
 | 
						|
; **************************************************************************************************
 | 
						|
; **************************************************************************************************
 | 
						|
 | 
						|
; sprite test
 | 
						|
 | 
						|
 | 
						|
%include ../include/gigatron.i
 | 
						|
 | 
						|
 | 
						|
vram        EQU     0x0800
 | 
						|
buff0       EQU     0x08B0
 | 
						|
buff1       EQU     0x08D0
 | 
						|
REENTER     EQU     0x03CB
 | 
						|
 | 
						|
rand        EQU     0x06
 | 
						|
videoY      EQU     0x09
 | 
						|
frameCount  EQU     0x0E
 | 
						|
sysFn       EQU     0x22
 | 
						|
 | 
						|
srcAddr     EQU     0x30
 | 
						|
dstAddr     EQU     0x32
 | 
						|
backBuffer  EQU     0x34
 | 
						|
spriteData  EQU     0x36
 | 
						|
vbase       EQU     0x38
 | 
						|
pixels      EQU     0x3A
 | 
						|
frame       EQU     0x3C
 | 
						|
xyPos       EQU     0x3E
 | 
						|
xyPosHi     EQU     0x40
 | 
						|
xyVel       EQU     0x42
 | 
						|
xyVelHi     EQU     0x44
 | 
						|
colour      EQU     0x46
 | 
						|
i           EQU     0x48
 | 
						|
j           EQU     0x4A
 | 
						|
k           EQU     0x4C
 | 
						|
delay       EQU     0x4E
 | 
						|
one         EQU     0x50
 | 
						|
mask1       EQU     0x52
 | 
						|
mask2       EQU     0x54
 | 
						|
scratch     EQU     0x56
 | 
						|
 | 
						|
rowBuffer0  EQU     0x70
 | 
						|
rowBuffer1  EQU     0x74
 | 
						|
rowBuffer2  EQU     0x78
 | 
						|
rowBuffer3  EQU     0x7C
 | 
						|
 | 
						|
pixelsArray EQU     0x90
 | 
						|
xyPosArray  EQU     0xB0
 | 
						|
xyVelArray  EQU     0xD0
 | 
						|
 | 
						|
 | 
						|
xExtent     EQU     0x9C
 | 
						|
yExtent     EQU     0x74
 | 
						|
 | 
						|
numSprites  EQU     4
 | 
						|
   
 | 
						|
   
 | 
						|
_startAddress_      EQU     0x0200      ; entry point for the code, if this is missing defaults to 0x0200
 | 
						|
 | 
						|
_callTable_         EQU     0x008E      ; call addresses are automatically stored here by the assembler, it grows downwards
 | 
						|
                                        ; *NOTE* gt1 spec only allows for one zero page segment, .vasm files use this for the call table
 | 
						|
                                        ; do *NOT* make this address higher than 0x00BE, it will conflict with future ROM loading mechanisms
 | 
						|
                                        ; do *NOT* define constants, (DB or DW), between 0x30 -> 0x44 and 0xc0 -> 0xFF, these addresses are
 | 
						|
                                        ; used by the loader and the vCPU stack, you can create variables in these areas as long as you don't
 | 
						|
                                        ; corrupt your nested CALL return addresses on the stack
 | 
						|
                                        
 | 
						|
_singleStepWatch_   EQU     k           ; the single step debugger watches this variable location to decide when to step,
 | 
						|
                                        ; choose a variable that is updated often
 | 
						|
 | 
						|
SYS_SpriteCopy_118  EQU     0x2300      ; 16 pixel memory copy
 | 
						|
 | 
						|
     
 | 
						|
start       EQU     0x200
 | 
						|
loopinit    EQU     0x300
 | 
						|
vblank0     EQU     0x400
 | 
						|
fillSprites EQU     0x500
 | 
						|
 | 
						|
     
 | 
						|
start       LDWI    vram
 | 
						|
            STW     vbase       ; vram base address
 | 
						|
 | 
						|
            LDWI    buff0
 | 
						|
            STW     spriteData
 | 
						|
            LDWI    buff1
 | 
						|
            STW     backBuffer
 | 
						|
 | 
						|
            LDWI    xyPosArray
 | 
						|
            STW     xyPos
 | 
						|
            LDWI    xyPosArray + 1
 | 
						|
            STW     xyPosHi
 | 
						|
            
 | 
						|
            LDWI    xyVelArray
 | 
						|
            STW     xyVel
 | 
						|
            LDWI    xyVelArray + 1
 | 
						|
            STW     xyVelHi
 | 
						|
 | 
						|
            LDWI    pixelsArray
 | 
						|
            STW     pixels
 | 
						|
 | 
						|
            LDWI    SYS_SpriteCopy_118
 | 
						|
            STW     sysFn
 | 
						|
 | 
						|
            ; fill sprite data
 | 
						|
            CALL    fillSprites ; doesn't return, does a far jump to constants
 | 
						|
 | 
						|
            ; constants
 | 
						|
constants   LDWI    0x3F7F
 | 
						|
            STW     mask1
 | 
						|
            LDWI    0x0707
 | 
						|
            STW     mask2
 | 
						|
            LDI     0x00
 | 
						|
            ST      i
 | 
						|
            LDWI    0x0001
 | 
						|
            STW     one
 | 
						|
            LDWI    192
 | 
						|
            STW     delay
 | 
						|
            
 | 
						|
            ; vblank counter
 | 
						|
            LD      frameCount
 | 
						|
            STW     frame
 | 
						|
            
 | 
						|
init        LD      rand
 | 
						|
            ANDI    0x03
 | 
						|
            BEQ     case0
 | 
						|
            SUBI    0x01
 | 
						|
            BEQ     case1
 | 
						|
            SUBI    0x01
 | 
						|
            BEQ     case2
 | 
						|
            SUBI    0x01
 | 
						|
            BEQ     case3
 | 
						|
            
 | 
						|
case0       LDWI    0x0101
 | 
						|
            DOKE    xyVel
 | 
						|
            BRA     randpos
 | 
						|
 | 
						|
case1       LDWI    0x01FF
 | 
						|
            DOKE    xyVel
 | 
						|
            BRA     randpos
 | 
						|
 | 
						|
case2       LDWI    0xFF01
 | 
						|
            DOKE    xyVel
 | 
						|
            BRA     randpos
 | 
						|
 | 
						|
case3       LDWI    0xFFFF
 | 
						|
            DOKE    xyVel
 | 
						|
            
 | 
						|
randpos     LDW     rand
 | 
						|
            ANDW    mask1
 | 
						|
            ORW     mask2
 | 
						|
            DOKE    xyPos
 | 
						|
            ADDW    vbase       ; generate vram address
 | 
						|
            DOKE    pixels
 | 
						|
 | 
						|
            INC     xyPos
 | 
						|
            INC     xyPos
 | 
						|
            INC     xyVel
 | 
						|
            INC     xyVel
 | 
						|
            INC     pixels
 | 
						|
            INC     pixels
 | 
						|
            
 | 
						|
            CALL    vblank0
 | 
						|
            
 | 
						|
            INC     i
 | 
						|
            LD      i
 | 
						|
            SUBI    numSprites
 | 
						|
            BLT     init
 | 
						|
            
 | 
						|
            CALL    loopinit
 | 
						|
            
 | 
						|
            
 | 
						|
            ; main loop
 | 
						|
loopinit    LDWI    xyPosArray
 | 
						|
            STW     xyPos
 | 
						|
            LDWI    xyPosArray + 1
 | 
						|
            STW     xyPosHi
 | 
						|
            LDWI    xyVelArray
 | 
						|
            STW     xyVel
 | 
						|
            LDWI    xyVelArray + 1
 | 
						|
            STW     xyVelHi
 | 
						|
            LDWI    pixelsArray
 | 
						|
            STW     pixels
 | 
						|
 | 
						|
            LDWI    buff0
 | 
						|
            STW     spriteData
 | 
						|
            LDWI    buff1
 | 
						|
            STW     backBuffer
 | 
						|
 | 
						|
            LDI     0x00
 | 
						|
            ST      i
 | 
						|
 | 
						|
xbounds     LDW     xyPos       ; x position bounds checking
 | 
						|
            PEEK
 | 
						|
            BEQ     xflip
 | 
						|
            SUBI    xExtent
 | 
						|
            BLT     ybounds
 | 
						|
        
 | 
						|
xflip       LDW     xyVel
 | 
						|
            PEEK
 | 
						|
            XORI    0xFE        ; flip x velocity
 | 
						|
            POKE    xyVel
 | 
						|
        
 | 
						|
ybounds     LDW     xyPosHi     ; y position bounds checking 
 | 
						|
            PEEK
 | 
						|
            BEQ     yflip
 | 
						|
            SUBI    yExtent
 | 
						|
            BLT     velocity
 | 
						|
        
 | 
						|
yflip       LDW     xyVelHi
 | 
						|
            PEEK
 | 
						|
            XORI    0xFE        ; flip y velocity
 | 
						|
            POKE    xyVelHi
 | 
						|
        
 | 
						|
velocity    LDW     xyPos       ; xpos += xvel
 | 
						|
            PEEK
 | 
						|
            ST      scratch
 | 
						|
            LDW     xyVel
 | 
						|
            PEEK
 | 
						|
            ADDW    scratch
 | 
						|
            POKE    xyPos
 | 
						|
            
 | 
						|
            LDW     xyPosHi     ; ypos += yvel
 | 
						|
            PEEK
 | 
						|
            ST      scratch
 | 
						|
            LDW     xyVelHi
 | 
						|
            PEEK
 | 
						|
            ADDW    scratch
 | 
						|
            POKE    xyPosHi
 | 
						|
            
 | 
						|
            LDW     xyPos
 | 
						|
            DEEK
 | 
						|
            ADDW    vbase       ; generate vram address
 | 
						|
            DOKE    pixels
 | 
						|
 | 
						|
save        STW     srcAddr
 | 
						|
            LDW     backBuffer
 | 
						|
            STW     dstAddr
 | 
						|
            SYS     118
 | 
						|
 | 
						|
            INC     xyPos       ; increment array pointers
 | 
						|
            INC     xyPos
 | 
						|
            INC     xyPosHi
 | 
						|
            INC     xyPosHi
 | 
						|
            INC     xyVel
 | 
						|
            INC     xyVel
 | 
						|
            INC     xyVelHi
 | 
						|
            INC     xyVelHi
 | 
						|
            INC     pixels
 | 
						|
            INC     pixels
 | 
						|
 | 
						|
            LD      backBuffer + 1
 | 
						|
            ADDI    0x04
 | 
						|
            ST      backBuffer + 1
 | 
						|
 | 
						|
            INC     i
 | 
						|
            LD      i
 | 
						|
            SUBI    numSprites 
 | 
						|
            BLT     xbounds
 | 
						|
 | 
						|
            
 | 
						|
            LDWI    pixelsArray
 | 
						|
            STW     pixels
 | 
						|
            
 | 
						|
            LDI     0x00
 | 
						|
            ST      k
 | 
						|
 | 
						|
draw        LDW     pixels
 | 
						|
            DEEK
 | 
						|
            STW     dstAddr
 | 
						|
            LDW     spriteData
 | 
						|
            STW     srcAddr
 | 
						|
            SYS     118
 | 
						|
 | 
						|
            INC     pixels
 | 
						|
            INC     pixels
 | 
						|
 | 
						|
            LD      spriteData + 1
 | 
						|
            ADDI    0x04
 | 
						|
            ST      spriteData + 1
 | 
						|
 | 
						|
            INC     k
 | 
						|
            LD      k
 | 
						|
            SUBI    numSprites 
 | 
						|
            BLT     draw
 | 
						|
            
 | 
						|
            ;CALL    vblank0
 | 
						|
            ;CALL    vblank1
 | 
						|
            CALL    vblank2
 | 
						|
            
 | 
						|
            LDWI    buff1
 | 
						|
            STW     backBuffer
 | 
						|
            LDWI    pixelsArray
 | 
						|
            STW     pixels
 | 
						|
 | 
						|
            LDI     0x00
 | 
						|
            ST      i
 | 
						|
 | 
						|
restore     LDW     backBuffer
 | 
						|
            STW     srcAddr
 | 
						|
            LDW     pixels
 | 
						|
            DEEK
 | 
						|
            STW     dstAddr
 | 
						|
            SYS     118
 | 
						|
 | 
						|
            INC     pixels
 | 
						|
            INC     pixels
 | 
						|
            
 | 
						|
            LD      backBuffer + 1
 | 
						|
            ADDI    0x04
 | 
						|
            ST      backBuffer + 1
 | 
						|
 | 
						|
            INC     i
 | 
						|
            LD      i
 | 
						|
            SUBI    numSprites 
 | 
						|
            BLT     restore
 | 
						|
            
 | 
						|
            BRA     loopinit
 | 
						|
 | 
						|
            
 | 
						|
            ; subroutines
 | 
						|
vblank0     LD      frameCount
 | 
						|
            SUBW    frame
 | 
						|
            BEQ     vblank0
 | 
						|
            LD      frameCount
 | 
						|
            STW     frame
 | 
						|
            RET
 | 
						|
 | 
						|
vblank1     LD      videoY
 | 
						|
            ANDI    0x01
 | 
						|
            BEQ     vblank1
 | 
						|
            RET
 | 
						|
 | 
						|
vblank2     LD      0x0000
 | 
						|
            STW     i
 | 
						|
loopdelay   LDW     i
 | 
						|
            ADDW    one
 | 
						|
            STW     i
 | 
						|
            SUBW    delay
 | 
						|
            BLT     loopdelay
 | 
						|
            RET
 | 
						|
 | 
						|
waitScanln  LD      videoY
 | 
						|
            STW     scratch
 | 
						|
            ADDW    videoY
 | 
						|
            STW     scratch
 | 
						|
            LDW     xyPosHi     ; ypos
 | 
						|
            PEEK
 | 
						|
            SUBW    scratch
 | 
						|
            BGT     waitScanln
 | 
						|
            RET
 | 
						|
 | 
						|
fillsprite  LDI     0x00
 | 
						|
            ST      j
 | 
						|
fill_i      LDI     0x00
 | 
						|
            ST      i
 | 
						|
fill_c      LD      i
 | 
						|
            LD      colour
 | 
						|
            POKE    spriteData
 | 
						|
            INC     spriteData
 | 
						|
            INC     i
 | 
						|
            LD      i
 | 
						|
            SUBI    0x04
 | 
						|
            BLT     fill_c
 | 
						|
            
 | 
						|
            LDI     buff0
 | 
						|
            ST      spriteData
 | 
						|
            LD      spriteData + 1
 | 
						|
            ADDI    0x01
 | 
						|
            ST      spriteData + 1
 | 
						|
            INC     j
 | 
						|
            LD      j
 | 
						|
            SUBI    0x04
 | 
						|
            BLT     fill_i
 | 
						|
            RET
 | 
						|
            
 | 
						|
fillSprites LDI     0x1F
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x08B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x30
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x0CB0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x0C
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x10B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x03
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x14B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x0F
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x18B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x3C
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x1CB0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x33
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x20B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x1A
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x24B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x5F
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x28B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x63
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x2CB0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
 | 
						|
            LDI     0x7A
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x30B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
 | 
						|
            LDI     0x07
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x34B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
 | 
						|
            LDI     0x00
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x38B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
 | 
						|
            LDI     0x25
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x3CB0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
 | 
						|
            LDI     0x52
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x40B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            
 | 
						|
            LDI     0x36
 | 
						|
            ST      colour
 | 
						|
            LDWI    0x44B0
 | 
						|
            STW     spriteData
 | 
						|
            CALL    fillsprite
 | 
						|
            CALL    constants
 | 
						|
 
 | 
						|
            
 | 
						|
; native code routines that are written into the emulator's fake ROM using either the DBR/DWR commands or the native instruction set
 | 
						|
; the native instruction assembler has access to the same functionality as the vasm assembler, (labels, equates, mutables, etc).
 | 
						|
; it's only caveats are:
 | 
						|
; 1: each instruction is prefaced with a period to clearly differentiate it from a vasm instruction
 | 
						|
; 2: you cannot mix and match vasm instructions with native instructions within the same segment, (in reality they are executed in 
 | 
						|
; completely different parts of the memory map, i.e. native in fake ROM and vasm in RAM)
 | 
						|
; 3: you must follow the SYS calling conventions exactly
 | 
						|
SYS_SpriteCopy_118  .LD     [srcAddr],X         ; src line 0
 | 
						|
                    .LD     [srcAddr + 1],Y
 | 
						|
                    .LD     [Y,X]               
 | 
						|
                    .ST     [rowBuffer0 + 0]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer0 + 1]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer0 + 2]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer0 + 3]
 | 
						|
                    
 | 
						|
                    .LD     [srcAddr],X         ; src line1
 | 
						|
                    .LD     0x01                
 | 
						|
                    .ADDA   [srcAddr + 1],Y
 | 
						|
                    .LD     [Y,X]               
 | 
						|
                    .ST     [rowBuffer1 + 0]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer1 + 1]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer1 + 2]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer1 + 3]
 | 
						|
 | 
						|
                    .LD     [srcAddr],X         ; src line2
 | 
						|
                    .LD     0x02                
 | 
						|
                    .ADDA   [srcAddr + 1],Y
 | 
						|
                    .LD     [Y,X]               
 | 
						|
                    .ST     [rowBuffer2 + 0]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer2 + 1]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer2 + 2]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer2 + 3]
 | 
						|
                    
 | 
						|
                    .LD     [srcAddr],X         ; src line3
 | 
						|
                    .LD     0x03                
 | 
						|
                    .ADDA   [srcAddr + 1],Y
 | 
						|
                    .LD     [Y,X]               
 | 
						|
                    .ST     [rowBuffer3 + 0]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer3 + 1]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    .ST     [rowBuffer3 + 2]
 | 
						|
                    .ST     [Y,X++]             ; hack increment
 | 
						|
                    .LD     [Y,X]
 | 
						|
                    ;.LD     [Y,X++] 
 | 
						|
                    .ST     [rowBuffer3 + 3]
 | 
						|
                    
 | 
						|
                    
 | 
						|
                    .LD     [dstAddr],X         ; dst line 0
 | 
						|
                    .LD     [dstAddr + 1],Y
 | 
						|
                    .LD     [rowBuffer0 + 0]       
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer0 + 1]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer0 + 2]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer0 + 3]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    
 | 
						|
                    .LD     [dstAddr],X         ; dst line 1
 | 
						|
                    .LD     0x01                
 | 
						|
                    .ADDA   [dstAddr + 1],Y
 | 
						|
                    .LD     [rowBuffer1 + 0]       
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer1 + 1]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer1 + 2]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer1 + 3]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
 | 
						|
                    .LD     [dstAddr],X         ; dst line 2
 | 
						|
                    .LD     0x02                
 | 
						|
                    .ADDA   [dstAddr + 1],Y
 | 
						|
                    .LD     [rowBuffer2 + 0]       
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer2 + 1]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer2 + 2]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer2 + 3]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
 | 
						|
                    .LD     [dstAddr],X         ; dst line 3
 | 
						|
                    .LD     0x03                
 | 
						|
                    .ADDA   [dstAddr + 1],Y
 | 
						|
                    .LD     [rowBuffer3 + 0]       
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer3 + 1]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer3 + 2]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    .LD     [rowBuffer3 + 3]
 | 
						|
                    .ST     [Y,X++]
 | 
						|
                    
 | 
						|
                    .LD     REENTER >>8,y
 | 
						|
                    .JMP    y,REENTER
 | 
						|
                    .LD     0xC5                ; 0 - ((14 + number of instructions + 3) / 2), odd(14 + number of instructions) = true
 | 
						|
                     |