1
0
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:
dschmenk 2017-10-23 15:03:40 -07:00
parent a28083c8e2
commit 11c1b032cb
2 changed files with 173 additions and 86 deletions

View File

@ -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.