1
0
mirror of https://github.com/rzzzwilson/pymlac.git synced 2025-06-10 09:32:41 +00:00

Fiddling with DEIM/DSTS interia:wqctions

This commit is contained in:
Ross Wilson
2018-08-05 15:00:23 +07:00
parent 253ec3eeff
commit 1bd60ca4ac
5 changed files with 247 additions and 213 deletions

View File

@@ -24,40 +24,40 @@ loop dsn ; wait until display is off
;-------------------------------
dsub
dhvc ;
; dsts 0 ;
; dlxa 004 ;
; dlya 0500 ;
; djms dlist0 ;
; dsts 1 ;
; dlxa 0004 ;
; dlya 0400 ;
; djms dlist1 ;
; dsts 2 ;
; dlxa 0004 ;
; dlya 0300 ;
; djms dlist2 ;
; dsts 3 ;
; dlxa 0004 ;
; dlya 0200 ;
; djms dlist3 ;
; dsts 0 ;
; dlxa 0004 ;
; dlya 0100 ;
; djms dlist4 ;
dsts 1 ;
dlxa 020 ;
dlya 0500 ;
djms dlist0 ;
dlxa 020 ;
dlya 0400 ;
djms dlist1 ;
dlxa 020 ;
dlya 0300 ;
djms dlist2 ;
dlxa 020 ;
dlya 0200 ;
djms dlist3 ;
dsts 1 ;
dlxa 004 ;
dlya 0500 ;
djms dlist0 ;
dsts 1 ;
dlxa 0004 ;
dlya 0400 ;
djms dlist1 ;
dsts 2 ;
dlxa 0004 ;
dlya 0300 ;
djms dlist2 ;
dsts 3 ;
dlxa 0004 ;
dlya 0200 ;
djms dlist3 ;
dsts 0 ;
dlxa 0004 ;
dlya 0100 ;
djms dlist4 ;
;
; dsts 1 ;
; dlxa 020 ;
; dlya 0500 ;
; djms dlist0 ;
; dlxa 020 ;
; dlya 0400 ;
; djms dlist1 ;
; dlxa 020 ;
; dlya 0300 ;
; djms dlist2 ;
; dlxa 020 ;
; dlya 0200 ;
; djms dlist3 ;
; dlxa 020 ;
; dlya 0100 ;
; djms dlist4 ;
@@ -119,6 +119,18 @@ dlist0 ;
djms dot ; .
djms slash ; /
drjm ;
dlistX ;
djms zero ; 0
djms one ; 1
djms two ; 2
djms three ; 3
djms four ; 4
djms five ; 5
djms six ; 6
djms seven ; 7
djms eight ; 8
djms nine ; 9
drjm ;
dlist1 ;
djms zero ; 0
djms one ; 1

View File

