AltairZ80: SIO: Support 32-bits for setFCBAddressCmd.
The M68K requires more than 16-bits for the FCB address. Expand to 32-bits.
This commit is contained in:
parent
87581b865f
commit
7cca92ce28
1 changed files with 32 additions and 4 deletions
|
@ -1768,19 +1768,45 @@ static int32 simh_out(const int32 port, const int32 data) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case setFCBAddressCmd:
|
case setFCBAddressCmd:
|
||||||
if (setFCBAddressPos == 0) {
|
/* SETFCBADDR command always takes four bytes:
|
||||||
|
* Byte Z80 8086 68000 32-Bit Address Space (future)
|
||||||
|
* ---- ----- ----- ----- -----------------------------
|
||||||
|
* 1 A7:0 A7:0 A7:0 A7:0
|
||||||
|
* 2 A15:8 A15:8 A15:8 A15:8
|
||||||
|
* 3 0 DS A23:16 A23:16
|
||||||
|
* 4 0 0 0 A31:24
|
||||||
|
* For 8086, the FCB address is updated by writing the fourth
|
||||||
|
* byte, using the offset A15:0 from the first two bytes and
|
||||||
|
* taking the segment from the CPU's DS register.
|
||||||
|
*/
|
||||||
|
switch (setFCBAddressPos) {
|
||||||
|
case 0: /* Address 7:0 */
|
||||||
FCBAddress = data;
|
FCBAddress = data;
|
||||||
setFCBAddressPos = 1;
|
setFCBAddressPos++;
|
||||||
}
|
break;
|
||||||
else {
|
case 1: /* Address 15:8 */
|
||||||
FCBAddress |= (data << 8);
|
FCBAddress |= (data << 8);
|
||||||
|
setFCBAddressPos++;
|
||||||
|
break;
|
||||||
|
case 2: /* Address 23:16 */
|
||||||
|
FCBAddress |= (data << 16);
|
||||||
|
setFCBAddressPos++;
|
||||||
|
break;
|
||||||
|
default: /* Address 31:24 */
|
||||||
if (chiptype == CHIP_TYPE_8086) {
|
if (chiptype == CHIP_TYPE_8086) {
|
||||||
|
/* Mask the offset to 16-bits and add in the segment from DS register. */
|
||||||
setViewRegisters();
|
setViewRegisters();
|
||||||
|
FCBAddress &= 0xFFFF;
|
||||||
FCBAddress += (DS_S << 4);
|
FCBAddress += (DS_S << 4);
|
||||||
sim_debug(CMD_MSG, &simh_device, "SIMH: " ADDRESS_FORMAT
|
sim_debug(CMD_MSG, &simh_device, "SIMH: " ADDRESS_FORMAT
|
||||||
" FCBAddress=0x%05x, DS=0x%04x\n", PCX, FCBAddress, DS_S);
|
" FCBAddress=0x%05x, DS=0x%04x\n", PCX, FCBAddress, DS_S);
|
||||||
|
} else {
|
||||||
|
FCBAddress |= (data << 24);
|
||||||
|
sim_debug(CMD_MSG, &simh_device, "SIMH: " ADDRESS_FORMAT
|
||||||
|
" FCBAddress=0x%08x\n", PCX, FCBAddress);
|
||||||
}
|
}
|
||||||
setFCBAddressPos = lastCommand = 0;
|
setFCBAddressPos = lastCommand = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1919,6 +1945,8 @@ static int32 simh_out(const int32 port, const int32 data) {
|
||||||
markTimeSP = 0;
|
markTimeSP = 0;
|
||||||
lastCommand = 0;
|
lastCommand = 0;
|
||||||
deleteNameList();
|
deleteNameList();
|
||||||
|
setFCBAddressPos = 0;
|
||||||
|
FCBAddress = CPM_FCB_ADDRESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case showTimerCmd: /* show time difference to timer on top of stack */
|
case showTimerCmd: /* show time difference to timer on top of stack */
|
||||||
|
|
Loading…
Add table
Reference in a new issue