Skip to content

Commit

Permalink
This Apple: Detect Passport MIDI card
Browse files Browse the repository at this point in the history
  • Loading branch information
inexorabletash committed Dec 1, 2024
1 parent 9e95bc1 commit a45abdc
Show file tree
Hide file tree
Showing 12 changed files with 186 additions and 0 deletions.
1 change: 1 addition & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Project Page: https://github.com/a2stuff/a2d
* About This Apple II
* Detect Microdigital TK-3000 //e
* Detect Pravetz 8A/C
* Detect Passport MIDI card
* Show duplicate SmartPort device names with counts.
* Screen Dump
* Improve use of SSC and IW2.
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.da
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Z-80 SoftCard"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.de
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Z-80 SoftCard"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.en
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Z-80 SoftCard"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.es
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Tarjeta Z-80"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.fr
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Carte Z-80"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.it
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Scheda Z-80"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.nl
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Z-80 SoftCard"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.pt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Placa Z-80"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
1 change: 1 addition & 0 deletions desk.acc/res/this.apple.res.sv
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.define res_string_card_type_mockingboard "Mockingboard"
.define res_string_card_type_z80 "Z-80 Kort"
.define res_string_card_type_uthernet2 "Uthernet II"
.define res_string_card_type_passport "Passport MIDI"
.define res_string_card_type_lcmeve "Le Chat Mauve Eve"
.define res_string_card_type_vidhd "VidHD"
.define res_string_card_type_grappler "Grappler Parallel Printer Card"
Expand Down
105 changes: 105 additions & 0 deletions desk.acc/this.apple.s
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,7 @@ str_network: PASCAL_STRING res_string_card_type_network
str_mockingboard: PASCAL_STRING res_string_card_type_mockingboard
str_z80: PASCAL_STRING res_string_card_type_z80
str_uthernet2: PASCAL_STRING res_string_card_type_uthernet2
str_passport: PASCAL_STRING res_string_card_type_passport
str_lcmeve: PASCAL_STRING res_string_card_type_lcmeve
str_vidhd: PASCAL_STRING res_string_card_type_vidhd
str_grappler: PASCAL_STRING res_string_card_type_grappler
Expand Down Expand Up @@ -1656,6 +1657,11 @@ sigtable_booti: .byte 3, $07, $3C, $0B, $B0, $0C, $01
bcc :+
return16 #str_uthernet2
:

param_call WithInterruptsDisabled, DetectPassportMIDI
bcc :+
return16 #str_passport
:
clc
rts
.endproc ; ProbeSlotNoFirmware
Expand Down Expand Up @@ -1793,6 +1799,105 @@ fail: clc
rts
.endproc ; DetectUthernet2

;;; Detect Passport MIDI Card
;;; Assumes $06 points at $Cn00, returns carry set if found

.proc DetectPassportMIDI
.include "../inc/passport_midi.inc"

;; Set up `read` and `write` subroutines
lda $07 ; A = $Cn
asl
asl
asl
asl ; A = $n0
clc
adc #$80
sta read_lo
sta write_lo

;; ----------------------------------------
;; Initialize 6840 PTM timers

kOpFlags = kInternalClock | kCounterSingle16Bit | kModeSingleShot | kInterruptsDisabled
kMSBPattern1 = %10101010
kLSBPattern1 = %11001001
kMSBPattern2 = %01010101
kLSBPattern2 = %00110110

;; Reset and hold timers
lda #(kOpFlags | 1) ; give write access to CR#1
ldx #kOffsetWriteCR2
jsr write
lda #(kOpFlags | 1) ; timers hold (reset)
ldx #kOffsetWriteCR13
jsr write

;; ----------------------------------------
;; Write to both Timer 1 and Timer 2

;; Write to MSB Buffer
lda #kMSBPattern1
ldx #kOffsetWriteMSBBuffer
jsr write
;; Write to Timer 1 LSB
lda #kLSBPattern1
ldx #kOffsetWriteTimer1LSB
jsr write
;; Write to MSB Buffer
lda #kMSBPattern2
ldx #kOffsetWriteMSBBuffer
jsr write
;; Write to Timer 2 LSB
lda #kLSBPattern2
ldx #kOffsetWriteTimer2LSB
jsr write

;; ----------------------------------------
;; Read back and verify