@@ -26,7 +26,7 @@ static WORD r_AC;
static WORD r_L;
static WORD r_PC;
static WORD Prev_r_PC;
static WORD r_DS; /* data switches */
static WORD r_DS; /* data switches */
/* 40Hz sync stuff */
static bool Sync40HzOn = false;
@@ -70,9 +70,9 @@ cpu_eff_address(WORD address, bool indirect)
/******************************************************************************
Description : Function to start the main CPU.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
void
cpu_start(void)
@@ -83,9 +83,9 @@ cpu_start(void)
/******************************************************************************
Description : Function to stop the main CPU.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
void
cpu_stop(void)
@@ -96,9 +96,9 @@ cpu_stop(void)
/******************************************************************************
Description : Functions to get various registers and states.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
WORD
cpu_get_AC(void)
@@ -177,16 +177,16 @@ cpu_set_DS(WORD new_ds)
/******************************************************************************
Description : Function to handle unrecognized instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static void
illegal(void)
{
WORD oldPC = Prev_r_PC & MEMMASK;
/* memdump(LogOut, oldPC - 8, 16); */
// memdump(LogOut, oldPC - 8, 16);
error("INTERNAL ERROR: "
"unexpected main processor opcode %06.6o at address %06.6o",
@@ -198,7 +198,7 @@ illegal(void)
Description : Emulate the IMLAC LAW/LWC instructions.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Load AC with immediate value.
******************************************************************************/
static int
@@ -226,7 +226,7 @@ i_LAW_LWC(bool indirect, WORD address)
Description : Emulate the JMP instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : PC set to new address.
******************************************************************************/
static int
@@ -249,7 +249,7 @@ i_JMP(bool indirect, WORD address)
Description : Emulate the DAC instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Deposit AC in MEM.
******************************************************************************/
static int
@@ -272,7 +272,7 @@ i_DAC(bool indirect, WORD address)
Description : Emulate the IMLAC XAM instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Exchange AC with MEM.
******************************************************************************/
static int
@@ -297,7 +297,7 @@ i_XAM(bool indirect, WORD address)
Description : Emulate the ISZ instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Increment MEM and skip if MEM == 0.
******************************************************************************/
static int
@@ -325,7 +325,7 @@ i_ISZ(bool indirect, WORD address)
Description : Emulate the IMLAC JMS instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Store PC in MEM, jump to MEM + 1.
******************************************************************************/
static int
@@ -349,7 +349,7 @@ i_JMS(bool indirect, WORD address)
Description : Emulate the IMLAC AND instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : AND MEM with AC.
******************************************************************************/
static int
@@ -372,7 +372,7 @@ i_AND(bool indirect, WORD address)
Description : Emulate the IMLAC IOR instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Inclusive OR MEM with AC.
******************************************************************************/
static int
@@ -395,7 +395,7 @@ i_IOR(bool indirect, WORD address)
Description : Emulate the IMLAC XOR instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : XOR AC and MEM. LINK unchanged.
******************************************************************************/
static int
@@ -418,7 +418,7 @@ i_XOR(bool indirect, WORD address)
Description : Emulate the IMLAC LAC instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Load AC from MEM.
******************************************************************************/
static int
@@ -441,7 +441,7 @@ i_LAC(bool indirect, WORD address)
Description : Emulate the ADD instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Add value at MEM to AC.
******************************************************************************/
static int
@@ -469,7 +469,7 @@ i_ADD(bool indirect, WORD address)
Description : Emulate the IMLAC SUB instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Subtract MEM from AC. LINK complemented if carry.
******************************************************************************/
static int
@@ -498,7 +498,7 @@ i_SUB(bool indirect, WORD address)
Description : Emulate the IMLAC SAM instruction.
Parameters : indirect - TRUE if address is indirect, FALSE if immediate
: address - the memory address
Returns :
Returns :
Comments : Skip if AC same as MEM.
******************************************************************************/
static int
@@ -520,13 +520,13 @@ i_SAM(bool indirect, WORD address)
/******************************************************************************
Description : Decode the 'microcode' instructions.
Parameters : instruction - the complete instruction word
Returns :
Comments :
Returns :
Comments :
******************************************************************************/
static int
microcode(WORD instruction)
{
char trace_cpu_msg[20]; /* little buffer for opcode */
char trace_cpu_msg[20]; /* little buffer for opcode */
/* T1 */
if (instruction & 001)
@@ -584,10 +584,10 @@ microcode(WORD instruction)
{
/* bit 0 is clear, it's HLT */
cpu_on = false;
if (trace_cpu_msg[0] != 0)
strcat(trace_cpu_msg, "+HLT");
else
strcat(trace_cpu_msg, "HLT");
if (trace_cpu_msg[0] != 0)
strcat(trace_cpu_msg, "+HLT");
else
strcat(trace_cpu_msg, "HLT");
}
strcat(trace_cpu_msg, " ");
@@ -599,8 +599,8 @@ microcode(WORD instruction)
/******************************************************************************
Description : Emulate the DSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if display is ON.
******************************************************************************/
static int
@@ -617,8 +617,8 @@ i_DSF(void)
/******************************************************************************
Description : Emulate the IMLAC HRB instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Read PTR value into AC.
: If PTR motor off return 0.
: If PTR motor on return byte from file.
@@ -636,8 +636,8 @@ i_HRB(void)
/******************************************************************************
Description : Emulate the DSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if display is OFF.
******************************************************************************/
static int
@@ -654,8 +654,8 @@ i_DSN(void)
/******************************************************************************
Description : Emulate the IMLAC HSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if PTR has data.
Comments : No data until cycle counter >= 'char ready' number.
******************************************************************************/
@@ -673,8 +673,8 @@ i_HSF(void)
/******************************************************************************
Description : Emulate the IMLAC HSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if PTR has no data.
: There is no data until cycle counter >= 'char ready' number.
******************************************************************************/
@@ -692,8 +692,8 @@ i_HSN(void)
/******************************************************************************
Description : Emulate the IMLAC KCF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Clear the keyboard flag.
******************************************************************************/
static int
@@ -709,8 +709,8 @@ i_KCF(void)
/******************************************************************************
Description : Emulate the IMLAC KRB instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Read a character from the keyboard into bits 5-15 of AC.
******************************************************************************/
static int
@@ -726,8 +726,8 @@ i_KRB(void)
/******************************************************************************
Description : Emulate the IMLAC KRC instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Combine the KCF and KRB instruction: Read keyboard and clear flag.
******************************************************************************/
static int
@@ -744,8 +744,8 @@ i_KRC(void)
/******************************************************************************
Description : Emulate the IMLAC KSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if keyboard char available.
******************************************************************************/
static int
@@ -762,8 +762,8 @@ i_KSF(void)
/******************************************************************************
Description : Emulate the IMLAC KSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if no keyboard char available.
******************************************************************************/
static int
@@ -780,8 +780,8 @@ i_KSN(void)
/******************************************************************************
Description : Emulate the IMLAC PPC instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Punch AC low byte to tape.
******************************************************************************/
static int
@@ -797,8 +797,8 @@ i_PPC(void)
/******************************************************************************
Description : Emulate the IMLAC PSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if PTP ready.
******************************************************************************/
static int
@@ -816,7 +816,7 @@ i_PSF(void)
/******************************************************************************
Description : Emulate the IMLAC RAL instruction.
Parameters : shift - the number of bits to shift by [1,3]
Returns :
Returns :
Comments : Rotate AC+L left 'shift' bits.
******************************************************************************/
static int
@@ -839,7 +839,7 @@ i_RAL(int shift)
/******************************************************************************
Description : Emulate the RAR instruction.
Parameters : shift - number of bits to rotate [1,3]
Returns :
Returns :
Comments : Rotate right AC+L 'shift' bits.
******************************************************************************/
static int
@@ -861,8 +861,8 @@ i_RAR(int shift)
/******************************************************************************
Description : Emulate the IMLAC RCF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Clear the TTY buffer flag.
******************************************************************************/
static int
@@ -878,8 +878,8 @@ i_RCF(void)
/******************************************************************************
Description : Emulate the IMLAC RRB instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Read a character from the TTY into bits 5-15 of AC.
******************************************************************************/
static int
@@ -895,8 +895,8 @@ i_RRB(void)
/******************************************************************************
Description : Emulate the IMLAC RRC instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Read a character from the TTY and clear buffer flag.
******************************************************************************/
static int
@@ -913,8 +913,8 @@ i_RRC(void)
/******************************************************************************
Description : Emulate the IMLAC RSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if TTY char available.
******************************************************************************/
static int
@@ -931,8 +931,8 @@ i_RSF(void)
/******************************************************************************
Description : Emulate the IMLAC RSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if no TTY char available.
******************************************************************************/
static int
@@ -950,7 +950,7 @@ i_RSN(void)
/******************************************************************************
Description : Emulate the IMLAC SAL instruction.
Parameters : shift - the number of bits to shift by
Returns :
Returns :
Comments : Shift AC left n places. LINK unchanged.
******************************************************************************/
static int
@@ -970,7 +970,7 @@ i_SAL(int shift)
/******************************************************************************
Description : Emulate the IMLAC SAR instruction.
Parameters : shift - the number of bits to shift by
Returns :
Returns :
Comments : Shift AC right n places.
******************************************************************************/
static int
@@ -991,8 +991,8 @@ i_SAR(int shift)
/******************************************************************************
Description : Emulate the IMLAC SSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if 40Hz sync flip-flop is set.
******************************************************************************/
static int
@@ -1009,8 +1009,8 @@ i_SSF(void)
/******************************************************************************
Description : Emulate the IMLAC SSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if 40Hz sync flip-flop is NOT set.
******************************************************************************/
static int
@@ -1027,8 +1027,8 @@ i_SSN(void)
/******************************************************************************
Description : Emulate the IMLAC TCF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Reset the TTY "output done" flag.
******************************************************************************/
static int
@@ -1044,8 +1044,8 @@ i_TCF(void)
/******************************************************************************
Description : Emulate the IMLAC TPC instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Transmit char in AC and clear TTY ready flag
******************************************************************************/
static int
@@ -1062,8 +1062,8 @@ i_TPC(void)
/******************************************************************************
Description : Emulate the IMLAC TPR instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Send low byte in AC to TTY output.
******************************************************************************/
static int
@@ -1079,8 +1079,8 @@ i_TPR(void)
/******************************************************************************
Description : Emulate the IMLAC TSF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if TTY done sending
******************************************************************************/
static int
@@ -1097,8 +1097,8 @@ i_TSF(void)
/******************************************************************************
Description : Emulate the IMLAC TSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if TTY not done sending
******************************************************************************/
static int
@@ -1115,8 +1115,8 @@ i_TSN(void)
/******************************************************************************
Description : Emulate the ASZ instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if AC == 0.
******************************************************************************/
static int
@@ -1133,8 +1133,8 @@ i_ASZ(void)
/******************************************************************************
Description : Emulate the ASN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if AC != 0.
******************************************************************************/
static int
@@ -1151,8 +1151,8 @@ i_ASN(void)
/******************************************************************************
Description : Emulate the IMLAC ASP instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if AC is positive.
******************************************************************************/
static int
@@ -1169,8 +1169,8 @@ i_ASP(void)
/******************************************************************************
Description : Emulate the LSZ instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if LINK is zero.
******************************************************************************/
static int
@@ -1187,8 +1187,8 @@ i_LSZ(void)
/******************************************************************************
Description : Emulate the LSN instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if LINK isn't zero.
******************************************************************************/
static int
@@ -1205,8 +1205,8 @@ i_LSN(void)
/******************************************************************************
Description : Emulate the IMLAC ASM instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Skip if AC is negative.
******************************************************************************/
static int
@@ -1223,8 +1223,8 @@ i_ASM(void)
/******************************************************************************
Description : Emulate the IMLAC DLA instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Load display CPU with a new PC.
******************************************************************************/
static int
@@ -1240,8 +1240,8 @@ i_DLA(void)
/******************************************************************************
Description : Emulate the IMLAC CTB instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Load display CPU with a new PC.
******************************************************************************/
static int
@@ -1255,8 +1255,8 @@ i_CTB(void)
/******************************************************************************
Description : Emulate the IMLAC DOF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Turn the display processor off.
******************************************************************************/
static int
@@ -1272,8 +1272,8 @@ i_DOF(void)
/******************************************************************************
Description : Emulate the IMLAC DON instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Turn the display processor on.
******************************************************************************/
static int
@@ -1290,8 +1290,8 @@ i_DON(void)
/******************************************************************************
Description : Emulate the IMLAC HOF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Turn the PTR off.
******************************************************************************/
static int
@@ -1307,8 +1307,8 @@ i_HOF(void)
/******************************************************************************
Description : Emulate the IMLAC HON instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Turn the PTR on.
******************************************************************************/
static int
@@ -1324,9 +1324,9 @@ i_HON(void)
/******************************************************************************
Description : Emulate the IMLAC STB instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_STB(void)
@@ -1339,8 +1339,8 @@ i_STB(void)
/******************************************************************************
Description : Emulate the IMLAC SCF instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Clear the 40Hz "sync" flag.
******************************************************************************/
static int
@@ -1356,9 +1356,9 @@ i_SCF(void)
/******************************************************************************
Description : Emulate the IMLAC IOS instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOS(void)
@@ -1371,9 +1371,9 @@ i_IOS(void)
/******************************************************************************
Description : Emulate the IMLAC IOT101 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT101(void)
@@ -1386,9 +1386,9 @@ i_IOT101(void)
/******************************************************************************
Description : Emulate the IMLAC IOT111 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT111(void)
@@ -1400,9 +1400,9 @@ i_IOT111(void)
/******************************************************************************
Description : Emulate the IMLAC i_IOT131 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT131(void)
@@ -1415,9 +1415,9 @@ i_IOT131(void)
/******************************************************************************
Description : Emulate the IMLAC i_IOT132 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT132(void)
@@ -1430,9 +1430,9 @@ i_IOT132(void)
/******************************************************************************
Description : Emulate the IMLAC IOT134 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT134(void)
@@ -1445,9 +1445,9 @@ i_IOT134(void)
/******************************************************************************
Description : Emulate the IMLAC IOT141 instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOT141(void)
@@ -1460,9 +1460,9 @@ i_IOT141(void)
/******************************************************************************
Description : Emulate the IMLAC IOF instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_IOF(void)
@@ -1475,9 +1475,9 @@ i_IOF(void)
/******************************************************************************
Description : Emulate the IMLAC ION instruction.
Parameters :
Returns :
Comments :
Parameters :
Returns :
Comments :
******************************************************************************/
static int
i_ION(void)
@@ -1491,8 +1491,8 @@ i_ION(void)
/******************************************************************************
Description : Further decode the initial '02' opcode instruction.
Parameters : instruction - the complete instruction word
Returns :
Comments :
Returns :
Comments :
******************************************************************************/
static int
page02(WORD instruction)
@@ -1517,17 +1517,18 @@ page02(WORD instruction)
case 0102200: return i_SSN();
case 0002400: return i_HSF();
case 0102400: return i_HSN();
default: illegal();
default:
illegal();
}
return 0; /* CAN'T REACH */
return 0; /* CAN'T REACH */
}
/******************************************************************************
Description : Further decode the initial '00' opcode instruction.
Parameters : instruction - the complete instruction word
Returns :
Comments :
Returns :
Comments :
******************************************************************************/
static int
page00(WORD instruction)
@@ -1589,17 +1590,18 @@ page00(WORD instruction)
case 003062: return i_SAR(2);
case 003063: return i_SAR(3);
case 003100: return i_DON();
default: illegal();
default:
illegal();
}
return 0; /* CAN'T REACH */
return 0; /* CAN'T REACH */
}
/******************************************************************************
Description : Function to execute one main processor instruction.
Parameters :
Returns :
Parameters :
Returns :
Comments : Perform initial decode of 5 bit opcode and either call
: appropriate emulating function or call further decode function.
******************************************************************************/
@@ -1640,9 +1642,9 @@ cpu_execute_one(void)
++r_PC;
r_PC = r_PC & MEMMASK;
indirect = (bool) (instruction & 0100000); /* high bit set? */
opcode = (instruction >> 11) & 017; /* high 5 bits */
address = instruction & 03777; /* low 11 bits */
indirect = (bool) (instruction & 0100000); /* high bit set? */
opcode = (instruction >> 11) & 017; /* high 5 bits */
address = instruction & 03777; /* low 11 bits */
/******
* Now decode it.
@@ -1666,8 +1668,9 @@ cpu_execute_one(void)
case 015: return i_ADD(indirect, address);
case 016: return i_SUB(indirect, address);
case 017: return i_SAM(indirect, address);
default: illegal();
default:
illegal();
}
return 0; /* CAN'T REACH */
return 0; /* CAN'T REACH */
}

