This commit is contained in:
Joshua Bell 2018-03-06 18:36:51 -08:00
parent f4a5cf3da5
commit 9213bd1903

View File

@ -8,7 +8,7 @@
.include "../macros.inc" .include "../macros.inc"
;;; ============================================================ ;;; ============================================================
.proc bootstrap .proc copy_desktop_to_ramcard
jmp start jmp start
@ -367,7 +367,7 @@ L268F: jsr write_desktop1
: sta BITMAP,y : sta BITMAP,y
dey dey
bpl :- bpl :-
jmp part2 jmp copy_selector_entries_to_ramcard
L26A5: lda LCBANK2 L26A5: lda LCBANK2
lda LCBANK2 lda LCBANK2
@ -914,7 +914,7 @@ prodos_loader_blocks:
.assert * = $2C00, error, "Segment length mismatch" .assert * = $2C00, error, "Segment length mismatch"
.incbin "inc/pdload.dat" .incbin "inc/pdload.dat"
.endproc ; bootstrap .endproc ; copy_desktop_to_ramcard
;;; ============================================================ ;;; ============================================================
@ -923,11 +923,23 @@ prodos_loader_blocks:
;;; SPECULATION: This copies Selector entries marked ;;; SPECULATION: This copies Selector entries marked
;;; "Down load" / "At boot" to the RAMCard as well ;;; "Down load" / "At boot" to the RAMCard as well
.proc part2 .proc copy_selector_entries_to_ramcard
;; File format:
;; $ 0 - number of entries (max 24?)
;; $ 1 - ???
;; $ 2 - 24 * 16-byte data entries
;; $0 - label (length-prefixed, 15 bytes)
;; $F - active_flag
;; $182 - 24 * 64-byte pathname
;; $782 - EOF
selector_buffer := $4400 selector_buffer := $4400
selector_buflen := $800 selector_buflen := $800
.proc process_selector_list
ptr := $6
jsr SLOT3ENTRY jsr SLOT3ENTRY
jsr HOME jsr HOME
lda LCBANK2 lda LCBANK2
@ -947,88 +959,107 @@ prodos_loader_blocks:
dex dex
bpl :- bpl :-
lda ROMIN2 lda ROMIN2
;; Load and iterate over the selector file
jsr read_selector_list jsr read_selector_list
beq :+ beq :+
jmp bail jmp bail
: lda #0 : lda #0
sta L30BB sta entry_num
L3039: lda L30BB entry_loop:
cmp selector_buffer lda entry_num
beq L3071 cmp selector_buffer ; done?
jsr L37C5 beq done_entries
stax $06 jsr compute_label_addr
ldy #$0F stax ptr
lda ($06),y
bne L306B ldy #$0F ; check active flag
lda L30BB lda (ptr),y
jsr L37D2 bne next_entry
lda entry_num
jsr compute_path_addr
jsr L38B2 jsr L38B2
jsr L3489 jsr L3489
lda LCBANK2 lda LCBANK2
lda LCBANK2 lda LCBANK2
ldx L30BB ldx entry_num
lda #$FF lda #$FF
sta $D395,x sta $D395,x
lda ROMIN2 lda ROMIN2
L306B: inc L30BB
jmp L3039
L3071: lda #$00 next_entry:
sta L30BB inc entry_num
L3076: lda L30BB jmp entry_loop
cmp selector_buffer + 1 done_entries:
;; Process entries again ???
lda #0
sta entry_num
entry_loop2:
lda entry_num
cmp selector_buffer + 1 ; ???
beq bail beq bail
clc clc
adc #$08 adc #8 ; offset by 8 ???
jsr L37C5 jsr compute_label_addr
stax $06 stax ptr
ldy #$0F ldy #$0F
lda ($06),y lda (ptr),y ; check active flag
bne L30B2 bne next_entry2
lda L30BB lda entry_num
clc clc
adc #$08 adc #8
jsr L37D2 jsr compute_path_addr
jsr L38B2 jsr L38B2
jsr L3489 jsr L3489
lda LCBANK2 lda LCBANK2
lda LCBANK2 lda LCBANK2
lda L30BB lda entry_num
clc clc
adc #$08 adc #8
tax tax
lda #$FF lda #$FF
sta $D395,x sta $D395,x
lda ROMIN2 lda ROMIN2
L30B2: inc L30BB next_entry2:
jmp L3076 inc entry_num
jmp entry_loop2
bail: jmp invoke_selector_or_desktop bail: jmp invoke_selector_or_desktop
L30BB: .byte 0 entry_num:
.byte 0
.endproc
;;; ============================================================ ;;; ============================================================
DEFINE_OPEN_PARAMS open_params6, path2, $0800 DEFINE_OPEN_PARAMS open_path2_params, path2, $0800
DEFINE_READ_PARAMS read_params4, L30CA, 4 DEFINE_READ_PARAMS read_4bytes_params, buf_4_bytes, 4
L30CA: .res 4, 0 buf_4_bytes: .res 4, 0
DEFINE_CLOSE_PARAMS close_params5 DEFINE_CLOSE_PARAMS close_params5
DEFINE_READ_PARAMS read_params5, L3150, $27 DEFINE_READ_PARAMS read_39bytes_params, L3150, 39
DEFINE_READ_PARAMS read_params6, L30E0, 5 DEFINE_READ_PARAMS read_5bytes_params, buf_5_bytes, 5
L30E0: .res 5, 0 buf_5_bytes: .res 5, 0
.byte $00,$00,$00,$00 .res 4, 0
DEFINE_CLOSE_PARAMS close_params7 DEFINE_CLOSE_PARAMS close_srcdir_params
DEFINE_CLOSE_PARAMS close_params6 DEFINE_CLOSE_PARAMS close_dstdir_params
.byte $01
.byte 1
.addr path2 .addr path2
DEFINE_OPEN_PARAMS open_params7, path2, $0D00
DEFINE_OPEN_PARAMS open_params8, path1, $1C00
DEFINE_READ_PARAMS read_params7, $1100, $0B00
DEFINE_WRITE_PARAMS write_params3, $1100, $0B00
DEFINE_CREATE_PARAMS create_params3, path1, ACCESS_DEFAULT dircopy_buffer := $0B00
DEFINE_OPEN_PARAMS open_srcdir_params, path2, $0D00
DEFINE_OPEN_PARAMS open_dstdir_params, path1, $1C00
DEFINE_READ_PARAMS read_srcdir_params, $1100, dircopy_buffer
DEFINE_WRITE_PARAMS write_dstdir_params, $1100, dircopy_buffer
DEFINE_CREATE_PARAMS create_dir_params, path1, ACCESS_DEFAULT
DEFINE_CREATE_PARAMS create_params2, path1, 0 DEFINE_CREATE_PARAMS create_params2, path1, 0
L3124: .byte $00,$00 L3124: .byte $00,$00
@ -1037,11 +1068,11 @@ L3124: .byte $00,$00
.byte $00 .byte $00
DEFINE_GET_FILE_INFO_PARAMS get_file_info_params3, path1 DEFINE_GET_FILE_INFO_PARAMS get_file_info_params3, path1
.byte $00,$02,$00,$00,$00 .byte $00,$02,$00,$00,$00
L3150: .byte $00 L3150: .byte $00,$00,$00,$00,$00,$00,$00,$00
L3151: .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00
L3160: .byte $00,$00,$00,$00,$00,$00,$00,$00 L3160: .byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00,$00,$00,$00
@ -1053,16 +1084,18 @@ path2: .res 65, 0
L320A: .res 64, 0 L320A: .res 64, 0
L324A: .res 64, 0 L324A: .res 64, 0
L328A: .byte $00,$00,$00,$00,$00,$00,$00,$00 L328A: .res 16, 0
.byte $00,$00,$00,$00,$00,$00,$00,$00
L329A: .byte $00 L329A: .byte $00
L329B: .byte $0D L329B: .byte $0D
L329C: .byte $00 L329C: .byte $00
L329D: .byte $00 ref_num:.byte $00
L329E: .byte $00 L329E: .byte $00
L329F: .res 170, 0 L329F: .res 170, 0
L3349: .byte $00 L3349: .byte $00
L334A: .byte $00 L334A: .byte $00
;;; ============================================================
L334B: ldx L3349 L334B: ldx L3349
lda L329E lda L329E
sta L329F,x sta L329F,x
@ -1070,6 +1103,8 @@ L334B: ldx L3349
stx L3349 stx L3349
rts rts
;;; ============================================================
L3359: ldx L3349 L3359: ldx L3349
dex dex
lda L329F,x lda L329F,x
@ -1077,55 +1112,64 @@ L3359: ldx L3349
stx L3349 stx L3349
rts rts
L3367: lda #$00 ;;; ============================================================
.proc L3367
lda #$00
sta L329C sta L329C
sta L334A sta L334A
MLI_CALL OPEN, open_params6 MLI_CALL OPEN, open_path2_params
beq L337A
jmp handle_error_code
L337A: lda open_params6::ref_num
sta L329D
sta read_params4::ref_num
MLI_CALL READ, read_params4
beq :+ beq :+
jmp handle_error_code jmp handle_error_code
: lda open_path2_params::ref_num
sta ref_num
sta read_4bytes_params::ref_num
MLI_CALL READ, read_4bytes_params
beq :+
jmp handle_error_code
: jsr L33A4 : jsr L33A4
rts rts
.endproc
L3392: lda L329D ;;; ============================================================
L3392: lda ref_num
sta close_params5::ref_num sta close_params5::ref_num
MLI_CALL CLOSE, close_params5 MLI_CALL CLOSE, close_params5
beq L33A3
jmp handle_error_code
L33A3: rts
L33A4: inc L329C
lda L329D
sta read_params5::ref_num
MLI_CALL READ, read_params5
beq L33B8
jmp handle_error_code
L33B8: inc L334A
lda L334A
cmp L329B
bcc L33E0
lda #$00
sta L334A
lda L329D
sta read_params6::ref_num
MLI_CALL READ, read_params6
beq :+ beq :+
jmp handle_error_code jmp handle_error_code
: rts
: lda read_params6::trans_count ;;; ============================================================
cmp read_params6::request_count
.proc L33A4
inc L329C
lda ref_num
sta read_39bytes_params::ref_num
MLI_CALL READ, read_39bytes_params
beq :+
jmp handle_error_code
: inc L334A
lda L334A
cmp L329B
bcc done
lda #0
sta L334A
lda ref_num
sta read_5bytes_params::ref_num
MLI_CALL READ, read_5bytes_params
beq :+
jmp handle_error_code
: lda read_5bytes_params::trans_count
cmp read_5bytes_params::request_count
rts rts
L33E0: return #$00 done: return #0
.endproc
;;; ============================================================
L33E3: lda L329C L33E3: lda L329C
sta L329E sta L329E
@ -1146,19 +1190,21 @@ L33F6: jsr L3392
L340C: lda L329C L340C: lda L329C
cmp L329E cmp L329E
beq L341A beq :+
jsr L33A4 jsr L33A4
jmp L340C jmp L340C
: rts
L341A: rts ;;; ============================================================
L341B: lda #$00 .proc L341B
lda #$00
sta L329A sta L329A
jsr L3367 jsr L3367
L3423: jsr L33A4 loop: jsr L33A4
bne L3455 bne next
lda L3150 lda L3150
beq L3423 beq loop
lda L3150 lda L3150
sta L346F sta L346F
and #$0F and #$0F
@ -1167,24 +1213,28 @@ L3423: jsr L33A4
sta L3467 sta L3467
jsr L3468 jsr L3468
lda L3467 lda L3467
bne L3423 bne loop
lda L3160 lda L3160
cmp #$0F cmp #$0F
bne L3423 bne loop
jsr L33E3 jsr L33E3
inc L329A inc L329A
jmp L3423 jmp loop
L3455: lda L329A next: lda L329A
beq L3463 beq done
jsr L33F6 jsr L33F6
dec L329A dec L329A
jmp L3423 jmp loop
L3463: jsr L3392 done: jsr L3392
rts rts
.endproc
;;; ============================================================
L3467: .byte 0 L3467: .byte 0
L3468: jmp L3540 L3468: jmp L3540
L346B: jmp L353D L346B: jmp L353D
@ -1192,21 +1242,22 @@ L346B: jmp L353D
L346E: rts L346E: rts
L346F: .byte 0 L346F: .byte 0
ldy #$00 ldy #$00
L3472: lda $0200,y L3472: lda $0200,y
cmp #$8D cmp #$8D
beq L3482 beq :+
and #$7F and #$7F
sta path2+1,y sta path2+1,y
iny iny
jmp L3472 jmp L3472
: sty path2
L3482: sty path2
rts rts
.byte 0 .byte 0
.byte 0 .byte 0
.byte 0 .byte 0
L3489: lda #$FF L3489: lda #$FF
sta L353B sta L353B
jsr L3777 jsr L3777
@ -1216,12 +1267,12 @@ L3489: lda #$FF
inc path1 inc path1
ldy #$00 ldy #$00
ldx path1 ldx path1
L34A1: iny : iny
inx inx
lda L328A,y lda L328A,y
sta path1,x sta path1,x
cpy L328A cpy L328A
bne L34A1 bne :-
stx path1 stx path1
MLI_CALL GET_FILE_INFO, get_file_info_params3 MLI_CALL GET_FILE_INFO, get_file_info_params3
cmp #ERR_FILE_NOT_FOUND cmp #ERR_FILE_NOT_FOUND
@ -1243,15 +1294,18 @@ L34D4: jsr show_insert_prompt
L34DA: jmp handle_error_code L34DA: jmp handle_error_code
L34DD: lda get_file_info_params2::storage_type ;;; ============================================================
.proc L34DD
lda get_file_info_params2::storage_type
cmp #ST_VOLUME_DIRECTORY cmp #ST_VOLUME_DIRECTORY
beq L34EC beq is_dir
cmp #ST_LINKED_DIRECTORY cmp #ST_LINKED_DIRECTORY
beq L34EC beq is_dir
lda #$00 lda #$00
beq L34EE beq :+
L34EC: lda #$FF is_dir: lda #$FF
L34EE: sta L353A : sta is_dir_flag
;; copy file_type, aux_type, storage_type ;; copy file_type, aux_type, storage_type
ldy #7 ldy #7
@ -1266,33 +1320,42 @@ L34EE: sta L353A
bcc L350B bcc L350B
jmp show_no_space_prompt jmp show_no_space_prompt
L350B: ldx #$03 ;; copy dates
L350D: lda get_file_info_params2::create_date,x L350B: ldx #3
: lda get_file_info_params2::create_date,x
sta create_params2::create_date,x sta create_params2::create_date,x
dex dex
bpl L350D bpl :-
;; create the file
lda create_params2::storage_type lda create_params2::storage_type
cmp #ST_VOLUME_DIRECTORY cmp #ST_VOLUME_DIRECTORY
bne L3522 bne :+
lda #ST_LINKED_DIRECTORY lda #ST_LINKED_DIRECTORY
sta create_params2::storage_type sta create_params2::storage_type
L3522: MLI_CALL CREATE, create_params2 : MLI_CALL CREATE, create_params2
beq :+ beq :+
jmp handle_error_code jmp handle_error_code
: lda L353A : lda is_dir_flag
beq L3537 beq do_dir
jmp L341B jmp L341B
.byte 0 .byte 0
rts rts
L3537: jmp L3643 do_dir: jmp copy_dir
is_dir_flag:
.byte 0
.endproc
;;; ============================================================
L353A: .byte 0
L353B: .byte 0 L353B: .byte 0
L353C: .byte 0 L353C: .byte 0
L353D: jmp L375E L353D: jmp remove_filename_from_path1
L3540: lda L3160 L3540: lda L3160
cmp #$0F cmp #$0F
@ -1302,19 +1365,19 @@ L3540: lda L3160
MLI_CALL GET_FILE_INFO, get_file_info_params2 MLI_CALL GET_FILE_INFO, get_file_info_params2
beq L3566 beq L3566
jmp handle_error_code jmp handle_error_code
L3558: jsr L375E L3558: jsr remove_filename_from_path1
jsr L3720 jsr L3720
lda #$FF lda #$FF
sta L3467 sta L3467
jmp L35A4 jmp L35A4
L3566: jsr L3739 L3566: jsr append_filename_to_path1
jsr L36C1 jsr create_dir
bcs L3558 bcs L3558
jsr L3720 jsr L3720
jmp L35A4 jmp L35A4
L3574: jsr L3739 L3574: jsr append_filename_to_path1
jsr L36FB jsr L36FB
jsr show_copying_screen jsr show_copying_screen
MLI_CALL GET_FILE_INFO, get_file_info_params2 MLI_CALL GET_FILE_INFO, get_file_info_params2
@ -1326,15 +1389,15 @@ L3574: jsr L3739
jmp show_no_space_prompt jmp show_no_space_prompt
L3590: jsr L3720 L3590: jsr L3720
jsr L36C1 jsr create_dir
bcs L35A5 bcs L35A5
jsr L36FB jsr L36FB
jsr L3643 jsr copy_dir
jsr L3720 jsr L3720
jsr L375E jsr remove_filename_from_path1
L35A4: rts L35A4: rts
L35A5: jsr L375E L35A5: jsr remove_filename_from_path1
rts rts
L35A9: MLI_CALL GET_FILE_INFO, get_file_info_params2 L35A9: MLI_CALL GET_FILE_INFO, get_file_info_params2
@ -1383,71 +1446,86 @@ L363F: .byte 0
L3640: .byte 0 L3640: .byte 0
L3641: .byte 0 L3641: .byte 0
L3642: .byte 0 L3642: .byte 0
L3643: MLI_CALL OPEN, open_params7
beq L364E ;;; ============================================================
.proc copy_dir
MLI_CALL OPEN, open_srcdir_params
beq :+
jsr handle_error_code jsr handle_error_code
L364E: MLI_CALL OPEN, open_params8 : MLI_CALL OPEN, open_dstdir_params
beq L3659 beq :+
jmp handle_error_code jmp handle_error_code
: lda open_srcdir_params::ref_num
sta read_srcdir_params::ref_num
sta close_srcdir_params::ref_num
lda open_dstdir_params::ref_num
sta write_dstdir_params::ref_num
sta close_dstdir_params::ref_num
L3659: lda open_params7::ref_num loop: copy16 #dircopy_buffer, read_srcdir_params::request_count
sta read_params7::ref_num MLI_CALL READ, read_srcdir_params
sta close_params7::ref_num
lda open_params8::ref_num
sta write_params3::ref_num
sta close_params6::ref_num
L366B: copy16 #$0B00, read_params7::request_count
MLI_CALL READ, read_params7
beq :+ beq :+
cmp #ERR_END_OF_FILE cmp #ERR_END_OF_FILE
beq L36AE beq finish
jmp handle_error_code jmp handle_error_code
: copy16 read_params7::trans_count, write_params3::request_count : copy16 read_srcdir_params::trans_count, write_dstdir_params::request_count
ora read_params7::trans_count ora read_srcdir_params::trans_count
beq L36AE beq finish
MLI_CALL WRITE, write_params3 MLI_CALL WRITE, write_dstdir_params
beq :+ beq :+
jmp handle_error_code jmp handle_error_code
: lda write_params3::trans_count : lda write_dstdir_params::trans_count
cmp #<$0B00 cmp #<dircopy_buffer
bne L36AE bne finish
lda write_params3::trans_count+1 lda write_dstdir_params::trans_count+1
cmp #>$0B00 cmp #>dircopy_buffer
beq L366B beq loop
L36AE: MLI_CALL CLOSE, close_params6
MLI_CALL CLOSE, close_params7 finish: MLI_CALL CLOSE, close_dstdir_params
MLI_CALL CLOSE, close_srcdir_params
jsr get_file_info_and_copy jsr get_file_info_and_copy
jsr do_set_file_info jsr do_set_file_info
rts rts
.endproc
;; copy file_type, aux_type, storage_type ;;; ============================================================
L36C1: ldx #7
;; Copy file_type, aux_type, storage_type
.proc create_dir
ldx #7
: lda get_file_info_params2,x : lda get_file_info_params2,x
sta create_params3,x sta create_dir_params,x
dex dex
cpx #3 cpx #3
bne :- bne :-
lda #ACCESS_DEFAULT lda #ACCESS_DEFAULT
sta create_params3::access sta create_dir_params::access
ldx #$03
L36D5: lda get_file_info_params2::create_date,x
sta create_params3::create_date,x
dex
bpl L36D5
lda create_params3::storage_type
cmp #ST_VOLUME_DIRECTORY
bne L36EA
lda #ST_LINKED_DIRECTORY
sta create_params3::storage_type
L36EA: MLI_CALL CREATE, create_params3
clc
beq L36F6
jmp handle_error_code
L36F6: rts ;; Copy dates
ldx #3
: lda get_file_info_params2::create_date,x
sta create_dir_params::create_date,x
dex
bpl :-
;; Create it
lda create_dir_params::storage_type
cmp #ST_VOLUME_DIRECTORY
bne :+
lda #ST_LINKED_DIRECTORY
sta create_dir_params::storage_type
: MLI_CALL CREATE, create_dir_params
clc
beq :+
jmp handle_error_code
: rts
.endproc
;;; ============================================================
.byte 0 .byte 0
.byte 0 .byte 0
@ -1465,7 +1543,7 @@ L3701: ldx #$00
iny iny
L370C: cpx L3150 L370C: cpx L3150
bcs L371C bcs L371C
lda L3151,x lda L3150+1,x
sta path2+1,y sta path2+1,y
inx inx
iny iny
@ -1490,59 +1568,75 @@ L3734: dex
stx path2 stx path2
rts rts
L3739: lda L3150 ;;; ============================================================
bne L373F
.proc append_filename_to_path1
lda L3150
bne :+
rts rts
L373F: ldx #$00 : ldx #0
ldy path1 ldy path1
lda #'/' lda #'/'
sta path1+1,y sta path1+1,y
iny iny
L374A: cpx L3150 loop: cpx L3150
bcs L375A bcs done
lda L3151,x lda L3150+1,x
sta path1+1,y sta path1+1,y
inx inx
iny iny
jmp L374A jmp loop
L375A: sty path1 done: sty path1
rts
.endproc
;;; ============================================================
.proc remove_filename_from_path1
ldx path1
bne loop
rts rts
L375E: ldx path1 loop: lda path1,x
bne L3764
rts
L3764: lda path1,x
cmp #'/' cmp #'/'
beq L3772 beq done
dex dex
bne L3764 bne loop
stx path1 stx path1
rts rts
L3772: dex done: dex
stx path1 stx path1
rts rts
.endproc
L3777: ldy #0 ;;; ============================================================
.proc L3777
ldy #0
sta L353C sta L353C
dey dey
L377D: iny
loop: iny
lda L324A,y lda L324A,y
cmp #'/' cmp #'/'
bne L3788 bne :+
sty L353C sty L353C
L3788: sta path2,y : sta path2,y
cpy L324A cpy L324A
bne L377D bne loop
ldy L320A ldy L320A
L3793: lda L320A,y loop2: lda L320A,y
sta path1,y sta path1,y
dey dey
bpl L3793 bpl loop2
rts rts
.endproc
;;; ============================================================
.proc do_set_file_info .proc do_set_file_info
lda #7 ; SET_FILE_INFO param_count lda #7 ; SET_FILE_INFO param_count
@ -1569,8 +1663,9 @@ fail: pla
.endproc .endproc
;;; ============================================================ ;;; ============================================================
;;; Compute first offset into selector file - A*16 + 2
.proc L37C5 .proc compute_label_addr
addr := selector_buffer + $2 addr := selector_buffer + $2
jsr ax_times_16 jsr ax_times_16
@ -1585,8 +1680,9 @@ fail: pla
.endproc .endproc
;;; ============================================================ ;;; ============================================================
;;; Compute second offset into selector file - A*64 + $182
.proc L37D2 .proc compute_path_addr
addr := selector_buffer + $182 addr := selector_buffer + $182
jsr ax_times_64 jsr ax_times_64
@ -1900,6 +1996,8 @@ done: rts
;;; ============================================================ ;;; ============================================================
;; unused?
L3AD8: .byte 0 ; ??? L3AD8: .byte 0 ; ???
.byte $02 .byte $02
@ -1910,10 +2008,13 @@ L3ADA: iny
lda #$A2 lda #$A2
sta $0200 sta $0200
rts rts
.endproc ; part2
.endproc ; copy_selector_entries_to_ramcard
;;; ============================================================ ;;; ============================================================
;;; ??? Is this relocated? Part of ProDOS? RAMCard driver? ;;; ??? Is this relocated? Part of ProDOS? RAMCard driver?
;;; ============================================================
.proc WTF .proc WTF
;; Branch targets before/after this block ;; Branch targets before/after this block