|
|
@@ -1,3 +1,4 @@ |
|
|
|
const IO = require('./common/io.js'); |
|
|
|
const BCD = require('./utils/bcd.js'); |
|
|
|
const BITM = require('./utils/bitman.js'); |
|
|
|
|
|
|
@@ -143,6 +144,7 @@ function Tick(cia){ |
|
|
|
|
|
|
|
class MOSCIA{ |
|
|
|
constructor(){ |
|
|
|
this.__io = new IO(["PDA", "PDB"], ["PDA", "PDB"]); |
|
|
|
this.__regsel = 0; |
|
|
|
this.__RW = 0; |
|
|
|
|
|
|
@@ -186,13 +188,15 @@ class MOSCIA{ |
|
|
|
let val = 0; |
|
|
|
switch(this.__regsel){ |
|
|
|
case 0x00: // Peripheral Data A |
|
|
|
break; |
|
|
|
this.__io.triggerRead("PDA", this.__DDA); |
|
|
|
val = this.__PDA; break; |
|
|
|
case 0x01: // Peripheral Data B |
|
|
|
break; |
|
|
|
this.__io.triggerRead("PDB", this.__DDB); |
|
|
|
val = this.__PDB; break; |
|
|
|
case 0x02: // Data Direction Reg A |
|
|
|
break; |
|
|
|
val = this.__DDA; break; |
|
|
|
case 0x03: // Data Direction Reg B |
|
|
|
break; |
|
|
|
val = this.__DDB; break; |
|
|
|
case 0x04: // Timer A Low |
|
|
|
val = (this.__timerA & 0x00FF); break; |
|
|
|
case 0x05: // Timer A High |
|
|
@@ -230,12 +234,18 @@ class MOSCIA{ |
|
|
|
let tod = 0; |
|
|
|
switch(this.__regsel){ |
|
|
|
case 0x00: // Peripheral Data A |
|
|
|
this.__io.triggerWrite("PDA", this.__PDA, d & 0xFF); |
|
|
|
this.__PDA = (this.__PDA & (~this.__DDA)) | ((d & 0xFF) & this.__DDA); |
|
|
|
break; |
|
|
|
case 0x01: // Peripheral Data B |
|
|
|
this.__io.triggerWrite("PDB", this.__PDB, d & 0xFF); |
|
|
|
this.__PDB = (this.__PDB & (~this.__DDB)) | ((d & 0xFF) & this.__DDB); |
|
|
|
break; |
|
|
|
case 0x02: // Data Direction Reg A |
|
|
|
this.__DDA = d & 0xFF; |
|
|
|
break; |
|
|
|
case 0x03: // Data Direction Reg B |
|
|
|
this.__DDB = d & 0xFF; |
|
|
|
break; |
|
|
|
case 0x04: // Timer A Low |
|
|
|
this.__timerALatch = (this.__timerALatch & 0xFF00) | (d & 0xFF); |
|
|
@@ -324,6 +334,25 @@ class MOSCIA{ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
onRead(name, fn){ |
|
|
|
this.__io.onRead(name, fn); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
onWrite(name, fn){ |
|
|
|
this.__io.onWrite(name, fn); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
setPDA(v){ |
|
|
|
this.__PDA = (this.__PDA & this.__DDA) | ((v & 0xFF) & (~this.__DDA)); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
setPDB(v){ |
|
|
|
this.__PDB = (this.__PDB & this.__DDB) | ((v & 0xFF) & (~this.__DDB)); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
reset(){ |
|
|
|
this.__CNT = 0; |
|
|
@@ -350,6 +379,7 @@ class MOSCIA{ |
|
|
|
this.__TOD = [0,0,0,0]; |
|
|
|
this.__LTOD = [0,0,0,0]; |
|
|
|
this.__ALTOD = [0,0,0,0]; |
|
|
|
return this; |
|
|
|
} |
|
|
|
} |
|
|
|
|