View File

@@ -22,8 +22,8 @@
//#define LSBBITS 5
#define LSBBITS 4
#define MSBMASK 0x7f0
#define LSBMASK 0x0f
#define MSBMASK 0x7e0
#define LSBMASK 0x1f
// full 11 bits of display addressing
#define DMASK 03777
@@ -55,11 +55,15 @@ static WORD DRS[] = {0, 0, 0, 0, 0, 0, 0, 0}; // display CPU stack
static int DRSindex; //
static int DX; //
static int DY; //
static int DScale = 1; // display scale (1, 2, 4, 8)
int DIB = 0; // ????
static BYTE Mode = MODE_NORMAL; // DEIM mode
static bool Running = false; // true if display processor is running
// array for DTSTS scale inc values
static int DSTS_Inc[] = {1, 2, 4, 6}; // from p59 of Programming Guide
static int DSTS_Value = 1; // index into DSTS_Inc[] [0..3]
static int DSTS_Scale = 2; // actual inv value to use
static char DEIM_result[100]; // holds DEIM_decode() result
@@ -110,7 +114,7 @@ illegal(void)
WORD oldPC = Prev_DPC & MEMMASK;
error("INTERNAL ERROR: "
"unexpected main processor opcode %06.6o at address %06.6o",
"unexpected display processor opcode %06.6o at address %06.6o",
mem_get(oldPC, false), oldPC);
}
@@ -208,7 +212,7 @@ char *doDEIMByte(BYTE byte, bool last)
{
char *trace = DEIMdecode(byte);
vlog("doDEIMByte: DX=%04x, DY=%04x,", DX, DY);
vlog("doDEIMByte: before, DX=%04x, DY=%04x, DSTS_Scale=%d", DX, DY, DSTS_Scale);
if (byte & 0x80)
{
@@ -221,20 +225,20 @@ char *doDEIMByte(BYTE byte, bool last)
if (byte & 0x20) // get dx sign and move X
{
DX -= dx * DScale;
DX -= dx * DSTS_Scale;
}
else
{
DX += dx * DScale;
DX += dx * DSTS_Scale;
}
if (byte & 0x04) // get dy sign and move Y
{
DY -= dy * DScale;
DY -= dy * DSTS_Scale;
}
else
{
DY += dy * DScale;
DY += dy * DSTS_Scale;
}
// ensure dislay X/Y in limits
@@ -266,8 +270,9 @@ char *doDEIMByte(BYTE byte, bool last)
if (byte & 0x10) // inc X MSB
{
vlog("before inc X MSB, X=%04x", DX);
DX += (1 << LSBBITS);
vlog("before inc X MSB, X=%04x, (1 << LSBBITS) * DSTS_Scale=%04x", DX, (1 << LSBBITS) * DSTS_Scale);
DX += (1 << LSBBITS) * DSTS_Scale;
vlog("during inc X MSB, X=%04x", DX);
DX &= DMASK;
vlog(" after inc X MSB, X=%04x", DX);
}
@@ -282,7 +287,7 @@ char *doDEIMByte(BYTE byte, bool last)
if (byte & 0x02) // inc Y MSB
{
vlog("before inc Y MSB, Y=%04x", DY);
DY += (1 << LSBBITS);
DY += (1 << LSBBITS) * DSTS_Scale;
DY &= DMASK;
vlog(" after inc Y MSB, Y=%04x", DY);
}
@@ -295,6 +300,8 @@ char *doDEIMByte(BYTE byte, bool last)
}
}
vlog("doDEIMByte: after, DX=%04x, DY=%04x,", DX, DY);
return trace;
}
@@ -483,16 +490,16 @@ int i_DSTB(int block)
static
int i_DSTS(int scale)
{
if (scale == 0)
DScale = 1;
else if (scale == 1)
DScale = 2;
else if (scale == 2)
DScale = 4;
else if (scale == 3)
DScale = 8;
if (0 <= scale && scale <= 3)
{
DSTS_Value = scale;
DSTS_Scale = DSTS_Inc[scale];
vlog("i_DSTS: DSTS_Value=%d, DSTS_Scale=%d", DSTS_Value, DSTS_Scale);
}
else
{
illegal();
}
trace_dcpu("DSTS %d", scale);
return 1; // FIXME check # cycles used
}
@@ -534,7 +541,9 @@ int page00(WORD instruction)
else if (instruction == 006000) // DHVC
cycles = i_DHVC();
else
{
illegal();
}
return cycles;
}

