diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index 9a7ec1e6..528acf34 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -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 diff --git a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s index f8d04c80..f4963269 100644 --- a/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s +++ b/src/dos_m65/dev_sdcard/fs_hvsr_read_dir.s @@ -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 diff --git a/src/dos_m65/utils/util_dir_filesize.s b/src/dos_m65/utils/util_dir_filesize.s index a9f94386..ed399b90 100644 --- a/src/dos_m65/utils/util_dir_filesize.s +++ b/src/dos_m65/utils/util_dir_filesize.s @@ -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