home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / DRIPAK.ZIP / CPM_3-0 / SOURCES / PRS1ASM.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  20KB  |  1,075 lines

  1. ;    CP/M DEBUGGER DISASSEMBLER/ASSEMBLER MODULE
  2.     TITLE    'SYMBOLIC INTERACTIVE DEBUGGER (ASMOD) 12/16/77'
  3. ;
  4. ;    COPYRIGHT (C) 1976, 1977
  5. ;    DIGITAL RESEARCH
  6. ;    BOX 579 PACIFIC GROVE, CA
  7. ;    93950
  8. ;
  9. FALSE    EQU    0        ;VALUE OF "FALSE"
  10. TRUE    EQU    NOT FALSE    ;VALUE OF "TRUE"
  11. ISIS2    EQU    FALSE        ;TRUE IF ASSEMBLING FOR "IS"
  12. DEBUG    EQU    FALSE        ;TRUE IF CHECK-OUT TIME
  13. RELOC    EQU    TRUE        ;TRUE IF GENERATING RELOC IMAGE
  14. ;
  15.     IF    DEBUG
  16.     ORG    1000H        ;IN LOW MEMORY FOR DEBUG
  17.     ELSE
  18.     IF    ISIS2
  19.     ORG    0E500H
  20.     ELSE
  21.     IF    RELOC
  22.     ORG    0000H        ;READY FOR RELOCATION
  23.     ELSE
  24.     ORG    0D000H        ;DEBUG IN 64K
  25.     ENDIF
  26.     ENDIF
  27.     ENDIF
  28. ;
  29. JLOC1    EQU    0005H        ;BDOS JUMP LOCATION
  30. ;
  31. ;
  32. ;    ENTRY POINTS FOR DEBUGGING MONITOR
  33. DEMON    EQU    $+680H
  34. BEGIN    EQU    DEMON+03H    ;BEGINNING OF DEBUGGING MONITOR
  35. GETBUFF    EQU    DEMON+9H    ;READ BUFFER
  36. GNC    EQU    DEMON+0CH
  37. PCHAR    EQU    DEMON+0FH    ;PRINT CHARACTER IN REG A
  38. PBYTE    EQU    DEMON+12H    ;PRINT BYTE
  39. PADDX    EQU    DEMON+15H    ;PRINT ADDRESS IN REG D,E
  40. SCANEXP    EQU    DEMON+18H    ;SCAN 0,1, OR 2 EXPRESSIONS
  41. BREAK    EQU    DEMON+1EH    ;CHECK FOR BREAK AT CONSOLE
  42. PRLABEL    EQU    DEMON+21H    ;PRINT SYMBOLIC LABEL
  43. ;
  44. ;
  45. CI    EQU    GNC        ;SYNONYM FOR GNC
  46. ;
  47. CR    EQU    0DH
  48. LF    EQU    0AH
  49. TAB    EQU    09H
  50. ;
  51. MODLOC:    ;MODULE LOCATION
  52.     JMP    BEGIN    ;ADDRESS FIELD IS ALTERED AT "BEGIN"
  53.     DB    0,0,0    ;FILLER (USED IN SYMBOL TABLE)
  54.     JMP    DISENT
  55.     JMP    ASMEN    ;ENTRY POINT FOR ASSEMBLER
  56. PC:    DS    2    ;CURRENT FAKED PC DURING DISASSEMBLY
  57. MPC:    DS    2    ;MAX VALUE FOR PC (STOP ADDRESS)
  58. PAGM:    DS    1    ;PAGE MODE IF NON ZERO
  59. TPC:    DS    2    ;TEMPORARY PC FOR ASSEMBLER RESTORE ON ERROR
  60. OLDSP:    DS    2    ;ENTRY SP VALUE
  61. ;
  62. ;
  63. CO:    ;PRINT CHARACTER IN REGISTER C
  64.     PUSH    PSW
  65.     MOV    A,C        ;PCHAR EXPECTS VALUE IN C
  66.     CALL    PCHAR        ;TO PRINT THE CHARACTER
  67.     POP    PSW
  68.     RET
  69. ;
  70. ;
  71. DELIM:    ;CHECK FOR DELIMITER
  72.     CPI    ' '
  73.     RZ
  74.     CPI    TAB
  75.     RZ
  76.     CPI    ','
  77.     RZ
  78.     CPI    CR
  79.     RZ
  80.     CPI    7FH
  81.     JZ    ASMEN    ;RESTART CURRENT LINE
  82.     RET
  83. ;
  84. CRLF:    ;RETURN AND LINE FEED
  85.     MVI    C,CR
  86.     CALL    CO
  87.     MVI    C,LF
  88.     CALL    CO
  89.     RET
  90. ;
  91. SCAN:    ;FILL OPCODE WITH CHARACTERS
  92. ;
  93. SC1:    CALL    CI
  94. SCAN0:    ;ENTER HERE IF CHARACTER SCANNED
  95.     CPI    CR
  96.     JZ    ERR
  97.     CALL    DELIM
  98.     JZ    SC1
  99. ;
  100. ;    CLEAR BUFFER
  101.     MVI    C,4
  102.     LXI    H,OPCODE
  103. SC0:    MVI    M,' '
  104.     INX    H
  105.     DCR    C
  106.     JNZ    SC0
  107. ;
  108. ;    GARBAGE REMOVED AT BEGINNING OF SCAN
  109.     MVI    C,5
  110.     LXI    H,OPCODE
  111. SC2:    MOV    M,A    ;STORE CHARACTER
  112.     CALL    CI
  113.     CALL    DELIM
  114.     JZ    SC3
  115.     INX    H
  116.     DCR    C
  117.     JZ    ERR    ;TOO LONG
  118.     JMP    SC2
  119. ;
  120. SC3:    ;END OF CURRENT SCAN, COMPARE FOR EMPTY
  121.     LDA    OPCODE
  122.     CPI    ' '
  123.     RET
  124. ;
  125. HEX:    ;CONVERT ACCUMULATOR TO HEXADECIMAL
  126.     SUI    '0'
  127.     CPI    10
  128.     RC        ;'0' - '9'
  129.     ADI    ('0'-'A'+10) AND 0FFH
  130.     CPI    16
  131.     RC
  132.     JMP    ERR
  133. ;
  134. GADDR:    ;GET ADDRESS VALUE TO B (HIGH ORDER) AND C (LOW) WITH COPY OF C IN A
  135.     CALL    SCANEXP    ;READ 1 EXPRESSION
  136.     DCR    A    ;GOES TO ZERO
  137.     JNZ    ERR    ;? IF NOT A SINGLE EXPRESSION
  138.     XCHG        ;ADDRESS OF EXPRESSION TO HL
  139.     MOV    C,M    ;LOW BYTE
  140.     INX    H
  141.     MOV    B,M    ;HIGH BYTE
  142.     MOV    A,C    ;COPY OF LOW BYTE TO A
  143.     DCR    B
  144.     INR    B    ;SETS ZERO FLAG IF B IS ZERO
  145.     RET
  146. ;
  147. GBYTE:    ;GET BYTE VALUE TO ACCUMULATOR AND C, CHECK FOR HIGH ORDER ZERO
  148.     CALL    GADDR
  149.     JNZ    ERR
  150.     RET
  151. ;
  152. ;
  153. ;    ************************************************************
  154. ;    ********* ASSEMBLER MODULE STARTS HERE *********************
  155. ;    ************************************************************
  156. ;
  157. ADJ:    ;MOVE REGISTER INDICATOR TO MIDDLE FIELD OF CODE
  158.     RAL
  159.     RAL
  160.     RAL
  161.     ANI    111000B
  162.     RET
  163. ;
  164. ADJ4:    ;MOVE TO LEFT BY 4 AND MASK
  165.     RAL
  166.     RAL
  167.     RAL
  168.     RAL
  169.     ANI    110000B
  170.     RET
  171. ;
  172. SEAR2:    ;SAME AS SEAR, EXCEPT 2 CHARACTER MATCH
  173. ;    H,L ADDRESS TABLE TO MATCH ON
  174.     XCHG
  175.     LHLD    OPCODE    ;2ND BYTE IN D, 1ST BYTE IN E
  176.     XCHG        ;H,L ADDRESS TABLE
  177. SEA0:    MOV    A,E    ;GET 1ST BYTE
  178.     CMP    M    ;MATCH?
  179.     JNZ    SEA1    ;TO ADDRESS NEXT ELT
  180.     INX    H    ;NEXT TO MATCH
  181.     MOV    A,D    ;2ND CHAR
  182.     CMP    M
  183.     RZ        ;MATCH AT CURRENT ENTRY
  184.     DCX    H
  185. SEA1:    DCX    H
  186.     DCX    H    ;ADDRESSES NEXT ELEMENT
  187.     DCR    C
  188.     JNZ    SEA0    ;FOR ANOTHER COMPARE
  189. ;
  190. ;    NO MATCH IN TABLE, RETURN WITH NON-ZERO VALUE
  191.     DCR    C
  192.     RET
  193. ;
  194. ;
  195. SEAR:    ;SEARCH FOR MATCH IN OPCODE TABLE, LENGTH OF TABLE IN REG-C
  196. ;    D,E CONTAINS ADDRESS OF BINARY EQUIVALENT OF OPCODE
  197. ;    H,L ADDRESS FOUR CHARACTER OPCODE TO MATCH
  198. ;    OPCODE CONTAINS FOUR BYTE OPCODE TYPED AT CONSOLE
  199. ;    RETURNS WITH ZERO VALUE IF OPCOE FOUND, WITH D,E
  200. ;    ADDRESSING PROPER BYTE, NON-ZERO IF NOT FOUND.
  201.     MVI    B,4    ;4 CHARACTER MATCH
  202. ;
  203.     PUSH    D    ;SAVE THE CURRENT BYTE VALUE LOCATION
  204.     LXI    D,OPCODE    ;ADDRESS CHARACTERS TYPED
  205. SE1:    LDAX    D    ;POINT TO FIRST BYTE TO MATCH
  206.     CMP    M    ;SAME CHARACTER AS TABLE?
  207.     JNZ    SE2    ;NO, SKIP TO NXT TABLE ENTRY
  208.     INX    H    ;YES, LOOK AT NEXT CHARACTER
  209.     INX    D    ;MOVE TO NEXT CHARACTER TYPED
  210.     DCR    B    ;DECREMENT CHARACTER COUNT
  211.     JNZ    SE1    ;MORE TO MATCH?
  212. ;
  213. ;    COMPLETE MATCH, RETURN WITH D,E ADDRESSING BYTE VALUE
  214.     POP    D
  215.     RET
  216. ;
  217. ;    MISMATCH, FINISH COUNT
  218. SE2:    INX    H
  219.     DCR    B
  220.     JNZ    SE2
  221. ;
  222. ;    H,L AT END OF FOUR BYTE AREA, MOVE BACK 8
  223.     LXI    D,-8
  224.     DAD    D    ;H,L READY FOR NXT MATCH
  225. ;
  226.     POP    D    ;RESTORE BYTE POINTER
  227.     INX    D    ;MOVE TO NEXT IN CASE MATCH OK
  228.     DCR    C    ;MORE OPCODES TO MATCH?
  229.     JNZ    SEAR    ;LOOK FOR MORE
  230. ;
  231. ;    NO MATCH FOUND IN TABLE, SET NON-ZERO VALUE AND RETURN
  232.     DCR    C
  233.     RET
  234. ;
  235. ;
  236. GETREG:    ;SCAN FOR SIMPLE REGISTER REFERENCE
  237.     PUSH    B
  238.     CALL    SCAN
  239.     JZ    ERR
  240.     MVI    C,8    ;8 REGISTERS
  241.     LXI    H,SREG    ;SIMPLE REGISTERS
  242.     CALL    SEAR2    ;LOOK FOR 2 CHAR MATCH
  243.     JNZ    ERR
  244.     DCR    C
  245.     MOV    A,C
  246.     POP    B
  247.     RET
  248. ;
  249. GETD:    ;GET DOUBLE PRECISION REGISTER
  250.     PUSH    B
  251.     CALL    SCAN
  252.     JZ    ERR
  253.     MVI    C,5
  254.     LXI    H,DREG
  255.     CALL    SEAR
  256.     JNZ    ERR
  257.     DCR    C
  258.     MOV    A,C
  259.     POP    B
  260.     RET
  261. ;
  262. GETDR:    ;GET DOUBLE REGISTER (BDHSP)
  263.     CALL    GETD
  264.     CPI    4    ;PSW?
  265.     JZ    ERR
  266.     RET
  267. ;
  268. GETPR:    ;GET PUSH/POP REGISTER (BDH OR PSW)
  269.     CALL    GETD
  270.     CPI    3
  271.     JZ    ERR
  272.     CPI    4
  273.     RNZ
  274.     DCR    A    ;PSW MUST BE ADJUSTED
  275.     RET
  276. ;
  277. GCON:    ;GET CONDITION CODE
  278. ;    BUFFER IS SCANNED, MOVE LEFT BEFORE COMPARE
  279.     LXI    H,OPCODE
  280.     LXI    D,OPCODE+1
  281.     MVI    C,2    ;MOVE TWO CHARACTERS
  282. MOP:    LDAX    D    ;LOAD CHARACTER TO MOVE
  283.     MOV    M,A    ;MOVE LEFT
  284.     INX    H    ;NEXT DESTINATION
  285.     INX    D    ;NEXT SOURCE
  286.     DCR    C
  287.     JNZ    MOP
  288. ;
  289. ;    MUST BE BLANK AT END
  290.     LDAX    D
  291.     CPI    ' '
  292.     JNZ    ERR
  293.     MOV    M,A
  294. ;
  295. ;    NOW READY TO DO THE COMPARE
  296.     LXI    H,CREG
  297.     MVI    C,8
  298.     CALL    SEAR2
  299.     JNZ    ERR
  300.     DCR    C
  301.     MOV    A,C
  302.     CALL    ADJ    ;MOVE TO BITS 3,4,5 OF BYTE (LSB = 0)
  303.     RET
  304. ;
  305. GCONA:    ;GET CONDITION CODE TO REGISTER A, DOUBLE ADDRESS TO B,C
  306.     CALL    GCON    ;CONDITION CODE TO A
  307.     PUSH    PSW
  308.     CALL    GADDR    ;VALUE TO B,C
  309.     POP    PSW
  310. ;    INCLUDE HIGH ORDER 11'S FOR J AND C OPCODES
  311.     ORI    11000000B
  312.     RET
  313. ;
  314. SETMD:    ;SET MEMORY AT LOCATION PC TO VALUE ADDRESSED BY D
  315.     LDAX    D    ;VALUE TO ACCUM
  316. ;
  317. SETM:    ;SET MEMORY AT LOCATION PC TO VALUE IN ACCUM, INC PC
  318.     LHLD    TPC
  319.     MOV    M,A    ;STORE AT PC
  320.     INX    H    ;PC=PC+1
  321.     SHLD    TPC
  322.     RET
  323. ;
  324. ;
  325. ;
  326. GETOP:    ;PROCESS NEXT OPCODE
  327.     CALL    CI
  328.     CPI    CR
  329.     JZ    GOBACK    ;RETURN IF SIMPLE INPUT
  330.     CPI    '.'    ;ALTERNATE RETURN IS .
  331.     JZ    GOBACK
  332.     CALL    SCAN0
  333.     JZ    ERR
  334. ;
  335. CHK0:    ;CHECK FOR OPCODES WITH NO OPERANDS
  336.     MVI    C,17    ;LENGTH OF GROUP-0
  337.     LXI    H,ETAB1    ;END OF GROUP-0
  338.     LXI    D,TABLE    ;FIRST BYTE VALUE
  339.     CALL    SEAR    ;LOOK FOR MATCH
  340.     JNZ    CHK1    ;NO MATCH, CHECK FOR GROUP-1
  341. ;
  342. ;    MATCHED OPCODE, D,E ADDRESS BYTE VALUE
  343.     JMP    SETMD    ;SET MEMORY AT PC AND INC PC
  344. ;
  345. ;    CHECK GROUP-1 VALUES
  346. CHK1:    MVI    C,10    ;LENGTH OF GROUP-1
  347.     LXI    H,ETAB2
  348.     CALL    SEAR    ;D,E REMAIN SET
  349.     JNZ    CHK2    ;NO MATCH, CHECK NEXT GROUP
  350. ;
  351. ;    MATCH FOUND, SET BYTE AND GET BYTE OPERAND
  352.     CALL    SETMD
  353.     CALL    GBYTE    ;GETS BYTE VALUE TO ACCUMULATOR
  354.     JMP    SETM    ;PUTS BYTE VALUE TO MEMORY AT PC
  355. ;
  356. ;    CHECK GROUP-2 OPCODES, REQUIRE DOUBLE BYTE OPERAND
  357. CHK2:    MVI    C,6
  358.     LXI    H,ETAB3
  359.     CALL    SEAR
  360.     JNZ    CHK3    ;NO MATCH
  361. ;
  362. ;    FOUND MATCH, GET OPCODE BIT PATTERN AND STORE
  363.     CALL    SETMD
  364. OP2:    ;ENTER HERE FOR DOUBLE BYTE OPERANDS
  365.     CALL    GADDR    ;VALUE IN B,A
  366.     CALL    SETM
  367.     MOV    A,B
  368.     JMP    SETM
  369. ;
  370. CHK3:    ;CHECK FOR MOV INSTRUCTION
  371.     MVI    C,1
  372.     LXI    H,PMOV
  373.     CALL    SEAR
  374.     JNZ    CHK4
  375. ;
  376. ;    MOV INSTRUCTION GET DESTINATION OPERAND
  377.     CALL    GETREG    ;VALUE TO ACCUMULATOR
  378.     CALL    ADJ
  379.     MOV    B,A    ;SAVE IN B
  380.     MVI    C,01000000B    ;BIT PATTERN FOR MOV
  381. ;
  382. OP1:    ;GET NEXT OPERAND FOR MOV, FIRST OPERAND FOR ACCUM/REG OPERATOR
  383.     CALL    GETREG
  384.     ORA    C    ;SETS HIGH ORDER TWO BITS
  385.     ORA    B    ;SETS DESTINATION/OPERATOR
  386.     JMP    SETM
  387. ;
  388. CHK4:    ;CHECK FOR GROUP-5 (ACCUM/REG OPERATOR)
  389.     MVI    C,8
  390.     LXI    H,ETAB5
  391.     CALL    SEAR
  392.     JNZ    CHK5
  393. ;
  394. ;    ACCUM/REG INSTRUCTION, C COUNTS OPERATORS AS SEARCH PROCEEDS
  395.     DCR    C
  396.     MOV    A,C
  397.     CALL    ADJ
  398.     MOV    B,A
  399. ;    OPERATOR NUMBER (SHIFTED) SAVED FOR LATER MASK
  400.     MVI    C,10000000B    ;ACCUM/REG OPERATOR INDICATOR
  401.     JMP    OP1    ;GETS OPERAND AND SAVES BYTE IN MEMORY
  402. ;
  403. CHK5:    ;MAY BE INR/DCR
  404.     MVI    C,2
  405.     LXI    H,PDCR
  406.     CALL    SEAR
  407.     JNZ    CHK6
  408. ;
  409. ;    C=2 IF DCR, =1 IF INR
  410.     INR    C    ;+1
  411.     INR    C    ;+2
  412.     INR    C    ;+3
  413.     CALL    GETREG    ;VALUE TO ACCUM
  414.     CALL    ADJ
  415.     ORA    C    ;FILL PROPER INSTRUCTION INDICATOR
  416.     JMP    SETM
  417. ;
  418. CHK6:    ;MAY BE A MVI INSTRUCTION
  419.     MVI    C,1
  420.     LXI    H,PMVI
  421.     CALL    SEAR
  422.     JNZ    CHK7
  423. ;
  424. ;    MVI INSTRUCTION, GET REGISTER
  425.     CALL    GETREG    ;VALUE GOES TO ACCUMULATOR
  426.     CALL    ADJ
  427.     ORI    110B
  428.     CALL    SETM
  429.     CALL    GBYTE
  430.     JMP    SETM
  431. ;
  432. CHK7:    ;CHECK FOR GROUP-7
  433.     MVI    C,6
  434.     LXI    H,ETAB7
  435.     CALL    SEAR
  436.     JNZ    CHK8
  437. ;
  438. ;    LXI,STAX,INX,DAD,LDA, OR DCX
  439.     MOV    A,C    ;A=1...6
  440.     CPI    4
  441.     JC    IN0
  442. ;
  443. ;    MUST BE DAD,LDA, OR DCX
  444.     ADI    5    ;CHANGES ACCUM TO 9,10, OR 11
  445. IN0:    ;ACCUMULATOR CONTAINS CODE, SAVE IT
  446.     MOV    B,A
  447.     CALL    GETDR    ;DOUBLE REGISTER VALUE TO ACCUM
  448.     CALL    ADJ4    ;ADJUST VALUE TO MIDDLE FIELD
  449.     ORA    B    ;FILLS REMAINING BITS
  450.     CALL    SETM
  451. ;    MAY BE LXI
  452.     ANI    11001111B
  453.     CPI    1
  454.     RNZ    ;NOT LXI
  455.     JMP    OP2    ;PICK UP OPERAND
  456. ;
  457. ;
  458. ;
  459. CHK8:    ;RST?
  460.     MVI    C,1
  461.     LXI    H,PRST
  462.     CALL    SEAR
  463.     JNZ    CHK9
  464. ;
  465. ;    RST, GET OPERAND
  466.     CALL    GBYTE
  467.     CPI    8
  468.     JNC    ERR
  469.     CALL    ADJ
  470.     ORI    11000111B
  471.     JMP    SETM
  472. ;
  473. CHK9:    ;POP/PUSH?
  474.     MVI    C,2
  475.     LXI    H,PPOP+4
  476.     CALL    SEAR
  477.     JNZ    CHK10
  478. ;
  479. ;    C=2 IF PUSH, 1 IF POP
  480.     DCR    C
  481.     JNZ    PP0
  482. ;
  483. ;    POP, SET BIT PATTERN
  484.     MVI    C,11000001B
  485.     JMP    PP1
  486. ;
  487. PP0:    ;PUSH
  488.     MVI    C,11000101B
  489. PP1:    CALL    GETPR    ;DOUBLE PUSH/POP REGISTER TO PROPER FIELD
  490.     CALL    ADJ4    ;MOVE TO FIELD
  491.     ORA    C
  492.     JMP    SETM
  493. ;
  494. CHK10:    ;J/C/R?
  495.     LDA    OPCODE
  496.     CPI    'J'
  497.     JNZ    CHK11
  498.     CALL    GCONA
  499. ;    CONDITION CODE TO FIELD IN ACCUM, ADDRESS TO B,C
  500.     ORI    010B
  501.     JMP    FADDR    ;FILL ADDRESS
  502. ;
  503. CHK11:    CPI    'C'
  504.     JNZ    CHK12
  505.     CALL    GCONA
  506.     ORI    100B
  507. ;
  508. FADDR:    CALL    SETM
  509.     MOV    A,C
  510.     CALL    SETM
  511.     MOV    A,B
  512.     JMP    SETM
  513. ;
  514. CHK12:    CPI    'R'
  515.     JNZ    ERR
  516.     CALL    GCON
  517.     ORI    11000000B
  518.     JMP    SETM
  519. ;
  520. ;    ************************************************************
  521. ;    *********** END OF ASSEMBLER MODULE, START DISASSEMBLER ****
  522. ;    ************************************************************
  523. ;
  524. RDBYTE:    LHLD    MPC
  525.     PUSH    D    ;SAVE DE
  526.     XCHG        ;MAX PC TO D,E
  527.     LHLD    PC    ;CURRENT PC
  528. ;    SUBTRACT PC FROM MPC, STOP IF CARRY GENERATED
  529.     MOV    A,E
  530.     SUB    L
  531.     MOV    A,D
  532.     SBB    H
  533.     JNC    RD0
  534. ;
  535. ;    PC EXCEEDS MPC, RETURN
  536.     LHLD    OLDSP
  537.     SPHL        ;RESTORE ORIGINAL STACK POINTER
  538.     RET
  539. ;
  540. RD0:    POP    D    ;RESTORE D,E
  541.     MOV    A,M
  542.     INX    H
  543.     SHLD    PC
  544.     RET    
  545.  
  546. RGPRNT:    INR    A
  547.     ANI    07
  548.     CPI    06
  549.     JC    RGP1
  550.     ADI    03
  551. RGP1:    CPI    05
  552.     JC    RGP2
  553.     ADI    02
  554. RGP2:    ADI    41H
  555.     MOV    C,A
  556.     JMP    CO
  557.  
  558. DECODE:    MOV    B,A
  559.     ANI    0F0H
  560.     RRC
  561.     RRC
  562.     RRC
  563.     RRC
  564.     ADI    90H
  565.     DAA    
  566.     ACI    40H
  567.     DAA    
  568.     MOV    C,A
  569.     CALL    CO
  570.     MOV    A,B
  571.     ANI    0FH
  572.     ADI    90H
  573.     DAA    
  574.     ACI    40H
  575.     DAA
  576.     MOV    C,A
  577.     JMP    CO
  578.  
  579. PRINT:    MVI    B,4
  580. P1:    MOV    C,M
  581.     CALL    CO
  582.     INX    H
  583.     DCR    B
  584.     JNZ    P1
  585.     MVI    C,' '
  586.     JMP    CO
  587. ;
  588. ;    EXTRACT THE REGISTER FIELD FROM THE OPCODE
  589. XTRACT:    MOV    A,D
  590.     ANI    0011$1000B
  591.     RRC
  592.     RRC
  593.     RRC
  594.     RET
  595. ;
  596. ;    PRINT CONDITION CODE
  597. CCPRNT:    CALL    XTRACT
  598.     ADD    A
  599.     MOV    C,A
  600.     LXI    H,CCODE
  601.     DAD    B
  602.     MOV    C,M
  603.     CALL    CO
  604.     INX    H
  605.     MOV    C,M
  606.     CALL    CO
  607.     MVI    C,' '
  608.     CALL    CO
  609.     JMP    CO
  610.  
  611. ;    PRINT REGISTER REFERENCE
  612. RPPRNT:    CALL    XTRACT
  613.     ANI    06
  614.     CPI    06
  615.     JNZ    RGPRNT
  616.     MVI    C,'S'
  617.     CALL    CO
  618.     MVI    C,'P'
  619.     JMP    CO
  620. ;
  621. ;
  622. PRPC:    ;PRINT CRLF FOLLOWED BY PC VALUE
  623.     CALL    CRLF
  624. ;    (ENTER HERE FROM DISASSEMBLER)
  625. PRPC0:    LHLD    PC
  626.     MOV    A,H
  627.     CALL    DECODE
  628.     MOV    A,L
  629.     CALL    DECODE
  630.     MVI    C,' '
  631.     CALL    CO
  632.     CALL    CO
  633.     RET
  634. ;
  635. DISENT:    ;ENTER HERE FROM DEBUGGER
  636.     LXI    H,0
  637.     DAD    SP
  638.     SHLD    OLDSP    ;SP SAVED FOR LATER RETURN
  639. ;
  640. ;    CHECK FOR PAGE MODE DISPLAY
  641.     LDA    PAGM    ;GET PAGE MODE (NUMBER OF LINES TO PRINT)
  642.     ORA    A    ;SET FLAGS
  643.     JZ    DISASM    ;NOT PAGE MODE
  644. ;
  645. ;    SET MPC TO 0FFFFH
  646.     LXI    H,0FFFFH
  647.     SHLD    MPC
  648. ;    255 IMPLIES TRACE MODE
  649.     INR    A
  650.     JNZ    DISASM    ;NOT TRACE MODE IF BR
  651. ;    TRACE MODE, SET TO 1 AND IGNORE ADDRESS FIELD
  652.     INR    A    ;1 IN ACC
  653.     STA    PAGM
  654.     LHLD    PC    ;RECOVER PC
  655.     JMP    DIS1
  656. ;
  657. ;
  658. DISASM:
  659. ;    CHECK FOR BREAK AT CONSOLE
  660.     CALL    BREAK
  661.     JNZ    GOBACK
  662. ;
  663. ;    CHECK TO SEE IF ENOUGH LINES PRINTED IN PAGE MODE
  664.     LXI    H,PAGM
  665.     MOV    A,M
  666.     ORA    A    ;ZERO?
  667.     JZ    DIS0    ;JMP IF NOT PAGE MODE
  668. ;
  669. ;    PAGE MODE, DECREMENT AND CHECK FOR ZERO
  670.     DCR    M
  671.     JZ    GOBACK
  672. ;
  673. DIS0:    LHLD    PC    ;CURRENT PC
  674.     CALL    PRLABEL    ;OPTIONAL LABEL
  675.     CALL    CRLF    ;NEW LINE
  676.     MVI    C,' '
  677.     CALL    CO
  678.     CALL    CO    ;TWO LEADING BLANKS
  679.     CALL    PRPC0    ;PRINT THE VALUE
  680. DIS1:    CALL    RDBYTE
  681. ;    SAVE THE OPCODE IN THE D REGISTER
  682.     MOV    D,A
  683. ;    SEARCH THE FIRST 17 ITEMS FOR SIMPLE OPCODES
  684. ;    EI (FB) THROUGH NOP (00).  NOTE THAT THE SEARCH PROCEEDS
  685. ;    THROUGH "TABLE" STARTING AT THE BEGINNING, BUT THE OPCODES
  686. ;    ARE ACTUALLY STORED IN SYMBOLIC FORM IN REVERSE ORDER.
  687. ;
  688.     LXI    H,TABLE
  689.     LXI    B,17    ;FIRST 17 SIMPLE OPCODES
  690. GROUP1:    CMP    M    ;TABLE VALUE = OPCODE?
  691.     JZ    TYPE1    ;SKIP TO PRINT IF SO
  692.     INX    H    ;MOVE TO THE NEXT TABLE ELEMENT
  693.     DCR    C    ;COUNT THE SIMPLE OPCODES DOWN
  694.     JNZ    GROUP1    ;TRY FOR ANOTHER
  695. ;
  696. ;    NOT A SIMPLE OPERATION CODE, CHECK FOR IMMEDIATE OP
  697. ;    ADI, ACI, OUT, SUI, IN, SBI, ANI, XRI, ORI, CPI
  698.     MVI    C,10
  699. GROUP2:    CMP    M
  700.     JZ    TYPE2
  701.     INX    H
  702.     DCR    C
  703.     JNZ    GROUP2
  704. ;
  705. ;    NOT AN IMMEDIATE OPERATION, CHECK FOR
  706. ;    SHLD LHLD STA LDA JMP OR CALL
  707.     MVI    C,6
  708. GROUP3:    CMP    M
  709.     JZ    TYPE3
  710.     INX    H
  711.     DCR    C
  712.     JNZ    GROUP3
  713. ;
  714. ;    NOT TYPE3 OPERATION CODE, CHECK FOR MOV
  715. ;    BY MASKING THE HIGH ORDER TWO FIBITS -
  716. ;    XX00 0000 IS PRODUCED IN THE ACCUMULATOR
  717.     ANI    0C0H
  718. ;    MOV IS GIVEN BY 01 DDD SSS (DDD IS DEST, SSS IS SOURCE)
  719.     CPI    40H
  720.     JZ    MOVOP
  721. ;
  722. ;    NOT A MOV INSTRUCTION, CHECK FOR ACCUMLATOR-REGISTER OPS
  723. ;    BIT PATTERN 10 CCC RRR    CORRESPONDS TO
  724. ;    ADD (0), ADC (1), SUB (2), SBB (3), ANA (4),
  725. ;    XRA (5), ORA (6), CMP (7)
  726.     CPI    80H
  727.     JZ    ACCREG
  728. ;
  729. ;    NOT ACCUM-REGISTER, RESTORE OPCODE FOR FURTHER CHECKS
  730.     MOV    A,D
  731. ;
  732. ;    LOOK FOR INR, DCR, AND MVI OPERATIONS
  733. ;    INR = 00 RRR 100, DCR = 00 RRR 101, MVI = 00 RRR 110
  734. ;    OR, INR = 00 RRR 4, DCR = 00 RRR 5, MVI = 00 RRR 6
  735.     ANI    1100$0111B
  736.     SUI    04
  737. ;    INR GOES TO ZERO
  738.     JZ    INRREG
  739. ;    NOT INR, MAY BE DCR
  740.     DCR    A
  741.     JZ    DCRREG
  742.     DCR    A
  743. ;    NOT DCR, MAY BE MVI
  744.     JZ    MVIREG
  745. ;    NOT INR, DCR, OR MVI INSTRUCTION
  746. ;
  747. ;    RESTORE THE OPCODE
  748.     MOV    A,D
  749. ;    LOOK FOR LXI STAX INX DAD LDAX DCX OPCODES
  750. ;    LXI = 00 RR 0001,
  751. ;    STAX= 00 RR 0010,
  752. ;    INX = 00 RR 0011,
  753. ;    DAD = 00 RR 1001,
  754. ;    LDAX= 00 RR 1010
  755. ;    DCX = 00 RR 1011
  756.     ANI    0C0H
  757.     JZ    LXILST    ;TO PROCESS FURTHER
  758. ;
  759. ;    NOT ONE OF THE ABOVE, CHECK FURTHER
  760. ;    MUST BE OF THE FORM - 11 XXX XXX
  761.     MOV    A,D
  762.     ANI    0000$0111B    ;TO EXTRACT THE RIGHTMOST BITS
  763. ;    RETURN CONDITIONALS TAKE THE FORM 11 XXX 000
  764.     JZ    RETCON        ;RETURN CONDITIONALLY
  765. ;    JUMP CONDITIONALS TAKE THE FORM 11 XXX 010 = 2
  766.     SUI    02
  767.     JZ    JMPCON
  768. ;    CALL CONDITIONALS TAKE THE FORM 11 XXX 100 = 4 - 2 = 2
  769.     SUI    02
  770.     JZ    CALLCON
  771. ;    RST'S TAKE THE FORM 11 XXX 111 = 7 - 4 = 3
  772.     SUI    03
  773.     JZ    RSTOP
  774. ;
  775. ;    NONE OF THE ABOVE, PUSHES AND POP'S REMAIN
  776.     MOV    A,D        ;RESTORE OPCODE
  777. ;    FIRST CAPTURE REMAINING OPCODES CB, D9, DD, ED, FD
  778.     ANI    0000$1000B    ;THIS BIT RESET FOR POP,PUSH
  779.     JNZ    N8080        ;NOT 8080 OPCODE IF SET
  780.     MOV    A,D        ;RESTORE IT
  781. ;    PUSH = 11 XX0 101 = 5, POP = 11 XX0 001 = 1
  782.     ANI    07
  783. ;    USE THE RESULTING VALUE TO INDEX TO REGISTER TABLE
  784.     MOV    C,A
  785.     DCR    A    ;POP GOES TO 00
  786.     LXI    H,PPOP-1
  787.     DAD    B
  788.     CALL    PRINT
  789. ;    GET THE RELEVANT REGISTER
  790.     CALL    XTRACT
  791. ;    CHECK FOR PSW OPERATION CODE
  792.     CPI    06
  793.     JNZ    D6
  794.     LXI    H,PPSW
  795.     CALL    PRINT
  796.     JMP    DISASM
  797. ;
  798. ;    PRINT RST XXX INSTRUCTION
  799. RSTOP:    LXI    H,PRST
  800.     CALL    PRINT
  801.     CALL    XTRACT
  802.     CALL    DECODE
  803.     JMP    DISASM
  804. ;
  805. ;    CALL CONDITIONAL 'C'
  806. CALLCON:
  807.     MVI    C,'C'
  808.     CALL    CO
  809.     CALL    CCPRNT
  810.     JMP    PREXT    ;TO PRINT THE ADDRESS
  811. ;
  812. ;    JUMP CONDITIONAL 'J'
  813. JMPCON:
  814.     MVI    C,'J'
  815.     CALL    CO
  816.     CALL    CCPRNT
  817.     JMP    PREXT    ;TO PRINT THE ADDRESS
  818. ;
  819. ;    RETURN CONDITIONAL 'R'
  820. RETCON:
  821.     MVI    C,'R'
  822.     CALL    CO
  823.     CALL    CCPRNT
  824.     JMP    DISASM
  825. ;
  826. ;
  827. ;    PROCESS ONE OF LXI STAX INX DAD LDAX DCX
  828. LXILST:    LXI    H,PLXI
  829. ;    CAPTURE 08, 10, 18, 20, 28, 30, AND 38
  830.     MOV    A,D    ;GET OPCODE
  831.     ANI    111B    ;RIGHTMOST BITS ZERO?
  832.     JZ    N8080    ;NOT 8080 IF SO
  833. ;    RECALL OPCODE TO DETERMINE WHICH ONE
  834.     MOV    A,D
  835. ;    FIND THE PARTICULAR OPCODE
  836.     ANI    0FH
  837. ;    LXI HAS LEAST SIGNIFICANT FOUR BITS = 0001
  838.     DCR    A
  839.     JZ    LXIREG
  840. ;    STAX 0010 BECOMES 0001 = 1
  841. ;    INX  0011 BECOMES 0010 = 2
  842. ;    DAD  1001 BECOMES 1000 = 8
  843. ;    LDAX 1010 BECOMES 1001 = 9
  844. ;    DCX  1011 BECOMES 1010 = 10
  845.     CPI    03
  846.     JC    D4
  847. ;    MUST BE DAD, LDAX OR DCX
  848.     SUI    05
  849. ;    DAD 8 BECOMES 3
  850. ;    LDAX9 BECOMES 4
  851. ;    DCX10 BECOMES 5
  852. ;    ACCUMULATOR NORMALIZED
  853. D4:    ADD    A
  854.     ADD    A
  855. ;    VALUE IN ACCUM MULTIPLIED BY FOUR
  856.     MOV    C,A
  857.     DAD    B
  858.     CALL    PRINT
  859. ;    STAX, INX, DAD, LDAX, OR DC X PRINTED, PRINT REGISTER
  860.     CALL    RPPRNT
  861.     JMP    DISASM
  862. ;
  863. ;    PRINT REGISTER ADDRESSED BY HL (E.G., IN LXI)
  864. LXIREG:    CALL    PRINT
  865.     CALL    RPPRNT
  866.     MVI    C,','
  867.     CALL    CO
  868.     JMP    PREXT    ;TO PRINT THE EXTENDED INSTRUCTION
  869. ;
  870. ;
  871. MVIREG:    LXI    H,PMVI
  872.     CALL    PRINT
  873.     CALL    XTRACT
  874.     CALL    RGPRNT
  875.     MVI    C,','
  876.     CALL    CO
  877.     JMP    DATA8
  878. ;
  879. DCRREG:    LXI    H,PDCR
  880.     JMP    D5
  881. ;
  882. INRREG:    LXI    H,PINR
  883. ;
  884. ;    PRINT THE INSTRUCTION GIVEN BY HL, FOLLOWED BY REGISTER
  885. D5:    CALL    PRINT
  886.     CALL    XTRACT
  887. D6:    CALL    RGPRNT
  888.     JMP    DISASM
  889. ;
  890. ;    FOUND ACCUM REGISTER OPERATION - MIDDLE BITS GIVE PCODE
  891. ACCREG:    MOV    A,D
  892.     ANI    38H    ;SELECT OPCODE BITS
  893.     RRC        ;OPCODE * 4 FOR LENGTH FOUR STRING
  894.     MOV    C,A
  895.     LXI    H,PADD    ;ADDRESS THE ACCUM-REGISTER LIST
  896.     DAD    B
  897.     CALL    PRINT
  898.     JMP    D9
  899. ;
  900. ;    MOV OPERATION FOUND
  901. MOVOP:    LXI    H,PMOV
  902.     CALL    PRINT
  903.     CALL    XTRACT
  904.     CALL    RGPRNT
  905.     MVI    C,','    ;REGISTER DELIMITER
  906.     CALL    CO
  907. D9:    MOV    A,D
  908.     ANI    07
  909.     CALL    RGPRNT
  910.     JMP    DISASM
  911. ;
  912. ;    TYPE GROUP3: CALL JMP LDA STA LHLD SHLD
  913. TYPE3:
  914.     MOV    A,C    ;*4 FOR LENGTH 4
  915.     ADD    A
  916.     ADD    A
  917.     MOV    C,A
  918.     LXI    H,TAB3-4
  919.     DAD    B
  920.     CALL    PRINT
  921. ;
  922. ;    ARRIVE HERE TO PRINT THE ADDRESS FIELD
  923. PREXT:    CALL    RDBYTE    ;LOW ADDRESS TO A
  924.     PUSH    PSW    ;SAVE IT
  925.     CALL    RDBYTE
  926.     MOV    D,A    ;SET HIGH ADDRESS
  927.     POP    PSW    ;RECALL LOW ADDRESS
  928.     MOV    E,A    ;DE IS THE ADDRESS TO PRINT
  929.     CALL    PADDX
  930.     JMP    DISASM
  931. ;
  932. ;    TYPE THE IMMEDIATE OPCODES (INCLUDING IN/OUT)
  933. TYPE2:    MOV    A,C    ;TYPE IMMEDIATE OPERATION CODE
  934.     ADD    A    ;*2
  935.     ADD    A    ;*4 FOR LENGTH FOUR CHAR STRING
  936.     MOV    C,A    ;BC = INDEX * 4 FOR OPCODE
  937.     LXI    H,TAB2-4
  938.     DAD    B
  939.     CALL    PRINT
  940. ;
  941. ;    ARRIVE HERE TO PRINT THE IMMEDIATE VALUE
  942. DATA8:    CALL    RDBYTE
  943.     CALL    PBYTE    ;BYTE VALUE PRINTED
  944.     JMP    DISASM
  945. ;
  946. ;    FOUND OPCODE IN TABLE, POSITION GIVEN
  947. ;    BY COUNT IN BC (NOTE THAT C IS COUNTED DOWN, WHILE
  948. ;    INDEX WAS MOVING UP THE TABLE DURING THE SEARCH)
  949. TYPE1:    MOV    A,C    ;TYPE SIMPLE OPCODES FROM GROUP 1
  950.     ADD    A    ;POSITION * 2
  951.     ADD    A    ;POSITION * 4 (FOUR CHAR CODES)
  952.     MOV    C,A    ;BC IS INDEX * 4 OF OPCODE
  953.     LXI    H,TAB1-4
  954.     DAD    B    ;HL NOW HOLDS ADDRESS OF CODE TO PRINT
  955.     CALL    PRINT
  956.     JMP    DISASM
  957. ;
  958. N8080:    ;NOT AN 8080 OPERATION CODE
  959.     LXI    H,DBOP
  960.     CALL    PRINT    ;PRINT THE '??='
  961.     MOV    A,D    ;GET THE OPCODE
  962.     CALL    PBYTE    ;AND PRINT IT
  963.     JMP    DISASM
  964. ;
  965. ERR:    ;ENTER HERE FOR ERROR REPORTING
  966.     CALL    CRLF
  967.     MVI    C,'?'
  968.     CALL    CO
  969. ;
  970.     LHLD    OLDSP
  971.     SPHL
  972. ;    PC REMAINS UNCHANGED
  973. ;
  974. ;
  975. ASMEN:    ;ENTER HERE FROM DEBUGGER
  976.     LXI    H,0
  977.     DAD    SP
  978.     SHLD    OLDSP
  979. ;
  980. ASM0:    CALL    PRPC    ;PRINT PC VALUE
  981.     SHLD    TPC    ;SAVE PC VALUE
  982.     CALL    GETBUFF    ;FILL INPUT BUFFER
  983.     CALL    GETOP    ;GET OPERATION
  984. ;    UPDATE PC, MUST BE CORRECT INPUT
  985.     LHLD    TPC
  986.     SHLD    PC
  987.     JMP    ASM0
  988. ;
  989. GOBACK:    LHLD    OLDSP
  990.     SPHL
  991.     RET
  992. ;
  993. ;    THE FIRST 17 ITEMS CORRESPOND TO SIMPLE OPCODES
  994. ;    (NOP BACKWARD THROUGH EI)
  995. TABLE:    DB    000H,007H,00FH,017H    ;NOP RLC RRC RAL
  996.     DB    01FH,027H,02FH,037H    ;RAR DAA CMA STC
  997.     DB    03FH,076H,0C9H,0E3H    ;CMC HLT RET XTHL
  998.     DB    0E9H,0EBH,0F3H,0F9H    ;PCHL XCHG DI SPHL
  999.     DB    0FBH            ;EI
  1000. ;
  1001. ;    THE NEXT 10 ITEMS CORRESPOND TO THE IMMEDIATE OPCODES
  1002.     DB    0C6H,0CEH,0D3H        ;ADI ACI OUT
  1003.     DB    0D6H,0DBH,0DEH,0E6H    ;SUI IN SBI ANI
  1004.     DB    0EEH,0F6H,0FEH        ;XRI ORI
  1005.  
  1006.     DB    022H            ;SHLD
  1007.     DB    02AH,032H,03AH,0C3H
  1008.     DB    0CDH
  1009. TAB1:    DB    'EI  ','SPHL','DI  ','XCHG'
  1010.  
  1011.  
  1012.  
  1013.     DB    'PCHL','XTHL','RET ','HLT '
  1014.  
  1015.  
  1016.     DB    'CMC ','STC ','CMA ','DAA '
  1017.  
  1018.  
  1019.     DB    'RAR ','RAL ','RRC ','RLC '
  1020.  
  1021.  
  1022. ETAB1:    DB    'NOP '
  1023. TAB2:    DB    'CPI ','ORI ','XRI ','ANI '
  1024.  
  1025.  
  1026.     DB    'SBI ','IN  ','SUI ','OUT '
  1027.  
  1028.  
  1029.     DB    'ACI '
  1030. ETAB2:    DB    'ADI '
  1031. ;
  1032. TAB3:    DB    'CALL','JMP ','LDA ','STA '
  1033.  
  1034.  
  1035.     DB    'LHLD' 
  1036. ETAB3:    DB    'SHLD'
  1037. ;
  1038.  
  1039. PMOV:    DB    'MOV '
  1040. PADD:    DB    'ADD ','ADC ','SUB ','SBB '
  1041.  
  1042.  
  1043.     DB    'ANA ','XRA ','ORA '
  1044. ETAB5:    DB    'CMP '
  1045.  
  1046. PINR:    DB    'INR '
  1047. PDCR:    DB    'DCR '
  1048. PMVI:    DB    'MVI '
  1049. PLXI:    DB    'LXI ','STAX','INX ','DAD '
  1050.  
  1051.  
  1052.     DB    'LDAX'
  1053. ETAB7:    DB    'DCX '
  1054. ;
  1055.  
  1056. PRST:    DB    'RST '
  1057. PPSW:    DB    'PSW '
  1058. PPOP:     DB    'POP ','PUSH'
  1059.  
  1060. CCODE:    DB    'NZ','Z ','NC','C '
  1061.  
  1062.     DB    'PO','PE','P '
  1063. CREG:    DB    'M '
  1064.  
  1065.     DB    'B ','C ','D ','E '
  1066.     DB    'H ','L ','M '
  1067. SREG:    DB    'A '
  1068. ;
  1069.     DB    'B   ','D   ','H   ','SP  '
  1070. DREG:    DB    'PSW '
  1071. ;
  1072. DBOP:    DB    '??= '
  1073. OPCODE:    DS    4
  1074.     END
  1075.