View File

@@ -14,13 +14,14 @@ loop dsn ; wait until display is off
; Display list subroutine - show ASCII chars 'ABC'
;-------------------------------
dsub
dhvc ;
dsts 0 ;
dlxa 020 ;
dlya 0100 ;
djms upperf ; F
djms upperg ; G
djms upperh ; H
djms upperi ; I
djms upperj ; J
dhlt ;
;-------------------------------
upperf inc e,b03 ; F
@@ -40,5 +41,14 @@ upperh inc e,b03 ; H
inc y,b03 ;
inc 03,02 ;
inc y,f ;
upperi inc e,b30 ; I
inc 30,d-31 ;
inc b03,03 ;
inc d-31,b30 ;
inc 30,f ;
upperj inc e,d02 ; J
inc b2-2,20 ;
inc 22,03 ;
inc 03,f ;
;-------------------------------
end

View File

@@ -78,7 +78,7 @@ trace_start_line(void)
void
trace_end_line(void)
{
fprintf(trace_fp, "%11.6f|%06o: %-16s%-13s|%06o: %-18s%-s\n",
fprintf(trace_fp, "%11.6f |%06o: %-16s;%-15s|%06o: %-18s;%-s\n",
now, cpu_get_prev_PC(), CPU_trace, CPU_reg_trace,
dcpu_get_PC(), DCPU_trace, DCPU_reg_trace);
fflush(trace_fp);