home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol068 / dynatrce.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  53.7 KB  |  1,600 lines

  1. ;*****************************************************
  2. ;                                                    *
  3. ;                  DYNATRACE                         *
  4. ;                    V 2.0                           *
  5. ;                                                    *
  6. ;     COPYRIGHT (C) 1976, BY RICHARD E. MEADOR       *
  7. ;                            SACRAMENTO, CALIFORNIA  *
  8. ;                                             95826  *
  9. ;                                                    *
  10. ;      ALL RIGHTS RESERVED WITH THE EXCEPTION OF     *
  11. ; REPRODUCTION BY THOSE INDIVIDUALS FOR THEIR OWN    *
  12. ; NONCOMERCIAL USE WHO HAVE PURCHASED DYNATRACE FROM *
  13. ; AN AUTHORIZED DISTRIBUTOR.                         *
  14. ;                                                    *
  15. ;*****************************************************
  16. ;
  17. ;
  18. ;
  19.     ORG    8000H
  20. DYNAT:    DS    400H    ;BASE ADDRESS OF PROGRAM
  21. STACK   EQU     DYNAT+0C00H       ;SET UP SYSTEM STACK
  22. CONPRT    EQU    0C8H    ;CONTROL PORT ADDRESS
  23. SCREEN  EQU     0BC00H  ;1K OF BUFFER FOR SCREEN
  24. TOS     EQU     (SCREEN+1024)/256    ;LAST BUFFER ADDRESS+1
  25. MIDSCR  EQU     SCREEN+448      ;TOP LINE OF ROLLUP PORTION OF SCREEN
  26. LINE    EQU     64      ;64 CHARACTERS/LINE
  27. LINE1   EQU     SCREEN+LINE
  28. LINE2   EQU     LINE1+64
  29. LINE3   EQU     LINE2+64
  30. LINE4   EQU     LINE3+64
  31. LINE5   EQU     LINE4+64
  32. LINE15  EQU     SCREEN+960
  33. PCH     EQU     LINE1+8 ;PC HEX DISPLAY LOCATION
  34. INSTA   EQU     LINE2+8 ;INSTRUCTION ASCII DISPLAY LOCATION
  35. INSTH   EQU     LINE2+18        ;INSTRUCTION HEX DISPLAY LOCATION
  36. SB      EQU     LINE4+8 ;SIGN FLAG BINARY DISPLAY LOCATION
  37. ZB      EQU     LINE4+9 ;ZERO FLAG BINARY DISPLAY LOCATION
  38. ACB     EQU     LINE4+11        ;AUX CARRY FLAG BINARY DISPLAY LOCATION
  39. PB      EQU     LINE4+13        ;PARITY FLAG BINARY DISPLAY LOCATION
  40. CYB     EQU     LINE4+15        ;CARRY FLAG BINARY DISPLAY LOCATION
  41. ACCH    EQU     LINE1+22        ;ACCUMULATOR HEX DISPLAY LOCATION
  42. ACCB    EQU     LINE1+25        ;ACCUMULATOR BINARY DISPLAY LOCATION
  43. BCH     EQU     LINE1+37        ;B REG HEX DISPLAY LOCATION
  44. BCB     EQU     LINE1+42        ;B REG BINARY DISPLAY LOCATION
  45. DEH     EQU     LINE2+37        ;DE REG PR HEX DISPLAY LOCATION
  46. DEB     EQU     LINE2+42        ;DE REG PR BINARY DISPLAY LOCATION
  47. HLH     EQU     LINE3+37        ;HL REG PR HEX DISPLAY LOCATION
  48. HLB     EQU     LINE3+42        ;HL REG PR BINARY DISPLAY LOCATION
  49. SPH     EQU     LINE4+37        ;SP REG PR HEX DISPLAY LOCATION
  50. KSTAT   EQU     6EH
  51. KEYBRD  EQU     6CH
  52. KBDRDY  EQU     80H
  53. RSTAT    EQU    07H
  54. READER  EQU     06H
  55. RDRRDY  EQU     02H
  56. SWTCHS  EQU     0FFH
  57. CR      EQU     0DH
  58. LF      EQU     0AH
  59. ESC     EQU     1BH
  60. ;
  61. ;
  62. ;STORAGE DEFINITION STATEMENTS
  63. ;
  64.         ORG     DYNAT+0B80H   ;SYSTEM WORKING STORAGE AREA
  65. PC1:    DS    2    ;USER'S PROGRAM COUNTER STORAGE
  66. STKPTR:    DS    2    ;USER'S STACK POINTER STORAGE
  67. BC:     DS      2       ;USER'S BC REG PR STORAGE
  68. DE:     DS      2       ;USER'S DE REG PR STORAGE
  69. HL:     DS      2       ;USER'S HL REG PR STORAGE
  70. STSWRD: DS      1       ;USER'S STATUS FLAG STORAGE
  71. AC:     DS      1       ;USER'S ACCUMULATOR STORAGE
  72. PC:     DS      2       ;USER'S PRIMARY PROGRAM COUNTER STORAGE
  73. BINFLG: DB      0       ;BINARY DISPLAY SWITCH(0=>NO BINARY DISPLAY)
  74. CPOSIT: DS      2       ;CURSER POSITION FOR ROLLUP PORTION OF SCREEN
  75. STKTMP: DS      2       ;TEMPORARY STORAGE FOR SYSTEM STACK
  76. BASE:   DS      2       ;BASE ADDRESS STORAGE FOR VARIOUS ROUTINES
  77. LAST:   DS      2       ;LAST    '       '     '     '       '
  78. FROM:   DB      'FROM-' ;MESSAGES
  79. TO:     DB      'TO-'   ;
  80. ASCII:  DB      '0123456789ABCDEF'      ;ASCII HEX DIGIT TABLE
  81. MOVENM: DB      'MOV  ,  '      ;MOVE MNUMONIC
  82.     DB    'COPYRIGHT (C) 1976, RICHARD E. MEADOR'
  83. ;
  84. ;CODE BEGINS HERE
  85. ;
  86.     ORG    100H
  87. DBYTE    EQU    8000H    ;PROGRAM WILL RUN HERE
  88.  
  89.     LXI    H,0400H    ;PROGRAM BASE POINTER
  90.     LXI    D,DBYTE    ;NEW BASE POINTER
  91. LOOP    MOV    A,M    ;PICK UP 1ST CHAR
  92.     STAX    D    ;STORE AT NEW BASE
  93.     INX    H
  94.     INX    D
  95.     MOV    A,H    ;MOVE POINTER
  96.     CPI    10H    ;
  97.     JNZ    LOOP    ;DO UNTIL DONE
  98.     JMP    DBYTE    ;GO TO NEW LOCATION
  99. ;
  100. ;
  101. ;
  102.         ORG     DYNAT   ;START ADDRESS
  103. START:  LXI     SP,STACK        ;DEFINE SYSTEM STACK
  104.         CALL    CLRSCR  ;CLEAR VIDEO SCREEN
  105.         CALL    SETSCR  ;SET UP DISPLAY OF USER REGISTERS
  106.         MVI     A,0     ;CLEAR ACCUMULATOR
  107.         MVI     B,14    ;SET CLEAR COUNT
  108.         LXI     H,PC1   ;SET FIRST ADDRESS TO BE CLEARED
  109. VDM010: MOV     M,A     ;CLEAR
  110.         INX     H       ;NEXT ADDRESS
  111.         DCR     B       ;1 LESS TO DO
  112.         JNZ     VDM010  ;DONE?
  113.         LXI     H,PC1        ;YES, DEFINE USER'S STACK POINTER
  114.         SHLD    STKPTR      ;
  115. VDM015: CALL    DSREGS  ;DISPLAY CONTENTS OF USER'S REGISTERS
  116.         CALL    KEYBDI  ;GET COMMAND
  117.         CPI     40H     ;CHECK FOR ALPHA
  118.         JM      VDM020  ;IGNORE IF NOT
  119.         CPI     5BH     ;
  120.         JP      VDM020  ;
  121.         LXI     H,KEYTAB        ;GET COMMAND LOCATOR TABLE BASE ADDRESS
  122.         SBI     40H     ;SUBTRACT ASCII BIAS FROM RECEIVED COMMAND
  123.         RLC             ;DOUBLE FOR WORD INDEXING
  124.         ADD     L       ;ADD INDEX
  125.         MOV     L,A     ;
  126.         MVI     A,0     ;        ADC     H       ;
  127.         MOV     H,A     ;
  128.         MOV     E,M     ;GET COMMAND ADDRESS FROM TABLE
  129.         INX     H       ;
  130.         MOV     D,M     ;
  131.         LXI     H,VDM020        ;SET UP RETURN ADDRESS
  132.         PUSH    H       ;SAVE ON STACK
  133.         XCHG            ;HL=COMMAND ROUTINE ADDRESS
  134.         PCHL            ;(THIS IS REALLY A CALL TO A COMMAND ROUTINE)
  135. VDM020: LXI     H,LINE15        ;RESET CURSOR
  136.         SHLD    CPOSIT  ;
  137.         JMP     VDM015  ;END OF COMMAND PROCESSING LOOP
  138. ;
  139. ;COMMAND LOCATOR TABLE
  140. ;
  141. KEYTAB: DW      UTURN   ;A-NOP
  142.         DW      BINARY  ;B-BINARY DISPLAY TOGGLE
  143.         DW      CALSUB  ;C-CALL USER SUB-PROGRAM
  144.         DW      DUMPME  ;D-DUMP MEMORY TO SCREEN
  145.         DW      UTURN   ;E-NOP
  146.         DW      UTURN   ;F-NOP
  147.         DW      GO      ;G-EXECUTE USER PROGRAM INTERPRETIVELY
  148.         DW      UTURN   ;H-NOP
  149.         DW      ISPEED  ;I-SET EXECUTION SPEED OF INTERPRETER
  150.         DW      UTURN   ;J-NOP
  151.         DW      UTURN   ;K-NOP
  152.         DW      LOADRG  ;L-LOAD REGISTER PAIR
  153.         DW      MEMSTR  ;M-STORE BYTES IN CONSECUTIVE MEMORY LOCATIONS
  154.         DW      UTURN   ;N-NOP
  155.         DW      UTURN   ;O-NOP
  156.         DW      UTURN   ;P-NOP
  157.         DW      UTURN   ;Q-NOP
  158.         DW      READTP  ;R-READ PAPER TAPE
  159.         DW      STEP    ;S-INTERPRET ONE INSTRUCTION
  160.         DW      UTURN   ;T-NOP
  161.         DW      UTURN   ;U-NOP
  162.         DW      UTURN   ;V-NOP
  163.         DW      UTURN   ;W-NOP
  164.         DW      UTURN   ;X-NOP
  165.         DW      UTURN   ;Y-NOP
  166.         DW      ZERMEM  ;Z-ZERO MEMORY
  167. ;
  168. ;
  169. ;
  170. UTURN:  RET             ;DUMMY ROUTINE FOR NOP'S
  171. ;
  172. ;
  173. ;  CLEAR VDM ROUTINE
  174. ;
  175. CLRSCR: MVI     A,0     ;CONTROL PORT IINITIALIZATUIION WORD
  176.         OUT     CONPRT  ;SEND
  177.         LXI     B,SCREEN        ;BASE ADDRESS OF VDM BUFFER
  178. CLR010: MVI     A,' '   ;ASCII SPACE
  179.         STAX    B       ;CLEAR 1 BUFFER WORD
  180.         INX     B       ;UPDATE BUFFER POINTER
  181.         MVI     A,TOS AND 0FFH   ;LAST BUFFER ADDRESS +1
  182.         CMP     B       ;CHECK FOR END OF BUFFER AREA
  183.         JNZ     CLR010  ;DO UNTIL DONE
  184.         LXI     H,LINE15        ;INITIAL CURSOR LOCATION
  185.         SHLD    CPOSIT  ;STORE TO CURSOR SAVE
  186.         RET             ;EXIT
  187. ;
  188. ;  SET DISPLAY OF USER'S REGISTERS
  189. ;
  190. SETSCR: LXI     H,'PC'          ;PC
  191.         SHLD    LINE1+5
  192.         MVI     A,'A'           ;A
  193.         STA     LINE1+20
  194.         LXI     H,'BC'          ;BC
  195.         SHLD    LINE1+34
  196.         LXI     H,'IN'          ;IN
  197.         SHLD    LINE2+2
  198.         LXI     H,'ST'          ;ST
  199.         SHLD    LINE2+4
  200.         MVI     A,'R'           ;R
  201.         STA     LINE2+6
  202.         LXI     H,'DE'          ;DE
  203.         SHLD    LINE2+34
  204.         MVI     A,'C'           ;C
  205.         STA     LINE3+15
  206.         MVI     A,'Z'           ;Z
  207.         STA     LINE3+9
  208.         MVI     A,'P'           ;P
  209.         STA     LINE3+13
  210.         MVI     A,'S'           ;S
  211.         STA     LINE3+8
  212.         MVI     A,'A'           ;A
  213.         STA     LINE3+11
  214.         LXI     H,'HL'          ;HL
  215.         SHLD    LINE3+34
  216.         LXI     H,'SP'          ;SP
  217.         SHLD    LINE4+34
  218.         LXI     H,'PS'
  219.         SHLD    LINE4+4
  220.         MVI     A,'W'
  221.         STA     LINE4+6
  222.         MVI     A,'0'
  223.         STA     LINE4+10
  224.         STA     LINE4+12
  225.         INR     A
  226.         STA     LINE4+14
  227.         RET
  228. ;
  229. ;MOVE THE NUMBER OF BYTES INDICATED IN DE
  230. ;FROM THE ADDRESS BEGINNING IN BC
  231. ;TO THE ADDRESS BEGINNING IN HL
  232. ;
  233. SETLNE: LDAX    B       ;GETBYTE
  234.         MOV     M,A     ;TRANSFER
  235.         INX     H       ;UPDATE DESTINATION POINTER
  236.         INX     B       ;UPDATE SOURCE POINTER
  237.         DCX     D       ;UPDATE COUNT
  238.         MOV     A,E     ;CHECK FOR COMPLETION
  239.         CPI     0       ;
  240.         JNZ     SETLNE  ;
  241.         MOV     A,D     ;
  242.         CPI     0       ;
  243.         JNZ     SETLNE  ;
  244.         RET             ;EXIT
  245. ;
  246. ; DISPLAY REGISTERS ROUTINE
  247. ;
  248. ;THIS ROUTINE DECODES THE USER'S REGISTER INFORMATION
  249. ;     AND FORMATS IT FOR DISPLAY ON THE CRT SCREEN
  250. ;
  251. DSREGS: PUSH    B       ;SAVE ALL REGISTERS
  252.         PUSH    D       ;
  253.         PUSH    H       ;
  254.         PUSH    PSW     ;
  255.         LXI     D,PC1   ;
  256.         LXI     H,PCH+2 ;
  257.         CALL    DSPHEX  ;
  258.         LXI     D,PC1+1 ;
  259.         LXI     H,PCH   ;
  260.         CALL    DSPHEX  ;
  261.         LXI     D,STKPTR    ;
  262.         LXI     H,SPH+2 ;
  263.         CALL    DSPHEX  ;
  264.         LXI     D,STKPTR+1  ;
  265.         LXI     H,SPH   ;
  266.         CALL    DSPHEX  ;
  267.         LXI     D,BC    ;
  268.         LXI     H,BCH+2 ;
  269.         CALL    DSPHEX  ;
  270.         LXI     D,BC+1  ;
  271.         LXI     H,BCH   ;
  272.         CALL    DSPHEX  ;
  273.         LXI     D,DE    ;
  274.         LXI     H,DEH+2 ;
  275.         CALL    DSPHEX  ;
  276.         LXI     D,DE+1  ;
  277.         LXI     H,DEH   ;
  278.         CALL    DSPHEX  ;
  279.         LXI     D,HL    ;
  280.         LXI     H,HLH+2 ;
  281.         CALL    DSPHEX  ;
  282.         LXI     D,HL+1  ;
  283.         LXI     H,HLH   ;
  284.         CALL    DSPHEX  ;
  285.         LXI     D,AC    ;
  286.         LXI     H,ACCH  ;
  287.         CALL    DSPHEX  ;
  288.         LDA     STSWRD  ;
  289.         LXI     H,CYB   ;
  290.         RAR             ;
  291.         MVI     M,'0'   ;
  292.         JNC     DSR010  ;
  293.         MVI     M,'1'   ;
  294. DSR010: RAR             ;
  295.         RAR             ;
  296.         LXI     H,PB    ;
  297.         MVI     M,'0'   ;
  298.         JNC     DSR020  ;
  299.         MVI     M,'1'   ;
  300. DSR020: RAR             ;
  301.         RAR             ;
  302.         LXI     H,ACB   ;
  303.         MVI     M,'0'   ;
  304.         JNC     DSR030  ;
  305.         MVI     M,'1'   ;
  306. DSR030: RAR             ;
  307.         RAR             ;
  308.         LXI     H,ZB    ;
  309.         MVI     M,'0'   ;
  310.         JNC     DSR040  ;
  311.         MVI     M,'1'   ;
  312. DSR040: RAR             ;
  313.         LXI     H,SB    ;
  314.         MVI     M,'0'   ;
  315.         JNC     DSR050  ;
  316.         MVI     M,'1'   ;
  317. DSR050: POP     PSW     ;
  318.         POP     H       ;
  319.         POP     D       ;
  320.         POP     B       ;
  321.         LDA     BINFLG  ;CHECK FOR BINARY DISPLAY FLAG SET
  322.         ANA     A       ;
  323.         RZ              ;DONE IF NOT SET
  324.         PUSH    B       ;
  325.         PUSH    D       ;
  326.         PUSH    H       ;
  327.         PUSH    PSW     ;
  328.         LXI     D,AC    ;
  329.         LXI     H,ACCB  ;
  330.         CALL    DSPBIN  ;
  331.         LXI     D,BC    ;
  332.         LXI     H,BCB+9 ;
  333.         CALL    DSPBIN  ;
  334.         LXI     D,BC+1  ;
  335.         LXI     H,BCB   ;
  336.         CALL    DSPBIN  ;
  337.         LXI     D,DE    ;
  338.         LXI     H,DEB+9 ;
  339.         CALL    DSPBIN  ;
  340.         LXI     D,DE+1  ;
  341.         LXI     H,DEB   ;
  342.         CALL    DSPBIN  ;
  343.         LXI     D,HL    ;
  344.         LXI     H,HLB+9 ;
  345.         CALL    DSPBIN  ;
  346.         LXI     D,HL+1  ;
  347.         LXI     H,HLB   ;
  348.         CALL    DSPBIN  ;
  349.         POP     PSW     ;
  350.         POP     H       ;
  351.         POP     D       ;
  352.         POP     B       ;
  353.         RET             ;
  354. ;
  355. ; DECODE REGISTERS FOR DISPLAY ROUTINE
  356. ;
  357. DSPHEX: LDAX    D       ;GET REGISTER CONTENTS
  358.         RRC             ;SCALE ACCUMULATOR DOWN TO GET UPPER HEX DIGIT
  359.         RRC             ;
  360.         RRC             ;
  361.         RRC             ;
  362.         ANI     0FH     ;MASK OFF UNWANTED BITS
  363.         LXI     B,ASCII ;BASE ADDRESS OF ASCIIDIGIT TABLE
  364.         ADD     C       ;ADD ACCUMULATOR TO BC TO GET ADDRESS OF DIGIT
  365.         MOV     C,A     ;
  366.         MVI     A,0     ;
  367.         ADC     B       ;
  368.         MOV     B,A     ;
  369.         LDAX    B       ;
  370.         MOV     M,A     ;STORE ASCII CODE FOR HEX DIGIT
  371.         INX     H       ;INCREMENT SCREEN POSITION
  372.         LDAX    D       ;GET REGISTER CONTENTS AGAIN
  373.         ANI     0FH     ;DO THE SAME FOR THE LOWER HEX DIGIT
  374.         LXI     B,ASCII ;
  375.         ADD     C       ;
  376.         MOV     C,A     ;
  377.         MVI     A,0     ;
  378.         ADC     B       ;
  379.         MOV     B,A     ;
  380.         LDAX    B       ;
  381.         MOV     M,A     ;
  382.         RET             ;
  383. ;
  384. ; DECODE REGISTER TO BINARY DISPLAY ROUTINE
  385. ;
  386. DSPBIN: LDAX    D       ;GET USER REGISTER CONTENTS
  387.         MVI     C,8     ;# OF BITS
  388. DSP010: RAL             ;SHIFT UPPER BIT TO CARRY FOR CHECKING
  389.         MVI     M,'0'   ;ASSUME ZERO
  390.         JNC     DSP020  ;CHECK FOR ONE
  391.         MVI     M,'1'   ;CHANGE IF ONE
  392. DSP020: INX     H       ;MOVE TO NEXT SCREEN POSITION
  393.         DCR     C       ;COUNT OFF
  394.         JNZ     DSP010  ;DONE?
  395.         RET             ;YES
  396. ;
  397. ;SIMULATOR CODE BEGINS HERE
  398. ;  ONE 8080 INSTRUCTION AS INDICATED BY THE USER'S PC REGISTER
  399. STEP:   LHLD    PC      ;GET USER'S PROGRAM COUNTER VALUE
  400.         SHLD    PC1     ;SAVE FOR LAGGING DISPLAY
  401.         MOV     A,M     ;GET THE CONTENTS OF MEMORY LOCATION INDICATED
  402.         CPI     40H     ;CHECK FOR CODES 0-3F HEX
  403.         JC      STP010  ;LOW ORDER 64 OPCODES?
  404.         CPI     80H     ;NO, CHECK FOR 40-7F HEX
  405.         JNC     STP020  ;IS A REGISTER TO REGISTER MOVE INSTRUCTION?
  406.         CALL    MOVE    ;YES, EXECUTE IT
  407.         RET             ;RETURN TO MONITOR
  408. STP010: CALL    OPLOW   ;LOW ORDER OP CODES
  409.         RET             ;RETURN TO MONITOR
  410. STP020: CPI     0C0H    ;CHECK FOR 80-BF HEX
  411.         JNC     STP030  ;ARTHMETIC INSTRUCTION?
  412.         CALL    ARITH   ;YES, EXECUTE
  413.         RET             ;RETURN TO MONITOR
  414. STP030: CALL    OPHIGH  ;HIGH ORDER OP CODE
  415.         RET             ;RETURN TO MONITOR
  416. ;
  417. ; EXECUTE INSTRUCTION ROUTINE
  418. ;
  419. OPEXEC: LXI     H,0     ;SAVE MONITOR'S STACK POINTER
  420.         DAD     SP
  421.         SHLD    STKTMP
  422.         LHLD    STSWRD  ;LOAD REAL REGISTERS WITH USER'S DATA
  423.         PUSH    H       
  424.         POP     PSW     
  425.         LHLD    STKPTR
  426.         SPHL
  427.         LHLD    BC
  428.         MOV     B,H
  429.         MOV     C,L
  430.         LHLD    DE
  431.         XCHG
  432.         LHLD    HL
  433. INSTR:  DS      3       ;INSTRUCTION TO BE EXECUTED IS STORED HERE
  434.                         ; IF IT WILL NOT CAUSE LOSS OF CONTROL
  435.         SHLD    HL      ;SAVE USER REGISTER VALUES
  436.         PUSH    PSW     ;
  437.         POP     H       ;
  438.         SHLD    STSWRD  ;
  439.         LXI     H,0     ;
  440.         DAD     SP      ;
  441.         SHLD    STKPTR      ;
  442.         XCHG            ;
  443.         SHLD    DE      ;
  444.         LHLD    STKTMP  ;GET MONITOR'S STACK POINTER
  445.         SPHL            ;
  446.         MOV     H,B     ;
  447.         MOV     L,C     ;
  448.         SHLD    BC      ;
  449.         RET             ;
  450. ;
  451. ; MOV COMMAND EXECUTION ROUTINE
  452. ;
  453. MOVE:   MOV     B,A     ;SAVE OP CODE
  454.         ANI     07H     ;DECODE SOURCE REGISTER
  455.         MVI     D,0     ;
  456.         MOV     E,A     ;
  457.         LXI     H,RGSTRS        ;
  458.         DAD     D       ;
  459.         MOV     A,M     ;GET REGISTER NAME
  460.         STA     MOVENM+6   ;SET UP NMEUMONIC
  461.         MOV     A,B     ;RESTORE OP CODE
  462.         RRC             ;
  463.         RRC             ;
  464.         RRC             ;
  465.         ANI     07H     ;DO SAME FOR DESTINATION REGISTER
  466.         MOV     E,A     ;
  467.         LXI     H,RGSTRS        ;
  468.         DAD     D       ;
  469.         MOV     A,M     ;
  470.         STA     MOVENM+4   ;
  471.         MOV     A,B     ;
  472.         MVI     B,1     ;# OF BYTES IN INSTRUCTION
  473.         CALL    MVINST  ;COPY INSTRUCTION INTO EXECUTION AREA
  474.         LXI     H,INSTA ;DISPLAY NMEUMONIC
  475.         LXI     B,MOVENM   ;
  476.         LXI     D,8     ;
  477.         CALL    SETLNE  ;
  478.         CALL    OPEXEC  ;GO EXECUTE INSTRUCTION
  479.         RET             ;DONE,
  480. ;
  481. ; ARITHMETIC INSTRUCTION EXECUTION ROUTINE
  482. ;
  483. ARITH:  MOV     B,A     ;SAVE OP CODE
  484.         LXI     H,ARITHN        ;GET ADDRESS OF ARITH NMEUMONICS
  485.         ANI     38H     ;ISOLATE REGISTER OPERAND
  486.         MVI     D,0     ;
  487.         MOV     E,A     ;
  488.         DAD     D       ;ADD INDEX TO GET APPROPRIATE NMEUMONIC
  489.         PUSH    H       ;SAVE TEMPORARILY
  490.         MOV     A,B     ;RESTORE OPCODE
  491.         ANI     07H     ;ISOLATE REGISTER OPERAND #
  492.         LXI     H,RGSTRS        ;GET REGISTER NAME LIST ADDRESS
  493.         MOV     E,A     ;
  494.         DAD     D       ;ADD INDEX TO GET CORRECT REGISTER NMEUMONIC
  495.         MOV     A,M     ;GET NMEUMONIC
  496.         POP     H       ;RETRIEVE INSTRUCTION NMEUMONIC ADDRESS
  497.     MVI    E,4    ;
  498.     DAD    D    ;
  499.         MOV     M,A     ;MOVE REGISTER NAME TO MEMORY
  500.         DCX     SP      ;
  501.         DCX     SP      ;
  502.         MOV     A,B     ;RESTORE OP CODE
  503.         MVI     B,1     ;SET # OF BYTES IN OPCODE
  504.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  505.         LXI     H,INSTA ;DISPLAY NMEUMONIC
  506.         LXI     D,8     ;
  507.         POP     B       ;
  508.         CALL    SETLNE  ;
  509.         CALL    OPEXEC  ;GO EXECUTE INSTRUCTION
  510.         RET             ;
  511. ;
  512. ;ARITHMETIC INSTRUCTION NMEUMONICS
  513. ;
  514. ARITHN: DB      'ADD     '      ;ADD REGISTER TO ACCUMULATOR
  515.         DB      'ADC     '      ;ADD REGISTER+CARRY TO ACCUMULATOR
  516.         DB      'SUB     '      ;SUB REGISTER FROM ACCUMULATOR
  517.         DB      'SBB     '      ;SUB REGISTER+CARRY FROM ACCUMULATOR
  518.         DB      'ANA     '      ;LOGICAL AND REGISTER WITH ACCUMULATOR
  519.         DB      'XRA     '      ;LOGICAL EXCLUSIVE OR REGISTER WITH ACCU
  520.         DB      'ORA     '      ;LOGICAL OR REGISTER WITH ACCUMULATOR
  521.         DB      'CMP     '      ;COMPARE REGISTER WITH ACCUMULATOR
  522. ;
  523. ; LOW ORDER INSTRUCTION EXECUTION ROUINE
  524. ; OP CODES 0-3F HEX
  525. OPLOW:  MOV     E,A     ;SAVE OP CODE
  526.         ANI     07H     ;DETERMINE CLASS AND BRANCH TO APPRPRIATE ROUTINE
  527.         RLC             ;
  528.         MOV     C,A     ;
  529.         MVI     B,0     ;
  530.         LXI     H,OPTAB ;
  531.         DAD     B       ;
  532.         MOV     A,E     ;
  533.         MOV     E,M     ;
  534.         INX     H       ;
  535.         MOV     D,M     ;
  536.         XCHG            ;
  537.         PCHL            ;
  538. ;
  539. ;OP CODE SIMULATION ROUTINE LOOKUP TABLE
  540. ;
  541. OPTAB:  DW      NPINST     ; NO-OP ROUTINE POINTER
  542.         DW      LXIDAD  ; LXI & DAD ROUTINE POINTER
  543.         DW      LDSTRX  ; LDAX & STAX ROUTIN POINTER
  544.         DW      INXDCX  ;INX & DCX ROUTINE POINTER
  545.         DW      INRDCR  ; INR & DCR ROUTINE POINTER
  546.         DW      INRDCR  ; SAME
  547.         DW      MVIMM     ; MVI ROUTINE POINTER
  548.         DW      ROTATE  ; ROTATE POINTER
  549. ;
  550. ; A=OP CODE, B= NO. OF BYTES
  551. ;
  552. MVINST: STA     INSTR   ;STORE OP CODE TO EXECUTION AREA
  553.         PUSH    B       ;SAVE NUMBER OF BYTES IN OP CODE
  554.         CALL    HEXASC  ;CONVERT OP CODE TO ASCII/HEX EQUIVALANT
  555.         MOV     H,C     ;TRANSFER FOR DOUBLE LENGTH STORE
  556.         MOV     L,B     ;
  557.         SHLD    INSTH   ;STORE ASCII CODES OF OP CODE TO VDM BUFFER
  558.         POP     B       ;RETRIEVE NUMBER OF BYTES IN INSTRUCTION
  559.         LXI     D,INSTR+1       ;GET ADDRESS OF NEXT LOCATION IN EXECUTI
  560.         MVI     A,0     ;ZERO NEXT 2 BYTES IN EXECUTION AREA
  561.         STAX    D       ;    IN CASE INSTRUCTION<3 BYTES
  562.         STA     INSTR+2 ;
  563.         MVI     H,' '   ;CLEAR PREVIOUS EXECUTION FROM SCREEN
  564.         MOV     L,H     ;
  565.         SHLD    INSTH+2 ;
  566.         SHLD    INSTH+4 ;
  567.         LXI     H,INSTH+2       ;SET TO DISPLAY REST OF INSTRUCTION IF A
  568.         SHLD    STKTMP  ;SAVE VDM BUFFER LOCATION OF ASCII/HEX DISPLAY A
  569.         LHLD    PC      ;GET USER'S PROGRAM COUNTER
  570.         INX     H       ;UPDATE IT
  571. MVI010: DCR     B       ;COUNT OFF NUMBER OF BYTES IN INSTRUCTION
  572.         JZ      MVI020  ;EXIT IF DONE
  573.         MOV     A,M     ;GET NEXT BYTE OF INSTRUCTION FROM USER'S PROGRA
  574.         INX     H       ;UPDATE USER'S PROGRAM COUNTER
  575.         STAX    D       ;STORE BYTE TO EXECUTION AREA
  576.         INX     D       ;UPDATE EXECUTION BUFFER POINTER
  577.         PUSH    B       ;SAVE NUMBER OF BYTES IN INSTRUCTION
  578.         PUSH    D       ;SAVE EXECUTION BUFFER POINTER
  579.         PUSH    H       ;SAVE USER'S PROGRAM COUNTER
  580.         CALL    HEXASC  ;CONVERT NEXT BYTE OF INSTRUCTION TO ASCII/HEX C
  581.         LHLD    STKTMP  ;RETRIEVE VDM BUFFER LOCATIN OF ASCII/HEX DISPLA
  582.         MOV     M,B     ;MOVE ASCII/HEX CODES OF CURRENT INSTRUCTION BYT
  583.         INX     H       ;   TO VDM BUFFER AREA
  584.         MOV     M,C     ;
  585.         INX     H       ;
  586.         SHLD    STKTMP  ;SAVE VDM BUFFER LOCATION AGAIN
  587.         POP     H       ;RETRIEVE USER'S PROGRAM COUNTER
  588.         POP     D       ;RETRIEVE EXECUTION BUFFER POINTER
  589.         POP     B       ;RETRIEVE NUMBER OF BYTES LEFT IN INSTRUCTION
  590.         JMP     MVI010  ;CONTINUE UNTIL ALL BYTES MOVED
  591. MVI020: SHLD    PC      ;STORE UPDATED USER'S PROGRAM COUNTER
  592.         RET             ;EXIT
  593. ;
  594. ;
  595. ; MOVE NMUMONIC TO BUFFER
  596. ;
  597. MVNMNC: LXI     H,INSTA ;GET VDM BUFFER LOCATION OF MNEUMONIC DISPLAY AR
  598.         PUSH    D       ;SAVE D REGISTER
  599.         LXI     D,4     ;SET NUMBER OF BYTES TO TRANSFER
  600.         CALL    SETLNE  ;DO TRANSFER
  601.         POP     B       ;GET OLD D REGISTER
  602.         MVI     D,' '   ;THE FOLLOWING CODE MOVES THE ASCII CHARACTERS O
  603.         MOV     M,D     ;   THE REGISTERS USED BY THE INSTRUCTION TO THE
  604.         INX     H       ;       THE VDM BUFFER AREA
  605.         MOV     M,C     ;
  606.         INX     H       ;
  607.         MOV     M,B     ;
  608.         INX     H       ;
  609.         MOV     M,D     ;
  610.         RET             ;
  611. ;
  612. ; GET REGISTER PAIR ROUTINE
  613. ;
  614. GETRP:  ANI     30H     ;MASK REGISTER PAIR FIELD
  615.         RRC             ;SCALE FOR INDEXING
  616.         RRC             ;
  617.         RRC             ;
  618.         MOV     E,A     ;BUILD INDEX IN DE
  619.         MVI     D,0     ;
  620.         LXI     H,REGPAR        ;GET BASE ADDRESS OF REG PAIR MNEUMONICS
  621.         DAD     D       ;ADD INDEX
  622.         SHLD    GET010+1        ;SAVE POINTER
  623. GET010: LHLD    0       ;0 IS REPLACED BY POINTER FROM ABOVE
  624.         XCHG            ;POSITION FOR SUB ROUTINE CALL
  625.         CALL    MVNMNC  ;DISPLAY OP CODE
  626.         RET             ;
  627. ;
  628. ; EXECUTE NO-OP ROUTINE
  629. ;
  630. NPINST:    MVI     B,1     ;SET INSTRUCTION LENGTH
  631.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  632.         LXI     D,'  '  ;NO REGISTER DATA
  633.         LXI     B,LOWOP ;ADDRESS OF NOP MNEUMONIC
  634.         CALL    MVNMNC  ;DISPLAY OP CODE
  635.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  636.         RET             ;
  637. ;
  638. ;  EXECUTE LXI AND DAD INSTRUCTIONS ROUTINE
  639. ;
  640. LXIDAD:    MOV    B,A    ;SAVE INSTRUCTION
  641.         ANI     08H     ;ISOLATE LXI/DAD BIT
  642.         MOV     A,B     ;RESTORE INSTRUCTION
  643.         MVI     B,1     ;ASSUME DAD INSTRUCTION
  644.         JNZ     LXI010  ;DAD OR LXI?
  645.     MVI    B,3    ;LXI, CHANGE INSTRUCTION LENGTH TO 3 BYTES
  646. LXI010: PUSH    PSW     ;SAVE INSTRUCTION DESIGNATOR WHICH IS THE ZERO F
  647.         CALL    MVINST  ;DISPLAY OP CODE
  648.         POP     PSW     ;RETRIEVE FLAG
  649.         LXI     B,LOWOP1+4      ;ASSUME DAD
  650.         JNZ     LXI020  ;DAD/LXI?
  651.     LXI    B,LOWOP1    ;LXI, CHANGE POINTER
  652. LXI020: CALL    GETRP   ;ISOLATE REG PAIR
  653.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  654.         RET             ;
  655. ;
  656. ; LDA STA LDAX STAX SHLD LHLD  EXECUTION ROUTINE
  657. ;
  658. LDSTRX: MOV     C,A     ;SAVE INSTRUCTION
  659.         ANI     20H     ;ISOLATE (LDX,STX)/(LHLD,SHLD,LDA,STA) BIT
  660.         MOV     A,C     ;RESTORE INSTRUCTION
  661.         JNZ     LDS020  ;(LDX,STX)/(LHLD,SHLD,LDA,STA)?
  662.         ANI     08H     ;ISOLATE LDX/STX BIT
  663.         MOV     A,C     ;RESTORE INSTRUCTION
  664.         MVI     B,1     ;INSTRUCTION LENGTH IS 1 FOR BOTH
  665.         PUSH    PSW     ;SAVE DESIGNATOR BIT
  666.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  667.         POP     PSW     ;RETRIEVE DESIGNATOR BIT
  668.         LXI     B,LOWOP2        ;ASSUME STAX
  669.         JZ      LDS010  ;STAX/LDAX?
  670.     LXI    B,LOWOP2+4    ;LDAX, CHANGE MNEUMONIC POINTER
  671. LDS010: CALL    GETRP   ;DETERMINE REGISTER PAIR
  672.         JMP     LDS030  ;GO EXECUTE
  673. LDS020:    MVI    B,3    ;(LHLD,SHLD,LDA,STA), SET LENGTH TO 3 BYTES
  674.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  675.         MOV     A,C     ;RESTORE INSTRUCTION
  676.         ANI     18H     ;ISOLATE INSTRUCTION DESIGNATOR
  677.         RRC             ;SCALE FOR INDEXING
  678.         MOV     E,A     ;BUILD INDEX
  679.         MVI     D,0     ;
  680.         LXI     H,LOWOP2+8      ;GET BASE ADDRESS OF INSTRUCTION GROUP
  681.         DAD     D       ;ADD INDEX
  682.         MOV     B,H     ;POSITION FOR CALL
  683.         MOV     C,L     ;
  684.         LXI     D,'  '  ;SET REG TYPE TO NULL
  685.         CALL    MVNMNC  ;DISPLAY CODE
  686. LDS030: CALL    OPEXEC  ;EXECUTE INSTRUCTION
  687.         RET             ;
  688. ;
  689. ; INX DCX EXECUTION ROUTINE
  690. ;
  691. INXDCX: MOV     C,A     ;SAVE INSTRUCTION
  692.         MVI     B,1     ;THESE ARE ALL ONE BYTE
  693.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  694.         MOV     A,C     ;RESTORE INSTRUCTION
  695.         PUSH    PSW     ;SAVE IT AGAIN
  696.         ANI     08H     ;ISOLATE DESIGNATOR BIT
  697.         LXI     B,LOWOP3        ;ASSUME INX
  698.         JZ      INX010  ;INX/DCX?
  699.     LXI    B,LOWOP3+4    ;DCX, CHAINGE POINTER
  700. INX010: POP     PSW     ;GET INSTRUCTION BACK
  701.         CALL    GETRP   ;DETERMINE REG PAIR
  702.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  703.         RET             ;
  704. ;
  705. ; INR DCR EXECUTION ROUTINE
  706. ;
  707. INRDCR: MOV     C,A     ;SAVE INSTRUCTION
  708.         MVI     B,1     ;THESE ARE ALL ONE BYTE
  709.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  710.         MOV     A,C     ;RESTORE INSTRUCTION
  711.         STA     STKTMP  ;SAVE IT AGAIN
  712.         LXI     B,LOWOP4        ;ASSUME INR
  713.         ANI     01H     ;CHECK DESIGNATOR BIT
  714.         JZ      INR010  ;INR/DCR?
  715.     LXI    B,LOWOP5    ;DCR, CHANGE POINTER
  716. INR010: LDA     STKTMP  ;GET INSTRUCTION BACK
  717.         CALL    GETREG  ;DETERMINE REGISTER
  718.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  719.         RET             ;
  720. ;
  721. ; MVI EXECUTION ROUTINE
  722. ;
  723. MVIMM:    MOV     C,A     ;SAVE INSTRUCTION
  724.         MVI     B,2     ;THESE ARE ALL 2 BYTE INSTRUCTIONS
  725.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  726.         MOV     A,C     ;RESTORE INSTRUCTION
  727.         LXI     B,LOWOP6        ;SET POINTER MVI MNEUMONIC
  728.         CALL    GETREG  ;DETERMINE REGISTER
  729.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  730.         RET             ;
  731. ;
  732. ; RLC RRC RAL RAR DAA CMA STC CMC
  733. ; EXECUTION ROUTINE
  734. ;
  735. ROTATE: MOV     C,A     ;SAVE INSTRUCTION
  736.         MVI     B,1     ;THESE ARE ALL ONE BYTE INSTRUCTIONS
  737.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  738.         MOV     A,C     ;RESTORE INSTRUCTION
  739.         ANI     38H     ;ISOLATE DESIGNATOR BITS
  740.         RRC             ;SCALE FOR INDEXING
  741.         MOV     E,A     ;CONSTRUCT INDEX
  742.         MVI     D,0     ;
  743.         LXI     H,LOWOP7        ;GET BASE OF ADDRESS OF MNEUMONICS
  744.         DAD     D       ;ADD INDEX
  745.         MOV     C,L     ;POSITION ADDRESS FOR SUBROUTINE CALL
  746.         MOV     B,H     ;
  747.         LXI     D,'  '  ;SET REGISTER TO NULL
  748.         CALL    MVNMNC  ;DISPLAY OP CODE
  749.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  750.         RET             ;
  751. ;
  752. ; GET REGISTER ROUTINE
  753. ;
  754. GETREG: ANI     38H     ;ISOLATE REGISTER DESIGNATOR BITS
  755.         RRC             ;SCALE FOR INDEXING
  756.         RRC             ;
  757.         RRC             ;
  758.         MOV     E,A     ;CONSTRUCT INDEX WORD
  759.         MVI     D,0     ;
  760.         LXI     H,RGSTRS        ;GET BASE ADDRESS OF REGISTER CODES
  761.         DAD     D       ;ADD INDEX
  762.         MVI     E,' '   ;OTHER REGISTER IS NULL
  763.         MOV     D,M     ;GET THIS REGISTER
  764.         CALL    MVNMNC  ;DISPLAY OP CODE AND REGISTER
  765.         RET             ;
  766. LOWOP:  DB      'NOP '  ;NO-OP
  767. LOWOP1: DB      'LXI '  ;LOAD REGISTER PAIR IMMEDIATE(EXTENDED)
  768.         DB      'DAD '  ;DOUBLE LENGTH ADD
  769. LOWOP2: DB      'STAX'  ;STORE ACCUMULATOR INDIRECT THROUGH REG PAIR
  770.         DB      'LDAX'  ;LOAD ACCUMULATOR INDIRECT THROUGH REG PAIR
  771.         DB      'SHLD'  ;STORE HL DIRECT
  772.         DB      'LHLD'  ;LOAD HL DIRECT
  773.         DB      'STA '  ;STORE ACCUMULATOR DIRECT
  774.         DB      'LDA '  ;LOAD ACCUMULATOR DIRECT
  775. LOWOP3: DB      'INX '  ;INCREMENT REGISTER PAIR
  776.         DB      'DCX '  ;DECREMENT REGISTER PAIR
  777. LOWOP4: DB      'INR '  ;INCREMENT REGISTER
  778. LOWOP5: DB      'DCR '  ;DECREMENT REGISTER
  779. LOWOP6: DB      'MVI '  ;MOVE DATA IMMEDIATE TO REGISTER
  780. LOWOP7: DB      'RLC '  ;ROTATE LEFT THROUGH CARRY
  781.         DB      'RRC '  ;ROTATE RIGHT THROUGH CARRY
  782.         DB      'RAL '  ;ROTATE ARITHMETIC LEFT
  783.         DB      'RAR '  ;ROTATE ARITHMETIC RIGHT
  784.         DB      'DAA '  ;DECIMAL ADJUST ACCUMULATOR
  785.         DB      'CMA '  ;COMPLIMENT ACCUMULATOR
  786.         DB      'STC '  ;SET CARRY
  787.         DB      'CMC '  ;COMPLIMENT CARRY
  788. RGSTRS: DB      'BCDEHLMA'      ;REGISTER CODES
  789. REGPAR: DB      'B D H SP'      ;REGISTER PAIR CODES
  790. FLAGS:  DB      'NZZ NCC POPEP M '      ;STATUS FLAG CODES
  791. ;
  792. ;
  793. ;
  794. KEYBDI: PUSH    H       ;SAVE HL
  795.         LHLD    CPOSIT  ;GET CURSOE POSITION
  796. KEY005: IN      KSTAT  ;CHECK 3P+S STATUS
  797.         ANI     KBDRDY  ;LOOK FOR KEY BOARD READY
  798.         JNZ     KEY005  ;LOOP ON NO DATA AVAILABLE
  799.         IN      KEYBRD  ;GET DATA FROM ASCII KEYBOARD
  800.         ANI     7FH     ;STRIP OFF PARITY BIT
  801.         MOV     B,A     ;SAVE CHARACTER
  802.         CPI     ESC     ;CHECK FOR ESCAPE SEQUENCE
  803.         JNZ     KEY007  ;WAS IT?
  804.     LXI    SP,STACK    ;YES, RESET STACK POINTER
  805.         CALL    BMPLNE  ;SCROLL UP ONE LINE
  806.         JMP     VDM015  ;RESUME SCAN LOOP
  807. KEY007: CPI     CR      ;CHECK FOR CARRIAGE RETURN
  808.         JZ      KEY020  ;WAS IT
  809. KEY010:    MOV    M,A    ;NO, DISPLAY CHARACTER
  810.         INX     H       ;UPDATE CURSER
  811.         MOV     A,H     ;CHECK FOR VDM BUFFER OVERFLOW
  812.         CPI     TOS AND 0FFH     ;
  813.         JC      KEY030  ;
  814. KEY020: CALL    BMPLNE  ;SCROLL UP ON BUFFER FULL
  815.         LXI     H,LINE15        ;RESET CURSOR TO BEGINNING OF LAST LINE
  816. KEY030: MOV     A,B     ;RESTORE CHARATER RECEIVED FROM KEYBOARD
  817.         SHLD    CPOSIT  ;STORE UPDATED CURSOR
  818.         POP     H       ;RESTORE ORIGINAL CONTENTS OF HL
  819.         RET             ;
  820. ;
  821. ;
  822. ;
  823. BMPLNE: PUSH    H       ;SAVE HL
  824.         PUSH    D       ;SAVE DE
  825.         PUSH    B       ;SAVE BC
  826.         PUSH    PSW     ;SAVE PSW
  827.         LXI     H,MIDSCR        ;BUFFER ADDRESS TO MOVE OLD DATA TO
  828.         LXI     B,MIDSCR+LINE   ;BUFFER ADDRESS TO GET OLD DATA FROM
  829.         MVI     E,8     ;NUMBER OF LINES TO BE SCROLLED
  830. BMP010: PUSH    D       ;SAVE
  831.         LXI     D,64    ;NUMBER OF CHARACTERS PER LINE
  832.         CALL    SETLNE  ;SCROLL ONE LINE AT A TIME FROM THE TOP DOWN
  833.         POP     D       ;GET NUMBER OF LINES LEFT TO GO
  834.         DCR     E       ;COUNT OFF ONE MORE
  835.         JNZ     BMP010  ;DO UNTIL DONE
  836.         MVI     A,' '   ;STE TO SPACE OUT LAST LINE
  837.         MVI     D,64    ;BLANK OUT ALL CHARACTERS ON LAST LINE
  838.         LXI     H,LINE15        ;GET ADDRESS OF FIRST CHARACTER OF LAST 
  839. BMP020: MOV     M,A     ;BLANK IT OUT
  840.         INX     H       ;UPDATE POINTER
  841.         DCR     D       ;COUNT DOWN
  842.         JNZ     BMP020  ;DO WHILE NOT DONE
  843.         LXI     H,LINE15        ;RESET CURSOR
  844.         SHLD    CPOSIT  ;
  845.         POP     PSW     ;RESTORE ORIGINAL REGISTER CONTENTS
  846.         POP     B       ;
  847.         POP     D       ;
  848.         POP     H       ;
  849.         RET             ;
  850. ;
  851. ;
  852. ;
  853. BINARY: LDA     BINFLG  ;GET BINARY DISPLAY FLAG
  854.         CMA             ;TOGGLE IT
  855.         STA     BINFLG  ;PUT IT BACK
  856.         CALL    CLRSCR  ;RESET SCREEN
  857.         CALL    SETSCR  ;
  858.         RET             ;
  859. ;
  860. ;
  861. ;
  862. GTLMTS: CALL    BMPLNE  ;SCROLL UP
  863.         LXI     B,FROM  ;DISPLAY FROM MESSAGE
  864.         LXI     H,LINE15        ;
  865.         LXI     D,5     ;
  866.         CALL    SETLNE  ;
  867.         LXI     H,LINE15+5      ;
  868.         SHLD    CPOSIT  ;
  869.         CALL    GETADR  ;GET ONE HEX NUMBER OF UP TO 4 DIGITS
  870.         SHLD    BASE    ;THAT WAS THE BASE ADDRESS
  871.         CALL    BMPLNE  ;SCROLL UP
  872.         LXI     B,TO    ;DISPLAY TO MESSAGE
  873.         LXI     H,LINE15        ;
  874.         LXI     D,3     ;
  875.         CALL    SETLNE  ;
  876.         LXI     H,LINE15+3      ;
  877.         SHLD    CPOSIT  ;
  878.         CALL    GETADR  ;GET ONE HEX NUMBER
  879.         XCHG            ;MOVE TO DE
  880.         LHLD    BASE    ;GET BASE ADDRESS
  881.         CALL    BMPLNE  ;SCROLL UP
  882.         RET             ;
  883. ;
  884. ;
  885. ;
  886. DUMPME: CALL    GTLMTS  ;GET DUMP LIMITS
  887. DMP010: PUSH    D       ;SAVE LAST ADDRESS
  888.         CALL    DMEM16  ;DISPLAY 16 BYTES
  889.         POP     D       ;GET LAST ADDRESS
  890.         MOV     A,E     ;SEE IF LAST ADDRESS EXCEEDED
  891.         SUB     L       ;
  892.         MOV     A,D     ;
  893.         SBB     H       ;
  894.         JP      DMP010  ;CONTINUE DUMPING IF NOT
  895.         RET             ;
  896. ;
  897. ;
  898. ;
  899. GETBYT: MVI     E,2     ;GET TWO CHARACTERS FROM KEY BOARD
  900.     JMP    GTA005    ;GO AROUND NEXT ENTRY POINT
  901. GETADR:    MVI    E,4    ;GET 4 CHARACTERSFROM KEYBOARD
  902. GTA005:    LXI    H,0    ;START WITH ZERO
  903. GTA010:    CALL    KEYBDI    ;GET ACHARACTER FROM THE KEYBOARD
  904.         CPI     CR      ;CHECK FOR TERMINATOR
  905.         JZ      GTA020  ;EXIT ON END OF NUMBER
  906.         CALL    ASCHEX  ;CONVERT CHARACTER TO HEX DIGIT
  907.         MOV     C,A     ;POISITION FOR ADD
  908.         MVI     B,0     ;
  909.         DAD     H       ;MULTIPLY HL BY 16
  910.         DAD     H       ;
  911.         DAD     H       ;
  912.         DAD     H       ;
  913.         DAD     B       ;ADD LAST CHARACTER RECIEVED
  914.         DCR     E       ;COUNT OFF NUMBER OF DIGITS
  915.         JNZ     GTA010  ;DO UNTIL COUNT EXAUSTED OR CARRIAGE RETURN
  916. GTA020: RET             ;
  917. ;
  918. ;
  919. ;
  920. ASCHEX: SBI     '0'     ;SUBTRACT OFF ASCII BIAS
  921.         JM      ASC010  ;CHAR<0?
  922.         CPI     10      ;NO,
  923.         RC              ;DONE IF CHAR<=9
  924.         SBI     07H     ;ADJUST FOR ALPHA BIAS
  925.         CPI     LF      ;
  926.         JC      ASC010  ;
  927.         CPI     10H     ;CHAR>0FH?
  928.         RC              ;NO, RETURN
  929. ASC010: MVI     A,0     ;RETURN ZERO IF ILLEAGLE
  930.         RET             ;
  931. ;
  932. ;DUMP 16 BYTES TO TTY
  933. ;
  934. DMEM16: MOV     A,L     ;DISPLAY ADDRESS
  935.         CALL    HEXASC  ;
  936.         PUSH    B       ;
  937.         MOV     A,H     ;
  938.         CALL    HEXASC  ;
  939.         LXI     D,LINE15        ;
  940.         XCHG            ;
  941.         MOV     M,B     ;
  942.         INX     H       ;
  943.         MOV     M,C     ;
  944.         INX     H       ;
  945.         POP     B       ;
  946.         MOV     M,B     ;
  947.         INX     H       ;
  948.         MOV     M,C     ;
  949.         MVI     B,16    ;NUMBER OF BYTES TO DISPLAY
  950. DME010: PUSH    B       ;SAVE
  951.         INX     H       ;UPDATE ADDRESS
  952.         LDAX    D       ;GET BYTE FROM MEMORY
  953.         INX     D       ;UPDATE POINTER
  954.         CALL    HEXASC  ;CONVERT TO ASCII CHARACTERS AND DISPLAY
  955.         INX     H       ;
  956.         MOV     M,B     ;
  957.         INX     H       ;
  958.         MOV     M,C     ;
  959.         POP     B       ;
  960.         DCR     B       ;
  961.         JNZ     DME010  ;DO UNTIL ALL 16 DISPLAYED
  962.         CALL    BMPLNE  ;SCROLL UP
  963.         XCHG            ;
  964.         RET             ;
  965. ;
  966. ;CONVERT BYTE IN ACCUMULATOR TO ASCII DIGITS
  967. ;
  968. HEXASC: PUSH    D       ;SAVE DE
  969.         PUSH    H       ;SAVE HL
  970.         LXI     H,ASCII ;GET BASE ADDRESS OF ASCII CODE
  971.         MOV     B,A     ;SAVE DATA
  972.         ANI     0FH     ;DO LOWER HEX DIGIT FIRST
  973.         MOV     E,A     ;SET UP FOR INDEXING
  974.         MVI     D,0     ;
  975.         DAD     D       ;ADD INDEX
  976.         MOV     C,M     ;GET CHARACTER
  977.         MOV     A,B     ;RESTORE DATA
  978.         ANI     0F0H    ;DO UPPER HEX DIGIT
  979.         RRC             ;SCALE DOWN FOR INDEXING
  980.         RRC             ;
  981.         RRC             ;
  982.         RRC             ;
  983.         MOV     E,A     ;SET UP FOR INDEXING
  984.         LXI     H,ASCII ;GET BASE ADDRESS OF ASCII CODES AGAIN
  985.         DAD     D       ;ADD INDEX
  986.         MOV     B,M     ;GET CHARACTER
  987.         POP     H       ;RESTORE HL
  988.         POP     D       ;RESTORE DE
  989.         RET             ;
  990. ;
  991. ;LOAD REGISTERS FROM KEYBOARD ROUTINE
  992. ;
  993. LOADRG: CALL    KEYBDI  ;GET REGISTER IDENTIFIER
  994.         LXI     H,LDREGS        ;DETERMINE SELECTED REGISTER
  995.         MVI     D,6     ;6 POSSIBLE REGISTER PAIRS
  996.         MOV     B,A     ;SAVE REGISTER DESIGNATOR
  997. LOA010: MOV     A,M     ;GET ONE FROM MEMORY
  998.         CMP     B       ;CHECK AGAINST SELECTED REGISTER PAIR
  999.         JZ      LOA020  ;MATCH
  1000.         INX     H       ;NO, KEEP LOOKING
  1001.         DCR     D       ;
  1002.         JNZ     LOA010  ;
  1003.         RET             ;RETURN IF NOT FOUND
  1004. LOA020: MOV     A,D     ;GET INDEX NUMBER
  1005.         DCR     A       ;ADJUST
  1006.         RLC             ;SCALE
  1007.         MOV     E,A     ;SET UP INDEX
  1008.         MVI     D,0     ;
  1009.         PUSH    D       ;SAVE INDEX
  1010.         CALL    GETADR  ;GET A HEX NUMBER FROM KEYBOARD
  1011.         XCHG            ;RELOCATE NUMBER TO LESS CONVENIENT REGISTER
  1012.         POP     H       ;GET INDEX BACK
  1013.         MOV     A,L     ;MOVE TO ACCUMULATOR
  1014.         ANA     A       ;SET FLAGS
  1015.         JNZ     LOA030  ;IS IT THE PC REGISTER?
  1016.         PUSH    H       ;YES,
  1017.         LXI     B,PC    ;GET ADDRESS OF USER'S PC REG
  1018.         DAD     B       ;THIS IS REDUNDANT
  1019.         MOV     M,E     ;STORE DATA TO USER'S PC REGISTER
  1020.         INX     H       ;
  1021.         MOV     M,D     ;
  1022.         POP     H       ;
  1023. LOA030: LXI     B,PC1   ;STORE DATE TO USER REGISTER
  1024.         DAD     B       ;
  1025.         MOV     M,E     ;
  1026.         INX     H       ;
  1027.         MOV     M,D     ;
  1028.         CALL    BMPLNE  ;
  1029.         RET             ;
  1030. LDREGS: DB      'AHDBSP'        ;POSSIBLE REGISTER DESIGNATIONS
  1031. ;
  1032. ;STORE DATA TO MEMORY ROUTINE
  1033. ;
  1034. MEMSTR: CALL    GETADR  ;GET BEGINNING ADDRESS
  1035. MEM010: PUSH    H       ;SAVE IT
  1036.         LHLD    CPOSIT  ;GET CURSOR POSITION
  1037.         MVI     A,'-'   ;DISPLAY PROMPT
  1038.         MOV     M,A     ;
  1039.         INX     H       ;UPDATE CURSOR
  1040.         SHLD    CPOSIT  ;RESTORE UPDATED CURSOR
  1041.         CALL    GETBYT  ;GET A DATA BYTE
  1042.         MOV     A,E     ;GET NUMBER OF BYTES RECIEVED
  1043.         CPI     2       ;CHECK FOR NONE RECIEVED
  1044.         JNZ     MEM020  ;ANY DATA RECIEVED?
  1045.         POP     H       ;NO, RESTORE HL
  1046.         RET             ;GET OUT OF HERE
  1047. MEM020: MOV     A,L     ;MOVE DATA BYTE TO ACCUMULATOR
  1048.         POP     H       ;GET ADDRESS BACK
  1049.         MOV     M,A     ;STORE DATA TO MEMORY
  1050.         INX     H       ;UPDATE ADDRESS
  1051.         JMP     MEM010  ;CONTINUE
  1052. ;
  1053. ;CALL USER SUBROUTINE
  1054. ;
  1055. CALSUB: LHLD    CPOSIT  ;GET CURSOE POSITION
  1056.         MVI     A,'-'   ;DISPLAY PROMPT
  1057.         MOV     M,A     ;
  1058.         INX     H       ;UPDATE CURSOR POSITION
  1059.         SHLD    CPOSIT  ;RESTORE CURSOR
  1060.         MVI     A,0CDH  ;LOAD ACCUMULATOR WITH A CALL INSTRUCTION
  1061.         STA     INSTR   ;MOVE TO EXECUTION AREA
  1062.         CALL    GETADR  ;GET ADDRESS OF SUBROUTINE TO BE EXECUTED
  1063.         SHLD    INSTR+1 ;STORE ADDRESS TO EXECUTION AREA PLUS ONE
  1064.         CALL    BMPLNE  ;SCROLL UP
  1065.         CALL    OPEXEC  ;EXECUTE SUBROUTINE
  1066.         CALL    CLRSCR  ;CLEAR ANY GARBAGE FROM SCREEN
  1067.         CALL    SETSCR  ;SET UPSCREEN AGAIN
  1068.         RET             ;
  1069. ;
  1070. ;HIGH ORDER INSTRUCTION DECODE ROUTINE
  1071. ;
  1072. OPHIGH: MOV     E,A     ;SAVE INSTRUCTION
  1073.         ANI     07H     ;DETERMINE SUB CLASS
  1074.         RLC             ;SCALE FOR INDEX
  1075.         MOV     C,A     ;POSITION FOR INDEXING
  1076.         MVI     B,0     ;
  1077.         LXI     H,HOPTAB        ;GET HIGH ORDER INSTRUCTION TABLE BASE A
  1078.         DAD     B       ;ADD INDEX
  1079.         MOV     A,E     ;RESTORE INSTRUCTION
  1080.         MOV     E,M     ;GET ADDRESS OF INSTRUCTION ROUTINE
  1081.         INX     H       ;
  1082.         MOV     D,M     ;
  1083.         XCHG            ;MOVE TO HL
  1084.         PCHL            ;PASS CONTROL TO APPROPIATE ROUTINE
  1085. ;
  1086. HOPTAB: DW      RETURN  ;RETURN
  1087.         DW      PPINST     ;POP
  1088.         DW      JUMP    ;JUMP
  1089.         DW      MISC    ;MISC
  1090.         DW      CLINST    ;CALL
  1091.         DW      PSINST    ;PUSH
  1092.         DW      IMMEDT  ;IMMEDIATE
  1093.         DW      RESTRT  ;RESTART
  1094. ;
  1095. HIGHOP: DB      'R   '  ;CONDITIONAL RETURN
  1096. HIHOP1: DB      'POP '  ;POP
  1097.         DB      'RET '  ;UNCONDITIONAL ROUTINE
  1098.         DB      '*NOP'  ;UNIMPLEMENTED OP CODES
  1099.         DB      'PCHL'  ;INDIRECT JUMP
  1100.         DB      'SPHL'  ;LOAD STACK POINTER WITH HL
  1101. HIHOP2: DB      'J   '  ;CONDITIONAL JUMP
  1102. HIHOP3: DB      'JMP '  ;UNCONDITIONAL JUMP
  1103.         DB      '*NOP'  ;UNIMPLEMENTED OP CODE
  1104.         DB      'OUT '  ;OUTPUT
  1105.         DB      'IN  '  ;INPUT
  1106.         DB      'XTHL'  ;EXCHANGE HL AND TOP OF STACK
  1107.         DB      'XCHG'  ;EXCHANGE HL AND DE
  1108.         DB      'DI  '  ;DISABLE INTERRUPTS
  1109.         DB      'EI  '  ;ENABLE INTERRUPTS
  1110. HIHOP4: DB      'C   '  ;CONDITIONAL CALL
  1111. HIHOP5: DB      'PUSH'  ;PUSH
  1112.         DB      'CALL'  ;UNCONDITIONAL CALL
  1113.         DB      '*NOP'  ;UNIMPLEMENTED OP CODE
  1114. HIHOP6: DB      'ADI '  ;ADD IMMEDIATE
  1115.         DB      'ACI '  ;ADD IMMEDIATE WITH CARRY
  1116.         DB      'SUI '  ;SUBTRACT IMMEDIATE
  1117.         DB      'SBI '  ;SUBTRACT IMMEDIATE WITH BORROW
  1118.         DB      'ANI '  ;AND IMMEDIATE
  1119.         DB      'XRI '  ;EXCLUSIVE OR IMMEDIATE
  1120.         DB      'ORI '  ;OR IMMEDIATE
  1121.         DB      'CPI '  ;COMPARE IMMEDIATE
  1122. HIHOP7: DB      'RST '  ;RESTART
  1123. ;
  1124. ;DETERMINE CONDITIONAL FLAG ROUTINE
  1125. ;
  1126. GTFLAG: ANI     38H     ;ISOLATE CONDITION BITS
  1127.         PUSH    H       ;SAVE HL
  1128.         RRC             ;SCALE FOR INDEXING
  1129.         RRC             ;
  1130.         MVI     D,0     ;
  1131.         MOV     E,A     ;CONSTRUCT INDEX
  1132.         LXI     H,FLAGS ;GET BASE ADDRESS OF FLAG CODES
  1133.         DAD     D       ;ADD INDEX
  1134.         MOV     A,M     ;GET FLAG CODE
  1135.         STAX    B       ;STORE TO VDM BUFFER
  1136.         INX     B       ;UPDATE POINTER
  1137.         INX     H       ;UPDATE FLAG LOCATOR
  1138.         MOV     A,M     ;GET SECOND CHARACTER OF FLAG
  1139.         STAX    B       ;DISPLAY IT
  1140.         LXI     D,'  '  ;OTHER CHARACTERS ARE BLANK
  1141.         POP     B       ;GET OLD HL
  1142.         CALL    MVNMNC  ;DISPLAY OP CODE
  1143.         RET             ;
  1144. ;
  1145. ;TEST FLAG FOR CONDITION
  1146. ;
  1147. TSTFLG: ANI     38H     ;ISOLATE FLAG
  1148.         ORI     0C0H    ;ASSEMBLE A RETURN ON CONDITION INSTRUCTION
  1149.         STA     TST010  ;STORE FOR LATER EXECUTION
  1150.         LHLD    STSWRD  ;GET USER STATUS WORD
  1151.         PUSH    H       ;MOVE TO REAL FLAGS
  1152.         POP     PSW     ;
  1153.         MVI     A,1     ;A=1 MEANS CONDITION TRUE
  1154. TST010: RET             ;THIS IS REPLACED BY A CONDITIONAL RETURN
  1155.         MVI     A,0     ;CLEAR A IF CONDITION FALSE
  1156.         RET             ;
  1157. ;
  1158. ;CONDITIONAL JUMPS
  1159. ;
  1160. JUMP:   LHLD    PC      ;GET USER PROGRAM COUNTER
  1161.         PUSH    H       ;SAVE IT
  1162.         PUSH    PSW     ;SAVE PSW
  1163.         MVI     B,3     ;THIS IS 3 BYTES
  1164.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  1165.         POP     PSW     ;GET PSW BACK
  1166.         PUSH    PSW     ;SAVE IT AGAIN
  1167.         LXI     H,HIHOP2        ;ADDRESS OF MNEUMONIC
  1168.         LXI     B,HIHOP2+1      ;ADDRESS TO PUT FLAG INTO
  1169.         CALL    GTFLAG          ;WHAT CONDITION?
  1170.         POP     PSW             ;GET INSTRUCTION BACK
  1171.         CALL    TSTFLG          ;TEST CONDITION
  1172.         POP     H               ;GET PC AGAIN
  1173.         ANA     A               ;CHECK RESULT OF FLAG TEST
  1174.         RZ              ;RETURN IF RESULT WAS NEGATIVE
  1175.         INX     H       ;UPDATE PC
  1176.         MOV     A,M     ;GET ADDRESS TO JUMP TO
  1177.         STA     PC      ;AND STORE TO USER'S PROGRAM COUNTER
  1178.         INX     H       ;
  1179.         MOV     A,M     ;
  1180.         STA     PC+1    ;
  1181.         RET             ;
  1182. ;
  1183. ;THIS ROUTINE PROCESSES ALL IMMEDIATE MODE COMMANDS
  1184. ;
  1185. IMMEDT: MOV     C,A     ;SAVE INSTRUCTION
  1186.         MVI     B,2     ;ALL ARE 2 BYTES
  1187.         CALL    MVINST  ;MOVE INSTRUCTION TO EXECUTION AREA
  1188.         MOV     A,C     ;RSTORE INSTRUCTION
  1189.         ANI     38H     ;DETERMINE TYPE OF IMMEDIATE INSTRUCTION
  1190.         RRC             ;SCALE FOR INDEXING
  1191.         MOV     E,A     ;POSITION FOR INDEXING
  1192.         MVI     D,0     ;
  1193.         LXI     H,HIHOP6        ;GET BASE ADDRESS OF IMMEDIATE CODES
  1194.         DAD     D       ;ADD INDEX
  1195.         MOV     B,H     ;POSITION FOR SUBROUTINE CALL
  1196.         MOV     C,L     ;
  1197.         LXI     D,'  '  ;OTHER CHARACTERS ARE BLANK
  1198.         CALL    MVNMNC  ;DISPLAY MNEUMONIC
  1199.         CALL    OPEXEC  ;EXECUTE INSTRUCTION
  1200.         RET             ;
  1201. ;
  1202. ;MISCELANEOUS INSTRUCTIONS
  1203. ;
  1204. MISC:   PUSH    PSW     ;SAVE INSTRUCTION
  1205.         ANI     38H     ;DETERMINE TYPE
  1206.         RRC             ;
  1207.         MOV     E,A     ;
  1208.         MVI     D,0     ;
  1209.         LXI     H,HIHOP3        ;
  1210.         DAD     D       
  1211.         MOV     C,L     ;
  1212.         MOV     B,H     ;
  1213.         LXI     D,'  '  ;
  1214.         CALL    MVNMNC  ;DISPLAY CODE
  1215.         POP     PSW     ;GET INSTRUCTION
  1216.         CPI     0E3H    ;
  1217.         JNC     XSDE    ;
  1218.         CPI     0D3H    ;
  1219.         JNC     IO      ;
  1220.         CPI     0CBH    ;
  1221.         JNC     NOOP    ;
  1222.         MVI     B,3     ;
  1223.         CALL    MVINST  ;
  1224.         LHLD    PC      ;
  1225.         DCX     H       ;
  1226.         MOV     A,M     ;
  1227.         STA     PC+1    ;
  1228.         DCX     H       ;
  1229.         MOV     A,M     ;
  1230.         STA     PC      ;
  1231.         RET             ;
  1232. NOOP:   LXI     B,HIHOP5+8      ;
  1233.         LXI     D,'  '  ;
  1234.         CALL    MVNMNC  ;
  1235.         MVI     B,1     ;
  1236.         CALL    MVINST  ;
  1237.         RET             ;
  1238. IO:     MVI     B,2     ;
  1239.         CALL    MVINST  ;
  1240.         CALL    OPEXEC  ;
  1241.         RET             ;
  1242. XSDE:   MVI     B,1     ;
  1243.         CALL    MVINST  ;
  1244.         CALL    OPEXEC  ;
  1245.         RET             ;
  1246. ;
  1247. ;CONDITIONAL CALL ROUTINE
  1248. ;
  1249. CLINST: PUSH    PSW     ;
  1250.         MVI     B,3     ;
  1251.         CALL    MVINST  ;
  1252.         POP     PSW     ;
  1253.         PUSH    PSW     ;
  1254.         LXI     H,HIHOP4        ;
  1255.         LXI     B,HIHOP4+1      ;
  1256.         CALL    GTFLAG  ;
  1257.         POP     PSW     ;
  1258.         CALL    TSTFLG  ;
  1259.         ANA     A       ;
  1260.         RZ              
  1261. CAL010: LHLD    PC      ;
  1262.         XCHG            ;
  1263.         LHLD    STKPTR      ;
  1264.         DCX     H       ;
  1265.         MOV     M,D     ;
  1266.         DCX     H       ;
  1267.         MOV     M,E     ;
  1268.         SHLD    STKPTR      ;
  1269.         LHLD    PC      ;
  1270.         DCX     H       ;
  1271.         MOV     A,M     ;
  1272.         STA     PC+1    ;
  1273.         DCX     H       ;
  1274.         MOV     A,M     ;
  1275.         STA     PC      ;
  1276.         RET             ;
  1277. ;
  1278. ;CONDITIONAL RETURN
  1279. ;
  1280. RETURN: PUSH    PSW     ;
  1281.         MVI     B,1     ;
  1282.         CALL    MVINST  ;
  1283.         POP     PSW     ;
  1284.         PUSH    PSW     ;
  1285.         LXI     H,HIGHOP        ;
  1286.         LXI     B,HIGHOP+1      ;
  1287.         CALL    GTFLAG  ;
  1288.         POP     PSW     ;
  1289.         CALL    TSTFLG  ;
  1290.         ANA     A       ;
  1291.         RZ              ;
  1292. RET010: LHLD    STKPTR      ;
  1293.         MOV     A,M     ;
  1294.         STA     PC      ;
  1295.         INX     H       ;
  1296.         MOV     A,M     ;
  1297.         STA     PC+1    ;
  1298.         INX     H       ;
  1299.         SHLD    STKPTR      ;
  1300.         RET             ;
  1301. ;
  1302. ;MISCELAEOUS STACK INSRUCTIONS
  1303. ;
  1304. STKWRD: DB      ' B   D   H   PSW'      ;
  1305. ;
  1306. PPINST: PUSH    PSW     ;
  1307.         ANI     08H     ;
  1308.         JNZ     NOTPOP  ;
  1309.         LXI     B,HIHOP1        ;
  1310. POP010: LXI     D,4     ;
  1311.         LXI     H,INSTA ;
  1312.         CALL    SETLNE  ;
  1313.         POP     PSW     ;
  1314.         PUSH    PSW     ;
  1315.         ANI     '0'     ;
  1316.         RRC             ;
  1317.         RRC             ;
  1318.         MOV     C,A     ;
  1319.         MVI     B,0     ;
  1320.         LXI     H,STKWRD        ;
  1321.         DAD     B       ;
  1322.         MOV     B,H     ;
  1323.         MOV     C,L     ;
  1324.         LXI     H,INSTA+4       ;
  1325.         LXI     D,4     ;
  1326.         CALL    SETLNE  ;
  1327.         POP     PSW     ;
  1328.         MVI     B,1     ;
  1329.         CALL    MVINST  ;
  1330.         CALL    OPEXEC  ;
  1331.         RET             ;
  1332. NOTPOP: POP     PSW     ;
  1333.         CPI     0C9H    ;
  1334.         JNZ     NOTRET  ;
  1335.         MVI     B,1     ;
  1336.         CALL    MVINST  ;
  1337.         LXI     B,HIHOP1+4      ;
  1338.         LXI     D,'  '  ;
  1339.         CALL    MVNMNC  ;
  1340.         JMP     RET010  ;
  1341. NOTRET: CPI     0F9H    ;
  1342.         JNZ     NTSPHL  ;
  1343.         MVI     B,1     ;
  1344.         CALL    MVINST  ;
  1345.         LXI     B,HIHOP1+16     ;
  1346.         LXI     D,'  '  ;
  1347.         CALL    MVNMNC  ;
  1348.         LHLD    HL      ;
  1349.         SHLD    STKPTR      ;
  1350.         RET             ;
  1351. NTSPHL: CPI     0E9H    ;
  1352.         JNZ     NOOP    ;
  1353.         MVI     B,1     ;
  1354.         CALL    MVINST  ;
  1355.         LXI     B,HIHOP1+12     ;
  1356.         LXI     D,'  '  ;
  1357.         CALL    MVNMNC  ;
  1358.         LXI     H,HL    ;
  1359.         MOV     A,M     ;
  1360.         STA     PC      ;
  1361.         INX     H       ;
  1362.         MOV     A,M     ;
  1363.         STA     PC+1    ;
  1364.         RET             ;
  1365. ;
  1366. ;PUSH AND UNCONDITIONAL CALL
  1367. ;
  1368. PSINST: PUSH    PSW     ;
  1369.         ANI     08H     ;
  1370.         JNZ     CALLUN  ;
  1371.         LXI     B,HIHOP5        ;
  1372.         JMP     POP010  ;
  1373. CALLUN: POP     PSW     ;
  1374.         CPI     0CDH    ;
  1375.         JNZ     NOOP    ;
  1376.         LHLD    PC      ;
  1377.         PUSH    H       ;
  1378.         MVI     B,3     ;
  1379.         CALL    MVINST  ;
  1380.         LXI     B,HIHOP5+4      ;
  1381.         LXI     D,'  '  ;
  1382.         LXI     H,INSTA ;
  1383.         CALL    MVNMNC  ;
  1384.         POP     B       ;
  1385.         JMP     CAL010  ;
  1386. ;
  1387. ;RESTARTS
  1388. ;
  1389. RESTRT: PUSH    PSW     ;
  1390.     MVI    B,1    ;
  1391.     POP    PSW    ;
  1392.         PUSH    PSW     ;
  1393.         ANI     38H     ;
  1394.         RRC             ;
  1395.         RRC             ;
  1396.         RRC             ;
  1397.         CALL    HEXASC  ;
  1398.         MOV     D,C     ;
  1399.         MVI     E,' '   ;
  1400.         LXI     B,HIHOP7        ;
  1401.         CALL    MVNMNC  ;
  1402.         LHLD    PC      ;
  1403.         XCHG            ;
  1404.         LHLD    STKPTR      ;
  1405.         DCX     H       ;
  1406.         MOV     M,D     ;
  1407.         DCX     H       ;
  1408.         MOV     M,E     ;
  1409.         SHLD    STKPTR      ;
  1410.         POP     PSW     ;
  1411.         ANI     38H     ;
  1412.         MOV     L,A     ;
  1413.         MVI     H,0     ;
  1414.         SHLD    PC      ;
  1415.         RET             ;
  1416. ;
  1417. ;THE GO ROUTINE CONTROLS SIMULATED EXECUTION OF USER PROGRAMS
  1418. ;
  1419. GO:     LHLD    CPOSIT  ;
  1420.         MVI     A,'-'   ;
  1421.         MOV     M,A     ;
  1422.         INX     H       ;
  1423.         SHLD    CPOSIT  ;
  1424.         CALL    GETADR  ;
  1425.         SHLD    PC      ;
  1426.         CALL    BMPLNE  ;
  1427.         LXI     B,STPADR        ;
  1428.         LXI     D,8     ;
  1429.         LXI     H,LINE15        ;
  1430.         CALL    SETLNE  ;
  1431.         LXI     H,LINE15+8      ;
  1432.         SHLD    CPOSIT  ;
  1433.         CALL    GETADR  ;
  1434.         CALL    BMPLNE  ;
  1435.         XCHG            ;
  1436. GO010:  LHLD    PC      ;
  1437.         MOV     A,D     ;
  1438.         SUB     H       ;
  1439.         JNZ     GO020   ;
  1440.         MOV     A,E     ;
  1441.         SUB     L       ;
  1442.         RZ              ;
  1443. GO020:  PUSH    D       ;
  1444.         PUSH    H       ;
  1445.         LHLD    INSTSP  ;
  1446. GO030:  DCX     H       ;
  1447.         MVI     D,10H   ;
  1448. GO040:  DCR     D       ;
  1449.         JNZ     GO040   ;
  1450.         MOV     A,H     ;
  1451.         ANA     A       ;
  1452.         JNZ     GO030   ;
  1453.         CALL    STEP    ;
  1454.         CALL    DSREGS  ;
  1455.         POP     H       ;
  1456.         POP     D       ;
  1457.         IN      KSTAT  ;
  1458.         ANI     KBDRDY  ;
  1459.         RZ         ;REPLACE WITH RNZ FOR BOARDS WITH INVERTED I/O STATUS
  1460.         JMP     GO010   ;
  1461. STPADR: DB      'STOP AT-'      ;
  1462. ;
  1463. ;THIS ROUTINE READS INTEL FORMAT TAPES
  1464. ;
  1465. READTP: CALL    BMPLNE  ;
  1466.         CALL    TAPEIN  ;
  1467.         MOV     A,C     ;
  1468.         RZ              ;
  1469.         MVI     B,0     ;
  1470.         LXI     D,16    ;
  1471.         SUI     10H     ;
  1472.         MOV     C,A     ;
  1473.         LXI     H,ERRMES        ;
  1474.         DAD     B       ;
  1475.         MOV     B,H     ;
  1476.         MOV     C,L     ;
  1477.         LHLD    CPOSIT  ;
  1478.         CALL    BMPLNE  ;
  1479.         CALL    SETLNE  ;
  1480.         CALL    BMPLNE  ;
  1481.         RET             ;
  1482. ;
  1483. ;
  1484. ;
  1485. ;
  1486. TAPEIN: MVI     C,0     ;
  1487.         MVI     A,0FFH  ;
  1488.         OUT     SWTCHS  ;
  1489. BBLK:   CALL    INPUT   ;
  1490.         CPI     3AH     ;
  1491.         JNZ     BBLK    ;
  1492.     MVI    B,0    ;
  1493.         CALL    RDBYTE  ;
  1494.         MOV     D,A     ;
  1495.         CALL    RDBYTE  ;
  1496.         MOV     H,A     ;
  1497.         CALL    RDBYTE  ;
  1498.         MOV     L,A     ;
  1499.     CALL    RDBYTE    ;
  1500.         MOV     E,D     ;
  1501.         INR     E       ;
  1502. LD10:   DCR     E       ;
  1503.         JZ      LD20    ;
  1504.         MOV     A,L     ;
  1505.         CMA             ;
  1506.         OUT     SWTCHS  ;
  1507.         CALL    RDBYTE  ;
  1508.         MOV     M,A     ;
  1509.     CMP    M    ;
  1510.     INX    H    ;
  1511.     JZ    LD10    ;
  1512.     MVI    C,20H    ;
  1513.     RET        ;
  1514. LD20:   MOV     A,H     ;
  1515.         CMA             ;
  1516.         OUT     SWTCHS  ;
  1517.         CALL    RDBYTE  ;
  1518.         MOV     A,B     ;
  1519.         ORA     A       ;
  1520.         JZ      NBLK    ;
  1521.         MVI     C,10H   ;
  1522.         RET             ;
  1523. NBLK:   MOV     A,D     ;
  1524.         ORA     A       ;
  1525.         JNZ     BBLK    ;
  1526.         RET             ;
  1527. ;
  1528. ;
  1529. ;
  1530. RDBYTE:    PUSH    D    ;SAVE LENGTH
  1531.     CALL    INDIGT    ;GET 1 HEX DIGIT FROM TAPE
  1532.     ADD    A    ;MULTIPLY BY 16
  1533.     ADD    A    ;
  1534.     ADD    A    ;
  1535.     ADD    A    ;
  1536.     MOV    D,A    ;SAVE MSD
  1537.     CALL    INDIGT    ;GET NEXT HEX DIGIT FROM TAPE
  1538.     ORA    D    ;COMBINE HEX DIGITS TO FORM BYTE
  1539.     MOV    D,A    ;SAVE BYTE WHILE DOING CHKSUM
  1540.     ADD    B    ;ADD CHKSUM TO THE NEW BYTE
  1541.     MOV    B,A    ;REPLACE OLD CHKSUM WITH NEW
  1542.     MOV    A,D    ;GET NEW BYTE BACK
  1543.     POP    D    ;RESTORE LENGTH
  1544.     RET
  1545. ;
  1546. ;
  1547. ;
  1548. INDIGT:    CALL    INPUT    ;READ A FRAME FROM TAPE
  1549.     CPI    '9'+1    ;INSPECT DATA
  1550.     JM    IND010    ;OK IF DATA < 10
  1551.     ADI    9    ;ELSE ADJUST FOR ASCII BIAS
  1552. IND010:    ANI    0FH    ;REDUCE MOD 16
  1553.     RET        ;
  1554. ;
  1555. ;
  1556. INPUT:    IN    RSTAT    ;GET READER STATUS FROM 3P+S
  1557.         ANI     RDRRDY  ;TURN OFF NON READER BITS
  1558.     JNZ    INPUT    ;LOOP UNTIL DATA AVAILABLE
  1559.     IN    READER    ;GET DATA
  1560.     ANI    7FH    ;CLEAR PARITY BIT
  1561.         RET             ;
  1562. ;
  1563. ;TAPE READER ROUTINE ERROR MESSAGES
  1564. ;
  1565. ERRMES: DB      'CHECK SUM ERROR '
  1566.     DB    'MEMORY FAILURE  '
  1567. ;
  1568. ;THIS ROUTINE ZEROES A BLOCK OF MEMORY
  1569. ;
  1570. ZERMEM: CALL    GTLMTS  ;
  1571. ZER010: MVI     A,0     ;
  1572.         MOV     M,A     ;
  1573.         INX     H       ;
  1574.         MOV     A,D     ;
  1575.         SUB H           ;
  1576.         JNZ     ZER010  ;
  1577.         MOV     A,E     ;
  1578.         SUB     L       ;
  1579.         JNZ     ZER010  ;
  1580.         RET             ;
  1581. ;
  1582. ;
  1583. ;
  1584. ISPEED: CALL    KEYBDI  ;
  1585.         CALL    ASCHEX  ;
  1586.         ADI     01H     ;
  1587.         MOV     H,A     ;
  1588.         MVI     L,0     ;
  1589.         MVI     A,10H   ;
  1590.         SUB     H       ;
  1591.         MOV     H,A     ;
  1592.         SHLD    INSTSP  ;
  1593.         CALL    BMPLNE  ;
  1594.         RET             ;
  1595. INSTSP: DW      0400H   ;
  1596. ;
  1597. ;
  1598. ;
  1599.         END
  1600.