Files
open-roms/src/dos_m65/utils/util_dir_filesize.s
T

183 lines
3.1 KiB
ArmAsm

; Adapt the file size for displaying in a directory list
util_dir_filesize_bytes: ; preserves .X
; Convert file size in bytes (32-bit value) to blocks, afterwards
; continue processing in 'util_dir_filesize_blocks'
; Start from handling some large values
lda PAR_FSIZE_BYTES+3
+bne util_dir_filesize_max ; file over 16MB size
lda PAR_FSIZE_BYTES+2
inc
+beq util_dir_filesize_max ; file over 8MB size
; Set initial size as 0 blocks
lda #$00
sta PAR_FSIZE_BLOCKS+0
sta PAR_FSIZE_BLOCKS+1
; Calculate number of blocks
ldy #$03
@lp:
lda PAR_FSIZE_BYTES+2
cmp util_dir_cmptab_hi,y
bcc @lp_next
bne @lp_adc_sbc
lda PAR_FSIZE_BYTES+1
cmp util_dir_cmptab_mi,y
bcc @lp_next
bne @lp_adc_sbc
lda PAR_FSIZE_BYTES+0
cmp util_dir_cmptab_lo,y
bcc @lp_next
@lp_adc_sbc:
clc
lda PAR_FSIZE_BLOCKS+0
adc util_dir_addtab_lo,y
sta PAR_FSIZE_BLOCKS+0
lda PAR_FSIZE_BLOCKS+1
adc util_dir_addtab_hi,y
sta PAR_FSIZE_BLOCKS+1
sec
lda PAR_FSIZE_BYTES+0
sbc util_dir_cmptab_lo, y
sta PAR_FSIZE_BYTES+0
lda PAR_FSIZE_BYTES+1
sbc util_dir_cmptab_mi, y
sta PAR_FSIZE_BYTES+1
lda PAR_FSIZE_BYTES+2
sbc util_dir_cmptab_hi, y
sta PAR_FSIZE_BYTES+2
bra @lp
@lp_next:
dey
bpl @lp
; Correct for bytes not filling in the whole block
lda PAR_FSIZE_BYTES+0
beq util_dir_filesize_blocks
inc PAR_FSIZE_BLOCKS+0
bne util_dir_filesize_blocks
inc 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
; Tables for calculating blocks from bytes
util_dir_addtab_hi:
!byte $00, $00 ; 2 next bytes same as in 'lo' table
util_dir_addtab_lo:
!byte $01, $10, $00, $00
util_dir_cmptab_hi:
!byte ^(254), ^(254 * 16), ^(254 * 16 * 16), ^(254 * 16 * 16 * 16), ^(254 * 16 * 16 * 16 * 16)
util_dir_cmptab_mi:
!byte >(254), >(254 * 16), >(254 * 16 * 16), >(254 * 16 * 16 * 16), >(254 * 16 * 16 * 16 * 16)
util_dir_cmptab_lo:
!byte <(254), <(254 * 16), <(254 * 16 * 16), <(254 * 16 * 16 * 16), <(254 * 16 * 16 * 16 * 16)