diff --git a/demos/rewind2/Makefile b/demos/rewind2/Makefile index b5c07a57..b5687e5f 100644 --- a/demos/rewind2/Makefile +++ b/demos/rewind2/Makefile @@ -61,7 +61,7 @@ qload.o: zp.inc hardware.inc common_defines.inc music.inc qload.s \ pt3_lib_mockingboard_setup.s interrupt_handler.s \ pt3_lib_mockingboard_patch.s \ irq_wait.s vblank.s hgr_page_flip.s \ - hgr_clear_screen.s + hgr_clear_screen.s vblank.s ca65 -o qload.o qload.s -l qload.lst #### diff --git a/demos/rewind2/bear/bear.s b/demos/rewind2/bear/bear.s index bd495d7d..9376ac5d 100644 --- a/demos/rewind2/bear/bear.s +++ b/demos/rewind2/bear/bear.s @@ -23,8 +23,6 @@ bear: bit KEYRESET ; just to be safe - lda #0 - ;================================= ; Unpack base image ;================================= @@ -41,23 +39,23 @@ bear: ; Set DHGR mode ;================================= - bit SET_GR - bit HIRES - bit FULLGR - sta AN3 ; set double hires - sta EIGHTYCOLON ; 80 column - sta SET80COL ; 80 store + bit HIRES + bit FULLGR + sta AN3 ; set double hires + sta EIGHTYCOLON ; 80 column +; sta SET80COL ; 80 store - bit PAGE1 ; start in page1 + bit PAGE1 ; start in page1 + lda #$20 + sta DRAW_PAGE ; draw to page2 ;================================= ; Unpack further to DHGR ;================================= - ; full screen grey - +.if 0 lda #0 sta XSTART lda #100 @@ -69,9 +67,14 @@ bear: sta color_lookup_smc+2 jsr decode_image + jsr copy_to_aux + + bit PAGE2 ; switch to PAGE2 jsr wait_until_keypress +.endif + ;================= ; green1 lda #0 @@ -86,7 +89,13 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE2 ; show PAGE2 + lda #$00 ; draw PAGE1 + sta DRAW_PAGE + +; jsr wait_until_keypress ; green2 @@ -97,8 +106,15 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE1 ; show PAGE1 + lda #$20 ; draw PAGE2 + sta DRAW_PAGE +; jsr wait_until_keypress + + ;====== ; blue1 lda #8 @@ -113,8 +129,15 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE2 ; show PAGE2 + lda #$00 ; draw PAGE1 + sta DRAW_PAGE +; jsr wait_until_keypress + + ;======== ; blue2 lda #8 @@ -124,8 +147,15 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE1 ; show PAGE1 + lda #$20 ; draw PAGE2 + sta DRAW_PAGE +; jsr wait_until_keypress + + ;============= ; red1 lda #18 @@ -140,8 +170,15 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE2 ; show PAGE2 + lda #$00 ; draw PAGE1 + sta DRAW_PAGE +; jsr wait_until_keypress + + ;========= ; red2 lda #18 @@ -151,9 +188,15 @@ bear: jsr decode_image - jsr wait_until_keypress + jsr copy_to_aux + jsr wait_vblank + bit PAGE1 ; show PAGE1 + lda #$20 ; draw PAGE2 + sta DRAW_PAGE +; jsr wait_until_keypress + ;========= ; yellow1 lda #28 @@ -168,6 +211,12 @@ bear: jsr decode_image + jsr copy_to_aux + jsr wait_vblank + bit PAGE2 ; show PAGE2 + lda #$00 ; draw PAGE1 + sta DRAW_PAGE + jsr wait_until_keypress @@ -199,9 +248,18 @@ yloop: ldy YPOS ; load row address lda hposn_low,Y sta OUTL + sta AUXOUTL + lda hposn_high,Y + clc + adc DRAW_PAGE sta OUTH ; addr=hgr_offset(y); + lda hposn_high,Y + clc + adc #$50 ; base is $70 + sta AUXOUTH + lda #0 ; for(x=0;x<20;x++) { sta XPOS xloop: @@ -268,21 +326,13 @@ check_range: skip_set_colors: lda #0 - bit PAGE1 ; MAIN values sta (OUTL),Y + sta (AUXOUTL),Y iny sta (OUTL),Y - dey - - bit PAGE2 ; AUX values - sta (OUTL),Y + sta (AUXOUTL),Y jmp write_out_end -; iny -; sta (OUTL),Y - - - calculate_colors: ; AUX0 PBBBAAAA (24) ; aux0=(colorsA)|((colorsB&0x7)<<4); @@ -294,8 +344,8 @@ calculate_colors: asl ; 2 asl ; 2 ora COLORSA ; 3 - bit PAGE2 ; set AUX ; 4 - sta (OUTL),Y ; AUX0 ; 6 +; bit PAGE2 ; set AUX ; 4 + sta (AUXOUTL),Y ; AUX0 ; 6 ;=== ; 24 @@ -317,7 +367,7 @@ calculate_colors: lsr ; 2 ora AUX1 ; 3 iny ; 2 - sta (OUTL),Y ; AUX1 ; 6 + sta (AUXOUTL),Y ; AUX1 ; 6 ;=== ; 39 @@ -337,7 +387,7 @@ calculate_colors: cmp #8 ; bit 3 into carry ; 2 rol MAIN0 ; 3 dey ; 2 - bit PAGE1 ; set MAIN memory ; 4 +; bit PAGE1 ; set MAIN memory ; 4 lda MAIN0 ; 3 sta (OUTL),Y ; MAIN0 ; 6 ;===== @@ -354,15 +404,12 @@ calculate_colors: asl ; 2 ora COLORSF ; 3 lsr ; 2 -write_out_end: iny ; 2 sta (OUTL),Y ; MAIN1 ; 6 ;==== ; 24 -; jmp continue_xloop ; 3 - - +write_out_end: continue_xloop: iny @@ -399,5 +446,7 @@ color_lookup_red: color_lookup_yellow: .byte 0,4,12,14 ; yellow black/brown/orange/yellow + .include "copy_to_aux.s" + bear_packed_zx02: .incbin "bear.packed.zx02" diff --git a/demos/rewind2/bear/copy_to_aux.s b/demos/rewind2/bear/copy_to_aux.s new file mode 100644 index 00000000..0fd28ed5 --- /dev/null +++ b/demos/rewind2/bear/copy_to_aux.s @@ -0,0 +1,159 @@ +; copy 8k from $7000 to either $2000 or $4000 in AUX memory + +copy_to_aux: + sta WRAUX + lda DRAW_PAGE + beq copy_to_aux_page1 + jmp copy_to_aux_page2 + +copy_to_aux_page1: + + ldy #0 +copy_to_aux_page1_loop: + lda $7000,Y + sta $2000,Y + lda $7100,Y + sta $2100,Y + lda $7200,Y + sta $2200,Y + lda $7300,Y + sta $2300,Y + lda $7400,Y + sta $2400,Y + lda $7500,Y + sta $2500,Y + lda $7600,Y + sta $2600,Y + lda $7700,Y + sta $2700,Y + lda $7800,Y + sta $2800,Y + lda $7900,Y + sta $2900,Y + lda $7A00,Y + sta $2A00,Y + lda $7B00,Y + sta $2B00,Y + lda $7C00,Y + sta $2C00,Y + lda $7D00,Y + sta $2D00,Y + lda $7E00,Y + sta $2E00,Y + lda $7F00,Y + sta $2F00,Y + lda $8000,Y + sta $3000,Y + lda $8100,Y + sta $3100,Y + lda $8200,Y + sta $3200,Y + lda $8300,Y + sta $3300,Y + lda $8400,Y + sta $3400,Y + lda $8500,Y + sta $3500,Y + lda $8600,Y + sta $3600,Y + lda $8700,Y + sta $3700,Y + lda $8800,Y + sta $3800,Y + lda $8900,Y + sta $3900,Y + lda $8A00,Y + sta $3A00,Y + lda $8B00,Y + sta $3B00,Y + lda $8C00,Y + sta $3C00,Y + lda $8D00,Y + sta $3D00,Y + lda $8E00,Y + sta $3E00,Y + lda $8F00,Y + sta $3F00,Y + iny + beq done_copy_to_aux_page1 + jmp copy_to_aux_page1_loop +done_copy_to_aux_page1: + sta WRMAIN + rts + + +copy_to_aux_page2: + + ldy #0 +copy_to_aux_page2_loop: + lda $7000,Y + sta $4000,Y + lda $7100,Y + sta $4100,Y + lda $7200,Y + sta $4200,Y + lda $7300,Y + sta $4300,Y + lda $7400,Y + sta $4400,Y + lda $7500,Y + sta $4500,Y + lda $7600,Y + sta $4600,Y + lda $7700,Y + sta $4700,Y + lda $7800,Y + sta $4800,Y + lda $7900,Y + sta $4900,Y + lda $7A00,Y + sta $4A00,Y + lda $7B00,Y + sta $4B00,Y + lda $7C00,Y + sta $4C00,Y + lda $7D00,Y + sta $4D00,Y + lda $7E00,Y + sta $4E00,Y + lda $7F00,Y + sta $4F00,Y + lda $8000,Y + sta $5000,Y + lda $8100,Y + sta $5100,Y + lda $8200,Y + sta $5200,Y + lda $8300,Y + sta $5300,Y + lda $8400,Y + sta $5400,Y + lda $8500,Y + sta $5500,Y + lda $8600,Y + sta $5600,Y + lda $8700,Y + sta $5700,Y + lda $8800,Y + sta $5800,Y + lda $8900,Y + sta $5900,Y + lda $8A00,Y + sta $5A00,Y + lda $8B00,Y + sta $5B00,Y + lda $8C00,Y + sta $5C00,Y + lda $8D00,Y + sta $5D00,Y + lda $8E00,Y + sta $5E00,Y + lda $8F00,Y + sta $5F00,Y + iny + beq done_copy_to_aux_page2 + jmp copy_to_aux_page2_loop +done_copy_to_aux_page2: + sta WRMAIN + rts + diff --git a/demos/rewind2/common_defines.inc b/demos/rewind2/common_defines.inc index 49e6ef30..0f4a1330 100644 --- a/demos/rewind2/common_defines.inc +++ b/demos/rewind2/common_defines.inc @@ -1,5 +1,3 @@ -;mod7_table = $1c00 -;div7_table = $1d00 hposn_low = $1e00 hposn_high = $1f00 diff --git a/demos/rewind2/start.s b/demos/rewind2/start.s index 4747de41..aa9fb475 100644 --- a/demos/rewind2/start.s +++ b/demos/rewind2/start.s @@ -16,6 +16,7 @@ rewind2_start: ;===================== bit PAGE1 + bit KEYRESET jsr hardware_detect @@ -47,9 +48,16 @@ rewind2_start: jsr move_and_print_list + ;=============================== + ; pause at warning if not e/c/gs + lda APPLEII_MODEL cmp #'e' beq good_to_go + cmp #'g' + beq good_to_go + cmp #'c' + beq good_to_go jsr wait_until_keypress @@ -61,18 +69,6 @@ good_to_go: ;========================================= ;========================================= -; bit SET_GR -; bit LORES ; set lo-res -; bit TEXTGR - - -; lda #load_message -; sta OUTH -; jsr move_and_print - - ;================================== ; load music into the language card ; into $D000 set 1 @@ -126,6 +122,18 @@ dont_enable_mc: skip_all_checks: + ;==================================== + ;==================================== + ; Clear DHGR PAGE1 + ; MAIN:$2000 and AUX:$2000 + ;==================================== + ;==================================== + + jsr hgr_page1_clearscreen + sta WRAUX ; writes to AUX memory + jsr hgr_page1_clearscreen + sta WRMAIN ; writes back to MAIN memory + .if 0 ;==================================== @@ -182,7 +190,7 @@ load_program_loop: ; load from disk sei - lda #PART_BEAR ; HEADPHONES + lda #PART_BEAR ; Multi-color AHA tape intro sta WHICH_LOAD jsr load_file @@ -261,12 +269,16 @@ blah: jmp blah -start_message: +start_message: ;01234567890123456789012345678901234567890 .byte 0,0,"LOADING REWIND2 PROOF OF CONCEPT",0 - .byte 0,1,"REQUIRES APPLE IIE/C/GS, 128K, MOCKINGBOARD",0 + .byte 0,1,"REQUIRES APPLE IIE, 128K, MOCKINGBOARD",0 .byte 0,3,"SYSTEM DETECTED: APPLE II" message_type_offset: .byte " ",0 + .byte 0,10,"MUSIC BY QJETA",0 + .byte 0,12,"VISUALS BASED ON OPENING OF REWIND2",0 + .byte 0,13," ATARI XL DEMO",0 + .byte 0,14," BY NEW GENERATION, RADIANCE, ZELAX",0 .byte $FF load_message: diff --git a/demos/rewind2/vblank.s b/demos/rewind2/vblank.s index c9839a7b..c8cf984b 100644 --- a/demos/rewind2/vblank.s +++ b/demos/rewind2/vblank.s @@ -14,10 +14,19 @@ VBLANK = $C019 ; ; TODO: patch this to a RTS on non-IIe systems wait_vblank: -; Assume Apple IIe -; lda APPLEII_MODEL -; cmp #'e' -; bne no_vblank + + lda APPLEII_MODEL + + cmp #'e' + beq wait_vblank_iie + + cmp #'g' + beq wait_vblank_iigs + +; cmp #'c' +; beq wait_vblank_iic + + bne no_vblank ; 4cade does this, the opposite of the way were doing it originally @@ -33,16 +42,55 @@ wait_vblank_done_iie: lda VBLANK bmi wait_vblank_done_iie ; repeat until positive (start vblank) ; in vblank -no_vblank: - -.if 0 -wait_vblank_iie: - lda VBLANK - bmi wait_vblank_iie ; wait for positive (in vblank) -wait_vblank_done_iie: - lda VBLANK ; wait for negative (vlank done) - bpl wait_vblank_done_iie -no_vblank: -.endif rts + +wait_vblank_iigs: + lda VBLANK + bpl wait_vblank_iigs ; repeat until negative + ; not in vblank +wait_vblank_done_iigs: + lda VBLANK + bmi wait_vblank_done_iigs ; repeat until positive (start vblank) + ; in vblank + + rts + +.if 0 +; NOTE: we don't support this as we have to handle interrupts +; for music and we'd have to hack up the irq handler +; to differentiate VBLANK from others + +; alternate implementation by Oliver Schmidt +; from https://github.com/cc65/cc65/blob/master/libsrc/apple2/waitvsync.s + +wait_vblank_iic: +; sei ; disables interrupts + sta IOUDISOFF + lda RDVBLMSK + bit ENVBL + bit PTRIG ; Reset VBL interrupt flag + +wviim: + bit RDVBLBAR + bpl wviim + + asl + bcs wviip ; VBL interrupts were already enabled + bit DISVBL +wviip: + sta IOUDISON ; IIc Tech Ref Man: The firmware normally leaves IOUDIS on. +; cli ; re-enable interrupts + + rts +.endif + +no_vblank: + ; pause a bit? + +; lda #50 +; jsr wait + + rts + + diff --git a/demos/rewind2/zp.inc b/demos/rewind2/zp.inc index ce29613e..2e3755ea 100644 --- a/demos/rewind2/zp.inc +++ b/demos/rewind2/zp.inc @@ -144,7 +144,8 @@ MASKH = $EB ;============================================== ; bear -ODD = $EB +AUXOUTL = $EA +AUXOUTH = $EB MAIN1 = $EC AUX1 = $ED MAIN0 = $EE @@ -160,6 +161,7 @@ COLORSD = $F7 COLORSC = $F8 COLORSB = $F9 COLORSA = $FA +ODD = $FB ; dancing DANCE_COUNT = $F0