 xc
 org $800

* Equates
cold equ $1200
key equ $c000
strobe equ $c010
home equ $fc58
cout equ $fded
mainread equ $C002
auxread equ $C003
mainwrite equ $C004
auxwrite equ $C005

* Code
 hex 01
 txa  ; #$50 = %0101 0000
 pha
 lsr  ; > 0010 1000
 lsr  ; > 0001 0100
 lsr  ; > 0000 1010
 lsr  ; > 0000 0101
 ora #$C0 ; > #$C5
 pha
 sta reboot+2 ; in case we need to reboot
 sta a1+2 ; fix entry address for ProDOS PC entry
 sta a3+2 ; fix call address for PC entry
a1 lda $FFFF ; > $C5FF
 clc
 adc #3 ; get PC entry low byte
 sta a3+1 ; set PC entry byte

* Check for 128K
 jsr chk80
 bcs error

* Check for 65C02 processor
 lda #$99
 clc
 sed
 adc #1
 cld
 bpl a2 ; success!

* Error routine
error lda #<msg1 ;4C 00 20
 sta pr1+1
 lda #>msg1
 sta pr1+2
 jsr print
 sta strobe
restart lda key
 bpl restart
 sta strobe
reboot jmp $FF00

* Load blocks 000000-000018
a2 lda #<msg2
 sta pr1+1
 lda #>msg2
 sta pr1+2
 jsr print

a3 jsr $FFFF ; call PC
 hex 01 ; read block
 da rdblock
 bcs error
 inc rbuffer+1
 inc rbuffer+1
 inc rblock

* read equivalent of three tracks (24 blocks)
 lda rblock
 cmp #25 ; $19
 bcc a3 ; blocks 0-24 > $1000-3FFF
 pla  ; $Cx
 sta $fe
 pla  ; $x0
 sta $ff
 ldx $ff
 txs
 jmp cold

* print message routine
print jsr home ; home/clear screen
 ldy #0
pr1 lda $ffff,y
 beq pr2
 jsr cout ; print ASCII char on screen
 iny
 bne pr1
pr2 rts

* check for 128K memory
chk80 clc
 ldx #rend-routine
move lda routine,x
 sta $100,x
 dex
 bpl move
 jmp $0100

* routine from ProDOS 8
routine lda #$ee
 sta auxread ; loads in aux $0200-BFFF
 sta auxwrite
 sta $0c00
 sta $7c00
 lda $0c00
 cmp #$ee ; first check
 bne noaux
 asl $0c00
 asl
 cmp $0c00 ; second check
 bne noaux
 cmp $7c00 ; third check
 bne auxil
noaux sec
 bcs r1
auxil clc
r1 sta mainread
 sta mainwrite
 rts
rend equ *

* Messages
msg1 asc "ERROR LOADING.",8d
 asc "PRESS ANY KEY TO RESTART:",00
msg2 asc "FIFTH programming language v0.01a",8d
 asc "Just a moment...",00

* PC call block
rdblock hex 03 ; parameter count
 hex 01 ; unit number
rbuffer hex 0010 ; $1000
rblock hex 000000 ; block number to read




 xc
 org $1200
cout equ $fded
monz equ $ff69 ; call-151

 ldy #msgend-msg
loop lda msg,y
 jsr cout
 dey
 bpl loop
 jmp monz

msg rev "Reached $1200, second stage boot"
msgend equ *






