196 lines
5.5 KiB
Plaintext
196 lines
5.5 KiB
Plaintext
%include ../include/gigatron.i
|
|
|
|
rand_colour EQU 0x06
|
|
|
|
x1 EQU 0x30
|
|
y1 EQU x1+2
|
|
x2 EQU x1+4
|
|
y2 EQU x1+6
|
|
xy1 EQU x1+8
|
|
xy2 EQU x1+10
|
|
dxy1 EQU x1+12
|
|
dxy2 EQU x1+14
|
|
dx1 EQU x1+16
|
|
dy1 EQU x1+18
|
|
dx2 EQU x1+20
|
|
dy2 EQU x1+22
|
|
sx EQU x1+24
|
|
sy EQU x1+26
|
|
h EQU x1+28
|
|
num EQU x1+30
|
|
count EQU x1+32
|
|
tmp EQU x1+34
|
|
|
|
_singleStepWatch_ EQU count ; the single step debugger watches this variable location to decide when to step,
|
|
; choose a variable that is updated often
|
|
|
|
lineStart EQU 0x0200
|
|
lineExt EQU 0x0300
|
|
|
|
|
|
lineStart LDWI 0x0000
|
|
STW x1
|
|
STW y1
|
|
STW x2
|
|
STW y2
|
|
|
|
line_random LDWI SYS_Random_34
|
|
STW giga_sysFn
|
|
|
|
SYS 34 ; x1 = (rnd AND &h7F) + (rnd AND &h1F)
|
|
ANDI 0x7F
|
|
STW x1
|
|
SYS 34
|
|
ANDI 0x1F
|
|
ADDW x1
|
|
STW x1
|
|
|
|
SYS 34 ; y1 = (rnd AND &h3F) + (rnd AND &h3F)
|
|
ANDI 0x3F
|
|
STW y1
|
|
SYS 34
|
|
ANDI 0x3F
|
|
ADDW y1
|
|
ORI 0x08
|
|
STW y1
|
|
|
|
SYS 34 ; x2 = (rnd AND &h7F) + (rnd AND &h1F)
|
|
ANDI 0x7F
|
|
STW x2
|
|
SYS 34
|
|
ANDI 0x1F
|
|
ADDW x2
|
|
STW x2
|
|
|
|
SYS 34 ; y2 = (rnd AND &h3F) + (rnd AND &h3F)
|
|
ANDI 0x3F
|
|
STW y2
|
|
SYS 34
|
|
ANDI 0x3F
|
|
ADDW y2
|
|
ORI 0x08
|
|
STW y2
|
|
|
|
LDI 1
|
|
STW dx1
|
|
STW dx2
|
|
STW dy1
|
|
LDI 0
|
|
STW dy2
|
|
|
|
LDWI 0x8000
|
|
STW tmp
|
|
|
|
LDW x2 ; sx = x2 - x1
|
|
SUBW x1
|
|
STW sx
|
|
ANDW tmp
|
|
BEQ line_dy
|
|
LDWI -1
|
|
STW dx1
|
|
STW dx2 ; dx1 = dx2 = (sx & 0x8000) ? -1 : 1
|
|
LDI 0 ; sx = (sx & 0x8000) ? 0 - sx : sx
|
|
SUBW sx
|
|
STW sx
|
|
|
|
line_dy LDW y2
|
|
SUBW y1
|
|
STW sy
|
|
STW h ; h = sy
|
|
ANDW tmp
|
|
BEQ line_ext
|
|
|
|
LDWI -1
|
|
STW dy1 ; dy1 = (sy & 0x8000) ? -1 : 1
|
|
LDI 0
|
|
SUBW sy
|
|
STW sy ; sy = (sy & 0x8000) ? 0 - sy : sy
|
|
SUBW sx
|
|
BLE line_ext
|
|
LDW dy1
|
|
STW dy2 ; if(sx < sy) dy2 = -1
|
|
|
|
line_ext LDWI lineExt
|
|
CALL giga_vAC
|
|
|
|
lineExt LD x1
|
|
ST xy1
|
|
LD y1
|
|
ST xy1 + 1 ; xy1 = x1 | (y1<<8)
|
|
|
|
LD x2
|
|
ST xy2
|
|
LD y2
|
|
ST xy2 + 1 ; xy2 = x2 | (y2<<8)
|
|
|
|
LDW sy
|
|
SUBW sx
|
|
BLE line_num
|
|
LDI 0
|
|
STW dx2 ; if(sx < sy) dx2 = 0
|
|
LDW sy
|
|
STW tmp
|
|
LDW sx
|
|
STW sy
|
|
LDW tmp
|
|
STW sx ; swap sx with sy
|
|
LDW h
|
|
BLE line_num
|
|
LDI 1
|
|
STW dy2 ; if(h > 0) dy2 = 1
|
|
|
|
line_num LDWI SYS_LSRW1_48
|
|
STW giga_sysFn
|
|
LDW sx
|
|
SYS 48
|
|
STW num ; numerator = sx>>1
|
|
STW count
|
|
INC count ; for(count=sx>>1; counti>=0; --i)
|
|
|
|
LDWI SYS_LSLW8_24
|
|
STW giga_sysFn
|
|
LDW dy1
|
|
SYS 28
|
|
ADDW dx1
|
|
STW dxy1 ; dxy1 = dx1 + (dy1<<8)
|
|
|
|
LDW dy2
|
|
SYS 28
|
|
ADDW dx2
|
|
STW dxy2 ; dxy2 = dx2 + (dy2<<8)
|
|
|
|
line_loop LD rand_colour
|
|
POKE xy1 ; plot start pixel
|
|
POKE xy2 ; plot end pixel, (meet in middle)
|
|
|
|
LDW num ; numerator += sy
|
|
ADDW sy
|
|
STW num
|
|
SUBW sx
|
|
BLE line_flip ; if(numerator <= sx) goto flip
|
|
|
|
STW num ; numerator -= sx
|
|
LDW xy1
|
|
ADDW dxy1
|
|
STW xy1 ; xy1 += dxy1
|
|
|
|
LDW xy2
|
|
SUBW dxy1
|
|
STW xy2 ; xy2 -= dxy1
|
|
BRA line_count
|
|
|
|
line_flip LDW xy1
|
|
ADDW dxy2
|
|
STW xy1 ; xy1 += dxy2
|
|
|
|
LDW xy2
|
|
SUBW dxy2
|
|
STW xy2 ; xy2 -= dxy2
|
|
|
|
line_count LDW count
|
|
SUBI 0x01
|
|
STW count
|
|
BGT line_loop
|
|
LDWI line_random
|
|
CALL giga_vAC
|