From 9a9cb955d2d2acee82f6366203cef09f520f3e20 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 18 May 2023 16:57:20 -0400 Subject: [PATCH] midline: working? --- vaporlock/demo/Makefile | 17 ++- vaporlock/demo/good.s | 271 ++++++++++++++++++++++++++++++++++++ vaporlock/demo/hardware.inc | 2 + vaporlock/demo/midline.s | 142 ++++++++++++++----- vaporlock/demo/sinetable.s | 30 ++-- vaporlock/demo/zp.inc | 7 +- 6 files changed, 417 insertions(+), 52 deletions(-) create mode 100644 vaporlock/demo/good.s diff --git a/vaporlock/demo/Makefile b/vaporlock/demo/Makefile index da2e1e69..033194da 100644 --- a/vaporlock/demo/Makefile +++ b/vaporlock/demo/Makefile @@ -7,10 +7,11 @@ EMPTYDISK = ../../empty_disk/empty.dsk all: demo.dsk -demo.dsk: HELLO MIDLINE +demo.dsk: HELLO MIDLINE GOOD cp $(EMPTYDISK) demo.dsk $(DOS33) -y demo.dsk SAVE A HELLO $(DOS33) -y demo.dsk BSAVE -a 0x6000 MIDLINE + $(DOS33) -y demo.dsk BSAVE -a 0x6000 GOOD ### @@ -23,10 +24,20 @@ MIDLINE: midline.o ld65 -o MIDLINE midline.o -C $(LINKERSCRIPTS)/apple2_6000.inc midline.o: midline.s \ - zp.inc hardware.inc + zp.inc hardware.inc sinetable.s ca65 -o midline.o midline.s -l midline.lst ### +GOOD: good.o + ld65 -o GOOD good.o -C $(LINKERSCRIPTS)/apple2_6000.inc + +good.o: good.s \ + zp.inc hardware.inc sinetable.s + ca65 -o good.o good.s -l good.lst + + +### + clean: - rm -f *~ *.o *.lst HELLO MIDLINE + rm -f *~ *.o *.lst HELLO MIDLINE GOOD diff --git a/vaporlock/demo/good.s b/vaporlock/demo/good.s new file mode 100644 index 00000000..6ec4fe24 --- /dev/null +++ b/vaporlock/demo/good.s @@ -0,0 +1,271 @@ +; a 256-byte midline demo for Outline 2023 + +; by Vince `deater` Weaver / dSr + +; requires an Apple IIe + +.include "zp.inc" +.include "hardware.inc" + +; 198 bytes -- proof of concept +; 76 bytes -- optimize Apple II Forever printing code +; 183 bytes -- stable window +; 248 bytes -- sine code added +; 274 bytes -- after much frustration, things sorta working +; 261 bytes -- use zp for sine generation +; 257 bytes -- inline sine generation +; 259 bytes -- fix sine generation initialization, shave some message print +; 247 bytes -- start replacing sather delays with something more compact +; 229 bytes -- finish replacing sather delays +; 228 bytes -- optimize and center the middle area +; 226 bytes -- init some of zero page to zero +; 244 bytes -- switch to hires too +; 247 bytes -- clear HGR + +sine = $c00 ; location of sine table + + +midline: + + ;================================ + ; Clear screen and setup graphics + ;================================ + + ; init $F1-$FF to zero + + lda #0 + ldx #15 +init_loop: + sta $F0,X + dex + bne init_loop + + ; setup graphics + + sta SETMOUSETEXT ; enable mouse text for Apple char + + .include "sinetable.s" ; Y is FF after this + ; A = 1, X = $40 + + ;==================================================== + ; setup text page1 screen of "Apple II Forever" text + ;==================================================== + + ; X is $40 which is probably OK + ; ldx #0 +restart: + tay ; reset Y to 0 (or 1 first time through) + inx + beq print_done +print_loop: + lda a2_string,Y + beq restart + jsr COUT ; output char in A to stdout + iny + bne print_loop +print_done: + + + jsr HGR ; A and Y=0 now + sta FULLGR + + + ;================================== + ; get exact vblank region + ;================================== + ; code by Sather + ; "Understanding the Apple IIe" + +poll1: + lda VBLANK ; Find end of VBL + bmi poll1 ; Fall through at VBL +poll2: + lda VBLANK + bpl poll2 ; Fall through at VBL' ; 2 + + lda $00 ;nop3 ; Now slew back in 17029 cycle loops ; 3 +lp17029: + ; delay 17020 + + lda #7 ; 2 + ldy #96 ; 2 + jsr size_delay ; 17012 + nop ; 2 + nop ; 2 + + lda VBLANK ; Back to VBL yet? ; 4 + nop ; ; 2 + bmi lp17029 ; no, slew back ; 2/3 + + + + ;============================== + ; do the cycle counting + ;============================== + +cycle_start: + + ;============================== + ; top + +; 2 + +top_smc: + ldx #66 ; 2 + bne top7 ; bra ; 3/2 + +top_loop: + pha ; 3 + pla ; 4 +top7: +; 7 + lda #0 ; 2 + ldy #3 ; 2 +; 11 + ; want to delay 49 + + jsr size_delay ; 47 +; 58 + nop ; 2 +; 60 + dex ; 2 + bne top_loop ; 3/2 + + ;=================================== + + ; middle + ; -1 + ldx #56 ; 2 + bne middle_4 ; bra ; 3 + + +middle_loop: + nop ; 2 + nop ; 2 +middle_4: +; 4 + nop ; 2 + lda $0 ; nop3 ; 3 +; 9 + jsr delay_16_setgr ; 16 +; 25 + jsr delay_16_settext ; 16 +; 41 + jsr delay_16_setgr ; 16 +; 57 + lda $0 ; nop3 ; 3 +; 60 + dex ; 2 + bne middle_loop ; 3/2 + + ; -1 +bottom_smc: + ldx #118 ; 2 + bne bottom_4 ; bra ; 3 + +bottom_loop: + + nop ; 2 + nop ; 2 +; 4 +bottom_4: +; 4 + lda #0 ; 2 + ldy #3 ; 2 +; 8 + ; want to delay 50 + + jsr size_delay ; 47 +; 55 + lda $0 ; nop3 ; 3 +; 58 + inx ; 2 + cpx #192 ; 2 + bcc bottom_loop ; 3/2 + +; -1 + + ;====================================== + ; wait 4550 for VBLANK + ;====================================== + ; -1 from before +vblank_start: + + ; move window + + ; -1 + clc ; 2 + lda FRAME ; 3 + adc #1 ; 2 + sta FRAME ; 3 + tay ; save for later ; 2 +; 11 + lda #0 ; 2 + rol ; get carry bit in A ; 2 + eor screen_smc+1 ; 4 + sta screen_smc+1 ; 4 +; 23 + +screen_smc: + bit LORES ; LORES=C056 HIRES=C057 ; 4 +; 27 + + + ; FRAME should be in Y + lda sine,Y ; 4 (aligned) +; 31 + clc ; 2 + adc #2 ; 2 + sta top_smc+1 ; 4 + adc #56 ; 2 + sta bottom_smc+1 ; 4 +; 45 + + ; finish delay + +; 45 + lda #1 ; 2 + ldy #241 ; 2 +; 49 + jsr size_delay ; 4493 +; 4542 + + pha ; 3 + pla ; 4 +; 4549 + jmp cycle_start ; 3 +; 4552 + + +; want 4552 here + +delay_16_setgr: + bit SET_GR + rts + +delay_16_settext: + bit SET_TEXT + rts + + ;===================================== + ; short delay by Bruce Clark + ; any delay between 8 to 589832 with res of 9 + ;===================================== + ; 9*(256*A+Y)+8 + 12 for jsr/rts +size_delay: + +delay_loop: + cpy #1 + dey + sbc #0 + bcs delay_loop +delay_12: + rts + +a2_string: + ; 012345678901234567 8 9 +; .byte "Apple II Forever!! ",'@'+$80," ",0 + .byte 'A'+$80,'p'+$80,'p'+$80,'l'+$80,'e'+$80,' '+$80 + .byte 'I'+$80,'I'+$80,' '+$80,'F'+$80,'o'+$80,'r'+$80 + .byte 'e'+$80,'v'+$80,'e'+$80,'r'+$80,'!'+$80,'!'+$80 + .byte ' '+$80,'@'+$00,' '+$80,0 diff --git a/vaporlock/demo/hardware.inc b/vaporlock/demo/hardware.inc index b6bfac2d..94ff226c 100644 --- a/vaporlock/demo/hardware.inc +++ b/vaporlock/demo/hardware.inc @@ -46,8 +46,10 @@ HGR = $F3E2 HPOSN = $F411 HPLOT0 = $F457 ; plot at (Y,X), (A) HGLIN = $F53A ; line to (X,A),(Y) +XDRAW0 = $F65D ROM_TEXT2COPY = $F962 ; iigs ROM_MACHINEID = $FBB3 ; iigs COUT = $FDED + diff --git a/vaporlock/demo/midline.s b/vaporlock/demo/midline.s index e15cbb74..375e5df3 100644 --- a/vaporlock/demo/midline.s +++ b/vaporlock/demo/midline.s @@ -18,6 +18,16 @@ ; 247 bytes -- start replacing sather delays with something more compact ; 229 bytes -- finish replacing sather delays ; 228 bytes -- optimize and center the middle area +; 226 bytes -- init some of zero page to zero +; 244 bytes -- switch to hires too +; 247 bytes -- clear HGR +; 264 bytes -- add HGR +; 263 bytes -- better nop +; 263 bytes -- don't init zero page anymore +; 259 bytes -- combine delay_49 routines +; 258 bytes -- init discrete + +; GOAL = 256 (Outline 2023 says header doesn't count, is usually 4 on Apple II) sine = $c00 ; location of sine table @@ -28,13 +38,20 @@ midline: ; Clear screen and setup graphics ;================================ - sta FULLGR + ldx #0 + stx DELTA + stx DELTAH + + ; setup graphics + sta SETMOUSETEXT ; enable mouse text for Apple char + ;============================== + ; set up sine table + + ; X must be 0 when calling .include "sinetable.s" ; Y is FF after this ; A = 1, X = $40 - iny ; needed? - sty FRAME ;==================================================== ; setup text page1 screen of "Apple II Forever" text @@ -54,6 +71,33 @@ print_loop: bne print_loop print_done: + ;=================== + ; do graphics + + + jsr HGR ; A and Y=0 now + sta FULLGR + + + jsr HPLOT0 ; set screen position to X= (y,x) Y=(a) + ; saves X,Y,A to zero page + ; after Y= orig X/7 + ; A and X are ?? +tiny_loop: + + lda #$F6 ; ROT=$F6 + tay + tax + dex + + jsr XDRAW0 ; XDRAW 1 AT X,Y + ; Both A and X are 0 at exit + ; Z flag set on exit + ; Y varies + + dec $0a ; is $4c due to basic + bne tiny_loop ; + ;================================== @@ -105,12 +149,13 @@ top_loop: pla ; 4 top7: ; 7 - lda #0 ; 2 - ldy #3 ; 2 +; lda #0 ; 2 +; ldy #3 ; 2 ; 11 ; want to delay 49 + jsr delay_49 - jsr size_delay ; 47 +; jsr size_delay ; 47 ; 58 nop ; 2 ; 60 @@ -129,26 +174,20 @@ middle_loop: nop ; 2 nop ; 2 middle_4: - nop ; 2 -; nop ; 2 - lda $0 -; 8 +; 4 + inc $0 ; nop5 ; 5 +; 9 jsr delay_16_setgr ; 16 -; 24 +; 25 jsr delay_16_settext ; 16 -; 40 +; 41 jsr delay_16_setgr ; 16 -; 56 - lda $0 -; nop ; 2 -; nop ; 2 +; 57 + lda $0 ; nop3 ; 3 ; 60 dex ; 2 bne middle_loop ; 3/2 - - - ; -1 bottom_smc: ldx #118 ; 2 @@ -161,12 +200,12 @@ bottom_loop: ; 4 bottom_4: ; 4 - lda #0 ; 2 - ldy #3 ; 2 +; lda #0 ; 2 +; ldy #3 ; 2 ; 8 ; want to delay 50 - - jsr size_delay ; 47 + jsr delay_49 +; jsr size_delay ; 47 ; 55 lda $0 ; nop3 ; 3 ; 58 @@ -184,44 +223,73 @@ vblank_start: ; move window - ; -1 - inc FRAME ; 5 -; 4 - ldy FRAME ; 3 - lda sine,Y ; 4 (aligned) + ; -1 + clc ; 2 + lda FRAME ; 3 + adc #1 ; 2 + sta FRAME ; 3 + tay ; save for later ; 2 ; 11 + lda #0 ; 2 + rol ; get carry bit in A ; 2 + eor screen_smc+1 ; 4 + sta screen_smc+1 ; 4 +; 23 + +screen_smc: + bit LORES ; LORES=C056 HIRES=C057 ; 4 +; 27 + + + ; FRAME should be in Y + lda sine,Y ; 4 (aligned) +; 31 clc ; 2 adc #2 ; 2 sta top_smc+1 ; 4 adc #56 ; 2 sta bottom_smc+1 ; 4 +; 45 ; finish delay -; 25 +; 45 lda #1 ; 2 - ldy #244 ; 2 -; 29 - jsr size_delay ; 4520 + ldy #241 ; 2 +; 49 + jsr size_delay ; 4493 +; 4542 + + pha ; 3 + pla ; 4 ; 4549 + jmp cycle_start ; 3 +; 4552 - jmp cycle_start -; +2 +; want 4552 here + + +delay_16_settext: + bit SET_TEXT + rts delay_16_setgr: bit SET_GR rts -delay_16_settext: - bit SET_TEXT - rts + +delay_49: + lda #0 ; 2 + ldy #3 ; 2 ;===================================== ; short delay by Bruce Clark ; any delay between 8 to 589832 with res of 9 ;===================================== ; 9*(256*A+Y)+8 + 12 for jsr/rts + ; A and Y both $FF at the end + size_delay: delay_loop: diff --git a/vaporlock/demo/sinetable.s b/vaporlock/demo/sinetable.s index 6fee677d..7a248635 100644 --- a/vaporlock/demo/sinetable.s +++ b/vaporlock/demo/sinetable.s @@ -1,30 +1,38 @@ ;================================= ; fakes sines based on parabolas - ; based on code by White Flame from codebase64 + ; based on code by White Flame via Cruzer/Camelot + ; from codebase64 ;================================= ; makes 256 entries, min 0 max 127 + ; call with X=0! + +;DELTA = $2000 +;VALUE = $2002 initSineTable: ldy #$3f - ldx #$00 +; ldx #$00 ; Accumulate the delta (16-bit addition) init_sine_loop: - lda VALUE + +value_l_smc: + lda #0 clc adc DELTA - sta VALUE - lda VALUE+1 + sta value_l_smc+1 +value_h_smc: + lda #0 adc DELTA+1 - sta VALUE+1 + sta value_h_smc+1 ; Reflect the value around for a sine wave - sta sine+$c0,x - sta sine+$80,y + sta sine+$c0,X + sta sine+$80,Y eor #$7f - sta sine+$40,x - sta sine+$00,y + sta sine+$40,X + sta sine+$00,Y ; Increase the delta, which creates the ; "acceleration" for a parabola @@ -41,6 +49,6 @@ init_sine_noflo: dey bpl init_sine_loop - rts +; rts diff --git a/vaporlock/demo/zp.inc b/vaporlock/demo/zp.inc index 0e01dce9..ff4aa833 100644 --- a/vaporlock/demo/zp.inc +++ b/vaporlock/demo/zp.inc @@ -67,7 +67,7 @@ SOUND_STATUS = $DE - +HGR_COLLISIONS = $EA HGRPAGE = $E6 @@ -77,6 +77,11 @@ XX = $F1 FRAME = $F2 FRAMEH = $F3 +;VALUE = $F4 +;VALUEH = $F5 +DELTA = $F6 +DELTAH = $F7 + YPOS = $FA TCOLOR = $FB