; assembler: vasm v1.9a ; command: `vasmz80_oldstyle -gbz80 -Fbin -o gb-test.gb gb-test.vasm.txt` ; define macros here macro farcall, bank, location ld a, \bank ld hl, \location rst $00 endm ; define constants here ROMBANK = $2000 ; define symbols here dsect ; WRAM org $c000 wCurrentBank: ds 1 wTestVar: ds 2 dend dsect ; HRAM org $ff80 hBuffer: ds 1 dend ;----------- home bank ------------------ org $4000 * 0 ; interrupts and rst's ; 00 jp Bankswitch align 3 ; assumes that there will be an instruction (incl. `nop`) before this. ; 08 reti align 3 ; 10 reti align 3 ; 18 reti align 3 ; 20 reti align 3 ; 28 reti align 3 ; 30 reti align 3 ; 38 reti align 3 ; 40 jp VBlank align 3 ; 48 reti align 3 ; 50 reti align 3 ; 58 reti align 3 ; 60 reti align 3 ; high home ; ... ; header align 8 ; should jump to $100 nop jp Init ; nintendo logo db $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D db $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 db $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E ; meta db "TEST ROM " ; title db $00 ; cgb enabled db "ZU" ; new licensee code db $00 ; sgb enable db $12 ; cart type db $00 ; rom size db $00 ; ram size db $01 ; international db $33 ; use new code db $00 ; rom version db 0 ; header chksum (use another tool?) dw 0 ; global chksum (use another tool?) ; routines Init: ld a, 1 ld (wCurrentBank), a call Bank1Routine .purgatory halt nop jr .purgatory VBlank: reti Bankswitch: ldh (hBuffer & $ff), a ld a, (wCurrentBank) push af ldh a, (hBuffer & $ff) ld (wCurrentBank), a ld (ROMBANK), a call .call pop af ld (wCurrentBank), a ld (ROMBANK), a ret .call jp hl ; ---------- space between banks ----- align 14 ; bank 0, don't need `rend` ; ------------------------------------ ;----------- bank 1 ------------------ org $4000 * 1 rorg $4000 Bank1Routine: farcall 2, Bank2Routine ret ; ---------- space between banks ----- align 14 rend ; ------------------------------------ ;----------- bank 2 ------------------ org $4000 * 2 rorg $4000 Bank2Routine: ld a, 0 rept 5 ld (wTestVar), a inc a endr ret ; ---------- space between banks ----- align 14 rend ; ------------------------------------