507 lines
16 KiB
Plaintext
507 lines
16 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
|
|
|
|
|
|
vram EQU 0x0800
|
|
hscroll EQU 0x0101
|
|
REENTER EQU 0x03CB
|
|
|
|
rand EQU 0x06
|
|
videoY EQU 0x09
|
|
frameCount EQU 0x0E
|
|
sysFn EQU 0x22
|
|
|
|
dstAddr EQU 0x30
|
|
vbase EQU 0x32
|
|
pixels EQU 0x34
|
|
frame EQU 0x36
|
|
xyPos EQU 0x38
|
|
xyPosHi EQU 0x3A
|
|
xyVel EQU 0x3C
|
|
xyVelHi EQU 0x3E
|
|
i EQU 0x40
|
|
j EQU 0x42
|
|
k EQU 0x44
|
|
delay EQU 0x46
|
|
one EQU 0x48
|
|
mask1 EQU 0x4A
|
|
mask2 EQU 0x4C
|
|
scratch EQU 0x4E
|
|
|
|
pixelsArray EQU 0x60
|
|
xyPosArray EQU 0x82
|
|
xyVelArray EQU 0xA2
|
|
sysFnArray EQU 0xC2
|
|
|
|
hscrollAddr EQU 0xE2
|
|
|
|
xExtent EQU 0x96
|
|
yExtent EQU 0x6e
|
|
|
|
numSprites EQU 16
|
|
|
|
|
|
_startAddress_ EQU 0x0200 ; entry point for the code, if this is missing defaults to 0x0200
|
|
|
|
_callTable_ EQU 0x005E ; 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_BlinkyBlast_142 EQU 0x2300 ; 10x10 pixel blast, sprite data is embedded in instructions
|
|
SYS_ClearRow32_56 EQU 0x2400 ; clear 32 pixels at a time
|
|
|
|
|
|
start EQU 0x200
|
|
loopinit EQU 0x300
|
|
vblank0 EQU 0x400
|
|
|
|
|
|
; vram base address
|
|
start LDWI vram
|
|
STW vbase
|
|
|
|
; horizontal scroll address
|
|
LDWI hscroll
|
|
STW hscrollAddr
|
|
|
|
LDWI xyPosArray
|
|
STW xyPos
|
|
LDWI xyPosArray + 1
|
|
STW xyPosHi
|
|
|
|
LDWI xyVelArray
|
|
STW xyVel
|
|
LDWI xyVelArray + 1
|
|
STW xyVelHi
|
|
|
|
LDWI pixelsArray
|
|
STW pixels
|
|
|
|
; clear screen, (including hidden areas), fast
|
|
LDWI SYS_ClearRow32_56 ; clears 32 row pixels at a time
|
|
STW sysFn
|
|
|
|
clear SYS 56
|
|
LDWI 0x0020
|
|
ADDW vbase
|
|
STW vbase
|
|
LD vbase+1
|
|
SUBI 0x7F
|
|
BLT clear
|
|
LDI 0x08 ; finish off last row
|
|
ST i
|
|
last_row SYS 56
|
|
LDWI 0x0020
|
|
ADDW vbase
|
|
STW vbase
|
|
LD i
|
|
SUBI 0x01
|
|
ST i
|
|
BGT last_row
|
|
|
|
LDWI SYS_BlinkyBlast_142
|
|
STW sysFn
|
|
|
|
LDWI vram
|
|
STW vbase
|
|
|
|
; 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
|
|
|
|
; random positions
|
|
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
|
|
|
|
; generate vram address
|
|
randpos LDW rand
|
|
ANDW mask1
|
|
ORW mask2
|
|
DOKE xyPos
|
|
ADDW vbase
|
|
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
|
|
|
|
LDI 0x00
|
|
ST i
|
|
|
|
; x position bounds checking
|
|
xbounds LDW xyPos
|
|
PEEK
|
|
BEQ xflip
|
|
SUBI xExtent
|
|
BLT ybounds
|
|
|
|
; flip x velocity
|
|
xflip LDW xyVel
|
|
PEEK
|
|
XORI 0xFE
|
|
POKE xyVel
|
|
|
|
; y position bounds checking
|
|
ybounds LDW xyPosHi
|
|
PEEK
|
|
BEQ yflip
|
|
SUBI yExtent
|
|
BLT velocity
|
|
|
|
; flip y velocity
|
|
yflip LDW xyVelHi
|
|
PEEK
|
|
XORI 0xFE
|
|
POKE xyVelHi
|
|
|
|
; xpos += xvel
|
|
velocity LDW xyPos
|
|
PEEK
|
|
ST scratch
|
|
LDW xyVel
|
|
PEEK
|
|
ADDW scratch
|
|
POKE xyPos
|
|
|
|
; ypos += yvel
|
|
LDW xyPosHi
|
|
PEEK
|
|
ST scratch
|
|
LDW xyVelHi
|
|
PEEK
|
|
ADDW scratch
|
|
POKE xyPosHi
|
|
|
|
; generate vram address
|
|
LDW xyPos
|
|
DEEK
|
|
ADDW vbase
|
|
DOKE pixels
|
|
|
|
; increment array pointers
|
|
INC xyPos
|
|
INC xyPos
|
|
INC xyPosHi
|
|
INC xyPosHi
|
|
INC xyVel
|
|
INC xyVel
|
|
INC xyVelHi
|
|
INC xyVelHi
|
|
INC pixels
|
|
INC pixels
|
|
|
|
; do it for numSprites
|
|
INC i
|
|
LD i
|
|
SUBI numSprites
|
|
BLT xbounds
|
|
|
|
LDWI pixelsArray
|
|
STW pixels
|
|
LDI 0x00
|
|
ST k
|
|
|
|
; scroll playfield
|
|
LD frameCount
|
|
POKE hscrollAddr
|
|
|
|
; draw sprite
|
|
draw LDW pixels
|
|
DEEK
|
|
STW dstAddr
|
|
SYS 142
|
|
|
|
INC pixels
|
|
INC pixels
|
|
|
|
INC k
|
|
LD k
|
|
SUBI numSprites
|
|
BLT draw
|
|
|
|
CALL vblank1
|
|
|
|
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
|
|
|
|
|
|
; 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
|
|
|
|
; accumulator holds [dstAddr + 1] for entire sprite blast
|
|
SYS_BlinkyBlast_142 .LD [dstAddr],X ; dst line 0
|
|
.LD [dstAddr + 1]
|
|
.ADDA $00,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 1
|
|
.ADDA $01,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 2
|
|
.ADDA $02,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 3
|
|
.ADDA $03,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 4
|
|
.ADDA $04,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $30,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $30,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 5
|
|
.ADDA $05,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $FF,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 6
|
|
.ADDA $06,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 7
|
|
.ADDA $07,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 8
|
|
.ADDA $08,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $03,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.LD [dstAddr],X ; dst line 9
|
|
.ADDA $09,Y
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
.ST $00,[Y,X++]
|
|
|
|
.NOP ; pad instructions so odd(14 + number of instructions) = true
|
|
.LD REENTER >>8,y
|
|
.JMP y,REENTER
|
|
.LD 0xB9 ; 0 - ((14 + number of instructions + 3) / 2), odd(14 + number of instructions) = true
|
|
|
|
|
|
SYS_ClearRow32_56 .LD [vbase],X
|
|
.LD [vbase+1],Y
|
|
|
|
.LD 0x00
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
.ST [Y,X++]
|
|
|
|
.NOP ; pad instructions so odd(14 + number of instructions) = true
|
|
.LD REENTER >>8,y
|
|
.JMP y,REENTER
|
|
.LD 0xE4 ; 0 - ((14 + number of instructions + 3) / 2), odd(14 + number of instructions) = true
|