From d61b02b2cc30d0999fc49d95ce08fbc79dcb1a60 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Wed, 6 Mar 2019 12:44:31 -0500 Subject: [PATCH] racebeam: add initial code --- racebeam/Makefile | 34 +++++ racebeam/README | 6 + racebeam/delay_a.s | 25 ++++ racebeam/gr_copy.s | 58 +++++++++ racebeam/gr_hline.s | 40 ++++++ racebeam/hello.bas | 2 + racebeam/racebeam.dsk | Bin 0 -> 143360 bytes racebeam/racebeam.s | 279 ++++++++++++++++++++++++++++++++++++++++++ racebeam/random16.s | 119 ++++++++++++++++++ racebeam/vapor_lock.s | 238 +++++++++++++++++++++++++++++++++++ 10 files changed, 801 insertions(+) create mode 100644 racebeam/Makefile create mode 100644 racebeam/README create mode 100644 racebeam/delay_a.s create mode 100644 racebeam/gr_copy.s create mode 100644 racebeam/gr_hline.s create mode 100644 racebeam/hello.bas create mode 100644 racebeam/racebeam.dsk create mode 100644 racebeam/racebeam.s create mode 100644 racebeam/random16.s create mode 100644 racebeam/vapor_lock.s diff --git a/racebeam/Makefile b/racebeam/Makefile new file mode 100644 index 00000000..124e9652 --- /dev/null +++ b/racebeam/Makefile @@ -0,0 +1,34 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +B2D = ../bmp2dhr/b2d +PNG_TO_40x48D = ../gr-utils/png_to_40x48d + +all: racebeam.dsk + +racebeam.dsk: HELLO RACEBEAM + $(DOS33) -y racebeam.dsk SAVE HELLO + $(DOS33) -y racebeam.dsk BSAVE -a 0x1000 RACEBEAM + + + +#### + +RACEBEAM: racebeam.o + ld65 -o RACEBEAM racebeam.o -C ../linker_scripts/apple2_1000.inc + +racebeam.o: racebeam.s + ca65 -o racebeam.o racebeam.s -l racebeam.lst + + +#background_final.inc: background_final.png +# $(PNG_TO_40x48D) asm background_final.png bg_final > background_final.inc + + +#### + +HELLO: hello.bas + ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + +clean: + rm -f *~ *.o *.lst *.inc RACEBEAM HELLO diff --git a/racebeam/README b/racebeam/README new file mode 100644 index 00000000..a5f422d5 --- /dev/null +++ b/racebeam/README @@ -0,0 +1,6 @@ +Apple II Racing the Beam demo + by Vince "Deater" Weaver + vince@deater.net + http://www.deater.net/weave/vmwprod/ + + diff --git a/racebeam/delay_a.s b/racebeam/delay_a.s new file mode 100644 index 00000000..2d0802da --- /dev/null +++ b/racebeam/delay_a.s @@ -0,0 +1,25 @@ +; From http://6502org.wikidot.com/software-delay + +; 25+A cycles (including JSR), 19 bytes (excluding JSR) +; +; The branches must not cross page boundaries! +; + + ; Cycles Accumulator Carry flag + ; 0 1 2 3 4 5 6 (hex) 0 1 2 3 4 5 6 + +; jsr delay_a ; 6 6 6 6 6 6 6 00 01 02 03 04 05 06 + +dly0: sbc #7 +delay_a:cmp #7 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0 + bcs dly0 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0 + lsr ; 2 2 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 + bcs dly1 ; 2 3 2 3 2 3 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 +dly1: beq dly2 ; 3 3 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 + lsr ; 2 2 2 2 2 00 00 01 01 01 1 1 0 0 1 + beq dly3 ; 3 3 2 2 2 00 00 01 01 01 1 1 0 0 1 + bcc dly3 ; 3 3 2 01 01 01 0 0 1 +dly2: bne dly3 ; 2 2 3 00 00 01 0 1 0 +dly3: rts ; 6 6 6 6 6 6 6 00 00 00 00 01 01 01 0 1 1 1 0 0 1 + ; + ; Total cycles: 25 26 27 28 29 30 31 diff --git a/racebeam/gr_copy.s b/racebeam/gr_copy.s new file mode 100644 index 00000000..f03ed362 --- /dev/null +++ b/racebeam/gr_copy.s @@ -0,0 +1,58 @@ + ;========================================================= + ; gr_copy_to_current, 40x48 version + ;========================================================= + ; copy 0xc00 to DRAW_PAGE + ; + ; 45 + 2 + 120*(8*9 + 5) -1 + 6 = 9292 +.align $100 +gr_copy_to_current: + + lda DRAW_PAGE ; 3 + clc ; 2 + adc #$4 ; 2 + sta gr_copy_line+5 ; 4 + sta gr_copy_line+11 ; 4 + adc #$1 ; 2 + sta gr_copy_line+17 ; 4 + sta gr_copy_line+23 ; 4 + adc #$1 ; 2 + sta gr_copy_line+29 ; 4 + sta gr_copy_line+35 ; 4 + adc #$1 ; 2 + sta gr_copy_line+41 ; 4 + sta gr_copy_line+47 ; 4 + ;=========== + ; 45 + + ldy #119 ; for early ones, copy 120 bytes ; 2 + +gr_copy_line: + lda $C00,Y ; load a byte (self modified) ; 4 + sta $400,Y ; store a byte (self modified) ; 5 + + lda $C80,Y ; load a byte (self modified) ; 4 + sta $480,Y ; store a byte (self modified) ; 5 + + lda $D00,Y ; load a byte (self modified) ; 4 + sta $500,Y ; store a byte (self modified) ; 5 + + lda $D80,Y ; load a byte (self modified) ; 4 + sta $580,Y ; store a byte (self modified) ; 5 + + lda $E00,Y ; load a byte (self modified) ; 4 + sta $600,Y ; store a byte (self modified) ; 5 + + lda $E80,Y ; load a byte (self modified) ; 4 + sta $680,Y ; store a byte (self modified) ; 5 + + lda $F00,Y ; load a byte (self modified) ; 4 + sta $700,Y ; store a byte (self modified) ; 5 + + lda $F80,Y ; load a byte (self modified) ; 4 + sta $780,Y ; store a byte (self modified) ; 5 + + dey ; decrement pointer ; 2 + bpl gr_copy_line ; ; 2nt/3 + + rts ; 6 + diff --git a/racebeam/gr_hline.s b/racebeam/gr_hline.s new file mode 100644 index 00000000..9c77b4a4 --- /dev/null +++ b/racebeam/gr_hline.s @@ -0,0 +1,40 @@ + ;================================== + ; HLINE + ;================================== + + ; Color in A + ; Y has which line +hline: + pha ; 3 + ldx gr_offsets,y ; 4+ + stx hline_loop+1 ; 4 + lda gr_offsets+1,y ; 4+ + clc ; 2 + adc DRAW_PAGE ; 3 + sta hline_loop+2 ; 4 + pla ; 4 + ldx #39 ; 2 +hline_loop: + sta $5d0,X ; 38 ; 5 + dex ; 2 + bpl hline_loop ; 2nt/3 + rts ; 6 + + ;========================== + ; Clear gr screen + ;========================== + ; Color in A +clear_gr: + ldy #46 +clear_page_loop: + jsr hline + dey + dey + bpl clear_page_loop + rts + +gr_offsets: + .word $400,$480,$500,$580,$600,$680,$700,$780 + .word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8 + .word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0 + diff --git a/racebeam/hello.bas b/racebeam/hello.bas new file mode 100644 index 00000000..78aea788 --- /dev/null +++ b/racebeam/hello.bas @@ -0,0 +1,2 @@ + 5 HOME + 200 PRINT CHR$ (4)"RACEBEAM" diff --git a/racebeam/racebeam.dsk b/racebeam/racebeam.dsk new file mode 100644 index 0000000000000000000000000000000000000000..b4f8e4b8e8f353624d312a6b342b90f3c6569f29 GIT binary patch literal 143360 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 uQxhJ1@&Q|@93Z+oWp}A;b1~{@?T;e zuV#c~XGaI!Nu~M2%qPn;2Fs3AV@ZOsVT#dY?{Xv>3!G!iISJoIP2EBaGZq)?zp){4 zkr+veBuH8$MY1B9SzIYLODZL1X{FRGtCVGnIdQgxlVnRdX|{}?xK~M@A;%C0jO1uI zcwhG2V~O>_3>Qg(Q^2VUVs)Gd%vt!aHMg5#a(=9({S1Akd30$UZT4;~1p`xI9%*hL z(>{hCh2^!73gS zcfUt3VW_^(wMZh8iew_WNYU4HV5?)qljIA~tHiXz<@U#yE`N9h@xX71X-j|iyIlLK zRdK}9<%Nq1m)yU2@o$O8mlv*FXUD_0~FQ*y`W z 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 literal 0 HcmV?d00001 diff --git a/racebeam/racebeam.s b/racebeam/racebeam.s new file mode 100644 index 00000000..7f86d2e5 --- /dev/null +++ b/racebeam/racebeam.s @@ -0,0 +1,279 @@ +; Race the Beam + +; try for 40x192 15-color graphics on stock Apple II / Apple II+ +; this means, no double-hires + +; by racing the beam we can possibly update at least 10 blocks +; per line to the 192-line resolution + +; we can get 40x96 resolution simply by page flipping + +; this all requires vapor lock cycle-counting + + +; by deater (Vince Weaver) + +; Zero Page +FRAMEBUFFER = $00 ; $00 - $0F +YPOS = $10 +YPOS_SIN = $11 +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +FRAME = $60 +WAITING = $62 +LETTERL = $63 +LETTERH = $64 +LETTERX = $65 +LETTERY = $66 +LETTERD = $67 +LETTER = $68 +BLARGH = $69 +HGR_COLOR = $E4 +STATE = $ED +DRAW_PAGE = $EE +LASTKEY = $F1 +PADDLE_STATUS = $F2 +TEMP = $FA +WHICH = $FB + +; Soft Switches +KEYPRESS= $C000 +KEYRESET= $C010 +SPEAKER = $C030 +SET_GR = $C050 ; Enable graphics +SET_TEXT= $C051 ; Enable text +FULLGR = $C052 ; Full screen, no text +TEXTGR = $C053 ; Split screen +PAGE0 = $C054 ; Page0 +PAGE1 = $C055 ; Page1 +LORES = $C056 ; Enable LORES graphics +HIRES = $C057 ; Enable HIRES graphics + +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +; ROM routines +;HGR = $F3E2 +;HPLOT0 = $F457 +;HGLIN = $F53A +;COLORTBL= $F6F6 +TEXT = $FB36 ;; Set text mode +HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us + + + ;================================== + ;================================== + + +setup_background: + + ;=================== + ; init screen + jsr TEXT + jsr HOME + bit LORES + bit SET_GR + bit FULLGR + bit PAGE0 + bit KEYRESET + + ;=================== + ; init vars + + lda #0 + sta DRAW_PAGE + sta STATE + sta WAITING + + + ;============================= + ; Load graphic page0 + +; lda #$0c +; sta BASH +; lda #$00 +; sta BASL ; load image to $c00 + +; lda #bg_final_low +; sta GBASH +; jsr load_rle_gr + +; lda #4 +; sta DRAW_PAGE + +; jsr gr_copy_to_current ; copy to page1 + + ; GR part +; bit PAGE1 +; bit LORES ; 4 +; bit SET_GR ; 4 +; bit FULLGR ; 4 + +; jsr wait_until_keypressed + + + ;============================= + ; Load graphic page1 + +; lda #$0c +; sta BASH +; lda #$00 +; sta BASL ; load image to $c00 + +; lda #bg_final_high +; sta GBASH +; jsr load_rle_gr + +; lda #0 +; sta DRAW_PAGE + +; jsr gr_copy_to_current + + ; GR part +; bit PAGE0 + +; jsr wait_until_keypressed + + + ;============================== + ; setup graphics for vapor lock + ;============================== + + jsr vapor_lock ; 6 + + ; vapor lock returns with us at beginning of hsync in line + ; 114 (7410 cycles), so with 5070 lines to go + + ; so we have 5070 + 4550 = 9620 to kill + + jsr gr_copy_to_current ; 6+ 9292 + + ; now we have 322 left + + ; GR part + bit LORES ; 4 + bit SET_GR ; 4 + bit FULLGR ; 4 + + ; 322 - 12 = 310 + ; - 3 for jmp + ; 307 + + ; Try X=9 Y=6 cycles=307 + + ldy #6 ; 2 +loopA: + ldx #9 ; 2 +loopB: + dex ; 2 + bne loopB ; 2nt/3 + + dey ; 2 + bne loopA ; 2nt/3 + + jmp display_loop ; 3 +.align $100 + + + ;================================================ + ; Display Loop + ;================================================ + ; each scan line 65 cycles + ; 1 cycle each byte (40cycles) + 25 for horizontal + ; Total of 12480 cycles to draw screen + ; Vertical blank = 4550 cycles (70 scan lines) + ; Total of 17030 cycles to get back to where was + + ; We want to alternate between page1 and page2 every 65 cycles + ; vblank = 4550 cycles to do scrolling + + + ; 2 + 48*( (4+2+25*(2+3)) + (4+2+23*(2+3)+4+5)) + 9) + ; 48*[(6+125)-1] + [(6+115+10)-1] + +display_loop: + + ;=================================== + ; 192 lines, alternate PAGE0/PAGE1 every 2 lines + ;=================================== + + + ldy #96 ; *2=192 lines ; 2 + + ; we set PAGE0 (4) then want to NOP (61) for a total of 65 +bouter_loop: + bit PAGE0 ; 4 + ldx #12 ; 65 cycles with PAGE0 ; 2 +bpage0_loop: ; delay 61+bit + dex ; 2 + bne bpage0_loop ; 2/3 + ;============= + ; 6+(12*5)-1=65 + + ; we set PAGE1 (4) as well as dey (2) and bne (3) then nop (55) + ; + + bit PAGE1 ; 4 + ldx #11 ; 65 cycles with PAGE1 ; 2 +bpage1_loop: + dex ; 2 + bne bpage1_loop ; 2/3 + ;============= + ; 6+(11*5)-1=60 + + dey ; 2 + bne bouter_loop ; 2/3 + ;============== + ; 5 to make 65 + + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + ; 4550 + ; +1 fallthrough + ; -2 for ldy in previous + ; -35 call through jumptable + ; -7 keyboard + ; -3 jmp + ; ======== + ; 4504 + ;======================== + ; each subunit should take 4504 cycles + +firework_state_machine: + +check_keyboard: + + lda KEYPRESS ; 4 + bpl no_keypress ; 3 + jmp restart +no_keypress: + + jmp display_loop ; 3 + + + +restart: + + jmp setup_background + + +.include "gr_hline.s" +;.include "../asm_routines/gr_unrle.s" +;.include "../asm_routines/keypress.s" +.include "gr_copy.s" +;.include "random16.s" +.include "vapor_lock.s" +.include "delay_a.s" + + diff --git a/racebeam/random16.s b/racebeam/random16.s new file mode 100644 index 00000000..4ab4a384 --- /dev/null +++ b/racebeam/random16.s @@ -0,0 +1,119 @@ +; 16-bit 6502 Random Number Generator (cycle-invariant version) + +; Linear feedback shift register PRNG by White Flame +; http://codebase64.org/doku.php?id=base:small_fast_16-bit_prng + +; The Apple II KEYIN routine increments SEEDL:SEEDH +; while waiting for keypress + +SEEDL = $4E +SEEDH = $4F + +XOR_MAGIC = $7657 ; "vW" + + ;============================= + ; random16 + ;============================= + ; takes: + ; not 0, cs = 6(r16)+12(lnz)+5(nop)+ 19(deo) = 42 + ; not 0, cc = 6(r16)+14(lnz)+2(nop)+ 20(neo) = 42 + + ; $0000 = 6(r16)+ 6(loz)+11nops+ 19(deo) = 42 + ; $8000 = 6(r16)+ 6(loz)+ 4(ceo) + 6nops+ 20(neo) = 42 + + ; $XX00 cc = 6(r16)+ 6(loz)+4(ceo)+2(cep) +4nops+ 20(neo) = 42 + ; $XX00 cs = 6(r16)+ 6(loz)+4(ceo)+4(cep) +3nops+ 19(deo) = 42* +random16: + + lda SEEDL ; 3 + beq low_zero ; $0000 and $8000 are special values ; 3 + ;========== + ; 6 +lownz: + ; -1 + asl SEEDL ; Do a normal shift ; 5 + lda SEEDH ; 3 + rol ; 2 + bcs five_cycle_do_eor ; 3 + ;=========== + ; 12 + + bcc two_cycle_no_eor ; 3 + ;========== + ; 12+3-1 = 14 + + +;=================================================================== + +eleven_cycle_do_eor: + nop ; 2 + nop ; 2 + nop ; 2 +five_cycle_do_eor: + nop ; 2 +three_cycle_do_eor: + sta SEEDH ; nop ; 3 + +do_eor: + ; high byte is in A + + eor #>XOR_MAGIC ; 2 + sta SEEDH ; 3 + lda SEEDL ; 3 + eor #