From 4c77a7713fb4f861e3b5ca3787d0ddb18baa9b6b Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sun, 30 Dec 2018 00:17:38 -0500 Subject: [PATCH] fire: initial checkin --- fire/Makefile | 34 +++ fire/delay_a.s | 25 ++ fire/fire.dsk | Bin 0 -> 143360 bytes fire/fire.s | 128 ++++++++ fire/gr_copy.s | 58 ++++ fire/gr_hline.s | 40 +++ fire/gr_unrolled_copy.s | 648 ++++++++++++++++++++++++++++++++++++++++ fire/hello.bas | 4 + fire/vapor_lock.s | 238 +++++++++++++++ 9 files changed, 1175 insertions(+) create mode 100644 fire/Makefile create mode 100644 fire/delay_a.s create mode 100644 fire/fire.dsk create mode 100644 fire/fire.s create mode 100644 fire/gr_copy.s create mode 100644 fire/gr_hline.s create mode 100644 fire/gr_unrolled_copy.s create mode 100644 fire/hello.bas create mode 100644 fire/vapor_lock.s diff --git a/fire/Makefile b/fire/Makefile new file mode 100644 index 00000000..e145876b --- /dev/null +++ b/fire/Makefile @@ -0,0 +1,34 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +PNG_TO_RLE = ../gr-utils/png2rle + + +all: fire.dsk + +fire.dsk: FIRE HELLO + $(DOS33) -y fire.dsk SAVE A HELLO + $(DOS33) -y fire.dsk BSAVE -a 0x1000 FIRE + +#### + +FIRE: fire.o + ld65 -o FIRE fire.o -C ../linker_scripts/apple2_1000.inc + +fire.o: fire.s gr_copy.s gr_unrolled_copy.s vapor_lock.s \ + delay_a.s + ca65 -o fire.o fire.s -l fire.lst + + +#### + +HELLO: hello.bas + ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + + +##### + +clean: + rm -f *~ *.o *.lst FIRE HELLO + + diff --git a/fire/delay_a.s b/fire/delay_a.s new file mode 100644 index 00000000..2d0802da --- /dev/null +++ b/fire/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/fire/fire.dsk b/fire/fire.dsk new file mode 100644 index 0000000000000000000000000000000000000000..524cee5ddace2655225bf00215506e9c43aad612 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/fire/fire.s b/fire/fire.s new file mode 100644 index 00000000..70c229b7 --- /dev/null +++ b/fire/fire.s @@ -0,0 +1,128 @@ +; Lo-res fire animation + +; by deater (Vince Weaver) + +; based on code described here http://fabiensanglard.net/doom_fire_psx/ + +; Zero Page +FRAMEBUFFER = $00 ; $00 - $0F +YPOS = $10 +YPOS_SIN = $11 +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +MASK = $2E +COLOR = $30 +FRAME = $60 +MB_VALUE = $91 +BIRD_STATE = $E0 +BIRD_DIR = $E1 +DRAW_PAGE = $EE +LASTKEY = $F1 +PADDLE_STATUS = $F2 +XPOS = $F3 +OLD_XPOS = $F4 +TEMP = $FA +TEMPY = $FB +INL = $FC +INH = $FD +OUTL = $FE +OUTH = $FF + +; Soft Switches +KEYPRESS= $C000 +KEYRESET= $C010 +SET_GR = $C050 ; Enable graphics +FULLGR = $C052 ; Full screen, no text +PAGE0 = $C054 ; Page0 +PAGE1 = $C055 ; Page1 +LORES = $C056 ; Enable LORES graphics +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +; ROM routines + +TEXT = $FB36 ;; Set text mode +HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us + + +fire_demo: + + ;=================== + ; init screen + jsr TEXT + jsr HOME + bit PAGE0 + + ;=================== + ; init vars + lda #0 + + ;============================== + ; 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 + +; 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 +;wfloopA:ldx #9 ; 2 +;wfloopB:dex ; 2 +; bne wfloopB ; 2nt/3 +; dey ; 2 +; bne wfloopA ; 2nt/3 + + +fire_loop: + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + ; do_nothing should be 4550 + ; ============= + ; 15 cycles + + + ;==================== + ; Handle keypresses + ; if no keypress, 9 + ; if keypress, 6+43 = 49 + + lda KEYPRESS ; 4 + bmi keypress + ; 2 +no_keypress: + jmp fire_loop + +keypress: + jmp keypress + + +.include "gr_hline.s" +;.include "../asm_routines/keypress.s" +.include "gr_copy.s" +.include "gr_unrolled_copy.s" +.include "vapor_lock.s" +.include "delay_a.s" + diff --git a/fire/gr_copy.s b/fire/gr_copy.s new file mode 100644 index 00000000..acd83f6f --- /dev/null +++ b/fire/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 + +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/fire/gr_hline.s b/fire/gr_hline.s new file mode 100644 index 00000000..9c77b4a4 --- /dev/null +++ b/fire/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/fire/gr_unrolled_copy.s b/fire/gr_unrolled_copy.s new file mode 100644 index 00000000..4c89fc95 --- /dev/null +++ b/fire/gr_unrolled_copy.s @@ -0,0 +1,648 @@ + ;========================================================= + ; fast copy rows 22-36 from $C00 to $400 + ;========================================================= + ; + ; 6 + 7*8*40 = 2246 cycles + ; 6*7*40 = 1680 bytes of code? + +gr_copy_row22: + +;= y = 22 $5a8 $da8/$9a8 ========================= + ; x=0,y=22 + lda $da8 + sta $5a8 + lda $da9 + sta $5a9 + lda $daa + sta $5aa + lda $dab + sta $5ab + lda $dac + sta $5ac + lda $dad + sta $5ad + lda $dae + sta $5ae + lda $daf + sta $5af + + ; x=8,y=22 + lda $db0 + sta $5b0 + lda $db1 + sta $5b1 + lda $db2 + sta $5b2 + lda $db3 + sta $5b3 + lda $db4 + sta $5b4 + lda $db5 + sta $5b5 + lda $db6 + sta $5b6 + lda $db7 + sta $5b7 + + ; x=16,y=22 + lda $db8 + sta $5b8 + lda $db9 + sta $5b9 + lda $dba + sta $5ba + lda $dbb + sta $5bb + lda $dbc + sta $5bc + lda $dbd + sta $5bd + lda $dbe + sta $5be + lda $dbf + sta $5bf + + ; x=24,y=22 + lda $dc0 + sta $5c0 + lda $dc1 + sta $5c1 + lda $dc2 + sta $5c2 + lda $dc3 + sta $5c3 + lda $dc4 + sta $5c4 + lda $dc5 + sta $5c5 + lda $dc6 + sta $5c6 + lda $dc7 + sta $5c7 + + ; x=32,y=22 + lda $dc8 + sta $5c8 + lda $dc9 + sta $5c9 + lda $dca + sta $5ca + lda $dcb + sta $5cb + lda $dcc + sta $5cc + lda $dcd + sta $5cd + lda $dce + sta $5ce + lda $dcf + sta $5cf + +;= y = 24 $628 $e28/$a28 ========================= + ; x=0,y=24 + lda $e28 + sta $628 + lda $e29 + sta $629 + lda $e2a + sta $62a + lda $e2b + sta $62b + lda $e2c + sta $62c + lda $e2d + sta $62d + lda $e2e + sta $62e + lda $e2f + sta $62f + + ; x=8,y=24 + lda $e30 + sta $630 + lda $e31 + sta $631 + lda $e32 + sta $632 + lda $e33 + sta $633 + lda $e34 + sta $634 + lda $e35 + sta $635 + lda $e36 + sta $636 + lda $e37 + sta $637 + + ; x=16,y=24 + lda $e38 + sta $638 + lda $e39 + sta $639 + lda $e3a + sta $63a + lda $e3b + sta $63b + lda $e3c + sta $63c + lda $e3d + sta $63d + lda $e3e + sta $63e + lda $e3f + sta $63f + + ; x=24,y=24 + lda $e40 + sta $640 + lda $e41 + sta $641 + lda $e42 + sta $642 + lda $e43 + sta $643 + lda $e44 + sta $644 + lda $e45 + sta $645 + lda $e46 + sta $646 + lda $e47 + sta $647 + + ; x=32,y=24 + lda $e48 + sta $648 + lda $e49 + sta $649 + lda $e4a + sta $64a + lda $e4b + sta $64b + lda $e4c + sta $64c + lda $e4d + sta $64d + lda $e4e + sta $64e + lda $e4f + sta $64f + +;= y = 26 $6a8 $ea8/$aa8 ========================= + ; x=0,y=26 + lda $ea8 + sta $6a8 + lda $ea9 + sta $6a9 + lda $eaa + sta $6aa + lda $eab + sta $6ab + lda $eac + sta $6ac + lda $ead + sta $6ad + lda $eae + sta $6ae + lda $eaf + sta $6af + + ; x=8,y=26 + lda $eb0 + sta $6b0 + lda $eb1 + sta $6b1 + lda $eb2 + sta $6b2 + lda $eb3 + sta $6b3 + lda $eb4 + sta $6b4 + lda $eb5 + sta $6b5 + lda $eb6 + sta $6b6 + lda $eb7 + sta $6b7 + + ; x=16,y=26 + lda $eb8 + sta $6b8 + lda $eb9 + sta $6b9 + lda $eba + sta $6ba + lda $ebb + sta $6bb + lda $ebc + sta $6bc + lda $ebd + sta $6bd + lda $ebe + sta $6be + lda $ebf + sta $6bf + + ; x=24,y=26 + lda $ec0 + sta $6c0 + lda $ec1 + sta $6c1 + lda $ec2 + sta $6c2 + lda $ec3 + sta $6c3 + lda $ec4 + sta $6c4 + lda $ec5 + sta $6c5 + lda $ec6 + sta $6c6 + lda $ec7 + sta $6c7 + + ; x=32,y=26 + lda $ec8 + sta $6c8 + lda $ec9 + sta $6c9 + lda $eca + sta $6ca + lda $ecb + sta $6cb + lda $ecc + sta $6cc + lda $ecd + sta $6cd + lda $ece + sta $6ce + lda $ecf + sta $6cf + +;= y = 28 $728 $f28/$b28 ========================= + ; x=0,y=28 + lda $f28 + sta $728 + lda $f29 + sta $729 + lda $f2a + sta $72a + lda $f2b + sta $72b + lda $f2c + sta $72c + lda $f2d + sta $72d + lda $f2e + sta $72e + lda $f2f + sta $72f + + ; x=8,y=28 + lda $f30 + sta $730 + lda $f31 + sta $731 + lda $f32 + sta $732 + lda $f33 + sta $733 + lda $f34 + sta $734 + lda $f35 + sta $735 + lda $f36 + sta $736 + lda $f37 + sta $737 + + ; x=16,y=28 + lda $f38 + sta $738 + lda $f39 + sta $739 + lda $f3a + sta $73a + lda $f3b + sta $73b + lda $f3c + sta $73c + lda $f3d + sta $73d + lda $f3e + sta $73e + lda $f3f + sta $73f + + ; x=24,y=28 + lda $f40 + sta $740 + lda $f41 + sta $741 + lda $f42 + sta $742 + lda $f43 + sta $743 + lda $f44 + sta $744 + lda $f45 + sta $745 + lda $f46 + sta $746 + lda $f47 + sta $747 + + ; x=32,y=28 + lda $f48 + sta $748 + lda $f49 + sta $749 + lda $f4a + sta $74a + lda $f4b + sta $74b + lda $f4c + sta $74c + lda $f4d + sta $74d + lda $f4e + sta $74e + lda $f4f + sta $74f + +;= y = 30 $7a8 $fa8/$ba8 ========================= + ; x=0,y=30 + lda $fa8 + sta $7a8 + lda $fa9 + sta $7a9 + lda $faa + sta $7aa + lda $fab + sta $7ab + lda $fac + sta $7ac + lda $fad + sta $7ad + lda $fae + sta $7ae + lda $faf + sta $7af + + ; x=8,y=30 + lda $fb0 + sta $7b0 + lda $fb1 + sta $7b1 + lda $fb2 + sta $7b2 + lda $fb3 + sta $7b3 + lda $fb4 + sta $7b4 + lda $fb5 + sta $7b5 + lda $fb6 + sta $7b6 + lda $fb7 + sta $7b7 + + ; x=16,y=30 + lda $fb8 + sta $7b8 + lda $fb9 + sta $7b9 + lda $fba + sta $7ba + lda $fbb + sta $7bb + lda $fbc + sta $7bc + lda $fbd + sta $7bd + lda $fbe + sta $7be + lda $fbf + sta $7bf + + ; x=24,y=30 + lda $fc0 + sta $7c0 + lda $fc1 + sta $7c1 + lda $fc2 + sta $7c2 + lda $fc3 + sta $7c3 + lda $fc4 + sta $7c4 + lda $fc5 + sta $7c5 + lda $fc6 + sta $7c6 + lda $fc7 + sta $7c7 + + ; x=32,y=30 + lda $fc8 + sta $7c8 + lda $fc9 + sta $7c9 + lda $fca + sta $7ca + lda $fcb + sta $7cb + lda $fcc + sta $7cc + lda $fcd + sta $7cd + lda $fce + sta $7ce + lda $fcf + sta $7cf + +;= y = 32 $450 $c50/$850 ========================= + ; x=0,y=32 + lda $c50 + sta $450 + lda $c51 + sta $451 + lda $c52 + sta $452 + lda $c53 + sta $453 + lda $c54 + sta $454 + lda $c55 + sta $455 + lda $c56 + sta $456 + lda $c57 + sta $457 + + ; x=8,y=32 + lda $c58 + sta $458 + lda $c59 + sta $459 + lda $c5a + sta $45a + lda $c5b + sta $45b + lda $c5c + sta $45c + lda $c5d + sta $45d + lda $c5e + sta $45e + lda $c5f + sta $45f + + ; x=16,y=32 + lda $c60 + sta $460 + lda $c61 + sta $461 + lda $c62 + sta $462 + lda $c63 + sta $463 + lda $c64 + sta $464 + lda $c65 + sta $465 + lda $c66 + sta $466 + lda $c67 + sta $467 + + ; x=24,y=32 + lda $c68 + sta $468 + lda $c69 + sta $469 + lda $c6a + sta $46a + lda $c6b + sta $46b + lda $c6c + sta $46c + lda $c6d + sta $46d + lda $c6e + sta $46e + lda $c6f + sta $46f + + ; x=32,y=32 + lda $c70 + sta $470 + lda $c71 + sta $471 + lda $c72 + sta $472 + lda $c73 + sta $473 + lda $c74 + sta $474 + lda $c75 + sta $475 + lda $c76 + sta $476 + lda $c77 + sta $477 + +;= y = 34 $4d0 $cd0/$8d0 ========================= + ; x=0,y=34 + lda $cd0 + sta $4d0 + lda $cd1 + sta $4d1 + lda $cd2 + sta $4d2 + lda $cd3 + sta $4d3 + lda $cd4 + sta $4d4 + lda $cd5 + sta $4d5 + lda $cd6 + sta $4d6 + lda $cd7 + sta $4d7 + + ; x=8,y=34 + lda $cd8 + sta $4d8 + lda $cd9 + sta $4d9 + lda $cda + sta $4da + lda $cdb + sta $4db + lda $cdc + sta $4dc + lda $cdd + sta $4dd + lda $cde + sta $4de + lda $cdf + sta $4df + + ; x=16,y=34 + lda $ce0 + sta $4e0 + lda $ce1 + sta $4e1 + lda $ce2 + sta $4e2 + lda $ce3 + sta $4e3 + lda $ce4 + sta $4e4 + lda $ce5 + sta $4e5 + lda $ce6 + sta $4e6 + lda $ce7 + sta $4e7 + + ; x=24,y=34 + lda $ce8 + sta $4e8 + lda $ce9 + sta $4e9 + lda $cea + sta $4ea + lda $ceb + sta $4eb + lda $cec + sta $4ec + lda $ced + sta $4ed + lda $cee + sta $4ee + lda $cef + sta $4ef + + ; x=32,y=34 + lda $cf0 + sta $4f0 + lda $cf1 + sta $4f1 + lda $cf2 + sta $4f2 + lda $cf3 + sta $4f3 + lda $cf4 + sta $4f4 + lda $cf5 + sta $4f5 + lda $cf6 + sta $4f6 + lda $cf7 + sta $4f7 + + rts ; 6 + diff --git a/fire/hello.bas b/fire/hello.bas new file mode 100644 index 00000000..77c3fc3d --- /dev/null +++ b/fire/hello.bas @@ -0,0 +1,4 @@ + 5 HOME + 10 PRINT "FIRE DEMO V1.0" + 40 PRINT:PRINT + 105 PRINT CHR$ (4)"BRUN FIRE" diff --git a/fire/vapor_lock.s b/fire/vapor_lock.s new file mode 100644 index 00000000..dfaf8247 --- /dev/null +++ b/fire/vapor_lock.s @@ -0,0 +1,238 @@ +; This took a while to track down +; On Apple II/II+ the horiz blanking addr are $1000 higher than on IIe +; So on II+ were outside video area, so unlikely to be our set value +; (unless I foolishly use $ff which some uninitialized mem is set to) +; Lots of this color fiddling is to make sure you don't accidentally +; get runs of colors on IIe due to the horiz blank + +; 0-5 aqua 6-12 = grey, 13 - 20 = yellow, 21-23 = aqua rainbow 14 +; +; +;16 0 YA +;17 1 YA +;18 2 YA +;19 3 YA +;20 4 YA +;21 5 AA +;22 6 AG +;23 7 AG +;0 8 AG +;1 9 AG +;2 10 AG +;3 11 AG +;4 12 AG +;5 13 AY **** +;6 14 GY RAINBOW +;7 15 GY +;8 16 GY +;9 17 GY +;10 18 GY +;11 19 GY +;12 20 GY +;13 21 YA +;14 22 YA +;15 23 YA + + + + ;============================== + ; setup graphics for vapor lock + ;============================== +vapor_lock: + + ; Clear Page0 + lda #$0 + sta DRAW_PAGE + lda #$ee ; full screen white $ff + jsr clear_gr + + lda #$dd + ldy #40 + jsr clear_page_loop ; make bottom half yellow $dd + + lda #$aa + ldy #24 + jsr clear_page_loop ; make middle grey2 $aa + + lda #$ee + ldy #10 + jsr clear_page_loop ; make top half aqua $ee + + ; set up a rainbow to aid in exact lock + + ldy #00 +rainbow_loop: + tya + sta $728+20,Y + iny + cpy #20 + bne rainbow_loop + +;btt: +; jmp btt + + + ;===================================================== + ; attempt vapor lock + ; by reading the "floating bus" we can see most recently + ; written value of the display + ;===================================================== + ; See: + ; Have an Apple Split by Bob Bishop + ; Softalk, October 1982 + + ; Challenges: each scan line scans 40 bytes. + ; The blanking happens at the *beginning* + ; So 65 bytes are scanned, starting at adress of the line - 25 + + ; the scan takes 8 cycles, look for 4 repeats of the value + ; to avoid false positive found if the horiz blanking is mirroring + ; the line (max 3 repeats in that case) + +vapor_lock_loop: + + ; first make sure we have a full line of $aa + + lda #$aa ; 2 +zxloop: + ldx #$04 ; 2 +wiloop: + cmp $C051 ; read the floating bus ; 4 + bne zxloop ; if not, start from scratch ; 2/3 + dex ; we were, dec ; 2 + bne wiloop ; if not 4 of them, restart ; 3/2 + + ; if we get here we read 4 proper pixels, 11 apart (2+4+2+2+3) + ; 0 11 22 33, clock at 34 + ; 1 12 23 34, clock at 35 + ; 2 13 24 35, clock at 36 + ; 3 14 25 36, clock at 37 + ; 4 15 26 37, clock at 38 + ; 5 16 27 38, clock at 39 + ; 6 17 28 39, clock at 40 + + +; X X X X +; X X X X +; X X X X +; X X X X +; X X X X +; X X X X +; X X X X +; 0123456789012345678901234 0123456789012345678901234567890123456789 +; 1 2 1 2 3 +; hsync pixels +; XXXXXXXXXXXXXXXXXXXXXXXXX 4444444444444444444444444444440123456789 + + ; now look for the color change that + ; happens at line 13*8 = 104 + + lda #$dd ; 2 +zloop: + ldx #$04 ; 2 +qloop: + cmp $C051 ; read floating bus ; 4 + bne zloop ; 2/3 + dex ; 2 + bne qloop ; 3/2 + ;============ + ; 11 + + ; Found it! + ; if we get here we read 4 proper pixels, 11 apart (2+4+2+2+3) + ; 0 11 22 33, clock at 34 + ; 1 12 23 34, clock at 35 + ; 2 13 24 35, clock at 36 + ; 3 14 25 36, clock at 37 + ; 4 15 26 37, clock at 38 + ; 5 16 27 38, clock at 39 + ; 6 17 28 39, clock at 40 + + + + +;btt: +; jmp btt + + ; In theory near end of line 104 + + ; now skip ahead 8 lines and read from the rainbow pattern we set + ; up to find our exact location + + ; delay 65 * 8 = 520 + ; we back off a few to make sure we're not in the horiz blank + ; try to delay 510 + + ; *NOTE* sometimes we end up going one (or rarely, two??) lines too far + ; so instead try going 7 lines ahead, and if still dd then one more + + ; so single step until we get a rainbow color + + ; go to next line, -10 + lda #28 ; 2 + jsr delay_a ; delay 25+28 = 53 + ; total delay = 55 + +vl_try_again: + lda #29 ; 2 + jsr delay_a ; delay 25+29 = 54 + ; total delay = 56 + + + + lda $C051 ; 4 + cmp #$dd ; 2 + beq vl_try_again ; 3 + ; -1 + + + ; now near end of line 112 + ;lda $0 ; nop to match old code ; 3 +; nop ; nop to match old code ; 2 + + lda $C051 ; 4 +;kbb: +; jmp kbb + + ; we are in theory on line $728 = 14*8 = 112 + ; so 112*65 = 7280 cycles from start + + ; we are actualy 25+20+A pixels in + ; 7325+A + + ; Our goal is line 114 at 7410 cycles + ; 7410 - 7325 = 85 + + ; so kill 85-A cycles + ; -6 to do subtraction + ; -6 for rts + ; -25 for delay_a overhead + + eor #$ff ; 2 + sec ; 2 + adc #48 ; 2 + + jsr delay_a ; should total 48 cycles + + +done_vapor_lock: + rts ; 6 + + + + + ; Some random related work + ; Docs: + ; Lancaster + ; Bishop + ; Sather + + ; Vaguely relevant but no help with the Apple II+ issue + ; + ; Eamon: Screen display and timing synchronization + ; on the Apple IIe and Apple IIgs + ; + ; Adams: Visually presented verbal stimuli by assembly + ; language on the Apple II computer. + ; Cavanagh and Anstis: Visual psychophysics on the + ; Apple II: Getting started