rewind2: get initial scene into final form

This commit is contained in:
Vince Weaver 2025-03-25 16:21:45 -04:00
parent 32a4f7b7ee
commit b3fb640730
7 changed files with 337 additions and 69 deletions

View File

@ -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
####

View File

@ -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"

View File

@ -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

View File

@ -1,5 +1,3 @@
;mod7_table = $1c00
;div7_table = $1d00
hposn_low = $1e00
hposn_high = $1f00

View File

@ -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 OUTL
; 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:

View File

@ -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

View File

@ -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