mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-11 01:31:03 +00:00
Gace up and switch to interrupts
This commit is contained in:
parent
a28083c8e2
commit
11c1b032cb
@ -1,5 +1,6 @@
|
||||
const inbuff = $200
|
||||
const freemem = $0002
|
||||
const timerInc = $0006
|
||||
const iobuffer = $1C00
|
||||
const NMACROS = 7
|
||||
const FALSE = 0
|
||||
@ -152,8 +153,63 @@ asm psgWrite(pVIA, reg, val)#0
|
||||
RTS
|
||||
end
|
||||
//
|
||||
// MockingBoard IRQ handler
|
||||
//
|
||||
asm mbIRQ#0
|
||||
CLD
|
||||
BIT $C404 ; CLEAR IRQ
|
||||
INC $06 ; FLAG FOR PLASMA CODE
|
||||
CLC
|
||||
RTS
|
||||
end
|
||||
//
|
||||
// CALL PRODOS
|
||||
//
|
||||
asm syscall(cmd, params)
|
||||
SEI
|
||||
LDA ESTKL,X
|
||||
LDY ESTKH,X
|
||||
STA PARAMS
|
||||
STY PARAMS+1
|
||||
INX
|
||||
LDA ESTKL,X
|
||||
STA CMD
|
||||
JSR $BF00
|
||||
CMD: !BYTE 00
|
||||
PARAMS: !WORD 0000
|
||||
LDY #$00
|
||||
STA ESTKL,X
|
||||
STY ESTKH,X
|
||||
CLI
|
||||
RTS
|
||||
end
|
||||
//
|
||||
// Utility routines
|
||||
//
|
||||
asm getStatus#1
|
||||
PHP
|
||||
PLA
|
||||
DEX
|
||||
STA ESTKL,X
|
||||
LDA #$00
|
||||
STA ESTKH,X
|
||||
RTS
|
||||
end
|
||||
asm setStatus(stat)#0
|
||||
LDA ESTKL,X
|
||||
PHA
|
||||
PLP
|
||||
DEX
|
||||
RTS
|
||||
end
|
||||
asm disableInts#0
|
||||
SEI
|
||||
RTS
|
||||
end
|
||||
asm enableInts#0
|
||||
CLI
|
||||
RTS
|
||||
end
|
||||
asm putc#0
|
||||
LDA ESTKL,X
|
||||
INX
|
||||
@ -163,7 +219,6 @@ end
|
||||
def putln#0
|
||||
putc($0D)
|
||||
end
|
||||
|
||||
def puts(str)#0
|
||||
byte i
|
||||
|
||||
@ -213,6 +268,24 @@ end
|
||||
// return val
|
||||
//end
|
||||
//
|
||||
// MB interrupt install
|
||||
//
|
||||
def mbInstallIRQ#0
|
||||
byte params[4]
|
||||
|
||||
params.0 = 2
|
||||
params.1 = 1
|
||||
params:2 = @mbIRQ
|
||||
syscall($40, @params)
|
||||
end
|
||||
def mbUninstallIRQ#0
|
||||
byte params[2]
|
||||
|
||||
params.0 = 1
|
||||
params.1 = 1
|
||||
syscall($41, @params)
|
||||
end
|
||||
//
|
||||
// Search slots for MockingBoard
|
||||
//
|
||||
def mbTicklePSG(pVIA)
|
||||
@ -262,16 +335,6 @@ def mbSearch
|
||||
return 0
|
||||
end
|
||||
def psgSetup(pVIA)
|
||||
//
|
||||
// Set up the VIA1 (enulators only support Timer1 on first 6522)
|
||||
//
|
||||
if pVIA == mbVIA1
|
||||
pVIA->IER = $7F // Mask all interrupts
|
||||
pVIA=>T1L = $F9C2 // 16 Ints/sec
|
||||
pVIA=>T1C = $F9C2 // 16 Ints/sec
|
||||
pVIA->ACR = $40 // Continuos T1 interrupts
|
||||
pVIA->IFR = $40 // Clear interrupt
|
||||
fin
|
||||
psgWrite(pVIA, MIXER, $00) // Turn everything off
|
||||
psgWrite(pVIA, AENVAMP, $00)
|
||||
psgWrite(pVIA, BENVAMP, $00)
|
||||
@ -286,7 +349,7 @@ def psgSetup(pVIA)
|
||||
end
|
||||
def mbSequence(track)#0
|
||||
word seqEvent, seqTime, eventTime, updateTime, period, n
|
||||
byte numNotes, note, volume, channel, i, overflow
|
||||
byte numNotes, note, volume, channel, i, overflow, cpuFlags
|
||||
byte indexA[2], indexB[2], indexC[2]
|
||||
byte noteA[2], noteB[2], noteC[2]
|
||||
word notes1[MAX_CHAN_NOTES], notes2[MAX_CHAN_NOTES]
|
||||
@ -319,13 +382,28 @@ def mbSequence(track)#0
|
||||
//
|
||||
seqTime = 0
|
||||
seqEvent = track
|
||||
eventTime = seqTime + seqEvent->deltatime
|
||||
eventTime = seqEvent->deltatime
|
||||
updateTime = ARPEGGIO
|
||||
numNotes = 0
|
||||
overflow = 0
|
||||
//
|
||||
// Enable timer IRQ
|
||||
//
|
||||
cpuFlags = getStatus
|
||||
mbVIA1->IER = $7F // Mask all interrupts
|
||||
(@mbIRQ).3 = mbVIA1.1 // Relocate IRQ 6522 address
|
||||
^timerInc = 0 // Clear timer increment
|
||||
mbInstallIRQ
|
||||
mbVIA1->ACR = $40 // Continuos T1 interrupts
|
||||
mbVIA1=>T1L = $F9C2 // 16 Ints/sec
|
||||
mbVIA1=>T1C = $F9C2 // 16 Ints/sec
|
||||
mbVIA1->IFR = $40 // Clear interrupt
|
||||
mbVIA1->IER = $C0 // Enable Timer1 interrupt
|
||||
enableInts
|
||||
repeat
|
||||
//puts("seqTime = "); puti(seqTime); puts(" eventTime = "); puti(eventTime); putln
|
||||
while eventTime == seqTime
|
||||
if eventTime <= seqTime
|
||||
repeat
|
||||
note = seqEvent->percnote
|
||||
if note & $80
|
||||
//
|
||||
@ -404,9 +482,10 @@ def mbSequence(track)#0
|
||||
// Next event
|
||||
//
|
||||
seqEvent = seqEvent + t_event
|
||||
eventTime = seqTime + seqEvent->deltatime
|
||||
loop
|
||||
if updateTime == seqTime
|
||||
eventTime = eventTime + seqEvent->deltatime
|
||||
until seqEvent->deltatime
|
||||
fin
|
||||
if updateTime <= seqTime
|
||||
//
|
||||
// Time slice active note tables (arpeggio)
|
||||
//
|
||||
@ -469,15 +548,23 @@ def mbSequence(track)#0
|
||||
//
|
||||
// Increment time tick
|
||||
//
|
||||
seqTime++
|
||||
if updateTime < seqTime; updateTime = seqTime; fin
|
||||
while !(mbVIA1->IFR & $40) // Wait for T1 interrupt
|
||||
//seqTime++
|
||||
//if updateTime < seqTime; updateTime = seqTime; fin
|
||||
while !(^timerInc)
|
||||
//while !(mbVIA1->IFR & $40) // Wait for T1 interrupt
|
||||
if ^$C000 > 127; eventTime = -1; ^$C010; break; fin
|
||||
loop
|
||||
mbVIA1->IFR = $40 // Clear interrupt
|
||||
seqTime = seqTime + ^timerInc
|
||||
^timerInc = 0
|
||||
//mbVIA1->IFR = $40 // Clear interrupt
|
||||
until eventTime < 0
|
||||
psgWrite(mbVIA1, MIXER, $FF) // Turn everything off
|
||||
psgWrite(mbVIA1, AENVAMP, $00)
|
||||
psgWrite(mbVIA1, BENVAMP, $00)
|
||||
psgWrite(mbVIA1, CENVAMP, $00)
|
||||
mbVIA1->IER = $7F // Mask all interrupts
|
||||
setStatus(cpuFlags))
|
||||
mbUninstallIRQ
|
||||
if mbVIA2
|
||||
psgWrite(mbVIA2, MIXER, $FF)
|
||||
psgWrite(mbVIA2, CENVAMP, $00)
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user