mirror of
https://github.com/peterferrie/proboot.git
synced 2024-12-01 17:49:34 +00:00
245 lines
5.7 KiB
ArmAsm
245 lines
5.7 KiB
ArmAsm
;license:BSD-3-Clause
|
|
;minimal open/read binary file in ProDOS filesystem
|
|
;copyright (c) Peter Ferrie 2016-2017
|
|
!cpu 6502
|
|
!to "proboot",plain
|
|
*=$800
|
|
|
|
;zpage usage, arbitrary selection except for the "PROM constant" ones
|
|
tmpval = $3c
|
|
reqsec = $3d ;PROM constant
|
|
A2L = $3e
|
|
A2H = $3f
|
|
phase = $40
|
|
reqtrk = $41 ;PROM constant
|
|
adrlo = $26
|
|
adrhi = $27
|
|
|
|
sizehi = $53
|
|
step = $fd ;(internal) state for stepper motor
|
|
|
|
;constants
|
|
scrn2p2 = $f87b
|
|
dirbuf = $1e00 ;for size-optimisation
|
|
PHASEOFF = $c080
|
|
Q6L = $c08c
|
|
|
|
!byte 1
|
|
lsr
|
|
bne init
|
|
goprom2 inc reqsec
|
|
goprom1 txa
|
|
jsr scrn2p2
|
|
ora #$c0
|
|
pha
|
|
lda #$5b
|
|
pha
|
|
rts
|
|
|
|
fakeMLI pla
|
|
tax
|
|
inx
|
|
inx
|
|
inx
|
|
txa
|
|
pha
|
|
rts
|
|
fakeMLI_e
|
|
|
|
filename !byte filename_e - filename_b
|
|
filename_b !text "PROBOOT.SYSTEM" ;name your start-up file here, file size is max 40kb
|
|
filename_e
|
|
|
|
init
|
|
- txa
|
|
jsr scrn2p2
|
|
ora #$c0
|
|
sta $be30, y
|
|
lda fakeMLI_e-$100, y
|
|
sta $be00+fakeMLI_e-fakeMLI, y
|
|
iny
|
|
bne -
|
|
stx $bf30
|
|
sty $200
|
|
sta $801
|
|
|
|
opendir ;read volume directory key block
|
|
ldx #2
|
|
|
|
;include volume directory header in count
|
|
|
|
firstent lda #>dirbuf
|
|
sta adrhi
|
|
sta A2H
|
|
jsr seekread
|
|
lda #4
|
|
sta A2L
|
|
nextent ldy #0
|
|
|
|
;match name lengths before attempting to match names
|
|
|
|
lda (A2L), y
|
|
and #$0f
|
|
tax
|
|
inx
|
|
- cmp filename, y
|
|
beq foundname
|
|
|
|
;move to next directory in this block
|
|
|
|
clc
|
|
lda A2L
|
|
adc #$27
|
|
sta A2L
|
|
bcc +
|
|
|
|
;there can be only one page crossed, so we can increment instead of adc
|
|
|
|
inc A2H
|
|
+ cmp #$ff ;4+($27*$0d)
|
|
bne nextent
|
|
|
|
;read next directory block when we reach the end of this block
|
|
|
|
ldx dirbuf+2
|
|
ldy dirbuf+3
|
|
bcs firstent
|
|
|
|
foundname iny
|
|
lda (A2L), y
|
|
dex
|
|
bne -
|
|
stx $ff
|
|
|
|
;cache KEY_POINTER
|
|
|
|
ldy #$11
|
|
lda (A2L), y
|
|
tax
|
|
iny
|
|
lda (A2L), y
|
|
tay
|
|
|
|
lda #>dirbuf
|
|
sta adrhi
|
|
|
|
readfile jsr seekread
|
|
|
|
;fetch data block and read it
|
|
|
|
blockind ldy $ff
|
|
inc $ff
|
|
ldx dirbuf, y
|
|
lda dirbuf+256, y
|
|
tay
|
|
bne readfile
|
|
txa
|
|
bne readfile
|
|
|
|
readdone jmp $2000
|
|
|
|
step1 !byte 1, $30, $28, $24, $20, $1e, $1d, $1c
|
|
step2 !byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c
|
|
|
|
readadr
|
|
- jsr readd5aa
|
|
eor #$96
|
|
bne -
|
|
sta step
|
|
jsr +
|
|
+ jsr readnib
|
|
rol
|
|
sta tmpval
|
|
bcs readnib
|
|
|
|
readd5aa ldx $2b
|
|
-- jsr readnib
|
|
- cmp #$d5
|
|
bne --
|
|
jsr readnib
|
|
cmp #$aa
|
|
bne -
|
|
|
|
readnib
|
|
- lda Q6L, x
|
|
bpl -
|
|
seekret rts
|
|
|
|
;convert block number to track/sector
|
|
|
|
seekread tya
|
|
lsr
|
|
txa
|
|
ror
|
|
lsr
|
|
lsr
|
|
sta reqtrk
|
|
txa
|
|
and #3
|
|
php
|
|
asl
|
|
plp
|
|
rol
|
|
sta reqsec
|
|
jsr readadr
|
|
and tmpval
|
|
|
|
;if track does not match, then seek
|
|
|
|
cmp reqtrk
|
|
beq checksec
|
|
asl reqtrk
|
|
asl
|
|
copy_cur tax
|
|
sta phase
|
|
sec
|
|
sbc reqtrk
|
|
beq +++
|
|
bcs +
|
|
eor #$ff
|
|
inx
|
|
bcc ++
|
|
+ sbc #1
|
|
dex
|
|
++ cmp step
|
|
bcc +
|
|
lda step
|
|
+ cmp #8
|
|
bcs +
|
|
tay
|
|
sec
|
|
+ txa
|
|
pha
|
|
ldx step1, y
|
|
+++ php
|
|
bne +
|
|
--- clc
|
|
lda phase
|
|
ldx step2, y
|
|
+ stx tmpval
|
|
and #3
|
|
rol
|
|
ora $2b
|
|
tax
|
|
lsr
|
|
lda PHASEOFF, x
|
|
-- ldx #$12
|
|
- dex
|
|
bpl -
|
|
dec tmpval
|
|
bne --
|
|
bcs ---
|
|
plp
|
|
beq shifttrk
|
|
pla
|
|
inc step
|
|
bne copy_cur
|
|
|
|
shifttrk lsr reqtrk
|
|
|
|
checksec ldx $2b
|
|
jsr goprom1
|
|
jmp goprom2
|
|
|
|
!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE
|