itty-bitty-vtty/boot.S

118 lines
1.2 KiB
ArmAsm

*
* boot block.
*
* loaded at $0800
* relocates everything to $6000, loads extra blocks, and runs main.
xc
xc
rel
* org $0800
ORG equ $6000
*MAX_BLOCK equ 6
SLOT equ $00
CMD equ $42
UNIT equ $43
BUFFER equ $44
BLOCK equ $46
ext main
ext MAXBLOCKS
boot
mx %11
db $01 ; prodos boot id
* slot 5 = x = $50, a = $3178
* slot 6 = x = $60, a = $8401
* stx :unit
* txa
* lsr
* lsr
* lsr
* lsr
* ora #$c0
ldy #END-boot
:cp lda $0800,y ; boot,y
sta ORG,y
dey
bne :cp
jmp ORG+:entry-boot
:entry stx UNIT
txa
lsr
lsr
lsr
lsr
ora #$c0
sta :prodos+2
stz SLOT
sta SLOT+1
ldy #1
lda (SLOT),y
cmp #$20
bne noboot
ldy #3
lda (SLOT),y
bne noboot
ldy #5
lda (SLOT),y
cmp #$03
bne noboot
ldy #$ff
lda (SLOT),y
sta :prodos+1
lda #1 ; read block
sta CMD
sta BLOCK
stz BLOCK+1
stz BUFFER
lda #>{ORG+512} ; $0800+512
sta BUFFER+1
:read
jsr :prodos ; block 1
bcs noboot
inc BLOCK
inc BUFFER+1
inc BUFFER+1
lda BLOCK
cmp #MAXBLOCKS
bcc :read
bra :ok
:prodos jmp $0000
:ok
jmp main
noboot
ldx #0
:cout lda :str,x
beq :wai
jsr $fded
inx
bra :cout
:wai wai
bra :wai
:str asc "** BOOT ERROR **",00
END
err *-boot>$ff
* fill to end of block since only 255 bytes relocated.
ds boot+512-*
sav boot.L