Cut 1 at an onboard bootloader
[fpgaboy.git] / fpgaboot.asm
index 4a1089f..0a714b1 100644 (file)
@@ -7,34 +7,22 @@ boot: ld a, $AA
        ld hl, signon
        call puts
        
-       ; Write a little bit to the RAM
-       ld hl, $0104
-       xor a
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
+.wait: ld a, [$FF53]
+       and $02
+       jr z, .nodata
+       ld a, [$FF52]
+       ld [$FF51], a
        
-       ld A, $FF
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       ld [HLI], A
-       
-       ld c, $51
-       
-.wait: ld a, [c]
+       cp $1B          ; Escape
+       jp z, .cbc
+       ld [$FF52], a
+.cbc:  call z, bootcmd
+
+.nodata:       ld a, [$FF51]
        cp $00
        jr nz, .wait
 
+doboot:        xor a
        ld h, a
        ld l, a
        ld [hl], $01    ; Select the GB boot rom
@@ -47,12 +35,17 @@ boot:       ld a, $AA
        
        rst $00         ; Boot
 
+signon:
+       db $0D,$0A,$1B,"[1mFPGABoy Boot ROM",$1B,"[0m",$0D,$0A,0
+booting:
+       db "Booting...",$0D,$0A,0
+
 putc:
        ld c, $53
        push af
 .waitport:
        ld a,[c]
-       cp $00
+       and $01
        jr nz,.waitport
        pop af
        ld [$FF52],a
@@ -65,12 +58,61 @@ puts:
        call putc
        jr puts
 
-signon:
-       db $0D,$0A,$1B,"[1mFPGABoy Boot ROM",$1B,"[0m",$0D,$0A,0
-booting:
-       db "Booting...",$0D,$0A,0
-
+getc:
+       ld a, [$FF53]
+       and $02
+       jr z, getc
+       ld a, [$FF52]
+       ret
 
+bootcmd:
+       call getc
+       cp $56  ;V
+       jr z,.version
+       cp $41  ;A
+       jr z,.addr
+       cp $44  ;D
+       jr z,.data
+       cp $50  ;P
+       jr z,.prog
+       cp $42  ;B
+       jr z,doboot
+       cp $1B
+       jr z,bootcmd    ; If you keep yelling, you're bound to get the thing's attention.
+       ld a, $3f       ;?
+       jr putc
+.version:
+       ld hl, .verstr
+       jr puts
+.verstr:
+       db "V1.00",0
+.addr:
+       call getc
+       ld [$FF60], A
+       call getc
+       ld [$FF61], A
+       call getc
+       ld [$FF62], A
+       ld A, $41       ;A
+       jr putc
+.data:
+       call getc       ; byte count
+       ld c, a
+.dl:   call getc
+       ld [$FF63], A
+       dec c
+       jp nz, .dl
+       ld A, $44       ;D
+       ret
+.prog:
+       ld hl, $FF80
+       ld c, $7F
+.pl:   dec c
+       jp z, $FF80
+       call getc
+       ld [hli], a
+       jr .pl
+       
        SECTION "a", HOME[$100]
        nop     ; Make sure we don't overflow.
        
\ No newline at end of file
This page took 0.02266 seconds and 4 git commands to generate.