; To be compiled with TNIASM NBR_SPRITES: equ 1 COD_DIR: equ 1 NOTE_NUMBER: equ 1 ; BIOS (SOME) ENTRY POINTS CALC_OFFSET: equ $08c0 LOAD_ASCII: equ $1f7f FILL_VRAM: equ $1f82 MODE_1: equ $1f85 PUT_VRAM: equ $1fbe TURN_OFF_SOUND: equ $1fd6 WRITE_REGISTER: equ $1fd9 READ_REGISTER: equ $1fdc WRITE_VRAM: equ $1fdf ; VRAM DEFAULT TABLES VRAM_PATTERN: equ $0000 VRAM_NAME: equ $1800 VRAM_SPRATTR: equ $1B00 VRAM_COLOR: equ $2000 VRAM_SPRGEN: equ $3800 fname "flawedcodgod14.rom" cpu Z80 ; switch to Z80 mode org $8000 ; HEADER db 0x55, 0xaa ; Header: 55AA to skip title page, AA55 to display it dw $7100 ; sprite table pointer for BIOS dw $7000 ; single byte pointer dw 0 ; unknown, unused dw 0 ; unknown, unused dw Start ; address of start code ; interrupt vectors ei ; RST 0x08 reti ei ; RST 0x10 reti ei ; RST 0x18 reti ei ; RST 0x20 reti ei ; RST 0x28 reti ei ; RST 0x30 reti ei ; RST 0x38 - spinner interrupt reti jp Nmi ; NMI db "I SAWED THE FLAWED COD GOD./CHRIS PRESENTS/2020" Nmi: ; Display Sprite(s) ld a,NBR_SPRITES call $1fc4 ; WR_SPR_NM_TBL ld a,$d0 out ($be),a ; Update Sprites position (for next time) ld de,($8002) ld hl,$7101 UpdateSpritesCoor: jp move_cod Cod_moved: call little_tune ; Get Video Status call $1fdc ; READ_REGISTER bit 6,a jr z,DoNothing and $1f ; keep only 5bits = sprite# ld e,a ld d,0 ld hl,($8004) push hl add hl,de ld c,(hl) ; Get corresponding Sprite entry pop hl ld a,NBR_SPRITES ld b,a reordering1: ld (hl),c inc hl inc c cp c jr nz,reordering2 ld c,0 reordering2: djnz reordering1 DoNothing: retn little_tune: ld (hl),NOTE_NUMBER inc hl ld a,(NOTE_NUMBER) cp 1 jr z,note2 cp 2 jr z,note1 cp 3 jr z,note2 cp 4 jr z,note1 cp 5 jr z,note2 cp 6 jr z,note1 cp 7 jr z,silence ret note2: ld a,$86 out ($ff),a ld a,$10 out ($ff),a ld a,$90 out ($ff),a ret note1: ld a,$86 out ($ff),a ld a,$0d out ($ff),a ld a,$90 out ($ff),a ret silence: ld a,$86 out ($ff),a ld a,$0d out ($ff),a ld a,$9f out ($ff),a ret move_cod: ld a,(hl) cp 16 jr z,move_cod_up ld a,(de) cp 180 jr z,move_cod_left ld a,(hl) cp 236 jr z,move_cod_down ld a,(de) cp 10 jr z,move_cod_right move_cod_up: ld b,COD_DIR ld a,1 ld b,a ld a,(de) cp 10 jr z,move_cod_right move_cod_up2: ld c,1 ld a,(de) sub a,c ld (de),a ; Load Sprite Pattern ld de,$3800 ld hl,Cod_up ld bc,8 call $1fdf ; WRITE_VRAM jp Cod_moved move_cod_down: ld c,COD_DIR ld a,3 ld c,a ld a,(de) cp 180 jr z,move_cod_left move_cod_down2: ld c,1 ld a,(de) add a,c ld (de),a ; Load Sprite Pattern ld de,$3800 ld hl,Cod_down ld bc,8 call $1fdf ; WRITE_VRAM jp Cod_moved move_cod_left: ld c,COD_DIR ld a,4 ld c,a ld de,$1B01 ld a,(hl) cp 20 jr z,move_cod_up ld c,1 ld a,(hl) sub a,c ld (hl),a call $1fdf ; WRITE_VRAM ; Load Sprite Pattern ld de,$3800 ld hl,Cod_left ld bc,8 call $1fdf ; WRITE_VRAM jp Cod_moved move_cod_right: ld c,COD_DIR ld a,2 ld c,a ld de,$1B01 ld a,(hl) cp 236 jr z,move_cod_down move_cod_right2: ld c,1 ld a,(hl) add a,c ld (hl),a call $1fdf ; WRITE_VRAM ; Load Sprite Pattern ld de,$3800 ld hl,Cod_right ld bc,8 call $1fdf ; WRITE_VRAM jp Cod_moved Start: ld de,COD_DIR ld a,1 ld (de),a ; DEFAULT FONT TO VIDEO MEMORY call $1f85 ; MODE_1 call $1fd6 ; TURN_OFF_SOUND ; Clear VRAM ld hl,0 ld de,$4000 xor a call $1f82 ; FILL_VRAM call LOAD_ASCII ; COLOR WHITE ON BLACK BACKGROUND ld hl,VRAM_COLOR ; COLOR TABLE ld de,32 ld a,$04 ; WHITE ON BLACK changed to BLUE On Black. call FILL_VRAM ; PRINT "HELLO WORLD!" CENTERED AT THE TOP OF THE SCREEN ; FORMULA = (32 CHARS PER LINE - 12 CHARS TO OUTPUT) / 2 = 10 call Static_Offset ; or use Calculated_Offset call Write_GameTitle; or use Put_HelloWorld but make sure to not add VRAM NAME TABLE with the Offset call Static_Offset2 ; or use Calculated_Offset call Write_GameTitle2; or use Put_HelloWorld but make sure to not add VRAM NAME TABLE with the Offset ; 16KB VIDEO MEMORY, 16x16 NORMAL SPRITES, AND TURN ON SCREEN ld bc,$01c2 ; $01e2 ; = AND ENABLE NMI EXECUTION call WRITE_REGISTER ; Load Sprite Pattern ld de,$3800 ld hl,Cod_up ld bc,8 call $1fdf ; WRITE_VRAM ; Init. Sprites Order ld a,NBR_SPRITES call $1fc1 ; INIT_SPR_ORDER ld de,($8002) ld hl,SprAttrib ld bc,NBR_SPRITES*4 ldir ;ld hl,SprMovements ; Optim : HL already = SprMovements table address ld de,$7180 ld bc,NBR_SPRITES*2 ldir ; Turn On Display + Enable NMI ld bc,$01e2 call $1fd9 ; WRITE_REGISTER TheEnd: jp TheEnd GameTitle: db "I SAWED THE FLAWED COD GOD." GameTitle2: db " A FUN GAME BY CHRIS READ. " Static_Offset: ld de,VRAM_NAME+355 ; VRAM NAME TABLE + OFFSET ret Static_Offset2: ld de,VRAM_NAME+387 ; VRAM NAME TABLE + OFFSET ret Calculated_Offset: ld d,1 ; LINE = 0 ld e,1 ; COLUMN = 10 call CALC_OFFSET ; OFFSET = 32 * D + E ld hl,VRAM_NAME add hl,de ex de,hl ret Write_GameTitle: ld hl,GameTitle ld bc,27 ; COUNT jp WRITE_VRAM Put_GameTitle: ld a,2 ; ID#2 = VRAM NAME TABLE ld hl,GameTitle ld iy,27 ; COUNT jp PUT_VRAM Write_GameTitle2: ld hl,GameTitle2 ld bc,27 ; COUNT jp WRITE_VRAM Put_GameTitle2: ld a,2 ; ID#2 = VRAM NAME TABLE ld hl,GameTitle2 ld iy,27 ; COUNT jp PUT_VRAM SprAttrib: db 89,17,0,13 ; Y=82, X= 47, Pattern#0, Color=13 Cod_up: db %00111000 db %01011100 db %01111100 db %01111100 db %00111000 db %00010000 db %00111000 db %01101100 Cod_down: db %01101100 db %00111000 db %00010000 db %00111000 db %01111100 db %01111100 db %01110100 db %00111000 Cod_right: db %00000000 db %10001110 db %11011101 db %01111111 db %11011111 db %11001110 db %00000000 db %00000000 Cod_left: db %00000000 db %01110001 db %10111011 db %11111110 db %11111011 db %01110001 db %00000000 db %00000000