diff --git a/graphics/gr/scroll/Makefile b/graphics/gr/scroll/Makefile index bb2f4365..c5f1b284 100644 --- a/graphics/gr/scroll/Makefile +++ b/graphics/gr/scroll/Makefile @@ -12,14 +12,14 @@ all: scroller.dsk $(DOS33): cd ../../../utils/dos33fs-utils && make -scroller.dsk: $(DOS33) HELLO DIAMOND DIAMOND_BOT RANDOM RANDOM_BOT +scroller.dsk: $(DOS33) HELLO DIAMOND DIAMOND_BOT RANDOM RANDOM_BOT RANDOM_128 cp $(EMPTY_DISK)/empty.dsk scroller.dsk $(DOS33) -y scroller.dsk SAVE A HELLO $(DOS33) -y scroller.dsk BSAVE -a 0xc00 DIAMOND $(DOS33) -y scroller.dsk BSAVE -a 0x36B DIAMOND_BOT $(DOS33) -y scroller.dsk BSAVE -a 0xc00 RANDOM $(DOS33) -y scroller.dsk BSAVE -a 0x36B RANDOM_BOT - + $(DOS33) -y scroller.dsk BSAVE -a 0x70 RANDOM_128 ### HELLO: hello.bas @@ -51,6 +51,14 @@ random.o: random.s ### +RANDOM_128: random_128.o + ld65 -o RANDOM_128 random_128.o -C $(LINKERSCRIPTS)/apple2_70_zp.inc + +random_128.o: random_128.s + ca65 -o random_128.o random_128.s -l random_128.lst + +### + RANDOM_BOT: random_bot.o ld65 -o RANDOM_BOT random_bot.o -C $(LINKERSCRIPTS)/apple2_36b.inc diff --git a/graphics/gr/scroll/random_128.s b/graphics/gr/scroll/random_128.s new file mode 100644 index 00000000..94445a98 --- /dev/null +++ b/graphics/gr/scroll/random_128.s @@ -0,0 +1,236 @@ +; random scroll bot 128 + +; 141 bytes -- bot version +; 138 bytes -- no need for back jump +; 140 bytes -- load at 0x70 +; 134 bytes -- enforce ZP addresses +; 133 bytes -- convert JMP to BPL +; 131 bytes -- make OUTL live in program +; 130 bytes -- use EOR instead of ADD +; 127 bytes -- don't wrap pattern lookup at 8 +; 126 bytes -- use X for loop + +; ***** ***** +; ***** ***** +; ** ** @@ @@@@@@ +; ** ** @@ @@ +; ** ** @@@@@@ @@@@@@ @@@@@@ +; ***** ***** @@ @@ @@ @@ +; ***** ***** @@@@@@ @@@@@@ @@ + + +; by Vince `deater` Weaver + +SETTEXT = $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 +SETGR = $FB40 +WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us + +GBASL = $26 +GBASH = $27 + +OUTL = $74 +OUTH = $75 + +PAGE = $6E +LINE = $6F + +pattern1 = $f000 ; location in memory + + +.zeropage +.globalzp pattern_smc +.globalzp bitmap +.globalzp bitmap2 + + + +random: + + jsr SETGR ; set LORES ; 70 71 72 + + lda #0 ; also OUTL=0/OUTH ; 73 74 + + bit FULLGR ; set FULL 48x40 ; 75 76 77 + +; bit SETTEXT + +main_loop: + sta PAGE ; start at page 1 + + asl ; make OUTH $4 or $8 depending on value in PAGE + ; which we have in A above or at end of loop + asl ; C is 0 + adc #4 + + sta OUTH + + lda #200 + jsr WAIT + + + ;============================ + ; draw an interleaved line +full_loop: + ldx #3 + +line_loop: + ldy #119 + +screen_loop: + + tya ; extrapolate X from Y +; and #$7 ; could be bigger? +; tax + +pattern_smc: + lda pattern1,Y + +inner_loop_smc: + + sta (OUTL),Y + + dey + bpl screen_loop + + ;================================= + ; move to next pattern + +scroll_pattern: + clc + lda pattern_smc+1 + adc #8 + and #$1f + sta pattern_smc+1 + + ; move to next line by adding $80 + ; we save a byte by using EOR instead + + lda OUTL + eor #$80 ; add $80 + sta OUTL + + bne line_loop + + ; we overflowed, so increment OUTH + + inc OUTH + +; lda OUTH ; check if at end +; and #$3 +; bne line_loop + + dex + bpl line_loop + + +done_bg: + + ;======================================= + ; done drawing frame + ;======================================= + + + ;====================== + ; draw bitmap + + ldx #7 +boxloop: + txa + jsr GBASCALC ; calc address of X + ; note we center to middle of screen + ; by noting the middle 8 lines + ; are offset by $28 from first 8 lines + + ; GBASL is in A at this point + + clc + adc #12+$28 + sta GBASL ; center x-coord and y-coord at same time + + + lda PAGE ; want to add 0 or 4 (not 0 or 1) + asl + asl ; this sets C to 0 + adc GBASH + sta GBASH + + + ldy #15 +draw_line_loop: + + lda bitmap2,X ; get low bit of bitmap2 into carry + lsr + + lda #$00 ; black is default color + + ror bitmap,X ; 16-bit rotate (in memory) + ror bitmap2,X + + bcc its_black + + lda #$ff +its_black: + sta (GBASL),Y ; partway down screen + + dey + bpl draw_line_loop + + dex + bpl boxloop + + + ;========================= + ; scroll one line + + ; to scroll up need to add 8? + inc pattern_smc+1 + + + ; switch page + lda PAGE + + tax + ldy PAGE1,X ; flip page + + eor #$1 + + bpl main_loop ; bra + + +;01234567|01234567 +; +; @@@@ @@@@ +; @@ @@ +; @@ @@ +; @@ @@ +; @@@@ @@@@ +; +;@@@@@@@@@@@@@@@@ +bitmap: + .byte $FF ;,$FF + .byte $E1 ;,$87 + .byte $F9 ;,$9F + .byte $F9 ;,$9F + .byte $F9 ;,$9F + .byte $E1 ;,$87 + .byte $FF ;,$FF + .byte $00 ;,$00 + +bitmap2: + .byte $FF + .byte $87 + .byte $9F + .byte $9F + .byte $9F + .byte $87 + .byte $FF + .byte $00 +