megademo: move some more stuff to main file

This commit is contained in:
Vince Weaver 2018-10-21 14:22:27 -04:00
parent 6fa62ea251
commit b2b22ce7c5
4 changed files with 126 additions and 5 deletions

View File

@ -20,6 +20,7 @@
28217 -- optimize the erase routine in waterfall
28097 -- move takeoff graphics to megademo
28594 -- c64 opener actually works
28483 -- move falling apple to megademo file
Graphics sizes:
(LG lores=300B)

View File

@ -5,8 +5,8 @@ falling_apple:
;===================
; init screen
jsr TEXT
jsr HOME
; jsr TEXT
; jsr HOME
bit KEYRESET
;===================
@ -193,9 +193,9 @@ loop2:
rts ; 6
.include "../asm_routines/gr_unrle.s"
.include "gr_copy.s"
;.include "../asm_routines/gr_unrle.s"
;.include "gr_copy.s"
.include "apple_40_96.inc"
;.include "apple_40_96.inc"

115
megademo/gr_unrle.s Normal file
View File

@ -0,0 +1,115 @@
;=================
; 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

View File

@ -93,6 +93,8 @@ loop_forever:
.include "lz4_decode.s"
.include "c64_opener.s"
.include "falling_apple.s"
.include "gr_unrle.s"
.include "gr_copy.s"
.include "starring.s"
.include "starring_people.s"
.include "check_email.s"
@ -138,6 +140,9 @@ loop_forever:
; No Alignment Needed
;============================
; falling_apple
.include "apple_40_96.inc"
; starring
.include "starring1.inc"
.include "starring2.inc"