gr: stars: see if it will fit in 128 bytes

short answer is no
This commit is contained in:
Vince Weaver 2022-06-02 15:08:58 -04:00
parent 72215d5ec8
commit 4305eedcd2
4 changed files with 250 additions and 4 deletions

View File

@ -12,12 +12,13 @@ all: star.dsk
$(DOS33):
cd ../../../utils/dos33fs-utils && make
star.dsk: $(DOS33) HELLO STAR STARS STARS_BOT
star.dsk: $(DOS33) HELLO STAR STARS STARS_BOT STARS_128
cp $(EMPTY_DISK)/empty.dsk star.dsk
$(DOS33) -y star.dsk SAVE A HELLO
$(DOS33) -y star.dsk BSAVE -a 0xc00 STAR
$(DOS33) -y star.dsk BSAVE -a 0xc00 STARS
$(DOS33) -y star.dsk BSAVE -a 0x36B STARS_BOT
$(DOS33) -y star.dsk BSAVE -a 0x60 STARS_128
###
@ -51,6 +52,15 @@ stars_bot.o: stars_bot.s
###
clean:
rm -f *~ *.o *.lst HELLO STAR STARS STARS_BOT
STARS_128: stars_128.o
ld65 -o STARS_128 stars_128.o -C $(LINKERSCRIPTS)/apple2_60_zp.inc
stars_128.o: stars_128.s
ca65 -o stars_128.o stars_128.s -l stars_128.lst
###
clean:
rm -f *~ *.o *.lst HELLO STAR STARS STARS_BOT STARS_128

View File

@ -0,0 +1,224 @@
; bouncing stars (128B version)
; by Vince `deater` Weaver
; 138 bytes -- starting with bot version
; 135 bytes -- make addresses zero page
SPEAKER = $C030
SET_GR = $C050
SET_TEXT = $C051
FULLGR = $C052
PAGE1 = $C054
PAGE2 = $C055
LORES = $C056 ; Enable LORES graphics
HGR2 = $F3D8
PLOT = $F800 ; PLOT AT Y,A (A colors output, Y preserved)
GBASCALC = $F847 ; Y in A, put addr in GBASL/GBASH (what is C?)
SETGR = $FB40
WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us
GBASL = $26
GBASH = $27
YPOS = $56
XPOS = $57
PO = $58
FRAME = $5D
;PAGE = $5E
.zeropage
.globalzp bounce
.globalzp bitmap
.globalzp bg_smc
stars:
bit SET_GR ; switch to lo-res mode
bit FULLGR ; set full screen
main_loop:
;======================
; flip page
;======================
page_smc:
lda #0 ; 0 or 1
tax
ldy PAGE1,X ; flip page
eor #$1 ; invert (leaving in A)
sta page_smc+1 ; save PAGE value (PAGE in A here)
asl ; make OUTH $4 or $8 depending on value in PAGE
; which we have in A above or at end of loop
asl ; (this also sets C to 0)
adc #4
sta GBASH
inc FRAME ; increment frame #
lda FRAME
and #$1f ; cycle colors ever 32 frames
bne no_color_cycle
inc bg_smc+1
no_color_cycle:
lda #100 ; pause a bit
jsr WAIT
sta GBASL ; A is 0
;=================================
; clear lo-res screen, page1/page2
;=================================
; proper with avoiding screen holes is ~25 instructions
; this is more like 16
; assume GBASL/GBASH already points to proper $400 or $800
ldx #4 ; lores is 1k, so 4 pages
full_loop:
ldy #$00 ; clear whole page
bg_smc:
lda #$54 ; color
inner_loop:
sta (GBASL),Y
dey
bne inner_loop
inc GBASH ; point to next page
dex
bne full_loop
; X=0
; Y=0
; A=color
;====================
; draw the stars
;====================
lda #32 ; start from right to save a byte
;======================
; draw 8x8 bitmap star
;======================
; A is XPOS on entry
draw_star:
; calculate YPOS
sta XPOS
lsr ; make middle star offset+4 from others
lsr
adc FRAME ; look up bounce amount
and #$7
tax
lda bounce,X
sta YPOS
ldx #7 ; draw 7 lines
boxloop:
txa
clc
adc YPOS
jsr GBASCALC ; calc address of line in X (Y-coord)
; GBASL is in A at this point
; is C always 0?
; clc
adc XPOS ; adjust to X-coord
sta GBASL
; adjust for proper page
lda page_smc+1 ; want to add 0 or 4 (not 0 or 1)
asl
asl ; this sets C to 0
adc GBASH
sta GBASH
;=================
; draw line
ldy #7 ; 8-bits wide
lda bitmap,X ; get low bit of bitmap into carry
draw_line_loop:
lsr
pha
bcc its_transparent
lda #$dd ; yellow
sta (GBASL),Y ; draw on screen
its_transparent:
pla
dey
bpl draw_line_loop
dex
bpl boxloop
lda XPOS ; move to next position
; going right to left saves 2 bytes for cmp
sec
sbc #16
; X is $FF here
; Y is $FF here
; A is -16 here
bpl draw_star
bmi main_loop
;=================
; star bitmap
;=================
;012|456|
; @ ;
; @@ ;
; @@@@@ ;
;@@@@@@@ ;
; @@@@@ ;
; @@@@@ ;
; @@ @@ ;
;@@ @@ ;
bitmap:
.byte $10
.byte $18
.byte $1f
.byte $fe
.byte $7c
.byte $3e
.byte $66
.byte $C3
bounce:
.byte 10,11,12,13,13,12,11,10

View File

@ -0,0 +1,12 @@
MEMORY {
ZP: start = $60, size = $90, type = rw;
RAM: start = $60, size = $8E00, file = %O;
}
SEGMENTS {
CODE: load = RAM, type = ro;
#RODATA: load = RAM, type = ro;
#DATA: load = RAM, type = rw;
#BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = ro;
}

View File

@ -4,7 +4,7 @@ MEMORY {
}
SEGMENTS {
#CODE: load = RAM, type = ro;
CODE: load = RAM, type = ro;
#RODATA: load = RAM, type = ro;
#DATA: load = RAM, type = rw;
#BSS: load = RAM, type = bss, define = yes;