;; Read Timer 1 MSB
ldx #kOffsetReadTimer1MSB
jsr read
cmp #kMSBPattern1
bne fail
;; Read LSB Buffer
ldx #kOffsetReadLSBBuffer
jsr read
cmp #kLSBPattern1
bne fail
;; Read Timer 2 MSB
ldx #kOffsetReadTimer2MSB
jsr read
cmp #kMSBPattern2
bne fail
;; Read LSB Buffer
ldx #kOffsetReadLSBBuffer
jsr read
cmp #kLSBPattern2
bne fail

;; Probe successful
success:
sec
rts

fail: clc
rts

;; ----------------------------------------
;; LDX offset / JSR read / A = value
read_lo := *+1
read: lda $C080,x ; self-modified to $C0n0
rts

;; ----------------------------------------
;; LDA value / LDX offset / JSR write
write_lo := *+1
write: sta $C080,x ; self-modified to $C0n0
rts
.endproc ; DetectPassportMIDI

.include "../lib/detect_mockingboard.s"
.include "../lib/detect_thecricket.s"

Expand Down
71 changes: 71 additions & 0 deletions inc/passport_midi.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
;;; ============================================================
;;;
;;; Passport MIDI Card -
;;;
;;; ============================================================

;;; Based on the MIDI Interface User's Manual

;;; Motorola MC6840 Programmable Timer Module (PTM)

;;; CR#n = Control Register (1..3)
;;; MSB Buffer = a shared write register to hold MSB
;;; LSB Buffer = a shared read register to hold LSB
;;;
;;; To write to a timer: write to MSB Buffer then Timer LSB
;;; To read a timer: read Timer MSB then LSB Buffer

;;; I/O Addresses (n = slot + 8, e.g. $C0A0 = slot 2)
;;;
;;; Address Write Read
;;; ------- ------------------ ----------
;;; $C0n0 CR#2=0: write CR#3 No-op
;;; $C0n0 CR#2=1: write CR#1 No-op
;;; $C0n1 write CR#2 read Status Register
;;; $C0n2 write MSB Buffer read Timer 1 MSB
;;; $C0n3 write Timer 1 LSB read LSB Buffer
;;; $C0n4 write MSB Buffer read Timer 2 MSB
;;; $C0n5 write Timer 2 LSB read LSB Buffer
;;; $C0n6 write MSB Buffer read Timer 3 MSB
;;; $C0n7 write Timer 3 LSB read LSB Buffer

kOffsetWriteCR13 = 0 ; CR#2 bit 0 selects
kOffsetWriteCR2 = 1
kOffsetWriteMSBBuffer = 2 ; or 4 or 6
kOffsetWriteTimer1LSB = 3
kOffsetWriteTimer2LSB = 5
kOffsetWriteTimer3LSB = 7

kOffsetReadSR = 1
kOffsetReadTimer1MSB = 2
kOffsetReadLSBBuffer = 3 ; or 5 or 7
kOffsetReadTimer2MSB = 4
kOffsetReadTimer3MSB = 6

;;; Control Registers
;;;
;;; bit 0:
;;; Register 1: 0 = timers operate; 1 = timers hold (reset)
;;; Register 2: 0 = control register #3; 1 = control register #1
;;; Register 3: 0 = timer 3 not prescaled; 1 = prescaled (div by 8)
;;;
;;; %76543210
kExternalClock = %00000000 ; bit 1 = 0: external clock src
kInternalClock = %00000010 ; bit 1 = 1: internal clock src
kCounterSingle16Bit = %00000000 ; bit 2 = 0: 16-bit mode
kCounterDual8Bit = %00000100 ; bit 2 = 1: dual 8-bit mode
kModeContinuous = %00000000 ; bits 3-5
kModeSingleShot = %00100000
kModeFrequencyCompare = %00001000
kModePulseWidthCompare = %00011000
kInterruptsDisabled = %00000000 ; bit 6 = 0: interrupts disabled
kInterruptsEnabled = %01000000 ; bit 6 = 1: interrupts enabled
;;; bit 7: unused

;;; Status Register
;;;
;;; bit 0 = Timer 1 interrupt flag
;;; bit 1 = Timer 2 interrupt flag
;;; bit 2 = Timer 3 interrupt flag
;;; bits 3-6 unused
;;; bit 7 = Any interrupt flag set (and interrupts enabled)

0 comments on commit a45abdc

Please sign in to comment.