From 7d5ccc8e0cbe766d329cf9f66308f997d9bef6e8 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 21 Dec 2024 17:34:50 -0500 Subject: [PATCH] xmas24: test iic/ii+/gs support --- demos/xmas_2024/Makefile | 2 +- demos/xmas_2024/hardware.inc | 13 +++++- demos/xmas_2024/start.s | 2 +- demos/xmas_2024/vblank.s | 78 +++++++++++++++++++++++++++++------- 4 files changed, 77 insertions(+), 18 deletions(-) diff --git a/demos/xmas_2024/Makefile b/demos/xmas_2024/Makefile index 0b69aff1..e8c70616 100644 --- a/demos/xmas_2024/Makefile +++ b/demos/xmas_2024/Makefile @@ -42,7 +42,7 @@ qload.o: zp.inc hardware.inc music.inc qload.s \ wait.s wait_a_bit.s \ lc_detect.s gr_fast_clear.s \ text_print.s start.s \ - hgr_table.s gs_interrupt.s \ + hgr_table.s gs_interrupt.s vblank.s \ zx02_optim.s wait_keypress.s hardware_detect.s \ pt3_lib_detect_model.s pt3_lib_mockingboard_detect.s \ pt3_lib_mockingboard_setup.s interrupt_handler.s \ diff --git a/demos/xmas_2024/hardware.inc b/demos/xmas_2024/hardware.inc index 1cf29d20..1aba7a66 100644 --- a/demos/xmas_2024/hardware.inc +++ b/demos/xmas_2024/hardware.inc @@ -8,11 +8,14 @@ CLR80COL = $C000 ; PAGE1/PAGE1 normal SET80COL = $C001 ; PAGE1/PAGE2 switches PAGE1 in Aux instead EIGHTYCOLOFF = $C00C EIGHTYCOLON = $C00D + +RDVBLBAR = $C019 ; iic TBCOLOR = $C022 ; IIgs text fg/bg colors NEWVIDEO = $C029 ; IIgs graphics modes SPEAKER = $C030 CLOCKCTL = $C034 ; bits 0-3 are IIgs border color CYAREG = $C036 ; iigs motor detect and clock speed +RDVBLMSK = $C041 ; iic read vbl interrupt SET_GR = $C050 SET_TEXT = $C051 FULLGR = $C052 @@ -22,10 +25,18 @@ PAGE2 = $C055 LORES = $C056 ; Enable LORES graphics HIRES = $C057 ; Enable HIRES graphics AN3 = $C05E ; Annunciator 3 +DISVBL = $C05B ; (write) (iic) (ioudison) disable VBL interrupt +ENVBL = $C05B ; (write) (iic) (ioudison) enable VBL interrupt +CLRAN3 = $C05E ; (write) in 80-col mode, enable double graphics +SETAN3 = $C05F ; (write) in 80-col mode, disable double graphics PADDLE_BUTTON0 = $C061 PADDL0 = $C064 -PTRIG = $C070 +PTRIG = $C070 ; analog input reset / reset VBL interrupt (iic) + +IOUDISON = $C07E ; (write) disable IOU +IOUDISOFF = $C07F ; (write) enable IOU + ; APPLESOFT BASIC ROUTINES diff --git a/demos/xmas_2024/start.s b/demos/xmas_2024/start.s index 32f15080..2351ea2e 100644 --- a/demos/xmas_2024/start.s +++ b/demos/xmas_2024/start.s @@ -188,7 +188,7 @@ no_mockingboard_string: ; 0123456789012345678901234567890123456789 title_string: -.byte 0,4, "XMAS 2024",0 +.byte 0,4, "XMAS 2024 (V1.1)",0 .byte 0,6, "BY THE GUINEA PIG GANG",0 .byte 0,8, "CODE: VINCE 'DEATER' WEAVER",0 .byte 0,9, "ART: GUINEAGIRL2424",0 diff --git a/demos/xmas_2024/vblank.s b/demos/xmas_2024/vblank.s index c9839a7b..bcdcbab7 100644 --- a/demos/xmas_2024/vblank.s +++ b/demos/xmas_2024/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 + + +; 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 + + +no_vblank: + ; pause a bit? + + lda #50 + jsr wait + + rts + +