Pārlūkot izejas kodu

MOS CIA Interrupt control/mask mechanics in place.

master
Bryan Miller pirms 5 gadiem
vecāks
revīzija
9abb5bcf4e
1 mainītis faili ar 21 papildinājumiem un 1 dzēšanām
  1. +21
    -1
      src/MOSCIA.js

+ 21
- 1
src/MOSCIA.js Parādīt failu

@@ -58,6 +58,9 @@ function TimerATick(cia){
cia.__CTA = BITM.clear(cia.__CTA, 0);
}

// Setting the interrupt bit for timer A
cia.__IC = BITM.set(cia.__IC, 0);

// Check to see if timer modifies the PORT B bit 6.
// If so, determine if it's a pulse or an toggle.
if (BITM.isOn(cia.__CTA, 1))
@@ -83,6 +86,8 @@ function TimerBTick(cia){
cia.__CTB = BITM.clear(cia.__CTB, 0);
}

cia.__IC = BITM.set(cia.__IC, 1);

if (BITM.isOn(cia.__CTB, 1))
cia.__PDB = (BITM.isOn(cia.__CTB, 2) === 0) ? BITM.set(cia.__PDB, 7) : BITM.toggle(cia.__PDB, 7);
}
@@ -102,7 +107,9 @@ class MOSCIA{

this.__CTA = 0;
this.__CTB = 0;

this.__IC = 0;
this.__ICMask = 0;

this.__timerA = 0;
this.__timerALatch = 0;
@@ -152,7 +159,9 @@ class MOSCIA{
case 0x0C: // Serial Data
break;
case 0x0D: // Interrupt Control
break;
let v = this.__IC;
this.__IC = 0;
return v; break;
case 0x0E: // Control Timer Reg A
val = this.__CTA; break;
case 0x0F: // Control Timer Reg B
@@ -210,6 +219,17 @@ class MOSCIA{
case 0x0C: // Serial Data
break;
case 0x0D: // Interrupt Control
if (BITM.isOn(d & 0xFF, 7)){
for (let i=0; i < 5; i++){
if (BITM.isOn(d & 0xFF, i))
this.__ICMask = BITM.set(this.__ICMask, i);
}
} else {
for (let i=0; i < 5; i++){
if (BITM.isOn(d & 0xFF, i))
this.__ICMask = BITM.clear(this.__ICMask, i);
}
}
break;
case 0x0E: // Control Timer Reg A
this.__CTA = d & 0xFF;

Notiek ielāde…
Atcelt
Saglabāt