IMD 1.16: 1/09/2008 10:57:02 84-93150-01 a0 f15001 oak simulator diskette #1 1of4  ž ž @0‚|†ø)€€ªv1½®u¦o) ˆ " ž}‚jÿA ¢cœžùž¼žõ–èì Mˆ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IOS4 €MÁúD5791001111004D1791002094405 791002094405(F15001 VOLOAK SIMULATOR DISKETTE # 1   ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’Ižùž¼žõ–èì Mˆ@†jæjg€ÿígÿèÂg@ †o G€ÿò`úkžŽ¾òž½¢_„C# b# ž}€BŸ€ žuÒ[¾ä žüž]e‡ †JÂR¾¬æîi¾ðÀˆÆCp@€„†=€…†<€††;€ƒ †GÂ9P@ G€ÿÂÆ<à‰¾•NÆéP¾èâÖèCHùC €ˆC ˜GÈTºà€qEžæ‚â¢(ŸÈž¤ *Ž¦Â C¦ ¦ÎŸxÆžë @0DAJ÷LÆ)À€ªè1½" ¦ † i¾¦€„œ+â  fžG¾øÞóžC)3žÝ `joBˆB¾ I,Ÿv ¾ °¾ €B¾ I,ŸmžÈ ž @¬E°E¨F¤F)¤D¾^ÄE‚‚„Fž& †ÈæjHÿÆÂÆÂ@pÆO¾ÂŸv g€ÿ9gÿ6ò]X¾] P¢hâV+ì„s=è„胾cž‹Æ_†N‚¡ ž…žòªGž’†›¾ÁžØ¾ø ¦•“@AúLèSÃ)"$ C ž‰žmžøª3žïŠ1žjŠ/ž žhÿöÿÿ ‚ p ž…âv¾R†Ÿw ÞpÞpžwâ‚p¾ Þkâižº† ’ŸÂ¢œ€15 !¦^æ\žd ²X‚ žˆò %€À'+ò²NŸs愾Qâ‚)žs ‡EÞDŸ|Ÿ{ @ž$ ož¶ Ož¯ mž­ Jž« Kž© iž¸ gž¶†. žV tž²žì„sFè„n`" FàEžD)ž ¾E`¾CnrgŸy ¾w"¾NÞž{žR¾q1¾HÞ ž}žL¾2`¾0t¾žG¾- ²B¾c ¾(Þ>Þ=Þ<žy¦:ž;¾!ž9¾ü¾/ž5OS:: SYSž¦ž%iüþŒþ‹Âxþ‹þŠÂwc Bc A@6<# þIc B# ÞhIþjHÀc r‡c ·š‡™Þ˜T¶# @0‚X†ß)P €€ªU1½®R¦‹pI þP@6 included) 00  NOP 1 * 01 NOT 1 * 02 AND 1 * 03 OR 1 *  04 XOR 1 * 05 INC 1 * 06 DEC 1 * 07 NEG 1  * 08 ADD 1 * 09 SUB 1 * 0A CMP 1 * 0B MULT  1 MODIFIED FROM SPEC.... M[S-1] * M[S--] -> M[S] RETURNS WITH 32-BIT RESULT IN T0. 0C DIV 1 - 0D DEL 1 * 0E DUP 1  * 0F DUPD 1 * 10 EXCW 1 * 11 EXCD 1 * 12 ZERO 1 * 13 ONE 1 * 14 ONES 1 * 15 SXTB 1 * 16 SXTH 1 * 17 SXTW 1 * 18 SAR 1 * 19 SHR 1 * 1A  SHL 1 * 1B ROR 1 * 1C ROL 1 * 1D CIRC 1 * 1E ADDC 1 * 1F EXCWD 1 * 20 EXCDW 1 * 21 - -  - 22 - - - 23 - - - 24 - - - 25 -  - - 26 - - - 27 - - - 28 - - - 29  SCMP 1 * 2A MOVE 1 * 2B TXLT 1 * 2C SRCH 1 *  2D ENQ 1 * 2E RQE 1 * 2F DEQ 1 * 30 LDSI B 1  * 31 LDSI H 1 * 32 LDSI W 1 * 33 LDSI D 1 * 34-35 FORI  2,3 * 36-37 FORD 2,3 * 38-39 ENTR 2,3 * 3A-3B EXIT 2,3 * 3C  SGNL 1 * 3D WAIT 1 * 3E TRAP 2 Modified from spec (see SECTION 2 for description) 3F LCXT 1 * 40 STSI B 1 * 41 STSI H 1 * 42 STSI W 1 * 43 STSI D 1 * 44-46 LDI 2,3,5 * 47 WCS 2 - 48-49 ADDI 2,3 * 4A-4B SUBI 2,3 * 4C-4D CMPI 2,3 * 4E-4F RESS 2,3 * 50-51 RELS 2,3 * 52-53 EXT 1,2 * 54-55 INS 1,2 * 56 JSI 1 * 57 CASE 2 * 58-5A LDPA 2,3,5 * 5B SPIN 1 * 5C-5D EXTS 1,2 * 5E - - - 5F 2X INSTS. 2X - 60-61 BPL 2,3 * 62-63 BMI  2,3 * 64-65 BNE 2,3 * 66-67 BEQ 2,3 * 68-69 BNO 2,3 * 6A-6B  BOV 2,3 * 6C-6D BNC 2,3 * 6E-6F BCY 2,3 * 70-71 BGT 2,3 *  72-73 BLE 2,3 * 74-75 BGE 2,3 * 76-77 BLT 2,3 * 78-79 BHI 2,3  * 7A-7B BLS 2,3 * 7C-7D JMP 2,3 * 7E-7F JAL 2,3 * 80-8F LDL  1A,2,3 * 90-9F STL 1A,2,3 * A0-AF ZRL 1A,2,3 * B0-BF INL 1A,2,3 * C0-C1  LDG 2,3 * C2-C3 STG 2,3 * C4-C5 LDGD 2,3 * C6-C7 STGD 2,3 *  C8-C9 LDLA 2,3 * CA-CB LDGA 2,3 * CC-CD LDLD 2,3 * CE-CF STLD 2,3  * D0-D1 LDGX B 2,3 * D2-D3 LDGX H 2,3 * D4-D5 LDGX W 2,3 * D6-D7 LDGX D  2,3 * D8-D9 STGX B 2,3 * DA-DB STGX H 2,3 * DC-DD STGX W 2,3 * DE-DF STGX D 2,3 * E0-E1 LDLI B 2,3 * E2-E3 LDLI H 2,3 * E4-E5 LDLI W 2,3 * E6-E7 LDLI D 2,3 * E8-E9 STLI B 2,3 * EA-EB STLI H 2,3 * EC-ED STLI W 2,3  * EE-EF STLI D 2,3 * F0-F1 LDLX B 2,3 * F2-F3 LDLX H 2,3 * F4-F5 LDLX W 2,3 * F6-F7 LDLX D 2,3 * F8-F9 STLX B 2,3 * FA-FB STLX H 2,3 * FC-FD STLX W 2,3 * FE-FF STLX D 2,3 * 2X INSTRUCTIONS 5F00 CDI 2X - 5F01 CFI  2X - 5F02 CID 2X - 5F03 CIF 2X - 5F04 DADD 2X - 5F05  DCMP 2X - 5F06 DSUB 2X - 5F07 FADD 2X - 5F08 FCMP 2X -  5F09 FDIV 2X - 5F0A FMULT 2X - 5F0B FSUB 2X - \ \ GLOBAL DATA \ dcl ...[2] dbl init (0,0,0), ! REMOVES TRASH FROM T1,T2, & T3 ! if S=0 (display only). MEMORY[MAX_MEM] univ dbl, INST_PIPE univ dbl, GLOBAL_PTR univ dbl init (0),  CNTX_PTR univ dbl, LOW_STACK univ dbl init (0), HIGH_STACK univ dbl init (0),  PSW univ structure (CLOCK word init (RESET), ! Virtual Clock I_BIT bit init (RESET), ! Interrupt Enable G_BIT bit init (RESET), ! Group Int. Enable U_BIT bit init (RESET), ! User Mode S_BIT bit init (RESET), ! Virtual System Mode T_BIT bit init (RESET), ! Trace Trap  H_BIT bit init (RESET), ! Halt State W_BIT bit init (RESET), ! Writable  ! Control ! Store SPARE1 bit init (RESET), ! Spare  SPARE2 bit init (RESET), ! Spare D_BIT bit init (RESET), ! Decimal Overflow  ! Trap Mask E_BIT bit init (RESET), ! Exponent Underflow   ! Trap Mask F_BIT bit init (RESET), ! Floating Point  ! Overflow Trap Mask ZERO bit init (RESET), NEGATIVE bit init (RESET), CARRY bit init (RESET), OVERFLOW bit init (RESET) ), STACK_PTR univ dbl init (0), FRAME_PTR univ dbl init (0), PROGRAM_PTR univ dbl init (0), ! byte address INST_REG univ byte,  OPERAND univ dbl, PIPE_PTR univ dbl, STATUS univ word, SRCE_ADDR  univ dbl, SRCE_LNGTH univ dbl, DEST_ADDR univ dbl, DEST_LNGTH univ dbl, BUF[80] univ byte init (0), GEN[35] univ dbl init (X:FFFFFFFF), COMMAND1 univ word, COMMAND2 univ word, PAR[4] univ dbl, PARAMS univ word, TERM_CHR univ word, SEPARATOR univ word, OPCODE [ X:F ] univ word init (@DCODE_00,@DCODE_10,@DCODE_20,  @DCODE_30,@DCODE_40,@DCODE_50,@DCODE_BRANCH, @DCODE_BRANCH,@DCODE_LDL,@DCODE_LDL,@DCODE_LDL,  @DCODE_LDL,@DCODE_C0,@DCODE_D0,@DCODE_E0, @DCODE_F0), WORD1 univ dbl, WORD2 univ dbl, WORD3 univ dbl, PTR1 univ word, PTR2  univ word, \ FLAGS \ INTS_PEND univ word init (FALSE), UMT univ word init (FALSE), DONE univ word init (FALSE), HALTED univ word init (FALSE), HITS  univ dbl init (0), MEM_READS univ dbl init (0), MEM_REFS_NO_HIT univ dbl init (0), PROG_FETCH_CNT univ dbl init (0), INST_FETCH_CNT univ dbl init (0), I_PIPE_LOADS univ dbl init (0), MEM_WRITES univ dbl init (0), BYTE_FLAG univ word init (1), HALF univ word init (2),  BIT_FLAG univ word init (TRUE), WORD_FLAG univ word init (0), READ_FG univ word init (0), SGNL_WAIT univ word init (FALSE), WRITE_FG univ word init (X:FFFF); %EJECT; \ MAIN PROCEDURE \ ENABLE INTERRUPTS; BEGINIO(); WRITEF(S_OUT,"^NL Oak Simulator (A0) ^NL ^EOS"); PTR1 = 0; loop; MEMORY[PTR1] = 0; PTR1 = * + 1; break if PTR1 > MAX_MEM; repeat; PTR1 = 0; loop; GEN[PTR1] = -1; PTR1 = * + 1; break if PTR1 = 36; repeat; MONITOR(); GIVE_STATUS(); WRITEF(S_OUT,"^NL --END-- O A K S I M U L A T O R ^NL ^EOS"); DISABLE INTERRUPTS; ENDIO(); %EJECT; \ F E T C H -- 1. Increments PROG_FETCH_CNT. 2. If PROGRAM_PTR points to a new word then INST_PIPE is loaded and I_PIPE_LOADS is incremented. 3. Returns the byte specified by the PROGRAM_PTR. 4. Increments the PROGRAM_PTR. \ proc FETCH univ   returns (byte); dcl PIPE_BYTE byte, FETCH_PTR dbl, TEMP_PIPE dbl; if PROGRAM_PTR slr 2 > MAX_MEM or PROGRAM_PTR slr 2 < 0 then WRITEF(S_OUT,"^nl MEMORY EXCEPTION (fetch) ^eos"); HALTED = TRUE; fi; PROG_FETCH_CNT = * + 1; FETCH_PTR = PROGRAM_PTR slr 2;  if PIPE_PTR # FETCH_PTR then PIPE_PTR = FETCH_PTR; INST_PIPE = READ_DATA(FETCH_PTR,WORD_FLAG); I_PIPE_LOADS = * + 1; fi; PIPE_BYTE = 3 - (PROGRAM_PTR & X:3) * 8; if PIPE_BYTE = 8 then TEMP_PIPE = INST_PIPE slr 8; elif PIPE_BYTE = 16 then TEMP_PIPE = INST_PIPE slr 16;  elif PIPE_BYTE = 24 then TEMP_PIPE = INST_PIPE slr 24; else TEMP_PIPE = INST_PIPE; fi;  PIPE_BYTE = (TEMP_PIPE sll 24) slr 24; PROGRAM_PTR = * + 1; return (PIPE_BYTE); end FETCH; %EJECT; \ G I V E _ S T A T U S -- All Simulator Counters are printed on the Standard Output in decimal format. \ proc GIVE_STATUS univ; WRITEF(S_OUT,"^NL TOTAL MEMORY READS = %4D ^EOS", MEM_READS); WRITEF(S_OUT,"^NL READS W/O CACHE HITS = %4D ^EOS", MEM_REFS_NO_HIT); WRITEF(S_OUT,"^NL CACHE HITS ON READS = %4D ^EOS",HITS); WRITEF(S_OUT,"^NL PROGRAM FETCHES (BYTES)= %4D ^EOS", PROG_FETCH_CNT); WRITEF(S_OUT,"^NL INSTRUCTIONS FETCHED = %4D ^EOS", INST_FETCH_CNT); WRITEF(S_OUT,"^NL INSTRUCTION PIPE LOADED %4D TIMES ^EOS", I_PIPE_LOADS); WRITEF(S_OUT,"^NL TOTAL MEMORY WRITES = %4D ^NL ^EOS", MEM_WRITES); end GIVE_STATUS; %EJECT; \ S E M A P H O R E \ proc SEMAPHORE UNIV; end SEMAPHORE; \ S P E C I F I C A T I O N -- Checks for a Specification  Exception, notifies the user of such, and sets HALTED to TRUE for  return to the Monitor. \ proc SPECIFICATION (ADDR,FLAG) univ; dcl ADDR dbl, FLAG word;  if FLAG = BYTE_FLAG then ADDR = * sll 29; elif FLAG = HALF then ADDR = * sll 28; elif FLAG = WORD_FLAG  then ADDR = * sll 27; fi; if ADDR > 0 then HALTED = TRUE; WRITEF(S_OUT,"^nl SPECIFICATION EXCEPTION ^eos"); fi; end SPECIFICATION; %EJECT; \ T R A N S L A T E -- This routine will translate the  logical-address into a physical- address. (PRESENTLY - NOT - OPERATIVE)  INPUT - logical-address RETURNS - physical-address \ proc TRANSLATE(POINTER) UNIV returns (dbl); dcl POINTER dbl; return (POINTER); end TRANSLATE; \ C A C H E -- 1. INPUT - a. Physical-address b. Address of Data to be cached. c. Read or Write flag. 2. OUTPUT - Flag specifing whether a hit occured. 3. OPERATION ON READS:   a. (PRESENTLY - NOT - OPERATIVE) If address is cached, then data  is taken from the cache and loaded into DATA_ADDR, and TRUE is returned.  b. If address is not cached, then FALSE is returned. 4. OPERATION ON WRITES: a. (PRESENTLY - NOT - OPERATIVE) \ proc CACHE(ADDRESS,DATA_ADDR,RD_WT) UNIV returns (word);  dcl NO_HIT word, ADDRESS dbl, DATA_ADDR dbl, RD_WT word; NO_HIT = FALSE; return (NO_HIT); end CACHE; %EJECT; \ Z E R O _ N E G -- Sets the ZERO & NEGATIVE  Status flags according to the data given as input. \ proc ZERO_NEG (DATA) univ ;  dcl DATA dbl; PSW.NEGATIVE = RESET; PSW.ZERO = RESET; if DATA = 0 then PSW.ZERO = SET;  elif DATA < 0 then PSW.NEGATIVE = SET; fi; end ZERO_NEG; \ S E T _ F L A G S -- INPUT - A,B are operands. FLAG specifies ADDITION, SUBTRACTION or COMPARE functions. If ADD or SUB, then all flags are adjusted. If COMPARE, only ZERO & CARRY are adjusted. \ proc SET_FLAGS (A,B,FLAG) univ; dcl A,B,R dbl, FLAG word; if FLAG # COMPARE then PSW.OVERFLOW = RESET; fi; PSW.CARRY = RESET; if FLAG = ADD then R = A + B; if A > 0 and B < 0 and R >= 0 then PSW.CARRY = SET; elif A < 0 and B > 0 and R >= 0 then PSW.CARRY = SET; elif A < 0 and B < 0 and R < 0 then PSW.CARRY = SET; elif A > 0 and B > 0 and R < 0 then PSW.OVERFLOW = SET; elif A < 0 and B < 0 and R >= 0 then PSW.CARRY = SET; PSW.OVERFLOW = SET; fi; else R = A - B; if A > 0 and B > 0 and R >= 0 then PSW.CARRY = SET; elif A > 0 and B = 0 then PSW.CARRY = SET; elif A = 0 and B = 0 then PSW.CARRY = SET; elif A < 0 and B > 0 and R > 0 then PSW.CARRY = SET;  if FLAG = SUB then PSW.OVERFLOW = SET; fi; elif A < 0 and B >= 0 and R < 0 then PSW.CARRY = SET; elif A < 0 and B < 0 and R >= 0 then PSW.CARRY = SET; elif A >= 0 and B < 0 AND R < 0 and FLAG = SUB then PSW.OVERFLOW = SET; fi; fi; if FLAG = COMPARE then if  R = 0 then PSW.ZERO = SET; else PSW.ZERO = RESET; fi; else ZERO_NEG (R); fi; end SET_FLAGS; %EJECT; \ R E A D _ D A T A -- INPUT - POINTER - Logical address of data to  be read. TYPE - Data type & address type:  BIT, BYTE ,HALF_WORD, or WORD. RETURNS - Data as specified by TYPE parameter.  OPERATION: 1. The word pointed to by POINTER is   read (either from MEMORY or the CACHE). 2. If TYPE = WORD then word read in (1) is returned. 3. If TYPE # WORD then the bit or byte or half-word is extracted from the word read, right justified in a word, and then returned. \ proc READ_DATA(POINTER,TYPE) UNIV returns (dbl);  dcl STACK_WORD dbl, POINTER dbl, CACHED word, DATA dbl,  TYPE word, TEMP word, PHYSICAL_ADDRESS dbl; if TYPE = BYTE_FLAG  then TEMP = POINTER sll 30 slr 30 + 1; POINTER = POINTER slr 2; elif TYPE = HALF  then TEMP = POINTER sll 31 slr 31 + 5; POINTER = POINTER slr 1; elif TYPE = BIT_FLAG  then TEMP = POINTER sll 27 slr 27; TEMP = ~ TEMP; POINTER = POINTER slr 5;  else TEMP = 0; fi; if POINTER < 0 or POINTER > MAX_MEM then WRITEF(S_OUT,"^nl MEMORY EXCEPTION (read) ^eos"); HALTED = TRUE; fi; PHYSICAL_ADDRESS = TRANSLATE(POINTER);  MEM_READS = * + 1; CACHED = CACHE(PHYSICAL_ADDRESS,@DATA,READ_FG); if CACHED = TRUE then STACK_WORD = DATA; HITS = * + 1; else STACK_WORD = MEMORY [PHYSICAL_ADDRESS]; MEM_REFS_NO_HIT = * + 1; CACHED = CACHE(PHYSICAL_ADDRESS,@STACK_WORD,WRITE_FG); fi; if TEMP = 1  then STACK_WORD = STACK_WORD slr 24; elif TEMP = 2 then STACK_WORD = (STACK_WORD sll 8) slr 24;; elif TEMP = 3 then STACK_WORD = (STACK_WORD sll 16) slr 24; elif TEMP = 4  then STACK_WORD = (STACK_WORD sll 24) slr 24; elif TEMP = 5 then STACK_WORD = STACK_WORD slr 16;  elif TEMP = 6 then STACK_WORD = (STACK_WORD sll 16) slr 16; elif TEMP < 0 then TEMP = ~ TEMP; STACK_WORD = ( STACK_WORD sll TEMP ) slr 31; fi; return (STACK_WORD); end READ_DATA; %eject; \ W R I T E _ D A T A -- INPUT - POINTER - Logical address pointing  to the location in which to write the DATA.  TYPE - Specifies the data & address type to be used.  DATA - The data that is to be written (right-justified).  OPERATION: 1. TYPE # WORD a) The word addressed by the pointer is read from memory or the cache.  b) The bit, byte, or half-word to be replaced in the word is   deleted. c) The data to be written is then  combined with the memory data. d) The new word is then placed back  into memory and the cache. 2. TYPE = WORD DATA is written into both the memory and the cache. \ proc WRITE_DATA (POINTER,TYPE,DATA)  UNIV ; dcl POINTER dbl, DATA dbl, TYPE word, TEMP word, PHYSICAL_ADDRESS dbl, READ_TEMP dbl, DUMMY dbl, CACHED word, PTR1 dbl; if TYPE = BYTE_FLAG then TEMP = POINTER sll 30 slr 30 + 1;  PTR1 = POINTER slr 2; DATA = DATA sll 24; elif TYPE = HALF then TEMP = POINTER sll 31 slr 31 + 5; PTR1 = POINTER slr 1; DATA = DATA sll 16; elif TYPE = BIT_FLAG then TEMP = POINTER sll 27 slr 27; TEMP = ~ TEMP; PTR1 = POINTER slr 5; DATA = * sll 31; else TEMP = 0; PTR1 = POINTER; fi;  if PTR1 < 0 or PTR1 > MAX_MEM then WRITEF(S_OUT,"^nl MEMORY EXCEPTION (write) ^eos"); HALTED = TRUE; fi; PHYSICAL_ADDRESS = TRANSLATE (PTR1) ; CACHED = CACHE (PHYSICAL_ADDRESS,@DUMMY,READ_FG) ; if TEMP # 0 then READ_TEMP = READ_DATA(PHYSICAL_ADDRESS,WORD_FLAG); fi; if TEMP = 1 then READ_TEMP = (READ_TEMP sll 8) slr 8; elif TEMP = 2 then DATA = DATA slr 8;  DUMMY = (READ_TEMP slr 24) sll 24; READ_TEMP = (READ_TEMP sll 16) slr 16;  READ_TEMP = READ_TEMP | DUMMY; elif TEMP = 3 then DATA = DATA slr 16; DUMMY = (READ_TEMP slr 16) sll 16; READ_TEMP = (READ_TEMP sll 24) slr 24; READ_TEMP = READ_TEMP | DUMMY; elif TEMP = 4 then DATA = DATA slr 24; READ_TEMP = (READ_TEMP slr 8) sll 8; elif TEMP = 5 then READ_TEMP = (READ_TEMP sll 16) slr 16; elif TEMP = 6 then DATA = DATA slr 16; READ_TEMP = (READ_TEMP slr 16) sll 16; elif TEMP < 0 then TEMP = ~ TEMP; READ_TEMP = (READ_TEMP rotl TEMP) sll 1 slr 1; DATA = (DATA | READ_TEMP) rotr TEMP; READ_TEMP = 0; else READ_TEMP = 0; fi; DATA = DATA | READ_TEMP ;  if CACHED = TRUE then CACHED = CACHE(PHYSICAL_ADDRESS,@DATA,WRITE_FG); fi; MEMORY [PHYSICAL_ADDRESS] = DATA ; MEM_WRITES = * + 1 ; end WRITE_DATA ; %EJECT; \ L O A D E R -- This loader will load only binary programs that have been assembled using the OS4 MACRO assembler with OAK.MAC as   the definition file, and then link edited with the OS4 LINK editor. \ proc LOADER UNIV; dcl FLAG word, ! Initially set false, but set True ! after Pointers have been loaded. CHR word, ! The Type-Code presently being processed. I word, ! I -- Dummy counter for READB use only. CNT word, ! First 2 bytes following ! the Type-Code.  ADDR word, ! Pointer to Memory LOAD_MEM[] based byte; PROGRAM_PTR = 0; ADDR = @MEMORY; loop; WRITEF(S_OUT,"^NL PROGRAM TO LOAD? ^NL ^NL ^EOS"); GET_LINE(); break if OPEN(BUF,"INPUT^eos")= PASS and BUF[0] # 0; WRITEF(S_OUT,"^NL *** SYNTAX ERROR *** ^EOS"); repeat; FLAG = FALSE; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! The first TYPE-CODE read must be the LSI-4 'BEGIN' type-code. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GETBY("INPUT^EOS",@CHR); if CHR # X:18 then WRITEF(S_OUT,"^nl Illegal File Accessed ^eos"); WRITEF(S_OUT,"^nl Program not loaded ^nl ^eos"); CLOSE ("INPUT^eos"); return; else READB("INPUT^eos",@BUF,2,@I); fi; loop; GETBY("INPUT^eos",@CHR); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process TYPE-CODES :6F, :4F, and :6D. ! where :6F = List Segment Attributes ! :4F = List Segment Names (list location counters). !  :6D = Note Record !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if CHR = X:6F or CHR = X:4F or CHR = X:6D then GETBY("INPUT^EOS",@CNT); READB("INPUT^EOS",@BUF,CNT,@I); elif CHR # X:6F and CHR # X:4F and CHR # X:6D and CHR # X:40 then READB("INPUT^EOS",@CNT,2,@I); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process the first Origin, Relative TYPE-CODE. ! This first TC= :5 contains the initial values for the ! Global_ptr, Frame_ptr, Stack_ptr, and both ends of the stack. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if CHR = 5 and CNT = 0 and FLAG = FALSE then STATUS = READB("INPUT^EOS",@BUF,13,@I); GLOBAL_PTR=(BUF[3] sll 8|BUF[4]) slr 2; FRAME_PTR=(BUF[5] sll 8|BUF[6]) slr 2; STACK_PTR=(BUF[7] SLL 8 | BUF[8]) SLR 2;  LOW_STACK=(BUF[9] SLL 8|BUF[10]) SLR 2; HIGH_STACK=(BUF[11] SLL 8|BUF[12]) SLR 2;  FLAG = TRUE; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process all other ORIGIN TYPE-CODE here (TC = :4 or :5). ! :4 = Origin, absolute ! :5 = Origin, relative !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elif CHR = 4 or (CHR = 5 and FLAG = TRUE ) then PROGRAM_PTR = CNT; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process all DATA TYPE-CODES here (TC = :6 or  :7). ! :6 = Data Here, absolute ! :7 = Data Here, relative !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elif CHR = 6 or CHR = 7 then loop; GETBY("INPUT^EOS",@I); GETBY("INPUT^EOS",@I); ADDR->LOAD_MEM[PROGRAM_PTR] = I; PROGRAM_PTR = * + 1; CNT = * - 1; break if CNT = 0; repeat; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process TYPE-CODE :8 (Reserve & Fill) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elif CHR = 8  then GETBY("INPUT^EOS",@I); GETBY("INPUT^EOS",@I);  loop; ADDR->LOAD_MEM[PROGRAM_PTR] = I; CNT = * - 1;  PROGRAM_PTR = * + 1; break if CNT = 0;  repeat; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process TYPE-CODE :9 (Byte Address Constant). !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elif CHR = 9 then GETBY("INPUT^EOS",@I); GETBY("INPUT^EOS",@I); ADDR->LOAD_MEM[PROGRAM_PTR] = I; PROGRAM_PTR = * + 1; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Process End Program TYPE-CODES (TC = :2 or :3). ! :2 = End Program, absolute ! :3 = End Program, relative !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! elif CHR = 2 or CHR = 3 then PROGRAM_PTR = CNT; break; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! All other Type-Codes come here for error processing. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else WRITEF(S_OUT,"^nl Bad Type Code Found^nl^eos"); CLOSE ("INPUT^eos"); return; fi; fi; if PROGRAM_PTR slr 2 > MAX_MEM then  WRITEF(S_OUT,"^NL MEMORY LIMIT EXCEEDED ^EOS"); WRITEF(S_OUT,"^NL PROGRAM NOT LOADED ^NL ^EOS");  PROGRAM_PTR = 0; CLOSE ("INPUT^eos"); return; fi; repeat; CLOSE ("INPUT^eos"); WRITEF(S_OUT,"^nL Binary Target Program loaded ^nl ^eos"); end LOADER; %EJECT; \ G E T _ L I N E -- This routine reads one line (up to 80 characters) from the crt.  It allows for single or multiple back- spaces. It allows for entire line replacement (i.e. ^bs followed by ^cr). Fills remainder of input line with X:00. ^cr is not entered into the input buffer. \ proc GET_LINE univ; dcl K word, CHR by  te, LSTCHR byte; CHR = 0; K = -1; loop; if K<-1 then K=-1; fi; K = * + 1; break if K > 79; LSTCHR = CHR; CHR = GETCRT(); if CHR = '^bs' then K = * - 2; elif CHR = '^cr' then if LSTCHR = '^bs'  then K = -1; PUTCRT(ERASELINE); else break; fi; else BUF[K] = MAP_LETTER(CHR); fi; repeat; loop; if K > 79 then return; else BUF[K] = 0; K = * + 1; fi; \ O A K S I M U L A T O R LISTING # 8 4 - 9 3 1 5 0 - 1 1 A 0 S E C T I O N # 2 CONTENTS:  DECODE DCODE_00 DCODE_10 DCODE_20 DCODE_30 DCODE_40  DCODE_50 BAD_OPCODE SRCH SCMP MOVE_BYTES TXLT  GET_2_3_OPERAND GET_1_2_OPERAND SIGN_EXTEND_OP_2_3 \ %EJECT; segment OAKSIM2; ! SIMULATOR SEGMENT 2 OAKSIM2.ALM proc READ_DATA external returns (dbl); proc WRITE_DATA external; proc ZERO_NEG external; proc SET_FLAGS external; proc FETCH external returns (byte); proc MONITOR external; proc WRITEF external; proc GETCRT  external returns (word); proc PUTCRT external; proc SEMAPHORE external; proc SPECIFICATION external; %sub TRUE  = "-1"; %sub FALSE = "0"; %sub ADD = "1"; %sub COMPARE = "2"; %sub SUB = "0"; %sub S_IN = "5"; %sub S_OUT = "6"; %SUB ERASESCREEN = "X:0C"; %SUB ERASELINE = "X:1D"; %SUB SET = "1"; %SUB RESET = "0"; %SUB MAX_MEM = "4095"; \ GLOBAL DATA \ dcl GLOBAL_PTR external dbl, STACK_PTR external dbl,  FRAME_PTR external dbl, PROGRAM_PTR external dbl, INST_REG external byte, OPERAND external dbl, SRCE_ADDR external dbl, SRCE_LNGTH external dbl, DEST_ADDR external dbl, DEST_LNGTH external dbl, OPCODE [ X:F]  external word, CNTX_PTR external dbl, WORD1 external dbl, WORD2  external dbl, WORD3 external dbl, PTR1 external word, PTR2  external word, PSW external structure (CLOCK word, ! Virtual Clock  I_BIT bit, ! Interrupt Enable G_BIT bit, ! Group Int. Enable  U_BIT bit, ! User Mode S_BIT bit, ! Virtual System Mode  T_BIT bit, ! Trace Trap H_BIT bit, ! Halt State W_BIT  bit, ! Writable ! Control  ! Store SPARE1 bit, ! Spare SPARE2 bit, ! Spare  D_BIT bit, ! Decimal Overflow ! Trap Mask   E_BIT bit, ! Exponent Underflow ! Trap Mask  F_BIT bit, ! Floating Point ! Overflow Trap Mask ZERO bit, NEGATIVE bit, CARRY bit,  OVERFLOW bit), \ FLAGS \ BYTE_FLAG external word, BIT_FLAG external word, HALTED external word, HALF external word, WORD_FLAG external word, UMT external word, SGNL_WAIT external word; %EJECT; \ D E C O D E \ proc DECODE UNIV; OPCODE [INST_REG SLR 4] (); if SGNL_WAIT = TRUE then SEMAPHORE(); fi; end DECODE; proc DCODE_00 univ; ! NOP if INST_REG = 0 then PROGRAM_PTR = * ; ! NOT elif INST_REG = 1  then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD1 = ~ WORD1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! AND elif INST_REG = 2 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG);  WORD1 = WORD1 & WORD3; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! OR elif INST_REG = 3 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); WORD1 = WORD1 | WORD3;  WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! XOR elif INST_REG = 4  then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); WORD1 = WORD1 xor WORD3; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! INC elif INST_REG = 5 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS (WORD1,1,ADD); WORD1 = WORD1 + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! DEC elif INST_REG = 6 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG);  SET_FLAGS (WORD1,1,SUB); WORD1 = WORD1 - 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! NEG elif INST_REG = 7 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS (0,WORD1,SUB); WORD1 = - WORD1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! ADD  elif INST_REG = 8 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1;  WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS (WORD1,WORD3,ADD); WORD1 = WORD1 + WORD3; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! SUB elif INST_REG = 9 then   WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS (WORD3,WORD1,SUB); WORD1 = WORD3 - WORD1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! CMP elif INST_REG = X:A then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS (WORD3,WORD1,SUB); STACK_PTR = * - 1; ! MULT elif INST_REG = X:0B then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(STACK_PTR-1,WORD_FLAG); WORD3 = WORD1*WORD2; STACK_PTR = * - 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); ZERO_NEG(WORD3); ! DEL elif INST_REG = X:0D then STACK_PTR = * - 1; ! DUP elif INST_REG = X:0E then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! DUPD elif INST_REG = X:0F then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-1,WORD_FLAG); STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); else BAD_OPCODE(); fi; end DCODE_00; %EJECT; proc DCODE_10 univ; ! EXCW if INST_REG = X:10 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-1,WORD_FLAG);  WRITE_DATA(STACK_PTR-1,WORD_FLAG,WORD1); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); ! EXCD  elif INST_REG = X:11 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-2,WORD_FLAG); WRITE_DATA(STACK_PTR-2,WORD_FLAG,WORD1); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); WORD1 = READ_DATA(STACK_PTR-1,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-3,WORD_FLAG); WRITE_DATA(STACK_PTR-3,WORD_FLAG,WORD1); WRITE_DATA(STACK_PTR-1,WORD_FLAG,WORD3); ! ZERO elif INST_REG = X:12 then STACK_PTR = * + 1; WORD1 = 0;  WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! ONE elif INST_REG = X:13  then STACK_PTR = * + 1; WORD1 = 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1);  ZERO_NEG (WORD1); ! ONES elif INST_REG = X:14 then STACK_PTR = * + 1; WORD1 = -1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! SXTB elif INST_REG = X:15 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD1 = WORD1 sll 24 sar 24; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! SXTH elif INST_REG = X:16 then WORD1 = R  EAD_DATA(STACK_PTR,WORD_FLAG); WORD1 = WORD1 sll 16 sar 16; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! SXTW elif INST_REG = X:17 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG);  STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); WORD1 = WORD1 sar 31;  WRITE_DATA(STACK_PTR-1,WORD_FLAG,WORD1); ! SAR elif INST_REG = X:18 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); if WORD1 sll 31 # 0 then PSW.CARRY = SET;  else PSW.CARRY = RESET; fi; WORD1 = WORD1 sar 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! SHR elif INST_REG = X:19 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); if WORD1 sll 31 # 0 then PSW.CARRY = SET;  else PSW.CARRY = RESET; fi; WORD1 = WORD1 slr 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! SHL elif INST_REG = X:1A then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); if WORD1 slr 31 # 0 then PSW.CARRY = SET;  else PSW.CARRY = RESET; fi; WORD1 = WORD1 sll 1;  WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! ROR elif INST_REG = X:1B  then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = WORD1 slr 1 sll 1 ; if PSW.CARRY = SET then WORD2 = * + 1; fi; if WORD1 sll 31 # 0  then PSW.CARRY = SET; else PSW.CARRY = RESET; fi; WORD2 = WORD2 rotr 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); ZERO_NEG (WORD2); ! ROL  elif INST_REG = X:1C then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = WORD1 rotl 1; WORD1 = WORD3 slr 1 sll 1 ; if PSW.CARRY = SET then WORD1 = * + 1; fi; if WORD3 sll 31 # 0 then PSW.CARRY = SET;  else PSW.CARRY = RESET; fi; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1);  ZERO_NEG (WORD1); ! CIRC elif INST_REG = X:1D then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG);  WORD1 = WORD1 rotr 1; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ZERO_NEG (WORD1); ! ADDC elif INST_REG = X:1E then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG);  STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); if PSW.CARRY = SET  then WORD2 = WORD3 + 1; else WORD2 = WORD3; fi; S ET_FLAGS (WORD1,WORD2,ADD); WORD1 = WORD1 + WORD2; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! EXCWD elif INST_REG = X:1F then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-1,WORD_FLAG); WORD2 = READ_DATA(STACK_PTR-2,WORD_FLAG); WRITE_DATA(STACK_PTR-2,WORD_FLAG,WORD1); WRITE_DATA(STACK_PTR-1,WORD_FLAG,WORD2); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); else BAD_OPCODE(); fi; end DCODE_10; %EJECT; proc DCODE_20 univ; ! EXCDW  if INST_REG = X:20 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR-1,WORD_FLAG); WRITE_DATA(STACK_PTR-1,WORD_FLAG,WORD1); WORD1 = READ_DATA(STACK_PTR-2,WORD_FLAG); WRITE_DATA(STACK_PTR-2,WORD_FLAG,WORD3); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1); ! SRCH ! SCMP elif INST_REG = X:29 OR INST_REG = X:2C then DEST_LNGTH = READ_DATA( STACK_PTR, WORD_FLAG); DEST_ADDR = READ_DATA( STACK_PTR-1, WORD_FLAG); SRCE_LNGTH = READ_DATA( STACK_PTR-2, WORD_FLAG); SRCE_ADDR = READ_DATA( STACK_PTR-3, WORD_FLAG); if INST_REG = X:29 ! SCMP then SCMP(); else SRCH(); fi; ! MOVE elif INST_REG = X:2A then MOVE_BYTES(); ! TXLT elif INST_REG = X:2B then TXLT(); ! ENQ elif INST_REG = X:2D then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(STACK_PTR-1,WORD_FLAG); WRITE_DATA(WORD1 SLR 5,WORD_FLAG,WORD2); WORD3 = READ_DATA((WORD2 SLR 5)+1,WORD_FLAG); WRITE_DATA((WORD1 SLR 5)+1,WORD_FLAG,WORD3); WRITE_DATA(WORD3 SLR 5,WORD_FLAG,WORD1); WRITE_DATA((WORD2 SLR 5)+1,WORD_FLAG,WORD1); STACK_PTR = * - 1; ! RQE elif INST_REG = X:2E then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(WORD1 SLR 5,WORD_FLAG); if WORD1 # WORD2  then WORD3 = READ_DATA((WORD1 SLR 5)+1,WORD_FLAG); WRITE_DATA(WORD3 SLR 5,WORD_FLAG,WORD2); WRITE_DATA((WORD2 SLR 5)+1,WORD_FLAG,WORD3); PSW.ZERO = RESET;  else PSW.ZERO = SET; fi; ! DQE elif INST_REG = X:2F then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(WORD1 SLR 5,WORD_FLAG); if WORD1 = WORD2  then WRITE_DATA(STACK_PTR,WORD_FLAG,0); PSW.ZERO = SET; else WORD3 = READ_DATA(WORD2 SLR 5,WORD_FLAG); WRITE_DATA(WORD1 SLR 5,WORD_FLAG,WORD3); WRITE_DATA((WORD3 SLR 5)+1,WORD_FLAG,WORD1); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); PSW.ZERO = RESET; fi; else BAD_OPCODE(); fi; end DCODE_20; %EJECT; proc DCODE_30 univ; ! LDS I B if INST_REG = X:30 then WORD1 =READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(WORD1,BYTE_FLAG); WORD2 =READ_DATA(WORD1 slr 3,BYTE_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); ZERO_NEG(WORD2); ! LDSI H elif INST_REG = X:31 then WORD1 =READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(WORD1,HALF); WORD2 =READ_DATA(WORD1 slr 4,HALF);  WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); ZERO_NEG(WORD2); ! LDSI W elif INST_REG = X:32 then WORD1 =READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(WORD1,WORD_FLAG);  WORD2 =READ_DATA(WORD1 slr 5,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); ZERO_NEG(WORD2); ! LDSI D elif INST_REG = X:33 then WORD1 =READ_DATA(STACK_PTR,WORD_FLAG);  SPECIFICATION(WORD1,WORD_FLAG); WORD2 = READ_DATA(WORD1 slr 5,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2); STACK_PTR = * + 1; WORD1 = (WORD1 slr 5) + 1;  WORD3 = READ_DATA(WORD1,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); PSW.NEGATIVE = RESET; PSW.ZERO = RESET; if WORD2 < 0 then PSW.NEGATIVE = SET; fi;  if WORD2 | WORD3 = 0 then PSW.ZERO = SET; fi; ! FORI 34-35 ! FORD  36-37 elif INST_REG >= X:34 and INST_REG <= X:37 then OPERAND = GET_2_3_OPERAND() ;  SIGN_EXTEND_OP_2_3(); OPERAND = OPERAND + FRAME_PTR; WORD1 = READ_DATA(OPERAND,WORD_FLAG); WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); SET_FLAGS(WORD1,WORD3,SUB);  if INST_REG > X:35 then WORD1 = * - 1; if WORD1 < WORD3  then STACK_PTR = * - 1; fi; else WORD1 = * + 1;  if WORD1 > WORD3 then STACK_PTR = * - 1; fi;  fi; WRITE_DATA(OPERAND,WORD_FLAG,WORD1); ! ENTR elif INST_REG = X:38 or INST_REG = X:39  then OPERAND = GET_2_3_OPERAND(); STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,FRAME_PTR sll 5); FRAME_PTR = STACK_PTR; STACK_PTR = OPERAND + STACK_PTR; ! EXIT elif INST_REG = X:3A or INST_REG = X:3B then OPERAND = GET_1_2_OPERAND(); STACK_PTR = FRAME_PTR - 2 - OPERAND; PROGRAM_PTR =READ_DATA(FRAME_PTR - 1,WORD_FLAG ); PROGRAM_PTR = * slr 3; FRAME_PTR =READ_DATA(FRAME_PTR,WORD_FLAG); FRAME_PTR = * slr 5; ! SGNL elif INST_REG = X:3C then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(W ORD1 SLR 5,WORD_FLAG); WORD3 = WORD2 + 1; if WORD3 > 0 then WRITE_DATA(WORD1 SLR 5,WORD_FLAG,WORD3); else SGNL_WAIT = TRUE; fi; ! WAIT elif INST_REG = X:3D then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(WORD1 SLR 5,WORD_FLAG);  WORD3 = WORD2 - 1; if WORD3 >= 0 then WRITE_DATA(WORD1 SLR 5,WORD_FLAG,WORD3); else SGNL_WAIT = TRUE; fi; ! TRAP elif INST_REG = X:3E then OPERAND = FETCH(); ! Read - Write CRT (unformatted) ! T0 = byte address of storage block ! T1 = number of bytes to process if OPERAND # 0 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(STACK_PTR-1,WORD_FLAG); WORD1 = * slr 3; STACK_PTR = * - 2;  else HALTED = TRUE; fi; if OPERAND = 1 ! Read Unformatted Data from CRT. then loop; break if WORD2 = 0; PTR1 = GETCRT(); WRITE_DATA(WORD1,BYTE_FLAG,PTR1); WORD1 = * + 1; WORD2 = * - 1; repeat; elif OPERAND = 2 ! Write Unformatted Data to CRT then loop; break if WORD2 = 0; PTR1 = READ_DATA(WORD1,BYTE_FLAG); PUTCRT(PTR1);  WORD1 = * + 1; WORD2 = * - 1; repeat; ! Write Formatted Data to CRT ! The first character specifies control: ! i.e. '0' => Double Space ! '1' => Screen Erease & Top of Screen ! '+' => Overprint ! anything else => Single Space elif OPERAND = 3  then PTR1 = READ_DATA(WORD1,BYTE_FLAG); if PTR1 = '0' then PUTCRT('^nl');  PUTCRT('^nl'); PUTCRT('^cr'); elif PTR1 = '1'  then PUTCRT(erasescreen); elif PTR1 = '+' then PUTCRT('^cr'); PUTCRT(eraseline); else PUTCRT('^cr'); PUTCRT('^nl'); fi; loop; WORD1 = * + 1; WORD2 = * - 1; break if WORD2 <= 0; PTR1 = READ_DATA(WORD1,BYTE_FLAG);  PUTCRT(PTR1); repeat; fi; ! LCXT elif INST_REG = X:3F  then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); if WORD1 = 0 then STACK_PTR = FRAME_PTR - 3;  WORD2 = READ_DATA(FRAME_PTR-2,WORD_FLAG); WRITE_DATA(PSW,WORD_FLAG,WORD2);  WORD2 = READ_DATA(FRAME_PTR-1,WORD_FLAG); WRITE_DATA(PROGRAM_PTR,WORD_FLAG,WORD2 SLR 3) ; WORD2 = READ_DATA(FRAME_PTR,WORD_FLAG); WRITE_DATA(FRAME_PTR,WORD_FLAG,WORD2 SLR 5); else WRITE_DATA(CNTX_PTR,WORD_FLAG,WORD1 SLR 5); WORD2 = READ_DATA(CNTX_PTR,WORD_FLAG); WRITE_DATA(PSW,WORD_FLAG,WORD2); WORD2 = READ_DATA(CNTX_PTR+1,WORD_FLAG);  WRITE_DATA(STACK_PTR,WORD_FLAG,WORD2 SLR 5); WORD2 = READ_DATA(CNTX_PTR+2,WORD_FLAG);  WRITE_DATA(GLOBAL_PTR,WORD_FLAG,WORD2 SLR 5); WORD2 = READ_DATA(CNTX_PTR+3,WORD_FLAG);  WRITE_DATA(FRAME_PTR,WORD_FLAG,WORD2 SLR 5); WORD2 = READ_DATA(CNTX_PTR+4,WORD_FLAG);  WRITE_DATA(PROGRAM_PTR,WORD_FLAG,WORD2 SLR 3); fi; else BAD_OPCODE(); fi; end DCODE_30; %EJECT; proc DCODE_40 univ; ! STSI B ! STSI H ! STSI W ! STSI D if INST_REG >= X:40 and INST_REG <= X:43 then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WORD3 = READ_DATA(STACK_PTR,WORD_FLAG); if INST_REG = X:40 then WRITE_DATA(WORD1 slr 3,BYTE_FLAG,WORD3); SPECIFICATION(WORD1,BYTE_FLAG); elif INST_REG = X:41  then WRITE_DATA(WORD1 slr 4,HALF,WORD3); SPECIFICATION(WORD1,HALF);  elif INST_REG = X:42 then WRITE_DATA(WORD1 slr 5,WORD_FLAG,WORD3);  SPECIFICATION(WORD1,WORD_FLAG); else STACK_PTR = * - 1; WORD2 = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(WORD1,WORD_FLAG); WORD1 = * slr 5;  WRITE_DATA(WORD1,WORD_FLAG,WORD2); WRITE_DATA(WORD1 + 1,WORD_FLAG,WORD3);  fi; STACK_PTR = * - 1; ! ADDI ! SUBI ! CMPI elif INST_REG >= X:48 and INST_REG <= X:4D  then OPERAND = GET_2_3_OPERAND(); WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); if INST_REG = X:48 or INST_REG = X:49 then SET_FLAGS(WORD1,OPERAND,ADD); WORD1 = WORD1 + OPERAND; else SET_FLAGS(WORD1,OPERAND,SUB); WORD1 = WORD1 - OPERAND;  fi; if INST_REG < X:4C then WRITE_DATA(STACK_PTR,WORD_FLAG,WORD1);  fi; ! RESS elif INST_REG = X:4E or INST_REG = X:4F then OPERAND = GET_2_3_OPERAND();  STACK_PTR = * + OPERAND; ! LDI elif INST_REG >= X:44 and INST_REG <= X:46 then OPERAND = FETCH(); if INST_REG > X:44 then OPERAND = OPERAND sll 8 + FETCH();  fi; if INST_REG = X:46 then OPERAND = OPERAND sll 8 + FETCH();  OPERAND = OPERAND sll 8 + FETCH(); fi; STACK_PTR = * + 1;   WRITE_DATA(STACK_PTR,WORD_FLAG,OPERAND); else BAD_OPCODE(); fi; end DCODE_40; %EJECT; proc DCODE_50 univ;  ! RELS if INST_REG = X:50 or INST_REG = X:51 then OPERAND = GET_2_3_OPERAND(); STACK_PTR = * - OPERAND; ! EXT elif INST_REG = X:52 or INST_REG = X:53 then OPERAND = GET_1_2_OPERAND();  WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD3 = 0; loop; break if OPERAND < 0; WORD2 = READ_DATA(WORD1,BIT_FLAG); WORD1 = * + 1;  OPERAND = * - 1; WORD3 = (WORD3 sll 1) | WORD2; repeat; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); ! INS elif INST_REG = X:54 or INST_REG = X:55 then OPERAND = GET_1_2_OPERAND(); WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD1 = * rotr OPERAND; WORD2 = READ_DATA(STACK_PTR-1,WORD_FLAG); loop; break if OPERAND < 0; WRITE_DATA(WORD2,BIT_FLAG,WORD1); OPERAND = * - 1; WORD2 = * + 1; WORD1 = * rotl 1;  repeat; ! CASE elif INST_REG = X:57 then WORD1 = PROGRAM_PTR - 1; OPERAND = FETCH(); WORD2 = READ_DATA(STACK_PTR,WORD_FLAG); if WORD2 < 0 or WORD2 > OPERAND  then WORD2 = OPERAND + 1; fi; if WORD1 sll 31 slr 31 = 1 then WORD3 = (PROGRAM_PTR + 1) slr 1; else WORD3 = PROGRAM_PTR slr 1; fi; WORD3 = * + WORD2;  WORD2 = READ_DATA(WORD3,HALF); WORD2 = * sll 16 sar 16; PROGRAM_PTR = WORD1 + WORD2; ! JSI elif INST_REG = X:56 then PROGRAM_PTR = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(PROGRAM_PTR,BYTE_FLAG); PROGRAM_PTR = * slr 3; STACK_PTR = * - 1; ! LDPA  elif INST_REG >= X:58 and INST_REG <= X:5A then WORD2 = PROGRAM_PTR - 1; OPERAND = GET_2_3_OPERAND(); if INST_REG < X:5A then SIGN_EXTEND_OP_2_3(); else OPERAND = OPERAND sll 8 | GET_2_3_OPERAND(); OPERAND = OPERAND sll 8 | GET_2_3_OPERAND(); OPERAND = OPERAND sll 8 | GET_2_3_OPERAND(); fi; OPERAND = OPERAND + WORD2; STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,OPERAND sll 3); ! SPIN elif INST_REG = X:5B then WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(WORD1,WORD_FLAG); if WORD2 > 0  then WORD2 = * - 1; WRITE_DATA(WORD1,WORD_FLAG,WORD2); else PROGRAM_PTR = * - 1;  fi; ! EXTS elif INST_REG = X:5C or INST_REG = X:5D then OPERAND = GET_1_2_OPERAND();  WORD1 = READ_DATA(STACK_PTR,WORD_FLAG); WORD2 = READ_DATA(WORD1,BIT_FLAG); WORD3 = WO RD2 sll 31 sar 31; loop; OPERAND = * - 1; WORD1 = * + 1; break if OPERAND < 0; WORD2 = READ_DATA(WORD1,BIT_FLAG); WORD3 = (WORD3 sll 1) | WORD2;  repeat; WRITE_DATA(STACK_PTR,WORD_FLAG,WORD3); else BAD_OPCODE(); fi; end DCODE_50; %EJECT; proc BAD_OPCODE univ; ! Notifies the user of an attempt ! to execute an illegal opcode.  ! Sets HALTED to TRUE for return ! to the Monitor. HALTED = TRUE; WRITEF(S_OUT,"^NL ILLEGAL OPCODE FOUND ^NL ^EOS"); PTR1 = PROGRAM_PTR slr (16 - 3); PTR2 = PROGRAM_PTR sll 3 & X:FFFF; WRITEF(S_OUT,"^NL P = %04X%04X OPCODE = %02X ^nl^eos", PTR1,PTR2,INST_REG); end BAD_OPCODE; %EJECT; \  S R C H \ proc SRCH UNIV; dcl STRING_FOUND word, S_LNGTH dbl, S_ADDR dbl; S_ADDR = SRCE_ADDR; S_LNGTH = SRCE_LNGTH; STRING_FOUND = FALSE; loop; break if DEST_LNGTH <= 0 or SRCE_LNGTH <= 0 or DEST_LNGTH < SRCE_LNGTH; if READ_DATA(SRCE_ADDR slr 3,BYTE_FLAG) = READ_DATA(DEST_ADDR slr 3,BYTE_FLAG) then SRCE_ADDR = * + 8; SRCE_LNGTH = * - 1; if STRING_FOUND = FALSE then WRITE_DATA(STACK_PTR-1,WORD_FLAG,DEST_ADDR); fi;  STRING_FOUND = TRUE; elif STRING_FOUND = TRUE then SRCE_ADDR = S_ADDR; SRCE_LNGTH = S_LNGTH; STRING_FOUND = FALSE; fi; DEST_ADDR = * + 8; DEST_LNGTH = * - 1;  WRITE_DATA(STACK_PTR,WORD_FLAG,DEST_LNGTH); repeat; if STRING_FOUND = TRUE and SRCE_LNGTH = 0 then PSW.ZERO = SET; else PSW.ZERO = RESET; fi; end SRCH; %EJECT; \ S C M P \ proc SCMP UNIV; dcl SRCE_GREATER dbl, SRCE_CONTENTS dbl, DEST_CONTENTS dbl; SRCE_GREATER = 1; ! neither is greater here loop; break if SRCE_GREATER # 1 or SRCE_LNGTH <= 0 or DEST_LNGTH <= 0; SRCE_CONTENTS = READ_DATA(SRCE_ADDR slr 3,BYTE_FLAG); DEST_CONTENTS = READ_DATA(DEST_ADDR slr 3,BYTE_FLAG); if SRCE_CONTENTS = DEST_CONTENTS then SRCE_ADDR = * + 8; DEST_ADDR = * + 8; SRCE_LNGTH = * - 1;  DEST_LNGTH = * - 1; WRITE_DATA(STACK_PTR-1,WORD_FLAG,DEST_ADDR); WRITE_DATA(STACK_PTR,WORD_FLAG,DEST_LNGTH); WRITE_DATA(STACK_PTR-2,WORD_FLAG,SRCE_LNGTH); WRITE_DATA(STACK_PTR-3,WORD_FLAG,SRCE_ADDR); elif SRCE_CONTENTS > DEST_CONTENTS then SRCE_GREATER = TRUE;  else SRCE_GREATER = FALSE; fi; repeat; SET_FLAGS(SRCE_CONTENTS,DEST_CONTENTS,COMPARE); end SCMP; %EJECT; \ M O V E _ B Y T E S \ proc MOVE_BYTES UNIV; dcl TEMP word; SRCE_LNGTH = READ_DATA(STACK_PTR,WORD_FLAG); DEST_ADDR = READ_DATA(STACK_PTR-1,WORD_FLAG); SRCE_ADDR = READ_DATA(STACK_PTR-2,WORD_FLAG); loop; br eak if SRCE_LNGTH = 0; TEMP = READ_DATA(SRCE_ADDR slr 3,BYTE_FLAG); WRITE_DATA(DEST_ADDR slr 3,BYTE_FLAG,TEMP); SRCE_ADDR = * + 8; DEST_ADDR = * + 8; SRCE_LNGTH = * - 1; WRITE_DATA(STACK_PTR,WORD_FLAG,SRCE_LNGTH); WRITE_DATA(STACK_PTR-1,WORD_FLAG,DEST_ADDR); WRITE_DATA(STACK_PTR-2,WORD_FLAG,SRCE_ADDR);  repeat; end MOVE_BYTES; %EJECT; \ T X L T \ proc TXLT UNIV; dcl TABLE_ADDR dbl, TXLT_ZERO word, TEMP dbl; TABLE_ADDR = READ_DATA(STACK_PTR,WORD_FLAG); SRCE_LNGTH = READ_DATA(STACK_PTR-1,WORD_FLAG); DEST_ADDR = READ_DATA(STACK_PTR-2,WORD_FLAG); SRCE_ADDR = READ_DATA(STACK_PTR-3,WORD_FLAG); TEMP = - 1;  loop; break if SRCE_LNGTH = 0; TEMP = READ_DATA(SRCE_ADDR slr 3,BYTE_FLAG); TEMP = TEMP + (TABLE_ADDR slr 3); TEMP = READ_DATA(TEMP,BYTE_FLAG); break if TEMP = 0; WRITE_DATA(DEST_ADDR slr 3,BYTE_FLAG,TEMP); SRCE_ADDR = * + 8; DEST_ADDR = * + 8; SRCE_LNGTH = * - 1; WRITE_DATA(STACK_PTR-1,WORD_FLAG,SRCE_LNGTH); WRITE_DATA(STACK_PTR-2,WORD_FLAG,DEST_ADDR); WRITE_DATA(STACK_PTR-3,WORD_FLAG,SRCE_ADDR); repeat; if SRCE_LNGTH = 0 and TEMP # 0 then PSW.ZERO = SET; else PSW.ZERO = RESET; fi; end TXLT; %EJECT; \ G E T _ 2 _ 3 _ O P E R A N D -- This function returns the operand for an instruction that has both format types  2 and 3. \ proc GET_2_3_OPERAND UNIV returns (DBL); dcl OPERAND dbl; OPERAND = 0; OPERAND = OPERAND + FETCH(); if INST_REG & 1 = 1 then OPERAND = OPERAND sll 8 + FETCH(); fi; return (OPERAND); end GET_2_3_OPERAND ; \ G E T _ 1 _ 2 _ O P E R A N D -- This function returns the  operand for an instruction that has both format types  1 and 2. \ proc GET_1_2_OPERAND UNIV returns (DBL); dcl OPERAND dbl; OPERAND = 0; if INST_REG & 1 # 0 then OPERAND = OPERAND + FETCH(); fi; return (OPERAND); end GET_1_2_OPERAND; %EJECT; \ S I G N _ E X T E N D _ O P _ 2 _ 3 This function sign-extends the  operand of a format 2 or 3 instruction. \ proc SIGN_EXTEND_OP_2_3 UNIV; if INST_REG & 1 = 0 then OPERAND = OPERAND sll 24 sar 24; else OPERAND = OPERAND sll 16 sar 16; fi; end SIGN_EXTEND_OP_2_3; end OAKSIM2; = OPERAND + FETCH(); fi; return (OPERAND); end GET_1_2_OPERAND; %EJECT; \ S I G N _ E X T E N D _ O P _ 2 _ 3 This function sign-extends the \ O A K S I M U L A T O R S E C T I O N # 3 LISTING # 8 4 - 9 3 1 5 0 - 1 2 A 0 CONTENTS: (AS ARRANGED) DCODE_BRANCH DCODE_LDL DCODE_C0 DCODE_D0   DCODE_E0 DCODE_F0 \ %EJECT; segment OAKSIM3; ! SIMULATOR SEGMENT 3 OAKSIM3.ALM proc READ_DATA external returns (dbl); proc WRITE_DATA external; proc ZERO_NEG external; proc SET_FLAGS external; proc FETCH external returns (byte); proc MONITOR external; proc WRITEF external; proc GET_1_2_OPERAND external; proc GET_2_3_OPERAND external; proc SPECIFICATION external; proc SIGN_EXTEND_OP_2_3 external; %sub TRUE = "X:FFFF"; %sub FALSE = "0"; %sub ADD = "1"; %sub COMPARE = "2"; %sub SUB = "0"; %sub S_IN = "5"; %sub S_OUT = "6"; %SUB SET = "1"; %SUB RESET = "0"; %SUB MAX_MEM = "4095"; \ GLOBAL DATA \ dcl GLOBAL_PTR external dbl, STACK_PTR external dbl, FRAME_PTR external dbl, PROGRAM_PTR external dbl,  INST_REG external byte, OPERAND external dbl, SRCE_ADDR external dbl, SRCE_LNGTH external dbl, DEST_ADDR external dbl, DEST_LNGTH external dbl, PSW external structure (CLOCK word, ! Virtual Clock  I_BIT bit, ! Interrupt Enable G_BIT bit, ! Group Int. Enable  U_BIT bit, ! User Mode S_BIT bit, ! Virtual System Mode T_BIT  bit, ! Trace Trap H_BIT bit, ! Halt State W_BIT bit, ! Writable  ! Control ! Store SPARE1 bit, ! Spare SPARE2 bit, ! Spare D_BIT bit, ! Decimal Overflow ! Trap Mask E_BIT bit, ! Exponent Underflow ! Trap Mask  F_BIT bit, ! Floating Point ! Overflow Trap Mask  ZERO bit, NEGATIVE bit, CARRY bit,  OVERFLOW bit ), \ FLAGS \ BYTE_FLAG external word, HALF external word,  WORD_FLAG external word, UMT external word; %EJECT; \ D C O D E _ B R A N C H \ proc DCODE_BRANCH univ; dcl TEMP_PTR dbl, ONE_BYTE byte, LOW_INST byte; TEMP_PTR = PROGRAM_PTR - 1; LOW_INST = INST_REG & X:1F; OPERAND = FETCH(); if LOW_INST & 1 = 1 then ONE_BYTE = FETCH(); OPERAND = OPERAND sll 8 + ONE_BYTE; fi; SIGN_EXTEND_OP_2_3(); TEMP_PTR = TEMP_PTR + OPERAND; !BPL if (LOW_INST=0 or LOW_INST=1) and PSW.NEGATIVE = RESET then PROGRAM_PTR = TEMP_PTR; !BMI elif (LOW_INST=2 or LOW_INST=3) and PSW.NEGATIVE = SET then PROGRAM_PTR = TEMP_PTR; !BNE elif (LOW_INST=4 or LOW_INST=5) and PSW.ZERO = RESET then PROGRAM_PTR = TEMP_PTR; !BE Q elif (LOW_INST=6 or LOW_INST=7) and PSW.ZERO = SET then PROGRAM_PTR = TEMP_PTR; !BNO elif (LOW_INST=8 or LOW_INST=9) and PSW.OVERFLOW = RESET then PROGRAM_PTR = TEMP_PTR; !BOV elif (LOW_INST=X:A or LOW_INST=X:B) and PSW.OVERFLOW = SET then PROGRAM_PTR = TEMP_PTR; !BNC elif (LOW_INST=X:C or LOW_INST=X:D) and PSW.CARRY = RESET then PROGRAM_PTR = TEMP_PTR; !BCY elif (LOW_INST=X:E or LOW_INST=X:F) and PSW.CARRY = SET then PROGRAM_PTR = TEMP_PTR; !BGT elif LOW_INST = X:10 or LOW_INST = X:11 then if PSW.ZERO|(PSW.NEGATIVE xor PSW.OVERFLOW) = RESET then PROGRAM_PTR = TEMP_PTR; fi; !BLE elif LOW_INST = X:12 or LOW_INST = X:13 then if PSW.ZERO|(PSW.NEGATIVE xor PSW.OVERFLOW) = SET  then PROGRAM_PTR = TEMP_PTR; fi; !BGE elif LOW_INST = X:14 or LOW_INST = X:15 then if PSW.NEGATIVE xor PSW.OVERFLOW = RESET then PROGRAM_PTR = TEMP_PTR; fi; !BLT elif LOW_INST = X:16 or LOW_INST = X:17 then if PSW.NEGATIVE xor PSW.OVERFLOW = SET then PROGRAM_PTR = TEMP_PTR; fi; !BHI elif LOW_INST = X:18 or LOW_INST = X:19  then if PSW.ZERO|PSW.CARRY = RESET then PROGRAM_PTR = TEMP_PTR; fi; !BLS elif LOW_INST = X:1A or LOW_INST = X:1B then if PSW.ZERO|PSW.CARRY = SET then PROGRAM_PTR = TEMP_PTR; fi; ! JMP elif LOW_INST = X:1C or LOW_INST = X:1D then PROGRAM_PTR = TEMP_PTR; ! JAL elif LOW_INST = X:1E or LOW_INST = X:1F then STACK_PTR = * + 1;  WRITE_DATA(STACK_PTR,WORD_FLAG,PROGRAM_PTR sll 3); PROGRAM_PTR = TEMP_PTR; fi; end DCODE_BRANCH; %EJECT; \ D C O D E _ L D L \ proc DCODE_LDL UNIV; dcl POINTER dbl, DATA_WORD dbl; if  INST_REG & X:E = X:8 then OPERAND = GET_2_3_OPERAND(); SIGN_EXTEND_OP_2_3(); else OPERAND = INST_REG & X:F; OPERAND = OPERAND sll 28 sar 28; fi; OPERAND = OPERAND + FRAME_PTR; ! LDL if INST_REG & X:F0 = X:80 then STACK_PTR = * + 1; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! STL elif INST_REG & X:F0 = X:90 then DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); ! ZRL elif INST_REG & X:F0 = X:A0  then DATA_WORD = 0; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); ! INL else DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); SET_FLAGS (DATA_WORD,1,ADD); DATA_WORD = * + 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); fi; end DCODE_LDL; %EJECT; \ D C O D E _ C 0 \ proc DCODE_C0 UNIV; dcl DATA_WORD dbl, LOW_INST byte; LOW_INST = INST_REG & X:0F; OPERAND = GET_2_3_OPERAND(); SIGN_EXTEND_OP_2_3(); ! LDG if LOW_INST < 2 then STACK_PTR = * + 1;  OPERAND = OPERAND + GLOBAL_PTR; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); WRITE_D ATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! STG elif LOW_INST = 2 or LOW_INST = 3 then OPERAND = OPERAND + GLOBAL_PTR; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG);  STACK_PTR = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); ! LDGD elif LOW_INST = 4 or LOW_INST = 5 then OPERAND = OPERAND + GLOBAL_PTR; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG);  STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); OPERAND = * + 1; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG);  STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); if DATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STGD elif LOW_INST = 6 or LOW_INST = 7 then OPERAND = OPERAND + GLOBAL_PTR;  OPERAND = * + 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; OPERAND = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); ! LDLA elif LOW_INST = 8 or LOW_INST = 9 then OPERAND = OPERAND + FRAME_PTR;  STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,OPERAND sll 5); ! LDGA elif LOW_INST = X:A or LOW_INST = X:B then OPERAND = OPERAND + GLOBAL_PTR; STACK_PTR = * + 1;  WRITE_DATA(STACK_PTR,WORD_FLAG,OPERAND sll 5); ! LDLD elif LOW_INST = X:C or LOW_INST = X:D then OPERAND = OPERAND + FRAME_PTR; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); STACK_PTR = * + 1; WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD);  OPERAND = * + 1; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); STACK_PTR = * + 1;  WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); if DATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STLD else OPERAND = OPERAND + FRAME_PTR; OPERAND = * + 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1; OPERAND = * - 1; WRITE_DATA(OPERAND,WORD_FLAG,DATA_WORD); fi; end DCODE_C0; %EJECT; \ D C O D E _ D 0 \ proc DCODE_D0 UNIV;  dcl LOW_INST byte, DATA_WORD dbl, TOP dbl; OPERAND = GET_2_3_OPERAND(); SIGN_EXTEND_OP_2_3(); LOW_INST = INST_REG & X:F; OPERAND = OPERAND + GLOBAL_PTR; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); TOP = READ_DATA(STACK_PTR,WORD_FLAG); ! LDGX B if LOW_INST = 0 or LOW _INST = 1 then TOP = TOP + (DATA_WORD slr 3); SPECIFICATION(DATA_WORD,BYTE_FLAG);  DATA_WORD = READ_DATA(TOP,BYTE_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD);  ZERO_NEG (DATA_WORD); ! LDGX H elif LOW_INST = 2 or LOW_INST = 3 then TOP = TOP + (DATA_WORD slr 4); SPECIFICATION(DATA_WORD,HALF); DATA_WORD = READ_DATA(TOP,HALF); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDGX W elif LOW_INST = 4 or LOW_INST = 5 then TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG);  DATA_WORD = READ_DATA(TOP,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDGX D elif LOW_INST = 6 or LOW_INST = 7 then TOP = TOP + (DATA_WORD slr 5);  SPECIFICATION(DATA_WORD,WORD_FLAG); DATA_WORD = READ_DATA(TOP,WORD_FLAG);  WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); STACK_PTR = * + 1; TOP = * + 1; DATA_WORD = READ_DATA(TOP,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); if DATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STGX B elif LOW_INST = 8 or LOW_INST = 9 then TOP = TOP + (DATA_WORD slr 3); SPECIFICATION(DATA_WORD,BYTE_FLAG);  STACK_PTR = * - 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,BYTE_FLAG,DATA_WORD); STACK_PTR = * - 1; ! STGX H elif LOW_INST = X:A or LOW_INST = X:B  then TOP = TOP + (DATA_WORD slr 4); SPECIFICATION(DATA_WORD,HALF); STACK_PTR = * - 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,HALF,DATA_WORD);  STACK_PTR = * - 1; ! STGX W elif LOW_INST = X:C or LOW_INST = X:D then TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG); STACK_PTR = * - 1;  DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,WORD_FLAG,DATA_WORD); STACK_PTR = * - 1; ! STGX D else TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG);  STACK_PTR = * - 2; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,WORD_FLAG,DATA_WORD); STACK_PTR = * + 1; TOP = * + 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,WORD_FLAG,DATA_WORD); STACK_PTR = * - 2; fi; end DCODE_D0; %EJECT; \ D C O D E _ E 0 \ proc DCODE_E0 UNIV; dcl LOW_INST byte, DATA_WORD dbl,  TOP dbl; OPERAND = GET_2_3_OPERAND(); SIGN_EXTEND_OP_2_3(); LOW_INST = INST_RE G & X:F; OPERAND = OPERAND + FRAME_PTR; TOP = READ_DATA(OPERAND,WORD_FLAG); ! LDLI B if LOW_INST = 0 or LOW_INST = 1 then STACK_PTR = * + 1; SPECIFICATION(TOP,BYTE_FLAG);  DATA_WORD = READ_DATA(TOP slr 3,BYTE_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDLI H elif LOW_INST = 2 or LOW_INST = 3 then STACK_PTR = * + 1;  SPECIFICATION(TOP,HALF); DATA_WORD = READ_DATA(TOP slr 4,HALF); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDLI W elif LOW_INST = 4 or LOW_INST = 5  then STACK_PTR = * + 1; SPECIFICATION(TOP,WORD_FLAG); DATA_WORD = READ_DATA(TOP slr 5,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDLI D elif LOW_INST = 6 or LOW_INST = 7 then STACK_PTR = * + 1; SPECIFICATION(TOP,WORD_FLAG); DATA_WORD = READ_DATA(TOP slr 5,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); STACK_PTR = * + 1; DATA_WORD = READ_DATA((TOP slr 5)+1,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); if DATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STLI B elif LOW_INST = 8 or LOW_INST = 9 then DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(TOP,BYTE_FLAG); WRITE_DATA(TOP slr 3,BYTE_FLAG,DATA_WORD); STACK_PTR = * - 1; ! STLI H elif LOW_INST = X:A or LOW_INST = X:B then DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(TOP,HALF); WRITE_DATA(TOP slr 4,HALF,DATA_WORD); STACK_PTR = * - 1; ! STLI W elif LOW_INST = X:C or LOW_INST = X:D then DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(TOP,WORD_FLAG); WRITE_DATA(TOP slr 5,WORD_FLAG,DATA_WORD); STACK_PTR = * - 1; ! STLI D else DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); SPECIFICATION(TOP,WORD_FLAG); STACK_PTR = * - 1; WRITE_DATA((TOP slr 5)+1,WORD_FLAG,DATA_WORD); DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); STACK_PTR = * - 1;  WRITE_DATA(TOP slr 5,WORD_FLAG,DATA_WORD); fi; end DCODE_E0; %EJECT; \ D C O D E _ F 0 \ proc DCODE_F0 UNIV; dcl LOW_INST byte, DATA_WORD dbl, TOP dbl; OPERAND = GET_2_3_OPERAND(); SIGN_EXTEND_OP_2_3(); LOW_INST = INST_REG & X:F; OPERAND = OPERAND + FRAME_PTR; DATA_WORD = READ_DATA(OPERAND,WORD_FLAG); TOP = READ_DATA(STACK_PTR,WORD_FLAG); ! LDLX B if LOW_INST = 0 or LOW_INST = 1 then TOP = TOP + (DATA_WORD slr 3); SPECIFICATION(DATA_WORD,BYTE _FLAG); DATA_WORD = READ_DATA(TOP,BYTE_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDLX H elif LOW_INST = 2 or LOW_INST = 3 then TOP = TOP + (DATA_WORD slr 4); SPECIFICATION(DATA_WORD,HALF); DATA_WORD = READ_DATA(TOP,HALF);  WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD); ! LDLX W elif LOW_INST = 4 or LOW_INST = 5 then TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG); DATA_WORD = READ_DATA(TOP,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD);  ZERO_NEG (DATA_WORD); ! LDLX D elif LOW_INST = 6 or LOW_INST = 7 then TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG); DATA_WORD = READ_DATA(TOP,WORD_FLAG); WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); ZERO_NEG (DATA_WORD);  STACK_PTR = * + 1; TOP = * + 1; DATA_WORD = READ_DATA(TOP,WORD_FLAG);  WRITE_DATA(STACK_PTR,WORD_FLAG,DATA_WORD); if DATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STLX B  elif LOW_INST = 8 or LOW_INST = 9 then TOP = TOP + (DATA_WORD slr 3); SPECIFICATION(DATA_WORD,BYTE_FLAG); STACK_PTR = * - 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG);  WRITE_DATA(TOP,BYTE_FLAG,DATA_WORD); STACK_PTR = * - 1; ! STLX H elif LOW_INST = X:A or LOW_INST = X:B then TOP = TOP + (DATA_WORD slr 4); SPECIFICATION(DATA_WORD,HALF);  STACK_PTR = * - 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,HALF,DATA_WORD); STACK_PTR = * - 1; ! STLX W elif LOW_INST = X:C or LOW_INST = X:D  then TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG); STACK_PTR = * - 1; DATA_WORD = READ_DATA(STACK_PTR,WORD_FLAG); WRITE_DATA(TOP,WORD_FLAG,DATA_WORD);  STACK_PTR = * - 1; ! STLX D else TOP = TOP + (DATA_WORD slr 5); SPECIFICATION(DATA_WORD,WORD_FLAG); DATA_WORD = READ_DATA(STACK_PTR-2,WORD_FLAG); WRITE_DATA(TOP,WORD_FLAG,DATA_WORD);  DATA_WORD = READ_DATA(STACK_PTR-1,WORD_FLAG); WRITE_DATA(TOP+1,WORD_FLAG,DATA_WORD);  STACK_PTR = * - 3; fi; end DCODE_F0; end OAKSIM3; ATA_WORD # 0 then PSW.ZERO = RESET; fi; ! STLX B  elif LOW_INST = 8 or LOW_INST = 9 then TOP = TOP + (DATA_WORD slr 3); SPECIFICATION(DATA_WOrepeat; end GET_LINE; end SIMULATOR;  79100715050525791007150506IÄ@ƒK&mg&]IG t„IÄ@t JóQÁVB1„IÄ@tgt)C{Gti~†nì~…&‹Gt„IÄ@tGt G‹HQÁVÂÿÚ„IÄ@ƒ ITG t „IÄ@ƒúL&mg&]I& _‡ LAST INSTRUCTION EXECUTED = :%2X =G„íÁ& _‡gt )C~& _‡„IÄ@tGt i~žnì~&Š @.G&t _‡OèO^•_†GŽ^–Gt _‡IJý& _ŒŒ„àAxqDjÿn0c O^™GtO GŽæ^šGtOèO^—GtGŽÜ^˜I& _‡ P = %04X%04X (%04X%04X )B T3 = %04X%04X Ž G„í‚& _‡^& _‡^& _‡ ^& _‡ ^& _‡ ^& _‡ ^& _‡„IÄ@tGt i~žnì~&Š @.G&t _‡OèO^•_†GŽŸ^–Gt _‡IJû& _ŒŒ„àAxqDjÿn0c O^™GtO@GŽ„^šI& _‡' S = %04X%04X  T2 = %04X%04X æ G„í?& _‡^& _‡^& _‡ ^& _‡ ^& _‡ „IÄ@tGt i~žnì~&Š @.G&t _‡OèO^•_†GŽO^–Gt _‡IJû& _ŒŒ„àAxqDjÿn0c O^™GtO@GŽ4^šI& _‡< F = %04X%04X  T1 = %04X%04X 6 G„í& _‡^& _‡^& _‡ ^& _‡ ^& _‡ „IÄ@tGt @.G&t _‡OèO^•_†GŽ^–Gt _‡IJû& _ŒŒ„àAxqDjÿn0c O^™GtO@GŽê^šI& _‡Q G = %04X%04X  T0 = %04X%04X € G„ìÏ& _‡^& _‡^& _‡ ^& _‡ ^& _‡ „IÄ@tGt^Gt  ^žI@>^&}I& _‡f PSW %04X%04X ªG„ìº& _‡Gt OèO_‡Gt  Gެ_‡ „IÄ@tI& _‡n --- CONDITION CODES ---Å G„ì§& _‡„IÄ@tgtk) C^•gtk)C^–gtk) CT DE OAKSIM1.INT,OAKSIM1.ASM DE OAKSIM1.OUT ALS OAKSIM1.INT=OAKSIM1.ALM,TV ALC:1 OAKSIM1.OUT=OAKSIM1.INT,TV PAUSE TYPE C FOR ALC:2 ALC:2 OAKSIM1.ASM=OAKSIM1.INT,TV PAUSE TYPE C FOR ASSEMBLY MACRO OAKSIM1(MACH=490A,D=ALAMO495,ER,L=) T PAUSE TYPE C TO COMPILE OAKSIM2 DE OAKSIM2.INT,OAKSIM2.ASM DE OAKSIM2.OUT ALS OAKSIM2.INT=OAKSIM2.ALM,TV ALC:1 OAKSIM2.OUT=OAKSIM2.INT,TV PAUSE TYPE C FOR ALC:2 ALC:2 OAKSIM2.ASM=OAKSIM2.INT,TV PAUSE TYPE C FOR ASSEMBLY MACRO OAKSIM2(MACH=490A,D=ALAMO495,ER,L=) T PAUSE TYPE C TO COMPILE OAKSIM3 DE OAKSIM3.INT,OAKSIM3.ASM DE OAKSIM3.OUT ALS OAKSIM3.INT=OAKSIM3.ALM,TV ALC:1 OAKSIM3.OUT=OAKSIM3.INT,TV PAUSE TYPE C FOR ALC:2 ALC:2 OAKSIM3.ASM=OAKSIM3.INT,TV PAUSE TYPE C FOR ASSEMBLY MACRO OAKSIM3(MACH=490A,D=ALAMO495,ER,L=) T PAUSE TYPE C TO COMPILE OAKSIM4 DE OAKSIM4.INT,OAKSIM4.ASM DE OAKSIM4.OUT ALS OAKSIM4.INT=OAKSIM4.ALM,TV ALC:1 OAKSIM4.OUT=OAKSIM4.INT,TV PAUSE TYPE C FOR ALC:2 ALC:2 OAKSIM4.ASM=OAKSIM4.INT,TV PAUSE TYPE C FOR ASSEMBLY MACRO OAKSIM4(MACH=490A,D=ALAMO495,L=DM.OAKSIM4.LST) T PAUSE TYPE C TO LINK OAKSIM LINK OAKSIM.SYS=OAKSIM1+OAKSIM2(UL)+OAKSIM3(UL)+ OAKSIM4(UL)+ALAMOLIB+STRING+BINIO+GETCRT+PUTCRT JO 79100113472775791001134731 JSIMULATOMEMORY INST:PIPJGLOBAL:PCNTX:PTRLOW:STACJHIGH:STAPSW STACK:PTJFRAME:PTPROGRAM:INST:REGJOPERAND PIPE:PTRSTATUS JSRCE:ADDSRCE:LNGDEST:ADDJDEST:LNGBUF GEN JCOMMAND1COMMAND2PAR JPARAMS TERM:CHRSEPARATOJOPCODE WORD1 WORD2 JWORD3 PTR1 PTR2 JINTS:PENUMT DONE JHALTED HITS MEM:READJMEM:REFSPROG:FETINST:FETJI:PIPE:LMEM:WRITBYTE:FLAJHALF BIT:FLAGWORD:FLAJREAD:FG SGNL:WAIWRITE:FGJFETCH GIVE:STASEMAPHORJSPECIFICTRANSLATCACHE JZERO:NEGSET:FLAGREAD:DATJWRITE:DALOADER GET:LINEO0SEGMENTBLANK o.MKMAP:LETTDCODE:F0DCODE:E0KDCODE:D0DCODE:C0DCODE:LDKDCODE:BRDCODE:50DCODE:40KDCODE:30DCODE:20DCODE:10KDCODE:00MONITOR PUTCRT KGETCRT READB GETBY KWRITEF ENDIO BEGINIO KCLOSE OPEN img!sg!ugg!yggggg g g g !ˆg !Šg!‹g!g!g!‘g!“g   gÿÿÿÿ"g"g"g"g"g"g"gt t t t ttttttttttttg"%g"'g")g"*g "+g!g"g#g$g%g&g'g(g)g*g+g,g-g.ÿÿg/g0g1g2ÿÿg /pPGˆnpB‡„IÄ@tI& _‡ Oak Simulator (A0)  "T G„ݪ& _‡„IÄ@t IG‰ÿÇGˆÿÅ @.I& G§ß Gˆ ÿ½KG‰ÿºG‹ ‡RÁV ÿéIG‰ÿ­Gˆÿ« @.Hÿ& G§ ÿ8Gˆÿ£KG‰ÿ JÜQÁVÂÿê„IÄ@t  „IÄ@ƒîI& _‡  --END-- O A K S I M U L A T O R "¢ G„Ýi& _‡„IÄ@t‡„IÄ@t àg3 &]G†þÈOgÿ~nì~Ž&Š Ã@QAV G†þ¶O AVBI& _‡! MEMORY EXCEPTION (fetch) "Ø G„ÝG& _‡„IÄ@t HÿG‰ÿHG†ÿMi~nì~Ž&‹G‡ ÿEG†þ‘O_‡G†þ‘„& @QAVB_†G‡þ‚_† _‡Gˆÿ4^†„IÄ@ƒ¬ G‡þ^G†ÿ"i~nì~Ž&‹G‡ÿ I^ŽG†þ`X^@_Œ& „ &i~nì~Ž„ƒ Å„ )C{JøQÁVBG†þ1Ox _‡ *„)C~JðQÁ VBG†þOèO_‡ „ )C~JèQÁVBG†þ  OèOˆ_‡ G†þ_‡ _†  OàO€OèOˆ„)C{G†þi~ nì~Ž&‹G‡ýþ„)C~Xÿ&m&mg4&] I& _‡0 TOTAL MEMORY READS  = %4D #’ G„Üœ& _‡G†þ˜_‡„IÄ@tI& _‡@ READS W/O CACHE HITS  = %4D #¥ G„Ü™& _‡G†þ‡_‡„IÄ@tI& _‡P CACHE HITS ON READS  = %4D #¸ G„Ü–& _‡G†þp_‡„IÄ@tI& _‡` PROGRAM FETCHES (BYTES)= %4D #Ë G„Ü“& _‡G†þc_‡„IÄ@tI& _‡p INSTRUCTIONS FETCHED  = %4D #Þ G„Ü& _‡G†þR_‡„IÄ@tI& _‡€ INSTRUCTION PIPE LOADED %4D TIMES #ñ G„Ü& _‡G†þA_‡„IÄ@tI& _‡“ TOTAL MEMORY WRITES  = %4D $ G„Ü& _‡G†þ0_‡„IÄ@t&mg5&]&mg6 &]>À„G‹þ QÁVB  >G&OàOÐG'$>À„G‹ þQÁVB >G&OàOÀ G'>À„G‹ýýQÁVB >G&OàO°G'>G& Ã@QAVBHÿG‰ýÐI& _‡¤ SPECIFICATION EXCEPTION $b G„Ü@& _‡„IÄ@t&mg7&]>G&&m&mg8&]I^‚&m&mg9 &]g„üþIk) C g„üøIk ) C >G&@QÁVB g„üèIk) C >G& AVBg„ü×Ik) C &mg: &]>À†JþQAVBg„ üÅIk)C g„ü¿Ik)C > À†JÿQÁVBÀ>G&g$ &_‡G&Ã@QA VB>G&AV B _†ÁVBg„üŒIk )C ’>G&AVB >G&Ã@QAVB _†ÁVBg„ühIk )C n>G&AVB >G&AVB_† AVBg„üFIk)C  L>G&Ã@QAVB >G&Ã@QAVB _†AVBg„ü Ik )C &>G&AVB >G&AVB_† ÁVB g„ûþIk)C  g„ûøIk)C >G&g$ &_‡G&Ã@QA VB>G&Ã@QAVB _†ÁVBg„ûÊ Ik)C Ù>G&Ã@ QAVB>G&@QÁ VBg„û­Ik)C ¼> G&@QÁVB>G& @QÁVBg„û‘Ik) C  >G&AVB >G&Ã@QAVB_† Ã@QAVBg„ûkI k)C >À†QÁVBg„ û]Ik)C l>G&A VB>G&ÁVB _†AVBg„û;I k)C J>G&AVB >G&AVB_† ÁVBg„ûIk) C (>G&ÁVB >G&AVB _† AVB>À†QÁVB g„úïIk)C >À†JþQÁ VB_†@QÁVB g„ú×Ik) C g„úÏI k) C  _†_‡„IÄ@ƒý½&mg; &]>À„G‹ûxQÁVB >G&OàOàOèOèi~”nì~“&‹ ^ŽG&OG'>>À„G‹ ûZQÁVB>G&OàOà OOèOèOi~”nì~“&‹^ŽG& OG'>À„G‹û:QÁ VB>G&OàO°OèO¸^Ž @I^ŽG&OHG'I^Ž> G&AVÂ>G&g ÿ~”nì~“&ŠÃ@QAVBI& _‡² MEMORY EXCEPTION (read) '= G„Ùs& _‡„IÄ@t HÿG‰úã>G&_‡„IÄ@ ƒý_‡G†ú×i~”nì~“&‹ G‡úÏ_†_‡_„ & _‡Gˆ úÔ^ˆ„IÄ@ƒý^‹G‹‚ QÁVB_† _‡ G†ú¬i ~”nì~“&‹G‡ú¤%_† @ .G¦Ùà_‡ G†úœi~”nì~“&‹ G‡ú”_†_‡_„ & _‡ Gˆú™^ˆ„IÄ@ƒüÄ^‹^Jÿ QÁVB_† OèOˆ_‡  o^JþQÁVB _†  OpOèOˆ_‡ ^^JýQÁ VB _† OàOOèOˆ_‡  L^JüQÁVB _† Oà O€OèOˆ_‡ :^JûQÁ VB_† OèO_‡ *^ JúQÁVB _† OàOOè O_‡ ^SAVB ^@I^Ž_† ~xqDjÿn0c O OèOèO_‡ _† &m&mg< &]>À„G‹úQÁVB >G&OàOàOèOèi~–nì~•&‹ ^‰G&O_‡G&OàO€G' P>À„G‹ùÞQÁVB >G&OàOàOOèOèOi~– nì~•&‹^‰G&O_‡G& OàOG')>À„G‹ù¸QÁ VB>G&OàO°OèO¸^‰ @I^‰G&OH_‡G&OàOàO G'I^‰>G&_‡_† AVÂ_†gÿ~– nì~•&ŠÃ@QAVBI& _‡À MEMORY EXCEPTION (write) (É G„×õ& _‡„IÄ@t HÿG‰ùW_†_‡„IÄ@ƒ û_‡ _‡_„& _‡GˆùU ^ˆ„IÄ@ƒû‚^^ QA VB_† _‡Gˆù?^†„ IÄ@ƒý·_‡ ^ JÿQÁVB _† OpOx_‡ À^ Jþ QÁVB>G&OxG' _† OèOˆOàO€_‡_† OàO OèO_‡ „´@ôA_‡ š ^ JýQÁVB>G&Oè OG'_† OèOOàO_‡_† OàO€OèOˆ_‡ „´@ôA_‡ s^ JüQÁVB> G&OèOˆG'_† OxOp_‡  \^ JûQÁVB _†  OàOOèO_‡ J^ JúQÁ VB>G&OèOG'_† OèOOàO_‡ 1^ SA VB&^ @I^‰_† ~ xqD jÿn0c OOO_‡ >G&„ ´@ôA~ xqDjÿn0c O G' I& _‡ I& _‡ >G& „ ´@ôAG'^G‹QÁ VB_† _‡>G$&  _‡GˆøK^ˆ„IÄ@ƒúv^ _† @.>“>G&>G§×hG† ø.i~–nì~•&‹G‡ø&&mg= &]I& G‡÷gG„×U^I& _‡Î PROGRAM TO LOAD? *# G„Ö©& _‡„IÄ@t „IÄ@ƒ/G„÷]& _‡ÚINPUT*9 G„ÖŸ& _‡„IÄ@t QÁVB )g„÷F%ÀÀ' QAVÂI& _‡Ý *** SYNTAX ERROR *** *Z G„Ö & _‡„IÄ@tÿ¸I^‹éINPUT*i G„Ö~& _‡_„ & _‡„IÄ@t ^ JèQAVB,I& _‡ì Illegal File Accessed *… G„Öe& _‡„IÄ@tI& _‡ù Program not loaded  *” G„Öc& _‡„IÄ@tINPUT*Ÿ G„Öe& _‡„IÄ@t&m INPUT*­ G„ÖZ& _‡G„öß& _‡I&  _‡_„ & _‡ „IÄ@t INPUT*Æ G„ÖD& _‡_„ & _‡„IÄ@t ^ J‘QÁVÂ^ J±QÁ VÂ^ J“QÁVB+INPUT*î G„Ö& _‡_„& _‡„IÄ@tINPUT*þ G„Ö& _‡G„öŽ& _‡^&  _‡_„ & _‡ „IÄ@t í^ J‘QAVB^ J± QAVB ^ J“QAVB ^ JÀQAVBÍINPUT+9 G„ÕÚ& _‡_„& _‡I&  _‡_„ & _‡ „IÄ@t ^ JûQÁVB‡^QÁ VB€^ QÁVByINPUT+h G„Õ®& _‡G„ö$& _‡I &  _‡_„ & _‡ „IÄ@t G‰ö)g„ö %ÀÀ'Np)g„ö %àÀ'@gN& G‡õà)g„õû% ÀÀ'Np)g„õô%àÀ'@gN&  G‡õÚ)g„õé%ÀÀ'Np)g„õâ %àÀ'@gN& G‡õÆ) g„õ×% ÀÀ'Np) g„õÐ%àÀ'@gN&  G‡õ®) g„õÅ%ÀÀ'Np) g„õ¾ %àÀ'@gN& G‡õžHÿ^‹% ^ JüQÁVÂ^ JûQÁ VB^ G‹QÁVB ^& G‡õ…^ JúQÁ VÂ^ JùQÁVB?INPUT, G„Õ & _‡_„ & _‡„IÄ@tINPUT,  G„Ôü& _‡_„ & _‡„IÄ@t ~G†õP @^ %ÄÀ'G†õIi~“ nì~’&‹G‡õA^Jÿ^ŽQÁ VÂÿ÷^ JøQÁVB@!INPUT,W G„ÔÈ& _‡_„ & _‡„IÄ@t$INPUT,g G„Ô»& _‡_„ & _‡„IÄ@t ~G†õ @^ %ÄÀ'^Jÿ^ŽG† ôÿi~“nì~’&‹G‡ô÷^QÁ VÂÿâo^ J÷QÁVB4'INPUT,Ÿ G„Ô†& _‡_„ & _‡„IÄ@t*INPUT,¯ G„Ôy& _‡_„ & _‡„IÄ@t ~G†ôÁ @^ %ÄÀ'G†ôºi~“ nì~’&‹G‡ô²3^ JþQÁ VÂ^ JýQÁVB ^& G‡ôœ_I& _‡- Bad Type Code Found ,ï G„Ô<& _‡„IÄ@t9INPUT,ú G„Ô=& _‡„IÄ@t &mG†ô{Ogÿ~“nì~’&Š Ã@QAVB.I& _‡< MEMORY LIMIT EXCEEDED - G„Ô& _‡„IÄ@tI& _‡I PROGRAM NOT LOADED  -+ G„Ô& _‡„IÄ@tI& G‡ôIUINPUT-: G„Ô& _‡„IÄ@t&mý~XINPUT-H G„Ô& _‡„IÄ@tI& _‡[ Binary Target Program loaded -W G„Ô& _‡„IÄ@t&mg> &]I„)C{Hÿ^…^G‹Š SAVBHÿ^…^K^…J± RÁVÂ^„)C~„)C{„IÄ@t „)C{JøQÁVB^ Jþ^…>„)C~JóQÁ VB„)C~JøQÁVB Hÿ^…I& _‡„IÄ@t ^ @>‡„) C~& _‡„IÄ@t >g„ó¹%ÄÀ'ÿ^J±RÁ VB&m ^ @Ig„ó¤ %ÄÀ'^K^…ÿè&mÿÿÿ&] _‡O6Á ËGO6Á  Å_ˆG&mˆ @ .è?‰ H_ˆ @AQÁ _‡ @ _‡G?„hàD @AQÁ  O _‡_†6Â&+O _‡ _†t±O BžŽ?ˆ1»?ˆ 1¸?ˆ1D @AQÁ &m"DG‹Š SAVBHÿ^…^K^…J± RÁVÂ^„)C~„)C{„IÄ@t „)C{JøQÁVB^ Jþ^…>„)C~JóQÁ VB„)C~JøQÁVB Hÿ^…I& _‡„IÄ@t ^ @>‡„) C~& _‡„IÄ@t >g„ó¹%ÄÀ'ÿ^J±JOAKSIM2 DECODE DCODE:00JDCODE:10DCODE:20DCODE:30JDCODE:40DCODE:50BAD:OPCOJSRCH SCMP MOVE:BYTJTXLT GET:2:3:GET:1:2:JSIGN:EXTO0SEGMENTBLANK o XKSGNL:WAIWORD:FLAHALF KHALTED BIT:FLAGBYTE:FLAKPSW PTR2 PTR1 KWORD3   WORD2 WORD1 KCNTX:PTROPCODE DEST:LNGKDEST:ADDSRCE:LNGSRCE:ADDKOPERAND INST:REGPROGRAM:KFRAME:PTSTACK:PTGLOBAL:PKSPECIFICSEMAPHORPUTCRT KGETCRT WRITEF FETCH KSET:FLAGZERO:NEGWRITE:DAKREAD:DATigèg&]gt)C~N8 @G(t ^…„IÄ@>ü€Gt G‹ÏQÁVB„IÄ@t&mg&] gt )C~QÁVBGtGtngt )C~JÿQÁVB4Gt_‡Gt& _‡„IÄ@t!Gt @I Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@t/gt )C~JþQÁVBQGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt Gt gt ”@ÔAGt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tÓgt )C~JýQÁVBQGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt Gt gt ´@ôAGt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@twgt )C~JüQÁVBQGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt Gt gt ˜@ØAGt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tgt )C~JûQÁVB@Gt_‡Gt& _‡„IÄ@t!Gt  _‡I& _‡I& _‡„IÄ@tGt i~Œnì~‹&‹ Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Ðgt )C~JúQÁVB@Gt_‡Gt& _‡„IÄ@t!Gt  _‡I& _‡I& _‡„IÄ@tGt i~Œnì~‹&Š Gt Gt_‡Gt& _‡Gt _‡„IÄ@t …gt )C~JùQÁVB@Gt_‡Gt& _‡„IÄ@t!Gt I& _‡Gt  _‡I& _‡„IÄ@tGt @A QÁ Gt Gt_‡Gt& _‡Gt _‡„IÄ@t :gt )C~JøQÁVBYGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt Gt _‡Gt  _‡I& _‡„IÄ@tGt gt &Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Ögt )C~J÷QÁVBWGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt _‡Gt  _‡I& _‡„IÄ@tGt gt &Gt Gt_‡Gt& _‡Gt _‡„IÄ@t tgt )C~JöQÁVBFGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt _‡Gt  _‡I& _‡„IÄ@tGti~Œnì~‹&Š Gt#gt )C~JõQÁVBWGt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt gt ƒ-Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tÁgt )C~JóQÁVB Gti~Œnì~‹&Š Gtªgt )C~JòQÁVB.Gt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&‹ Gt_‡Gt& _‡Gt _‡„IÄ@t qgt )C~JñQÁVB`Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&‹ Gt_‡Gt& _‡Gt _‡„IÄ@t Gti~Œnì~‹&‹ Gt_‡Gt& _‡Gt _‡„IÄ@t  „IÄ@ƒX&mg&] gt )C~JðQÁVBVGt_‡Gt& _‡„  IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt_‡Gt& _‡Gt _‡„IÄ@t sgt )C~JïQÁVB¶Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt_‡Gt& _‡Gt _‡„IÄ@t Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t ²gt )C~JîQÁVB-Gti~Œnì~‹&‹ GtI& Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tzgt )C~JíQÁVB-Gti~Œnì~‹&‹ GtI& Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tBgt )C~JìQÁVB-Gti~Œnì~‹&‹ GtHÿ& Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@t gt )C~JëQÁVB,Gt_‡Gt& _‡„IÄ@t!Gt OàO€OìOŒGt Gt_‡Gt& _‡Gt _‡„IÄ@t Ógt )C~JêQÁVB,Gt_‡Gt& _‡„IÄ@t!Gt OàOOìO Gt Gt_‡Gt& _‡Gt _‡„IÄ@t œgt )C~JéQÁVBNGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&‹ Gt_‡Gt& _‡Gt _‡„IÄ@t Gt OìOìO Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Cgt )C~JèQÁVBMGt_‡Gt& _‡„IÄ@t!Gt  OàOàO@QAVBgtIk)C gtIk)C Gt O Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tëgt )C~JçQÁVBMGt_‡Gt& _‡„IÄ@t!Gt  OàOàO@QAVBgtIk)C gtIk)C Gt OGt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@t“gt )C~JæQÁVBMGt_‡Gt& _‡„IÄ@t!Gt  OèOèO@QAVBgtIk)C gtIk)C Gt OGt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@t;gt )C~JåQÁVBiGt_‡Gt& _‡„IÄ@t!Gt OOGt gt k)CJÿQÁVB Gt i~Œnì~‹&‹ Gt Gt  OàOàO@QAVBgtIk)C gtIk)C Gt O Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tÇgt )C~JäQÁVBgGt_‡Gt& _‡„IÄ@t!Gt OGt OOGt gt k)CJÿQÁVB Gt i~Œnì~‹&‹ Gt Gt  OàOàO@QAVBgtIk)C gtIk)C Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tUgt )C~JãQÁVB3Gt_‡Gt& _‡„IÄ@t!Gt O Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tgt )C~JâQÁVBuGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt gt k)CJÿQÁVB Gt i~Œnì~‹&‹ Gt Gt Gt Gt _‡Gt  _‡I& _‡„IÄ@tGt gt &Gt Gt_‡Gt& _‡Gt _‡„I! Ä@t —gt )C~JáQÁVB†Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt_‡Gt& _‡Gt _‡„IÄ@t  „IÄ@ƒ&mg&] gt )C~JàQÁVB†Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡Gt _‡„IÄ@t Gt_‡Gt& _‡Gt _‡„IÄ@t ¢gt )C~J×QÁVÂgt )C~JÔQÁVBqGt_‡Gt& _‡„IÄ@t!GtGt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!GtGt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!GtGt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gtgt )C~J×QÁVB„I Ä@ƒ´„IÄ@ƒºgt )C~JÖQÁVB„IÄ@ƒ¨gt )C~JÕQÁVB„IÄ@ƒjõgt )C~JÓQÁVB¨Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt OH_‡Gt& _‡Gt _‡„IÄ@t Gt  OHi~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!Gt Gt  OHi~Œnì~‹&‹ _‡Gt& _‡Gt _‡„IÄ@t Gt OH_‡Gt& _‡Gt _‡„IÄ@t Gt  OHi~Œnì~‹&‹ _‡Gt& _‡Gt _‡„IÄ@t Gti~Œnì~‹&Š GtBgt )C~JÒQÁVB‚Gt_‡Gt& _‡„IÄ@t!Gt OH_‡Gt& _‡„IÄ@t!Gt Gt gt  &@QAVBLGt  OHi~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!Gt OH_‡Gt& _‡Gt _‡„IÄ@t Gt  OHi~Œnì~‹&‹ _‡Gt& _‡Gt _‡„IÄ@t gtIk) C gtIk) C µgt )C~JÑQÁVB¤Gt_‡Gt& _‡„IÄ@t!Gt OH_‡Gt& _‡„IÄ@t!Gt Gt gt  &@QÁVBGt_‡Gt & _‡I& _‡„IÄ@t gtIk) C YGt OH_‡Gt& _‡„IÄ@t!Gt Gt OH_‡Gt& _‡Gt _‡„IÄ@t Gt  OHi~Œnì~‹&‹ _‡Gt& _‡Gt _‡„IÄ@t Gt_‡Gt& _‡Gt _‡„IÄ@t gt Ik) C „IÄ@ƒ K&mg&] gt )C~JÐQÁVBOGt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@tGt O(_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tÃgt )C~JÏQÁVBOGt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@tGt O8_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tigt )C~JÎQÁVBOGt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@tGt OH_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt _‡„IÄ@t Gt _‡„IÄ@tgt )C~JÍQÁVB©Gt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@tGt OH_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡G" t _‡„IÄ@t Gti~Œnì~‹&‹ GtGt OHi~Œnì~‹&‹ Gt _‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt _‡„IÄ@t gtIk) C gtIk) C Gt AVBgtIk) C Gt gt  ´@ôA@QÁVBgtIk) C [gt )C~JÌSÁVBgt )C~JÉRAVB¨„IÄ@ƒÎGt„IÄ@ƒ,Gtgt&Gt_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡„IÄ@t!Gt Gt _‡Gt  _‡I& _‡„IÄ@tgt )C~JËRÁVB Gt i~Œnì~‹&Š Gt gt  &AVB Gti~Œnì~‹&Š Gt Gt i~Œnì~‹&‹ Gt gt  &Ã@QAVB Gti~Œnì~‹&Š GtGt_‡Gt& _‡Gt _‡„IÄ@t gt )C~JÈQÁVÂgt )C~JÇQÁVB2„IÄ@ƒGtGti~Œnì~‹&‹ Gt_‡Gt& _‡GtO@_‡„IÄ@t GtGtGtgt&GtUgt )C~JÆQÁVÂgt )C~JÅQÁVBF„IÄ@ƒGtGti~Œnì~‹&Š gt&GtGt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!GtO(GtGt_‡Gt& _‡„IÄ@t!GtOHGtùgt )C~JÄQÁVBLGt_‡Gt& _‡„IÄ@t!Gt OH_‡Gt& _‡„IÄ@t!Gt i~Œnì~‹&‹ Gt  Ã@QAVBGt OH_‡Gt& _‡Gt _‡„IÄ@t HÿG t¢gt )C~JÃQÁVBJGt_‡Gt& _‡„IÄ@t!Gt OH_‡Gt& _‡„IÄ@t!Gt i~Œnì~‹&Š Gt ÁVBGt OH_‡Gt& _‡Gt _‡„IÄ@t HÿG tMgt )C~JÂQÁVB«„IÄ@t& Gt@QAVB9Gt_‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt O(Gt Gti~Œnì~‹&Š GtHÿG tGt i~Œnì~‹&Š @QÁVB=Gt  @QÁVÂ2„IÄ@tG tGt _‡Gt& _‡Gt& _‡„IÄ@t Gt i~Œnì~‹&‹ Gt Gt i~Œnì~‹&Š Gt ÿÅGt i~Œnì~‹&Š @QÁVB;Gt @QÁVÂ0Gt _‡Gt& _‡„IÄ@t!G t& _‡„IÄ@tGt i~Œnì~‹&‹ Gt Gt i~Œnì~‹&Š Gt ÿÇÇGt i~Œnì~‹&Š @QÁVB¸Gt _‡Gt& _‡„IÄ@t!G t JÐQÁVB I & _‡„IÄ@t I & _‡„IÄ@t I & _‡„IÄ@tHGt JÏQÁVB I & _‡„IÄ@t3Gt JÕQÁVBI & _‡„IÄ@t I& _‡„IÄ@t I & _‡„IÄ@t I & _‡„IÄ@tGt i~Œnì~‹&‹ Gt Gt i~Œnì~‹&Š Gt  Â@QÁVÂGt _‡Gt& _‡„IÄ@t!G t& _‡„IÄ@tÿÈ—gt )C~JÁQÁVB†Gt_‡Gt& _‡„IÄ@t!Gt @QÁVB‡Gti~Œnì~‹&Š GtGt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt& _‡Gt& _‡Gt _‡„IÄ@t Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt O(_‡„IÄ@t Gt_‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt OH_‡„IÄ@t åGt _‡Gt& _‡Gt OH_‡„IÄ@t Gt _‡Gt& _‡„IÄ@t!Gt Gt& _‡Gt& _‡Gt _‡„IÄ@t Gt  i~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!# Gt Gt_‡Gt& _‡Gt OH_‡„IÄ@t Gt  i~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt OH_‡„IÄ@t Gt  i~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt OH_‡„IÄ@t Gt  i~Œnì~‹&‹ _‡Gt& _‡„IÄ@t!Gt Gt_‡Gt& _‡Gt O(_‡„IÄ@t  „IÄ@ƒ+&mg&] gt )C~JÀSÁVB(gt )C~J½RAVBGt_‡Gt& _‡„IÄ@t!Gt Gti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt gt )C~JÀQÁVB%Gt O(_‡Gt& _‡Gt _‡„IÄ@t Gt _‡Gt& _‡„IÄ@t·gt )C~J¿QÁVB%Gt O8_‡Gt& _‡Gt _‡„IÄ@t Gt _‡Gt& _‡„IÄ@t‡gt )C~J¾QÁVB%Gt OH_‡Gt& _‡Gt _‡„IÄ@t Gt _‡Gt& _‡„IÄ@tWGti~Œnì~‹&Š Gt_‡Gt& _‡„IÄ@t!Gt Gt _‡Gt& _‡„IÄ@tGt OHGt _‡Gt& _‡Gt _‡„IÄ@t Gt  i~Œnì~‹&‹ _‡Gt& _‡Gt _‡„IÄ@t Gti~Œnì~‹&Š GtXgt )C~J¸SÁVBgt )C~J³RAVB…„IÄ@ƒ =GtGt_‡Gt& _‡„IÄ@t!Gt gt )C~J¸QÁV gt )C~J·QÁVBGt _‡Gt _‡I& _‡„IÄ@tGt gt&Gt Gt _‡Gt _‡I& _‡„IÄ@tGt gt&Gt gt )C~J´SAVBGt_‡Gt& _‡Gt _‡„IÄ@t ½gt )C~J²QÁVÂgt )C~J±QÁVB„IÄ@ƒ¢GtGtgt&Gt•gt )C~J¼SÁVBgt )C~JºRAVBy„IÄ@t& Gtgt )C~J¼RÁVBGtOp_‡ „IÄ@t `@_† ~Œnì~‹&‹ Gtgt )C~JºQÁVB(GtOp_‡ „IÄ@t `@_† ~Œnì~‹&‹ GtOp_‡ „IÄ@t `@_† ~Œnì~‹&‹ GtGti~Œnì~‹&‹ Gt_‡Gt& _‡Gt_‡„IÄ@t  „IÄ@ƒ&mg&] gt )C~J°QÁV gt )C~J¯QÁVB„IÄ@ƒâGtGtgt&Gtqgt )C~J®QÁVÂgt )C~J­QÁVBj„IÄ@ƒ÷GtGt_‡Gt& _‡„IÄ@t!Gt I& Gt GtAVÂ0Gt _‡Gt& _‡„IÄ@t!Gt Gt i~Œnì~‹&‹ Gt Gti~Œnì~‹&Š GtGt Ogt ´@ôAGt ÿÈGt_‡Gt& _‡Gt _‡„IÄ@t ñgt )C~J¬QÁVÂgt )C~J«QÁVBs„IÄ@ƒwGtGt_‡Gt& _‡„IÄ@t!Gt gtàAxqDjÿn0c O Gt Gt i~Œnì~‹&Š _‡Gt& _‡„IÄ@t!Gt GtAVÂ.Gt _‡Gt& _‡Gt _‡„IÄ@t Gti~Œnì~‹&Š GtGt i~Œnì~‹&‹ Gt Gt OGt ÿÊhgt )C~J©QÁVBGti~Œnì~‹&Š Gt „IÄ@t& GtGt_‡Gt& _‡„IÄ@t!Gt AVÂGt gt &Ã@QAVB Gti~Œnì~‹&‹ Gt Gt  OàOàOOèOèOi~Œnì~‹&Š @QÁVB Gti~Œnì~‹&‹ OGt GtOGt Gt gt &Gt _‡Gt& _‡„IÄ@t!Gt OàOOìO Gt Gt gt &GtÍgt )C~JªQÁVB/Gt_‡Gt& _‡„IÄ@t!Gt_‡Gt& _‡„IÄ@$ tGtO(GtGti~Œnì~‹&Š Gt“gt )C~J¨SÁVBgt )C~J¦RAVB†Gti~Œnì~‹&Š Gt „IÄ@ƒÒGtgt )C~J¦SAVB„IÄ@ƒ%;Gt Op_‡ „IÄ@ƒ²_Œ Œ „ ´@ôAGt Op_‡ „IÄ@ƒŸ_Œ Œ „ ´@ôAGt Op_‡ „IÄ@ƒŒ_Œ Œ „ ´@ôAGtGtgt &GtGti~Œnì~‹&‹ Gt_‡Gt& _‡GtO _‡„IÄ@t ÷gt )C~J¥QÁVBSGt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@t!Gt  Ã@QAVBGt i~Œnì~‹&Š Gt Gt _‡Gt& _‡Gt _‡„IÄ@t  Gti~Œnì~‹&Š Gt™gt )C~J¤QÁVÂgt )C~J£QÁVB}„IÄ@ƒGtGt_‡Gt& _‡„IÄ@t!Gt _‡Gt& _‡„IÄ@t!Gt OàOàOOìOìO Gt Gti~Œnì~‹&Š GtGt i~Œnì~‹&‹ Gt GtAVÂGt _‡Gt& _‡„IÄ@t!Gt Gt Ogt ´@ôAGt ÿÈGt_‡Gt& _‡Gt _‡„IÄ@t  „IÄ@ƒ&mg&]HÿG tI& _‡ ILLEGAL OPCODE FOUND  # G„äÛ& _‡„IÄ@tGt _‡IJý& _ŒŒ„àAxqDjÿn0c OG tGtO GŽ»G tI& _‡ P = %04X%04X OPCODE = %02X OG„ä½& _‡Gt& _‡Gt& _‡ gt )C~& _‡ „IÄ@t&mg &]Gt_‡ Gt_‡ I^‰Gt Â@QÁVÂGt Â@QÁV Gtgt &AVÂ¥GtO(_‡Gt& _‡„IÄ@t!_‡GtO(_‡Gt& _‡„IÄ@t! _ŒŒ„&@QÁVB8Gti~‘nì~&‹GtGti~‘nì~&ŠGt^ QÁVBGt i~‘nì~&Š_‡Gt& _‡Gt_‡„IÄ@t  Hÿ^‰^ G‹QÁVB _† Gt_† GtI^‰Gti~‘nì~&‹GtGti~‘nì~&ŠGtGt_‡Gt& _‡Gt_‡„IÄ@t  ÿ;^ G‹ÄQÁVBGt@QÁVBgtIk) C gtIk) C &mg  &]I& _‡ _† i~’nì~‘ &Š@QAVÂGt Â@QÁVÂGt Â@QÁVÂÓGtO(_‡Gt& _‡„IÄ@t!_‡ GtO(_‡Gt& _‡„IÄ@t! _‡ _† „ &@QÁVBˆGti~’nì~‘&‹GtGti~’nì~‘&‹GtGti~’nì~‘&ŠGtGti~’nì~‘&ŠGtGt i~’nì~‘&Š_‡Gt& _‡Gt_‡„IÄ@t Gt_‡Gt& _‡Gt_‡„IÄ@t Gt i~’nì~‘&Š_‡Gt& _‡Gt_‡„IÄ@t Gt i~’nì~‘&Š_‡Gt& _‡Gt_‡„IÄ@t  _† „ &Ã@QA VBHÿ& _‡ I&  _‡ ÿ _† _‡_† _‡ I& _‡„IÄ@t&mg &] Gt_‡Gt& _‡„IÄ@t!GtGt i~nì~Œ&Š _‡Gt& _‡„IÄ@t!GtGt i~nì~Œ&Š _‡Gt& _‡„IÄ@t!GtGt@QÁVŠGtO(_‡Gt& _‡„IÄ@t!^‰GtO(_‡Gt & _‡^ & _‡„IÄ@t Gti~nì~Œ&‹ GtGti~nì~Œ&‹ GtGti~nì~Œ&Š GtGt_‡Gt& _‡Gt_‡„IÄ@t Gt i~nì~Œ&Š _‡Gt& _‡Gt_‡„IÄ@t Gt i~nì~Œ&Š _‡Gt& _‡Gt_‡„IÄ@t ÿm&mg &]Gt_‡Gt& _‡„IÄ@t!_‡ Gt i~‘nì~&Š_‡Gt& _‡„IÄ@t!GtGt i~‘nì~&Š_‡Gt& _‡„IÄ@t!GtGt i~‘% nì~&Š_‡Gt& _‡„IÄ@t!GtHÿ& _‡ Gt@QÁV¶GtO(_‡Gt& _‡„IÄ@t! _‡ _‡_† O(_ŒŒ„&_‡ _‡Gt& _‡„IÄ@t! _‡ @QÁVÂGtO(_‡Gt & _‡_† _‡„IÄ@t Gti~‘nì~&‹GtGti~‘nì~&‹GtGti~‘nì~&ŠGtGt i~‘nì~&Š_‡Gt& _‡Gt_‡„IÄ@t Gt i~‘nì~&Š_‡Gt& _‡Gt_‡„IÄ@t Gt i~‘nì~&Š_‡Gt& _‡Gt_‡„IÄ@t ÿAGt @QÁVB_† @QAVBgtIk) C gtIk) C &mg  &]I& _‡_‡„IÄ@t `@_†~ˆnì~‡&‹_‡gt )C~XJÿQÁVB_†Op_‡„IÄ@t `@_†~ˆnì~‡&‹_‡_†&m&mg&]I& _‡gt )C~XQAVB_†_‡„IÄ@t `@_†~ˆnì~‡&‹_‡_†&m&mg&]gt )C~XQÁVB GtOàO€OìOŒGtGtOàOOìO Gt &mÿÿ&] _‡O6Á ËG O6Á Å_ˆG&mˆ @ .è?‰H_ˆ @AQÁ _‡  @_‡G?„hàD  @AQÁ O _‡_†6Â&+ O _‡_†t±O BžŽ?ˆ 1»?ˆ1¸?ˆ1D @AQÁ &mÿÿI& _‡_‡„IÄ@t `@_†~ˆnì~‡&‹_‡gt )C~XJÿQÁVB_†Op_‡„IÄ@t `@_†~ˆnì~‡&‹_‡_†&m&mg&]I& _‡gt ,3 6E-6F BCY 2,3 70-71 BGT 2,3 72-73 BLE 2,3 74-75 BGE 2,3 76-77 BLT 2,3  78-79 BHI 2,3 7A-7B BLS 2,3 7C-7D JMP 2,3 7E-7F JAL 2,3 80-8F LDL 1A,2,3  90-9F STL 1A,2,3 A0-AF ZRL 1A,2,3 B0-BF INL 1A,2,3 C0-C1 LDG 2,3 C2-C3 STG  2,3 C4-C5 LDGD 2,3 C6-C7 STGD 2,3 C8-C9 LDLA 2,3 CA-CB LDGA 2,3 CC-CD LDLD 2,3 CE-CF STLD 2,3 D0-D1 LDGX B 2,3 D2-D3 LDGX H 2,3 D4-D5 LDGX W 2,3 D6-D7 LDGX D 2,3  D8-D9 STGX B 2,3 DA-DB STGX H 2,3 DC-DD STGX W 2,3 DE-DF STGX D 2,3 E0-E1 LDLI B 2,3 E2-E3 LDLI H 2,3 E4-E5 LDLI W 2,3 E6-E7 LDLI D 2,3 E8-E9 STLI B 2,3 EA-EB STLI H 2,3 EC-ED STLI W 2,3 EE-EF STLI D 2,3 F0-F1 LDLX B 2,3 F2-F3 LDLX H 2,3 F4-F5 LDLX W 2,3 F6-F7  LDLX D 2,3 F8-F9 STLX B 2,3 FA-FB STLX H 2,3 FC-FD STLX W 2,3 FE-FF STLX D 2,3 2X INSTRUCTIONS 5F00 CDI 2X 5F01 CFI 2X 5F02 CID 2X 5F03 CIF 2X 5F04 DADD 2X 5F05 DCMP 2X 5F06 DSUB 2X 5F07 FADD 2X 5F08 FCMP 2X 5F09 FDIV 2X 5F0A FMULT 2X 5F0B FSUB 2X 3 F0-F1 LDLX B 2,3 F2-F3 LDLX H 2,3 F4-F5 LDLX W 2,3 F6-F7 .„ )C{„ )C~& _‡„IÄ@t „ )C~K„ )C{JüQÁ VÂÿ»„IÄ@ƒ÷„QÁVB$GtJóQÁVB Gt QÁVB&mGt JóQAVB„IÄ@ƒþt&mGt JüRÁVB„IÄ@ƒþd&mGt QAVBq_† @.>)G&t> G'tHÿ& GtGt JÿRÁVB_†i~nì~&‹ @.>)G&t> G'tGt JþRÁVB_†i~nì~&‹ @.>)G&t> G'tGt JýRÁVB_†i~nì~&‹ @.>)G&t> G't I & _‡„IÄ@t I*& _‡& „IÄ@tI& _‡GtJÕQÁV Gt JàQÁVB _†i~nì~&‹_‡jGt JÓQÁVB _†i~nì~&Š_‡UGt JÖQÁVB_† OH_‡EGt J¨QÁVB_† _‡6Gt JÑQÁVB_† @A QÁ i~nì~„ƒ ¶_‡GtQÁVÂGt JÔQÁVB&m„IÄ@ƒý_&mýð&mg  &] „IÄ@ƒö:QÁVB „IÄ@ƒýG&mGtJþSAV Gt JýRÁVB„IÄ@ƒý.&m)G&t)g$t &AVB)>ˆ)G&tOH>G't)>ˆ)G&t)g$t &i~‹nì~Š&Š >G't)>ˆ)G&tOH>G't)>ˆ)G&tOH>G't)G&t gÿ~‹nì~Š&Š Ã@QAV )G&t AVB„IÄ@ƒüÎ &mI & _‡„IÄ@t I & _‡„IÄ@t I & _‡„IÄ@t)G&t O@_‡„IÄ@ƒüeI & _‡„IÄ@t I^…I & _‡„IÄ@t)>ˆ)G&t @.G&t>G't)G&t _‡„IÄ@ƒü8^K^…)G&ti~‹nì~Š&‹ G't)G&t)g$t &Ã@QAVÂ^Jü QÁVÂÿ·Gt JýQÁVB4)G&t i ~‹nì~Š&Š @QÁVB $^JüSAVBI_‹ G€ ^†I & _‡„IÄ@t ^Jÿ^†QÁVÂÿëGt JýQÁVB)G&t i ~‹nì~Š&Š @QÁVB }I & _‡„IÄ@t I & _‡„IÄ@t)>ˆ)G&t~~‹nì~Š&Š >G't)>ˆ)G&t @.G&t>G'tI^†)>ˆ)G&tOr>G't)G&t GŽž„)C{JàSAV „)C~JRÁVB I.„)C{„)C~& _‡„IÄ@t ^K^†JüQÁVÂÿ¾ ^Jÿ^…QÁVÂÿ—)G&t)g$t &Ã@QAVÂþ?ÿÿÿÿÿe;791001111004791001111004791007175304eú@€791001111004791001111004791001111004e:' 791001111004791001111004791001111004e791001111004791001111004791001111004791001111004791001111004791001111004e>¯|%7910071751185079100717513675791007175136deBF‹"7910051404577579100514051600791005140516deˆ'MF7910020941545079100209420575791002094205d e>L—é7910020942167579100209423550791002094235d(  eŠEóª7910031908530079100319091300791003190913d e¶$ô7910071751535079100717520125791007175201d eÉ*S_7910051405335079100514054600791005140546d e³™7910011347277579100113473300791007150618eÏ.U7910011349055079100113491450791005135246deç¦7910011354255079100113543025791001135430deé) k7910011354407579100113544600791001135446deì …7910011615357579100116154075791001161540d* + , - . / 0 àÀp. OAKSIM1 ALMOAKSIM2 ALMOAKSIM3 ALM OAKSIM4 ALM OAKSIM DOC OAKSIM1 OBJ OAKSIM2 OBJ OAKSIM JCLOAKSIM3 OBJGETCRT ASMPUTCRT ASMOAKSIM HLP\ O A K S I M U L A T O R S E C T I O N # 4 LISTING # 8 4 - 9 3 1 5 0 - 1 3 A 0 CONTENTS: (AS ARRANGED) MONITOR MAP_LETTER GET_GENERAL LONG_PARAM 1  GET_PARAMETER GET_ALL_PARAMETERS LIST_GEN INSP_GEN MODIFY_POINTERS  PRINT_ASCII_FROM_HEX DEBUG_ERROR INSPECT_MEMORY DEBUG_LIST  DEBUG_JUMP EXECUTE_PROGRAM PRINT_POINTERS A_TO_H A_TO_H_BYTE  DEBUG_UTILITY DEBUG_COPY SEARCH_MEMORY FILL_MEMORY \ %EJECT; \ SIMULATOR SEGMENT 4 OAKSIM4.ALM \ \ COMMAND SUMMARY Ba,b,c,d,e Set temporary breakpoints (up to 5) at a, b, c, d and e. Re-enter user program according to Program_ptr contents. Cs,e,n Copy memory from s to e inclusive, into new area starting at n. E Enter user program according to Program_ptr contents.  Terminate Simulator if TRAP 0 inst. is executed. Fa,v Fill location a with value v. Fs,e,v Fill memory from s to e inclusive with constant value v. Fs,e,v,d Fill memory from s to e inclusive, using d as an increment/decrement to build a pattern. G List all General Registers. Gg Display General Register g, (where g= 0-9, A-Z). Ggv Change General Register g to value v. Ia or I.a Inspect memory at location a.  If the period is included, then the address is a byte address (as on the program listing) and  the word pointed to is displayed. After value is displayed, commands are: space or + inspect next location. - inspect previous location. * inspect indirect / display value/2 X display value x 2. Consecutive memory locations can be altered by providing new values separated by commas. (Up to 4) Ia,A or I.a,A Inspect (as above) but show ascii equivalent of contents. J Re-enter user program according to the Program_ptr. Jt Re-enter user program at location t. Jt,a,b,c,d Set temporary breakpoints at a, b, c, and d.  Re-enter user program at location t. Ls,e List memory from s to e inclusive (s <= e). Ls,e,A List memory from s to e inclusive with ASCII equivalents. (s <= e). Ls,n List memory from s for :n locations (s > n). Ls,n,A List memory from s for :n locations with ASCII equivalents ( s > n ). R  Display all user Pointers, Status Flags(Condition Codes) and top 4 entries on the Stack. Rr Display user pointer or flag where r = P,F,S,G,Z,C,N,V Rrv Change user pointer or flag to value v. Flags are  affected by bit 31 (LSB) only. RR* Reset all Simulator counters. RR List all Simulator Counters on the Standard-Output. Ss,e,v Search memory from s to e ( s <= e ) for value v. Ss,e,v,m Search memory from s to e (s <=e) for value under mask m, where zero bits of m are don't care bits. Ss,e,v,- Search memory fr2 om s to e (s <=e) for non-match of value v. T Terminate Simulator. U List operators for the calculator. Uexp Calculate expression. Evaluation is strictly left to right. The expression consists of any number of values separated by operators as listed below: + addition  - subtraction * multiplication / division ^ exponential & logical and | logical inclusive or ! logical exclusive or (XOR) W Initiate the OAK binary loader. Y Single Step. Re-enter user program according to the  Program_ptr and return after execution of one instruction. \ %EJECT; segment OAKSIM4; proc WRITEF external; proc GETCRT external returns (WORD); proc PUTCRT external; proc FETCH external returns (byte); proc DECODE external; proc LOADER external; proc GIVE_STATUS external; %sub TRUE = "X:FFFF"; %sub FALSE = "0"; %sub ADD = "1"; %sub SUB = "0"; %sub COMPARE = "2"; %sub S_IN = "5"; %sub S_OUT = "6"; %SUB RESET = "0"; %SUB SET = "1"; %SUB MAX_MEM = "4095"; %sub KBDLOCK = "X:19"; %sub KBDUNLOCK = "X:06"; %sub CURSORON = "X:13"; %sub CURSOROFF = "X:14"; %sub CURSORLEFT = "X:15"; %sub CURSORRIGHT = "X:09"; %sub CURSORUP = "X:16"; %sub CURSORDOWN = "X:17"; %sub CURSORPOSITION = "X:02"; %sub CURSORREAD = "X:0E"; %sub SCREENON = "X:12"; %sub ERASESCREEN = "X:0C"; %sub ERASEFRAME = "X:1C"; %sub ERASELINE = "X:1D"; %sub ROLLUP = "X:0B"; %sub HOME = "X:1E";  \ GLOBAL DATA \ dcl MEMORY[MAX_MEM] external dbl, GLOBAL_PTR external dbl, STACK_PTR  external dbl, FRAME_PTR external dbl, PROGRAM_PTR external dbl, ! byte address PIPE_PTR external dbl, INST_REG external byte, INST_FETCH_CNT external dbl, PROG_FETCH_CNT  external dbl, HITS external dbl, MEM_READS external dbl, MEM_REFS_NO_HIT external dbl, I_PIPE_LOADS external dbl, MEM_WRITES external dbl, WORD1 external dbl,  STATUS external word, PTR1 external word, PSW external structure  (CLOCK word, ! Virtual Clock I_BIT bit, ! Interrupt Enable  G_BIT bit, ! Group Int. Enable U_BIT bit, ! User Mode S_BIT  bit, ! Virtual System Mode T_BIT bit, ! Trace Trap H_BIT bit, ! Halt State W_BIT bit, ! Writable ! Control  ! Store SPARE1 bit, ! Spare SPARE2  bit, ! Spare D_BIT bit, ! Decimal Overflow ! Trap Mask E_BIT bit, ! Exponent Underflow ! Trap Mask 3  F_BIT bit, ! Floating Point ! Overflow Trap Mask  ZERO bit, NEGATIVE bit, CARRY bit,  OVERFLOW bit ), \ THE FOLLOWING GLOBALS ARE USED BY MONITOR \ COMMAND1 external word,  COMMAND2 external word, PARAMS external word, TERM_CHR external word, SEPARATOR external word, PAR[4] external dbl, GEN[35] external dbl, \ FLAGS \ BYTE_FLAG external word,  HALTED ext word, HALF external word, WORD_FLAG external word, UMT external word; %EJECT; \ M O N I T O R \ \ THIS MONITOR ROUTINE HAS BEEN MODELED AFTER THE DEBUG4 PROGRAM USED ON THE NM4 COMPUTERS. \ proc MONITOR UNIV; loop; PUTCRT('^CR'); PUTCRT('^nl'); PUTCRT(' '); PUTCRT('<'); PUTCRT('O'); PUTCRT('A'); PUTCRT('K'); PUTCRT('>'); PUTCRT('^bel'); COMMAND2 = 0;  COMMAND1 = GETCRT(); COMMAND1 = MAP_LETTER(COMMAND1); if COMMAND1 = 'R' then COMMAND2 = GETCRT(); COMMAND2 = MAP_LETTER(COMMAND2); if COMMAND2 = '^bs' then COMMAND1 = FALSE; elif COMMAND2 = '^cr' then PRINT_POINTERS(); elif COMMAND2 ='P' or COMMAND2 ='G' or COMMAND2 ='F' or COMMAND2 ='S' or COMMAND2 ='Z' or COMMAND2 ='V' or COMMAND2 ='C' or COMMAND2 ='N' or COMMAND2 = 'R' then if GET_ALL_PARAMETERS() = TRUE then MODIFY_POINTERS(); elif TERM_CHR = '^cr' and  (SEPARATOR=0 or SEPARATOR='*') then MODIFY_POINTERS();  else COMMAND1 = FALSE; fi; fi; fi; if COMMAND1 = 'I' then INSPECT_MEMORY(); elif COMMAND1 = 'J' or COMMAND1 = 'B' or COMMAND1 = 'Y' then DEBUG_JUMP(); elif COMMAND1 = 'T' then COMMAND1 = 0; break if GETCRT() = '^cr'; elif COMMAND1 = 'L' then DEBUG_LIST(); elif COMMAND1 = 'E' then if GETCRT() # '^cr' then DEBUG_ERROR(); else EXECUTE_PROGRAM(); fi; elif COMMAND1 = 'W' then if GETCRT() # '^cr' then DEBUG_ERROR(); else LOADER(); fi; elif COMMAND1 = 'C' then DEBUG_COPY(); elif COMMAND1 = 'U' then DEBUG_UTILITY(); elif COMMAND1 = 'F' then FILL_MEMORY(); elif COMMAND1 = 'G' then COMMAND2 = GETCRT(); COMMAND2 = MAP_LETTER(COMMAND2); if (COMMAND2>='0' and COMMAND2<='9') or (COMMAND2>='A' and COMMAND2<='Z') then if GET_ALL_PARAMETERS() = TRUE then INSP_GEN(); elif TERM_CHR='^cr' and SEPARATOR=0 4  then INSP_GEN(); else DEBUG_ERROR(); fi; elif COMMAND2 = '^cr' then LIST_GEN(); else DEBUG_ERROR(); fi; elif COMMAND1 = 'S' then SEARCH_MEMORY(); elif COMMAND1 # 'R' then DEBUG_ERROR(); fi; break if COMMAND1 = 'T'; repeat; end MONITOR; %eject; \ M A P _ L E T T E R -- Map_Letter transforms the small alphabetical letters (a-z) into the capital letters (A-Z). All other input is returned as received. \ proc MAP_LETTER(CHR) univ returns (word); dcl CHR word; if CHR < 'a' or CHR > 'z' then return (CHR); else return (CHR-X:20); fi; end MAP_LETTER; \ G E T _ G E N E R A L -- Get_General reads one character  from the CRT. If the character is 0-9, A-Z, or a-z then PAR[0]  is loaded with the corresponding value from the General-Purpose  register and TRUE is returned, otherwise PAR[0] is set to zero (0)  and FALSE is returned. \ proc GET_GENERAL univ returns (WORD); dcl C word; C = GETCRT(); C = MAP_LETTER(C); if C >= '0' and C <= '9' then C = C & X:F; elif C >= 'A' and C <= 'Z' then C = C - X:37; else PAR[0] = 0; return (FALSE); fi; PAR[0] = GEN[C]; return (TRUE); end GET_GENERAL; %eject; \ L O N G _ P A R A M -- Long_Param is used by Get_All_Parameters to receive parameters that contain embedded + and - signs. The total value of the parameter is loaded into PAR[0] and TRUE is returned to the calling routine. If there is a syntax error or a '^bs' inputted, then FALSE is returned. \ proc LONG_PARAM univ returns (WORD); dcl TEMP dbl, FLAG word; TEMP = 0; FLAG = FALSE; loop;  if GET_PARAMETER() = FALSE then if (TERM_CHR = '^cr' and SEPARATOR=0) or TERM_CHR = '^bs'  then return (FALSE); elif TERM_CHR='^cr' and SEPARATOR#0 then PAR[0] = TEMP;  return (FLAG); fi; elif SEPARATOR = '+' then TEMP = * + PAR[0]; FLAG = TRUE; elif SEPARATOR = '-' then TEMP = * - PAR[0]; FLAG = TRUE; else TEMP = PAR[0]; FLAG = TRUE; fi; PAR[0] = TEMP; if TERM_CHR = '^cr' or TERM_CHR = ',' then return(TRUE); fi; repeat; end LONG_PARAM; %EJECT; \ G E T _ P A R A M E T E R -- Get_Parameter is used by the Monitor to get debugging commands.  FLAG is returned to the calling procedure TRUE if a valid parameter is received from the  crt, else FALSE is returned. A ^bs in the input causes FALSE to be returned. 5  TERM_CHR is set to the last non-hex character received as input. SEPARATOR is set to the next-to-last non-hex character received as input. A valid parameter consists of 0 to 8 hex-characters. Only the last 8 valid characters are returned as the inputted parameter. \ proc GET_PARAMETER UNIV returns (word); dcl C,FLAG word, TEMP DBL; TEMP = 0; FLAG = FALSE; loop; C = GETCRT(); C = MAP_LETTER(C); break if (C < '0' or C > '9') and (C < 'A' or C > 'G'); if C = 'G' then if GET_GENERAL() = FALSE  then C='^bs'; break; else TEMP = * + PAR[0]; FLAG = TRUE; fi; else C = A_TO_H_BYTE(C); TEMP = TEMP sll 4 | C; FLAG = TRUE;  fi; repeat; if C = '^bs' then FLAG = FALSE; TEMP = 0; fi; SEPARATOR = TERM_CHR;  TERM_CHR = C; PAR[0] = TEMP; return (FLAG); end GET_PARAMETER; %EJECT; \ G E T _ A L L _ P A R A M E T E R S  \ \ Get_All_Parameters loads PAR[1],PAR[2],PAR[3], and PAR[4] with parameters just received by separate calls to Long_Param. If the input contains a '^bs' or has illegal syntax, then FALSE is returned to the calling routine; otherwise TRUE is returned. \ proc GET_ALL_PARAMETERS UNIV returns (Word); dcl I word; I = 0; loop; PAR[I] = 0; I = * + 1; break if I > 4; repeat; PARAMS = 0; SEPARATOR = 0; TERM_CHR = 0; loop; if LONG_PARAM() = FALSE then if COMMAND1='S' and  TERM_CHR='^cr' and SEPARATOR='-' then return (TRUE); else return (FALSE); fi; fi; if PARAMS < 4 then PAR[PARAMS+1] = PAR[0]; PARAMS = * + 1; elif PARAMS = 4 then if TERM_CHR # '^cr' then PAR[0] = 0; return (FALSE);  else PARAMS = 5; return (TRUE); fi; fi; break if TERM_CHR = '^cr' or PARAMS > 4; repeat; PAR[0] = 0; return (TRUE); end GET_ALL_PARAMETERS; %EJECT; \ L I S T _ G E N -- List_Gen when called, prints a list of the General-Purpose Register contents on the CRT. \ proc LIST_GEN univ; dcl REG,I,J,K word; REG = '0'; J = 0; K = 0; loop; break if J > 8; PUTCRT('^NL'); PUTCRT('^CR'); PUTCRT(' '); I = 0; loop; break if I > 3; PUTCRT('G'); if REG = '9'+1 then REG = 'A'; fi; PUTCRT(REG); PUTCRT(' '); PRINT_ASCII_FROM_HEX(GEN[K]); PUTCRT(' ');  PUTCRT(' '); I = * + 1; K = * + 1; REG = * + 1; repeat; J = * + 1; repeat; end LIST_GEN; %EJECT; \ I N S P _ G E N -- Insp_Gen allows the user to inspect and (or) modify the contents of any 6  General-Purpose Registers. \ proc INSP_GEN univ; dcl CHR word; ! --- develop an index into GEN[] --- if (COMMAND2>='0' and COMMAND2<='9') then CHR = COMMAND2 & X:F; else CHR = COMMAND2 - X:37; fi; if PARAMS = 1 then GEN[CHR] = PAR[1]; return; fi; PUTCRT('^nl'); PUTCRT(' '); PUTCRT('G'); PUTCRT(COMMAND2); PUTCRT(' '); PRINT_ASCII_FROM_HEX(GEN[CHR]); PUTCRT(' '); if GET_ALL_PARAMETERS()=FALSE then if TERM_CHR # '^cr' or PARAMS > 1 then DEBUG_ERROR(); fi; return; fi; GEN[CHR] = PAR[1]; end INSP_GEN; %EJECT; \ M O D I F Y _ P O I N T E R S -- Allows the user to inspect and (or) modify any pointer or condition code bit. \ proc MODIFY_POINTERS UNIV; if PARAMS = 1 then if COMMAND2 = 'P' then PROGRAM_PTR = PAR[1]; elif COMMAND2 = 'G' then GLOBAL_PTR = PAR[1] slr 5; elif COMMAND2 = 'F' then FRAME_PTR = PAR[1] slr 5; elif COMMAND2 = 'S' then STACK_PTR = PAR[1] slr 5; elif COMMAND2 = 'Z' then if PAR[1] & 1 = 1 then PSW.ZERO = SET; else PSW.ZERO = RESET;  fi; elif COMMAND2 = 'V' then if PAR[1] & 1 = 1 then PSW.OVERFLOW = SET; else PSW.OVERFLOW = RESET; fi; elif COMMAND2 = 'N'  then if PAR[1] & 1 = 1 then PSW.NEGATIVE = SET; else PSW.NEGATIVE = RESET; fi; elif COMMAND2 = 'C' then if PAR[1] & 1 = 1  then PSW.CARRY = SET; else PSW.CARRY = RESET; fi; else DEBUG_ERROR(); return; fi; else PUTCRT('^nl'); PUTCRT(' '); if COMMAND2 = 'P' then PUTCRT('P'); PUTCRT(' '); PRINT_ASCII_FROM_HEX(PROGRAM_PTR SLL 3); PUTCRT(' '); PUTCRT('('); PRINT_ASCII_FROM_HEX(PROGRAM_PTR); PUTCRT(')'); PUTCRT('B'); PUTCRT(' '); if LONG_PARAM() = FALSE  then if TERM_CHR # '^cr' then DEBUG_ERROR(); fi;  else PROGRAM_PTR= PAR[0]; fi; return; elif COMMAND2 = 'G'  then PUTCRT('G'); PUTCRT(' '); PRINT_ASCII_FROM_HEX(GLOBAL_PTR SLL 5);  PUTCRT(' '); if LONG_PARAM() = FALSE then if TERM_CHR # '^cr'  then DEBUG_ERROR(); fi; else GLOBAL_PTR= PAR[0] slr 5;  fi; return; elif COMMAND2 = 'F' then PUTCRT('F'); 7 PUTCRT(' '); PRINT_ASCII_FROM_HEX(FRAME_PTR SLL 5); PUTCRT(' '); if  LONG_PARAM() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR();  fi; else FRAME_PTR = PAR[0] slr 5; fi; return; elif COMMAND2 = 'S' then PUTCRT('S'); PUTCRT(' '); PRINT_ASCII_FROM_HEX(STACK_PTR SLL 5); PUTCRT(' '); if LONG_PARAM() = FALSE  then if TERM_CHR # '^cr' then DEBUG_ERROR(); fi;  else STACK_PTR = PAR[0] slr 5; fi; return; elif COMMAND2 = 'Z'  then PUTCRT('Z'); PUTCRT(' '); if PSW.ZERO = SET then PUTCRT('1'); else PUTCRT('0'); fi; PUTCRT(' '); if LONG_PARAM() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR();  fi; elif PAR[0] sll 31 # 0 then PSW.ZERO = SET; else PSW.ZERO = RESET; fi; return; elif COMMAND2 = 'V' then PUTCRT('V'); PUTCRT(' '); if PSW.OVERFLOW = SET then PUTCRT('1'); else PUTCRT('0'); fi; PUTCRT(' '); if LONG_PARAM() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR();  fi; elif PAR[0] sll 31 # 0 then PSW.OVERFLOW = SET; else PSW.OVERFLOW = RESET; fi; return; elif COMMAND2 = 'C' then PUTCRT('C'); PUTCRT(' '); if PSW.CARRY = SET then PUTCRT('1');  else PUTCRT('0'); fi; PUTCRT(' '); if LONG_PARAM() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR();  fi; elif PAR[0] sll 31 # 0 then PSW.CARRY = SET; else PSW.CARRY = RESET; fi; return; elif COMMAND2 = 'N' then PUTCRT('N'); PUTCRT(' '); if PSW.NEGATIVE = SET then PUTCRT('1');  else PUTCRT('0'); fi; PUTCRT(' '); if LONG_PARAM() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR();  fi; elif PAR[0] sll 31 # 0 then PSW.NEGATIVE = SET; else PS8 W.NEGATIVE = RESET; fi; return; elif COMMAND2 = 'R' !RESET COUNTERS  then if SEPARATOR # '*' then GIVE_STATUS(); else HITS = 0; MEM_READS = 0; MEM_REFS_NO_HIT = 0; PROG_FETCH_CNT = 0;  INST_FETCH_CNT = 0; I_PIPE_LOADS = 0; MEM_WRITES = 0; fi;  else DEBUG_ERROR(); fi; fi; end MODIFY_POINTERS; %EJECT; \ P R I N T _ A S C I I _ F R O M _ H E X \ \ Print_Ascii_From_Hex is used to print on the crt the eight (8) hexidecimal digits in  a 32-bit word. INPUT - any double word (32-bits). OUTPUT - to CRT - 8 (eight) characters that range from 0-9, A-F. \ proc PRINT_ASCII_FROM_HEX (VALUE) UNIV; dcl VALUE dbl,  OUT byte, I word; I = 8; loop; VALUE = VALUE rotl 4; OUT = VALUE & X:F;  if OUT > 9 then OUT = (OUT - 9) + X:10; fi; OUT = OUT + X:30; PUTCRT (OUT); I = * - 1; break if I = 0; repeat; end PRINT_ASCII_FROM_HEX; \ D E B U G _ E R R O R \ proc DEBUG_ERROR UNIV; PUTCRT('^bel'); PUTCRT(ERASELINE); end DEBUG_ERROR; %EJECT; \ I N S P E C T _ M E M O R Y \ PROC INSPECT_MEMORY UNIV; DCL ADDR DBL, I dbl, OUT byte, J byte, FLAG word,  CONTENTS dbl; if LONG_PARAM() = FALSE then DEBUG_ERROR(); return; elif SEPARATOR = '.' then ADDR = PAR[0] slr 2; else ADDR = PAR[0] slr 5; fi; FLAG = FALSE; if TERM_CHR = ',' then if LONG_PARAM() = FALSE or TERM_CHR # '^cr' or PAR[0] # X:A then DEBUG_ERROR(); return; fi;  FLAG = TRUE; elif TERM_CHR # '^cr' then DEBUG_ERROR(); return; fi; I = 0; loop; if ADDR < 0 or ADDR > MAX_MEM then DEBUG_ERROR(); return; fi; PUTCRT('^NL');  PUTCRT('^CR'); PUTCRT(' '); PRINT_ASCII_FROM_HEX (ADDR sll 5); PUTCRT(' '); CONTENTS = MEMORY [ ADDR ]; PRINT_ASCII_FROM_HEX (CONTENTS + I ); PUTCRT(' '); if FLAG = TRUE then PAR[4] = CONTENTS; J = 0; loop; PAR[4] = * rotl 8;  OUT = PAR[4] & X:FF; if (out < ' ' or out > X:7F) then out = '.';  fi; putcrt(out); j=*+1; break if j=4; repeat; fi; if GET_ALL_PARAMETERS() = FALSE then if TERM_CHR = '^cr' and SEPARATOR = 0  then return; elif TERM_CHR # '^cr' then DEBUG_ERROR();  return; fi; fi; if PARAMS > 4 then DEBUG_ERROR(); return; fi; if PARAMS # 0 9  then MEMORY [ADDR] = PAR[1]; PIPE_PTR = X:FFFFFFFF; ! ALLOW PROPER EXECUTION IF !  PROGRAM WAS ALTERED. if PARAMS > 1 then MEMORY[ADDR+1] = PAR[2]; fi;  if PARAMS > 2 then MEMORY[ADDR+2] = PAR[3]; fi; if PARAMS > 3 then MEMORY[ADDR+3] = PAR[4]; fi; PUTCRT('^CR'); PUTCRT('*'); fi; I = 0; if SEPARATOR = '+' or SEPARATOR = ' ' then ADDR = * + 1; elif SEPARATOR = '-' then ADDR = * - 1; elif SEPARATOR = '*' then ADDR = CONTENTS slr 5; elif SEPARATOR = 'X' then I = CONTENTS; elif SEPARATOR = '/' then I = - CONTENTS / 2 ; elif SEPARATOR = 0 or SEPARATOR = ',' then return; else DEBUG_ERROR(); return; fi; repeat; end INSPECT_MEMORY; %EJECT; \ D E B U G _ L I S T \ proc DEBUG_LIST UNIV; dcl I,J word, OUT byte; if GET_ALL_PARAMETERS() = FALSE then DEBUG_ERROR(); return; fi; if PARAMS < 2 or PARAMS > 3 then DEBUG_ERROR(); return; fi; if PAR[2] < PAR[1] then PAR[1] = PAR[1] slr 5; PAR[2] = PAR[1] + PAR[2] - 1; else PAR[1] = PAR[1] slr 5; PAR[2] = PAR[2] slr 5; fi; loop; if PAR[2] > MAX_MEM or PAR[1] < 0 then DEBUG_ERROR(); return; fi; PUTCRT('^NL'); PUTCRT('^CR'); PUTCRT(' '); PRINT_ASCII_FROM_HEX(PAR[1] sll 5); PUTCRT(' '); I = 0; loop; PUTCRT(' '); PAR[4] = MEMORY[PAR[1]]; PRINT_ASCII_FROM_HEX(PAR[4]);  I = * + 1; PAR[1] = * + 1; break if (PAR[1] > PAR[2]) or (I = 4); repeat; if (PARAMS = 3) and (PAR[3] = X:A) and (I < 4) then J = (4 - I) * 9; loop;  PUTCRT(' '); J = * - 1; break if J = 0; repeat; fi; if (PARAMS = 3) and (PAR[3] = X:A) then PUTCRT(' '); PUTCRT(' ');  loop; PAR[0] = PAR[1] - I; PAR[4] = MEMORY [PAR[0]]; J = 0;  loop; PAR[4] = PAR[4] rotl 8; OUT = PAR[4] & X:FF;  if (OUT < ' ' or OUT > X:7F) then OUT = '.'; fi;  PUTCRT(OUT); J = * + 1; break if J = 4; repeat; I = * - 1; break if I = 0; repeat; fi; break if PAR[1] > PAR[2]; repeat; end DEBUG_LIST; %EJECT; \ D E B U G _ J U M P \ proc DEBUG_JUMP UNIV; HALTED = FALSE; if COMMAND1 # 'Y' then if GET_ALL_PARAMETERS() = FALSE then if TERM_CHR # '^cr' then DEBUG_ERROR(); return; fi; fi; fi; if COMMAND1 = 'J: ' and PARAMS > 0 then PROGRAM_PTR = PAR[1]; fi; if PARAMS < 5 then PAR[0] = -1; fi; loop;  INST_REG = FETCH(); INST_FETCH_CNT = * + 1; DECODE(); break if HALTED=TRUE or (PROGRAM_PTR=PAR[1] and COMMAND1='B') or PROGRAM_PTR = PAR[2] or COMMAND1 = 'Y' or PROGRAM_PTR = PAR[3] or PROGRAM_PTR = PAR[4] or  PROGRAM_PTR = PAR[0]; repeat; PRINT_POINTERS(); end DEBUG_JUMP; %EJECT; \ E X E C U T E _ P R O G R A M \ proc EXECUTE_PROGRAM UNIV; HALTED = FALSE; if GETCRT() = '^cr' then loop; INST_REG = FETCH();  INST_FETCH_CNT = * + 1; DECODE(); break if HALTED = TRUE; repeat; PRINT_POINTERS();  COMMAND1 = 'T'; else DEBUG_ERROR(); fi; end EXECUTE_PROGRAM; %EJECT; \ P R I N T _ P O I N T E R S \ proc PRINT_POINTERS UNIV; dcl TEMP dbl, TEMP1 word, TEMP2 word, PTR3 word, PTR4 word, PTR1 word, PTR2 word; WRITEF(S_OUT,"^nl LAST INSTRUCTION EXECUTED = :%2X ^EOS", INST_REG); TEMP = MEMORY[STACK_PTR-3]; TEMP1 = TEMP slr 16; TEMP2 = TEMP & X:FFFF; PTR1 = PROGRAM_PTR slr (16 - 3);  PTR2 = PROGRAM_PTR sll 3 & X:FFFF; PTR3 = PROGRAM_PTR slr 16; PTR4 = PROGRAM_PTR & X:FFFF; WRITEF(S_OUT,"^NL P = %04X%04X (%04X%04X)B T3 = %04X%04X ^eos", PTR1,PTR2,PTR3,PTR4,TEMP1,TEMP2); TEMP = MEMORY [STACK_PTR-2]; TEMP1 = TEMP slr 16; TEMP2 = TEMP & X:FFFF; PTR1 = STACK_PTR slr (16 - 5); PTR2 = STACK_PTR sll 5 & X:FFFF; WRITEF(S_OUT,"^NL S = %04X%04X T2 = %04X%04X ^eos", PTR1,PTR2,TEMP1,TEMP2); TEMP = MEMORY [STACK_PTR-1]; TEMP1 = TEMP slr 16; TEMP2 = TEMP & X:FFFF; PTR1 = FRAME_PTR slr (16 - 5); PTR2 = FRAME_PTR sll 5 & X:FFFF; WRITEF(S_OUT,"^NL F = %04X%04X T1 = %04X%04X ^eos", PTR1,PTR2,TEMP1,TEMP2);  TEMP = MEMORY [STACK_PTR]; TEMP1 = TEMP slr 16; TEMP2 = TEMP & X:FFFF; PTR1 = GLOBAL_PTR slr (16 - 5); PTR2 = GLOBAL_PTR sll 5 & X:FFFF; WRITEF(S_OUT,"^NL G = %04X%04X T0 = %04X%04X ^eos", PTR1,PTR2,TEMP1,TEMP2); MOVE @PSW to @WORD1 for 2; WRITEF(S_OUT,"^NL PSW %04X%04X ^EOS",WORD1 SLR 16,WORD1 & X:FFFF); WRITEF(S_OUT,"^NL ^NL --- CONDITION CODES ---^EOS"); TEMP1 = PSW.NEGATIVE ; TEMP2 = PSW.CARRY ; PTR1 = PSW.ZERO ; PTR2 = PSW.OVERFLOW; WRITEF(S_OUT,"^NL ^NL N = %X C = %X Z = %X V = %X ^NL ^EOS", TEMP1,TEMP2,PTR1,PTR2); end PRINT_POINTERS; %EJECT; \ A _ T O _ H (ASCII_TO_HEX) \ \ Ascii_To_Hex converts a 64-bit Ascii-Hex-Number (8 Ascii characters) into eight (8) hexidecimal digits (32-bits). format:  answer = A_to_H ( @addr ); \ proc A_TO_H (ADDR) UNIV returns (DBL); dcl ADDR word, I word,  TEMP1 word, ARRAY[] based byte, TEMP2 word; TEMP2 = 0; I = 0; loop; TEMP1 = ADDR->ARRAY[I]; TEMP1 = A_TO_H_BYTE(TEMP1); TEMP2 = * sll 4 | TEMP1; I = * + 1; break if I > 8; ; repeat; return (TEMP2); end A_TO_H; %eject; \ A _ T O _ H _ B Y T E (ASCII_TO_HEX_BYTE) \ \  This procedure is used by the above procedure. Ascii_To_Hex_Byte converts as 8-bit Ascii number  into a 4-bit Hexidecimal number. Valid inputs are X:30 thru X:39 ( '0' thru '9') and X:41 thru X:47 ('A' thru 'F'). These are converted to X:0 thru X:F. All other inputs are converted into X:0. \ proc A_TO_H_BYTE (DATA) UNIV returns (WORD); dcl DATA word; if DATA >= X:30 and DATA <= X:39 then DATA = DATA & X:F; elif DATA >= X:41 and DATA <= X:46 then DATA = DATA & X:F + 9; else DATA = -1; fi; return (DATA); end A_TO_H_BYTE; %EJECT; \ D E B U G _ U T I L I T Y \ proc debug_utility;  if get_parameter() = false then if term_chr = '^cr' then writef(s_out,"^nl SYMBOL OPERATION ^NL ^EOS"); writef(s_out,"^nl + addition ^eos"); writef(s_out,"^nl - subtraction ^eos"); writef(s_out,"^nl * multiplication ^eos"); writef(s_out,"^nl / division ^eos"); writef(s_out,"^nl ^^ exponential ^eos"); writef(s_out,"^nl & logical 'AND' ^eos"); writef(s_out,"^nl | logical 'OR' ^eos"); writef(s_out,"^nl ! logical 'XOR' ^nl ^nl ^eos"); else debug_error();  fi; else PAR[1] = PAR[0]; loop; if term_chr = '^cr' then putcrt('^nl');  putcrt('^cr'); print_ascii_from_hex(PAR[1]); break; elif get_parameter() = false then debug_error(); break; else PAR[2] = PAR[0]; if separator = '+' then PAR[1] = PAR[1] + PAR[2]; elif separator = '-' then PAR[1] = PAR[1] - PAR[2]; elif separator = '*' then PAR[1] = PAR[1] * PAR[2]; elif separator = '/' then PAR[1] = PAR[1] / PAR[2]; elif separator = '^^' then PAR[4] = PAR[1]; PAR[2] = * + 1; loop; break if PAR[2] = 0; PAR[1] = PAR[4] * PAR[1]; PAR[2] = * - 1;  repeat; elif separator = '&' then PAR[1] = PAR[1] & PAR[2]; elif separator = '|' then PAR[1] = PAR[1] | PAR[2]; elif separator = '!' then PAR[1] = PAR[1] xor PAR[2]; fi; fi; repeat; fi; end DEBUG_UTILITY; %EJECT; \ D E B U G _ C O P Y \ proc DEBUG_COPY UNIV; if GET_ALL_PARAMETERS() = FALSE or PARAMS # 3 then DEBUG_ERROR(); return; fi; PAR[1] = PAR[1] SLR 5; PAR[2] = PAR[2] SLR 5; PAR[3] = PAR[3] SLR 5; if (PAR[3] + PAR[2] - PAR[1]) > MAX_MEM then DEBUG_ERROR(); return; elif PAR[1] > PAR[3] then loop; break if PAR[1] > PAR[2]; MEMORY[ PAR[3] ] = MEMORY[ PAR[1]];  PAR[1] = * + 1; PAR[3] = * + 1; repeat; else PAR[4] = PAR[3] + PAR[2] - PAR[1]; loop; <  break if PAR[2] < PAR[1]; MEMORY[ PAR[4] ] = MEMORY [PAR[2]]; PAR[2] = * - 1; PAR[4] = * - 1; repeat; fi; PUTCRT('^cr'); PUTCRT('*'); end DEBUG_COPY; %EJECT; \ S E A R C H _ M E M O R Y \ proc search_memory UNIV; dcl temp dbl; if GET_ALL_PARAMETERS() = FALSE or PARAMS < 3 or PARAMS > 4 then DEBUG_ERROR(); return; fi; PAR[1] = PAR[1] SLR 5; PAR[2] = PAR[2] SLR 5; if params = 3 then PAR[4] = X:FFFFFFFF; fi; if params > 2 then loop; break if PAR[1] > PAR[2]; temp = memory[PAR[1]]; if (temp = PAR[3] and separator = ',' and params = 3) or (temp # PAR[3] and separator = '-' and params = 3) or (temp & PAR[4] = PAR[3] and params > 3) then putcrt('^nl');  putcrt('^cr'); putcrt(' '); print_ascii_from_hex(PAR[1] SLL 5); putcrt(' '); print_ascii_from_hex(temp); fi; PAR[1] = * + 1; repeat; fi; end search_memory; %eject; \ F I L L _ M E M O R Y \ proc fill_memory UNIV;  if GET_ALL_PARAMETERS() = FALSE or PARAMS < 2 or PARAMS > 4 then DEBUG_ERROR(); return; fi;  PAR[1] = PAR[1] SLR 5; PAR[0] = PAR[2] SLR 5; if PARAMS = 2 then MEMORY[PAR[1]] = PAR[2]; PUTCRT('^cr'); PUTCRT('*'); return; fi; if params = 3 then PAR[4] = 0; fi; !SET INCREMENT CELL TO 0 if (PAR[1] < 0) or (PAR[0] < 0) or (PAR[1]+1 > max_mem) or (PAR[0] > MAX_MEM) then DEBUG_ERROR(); return; fi; loop; break if PAR[1] > PAR[0]; memory[PAR[1]] = PAR[3]; PAR[3] = PAR[3] + PAR[4];  PAR[1] = * + 1; repeat; PUTCRT('^CR'); PUTCRT('*'); end fill_memory; end OAKSIM4; if params = 3 then.PL 39 .IN 5 .RM 75 .sp 10 .ls 3 .ce 4 O A K S I M U L A T O R R E F E R E N C E M A N U A L OCTOBER 1979 90-93150-00-A0 .bp 1 .he " OAKSIM Reference Manual page i# .ls 1 .sp 3 .nf .in +5 REVISION ISSUE DATE COMMENTS -------- ---------- -------- .ls 2 A0 October 1979 Original Issue LJV .bp .he "  OAKSIM Reference Manual page i# .in -5 .sp 2 SECTION 1 Introduction........................................1 SECTION 2 Communication with OAKSIM...........................2 SECTION 3 OAKSIM commands.....................................4 .IN +11 3.1 Set Breakpoints (B)............................6 .ls 1 3.1.1 Temporary breakpoints...................6  3.1.2 Dummy breakpoints.......................6 .ls 2 3.2 Copy one area of memory to another (C).........8 3.3 Execute user program (E).......................9 3.4 Fill memory with values (F)....................10 3.5 General Registers (G)..........................12 3.6 Inspect/Modify memory locations (I)............14 3.7 Jump to user program (J).......................17 3.8 List consecutive memory locations (L)..........18 3.9 Display/Change User Pointers/Simulator counters (R)......= 20 3.10 Search Memory (S)..............................24 3.11 Terminate Simulator (T)........................26 3.12 Calculate Expression (U).......................27 3.13 Load Binary program (W)........................29 3.14 Single Step (Y)................................30 .in -11 SECTION 4 Writing Oak Programs for the Simulator..............31 .in +11 4.1 Description of OAK directives..................32 .ls 1 4.1.1 OAK directive...........................32 4.1.2 STACK directive.........................32 4.1.3 DATA directives.........................34 4.1.4 FINI directive..........................34 .ls 2 4.2 Simulator Modifications to opcodes.............35 .IN -11 APPENDIX A OAKSIM Command Summary..............................37 APPENDIX B OAK Instruction Mnemonics...........................41 .BP 1 .he " OAKSIM Reference Manual  page # .ce 2 SECTION 1 INTRODUCTION .sp 2 .fo " Section 1 -- Introduction .fi .ls 1 The Oak Simulator (OAKSIM) provides for on-line checkout and testing of OAK software. OAKSIM must be run on the NM4/95 processor. .sp The command structure for OAKSIM was adapted from the NM4 DEBUGGING MONITOR. Many of the commands are syntatically the same, see Appendix A for a summary of the available commands. .sp Control of the machine passes back and forth between the user program and the Simulator. When OAKSIM is in control the operator may issue commands to inspect, print, modify, or execute any location in Oak memory. .bp .ce 2 .LS 2 SECTION 2 COMMUNICATION WITH OAKSIM .sp 2 .fo " Section 2 -- Communication with OAKSIM .LS 1 .FI When OAKSIM is executed, the bell ring and the progam prints it's name and version number. OAKSIM then generates an prompt and waits for a command. Each command caused some specific action to occur immediately, followed by another prompt. .sp A command line consists of a unique command identifier, immediately followed by the appropiate parameters, separated by commas. A command line must be terminated by a carriage return with exception to the (Y) command (Single Step). Letters may be entered as either upper or lower case letters. .sp If the programmer enters an incorrect command or an unacceptable parameter, OAKSIM rejects the line and prompts for a new command. The operator can also enter a back-space deliberately to cancel a line. Keyboard input is not buffered; each field is processed as it is entered. .sp The prompt characters always start in the second position on the crt line. The first position is blank except when a command alters the contents of memory; in this case OAKSIM issues a carriage return without a line feed, types an asterisk at the beginning of the line, and then issues the line feed. The result is a permanent record of command lines that modify the user program. .sp When certain events occur, OAKSIM displays all of the user pointers and the top four entries on the stack, the condition codes, and the hex value of the last instruction executed. The display is in the form: .sp .nf LAST INSTRUCTION EXECUTED = :00 P = 00000000 (00000000)B T3 = 00000000 S = 00000000 T2 = 00000000 F = 00000000 T1 = 00000000 G = 00000000 T0 = 00000000 PSW 00000000 --- CONDITION CODES -> -- N = 0 C = 0 Z = 0 V = 0 .bp .ls 2 .ce 2 SECTION 3 OAKSIM COMMANDS .LS 1 .SP 2 .fo " Section 3 -- OAKSIM Commands .FI An OAKSIM command usually involves the specification of a memory address and some data values. Any address or value can be entered as a signed or unsigned hexidecimal number. Leading zeros are optional: .sp .nf 7FFFFFFF +204 -1  0 .fi .sp The sum or difference of any number of terms can be used. .sp .nf 555+3 4+1000-300 -29DE91-ACDE .fi .sp Thirty-six registers, called General Purpose Registers, are available for holding values. In any context where a hexidecimal number would be valid, a General Register reference -- the letter "G" followed by one digit from 0 to 9 and a to z -- is also valid. The reference can be immediately followed by another reference, or by a hexidecimal number, as an additional value: .sp .nf g5 300G1 -2+3ga gdGrGT .fi .sp A "-" symbol in a hex number which precedes a General Register is a unary minus (unlike DEBUG4), thus, if g2 contains :102, the command: .sp I-2g2 .sp will inspect location :100. .sp .in +15 .rm -14 .ce 1 *** NOTE *** .sp Hexidecimal data parameters may be of any length, but if more than eight characters are typed, only the last eight are saved. .nf If the user types .sp .ce I1000029DB .sp .fi OAKSIM will use 000029DB for the Inspect (I) command. This is an aid to the user in case an erroneous hexidecimal digit is typed. In case of an error, the user does not have to restart from the beginning. .nf .bp .in -15 .rm +14 3.1 Set Breakpoints (B) .sp .fo " Set Breakpoints (B) .fi A breakpoint is a designated location in the user program. If the user program is in control, and the path of execution goes through a breakpoint control is passed to OAKSIM for operator action. There are two kinds of breakpoints: temporary and dummy. .sp OAKSIM notes the locations involved with the breakpoints. When the user program encounters a breakpoint, OAKSIM regains control, and informs the operator that a breakpoint has been reached. .sp The value of the Program pointer is displayed as an absolute location. From this information, the operator can decide what command to enter next. .sp 3.1.1 Temporary Breakpoints .sp Temporary breakpoints are established with a breakpoint command. The syntax the breakpoint command allows specification of 1 through 5 breakpoint locations. Program control is always transferred to the current value of the Program Pointer. .sp Ba,b,c,d,e .sp One to five breakpoint locations may be specified. .sp .in +15 .rm -14 .ce 1 *** NOTE *** BREAKPOINTS THAT DO NOT POINT TO INSTRUCTION OPCODES ARE IGNORED. .SP 2 .in -15 .rm +14 3.1.2 Dummy Breakpoints .sp Dummy breakpoints can be coded into a source program. When control goes through a dummy breakpoint, OAKSIM receives control and types out the same register display as for a temporary breakpoint established with the B command. .sp To establish a dummy breakpoint in a source program, use the following code: .sp TRAP 0 .sp Alternately, OAKSIM may be used to create a dummy breakpoint; simply alter the desired byte locations to :3E00 -- the machine language equivalent of the TRAP 0 instruction -- using the I command. .nf .bp 3.2 COPY ONE AREA OF ? MEMORY TO ANOTHER (C) .sp .fo " Copy memory (C) .fi The Copy command copies an area of given length to another of the same length. .sp Cs,e,n .sp The contents of memory from s to e inclusive are copied to another area starting at n. .nf .bp 3.3 EXECUTE USER PROGRAM (E) .sp .fo " Execute program (E) .fi The Execute Command is used to allow a user program to run without OAKSIM intervention. .sp E .sp The the current value of the Program Pointer is used as the jump address. When a TRAP 0 instruction is executed, control is transfered not to OAKSIM but to the OS4 executive. Prior to control being transfered, the Simulator Counters are printed on the CRT. .nf .bp 3.4 FILL MEMORY WITH VALUES .sp .fo " Fill memory (F) .fi The Fill command (F) stores a specified 32-bit value into each word location of a selected area of memory. The F command requires two or three parameters. If two parameters are used, then the specified location is filled with the value. If three parameters are used, then the starting and ending locations (inclusive) are filled with the value specified. .sp Fa,v .sp The value v is stored into location a. .sp Fs,e,v .sp The value v  is stored into each word of memory locations s through e inclusive. .sp An optional fourth parameter may be specified which allows an incrementing or decrementing pattern to be stored, as follows: .sp Fs,e,v,d .sp .BP Locations s through e are filled with an incrementing pattern: .sp .nf LOCATION CONTENTS s v s+1 v+d s+2 v+d+d . . . . . . .sp .fi If d is a negative value, the pattern will decrement rather than increment. .nf .bp 3.5 DISPLAY/CHANGE GENERAL REGISTERS (G) .sp .fo " General registers (G) .fi User programs are normally assembled at relative location :00, but are loaded at some higher address. To match the location on an assembly listing with the locations in memory, the user would have to add an offset factor, or relocation bias, to each address used in an OAKSIM command. To avoid this time-comsuming and error-prone process, OAKSIM provides 36 locations called general registers, G0 - G9, GA - GZ. The value of any of the General Registers is displayed or changed in the same manner that User Pointers are manipulated. Once the user has established a useful value in a General Register, addresses in commands may be entered as a hex value (from the assembly listing location column) immediately suffixed by a General Register name. .sp The following displays the contents of General Register 6, does not alter it, displays General Register J and changes it to value v. .sp G6 G6 00000000 GJ GJ 00001234 1000 .BP The value of a General Register may be changed without displaying the old value as follows: .sp G3v .sp The contents of all the General Registers may be listed on the CRT by issuing the G command without any parameters. .nf .bp 3.6 INSPECT/MODIFY MEMORY LOCATIONS (I) .sp .fo " Inspect memory (I) .fi The Inspect command (I) displays the contents of a specified word location in memory, an@ d (if desired) specifies a new value for that location. Consecutive locations may be stepped through, either backward or forward. The user enters a starting address for the instruction, and OAKSIM responds by printing that address and its contents: .sp  I3000 00003000 00000000 .sp An optional second parameter (the letter A) allows the user to view the ASCII equivalence of the contents: .sp I3020,A 00003020 41203600 A 6. .sp The Address parameter may also be a byte address, but must be preceeded by a period: .sp I.4 00000001 00000000 .sp One should note that the word address is always displayed. .sp After printing the current contents of the location, OAKSIM waits for a special line terminator followed by a carriage return. A new value for the contents of the word just displayed can precede the line terminator. The line terminators are: .sp .nf plus (+) Continue inspection at location + 1 minus (-) Continue inspection at location - 1 asterisk (*) Continue inspection at address specified  by location (indirect) X character Multiply contents by 2 and redisplay / character Divide contents by 2 and redisplay .sp .fi The following is an example of the Inspect command: .sp .nf I100 Inspect location :100 00000100 00000000 + Do not alter contents of :100, Inspect :120 00000120 11111111 6B- Alter contents of :120, Inspect :100 00000100 00000000 - No alteration. Inspect :100 - 1 word 000000E0 00002000 5* Alter contents of :E0. Inspect :2000. 00002000 45464646 No alteration. Terminate Inspection sequence. Ready for a new command. .BP .fi Consecutive memory locations may be altered by providing new values separated by commas: .nf .sp I500 Inspect location :500 00000500 00001111 0,1,44444444,2222+ Change location :500,:520,:540, and :560 to :0, :1, :44444444, and :2222 respectively, inspect :500 + 1 word. 00000520 00000000 Terminate inspection. Ready for a new command. .bp 3.7 JUMP TO USER PROGRAM (J) .sp .fo " Jump to program (J) .fi The Jump command (J) is used to switch control from OAKSIM to the user program. After the J command is input, OAKSIM starts executing the user program at the specified location. .nf .sp J2000 Jump to location :2000 .sp J10GF Jump to location (General Register F) + :10 .sp .fi If no parameter is specified in the Jump command, the next inline instruction in the user program (the value of the Program Pointer) is used as the jump address. .sp Temporary breakpoints can be established with the Jump command. The syntax of the Jump command allows specification of 1 thru 4 breakpoints. .sp Jt,a .sp This command transfers control to the user program at location t and breaks if program execution reaches location a. .sp .in +15 .rm -14 .ce 1 *** NOTE *** .sp BREAKPOINTS THAT DO NOT POINT TO INSTRUCTION OPCODES ARE IGNORED. .SP .bp .in -15 .rm +14 .nf 3.8 LIST CONSECUTIVE MEMORY LOCATIONS (L) .sp .fo " A  List memory (L) .fi The List command (L) prints the contents of consecutive memory locations on the CRT. The L command requires two parameters; the starting and ending locations (inclusive) are displayed: .sp .nf Ls,e .sp .fi The contents of memory locations s through e inclusive are displayed on the CRT. The display is formatted four words per line, preceeded by the address of the first word on each line. .sp .nf Ls,s+5 .fi .sp The contents of six consecutive memory locations, beggining with location s, are displayed. .sp If the second parameter is less than the first parameter (start address), it will be interpreted as an absolute hexadecimal number, specifying the number of consecutive memory locations to be listed. For example: .sp .nf L100,A Lists 10 memory locations starting at :100 .sp .fi An additional parameter "A" available on the L command causes the equivalent ASCII representation of listed memory cells to be displayed. The example below illustrates the use of this parameter: .sp .nf L100,6,a .sp .fi The seven hexadecimal values corresponding to the contents of locations :100 through :1A0 are displayed, followed by their ASCII characters. If a listed cell does not contain a valid ASCII value, then a period (.) is listed in its place. .nf .bp 3.9 DISPLAY/CHANGE USER POINTERS/SIMULATOR COUNTERS (R) .sp .fo " Display/change user pointers/simulator counters (R) .fi The values of the user pointers and condition codes are available for display or alteration by simply typing in the R command followed by the appropriate pointer or condition code name. After the value is displayed, a new value can be typed in immediately, or a carriage return can be issued to signify no change. .sp The code names for the pointers and the condition-codes are: .sp .nf P Program pointer Z Zero condition code bit S Stack pointer C Carry condition code bit F Frame pointer N Negative condition code bit G Global pointer V Overflow condition code bit .fi .sp All pointer values are stored in 32-bit words, and the condition codes are the lower 4 bits of the PSW. .sp The Program pointer value is listed as both a bit-address and as a byte-address (in parentheses) and is changed only with a new byte-address value. .sp The following displays the Program pointer, alters it, and then re-displays it. .sp .nf RP P 00000000 (00000000)B 800 RP P 00004000 (00000800)B .sp .fi The Stack, Frame, and Global pointers all display the word address as a bit address (i.e. the lower 5 bits are always zero). Thus, if an address is entered to modify these pointers, and if any of the lower 5 bits are set, then they are reset and entered into the pointer. .sp .nf RF F 00001000 F04 RF F 00000F00 .sp .fi The value of a pointer or condition code can be changed without displaying the old value. Enter the R command, the code name, and the new value, as follows: .sp .nf  RS900 .sp .fi .sp .fi The condition code bits are set or reset depending upon the lowest bit entered as the new value. .sp .nf RC505 RC C 1 .fi .sp To display the contents of all the pointers and the cB ondition-codes, the R command is entered without any parameters. Included in the display is the hex value of the last instruction executed, the top 4 entries on the stack, and the current contents of the PSW. .sp .nf R LAST INSTRUCTION EXECUTED = :00 P = 00000000 (00000000)B T3 = 00000000 S = 00000000 T2 = 00000000 F = 00000000  T1 = 00000000 G = 00000000 T0 = 00000000 --- CONDITION CODES --- N = 0 C = 0 Z = 0 V = 0 .fi The Simulator counters may at any time be displayed on the CRT. To do so, type in RR as follows: .sp .nf RR TOTAL MEMORY READS = 0 READS W/O CACHE HITS = 0 CACHE HITS ON READS = 0 PROGRAM FETCHES (BYTES)= 0 INSTRUCTIONS FETCHED = 0 INSTRUCTION PIPE LOADED 0 TIMES TOTAL MEMORY WRITES =  0 .sp .fi The Simulator counters may be reset at any time by typing in RR*: .sp .nf RR* .sp .bp 3.10 SEARCH MEMORY (S) .sp .fo " Search memory (S) .fi The S command searches memory from a low address to a high address for a match/non-match of a desired bit value. The general form is: .sp .nf Ss,e,v where s is the low memory address, e is the high memory address, v is the search value. .sp .fi An example of the S command follows: .sp .nf S0220,17EC0,00980054 Searchs from a low memory address 00005000 00980054 of :220 to a high memory address of 00010AC0 00980054 :17EC0 and prints out each location  address with a 32-bit match of the value :00980054. A match was found at  locations :5000 and :10AC0. .sp .fi There are two optional parameters: mask and minus (-) sign before carriage return, for non-match. .sp By specifying a bit-mask, the user tells OAKSIM to compare only those bits in each word of memory which have a corresponding "1" bit in the mask. For each "0" bit in the mask, the corresponding bit in memory is ignored in finding a mask against the value. For example: .sp .nf S200,440,4321,FFFFFFF7 Searches from :200 to :440 for the value :00004321 and accepts a match on the value :00004329. .sp .fi By specifying a minus (-) sign, the search is made for a non-mactch of the match value. For example: .sp .nf S100,2000,ABC5,- Searches from :100 to :2000 for locations having a value other  than :0000ABC5. .bp 3.11 TERMINATE SIMULATOR (T) .sp .fo " Terminate Simulator (T) .fi The Simulator can be terminated at any time by using the T command. .sp When the T command is entered, the Simulator counters are listed on the CRT and the Simulator signs off as it returns control over to OS4. .sp .nf T TOTAL MEMORY READS  = 0 READS W/O CACHE HITS = 0 CACHE HITS ON READS = 0 PROGRAM FETCHES (BYTES)= 0 INSTRUCTIONS FETCHED = 0 INSTRUCTION PIPE LOADED 0 TIMES TOTAL MEMORY WRITES = 0 --END-- O A K S I M C U L A T O R EXEC (XX) .nf .bp 3.12 CALCULATE EXPRESSION (U) .sp .fo " Calulate expression (U) .fi The OAK Simulator provides the user with the ability to do simple calculations of 32-bit values. Each expression is calculated as it is entered and the result is printed as soon as the carriage return is entered by the user. Calculations are done strictly left to right without nesting. If the result is too large to fit into 32-bits, then the result is truncated leaving only the lower bits as the result. .sp To get a list of available operators, type U followed by a carriage return. .sp .nf U SYMBOL OPERATION + addition - subtraction * multiplication / division  ^ exponential & logical 'AND' | logical 'OR' ! logical 'XOR' .BP .fi The user may enter as long of an expression as he wishes. several examples follow (let G1 = :100 and G2 = 2) : .sp .nf <OAK>UFFFF-1 0000FFFE U3F2871&00FF00FF 003F0071 UC00*20 00018000 U20+30+G1 00000150 U20+30+G1G2 00000152 U20+30+G1*G2 000002A0 .nf .bp 3.13 LOAD BINARY PROGRAM (W) .sp .fo " Load binary program (W) .fi In order to execute and/or debug a pre-assembled user program, the program must be loaded into the simulators own memory. The program must be assembled using the OAK.MAC file as the definition and then LINK edited using the OS4 LINK editor. .sp The loader accepts the following specific loader type codes: .sp .nf :18 Begin  :2/:3 End program ABS/REL :4/:5 Origin ABS/REL :6/:7 Data ABS/REL :8 Reserve and fill :9 Byte address constant :40 Null :4F List segment names(list location counters) :6D Note record :6F List segment attributes .bp 3.14 SINGLE STEP (Y) .sp .fo " Single step (Y) .fi The Y command allows the user to single step through his program. Only one instruction (as pointed to by the Program Pointer), is executed, and control is returned to OAKSIM for new commands. Since OAKSIM does not modify the user's machine code during a breakpoint, the user never need worry about any of an instructions operands being modified. .sp .in +15 .rm -14 .ce *** NOTE *** .SP The Y Command (Single Step) is the only command that executes without a carriage return. .nf .in -15 .rm +14 .bp .ce 2 SECTION 4 .sp Writing Oak programs for the Simulator .sp .fo " SECTION 4 -- Writing Oak programs for the Simulator .fi Writing Oak programs is essentially the same as writing assembly language programs for NM4 family of computers. Oak programs can use all the MACRO assembler directives with exception to the END directive, which has been replaced by FINI, and has the same syntax. .sp All Oak programs must contain the following list of directives: .sp .nf OAK This directive signifies the beginning of the program. STACK This directive specifies the user's stack space and relative positions of the Stack Pointer, Frame Pointer and the Global Pointer from the start of the Stack. FINI This directive must be the last mneD monic in the user program. .sp .fi .in +15 .rm -14 .ce *** NOTE *** All Oak programs must be assembled on the OS4 MACRO Assembler using OAK.MAC as the definition file. .sp .rm +14 .in -15 .sp .bp 4.1 DESCRIPTION OF OAK DIRECTIVES .sp .fo " Oak Directives .fi The following is a list of Oak Assembler Directives. Some of these directives directly replace those used in NM4 assembler programs. .sp .nf OAK STACK BYTE or TEXT STRING HALF WORD FINI .sp .fi 4.1.1 OAK Directive .sp The OAK directive must be the first mnemonic in the user program. This directive is used to pass the addresses of the Stack Pointer (STK:PTR), the Frame Pointer (FRAME), the Global Pointer (GLOBAL), the beginning of the stack (LO:STACK), and the end of the stack (HI:STACK) to the Oak Loader used in this Simulator. .sp The OAK directive has no parameters. .sp 4.1.2 STACK Directive .sp The STACK directive is used to allocate space to the user's stack area. In addition, this directive is used to specify the relative position from the beginning of the stack, that the Stack, Frame, and Global pointers are to point. The size of the stack is also specified here. .sp SYNTAX: STACK (size),(global),(frame),(stack) .sp Any or all of the STACK parameters may be omitted. If size is omitted, the stack defaults to :100 32-bit words. If any of the last three parameters are omitted, then they default to the beginning of the stack (LO:STACK). .sp As an example, let the STACK directive follow the OAK directive, this puts the stack before any executable code. If one were to code the following: .sp .nf STACK :40,,:20 .sp .fi The assembly listing will then appear as follows: .sp .nf STACK :40,,:20 GLOBAL EQU G:::PTR FRAME EQU F:::PTR STK:PTR EQU S:::PTR LO:STACK EQU $ HI:STACK EQU $ .sp .fi The value of the labels will be assigned as follows: .nf .sp LO:STACK = :00000000 GLOBAL = :00000000 FRAME = :00000080 (byte address) STK:PTR = :00000000 HI:STACK = :00000100 (byte address) .sp .fi To initialize the Global stack area one must re-org to GLOBAL, specify the global contents, and then re-org back to HI:STACK or to the current position of the program. .sp 4.1.3 DATA DIRECTIVES .sp The Data directives are used to enter data constants into an OAK assembly program. .sp .in +5 The BYTE or TEXT directives are the same. These directives produce 8-bit data items. The parameters can be byte values or a string of any length. Up to 10 parameters may be entered. .sp The STRING directive is used to enter ASCII characters only. Only one parameter is allowed. .sp The HALF directive is used to enter up to 10 16-bit data items. Up to two ASCII characters may be entered in one parameter. .sp The WORD directive is used to enter up to 10 32-bit data items. Up to four ASCIi characters may be entered in one parameter. .sp .in -5 4.1.4 FINI DIRECTIVE .sp The FINI directive must be the last mnemonic that appears in the assembly listing. The FINI directive has an optional parameter which is the execution address of the program. .sp 4.2 Simulator Modifications to opcodes .sp All instruction mnemonics listed iE n APPENDIX B will assemble correctly, but several of these instructions are not implemented in the simulator. The following is a list of those instruction opcodes that OAKSIM (A0) will not support: .sp .nf DIV CDI CID DADD DSUB FCMP FMULT  WCS CFI CIF DCMP FADD FDIV FSUB .sp .fi The MULT instruction has been modified so that results can be obtained through the use of ALAMO's multiply. What the MULT instruction does in this simulator is shown below: .sp .nf M[S-1] * M[S--] -> M[S] .sp Note: the result is 32-bits instead of 64-bits. .sp .fi The TRAP instruction has been modified so that control can be returned to OAKSIM (breakpoints) and for the purpose of doing I/O to the crt. .sp A TRAP 0 instruction, when encountered, stops the simulation and turns control over to OAKSIM. .sp TRAP 1 thru TRAP 3 are used for crt I/O. These instructions require two items to be on the stack before execution. .sp .nf T0 = byte address of I/O buffer T1 = number of bytes to process .sp .fi These TRAP's are used as follows: .sp .nf TRAP 1 -- read unformatted data from crt TRAP 2 -- write unformatted data to crt TRAP 3 -- write formatted data to crt, where .fi .sp TRAP 3 requires the first byte in the buffer to be a control character: .sp .nf '0' => double space '1' => screen erase & top of screen '+' => overprint anything else => single space .sp .nf .bp .ce 2 APPENDIX  A .sp OAKSIM Command Summary .nf .fo " APPENDIX A -- OAKSIM Command Summary .sp 2 .in -5 Ba,b,c,d,e Set temporary breakpoints (up to 5) at a, b, c, d and e. Re-enter user program according to Program_ptr contents. Cs,e,n  Copy memory from s to e inclusive, into new area starting at n. E Enter user program according to Program_ptr contents. Terminate Simulator if TRAP 0 inst. is executed. Fa,v Fill location a with value v. Fs,e,v Fill memory from s to e inclusive with constant value v. Fs,e,v,d Fill memory from s to e inclusive, using d as an increment/decrement to build a pattern. G List all General Registers. Gg  Display General Register g, (where g= 0-9, A-Z). Ggv Change General Register g to value v. .BP Ia or I.a Inspect memory at location a. If the period is included, then the address is a byte address (as on the program listing) and the word pointed to is displayed. After value is displayed, commands are: space or + inspect next location. - inspect previous location.  * inspect indirect / display value/2 X display value x 2. Consecutive memory locations can be altered by providing new values separated by commas. (Up to 4) Ia,A or I.a,A Inspect (as above) but show ascii equivalent of contents. J Re-enter user program according to the Program_ptr. Jt Re-enter user program at location t. Jt,a,b,c,d Set temporary F breakpoints at a, b, c, and d. Re-enter user program at location t. Ls,e List memory from s to e inclusive (s <= e). Ls,e,A List memory from s to e inclusive with ASCII equivalents. (s <= e). Ls,n  List memory from s for :n locations (s > n). Ls,n,A List memory from s for :n locations with ASCII equivalents  ( s > n ). R Display all user Pointers, Status Flags(Condition Codes) and top 4 entries on the Stack. Rr Display user pointer or flag where r = P,F,S,G,Z,C,N,V Rrv Change user pointer or flag to value v. Flags are affected by bit 31 (LSB) only. RR* Reset all Simulator counters. RR  List all Simulator Counters on the Standard-Output. Ss,e,v Search memory from s to e ( s <= e ) for value v. Ss,e,v,m Search memory from s to e (s <=e) for value under mask m, where zero bits of m are don't care bits. Ss,e,v,- Search memory from s to e (s <=e) for non-match of value v. T Terminate Simulator. .BP U  List operators for the calculator. Uexp Calculate expression. Evaluation is strictly left to right. The expression consists of any number of values separated by operators as listed below:  + addition - subtraction * multiplication / division ^ exponential & logical and | logical inclusive or  ! logical exclusive or (XOR) W Initiate the OAK binary loader. Y Single Step. Re-enter user program according to the Program_ptr and return after execution of one instruction. .sp .in +5 .bp .ce 2 APPENDIX B OAK Instruction Mnemonics .sp .fo " APPENDIX B -- OAK Instruction Mnemonics opcode mnenomic format(s) 00 NOP 1 01 NOT 1 02 AND 1 03 OR 1 04 XOR 1 05  INC 1 06 DEC 1 07 NEG 1 08 ADD 1 09 SUB 1 0A CMP 1  0B MULT 1 0C DIV 1 0D DEL 1 0E DUP 1 0F DUPD 1 10 EXCW 1 11 EXCD 1 12 ZERO 1 13 ONE 1 14 ONES 1 15 SXTB 1 16 SXTH 1 17 SXTW 1 18 SAR 1 19 SHR 1 1A SHL 1 1B ROR  1 1C ROL 1 1D CIRC 1 1E ADDC 1 1F EXCWD 1 20 EXCDW 1 21  - - 22 - - 23 - - 24 - - 25 - - 26 -  - 27 - - 28 - - 29 SCMP 1 2A MOVE 1 2B TXLT 1 2C  SRCH 1 2D ENQ 1 2E RQE 1 2F DEQ 1 30 LDSI B 1 31 LDSI H 1 32 LDSI W 1 33 LDSI D 1 34-35 FORI 2,3 36-37 FORD 2,3 38-39 ENTR 2,3 3A-G 3B EXIT 2,3 3C SGNL 1 3D WAIT 1 3E TRAP 2 3F LCXT 1 40 STSI B 1 41 STSI H 1 42 STSI W 1 43 STSI D 1 44-46 LDI 2,3,5 47 WCS 2 48-49 ADDI 2,3 4A-4B SUBI 2,3 4C-4D CMPI 2,3 4E-4F RESS 2,3 50-51 RELS 2,3 52-53 EXT 1,2 54-55 INS 1,2 56 JSI 1 57 CASE 2 58-5A LDPA 2,3,5 5B SPIN 1 5C-5D EXTS 1,2 5E - - 5F 2X INSTS. 2X 60-61 BPL 2,3 62-63 BMI  2,3 64-65 BNE 2,3 66-67 BEQ 2,3 68-69 BNO 2,3 6A-6B BOV 2,3 6C-6D BNC 2JOAKSIM3 DCODE:BRDCODE:LDJDCODE:C0DCODE:D0DCODE:E0JDCODE:F0O0SEGMENTBLANK oäKWORD:FLAHALF BYTE:FLAKPSW OPERAND INST:REGKPROGRAM:FRAME:PTSTACK:PTKGLOBAL:PSIGN:EXTSPECIFICKGET:2:3:FETCH SET:FLAGKZERO:NEGWRITE:DAREAD:DATigèg&]Gt i~nì~Ž&Š_‡ gt )C~X„ )C{„IÄ@t & Gt „ )C~XJÿQÁVB„IÄ@t „ )C{Gt Op„ )c~~nì~Ž&‹Gt„IÄ@t _† gt &_‡ „ )C~QÁV „ )C~JÿQÁVBgt g) CQÁVB_† Gt Ÿ„ )C~JþQÁV „ )C~JýQÁVB gt g) CJÿQÁVB_† Gt v„ )C~JüQÁV „ )C~JûQÁVB gt g) CQÁVB_† Gt N„ )C~JúQÁV „ )C~JùQÁVB gt g) CJÿQÁVB_† Gt %„ )C~JøQÁV „ )C~J÷QÁVB gt g)CQÁVB_† Gt ý„ )C~JöQÁV „ )C~JõQÁVB gt g)CJÿQÁVB_† Gt Ô„ )C~JôQÁV „ )C~JóQÁVB gt g)CQÁVB_† Gt ¬„ )C~JòQÁV „ )C~JñQÁVB gt g)CJÿQÁVB_† Gt ƒ„ )C~JðQÁV „ )C~JïQÁVB#gtg) C^Žgtg) Cgt g)c@e`@^@gQÁVB_† Gt J„ )C~JîQÁV „ )C~JíQÁVB$gtg) C^Žgtg) Cgt g)c@e`@^@gJÿQÁVB_† Gt „ )C~JìQÁV „ )C~JëQÁVBgtg) Cgt g)c@eQÁVB_† Gt á„ )C~JêQÁV „ )C~JéQÁVBgtg) Cgt g)c@eJÿQÁVB_† Gt ±„ )C~JèQÁV „ )C~JçQÁVBgtg) Cgt g)c@gQÁVB_† Gt ‚„ )C~JæQÁV „ )C~JåQÁVBgtg) Cgt g)c@gJÿQÁVB_† Gt R„ )C~JäQÁV „ )C~JãQÁVB_† Gt 6„ )C~JâQÁV „ )C~JáQÁVB Gti~nì~Ž&‹Gt_‡Gt& _‡GtO _‡„IÄ@t_† Gt&mg&]gt )C~XJøQÁVB„IÄ@t & Gt„IÄ@t gt)C~X& GtOàOÀOìOÌGtGtgt&Gtgt )C~GŽJ€QÁVB:Gti~nì~&‹GtGt_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t¡gt )C~GŽIJpQÁVB0Gt_‡Gt& _‡„IÄ@t_‡ Gti~nì~&ŠGtGtH _‡Gt & _‡_† _‡„IÄ@tdgt )C~GŽ J`QÁVBI& _‡ Gt_‡Gt & _‡_† _‡„IÄ@t>Gt_‡Gt& _‡„IÄ@t _‡ _‡I& _‡I& _‡„IÄ@t _† i~nì~&‹_‡ Gt_‡Gt & _‡_† _‡„IÄ@t&mg&]gt )C~X„ )C{„IÄ@t & Gt„IÄ@t  „ )C~JþSAVB@Gti~nì~Ž&‹GtGtgt &Gt_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t ö„ )C~JþQÁV „ )C~JýQÁVB8Gtgt &GtGt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&ŠGtGt_‡Gt & _‡_† _‡„IÄ@t ¨„ )C~JüQÁV „ )C~JûQÁVB‚Gtgt &Gt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&‹Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@tGti~nì~Ž&‹Gt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&‹Gt_‡Gt & _‡_† _‡„IÄ@t _† @QAVBgt Ig) C „ )C~Jú QÁV„ )C~JùQÁVBvGtgt &Gti~nì~Ž&‹GtGt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&ŠGtGt_‡Gt & _‡_† _‡„IÄ@tGt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&ŠGtGti~nì~Ž&ŠGt_‡Gt & _‡_† _‡„IÄ@t „„ )C~JøQÁV „ )C~J÷QÁVB&Gtgt&GtGti~nì~Ž&‹Gt_‡Gt& _‡GtO@_‡„IÄ@t H„ )C~JöQÁV „ )C~JõQÁVB&Gtgt &GtGti~nì~Ž&‹Gt_‡Gt& _‡GtO@_‡„IÄ@t  „ )C~JôQÁV „ )C~JóQÁVB‚Gtgt&Gt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&‹Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@tGti~nì~Ž&‹Gt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&‹Gt_‡Gt & _‡_† _‡„IÄ@t _† @QAVBgtIg) C tGtgt&Gti~nì~Ž&‹GtGt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&ŠGtGt_‡Gt & _‡_† _‡„IÄ@tGt_‡Gt& _‡„IÄ@t_‡ Gti~nì~Ž&ŠGtGti~nì~Ž&ŠGt_‡Gt & _‡_† _‡„IÄ@t&mg&]„IÄ@t & Gt„IÄ@t gt)C~X„ )C{Gtgt &Gt_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt& _‡„IÄ@t _‡ „ )C~QÁV  „ )C~JÿQÁVBP_† _‡_† O(_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t P„ )C~JþQÁV „ )C~JýQÁVBP _† _‡_† O8_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t ê„ )C~JüQÁV „ )C~JûQÁVBP _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t „„ )C~JúQÁV „ )I C~JùQÁVB– _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@tGti~‘nì~&‹Gt _† i~‘nì~&‹_‡ _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† @QAVBgt Ig) C Ø„ )C~Jø QÁV„ )C~J÷ QÁVBX_† _‡_† O( _ŒŒ„&_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt j„ )C~JöQÁV „ )C~JõQÁVBX _† _‡_† O8_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt ü„ )C~JôQÁV „ )C~JóQÁVBX _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt Ž_† _‡_† OH_ŒŒ „&_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&‹Gt _† i~‘nì~&‹_‡ Gt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt&mg&]„IÄ@t & Gt„IÄ@t gt)C~X„ )C{Gtgt&Gt_‡Gt& _‡„IÄ@t _‡ „ )C~QÁV  „ )C~JÿQÁVBJGti~‘nì~&‹Gt_† _‡Gt& _‡„IÄ@t _† O(_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t Ú„ )C~JþQÁV „ )C~JýQÁVBJGti~‘nì~&‹Gt_† _‡Gt& _‡„IÄ@t _† O8_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t z„ )C~JüQÁV „ )C~JûQÁVBJGti~‘nì~&‹Gt_† _‡Gt& _‡„IÄ@t _† OH_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t „ )C~JúQÁV „ )C~JùQÁVBGti~‘nì~&‹Gt_† _‡Gt& _‡„IÄ@t _† OH_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@tGti~‘nì~&‹Gt _† OHi~‘nì~&‹_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† @QAVBgt Ig) C u„ )C~Jø QÁV„ )C~J÷QÁVB@Gt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt& _‡„IÄ@t _† O(_‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt „ )C~JöQÁV „ )C~JõQÁVB@Gt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt& _‡„IÄ@t _† O8_‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt É„ )C~JôQÁV „ )C~JóQÁVB@Gt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt& _‡„IÄ@t _† OH_‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGtsGt_‡Gt& J _‡„IÄ@t_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt _† OHi~‘nì~&‹_‡Gt & _‡_† _‡„IÄ@tGt_‡Gt& _‡„IÄ@t_‡ Gti~‘nì~&ŠGt_† OH_‡Gt & _‡_† _‡„IÄ@t&mg&]„IÄ@t & Gt„IÄ@t gt)C~X„ )C{Gtgt&Gt_‡Gt& _‡„IÄ@t_‡ Gt_‡Gt& _‡„IÄ@t _‡ „ )C~QÁV  „ )C~JÿQÁVBP_† _‡_† O(_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t F„ )C~JþQÁV „ )C~JýQÁVBP _† _‡_† O8_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t à„ )C~JüQÁV „ )C~JûQÁVBP _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@t z„ )C~JúQÁV „ )C~JùQÁVB– _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t _† _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† _‡„IÄ@tGti~‘nì~&‹Gt _† i~‘nì~&‹_‡ _‡Gt& _‡„IÄ@t_‡ Gt_‡Gt & _‡_† _‡„IÄ@t _† @QAVBgt Ig) C ΄ )C~Jø QÁV„ )C~J÷ QÁVBX_† _‡_† O( _ŒŒ„&_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt `„ )C~JöQÁV „ )C~JõQÁVBX _† _‡_† O8_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt ò„ )C~JôQÁV „ )C~JóQÁVBX _† _‡_† OH_ŒŒ„ &_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt „_† _‡_† OH_ŒŒ „&_‡ _† _‡Gt& _‡„IÄ@t Gt i~‘nì~&Š_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGt i~‘nì~&Š_‡Gt& _‡„IÄ@t _‡ _† i~‘nì~&‹_‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt&mðÿÿŒ„ &_‡ _† _‡Gt& _‡„IÄ@t Gti~‘nì~&ŠGt_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGti~‘nì~&ŠGt „_† _‡_† OH_ŒŒ „&_‡ _† _‡Gt& _‡„IÄ@t Gt i~‘nì~&Š_‡Gt& _‡„IÄ@t_‡ _† _‡Gt & _‡_† _‡„IÄ@tGt i~‘nì~&Š_‡Gt& _‡„IÄ@t _‡ _† i~DAFC EQU :F8 DEVICE ADDR FCN CODE FOR CRT CMD EQU 1 COMMAND TO PICO DRDY EQU 3 DATA READY STATUS BIT SSIZE EQU 0 STACK SIZE * * GETC - GETS A CHARACTER FROM THE CRT KEYBOARD * ALAMO CALLING SEQUENCE: * PRK OC GETC EXTERNAL RETURNS (WORD); * DCL CH BYTE; * CH = GETC (@CH); * NAM GETCRT GETCRT ENTER SSIZE  COPY RESET,X COPY REQINP,A REQUEST INPUT FROM CRT RBIT 8,S DISABLE INTERRUPTS OUT A,DAFC+CMD IN DAFC+CMD,A READ CRT STATUS TBIT DRDY,A JF OV,$-2 JUMP IF NO CHAR AVAILABLE IN DAFC,Q ELSE READ CHARACTER OUT X,DAFC+CMD RESET CRT PICO SBIT 8,S ENABLE INTERRUPTS RETURN  LPOOL REQSND WORD :8612 REQUEST TO SEND DATA TO CRT REQINP WORD :8618 REQUEST TO INPUT FROM CRT RESET WORD :100  RESET COMMAND TO PICO END A REQUEST INPUT FROM CRT RBIT 8,S DISABLE INTERRUPTS OUT A,DAFC+CMDDAFC EQU :F8 DEVICE ADDR FCN CODE FOR CRT CMD EQU 1 COMMAND TO PICO TRDY EQU 4 TRANSMITTER READY STATUS BIT SSIZE EQU 0 STACK SIZE FPRM EQU 2 FIRST PARAMETER OFFSET IN STACK * * PUTC - PUTS A CHARACTER ON THE CRT * ALAMO CALLING SEQUENCE: * PROC PUTC EXTERNAL; * DCL CH BYTE; * PUTC(CH); * NAM PUTCRT PUTCRT ENTER SSIZE COPY FPRM(Y),A GET CHARACTER TO OUTPUT CRENT COPY REQSND,X REQUEST TO SEND DATA  RBIT 8,S DISABLE INTERRUPTS OUT X,DAFC+CMD OUT A,DAFC OUTPUT CHARACTER COPY RESET,X  IN DAFC+CMD,Q TBIT TRDY,Q WAIT FOR TRANSMITTER TO SEND CHARACTER JT OV,$-2 IN DAFC+CMD,Q THEN WAIT FOR TRANSMITTER TBIT TRDY,Q TO BE EMPTY JF OV,$-2 BEFORE OUT X,DAFC+CMD RESETTING CRT PICO SBIT 8,S ENABLE INTERRUPTS RETURN REQSND WORD :8612 REQUEST TO SEND DATA TO CRT REQINP WORD :8618 REQUEST TO INPUT FROM CRT RESET WORD :100 RESET COMMAND TO PICO LPOOL END COPY RESET,X  IN DAFC+CMD,Q TBIT TRDY,Q WAIT FOR TRANSMITTER TO SEND CHARACTER JT OV,$-2 IN DAFC+CMD,Q THEN WAIT FOR TRANSMITTER TBIT TRDY,Q TO BE EMPTY JF OV,$-2 BEFORE OUT X,DAFC+CMD RESETTING CRT PICO SBIT 8,S ENABLE INTERRUPTS RETURN REQSND WORD :8612 REQUEST TO SEND DATA TO CRT REQINP WORD  The OAK Simulator (OAKSIM) is a tool for the user to start development on OAK software. This HELP file should help you get started, should you need to modify the Simulator to accomodate future changes in the OAK computer architecture. First of all, OAKSIM is written in ALAMO (developed in AUSTIN) and implemented on the NM4/95 computer. This set of diskettes contain all the tools necessary to maintain and update the Simulator package. The Simulator (OAKSIM) is divided into four parts, each compiled and assembled separately. These parts are as listed below and can be found on the diskettes: OAKSIM1.ALM  OAKSIM1.OBJ OAKSIM2.ALM OAKSIM2.OBJ OAKSIM3.ALM OAKSIM3.OBJ OAKSIM4.ALM OAKSIM4.OBJ In order to do single character I/O without going through the Operating System, two other files were included: GETCRT.ASM GETCRT.OBJ PUTCRT.ASM PUTCRT.OBJ There are several ALAMO I/OL  calls that require the objects be linked with still three other object files: ALAMOLIB.LIB STRING  .LIB BINIO .OBJ After linking of all the objects above, the final result is: OAKSIM.SYS  Use of the ALAMO Compiler can provide some difficulty. The first problem you may come up with will be during pass 1 of the compiler (ALC:1). If you get an error stating that the Symbol Table Space is full...the problem is that the system you are using is gen'ed for too many I/O devices. What you should do is re-configure the system to as small a system that you can. i.e. try using just TV00, LP00, DF00, DF01, DM00, and DM01. I'm sure that that configuration works. Before running the JCL, you may want to put all programs on the proper disks. The following should be on the SF: ALS .SYS ALC:1 .SYS ALC:2 .SYS DOCTOR .SYS MACRO .SYS LINK .SYS any editor All other files listed on the OAKSIM disk views must be located on UF. Two other files are included in this package, and must be updated if the} simulator is updated. These are OAK.MAC and OAKMACTEST.ASM. OAK.MAC contains all the present OAK opcodes and OAKMACTEST.ASM is an assembly that generates all available error-messages for an OAK program. Have fun!!!! Les Ventimiglia 1 OCT 1979. ALC:2 .SYS DOCTOR .SYS MACRO .SYS LINK .SYS any editor All other files listedÄ@ƒšI)& _‡„IÄ@t IB& _‡„IÄ@t I & _‡„IÄ@t „IÄ@ƒûrQÁVBGt JóQAVB„IÄ@ƒŸ)G&tGt&mVGt J¹QÁVBOIG& _‡„IÄ@t I & _‡„IÄ@tGt O@_‡„IÄ@ƒ/I & _‡„IÄ@t „IÄ@ƒûQÁVBGt JóQAVB„IÄ@ƒH)G&tOHGt&mþGt JºQÁVBOIF& _‡„IÄ@t I & _‡„IÄ@tGt O@_‡„IÄ@ƒ×I & _‡„IÄ@t „IÄ@ƒúÃQÁVBGt JóQAVB„IÄ@ƒð)G&tOHGt&m¦Gt J­QÁVBOIS& _‡„IÄ@t I & _‡„IÄ@tGt O@_‡„IÄ@ƒI & _‡„IÄ@t „IÄ@ƒúkQÁVBGt JóQAVB„IÄ@ƒ˜)G&tOHGt&mNGt J¦QÁVB{IZ& _‡„IÄ@t I & _‡„IÄ@tgt k) CJÿQÁVB I1& _‡„IÄ@t  I0& _‡„IÄ@t I & _‡„IÄ@t „IÄ@ƒùüQÁVBGt JóQAVB„IÄ@ƒ))G&t OàOàO@QAVBgtIk) C gtIk) C &mÊGt JªQÁVB{IV& _‡„IÄ@t I & _‡„IÄ@tgt k)CJÿQÁVB I1& _‡„IÄ@t  I0& _‡„IÄ@t I & _‡„IÄ@t „IÄ@ƒùxQÁVBGt JóQAVB„IÄ@ƒ¥)G&t OàOàO@QAVBgtIk)C gtIk)C &mFGt J½QÁVB{IC& _‡„IÄ@t I & _‡„IÄ@tgt k)CJÿQÁVB I1& _‡„IÄ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I