diff --git a/games/mist/Makefile b/games/mist/Makefile index 5e47f3d3..2fe60164 100644 --- a/games/mist/Makefile +++ b/games/mist/Makefile @@ -62,7 +62,7 @@ mist.dsk: QBOOT TEXT_TITLE QLOAD \ $(DOS33_RAW) mist.dsk 0 14 SAVE4 0 1 $(DOS33_RAW) mist.dsk 0 15 SAVE5 0 1 $(DOS33_RAW) mist.dsk 1 0 QLOAD 0 14 - $(DOS33_RAW) mist.dsk 2 0 MIST_TITLE 0 83 + $(DOS33_RAW) mist.dsk 2 0 MIST_TITLE 0 0 $(DOS33_RAW) mist.dsk 8 0 MIST 0 159 $(DOS33_RAW) mist.dsk 18 0 OCTAGON 0 128 $(DOS33_RAW) mist.dsk 26 0 DENTIST 0 31 @@ -542,6 +542,8 @@ clean: MECHE SELENA SHIP STONEY CHANNEL ARBOR NIBEL \ GENERATOR \ generate_common + +distclean: clean cd graphics_title && make clean cd graphics_mist && make clean cd graphics_octagon && make clean diff --git a/games/mist/audio/cyan.pt3 b/games/mist/audio/cyan.pt3 new file mode 100644 index 00000000..60928cbd Binary files /dev/null and b/games/mist/audio/cyan.pt3 differ diff --git a/games/mist/mist_title.s b/games/mist/mist_title.s index 45785b11..286b8b1c 100644 --- a/games/mist/mist_title.s +++ b/games/mist/mist_title.s @@ -12,18 +12,12 @@ .include "common_routines.inc" mist_start: + ;=================== - ; init screen + ; detect model ;=================== - jsr TEXT - jsr HOME - bit KEYRESET - - bit SET_GR - bit PAGE0 - bit HIRES - bit FULLGR + jsr detect_appleii_model ;=================== ; machine workarounds @@ -59,29 +53,33 @@ mist_start: sta CLOCKCTL ; set twice for VidHD not_a_iigs: - ;=================== - ; setup location + ; print config ;=================== - lda #locations - sta LOCATIONS_H + ; print non-inverse + jsr set_normal - ;=================== - ; Load hires graphics - ;=================== -reload_everything: + lda #config_string + sta OUTH - lda #file - sta getsrc_smc+2 ; LZSA_SRC_HI + jsr move_and_print - lda #$20 + ; print detected model - jsr decompress_lzsa2_fast + lda APPLEII_MODEL + ora #$80 + sta $7d0+8 ; 23,8 + + ; if GS print the extra S + cmp #'G'|$80 + bne not_gs + lda #'S'|$80 + sta $7d0+9 + +not_gs: ;=================================== ; detect if we have a language card @@ -94,6 +92,13 @@ reload_everything: jsr detect_language_card bcs no_language_card +yes_language_card: + ; update status + lda #'6'|$80 + sta $7d0+11 ; 23,11 + lda #'4'|$80 + sta $7d0+12 ; 23,12 + ; update sound status lda SOUND_STATUS ora #SOUND_IN_LC @@ -124,6 +129,9 @@ no_language_card: ;=================================== ; Setup Mockingboard ;=================================== + +PT3_ENABLE_APPLEIIC = 1 + lda #0 sta DONE_PLAYING sta LOOP @@ -134,12 +142,45 @@ no_language_card: bcc mockingboard_notfound mockingboard_found: -; jsr mockingboard_patch ; patch to work in slots other than 4? + + ; print detected location + + lda #'S'+$80 ; change NO to slot + sta $7d0+30 + + lda MB_ADDR_H ; $C4 = 4, want $B4 1100 -> 1011 + and #$87 + ora #$30 + + sta $7d0+31 ; 23,31 lda SOUND_STATUS ora #SOUND_MOCKINGBOARD sta SOUND_STATUS + ;=========================== + ; detect SSI-263 too + ;=========================== +;detect_ssi: +; lda MB_ADDR_H +; and #$87 ; slot +; jsr detect_ssi263 +; +; lda irq_count +; beq ssi_not_found +; +; lda #'Y'+$80 +; sta $7d0+39 ; 23,39 +; +; lda #SOUND_SSI263 +; ora SOUND_STATUS +; sta SOUND_STATUS + +ssi_not_found: + + jsr mockingboard_patch ; patch to work in slots other than 4? + + ;======================= ; Set up 50Hz interrupt ;======================== @@ -168,6 +209,54 @@ mockingboard_notfound: done_setup_sound: + ;========================== + ; wait a bit at text title + ;========================== + + lda #40 + jsr wait_a_bit + + + ;=================== + ; init screen + ;=================== + + jsr TEXT + jsr HOME + bit KEYRESET + + bit SET_GR + bit PAGE0 + bit HIRES + bit FULLGR + + + ;=================== + ; setup location + ;=================== + + lda #locations + sta LOCATIONS_H + + ;=================== + ; Load hires graphics + ;=================== +reload_everything: + + lda #file + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + + + ;=================================== @@ -497,11 +586,13 @@ really_exit: ; pt3 player + .include "pt3_lib_detect_model.s" .include "pt3_lib_core.s" .include "pt3_lib_init.s" + .include "pt3_lib_mockingboard_setup.s" .include "interrupt_handler.s" .include "pt3_lib_mockingboard_detect.s" - .include "pt3_lib_mockingboard_setup.s" + .include "wait_a_bit.s" @@ -607,5 +698,29 @@ theme_music: ; 0123456789012345678901234567890123456789 .byte " THE ENDING HAS NOT YET BEEN WRITTEN" - .endif + +config_string: +; 0123456789012345678901234567890123456789 +.byte 0,23,"APPLE II?, 48K, MOCKINGBOARD: NO, SSI: N",0 +; MOCKINGBOARD: NONE + + +; set normal text +set_normal: + lda #$80 + sta ps_smc1+1 + + lda #09 ; ora + sta ps_smc1 + + rts + + ; restore inverse text +set_inverse: + lda #$29 + sta ps_smc1 + lda #$3f + sta ps_smc1+1 + + rts diff --git a/games/mist/pt3_lib_detect_model.s b/games/mist/pt3_lib_detect_model.s new file mode 100644 index 00000000..31c1b8dc --- /dev/null +++ b/games/mist/pt3_lib_detect_model.s @@ -0,0 +1,63 @@ + ;=========================== + ; Check Apple II model + ;=========================== + ; this is mostly for IIc support + ; as it does interrupts differently + + ; ' ' ($20) = Apple II + ; '+' ($2B) = Apple II+ + ; 'E' ($45) = Apple IIe + ; 'C' ($43) = Apple IIc + ; 'G' ($47) = Apple IIgs + + +detect_appleii_model: + lda #' ' + + ldx $FBB3 + ; II is $38 + ; J-plus is $C9 + ; II+ is $EA (so is III) + ; IIe and newer is $06 + + cpx #$38 + beq done_apple_detect + + lda #'+' + cpx #$EA + beq done_apple_detect + + ; TODO: check for J-plus or III? + + cpx #$06 + bne done_apple_detect + +apple_iie_or_newer: + + + + ldx $FBC0 ; $EA on a IIe + ; $E0 on a IIe enhanced + ; $00 on a IIc/IIc+ + + ; $FE1F = $60, IIgs + + beq apple_iic + + lda #'E' + cpx #$EA + beq done_apple_detect + cpx #$E0 + beq done_apple_detect + + ; assume GS? + + lda #'G' + bne done_apple_detect + +apple_iic: + lda #'C' + +done_apple_detect: + sta APPLEII_MODEL + rts diff --git a/games/mist/pt3_lib_mockingboard_detect.s b/games/mist/pt3_lib_mockingboard_detect.s index 706d9407..8b0857c5 100644 --- a/games/mist/pt3_lib_mockingboard_detect.s +++ b/games/mist/pt3_lib_mockingboard_detect.s @@ -33,6 +33,26 @@ ;------------------------------------------------------------------------------ mockingboard_detect: + + ; activate IIc mockingboard? + ; this might only be necessary to allow detection + ; I get the impression the Mockingboard 4c activates + ; when you access any of the 6522 ports in Slot 4 + +.ifdef PT3_ENABLE_APPLE_IIC + lda APPLEII_MODEL + cmp #'C' + bne not_iic + + lda #$ff + + ; don't bother patching these, IIc mockingboard always slot 4? + + sta MOCK_6522_DDRA1 + sta MOCK_6522_T1CL +.endif + +not_iic: lda #$00 sta MB_ADDR_L ldx #$C7 ; start at slot #7 diff --git a/games/mist/pt3_lib_mockingboard_setup.s b/games/mist/pt3_lib_mockingboard_setup.s index 9c7a6e1c..89a4cac0 100644 --- a/games/mist/pt3_lib_mockingboard_setup.s +++ b/games/mist/pt3_lib_mockingboard_setup.s @@ -170,47 +170,56 @@ clear_ay_end: ;============================= mockingboard_setup_interrupt: - ;=========================== - ; Check for Apple IIc - ;=========================== - ; it does interrupts differently - - lda $FBB3 ; IIe and newer is $06 - cmp #6 - beq apple_iie_or_newer - - jmp done_apple_detect -apple_iie_or_newer: - lda $FBC0 ; 0 on a IIc - bne done_apple_detect -apple_iic: - ; activate IIc mockingboard? - ; this might only be necessary to allow detection - ; I get the impression the Mockingboard 4c activates - ; when you access any of the 6522 ports in Slot 4 - lda #$ff - - ; don't bother patching these, IIc mockingboard always slot 4? - - sta MOCK_6522_DDRA1 - sta MOCK_6522_T1CL +.ifdef PT3_ENABLE_APPLE_IIC + lda APPLEII_MODEL + cmp #'C' + bne done_iic_hack ; bypass the firmware interrupt handler ; should we do this on IIe too? probably faster + ; first we have to copy the ROM to the language card + sei ; disable interrupts - lda $c08b ; disable ROM (enable language card) - lda $c08b + + + +copy_rom_loop: + lda $c089 ; read ROM, write RAM1 + lda $c089 + + ldy #0 +read_rom_loop: + lda $D000,Y + sta $400,Y ; note this uses text page as + ; temporary data store + iny + bne read_rom_loop + + lda $c08B ; read/write RAM1 + lda $c08B ; + +write_rom_loop: + lda $400,Y + sta $D000,Y + iny + bne write_rom_loop + + inc read_rom_loop+2 + inc write_rom_loop+5 + bne copy_rom_loop + lda #interrupt_handler sta $ffff - lda #$EA ; nop out the "lda $45" in the irq hand + lda #$EA ; nop out the "lda $45" in the irq handler sta interrupt_smc sta interrupt_smc+1 +.endif -done_apple_detect: +done_iic_hack: ;========================= @@ -228,10 +237,16 @@ done_apple_detect: ; Enable 50Hz clock on 6522 ;============================ - ; 4fe7 / 1e6 = .020s, 50Hz - ; 9c40 / 1e6 = .040s, 25Hz - ; 411a / 1e6 = .016s, 60Hz + ; Note, on Apple II the clock isn't 1MHz but is actually closer to + ; roughly 1.023MHz, and every 65th clock is stretched (it's complicated) + + ; 4fe7 / 1.023e6 = .020s, 50Hz + ; 9c40 / 1.023e6 = .040s, 25Hz + ; 411a / 1.023e6 = .016s, 60Hz + + ; French Touch uses + ; 4e20 / 1.000e6 = .020s, 50Hz, which assumes 1MHz clock freq sei ; disable interrupts just in case @@ -249,12 +264,33 @@ setup_irq_smc4: sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt lda #$E7 +; lda #$20 setup_irq_smc5: sta MOCK_6522_T1CL ; write into low-order latch lda #$4f +; lda #$4E setup_irq_smc6: sta MOCK_6522_T1CH ; write into high-order latch, ; load both values into counter ; clear interrupt and start counting rts + + + + ;============================= + ; Disable Interrupt + ;============================= +mockingboard_disable_interrupt: + + sei ; disable interrupts just in case + + lda #$40 ; Continuous interrupts, don't touch PB7 +disable_irq_smc1: + sta MOCK_6522_ACR ; ACR register + lda #$7F ; clear all interrupt flags +disable_irq_smc2: + sta MOCK_6522_IER ; IER register (interrupt enable) + + rts + diff --git a/games/mist/qload.s b/games/mist/qload.s index d3b63def..75a1a2c3 100644 --- a/games/mist/qload.s +++ b/games/mist/qload.s @@ -213,7 +213,7 @@ sector_array: .byte 0 ; FIRST_SECTOR length_array: - .byte 83,159,157,145 ; MIST_TITLE,MIST,MECHE,SELENA + .byte 95,159,157,145 ; MIST_TITLE,MIST,MECHE,SELENA .byte 128, 20,158,135 ; OCTAGON,VIEWER,STONEY,CHANNEL .byte 61, 31,159,109 ; CABIN,DENTIST,ARBOR,NIBEL .byte 20, 33, 27, 78 ; SHIP,GENERATOR,D'NI,SUB diff --git a/games/mist/text_print.s b/games/mist/text_print.s index 0c1e5032..ed6cb40a 100644 --- a/games/mist/text_print.s +++ b/games/mist/text_print.s @@ -60,6 +60,7 @@ done_print_string: rts + .if 0 ;================================ ; move and print a list of lines diff --git a/games/mist/text_title.s b/games/mist/text_title.s index c15aae62..0643540e 100644 --- a/games/mist/text_title.s +++ b/games/mist/text_title.s @@ -29,9 +29,8 @@ text_loop: dex bne text_loop - - lda #40 - jsr wait_a_bit +; lda #40 +; jsr wait_a_bit rts diff --git a/games/mist/zp.inc b/games/mist/zp.inc index 82b60392..817e4395 100644 --- a/games/mist/zp.inc +++ b/games/mist/zp.inc @@ -2,6 +2,7 @@ ;; LZSA addresses NIBCOUNT = $00 +APPLEII_MODEL = $01 ;; Zero page monitor routines addresses diff --git a/games/mist_hgr/mist_title.s b/games/mist_hgr/mist_title.s index 6b893b06..3f574897 100644 --- a/games/mist_hgr/mist_title.s +++ b/games/mist_hgr/mist_title.s @@ -155,6 +155,9 @@ mockingboard_found: ; print detected location + lda #'S'+$80 ; change NO to Slot + sta $7d0+30 + lda MB_ADDR_H ; $C4 = 4, want $B4 1100 -> 1011 and #$87 ora #$30 @@ -1048,7 +1051,7 @@ narration6: config_string: ; 0123456789012345678901234567890123456789 -.byte 0,23,"APPLE II?, 48K, MOCKINGBOARD: S?, SSI: N",0 +.byte 0,23,"APPLE II?, 48K, MOCKINGBOARD: NO, SSI: N",0 ; MOCKINGBOARD: NONE