183 lines
3.1 KiB
ArmAsm
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)
|