CBDOS directory output tweaks
This commit is contained in:
1 parent
9d082366ab
commit
c9aaa7b1ac
3 files changed
+123
-30
No files matched your search
@@ -35,16 +35,19 @@
|
||||
!addr IDX1_TALKER = $8012 ; talker idx, >=$80 = none
|
||||
!addr IDX2_TALKER = $8013 ; talker idx * 2, >=$80 = none - for calling routines via vector table
|
||||
|
||||
; Parameters for utilities
|
||||
|
||||
!addr PAR_FSIZE_BLOCKS = $8014 ; 2 bytes - file size in blocks
|
||||
!addr PAR_FSIZE_BYTES = $8016 ; 4 bytes - file size in bytes
|
||||
|
||||
; Various temporary data
|
||||
|
||||
!addr XX_DIR_PHASE = $8014 ; directory output phase, values deponds on device driver
|
||||
!addr SD_DIR_PHASE = $8014 ; - SD card
|
||||
!addr FD_DIR_PHASE = $8015 ; - floppy
|
||||
!addr RD_DIR_PHASE = $8016 ; - ram disk
|
||||
!addr XX_DIR_PHASE = $801A ; directory output phase, values deponds on device driver
|
||||
!addr SD_DIR_PHASE = $801A ; - SD card
|
||||
!addr FD_DIR_PHASE = $801B ; - floppy
|
||||
!addr RD_DIR_PHASE = $801C ; - ram disk
|
||||
|
||||
|
||||
|
||||
; Free space: $8014-$8063
|
||||
; Free space: $801D-$8063
|
||||
|
||||
!addr SD_ACPTR_helper = $8052 ; subroutine in RAM to read a byte
|
||||
!addr code_LDA_01 = $8052 ; - LDA instruction
|
||||
|
||||
@@ -212,34 +212,36 @@ fs_hvsr_read_dir:
|
||||
sta SD_DIRENT+$80
|
||||
sta SD_DIRENT+$81
|
||||
|
||||
lda SD_DIRENT+$53 ; XXX calculate length in blocks instead
|
||||
sta SD_DIRENT+$82
|
||||
lda SD_DIRENT+$54
|
||||
sta SD_DIRENT+$83
|
||||
|
||||
bra @len_done ; XXX if size above 9999, force maximum possible length
|
||||
|
||||
@len_max:
|
||||
|
||||
lda #<9999
|
||||
sta SD_DIRENT+$82
|
||||
lda #>9999
|
||||
sta SD_DIRENT+$83
|
||||
|
||||
@len_done:
|
||||
|
||||
ldx SD_DIRENT+$40 ; make sure file name is terminated by 0
|
||||
lda #$00
|
||||
sta SD_DIRENT, x
|
||||
|
||||
ldx #$04 ; XXX put correct amount of spaces depending on number size
|
||||
lda SD_DIRENT+$52 ; calculate file length in blocks to display
|
||||
sta PAR_FSIZE_BYTES+0
|
||||
lda SD_DIRENT+$53
|
||||
sta PAR_FSIZE_BYTES+1
|
||||
lda SD_DIRENT+$54
|
||||
sta PAR_FSIZE_BYTES+2
|
||||
lda SD_DIRENT+$55
|
||||
sta PAR_FSIZE_BYTES+3
|
||||
|
||||
jsr util_dir_filesize_bytes
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+0
|
||||
sta SD_DIRENT+$82
|
||||
lda PAR_FSIZE_BLOCKS+1
|
||||
sta SD_DIRENT+$83
|
||||
|
||||
lda #' '
|
||||
ldx #$04 ; indent number of blocks
|
||||
@lpindent1:
|
||||
dey
|
||||
bmi @lpindent1_done
|
||||
sta SD_DIRENT+$80, x
|
||||
inx
|
||||
sta SD_DIRENT+$80, x
|
||||
inx
|
||||
sta SD_DIRENT+$80, x
|
||||
inx
|
||||
bra @lpindent1
|
||||
|
||||
@lpindent1_done:
|
||||
|
||||
lda #$22 ; opening quote
|
||||
sta SD_DIRENT+$80, x
|
||||
|
||||
@@ -2,8 +2,96 @@
|
||||
; Adapt the file size for displaying in a directory list
|
||||
|
||||
|
||||
util_dir_filesize:
|
||||
util_dir_filesize_bytes: ; preserves .X
|
||||
|
||||
; XXX provide implementation
|
||||
; Convert file size in bytes (32-bit value) to blocks, afterwards
|
||||
; continue processing in 'util_dir_filesize_blocks'
|
||||
|
||||
; XXX temporary - calculate size in 254-byte blocks
|
||||
|
||||
lda PAR_FSIZE_BYTES+1
|
||||
sta PAR_FSIZE_BLOCKS+0
|
||||
lda PAR_FSIZE_BYTES+2
|
||||
sta PAR_FSIZE_BLOCKS+1
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_dir_filesize_blocks: ; preserves .X
|
||||
|
||||
; Take file size in blocks (16-bit value), clip to max 9999,
|
||||
; return in .Y the amount of spaces needed for indentation
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+1
|
||||
cmp #>9999
|
||||
beq @cmp_9999_p2
|
||||
bcs util_dir_filesize_max
|
||||
bcc @size_ok
|
||||
|
||||
@cmp_9999_p2:
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+0
|
||||
cmp #<9999
|
||||
bcs util_dir_filesize_max
|
||||
|
||||
@size_ok:
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+1
|
||||
beq @size_123
|
||||
|
||||
@size_34: ; file size is 256 or above (3 or 4 digits)
|
||||
|
||||
cmp #>1000
|
||||
beq @cmp_1000_p2
|
||||
bcs util_dir_filesize_4
|
||||
bra util_dir_filesize_3
|
||||
|
||||
@cmp_1000_p2:
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+0
|
||||
cmp #<1000
|
||||
bcs util_dir_filesize_4
|
||||
bra util_dir_filesize_3
|
||||
|
||||
@size_123: ; file size is 255 or below (1, 2, or 3 digits)
|
||||
|
||||
lda PAR_FSIZE_BLOCKS+0
|
||||
cmp #10
|
||||
bcs util_dir_filesize_23
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_dir_filesize_1: ; file size needs 1 digit
|
||||
|
||||
ldy #$03
|
||||
rts
|
||||
|
||||
util_dir_filesize_23: ; file size needs 2 or 3 digits, size in .A
|
||||
|
||||
cmp #100
|
||||
bcs util_dir_filesize_3
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_dir_filesize_2: ; file size needs 2 digits
|
||||
|
||||
ldy #$02
|
||||
rts
|
||||
|
||||
util_dir_filesize_3: ; file size needs 3 digits
|
||||
|
||||
ldy #$01
|
||||
rts
|
||||
|
||||
util_dir_filesize_max:
|
||||
|
||||
lda #<9999
|
||||
sta PAR_FSIZE_BLOCKS+0
|
||||
lda #>9999
|
||||
sta PAR_FSIZE_BLOCKS+1
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_dir_filesize_4: ; file size needs 4 digits
|
||||
|
||||
ldy #$00
|
||||
rts
|
||||
Reference in new issue
Block a user