! simulator for 8080/8085 machine instruction set
%routine simulate(%integer PC)
%integer opc
%switch sw(0:255)
%cycle
  opc = bfetch(PC)

  %if opc&2_1100 0000 = 2_0100 0000 %start
    ! 01XX XXXX 64..127  MOV d, s
    
    %continue
  %finish %else -> swIMP_PRINT_HEX	 	 IMP_CONDITION_HANDLER	 
IMP_X_TO_S	 IMP_PRINT_STRING         c                    'lx'ހ|_l_88>tpNp   	z	'p7p'p0pllpltǡ   G   z'N#010): ! ADC 2
sw(2_10001011): ! ADC 3
sw(2_10001100): ! ADC 4
sw(2_10001101): ! ADC 5
sw(2_10001110): ! ADC 6
sw(2_10001111): ! ADC 7
  EA == bytereg(0); -> adc
sw(16_8E): ! ADC M
  EA == mem
adc:
  %continue
{--------------------------------- ADD --------;11985-02-01 12:13:14-SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]FREEST.IMP;1Lattice Logic IMP 9.12-2.27-2.4 IMP_FREE_STORE	 (	 IMP_CONDITION_HANDLER	  LL___HEAP_BASE          (      '||#  2  "2(( 6): ! ADD M
  EA == mem; -> add
sw(16_C6): ! ADI
  EA == imm
add:
  %continue
{--------------------------------- AND ------------------------------------}
sw(2_10100000): ! ANA 0
sw(2_10100001): ! ANA 1
sw(2_10100010): ! ANA 2
sw(2_10100011): ! ANA 3
sw(2_MTIMEIMP_CPU_TIME	 		 IMP_CONDITION_HANDLER	 DATE	 TIME	 STANDARDTIME              7  Hx?ſ"| z_xxgH  8 277  Hx?ſ"| z_xxgH  8 2n(  Hx?ſ"----------------------}
sw(16_CD): ! CALL
  %continue
sw(16_DC): ! CC
  %continue
sw(16_FC): ! CM
  %continue
sw(16_D4): ! CNC
  %continue
sw(16_C4): ! CNZ
  %continue
sw(16_F4): ! CP
  %continue
sw(16_EC): ! CPE
  %continue
sw(16_E4): ! CPO
  %continue
sw(16_CC): ! CZ
  %continue
{--------------------------------- CMA ------------------------------------}
sw(16_2F): ! CMA
  %continue
{--------------------------------- CMC ------------------------------------}
sw(16_3F): ! CMC
  %continue
{--------------------------------- CMP ------------------------------------}
sw(2_10111000): ! CMP 0
  %continue
sw(2_10111001): ! CMP 1
  %continue
sw(2_10111010): ! CMP 2
  %continue
sw(2_10111011): ! CMP 3
  %continue
sw(2_10111100): ! CMP 4
  %continue
sw(2_10111101): ! CMP 5
  %continue
sw(2_10111110): ! CMP 6
  %continue
sw(2_10111111): ! CMP 7
  %continue
sw(16_BE): ! CMP M
  %continue
sw(16_FE): ! CPI
  %continue
{--------------------------------- DAA ------------------------------------}
sw(16_27): ! DAA
  %continue
{--------------------------------- DAD ------------------------------------}
sw(2_00001001): ! DAD 0
  %continue
sw(2_00011001): ! DAD 1
  %continue
sw(2_00101001): ! DAD 2
  %continue
sw(2_00111001): ! DAD 3
  %continue
{--------------------------------- DEC ------------------------------------}
sw(2_00000101): ! DCR 0
  %continue
sw(2_00001101): ! DCR 1
  %continue
sw(2_00010101): ! DCR 2
  %continue
sw(2_00011101): ! DCR 3
  %continue
sw(2_00100101): ! DCR 4
  %continue
sw(2_00101101): ! DCR 5
  %continue
sw(2_00110101): ! DCR 6
  %continue
sw(2_00111101): ! DCR 7
  %continue
sw(16_35): ! DCR M
  %continue
sw(2_00001011): ! DCX 0
  %continue
sw(2_00011011): ! DCX 1
  %continue
sw(2_00101011): ! DCX 2
  %continue
sw(2_00111011): ! DCX 3
  %continue
{--------------------------------- DI ------------------------------------}
sw(16_F3): ! DI
  %continue
sw(16_FB): ! EI
  %continue
{---------------------------------     ------------------------------------}
sw(16_76): ! HLT
  %continue
{--------------------------------- IN  ------------------------------------}
sw(16_DB): ! IN
  %continue
sw(16_D3): ! OUT
  %continue
{--------------------------------- INC ------------------------------------}
sw(2_00000100): ! INR 0
  %continue
sw(2_00001100): ! INR 1
  %continue
sw(2_00010100): ! INR 2
  %continue
sw(2_00011100): ! INR 3
  %continue
sw(2_00100100): ! INR 4
  %continue
sw(2_00101100): ! INR 5
  %continue
sw(2_00110100): ! INR 6
  %continue
sw(2_00111100): ! INR 7
  %continue
sw(16_34): ! INR M
  %continue
sw(2_00000011): ! INX 0
  %continue
sw(2_00010011): ! INX 1
  %continue
sw(2_00100011): ! INX 2
  %continue
sw(2_00110011): ! INX 3
  %continue
{--------------------------------- JMP ------------------------------------}
sw(16_DA): ! JC
  %continue
sw(16_FA): ! JM
  %continue
sw(16_C3): ! JMP
  %continue
sw(16_D2): ! JNC
  %continue
sw(16_C2): ! JNZ
  %continue
sw(16_F2): ! JP
  %continue
sw(16_EA): ! JPE
  %continue
sw(16_E2): ! JPO
  %continue
sw(16_CA): ! JZ
  %continue
sw(16_E9): ! PCHL
  %continue
{--------------------------------- LD ------------------------------------}
sw(16_3A): ! LDA
  %continue
sw(2_00001010): ! LDAX 0
  %continue
sw(2_00011010): ! LDAX 1
  %continue
sw(16_2A): ! LHLD
  %continue
sw(2_00000001): ! LXI 0
  %continue
sw(2_00010001): ! LXI CMP 5
  %continue
sw(2_10111110): ! CMP 6
  %continue
sw(2_10111111): ! CMP 7
  %continue
sw(16_BE): ! CMP M
  %continue
sw(16_FE): ! CPI
  %continue
{--------------------------------- DAA ------------------------------------}
sw(16_27): ! DAA
  %continue): ! MOV M, 4
  %continue
sw(2_01110101): ! MOV M, 5
  %continue
sw(2_01110110): ! MOV M, 6
  %continue
sw(2_01110111): ! MOV M, 7
  %continue
sw(2_00000110): ! MVI 0
  %continue
sw(2_00001110): ! MVI 1
  %continue
sw(2_00010110): ! MVI 2
  %continue
sw(2_ DEC ------------------------------------}
sw(2_00000101): ! DCR 0
  %continue
sw(2_00001101): ! DCR 1
  %continue
sw(2_00010101): ! DCR 2
  %continue
sw(2_00011101): ! DCR 3
  %continue
sw(2_00100101): ! DCR 4
  %continue
sw(2_00101101): ! DCR 5
  %contin0
  %continue
sw(2_00010010): ! STAX 1
  %continue
{--------------------------------- NOP ------------------------------------}
{---------------------------------     ------------------------------------}
sw(0): ! NOP
  %continue
{----------------------------------------------------- DI ------------------------------------}
sw(16_F3): ! DI
  %continue
sw(16_FB): ! EI
  %continue
{---------------------------------     ------------------------------------}
sw(16_76): ! HLT
  %continue
{-----------------------%continue
sw(2_10110110): ! ORA 6
  %continue
sw(2_10110111): ! ORA 7
  %continue
sw(16_B6): ! ORA M
  %continue
sw(16_F6): ! ORI
  %continue
{--------------------------------- POP ------------------------------------}
sw(2_11000001): ! POP 0
  %continue
sue
sw(2_00010100): ! INR 2
  %continue
sw(2_00011100): ! INR 3
  %continue
sw(2_00100100): ! INR 4
  %continue
sw(2_00101100): ! INR 5
  %continue
sw(2_00110100): ! INR 6
  %continue
sw(2_00111100): ! INR 7
  %continue
sw(16_34): ! INR M
  %continue
sw(2_0--------------------------------- ROT ------------------------------------}
sw(16_17): ! RAL
  %continue
sw(16_1F): ! RAR
  %continue
sw(16_0F): ! RRC
  %continue
sw(16_07): ! RLC
  %continue
{--------------------------------- RET -------------------------JM
  %continue
sw(16_C3): ! JMP
  %continue
sw(16_D2): ! JNC
  %continue
sw(16_C2): ! JNZ
  %continue
sw(16_F2): ! JP
  %continue
sw(16_EA): ! JPE
  %continue
sw(16_E2): ! JPO
  %continue
sw(16_CA): ! JZ
  %continue
sw(16_E9): ! PCHL
  %continue
{---------Z
  %continue
{--------------------------------- RIM ------------------------------------}
sw(16_20): ! RIM
  %continue
sw(16_30): ! SIM
  %continue
{--------------------------------- RST ------------------------------------}
sw(2_11000111): ! RST 0  scaled ?
  %continue
sw(2_11001111): ! RST 1
  %continue
sw(2_11010111): ! RST 2
  %continue
sw(2_11011111): ! RST 3
  %continue
sw(2_11100111): ! RST 4
  %continue
sw(2_11101111): ! RST 5
  %continue
sw(2_11110111): ! RST 6
  %continue
sw(2_11111111): ! RST 7
  %continue
{--------------------------------- SBB ------------------------------------}
sw(2_10011000): ! SBB 0
  %continue
sw(2_10011001): ! SBB 1
  %continue
sw(2_10011010): ! SBB 2
  %continue
sw(2_10011011): ! SBB 3
  %continue
sw(2_10011100): ! SBB 4
  %continue
sw(2_10011101): ! SBB 5
  %continue
sw(2_10011110): ! SBB 6
  %continue
sw(2_10011111): ! SBB 7
  %continue
sw(16_9E): ! SBB M
  %continue
sw(16_DE): ! SBI
  %continue
{--------------------------------- SHLD -----------------------------------0
  %continue
sw(2_00010010): ! STAX 1
  %continue
{--------------------------------- NOP ------------------------------------}
{---------------------------------     ------------------------------------}
sw(0): ! NOP
  %continue
{------------------------------------------------ SUB ------------------------------------}
sw(2_10010000): ! SUB 0
  %continue
sw(2_10010001): ! SUB 1
  %continue
sw(2_10010010): ! SUB 2
  %continue
sw(2_10010011): ! SUB 3
  %continue
sw(2_10010100): ! SUB 4
  %continue
sw(2_10010%continue
sw(2_10110110): ! ORA 6
  %continue
sw(2_10110111): ! ORA 7
  %continue
sw(16_B6): ! ORA M
  %continue
sw(16_F6): ! ORI
  %continue
{--------------------------------- POP ------------------------------------}
sw(2_11000001): ! POP 0
  %continue
s%continue
{--------------------------------- XOR ------------------------------------}
sw(2_10101000): ! XRA 0
  %continue
sw(2_10101001): ! XRA 1
  %continue
sw(2_10101010): ! XRA 2
  %continue
sw(2_10101011): ! XRA 3
  %continue
sw(2_10101100): ! XRA 4
 --------------------------------- ROT ------------------------------------}
sw(16_17): ! RAL
  %continue
sw(16_1F): ! RAR
  %continue
sw(16_0F): ! RRC
  %continue
sw(16_07): ! RLC
  %continue
{--------------------------------- RET -------------------------sw(16_E3): ! XTHL
  %continue
%repeat
%end
%endoffile
