mirror of
https://github.com/a2-4am/4cade.git
synced 2024-11-30 13:50:45 +00:00
136 lines
3.3 KiB
ArmAsm
136 lines
3.3 KiB
ArmAsm
|
;license:BSD-3-Clause
|
||
|
;minimal open/read binary file in ProDOS filesystem
|
||
|
;copyright (c) Peter Ferrie 2016-2018
|
||
|
!cpu 6502
|
||
|
!to "proboothd",plain
|
||
|
*=$800
|
||
|
|
||
|
;zpage usage, arbitrary selection except for the "ProDOS constant" ones
|
||
|
command = $42 ;ProDOS constant
|
||
|
unit = $43 ;ProDOS constant
|
||
|
adrlo = $44 ;ProDOS constant
|
||
|
adrhi = $45 ;ProDOS constant
|
||
|
bloklo = $46 ;ProDOS constant
|
||
|
blokhi = $47 ;ProDOS constant
|
||
|
|
||
|
A2L = $3e
|
||
|
A2H = $3f
|
||
|
sizehi = $53
|
||
|
|
||
|
;constants
|
||
|
scrn2p2 = $f87b
|
||
|
dirbuf = $1e00 ;for size-optimisation
|
||
|
|
||
|
!byte 1
|
||
|
tay
|
||
|
- txa
|
||
|
jsr scrn2p2
|
||
|
ora #$c0
|
||
|
sta $be30, y
|
||
|
sta slot+2
|
||
|
sta entry+2
|
||
|
slot lda $cfff
|
||
|
sta entry+1
|
||
|
|
||
|
lda fakeMLI_e-$100, y
|
||
|
sta $be00+fakeMLI_e-fakeMLI, y
|
||
|
iny
|
||
|
bne -
|
||
|
stx $bf30
|
||
|
sty $200
|
||
|
|
||
|
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
|
||
|
|
||
|
readfile jsr seekread
|
||
|
inc adrhi
|
||
|
inc adrhi
|
||
|
|
||
|
;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
|
||
|
|
||
|
seekread stx bloklo
|
||
|
sty blokhi
|
||
|
entry jmp $d1d1
|
||
|
|
||
|
fakeMLI pla
|
||
|
tax
|
||
|
inx
|
||
|
inx
|
||
|
inx
|
||
|
txa
|
||
|
pha
|
||
|
rts
|
||
|
fakeMLI_e
|
||
|
|
||
|
filename !byte filename_e - filename_b
|
||
|
filename_b !text "LAUNCHER.SYSTEM" ;your start-up file, file is max 40kb
|
||
|
filename_e
|
||
|
|
||
|
*=$9f8
|
||
|
!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE
|