rLCDC EQU $ff40 rSTAT EQU $ff41 rSCX EQU $ff42 rSCY EQU $ff43 rVBK EQU $ff4f rBCPS EQU $ff68 rBCPD EQU $ff69 rOCPS EQU $ff6a rOCPD EQU $ff6b rIE EQU $ffff SECTION "ROM", ROM0[0] Main: call ScreenOff MainContinue: xor a ldh [rSCX], a ldh [rSCY], a ldh [rIE], a dec a ld hl, $9c00 .clear_tilemap_loop ld [hli], a bit 5, h jr z, .clear_tilemap_loop ld hl, $8ff0 xor a .clear_tile_loop ld [hli], a bit 4, h jr z, .clear_tile_loop ld de, Font ld c, 160 .load_font_loop ld a, [de] inc de ld [hli], a ld [hli], a dec c jr nz, .load_font_loop call Calculate ld a, $89 ldh [rLCDC], a ei .halts db $76, $76, $76 ;triple halt jr .halts Font: db $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00 ;0 db $30, $70, $30, $30, $30, $30, $FC, $00 ;1 db $78, $CC, $0C, $38, $60, $CC, $FC, $00 ;2 db $78, $CC, $0C, $38, $0C, $CC, $78, $00 ;3 db $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00 ;4 db $FC, $C0, $F8, $0C, $0C, $CC, $78, $00 ;5 db $38, $60, $C0, $F8, $CC, $CC, $78, $00 ;6 db $FC, $CC, $0C, $18, $30, $30, $30, $00 ;7 db $78, $CC, $CC, $78, $CC, $CC, $78, $00 ;8 db $78, $CC, $CC, $7C, $0C, $18, $70, $00 ;9 db $30, $78, $CC, $CC, $FC, $CC, $CC, $00 ;A db $FC, $66, $66, $7C, $66, $66, $FC, $00 ;B db $3C, $66, $C0, $C0, $C0, $66, $3C, $00 ;C db $F8, $6C, $66, $66, $66, $6C, $F8, $00 ;D db $FE, $62, $68, $78, $68, $62, $FE, $00 ;E db $FE, $62, $68, $78, $68, $60, $F0, $00 ;F db $FE, $C6, $8C, $18, $32, $66, $FE, $00 ;Z db $00, $00, $FC, $00, $00, $FC, $00, $00 ;= db $00, $00, $00, $FC, $00, $00, $00, $00 ;- db $00, $30, $30, $FC, $30, $30, $00, $00 ;+ ScreenOff: ldh a, [rSTAT] and 3 cp 1 jr nz, ScreenOff di xor a ldh [rLCDC], a ret LoadColor: ld a, l ldh [rBCPD], a ldh [rOCPD], a ld a, h ldh [rBCPD], a ldh [rOCPD], a ret PrintByte: ; in: a: byte, de: destination push af swap a and $f ld [de], a inc de pop af and $f ld [de], a inc de ret rept $100 - @ db $ff endr ; entry point dec a jr nz, LoadPalettes rst 0 rept $134 - @ nop endr ; header data - encoded here so it's consistent across builds db "SP TEST ROM" ;title db "TEST" ;manufacturer db $80 ;CGB + DMG db "XX" ;new licensee db 0 ;no SGB db 0 ;cart type: ROM only db 0 ;32K ROM db 0 ;no RAM db 1 ;destination: not Japan db $33 ;old licensee (must be $33) db 1 ;ROM version db 0 ;checksum (must fix) dw 0 ;global checksum (must fix) LoadPalettes: call ScreenOff ld a, 1 ldh [rVBK], a ld hl, $9c00 xor a .loop ld [hli], a bit 5, h jr z, .loop ldh [rVBK], a ld a, $80 ldh [rBCPS], a ldh [rOCPS], a ld hl, $7fff call LoadColor ld hl, $56b5 call LoadColor ld hl, $294a call LoadColor ld hl, 0 call LoadColor jp MainContinue GeneratedCode: ; in: hl: target sp, a: target addend ; out: hl: result, a: flags cp a ;reset flags to a known state ldh [$ff80 + (.add_instruction - GeneratedCode) + 1], a ld [$ffe0], sp ld sp, hl .add_instruction add sp, 0 ld [$ffe2], sp ld sp, $ffe6 push af ld hl, $ffe0 ld a, [hli] ld h, [hl] ld l, a ld sp, hl ld hl, $ffe2 ld a, [hli] ld h, [hl] ld l, a ldh a, [$ffe4] ret .end Calculate: ld bc, ((GeneratedCode.end - GeneratedCode) << 8) + $80 ld hl, GeneratedCode .copy_loop ld a, [hli] ldh [c], a inc c dec b jr nz, .copy_loop ld bc, Addends ld de, $9c00 .loop ld a, [bc] inc bc ld h, a call PrintByte ld a, [bc] inc bc ld l, a call PrintByte inc de ld a, [bc] inc bc push bc ld c, a add a, a sbc a add a, $13 ld [de], a inc de inc de ld a, c bit 7, c jr z, .not_negative cpl inc a .not_negative call PrintByte inc de ld a, $11 ld [de], a inc de inc de ld a, c call $ff80 ld c, a ld a, h call PrintByte ld a, l call PrintByte inc de inc de ld a, c add a, a sbc a add a, a add a, $12 ld [de], a inc de swap c srl c sbc a and $c - $12 add a, $12 ld [de], a set 2, e set 3, e inc de pop bc ld a, c cp LOW(Addends.end) jr nz, .loop ret addends: MACRO db HIGH(\1) db LOW(\1) db \2 ENDM Addends: addends $0000, +$00 addends $ffff, +$01 addends $ff80, -$80 addends $0080, -$80 addends $0002, -$02 addends $ffcf, +$30 addends $ffbd, +$53 addends $ff96, +$76 addends $000e, -$0e addends $000e, +$0e addends $00ff, +$01 addends $0042, +$42 addends $fea2, +$5e .end