| | function GameBoyAdvanceSIO() { |
| | this.SIO_NORMAL_8 = 0; |
| | this.SIO_NORMAL_32 = 1; |
| | this.SIO_MULTI = 2; |
| | this.SIO_UART = 3; |
| | this.SIO_GPIO = 8; |
| | this.SIO_JOYBUS = 12; |
| |
|
| | this.BAUD = [ 9600, 38400, 57600, 115200 ]; |
| | } |
| |
|
| | GameBoyAdvanceSIO.prototype.clear = function() { |
| | this.mode = this.SIO_GPIO; |
| | this.sd = false; |
| |
|
| | this.irq = false; |
| | this.multiplayer = { |
| | baud: 0, |
| | si: 0, |
| | id: 0, |
| | error: 0, |
| | busy: 0, |
| |
|
| | states: [ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF ] |
| | }; |
| |
|
| | this.linkLayer = null; |
| | }; |
| |
|
| | GameBoyAdvanceSIO.prototype.setMode = function(mode) { |
| | if (mode & 0x8) { |
| | mode &= 0xC; |
| | } else { |
| | mode &= 0x3; |
| | } |
| | this.mode = mode; |
| |
|
| | this.core.INFO('Setting SIO mode to ' + hex(mode, 1)); |
| | }; |
| |
|
| | GameBoyAdvanceSIO.prototype.writeRCNT = function(value) { |
| | if (this.mode != this.SIO_GPIO) { |
| | return; |
| | } |
| |
|
| | this.core.STUB('General purpose serial not supported'); |
| | }; |
| |
|
| | GameBoyAdvanceSIO.prototype.writeSIOCNT = function(value) { |
| | switch (this.mode) { |
| | case this.SIO_NORMAL_8: |
| | this.core.STUB('8-bit transfer unsupported'); |
| | break; |
| | case this.SIO_NORMAL_32: |
| | this.core.STUB('32-bit transfer unsupported'); |
| | break; |
| | case this.SIO_MULTI: |
| | this.multiplayer.baud = value & 0x0003; |
| | if (this.linkLayer) { |
| | this.linkLayer.setBaud(this.BAUD[this.multiplayer.baud]); |
| | } |
| |
|
| | if (!this.multiplayer.si) { |
| | this.multiplayer.busy = value & 0x0080; |
| | if (this.linkLayer && this.multiplayer.busy) { |
| | this.linkLayer.startMultiplayerTransfer(); |
| | } |
| | } |
| | this.irq = value & 0x4000; |
| | break; |
| | case this.SIO_UART: |
| | this.core.STUB('UART unsupported'); |
| | break; |
| | case this.SIO_GPIO: |
| | |
| | break; |
| | case this.SIO_JOYBUS: |
| | this.core.STUB('JOY BUS unsupported'); |
| | break; |
| | } |
| | }; |
| |
|
| | GameBoyAdvanceSIO.prototype.readSIOCNT = function() { |
| | var value = (this.mode << 12) & 0xFFFF; |
| | switch (this.mode) { |
| | case this.SIO_NORMAL_8: |
| | this.core.STUB('8-bit transfer unsupported'); |
| | break; |
| | case this.SIO_NORMAL_32: |
| | this.core.STUB('32-bit transfer unsupported'); |
| | break; |
| | case this.SIO_MULTI: |
| | value |= this.multiplayer.baud; |
| | value |= this.multiplayer.si; |
| | value |= (!!this.sd) << 3; |
| | value |= this.multiplayer.id << 4; |
| | value |= this.multiplayer.error; |
| | value |= this.multiplayer.busy; |
| | value |= (!!this.multiplayer.irq) << 14; |
| | break; |
| | case this.SIO_UART: |
| | this.core.STUB('UART unsupported'); |
| | break; |
| | case this.SIO_GPIO: |
| | |
| | break; |
| | case this.SIO_JOYBUS: |
| | this.core.STUB('JOY BUS unsupported'); |
| | break; |
| | } |
| | return value; |
| | }; |
| |
|
| | GameBoyAdvanceSIO.prototype.read = function(slot) { |
| | switch (this.mode) { |
| | case this.SIO_NORMAL_32: |
| | this.core.STUB('32-bit transfer unsupported'); |
| | break; |
| | case this.SIO_MULTI: |
| | return this.multiplayer.states[slot]; |
| | case this.SIO_UART: |
| | this.core.STUB('UART unsupported'); |
| | break; |
| | default: |
| | this.core.WARN('Reading from transfer register in unsupported mode'); |
| | break; |
| | } |
| | return 0; |
| | }; |
| |
|