mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-10-31 10:13:35 +00:00
116 lines
2.1 KiB
ArmAsm
116 lines
2.1 KiB
ArmAsm
;=================
|
|
; load RLE image
|
|
;=================
|
|
; Output is BASH/BASL
|
|
; Input is in GBASH/GBASL
|
|
load_rle_gr:
|
|
lda #$0
|
|
tay ; init Y to 0
|
|
sta TEMP ; stores the xcoord
|
|
|
|
sta CV ; ycoord=0
|
|
|
|
jsr load_and_increment ; load xsize
|
|
sta CH
|
|
|
|
rle_loop:
|
|
jsr load_and_increment
|
|
|
|
cmp #$A1 ; if 0xa1
|
|
beq rle_done ; we are done
|
|
|
|
pha
|
|
|
|
and #$f0 ; mask
|
|
cmp #$a0 ; see if special AX
|
|
beq decompress_special
|
|
|
|
pla ; note, PLA sets flags!
|
|
|
|
ldx #$1 ; only want to print 1
|
|
bne decompress_run
|
|
|
|
decompress_special:
|
|
pla
|
|
|
|
and #$0f ; check if was A0
|
|
|
|
bne decompress_color ; if A0 need to read run, color
|
|
|
|
decompress_large:
|
|
jsr load_and_increment ; get run length
|
|
|
|
decompress_color:
|
|
tax ; put runlen into X
|
|
jsr load_and_increment ; get color
|
|
|
|
decompress_run:
|
|
rle_run_loop:
|
|
sta (BASL),y ; write out the value
|
|
inc BASL ; increment the pointer
|
|
bne rle_skip3 ; if wrapped
|
|
inc BASH ; then increment the high value
|
|
|
|
rle_skip3:
|
|
pha ; store colore for later
|
|
|
|
inc TEMP ; increment the X value
|
|
lda TEMP
|
|
cmp CH ; compare against the image width
|
|
bcc rle_not_eol ; if less then keep going
|
|
|
|
lda BASL ; cheat to avoid a 16-bit add
|
|
cmp #$a7 ; we are adding 0x58 to get
|
|
bcc rle_add_skip ; to the next line
|
|
inc BASH
|
|
rle_add_skip:
|
|
clc
|
|
adc #$58 ; actually do the 0x58 add
|
|
sta BASL ; and store it back
|
|
|
|
inc CV ; add 2 to ypos
|
|
inc CV ; each "line" is two high
|
|
|
|
lda CV ; load value
|
|
cmp #15 ; if it's greater than 14 it wraps
|
|
bcc rle_no_wrap ; Thanks Woz
|
|
|
|
lda #$0 ; we wrapped, so set to zero
|
|
sta CV
|
|
|
|
; when wrapping have to sub 0x3d8
|
|
sec ; this is a 16-bit subtract routine
|
|
lda BASL
|
|
sbc #$d8 ; LSB
|
|
sta BASL
|
|
lda BASH ; MSB
|
|
sbc #$3 ;
|
|
sta BASH
|
|
|
|
rle_no_wrap:
|
|
lda #$0 ; set X value back to zero
|
|
sta TEMP
|
|
|
|
rle_not_eol:
|
|
pla ; restore color
|
|
dex
|
|
bne rle_run_loop ; if not zero, keep looping
|
|
beq rle_loop ; and branch always
|
|
|
|
rle_done:
|
|
lda #$15 ; move the cursor somewhere sane
|
|
sta CV
|
|
rts
|
|
|
|
|
|
load_and_increment:
|
|
lda (GBASL),y ; load value ; 5?
|
|
inc GBASL ; 5?
|
|
bne lskip2 ; 2nt/3
|
|
inc GBASH ; 5?
|
|
lskip2:
|
|
rts ; 6
|
|
|
|
|
|
|