mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-06-08 15:29:41 +00:00
pt3_lib: add Apple IIc support
This commit is contained in:
parent
9873a1da0e
commit
e3f4822d77
|
@ -3,6 +3,7 @@ include ../../Makefile.inc
|
||||||
DOS33 = ../../utils/dos33fs-utils/dos33
|
DOS33 = ../../utils/dos33fs-utils/dos33
|
||||||
PNG2GR = ../../utils/gr-utils/png2gr
|
PNG2GR = ../../utils/gr-utils/png2gr
|
||||||
TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft
|
TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft
|
||||||
|
EMPTY_DISK = ../../empty_disk
|
||||||
|
|
||||||
all: pt3_lib.dsk
|
all: pt3_lib.dsk
|
||||||
|
|
||||||
|
@ -10,7 +11,7 @@ $(DOS33):
|
||||||
cd ../../utils/dos33fs-utils && make
|
cd ../../utils/dos33fs-utils && make
|
||||||
|
|
||||||
pt3_lib.dsk: PT3_TEST HELLO
|
pt3_lib.dsk: PT3_TEST HELLO
|
||||||
cp empty.dsk pt3_lib.dsk
|
cp $(EMPTY_DISK)/empty.dsk pt3_lib.dsk
|
||||||
$(DOS33) -y pt3_lib.dsk SAVE A HELLO
|
$(DOS33) -y pt3_lib.dsk SAVE A HELLO
|
||||||
$(DOS33) -y pt3_lib.dsk BSAVE -a 0x1000 PT3_TEST
|
$(DOS33) -y pt3_lib.dsk BSAVE -a 0x1000 PT3_TEST
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ PT3_TEST: pt3_test.o
|
||||||
ld65 -o PT3_TEST pt3_test.o -C ../../linker_scripts/apple2_1000.inc
|
ld65 -o PT3_TEST pt3_test.o -C ../../linker_scripts/apple2_1000.inc
|
||||||
|
|
||||||
pt3_test.o: pt3_test.s \
|
pt3_test.o: pt3_test.s \
|
||||||
|
pt3_lib_detect_model.s \
|
||||||
pt3_lib_init.s pt3_lib_core.s pt3_lib_irq_handler.s \
|
pt3_lib_init.s pt3_lib_core.s pt3_lib_irq_handler.s \
|
||||||
pt3_lib_mockingboard_detect.s pt3_lib_mockingboard_setup.s \
|
pt3_lib_mockingboard_detect.s pt3_lib_mockingboard_setup.s \
|
||||||
interrupt_handler.s zp.inc
|
interrupt_handler.s zp.inc
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
The PT3_player Library version 0.2
|
The PT3_player Library version 0.3
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
by Vince "Deater" Weaver <vince@deater.net>
|
by Vince "Deater" Weaver <vince@deater.net>
|
||||||
http://www.deater.net/weave/vmwprod/pt3_lib/
|
http://www.deater.net/weave/vmwprod/pt3_lib/
|
||||||
|
|
||||||
Last Update: 28 December 2019
|
Last Update: 30 May 2021
|
||||||
|
|
||||||
Plays Vortex Tracker II .pt3 files on the Apple II
|
Plays Vortex Tracker II .pt3 files on the Apple II
|
||||||
|
|
||||||
|
@ -73,8 +73,46 @@ To get a pt3 file playing:
|
||||||
+ If you want the music to Loop then set the LOOP value to 1.
|
+ If you want the music to Loop then set the LOOP value to 1.
|
||||||
|
|
||||||
|
|
||||||
Using the Code (cycle-counted):
|
Notes on Using on a IIc
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
I usually test this code mostly on a II+ and IIe.
|
||||||
|
|
||||||
|
Version 0.3 adds support for the IIc as well (having Mockingboards in a
|
||||||
|
IIc was rare due to the lack of expansion port, but you can get mockingboard
|
||||||
|
compatible cards that plug into the CPU socket)
|
||||||
|
|
||||||
|
This does involve adding some Apple II model detection code to the pt3 player
|
||||||
|
which does increase the size a bit.
|
||||||
|
|
||||||
|
Things that are different on IIc:
|
||||||
|
+ For the board to get detected you have to touch the slot4
|
||||||
|
registers for some reason
|
||||||
|
+ IRQ support is much more complex on the IIc. We support things
|
||||||
|
by switching out the default ROM IRQ handler with
|
||||||
|
language-card RAM and place our own handler where the
|
||||||
|
stock handler would be.
|
||||||
|
|
||||||
|
This does mean if you use ROM routines they will break,
|
||||||
|
so the code also copies the $D000-$F000 ROM into the
|
||||||
|
language card too. If your code doesn't use ROM routines
|
||||||
|
you can skip this. The ROM copy hack uses $400 (text page 1)
|
||||||
|
as a temporary buffer for the copy, feel free to use something
|
||||||
|
else if that's a problem.
|
||||||
|
|
||||||
|
Finally we patch out loading the A register from $45 at
|
||||||
|
the end of the IRQ handler.
|
||||||
|
Older Apple IIs needed to do this, but on a IIc this
|
||||||
|
will break things.
|
||||||
|
|
||||||
|
|
||||||
|
Notes on Using on a IIgs
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
I have not tested this on a IIgs with Mockingboard, I'm guessing it probably
|
||||||
|
doesn't work.
|
||||||
|
|
||||||
|
|
||||||
|
Cycle-counted version (not finished):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
I started work on a cycle-counted (deterministic cycle count) pt3
|
I started work on a cycle-counted (deterministic cycle count) pt3
|
||||||
decoder, but it turned out to be large and complex enough to not be
|
decoder, but it turned out to be large and complex enough to not be
|
||||||
|
@ -100,3 +138,4 @@ The player also uses 26 zero-page locations. More compact/faster code
|
||||||
can be generated if you're willing to sacrifice 128+ zero page locations.
|
can be generated if you're willing to sacrifice 128+ zero page locations.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -1,2 +1,2 @@
|
||||||
10 PRINT "PT3 LIB TEST V0.2"
|
10 PRINT "PT3 LIB TEST V0.3"
|
||||||
100 PRINT CHR$ (4)"BRUN PT3_TEST"
|
100 PRINT CHR$ (4)"BRUN PT3_TEST"
|
||||||
|
|
|
@ -33,6 +33,24 @@
|
||||||
;------------------------------------------------------------------------------
|
;------------------------------------------------------------------------------
|
||||||
|
|
||||||
mockingboard_detect:
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
not_iic:
|
||||||
lda #$00
|
lda #$00
|
||||||
sta MB_ADDR_L
|
sta MB_ADDR_L
|
||||||
ldx #$C7 ; start at slot #7
|
ldx #$C7 ; start at slot #7
|
||||||
|
|
|
@ -170,47 +170,54 @@ clear_ay_end:
|
||||||
;=============================
|
;=============================
|
||||||
mockingboard_setup_interrupt:
|
mockingboard_setup_interrupt:
|
||||||
|
|
||||||
;===========================
|
lda APPLEII_MODEL
|
||||||
; Check for Apple IIc
|
cmp #'C'
|
||||||
;===========================
|
bne done_iic_hack
|
||||||
; 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
|
|
||||||
|
|
||||||
; bypass the firmware interrupt handler
|
; bypass the firmware interrupt handler
|
||||||
; should we do this on IIe too? probably faster
|
; should we do this on IIe too? probably faster
|
||||||
|
|
||||||
|
; first we have to copy the ROM to the language card
|
||||||
|
|
||||||
sei ; disable interrupts
|
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
|
lda #<interrupt_handler
|
||||||
sta $fffe
|
sta $fffe
|
||||||
lda #>interrupt_handler
|
lda #>interrupt_handler
|
||||||
sta $ffff
|
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
|
||||||
sta interrupt_smc+1
|
sta interrupt_smc+1
|
||||||
|
|
||||||
done_apple_detect:
|
done_iic_hack:
|
||||||
|
|
||||||
|
|
||||||
;=========================
|
;=========================
|
||||||
|
@ -228,10 +235,16 @@ done_apple_detect:
|
||||||
; Enable 50Hz clock on 6522
|
; Enable 50Hz clock on 6522
|
||||||
;============================
|
;============================
|
||||||
|
|
||||||
; 4fe7 / 1e6 = .020s, 50Hz
|
|
||||||
|
|
||||||
; 9c40 / 1e6 = .040s, 25Hz
|
; Note, on Apple II the clock isn't 1MHz but is actually closer to
|
||||||
; 411a / 1e6 = .016s, 60Hz
|
; 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
|
sei ; disable interrupts just in case
|
||||||
|
|
||||||
|
@ -249,9 +262,11 @@ setup_irq_smc4:
|
||||||
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
|
sta MOCK_6522_IER ; IER: 1100, enable timer one interrupt
|
||||||
|
|
||||||
lda #$E7
|
lda #$E7
|
||||||
|
; lda #$20
|
||||||
setup_irq_smc5:
|
setup_irq_smc5:
|
||||||
sta MOCK_6522_T1CL ; write into low-order latch
|
sta MOCK_6522_T1CL ; write into low-order latch
|
||||||
lda #$4f
|
lda #$4f
|
||||||
|
; lda #$4E
|
||||||
setup_irq_smc6:
|
setup_irq_smc6:
|
||||||
sta MOCK_6522_T1CH ; write into high-order latch,
|
sta MOCK_6522_T1CH ; write into high-order latch,
|
||||||
; load both values into counter
|
; load both values into counter
|
||||||
|
|
|
@ -36,6 +36,15 @@ pt3_setup:
|
||||||
; lda #1
|
; lda #1
|
||||||
sta LOOP ; change to 1 to loop forever
|
sta LOOP ; change to 1 to loop forever
|
||||||
|
|
||||||
|
|
||||||
|
;=======================
|
||||||
|
; Detect Apple II Model
|
||||||
|
;========================
|
||||||
|
; IRQ setup is different on IIc
|
||||||
|
; You can possibly skip this if you only care about II+/IIe
|
||||||
|
|
||||||
|
jsr detect_appleii_model
|
||||||
|
|
||||||
;=======================
|
;=======================
|
||||||
; Detect mockingboard
|
; Detect mockingboard
|
||||||
;========================
|
;========================
|
||||||
|
@ -124,6 +133,21 @@ forever_loop:
|
||||||
; as we disable ROM (COUT won't work?)
|
; as we disable ROM (COUT won't work?)
|
||||||
|
|
||||||
print_mockingboard_detect:
|
print_mockingboard_detect:
|
||||||
|
lda APPLEII_MODEL
|
||||||
|
sta apple_message+17
|
||||||
|
|
||||||
|
; print detection message for Apple II type
|
||||||
|
ldy #0
|
||||||
|
print_apple_message:
|
||||||
|
lda apple_message,Y ; load loading message
|
||||||
|
beq done_apple_message
|
||||||
|
ora #$80
|
||||||
|
jsr COUT
|
||||||
|
iny
|
||||||
|
jmp print_apple_message
|
||||||
|
done_apple_message:
|
||||||
|
jsr CROUT1
|
||||||
|
|
||||||
|
|
||||||
; print detection message
|
; print detection message
|
||||||
ldy #0
|
ldy #0
|
||||||
|
@ -168,6 +192,8 @@ done_found_message:
|
||||||
;=========
|
;=========
|
||||||
; strings
|
; strings
|
||||||
;=========
|
;=========
|
||||||
|
apple_message: .asciiz "DETECTED APPLE II "
|
||||||
|
|
||||||
mocking_message: .asciiz "LOOKING FOR MOCKINGBOARD: "
|
mocking_message: .asciiz "LOOKING FOR MOCKINGBOARD: "
|
||||||
not_message: .byte "NOT "
|
not_message: .byte "NOT "
|
||||||
found_message: .asciiz "FOUND SLOT#4"
|
found_message: .asciiz "FOUND SLOT#4"
|
||||||
|
@ -182,6 +208,7 @@ found_message: .asciiz "FOUND SLOT#4"
|
||||||
;routines
|
;routines
|
||||||
;=========
|
;=========
|
||||||
|
|
||||||
|
.include "pt3_lib_detect_model.s"
|
||||||
.include "pt3_lib_core.s"
|
.include "pt3_lib_core.s"
|
||||||
.include "pt3_lib_init.s"
|
.include "pt3_lib_init.s"
|
||||||
.include "pt3_lib_mockingboard_setup.s"
|
.include "pt3_lib_mockingboard_setup.s"
|
||||||
|
|
|
@ -12,6 +12,7 @@ MB_VALUE = $67
|
||||||
DONE_PLAYING = $68
|
DONE_PLAYING = $68
|
||||||
DONE_SONG = $69
|
DONE_SONG = $69
|
||||||
PT3_TEMP = $6A
|
PT3_TEMP = $6A
|
||||||
|
APPLEII_MODEL = $6B
|
||||||
|
|
||||||
AY_REGISTERS = $70
|
AY_REGISTERS = $70
|
||||||
A_FINE_TONE = $70
|
A_FINE_TONE = $70
|
||||||
|
|
Loading…
Reference in New Issue
Block a user