home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols100 / vol177 / monitor.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  18.1 KB  |  988 lines

  1. ; *******************************************
  2. ; *               MONITOR                   *
  3. ; *  This program is based on the MONITOR   *
  4. ; *  program in 8080/Z80 Assembly Language  *
  5. ; *  Techniques for Improved Programing by  *
  6. ; *  Alan R. Miller. It has been expanded   *
  7. ; *  to include a set of new functions and  *
  8. ; *  an improved loader. This version is    *
  9. ; *  for North Star Horizon with a "window" *
  10. ; *  at EC00. See the file MONITOR.DOC for  *
  11. ; *  more information.                      *
  12. ; *                                         * 
  13. ; *  WRITTEN BY:     Gary M. Morin          *
  14. ; *  ORIGINATED:     November 14, 1982      *
  15. ; *  MODIFIED:       April 29, 1983         *
  16. ; *  VERSION         2.3                    *
  17. ; *******************************************
  18. ;
  19. ORGIN    EQU    100H    ;PROGRAM START
  20. DEST    EQU    0F800H    ;PROGRAM DESTINATION
  21. HOME    EQU    DEST    ;ABORT ADDRESS
  22. BOOT    EQU    0H    ;CP/M BOOT
  23. STACK    EQU    DEST-60H
  24. ;
  25. PTRTOG    EQU    DEST-1    ;PRINTER TOGGLE FLAG
  26. PORTN    EQU    STACK    ;PORT AND BYTE
  27. IBUFP    EQU    STACK+3    ;BUFFER POINTER
  28. IBUFC    EQU    IBUFP+2    ;BUFFER COUNT
  29. IBUFF    EQU    IBUFP+3    ;INPUT BUFFER
  30. ;
  31. CTRC    EQU    3    ;^C [BOOT CPM]
  32. CTRH    EQU    8    ;^H
  33. TAB    EQU    9    ;^I
  34. LF    EQU    10    ;LF [LINE FEED]
  35. CR    EQU    13    ;CR [CARRIAGE RETURN]
  36. CTRP    EQU    16    ;^P [PRINTER TOGGLE]
  37. CTRQ    EQU    17    ;^Q [RESTRT OUTPUT]
  38. CTRS    EQU    19    ;^S [INTERUPT OUTPUT]
  39. CTRU    EQU    21    ;^U [ERASE LINE]
  40. CTRX    EQU    24    ;^X [ABORT]
  41. ESC    EQU    27    ;ESCAPE
  42. DEL    EQU    127    ;RUBOUT
  43. BACKSP    EQU    CTRH    ;BACKSP CHAR
  44. APOS    EQU    (39-'0') AND 0FFH
  45. INC    EQU    0DBH    ;IN OP CODE
  46. OUTC    EQU    0D3H    ;OUT OP CODE
  47. RETC    EQU    0C9H    ;RET OP CODE
  48. ;
  49. ;================================================
  50. ;             North Star Equates
  51. ;================================================
  52. ;
  53. CSTAT    EQU    3    ;CONSOLE STATUS
  54. CDATA    EQU    2    ;CONSOLE DATA
  55. CSTATO    EQU    3    ;CONSOLE OUTPUT STATUS
  56. CDATAO    EQU    2    ;CONSOLE OUTPUT DATA
  57. PSTATO    EQU    5    ;PRINTER STATUS
  58. PDATAO    EQU    4    ;PRINTER DATA
  59. INMSK    EQU    2    ;INPUT MASK
  60. OMSK    EQU    1    ;OUTPUT MASK
  61. ;
  62. ;================================================
  63. ;               Start of Code
  64. ;================================================
  65. ;
  66.     ORG    ORGIN
  67. ;
  68. ;--> Save the old stack
  69. ;
  70.     LXI    H,0    ;zero HL
  71.     DAD    SP    ;SP to HL
  72.     SHLD    OLDSTK    ;save stack
  73. ;
  74. ;--> Locate important addresses
  75. ;
  76.     LXI    B,SOUEND-BEGIN+1
  77.     LXI    H,PROEND
  78.     LXI    D,SOUEND-1
  79. ;
  80. ;--> Move the code
  81. ;
  82. MVLP:    LDAX    D
  83.     DCX    H
  84.     MOV    M,A
  85.     DCX    D
  86.     DCX    B
  87.     MOV    A,B    ;ZERO?
  88.     ORA    C    ;LOW ORDER BYTE
  89.     JNZ    MVLP
  90. ;
  91. ;--> JUMP TO MONITOR NOW IN PLACE
  92. ;
  93.     JMP    START
  94. ;
  95. BEGIN:    NOP
  96. ;
  97. ;**********************************************
  98. ;   BEGINING OF THE ACTUAL  PROGRAM
  99. ;
  100. ;                  CAUTION
  101. ;  ANY LABELS ADDED AFTER THIS POINT MUST BE
  102. ;  OF THE FORM  $+OFFSET
  103. ;**********************************************
  104. ;
  105. OFFSET    EQU    DEST-BEGIN-1
  106. ;
  107. START    EQU    $+OFFSET
  108.     JMP    COLD    ;COLD START
  109. ;
  110. RESTRT    EQU    $+OFFSET
  111.     JMP    WARM    ;WARM START
  112. ;
  113. ;
  114. ;--> CONSOLE STATUS ROUTINE
  115. ;
  116. INSTAT    EQU    $+OFFSET
  117.     IN    CSTAT    ;GET STATUS BYTE
  118.     ANI    INMSK    ;READY?
  119.     RET
  120. ;
  121. ;--> CONSOLE INPUT ROUTINE
  122. ;
  123. INPUTT    EQU    $+OFFSET
  124.     CALL    INSTAT    ;CHECK STATUS
  125.     JZ    INPUTT    ;NOT READY
  126. INPUT2    EQU    $+OFFSET
  127.     IN    CDATA    ;GET BYTE
  128.     ANI    DEL
  129.     CPI    CTRX    ;ABORT?
  130.     JZ    HOME    ;YES
  131.     CPI    CTRC    ;CANCEL?
  132.     JZ    BOOT    ;YES
  133.     CPI    CTRP    ;TOGGLE PRINTER?
  134.     RNZ        ;NO
  135.     LDA    PTRTOG    ;CHECK FLAG
  136.     CMA        ;INVERT
  137.     STA    PTRTOG    ;SAVE
  138.     JMP    INPUTT    ;GET NEXT
  139. ;
  140. ;
  141. ;--> CONSOLE OUTPUT ROUTINE
  142. ;
  143. OUTT    EQU    $+OFFSET
  144.     PUSH    PSW
  145. OUT2    EQU    $+OFFSET
  146.     CALL    INSTAT    ;INPUT?
  147.     JZ    OUT4    ;NO
  148.     CALL    INPUT2    ;GET INPUT
  149.     CPI    CTRS    ;FREEZE?
  150.     JNZ    OUT2    ;NO
  151. ;
  152. ;--> FREEZE OUTPUT UNTIL ^Q OR ^X
  153. ;
  154. OUT3    EQU    $+OFFSET
  155.     CALL    INPUTT    ;INPUT?
  156. ;
  157. OUT4    EQU    $+OFFSET
  158.     LDA    PTRTOG    ;PRINTER TOGGLE?
  159.     ORA    A
  160.     JNZ    OUT5    ;YES
  161.     IN    CSTATO    ;CHECK STATUS
  162.     ANI    OMSK
  163.     JZ    OUT2    ;NOT READY
  164.     POP    PSW
  165.     OUT    CDATAO    ;SEND DATA
  166.     RET
  167. OUT5    EQU    $+OFFSET
  168.     IN    PSTATO    ;CHECK PTR STATUS
  169.     ANI    OMSK    ;READY?
  170.     JZ    OUT2    ;NOT READY
  171.     POP    PSW
  172.     OUT    CDATAO    ;SEND TO CONSOLE
  173.     OUT    PDATAO    ;SEND TO PRINTER
  174.     RET
  175. ;
  176. ;--> Cold start routine
  177. ;
  178. COLD    EQU    $+OFFSET
  179.     LXI    SP,STACK
  180.     LXI    D,STMSG    ;MESSAGE
  181.     CALL    SENDM    ;SENDIT
  182.     MVI    A,0    ;SET PTRTOG FLAG
  183.     STA    PTRTOG    ;STORE IT
  184. ;
  185. ;--> Warm start routine
  186. ;
  187. WARM    EQU    $+OFFSET
  188.     LXI    H,WARM    ;PUSH WARM ADDR
  189.     PUSH    H    ; ON STACK
  190.     CALL    CRLF    ;NEW LINE
  191.     CALL    INPLN    ;CONSOLE LINE
  192.     CALL    GETCH    ;GET CHARACTER
  193. ;
  194. ;--> MAIN COMMAND PROCESSOR
  195. ;    AFTER ALAN R. MILLER
  196. ;
  197.     SUI    'A'    ;CONVERT OFFSET
  198.     JC    ERROR    ; < A
  199.     CPI    'Z'-'A'+1
  200.     JNC    ERROR    ; > Z
  201.     ADD    A    ;DOUBLE
  202.     LXI    H,TABLE    ;START
  203.     MVI    D,0
  204.     MOV    E,A    ;OFFSET
  205.     DAD    D    ;ADD TO TABLE
  206.     MOV    E,M    ;LOW BYTE
  207.     INX    H
  208.     MOV    D,M    ;HIGH BYTE
  209.     XCHG        ;INTO H,L
  210.     PCHL        ;GO THERE
  211. ;
  212. ;--> COMMAND TABLE
  213. ;
  214. TABLE    EQU    $+OFFSET
  215.     DW    ASCII    ;A, ASCII
  216.     DW    RETCPM    ;B, BACK TO CPM
  217.     DW    CALLS    ;C, CALL SUBROUTINE
  218.     DW    DUMP    ;D, DUMP
  219.     DW    ERROR2    ;E
  220.     DW    FILL    ;F, FILL
  221.     DW    GO    ;G, GO
  222.     DW    HMATH    ;H, HEX MATH
  223.     DW    IPORT    ;I, PORT INPUT
  224.     DW    ERROR2    ;J
  225.     DW    ERROR2    ;K
  226.     DW    LOAD    ;L, LOAD
  227.     DW    MOVE    ;M, MOVE
  228.     DW    ERROR2    ;N
  229.     DW    OPORT    ;O, PORT OUTPUT
  230.     DW    TOGLP    ;P, TOGGLE PRINTER
  231.     DW    ERROR2    ;Q
  232.     DW    REPL    ;R, REPLACE
  233.     DW    SEARCH    ;S, SEARCH
  234.     DW    HELP    ;T, COMMAND TABLE
  235.     DW    ERROR2    ;U
  236.     DW    VERM    ;V, VERIFY MEMORY
  237.     DW    ERROR2    ;W
  238.     DW    REGS    ;X, STACK POINTER
  239.     DW    ERROR2    ;Y
  240.     DW    ERROR2    ;Z
  241. ;
  242. ;--> INPUT A COMMAD LINE PLACE IT IN THE BUFFER
  243. ;
  244. INPLN    EQU    $+OFFSET
  245.     MVI    A,'-'    ;PROMPT
  246.     CALL    OUTT
  247.     MVI    A,'>'    ;PROMPT
  248.     CALL    OUTT
  249. ;
  250. INPL2    EQU    $+OFFSET
  251.     LXI    H,IBUFF    ;BUFFER ADDRESS
  252.     SHLD    IBUFP    ;SAVE POINTER
  253.     MVI    C,0    ;COUNT
  254. ;
  255. INPLI    EQU    $+OFFSET
  256.     CALL    INPUTT    ;CONSOLE CHAR
  257.     CPI    ' '    ;CONTROL?
  258.     JC    INPLC    ;YES
  259.     CPI    DEL    ;DELETE
  260.     JZ    INPLB    ;YES
  261.     CPI    'Z'+1    ;UPPER CASE?
  262.     JC    INPL3    ;YES
  263.     ANI    5FH    ;MAKE UPPER CASE
  264. ;
  265. INPL3    EQU    $+OFFSET
  266.     MOV    M,A    ;INTO BUFFER
  267.     MVI    A,32    ;BUFFER SIZE
  268.     CMP    C    ;FULL?
  269.     JZ    INPLI    ;YES, LOOP
  270.     MOV    A,M    ;GET CHAR
  271.     INX    H    ;INCREMENT POINTER
  272.     INR    C    ;AND COUNT
  273. ;
  274. INPLE    EQU    $+OFFSET
  275.     CALL    OUTT    ;SHOW CHAR
  276.     JMP    INPLI    ;NEXT CHAR
  277. ;
  278. ;--> PROCESS CONTROL CHARACTER
  279. ;
  280. INPLC    EQU    $+OFFSET
  281.     CPI    CTRH    ;^H?
  282.     JZ    INPLB    ;YES
  283.     CPI    CR    ;RETURN
  284.     JNZ    INPLI    ;NO, IGNORE
  285. ;
  286. ;--> END OF INPUT LINE
  287. ;
  288.     MOV    A,C    ;COUNT
  289.     STA    IBUFC    ;SAVE
  290. ;
  291. ;--> CARRIAGE-RETURN, LINE FEED ROUTIN
  292. ;
  293. CRLF    EQU    $+OFFSET
  294.     MVI    A,CR
  295.     CALL    OUTT    ;SEND CR
  296.     MVI    A,LF
  297.     JMP    OUTT    ;SEND LF
  298. ;
  299. ;--> DELETE PRIOR CHARACTER IF ANY
  300. ;
  301. INPLB    EQU    $+OFFSET
  302.     MOV    A,C    ;CHARACTER COUNT
  303.     ORA    A    ;ZERO?
  304.     JZ    INPLI    ;YES
  305.     DCX    H    ;BACK POINTER
  306.     DCR    C    ;AND COUNT
  307.     MVI    A,BACKSP    ;CHARACTER
  308.     JMP    INPLE    ;SEND
  309. ;
  310. ;--> GET A CHARACTER FROM CONSOLE BUFFER
  311. ;    SET CARRY IF EMPTY
  312. ;
  313. GETCH    EQU    $+OFFSET
  314.     PUSH    H    ;SAVE REGS
  315.     LHLD    IBUFP    ;GET POINTER
  316.     LDA    IBUFC    ;AND COUNT
  317.     SUI    1    ;DECREMENT W/CARRY
  318.     JC    GETC4    ;NO MORE CHARACTERS
  319.     STA    IBUFC    ;SAVE NEW COUNT
  320.     MOV    A,M    ;GET CHARACTER
  321.     INX    H    ;INCREMENT POINTER
  322.     SHLD    IBUFP    ;AND SAVE
  323. ;
  324. GETC4    EQU    $+OFFSET
  325.     POP    H    ;RESTORE REGS
  326.     RET
  327. ;
  328. ;--> SEND ASCII MESSAGE UNTIL BINARY ZERO
  329. ;    IS FOUND. POINTER IS D,E
  330. ;
  331. SENDM    EQU    $+OFFSET
  332.     LDAX    D    ;GET BYTE
  333.     ORA    A    ;ZERO?
  334.     RZ        ;YES, DONE
  335.     CALL    OUTT    ;SEND IT
  336.     INX    D    ;POINTER
  337.     JMP    SENDM    ;NEXT
  338. ;
  339. ;--> DUMP MEMORY IN HEXADECIMAL AND ASCII
  340. ;
  341. DUMP    EQU    $+OFFSET
  342.     CALL    RDHLDE    ;RANGE
  343. ;
  344. DUMP2    EQU    $+OFFSET
  345.     CALL    CRHL    ;NEW LINE
  346. ;
  347. DUMP3    EQU    $+OFFSET
  348.     MOV    C,M    ;GET BYTE
  349.     CALL    OUTHX    ;PRINT
  350.     INX    H    ;POINTER
  351.     MOV    A,L    ;MOVE LOW ORDER BYTE
  352.     ANI    0FH    ;LINE END
  353.     JZ    DUMP4    ;YES, ASCII
  354.     ANI    3    ;SPACE
  355.     CZ    OUTSP    ;4 BYTES
  356.     JMP    DUMP3    ;NEXT HEX
  357. ;
  358. DUMP4    EQU    $+OFFSET
  359.     CALL    OUTSP
  360.     PUSH    D
  361.     LXI    D,-10H    ;RESET LINE
  362.     DAD    D
  363.     POP    D
  364. ;
  365. DUMP5    EQU    $+OFFSET
  366.     CALL    PASCI    ;ASCII DUMP
  367.     CALL    TSTOP    ;DONE
  368.     MOV    A,L    ;NO
  369.     ANI    0FH    ;LINE END
  370.     JNZ    DUMP5    ;NO
  371.     JMP    DUMP2
  372. ;
  373. ;--> DISPLAY MEMORY BYTE IN ASCII IF
  374. ;    POSSIBLE, OTHERWISE GIVE DECIMAL PNT
  375. ;
  376. ;
  377. PASCI    EQU    $+OFFSET
  378.     MOV    A,M    ;GET BYTE
  379.     CPI    DEL    ;HIT BIT ON?
  380.     JNC    PASC2    ;YES
  381.     CPI    ' '    ;CONTROL CHARACTER?
  382.     JNC    PASC3    ;NO
  383. ;
  384. PASC2    EQU    $+OFFSET
  385.     MVI    A,'.'    ;CHANGE TO DOT
  386. ;
  387. PASC3    EQU    $+OFFSET
  388.     JMP    OUTT    ;SEND
  389. ;
  390. ;--> GET H,L AND D,E FROM CONSOLE
  391. ;    CHECK THAT D,E IS LARGER
  392. ;
  393. RDHLDE    EQU    $+OFFSET
  394.     CALL    HHLDE
  395. ;
  396. RDHLD2    EQU    $+OFFSET
  397.     MOV    A,E
  398.     SUB    L    ;E - L
  399.     MOV    A,D
  400.     SBB    H    ;D - H
  401.     JC    ERROR1    ;H,L BIGGER
  402.     RET
  403. ;
  404. ;--> INPUT H,L AND D,E. SEE THAT 2
  405. ;    ADDRESSES ARE ENTERED
  406. ;
  407. HHLDE    EQU    $+OFFSET
  408.     CALL    READHL    ;H,L
  409.     JC    ERROR1    ;ONLY 1 ADDR
  410.     XCHG        ;SAVE IN D,E
  411.     CALL    READHL    ;D,E
  412.     XCHG        ;PUT BACK
  413.     RET
  414. ;
  415. ;--> INPUT H,L FROM CONSOLE
  416. ;
  417. READHL    EQU    $+OFFSET
  418.     PUSH    D
  419.     PUSH    B    ;SAVE REGS
  420.     LXI    H,0    ;CLEAR
  421. ;
  422. RDHL2    EQU    $+OFFSET
  423.     CALL    GETCH    ;GET CHARACTER
  424.     JC    RDHL5    ;LINE END
  425.     CALL    NIB    ;TO BINARY
  426.     JC    RDHL4    ;NOT HEX
  427.     DAD    H    ;TIMES 2
  428.     DAD    H    ;TIMES 4
  429.     DAD    H    ;TIMES 8
  430.     DAD    H    ;TIMES 16
  431.     ORA    L    ;ADD NEW CHARACTER
  432.     MOV    L,A
  433.     JMP    RDHL2    ;NEXT
  434. ;
  435. ;--> CHECK FOR BLANK AT END
  436. ;
  437. RDHL4    EQU    $+OFFSET
  438.     CPI    APOS    ;APOSTROPHE
  439.     JZ    RDHL5    ;ASCII INPUT
  440.     CPI    (' '-'0') AND 0FFH
  441.     JNZ    ERROR    ;NO
  442. ;
  443. RDHL5    EQU    $+OFFSET
  444.     POP    B
  445.     POP    D    ;RESTORE
  446.     RET
  447. ;
  448. ;--> CONVERT ASCII CHARACTERS TO BINARY
  449. ;
  450. NIB    EQU    $+OFFSET
  451.     SUI    '0'    ;ASCII BIAS
  452.     RC        ; < 0
  453.     CPI    'F'-'0'+1
  454.     CMC        ;INVERT
  455.     RC        ;ERROR, > F
  456.     CPI    10
  457.     CMC        ;INVERT
  458.     RNC        ;NUMBER 0-9
  459.     SUI    'A'-'9'-1
  460.     CPI    10    ;SKIP : TO
  461.     RET        ;LETTER A-F
  462. ;
  463.  
  464. ;
  465. ;--> START NEW LINE, GIVE ADDRESS
  466. ;
  467. CRHL    EQU    $+OFFSET
  468.     CALL    CRLF    ;NEW LINE
  469. ;
  470. ;  PRINT H,L IN HEX
  471. ;
  472. OUTHL    EQU    $+OFFSET
  473.     MOV    C,H
  474.     CALL    OUTHX    ;H
  475. ;
  476. OUTLL    EQU    $+OFFSET
  477.     MOV    C,L
  478. ;
  479. ;  OUTPUT HEX BYTE FROM C AND A SPACE
  480. ;
  481. OUTHEX    EQU    $+OFFSET
  482.     CALL    OUTHX
  483. ;
  484. ;  OUTPUT A SPACE
  485. ;
  486. OUTSP    EQU    $+OFFSET
  487.     MVI    A,' '
  488.     JMP    OUTT
  489. ;
  490. ;--> OUTPUT A HEX BYTE FROM C
  491. ;    BINARY TO ASCII HEX CONVERSION
  492. ;
  493. OUTHX    EQU    $+OFFSET
  494.     MOV    A,C
  495.     RAR        ;ROTATE
  496.     RAR        ;FOUR
  497.     RAR        ;BITS TO
  498.     RAR        ;RIGHT
  499.     CALL    HEX1    ;UPPER CHARACTER
  500.     MOV    A,C    ;LOWER CHARACTER
  501. ;
  502. HEX1    EQU    $+OFFSET
  503.     ANI    0FH    ;TAKE 4 BITS
  504.     ADI    90H
  505.     DAA        ;DAA TRICK
  506.     ACI    40H
  507.     DAA
  508.     JMP    OUTT
  509. ;
  510. ;--> CHECK FOR END, H,L MINUS D,E
  511. ;    INCREMENT H,L
  512. ;
  513. TSTOP    EQU    $+OFFSET
  514.     INX    H
  515.     MOV    A,E
  516.     SUB    L    ; E - L
  517.     MOV    A,D
  518.     SBB    H    ; D - H
  519.     RNC        ;NOT DONE
  520.     POP    H    ;RAISE STACK
  521.     RET
  522. ;
  523. ;--> ERROR ROUTINES
  524. ;
  525. ERROR    EQU    $+OFFSET
  526.     MVI    A,'?'
  527.     CALL    OUTT    ;OUTPUT IT
  528.     JMP    RESTRT    ;TRY AGAIN
  529. ;
  530. ERROR1    EQU    $+OFFSET
  531.     LXI    D,E1MSG    ;ERROR MESSAGE ADDR
  532.     CALL    SENDM
  533.     JMP    RESTRT
  534. ;
  535. ERROR2    EQU    $+OFFSET
  536.     LXI    D,E2MSG    ;ERROR MSG ADDR
  537.     CALL    SENDM
  538.     JMP    RESTRT
  539. ;
  540. ;--> BACK TO CPM GENTLY
  541. ;
  542. RETCPM    EQU    $+OFFSET
  543.     LHLD    OLDSTK
  544.     SPHL
  545.     RET
  546. ;
  547. ;--> HELP ROUTINE
  548. ;
  549. HELP    EQU    $+OFFSET
  550.     LXI    D,INSTR    ;INSTRUCTIONS ADDRESS
  551.     CALL    SENDM
  552.     JMP    RESTRT
  553. ;
  554. ;--> TOGGLE PRINTER ON
  555. ;
  556. TOGLP    EQU    $+OFFSET
  557.     LDA    PTRTOG
  558.     CMA
  559.     STA    PTRTOG
  560.     JMP    RESTRT
  561. ;
  562. ;--> ROUTINES TO CALL A SUBROUTINE AND TO
  563. ;    'GO' TO ANYPLACE IN THE MEMORY    
  564. ;
  565. GO    EQU    $+OFFSET
  566.     POP    H    ;RAISE STACK
  567. ;
  568. CALLS    EQU    $+OFFSET
  569.     CALL    READHL    ;GET ADDRESS
  570.     PCHL        ;GO THERE
  571. ;
  572. ;--> LOAD HEX OR ASCII CHARACTER INTO MEMORY
  573. ;    APOSTROPHE PERCEEDS ASCII CHAR
  574. ;    CARRIAGE RETRUN PASSES OVER LOCATION
  575. ;
  576. LOAD    EQU    $+OFFSET
  577.     CALL    READHL    ;ADDRESS
  578. ;
  579. LOAD2    EQU    $+OFFSET
  580.     CALL    OUTHL    ;PRINT IT
  581.     CALL    PASCI    ;ASCII
  582.     CALL    OUTSP
  583.     MOV    C,M    ;ORIG BYTE
  584.     CALL    OUTHEX    ;HEX
  585.     PUSH    H    ;SAVE PNTR
  586.     CALL    INPL2    ;INPUT
  587.     CALL    READHL    ; BYTE
  588.     MOV    B,L    ; TO B
  589.     POP    H
  590.     CPI    APOS
  591.     JZ    LOAD6    ;ASCII INPUT
  592.     MOV    A,C    ;HOW MANY
  593.     ORA    A    ;NONE?
  594.     JZ    LOAD3    ;YES
  595. ;
  596. LOAD4    EQU    $+OFFSET
  597.     CALL    CHEKM    ;INTO MEMORY
  598. ;
  599. LOAD3    EQU    $+OFFSET
  600.     INX    H    ;POINTER
  601.     JMP    LOAD2
  602. ;
  603. ;--> LOAD ASCII CHARACTER
  604. ;
  605. LOAD6    EQU    $+OFFSET
  606.     CALL    GETCH
  607.     MOV    B,A
  608.     JMP    LOAD4
  609. ;
  610. ;--> COPY BYTE FROM B TO MEMORY
  611. ;    AND SEE THAT IT GOT THERE
  612. ;
  613. CHEKM    EQU    $+OFFSET
  614.     MOV    M,B    ;PUT IN MEM
  615.     MOV    A,M    ;GET BACK
  616.     CMP    B    ;SAME?
  617.     RZ        ;YES
  618. ;
  619. ERRP    EQU    $+OFFSET
  620.     POP    PSW    ;RAISE STACK
  621. ;
  622. ERRB    EQU    $+OFFSET
  623.     MVI    A,'B'    ;BAD
  624. ;
  625. ERR2    EQU    $+OFFSET
  626.     CALL    OUTT
  627.     CALL    OUTSP
  628.     JMP    OUTHL    ;POINTER
  629. ;
  630. ;--> DISPLAY STACK POINTER REGISTER
  631. ;
  632. REGS    EQU    $+OFFSET
  633.     LXI    H,0
  634.     DAD    SP
  635.     JMP    OUTHL
  636. ;
  637. ;--> FILL A PORTION OF MEMORY
  638. ;
  639. FILL    EQU    $+OFFSET
  640.     CALL    HLDEBC    ;RANGE BYTE
  641.     CPI    APOS    ;APOSTROPHE
  642.     JZ    FILL4    ;YES, ASCII
  643.     MOV    B,C
  644. ;
  645. FILL2    EQU    $+OFFSET
  646.     MOV    A,H    ;FILL BYTE
  647.     CPI    STACK SHR 8 ;TO FAR
  648.     JNC    ERROR    ;YES
  649. ;
  650. FILL3    EQU    $+OFFSET
  651.     CALL    CHEKM    ;PUT, CHECK
  652.     CALL    TSTOP    ;DONE?
  653.     JMP    FILL2    ;NEXT
  654. ;
  655. FILL4    EQU    $+OFFSET
  656.     CALL    GETCH    ;ASCII CHAR
  657.     MOV    B,A
  658.     JMP    FILL3
  659. ;
  660. ;--> GET H,L D,E AND B,C
  661. ;
  662. HLDEBC    EQU    $+OFFSET
  663.     CALL    HLDECK    ;RANGE
  664.     JC    ERROR    ;NO BYTE
  665.     PUSH    H
  666.     CALL    READHL    ;3RD INPUT
  667.     MOV    B,H    ;MOVE TO
  668.     MOV    C,L    ; B,C
  669.     POP    H
  670.     RET
  671. ;
  672. ;--> GET 2 ADDRESSES, CHECK THAT
  673. ;    ADDITIONAL DATA IS INCLUDED
  674. ;
  675. HLDECK    EQU    $+OFFSET
  676.     CALL    HHLDE    ;2ND ADDR
  677.     JC    ERROR1    ;THATS ALL
  678.     JMP    RDHLD2    ;CHECK
  679. ;
  680. ;
  681. ;--> MOVE A BLOCK OF MEMORY  H,L-D,E TO B,C
  682. ;
  683. MOVE    EQU    $+OFFSET
  684.     CALL    HLDEBC    ;3 ADDR
  685. ;
  686. MOVDN    EQU    $+OFFSET
  687.     CALL    MOVIN    ;MOVE CHECK
  688.     CALL    TSTOP    ;DONE?
  689.     INX    B    ;NO
  690.     JMP    MOVDN
  691. ;
  692. MOVIN    EQU    $+OFFSET
  693.     MOV    A,M    ;BYTE
  694.     STAX    B    ;NEW LOCATION
  695.     LDAX    B    ;CHECK
  696.     CMP    M    ;IS IT THERE
  697.     RZ        ;YES
  698.     MOV    H,B    ;ERROR
  699.     MOV    L,C    ;INTO H,L
  700.     JMP    ERRP    ;SHOW BAD
  701. ;
  702. ;--> SEARCH FOR 1 OR 2 BYTES OVER THE
  703. ;    RANGE H,L D,E. BYTES ARE IN B,C
  704. ;    B HAS CARRIAGE RETURN IF ONLY ONE
  705. ;    BYTE. PUT SPACE BETWEEN BYTES IF TWO
  706. ;    FORMAT: [START] [STOP] [BYTE1] [BYTE2]
  707. ;
  708. SEARCH    EQU    $+OFFSET
  709.     CALL    HLDEBC    ;RANGE, 1ST BYTE
  710. ;
  711. SEAR2    EQU    $+OFFSET
  712.     MVI    B,CR    ;SET FOR 1 BYTE
  713.     JC    SEAR3    ;ONLY ONE
  714.     PUSH    H
  715.     CALL    READHL    ;2ND BYTE
  716.     MOV    B,L    ;INTO C
  717.     POP    H
  718. ;
  719. SEAR3    EQU    $+OFFSET
  720.     MOV    A,M    ;GET BYTE
  721.     CMP    C    ;MATCH
  722.     JNZ    SEAR4    ;NO
  723.     INX    H    ;YES
  724.     MOV    A,B    ;ONLY ONE
  725.     CPI    CR
  726.     JZ    SEAR5    ;YES
  727. ;
  728. ;--> FOUND FIRST MATCH, CHECK FOR SECOND
  729. ;
  730.     MOV    A,M    ;NEXT BYTE
  731.     CMP    B    ;MATCH
  732.     JNZ    SEAR4    ;NO
  733. ;
  734. SEAR5    EQU    $+OFFSET
  735.     DCX    H    ;A MATCH
  736.     PUSH    B
  737.     CALL    CRHL    ;SHOW ADDRESS
  738.     POP     B
  739. ;
  740. SEAR4    EQU    $+OFFSET
  741.     CALL    TSTOP    ;DONE?
  742.     JMP    SEAR3    ;NO
  743. ;
  744. ;--> ASCII SUB-COMMAND PROCESSOR
  745. ;
  746. ASCII    EQU    $+OFFSET
  747.     CALL    GETCH    ;NEXT CHAR
  748.     CPI    'D'    ;DISPLAY
  749.     JZ    ADUMP
  750.     CPI    'S'    ;SEARCH
  751.     JZ    ASCS
  752.     CPI    'L'    ;LOAD
  753.     JNZ    ERROR
  754. ;
  755. ;--> LOAD ASCII CHARACTERS INTO MEMORY
  756. ;    QUIT ON CONTROL-X
  757. ;
  758.     CALL    READHL    ;ADDRESS
  759.     CALL    OUTHL    ;PRINT IT
  760. ;
  761. ALOD2    EQU    $+OFFSET
  762.     CALL    INPUTT    ;NEXT CHARACTER
  763.     CALL    OUTT    ;PRINT IT
  764.     MOV    B,A    ;SAVE
  765.     CALL    CHEKM    ;INTO MEMORY
  766.     INX    H    ;POINTER
  767.     MOV    A,L
  768.     ANI    7FH    ;LINE END?
  769.     JNZ    ALOD2    ;NO
  770.     CALL    CRHL    ;NEW LINE
  771.     JMP    ALOD2
  772. ;
  773. ;--> DISPLAY MEMORY IN ASCII.
  774. ;
  775. ADUMP    EQU    $+OFFSET
  776.     CALL    RDHLDE    ;RANGE
  777. ;
  778. ADMP2    EQU    $+OFFSET
  779.     MOV    A,M    ;GET BYTE
  780.     CPI    DEL    ;HIGH BIT ON?
  781.     JNC    ADMP4    ;YES
  782.     CPI    ' '    ;CONTROL?
  783.     JNC    ADMP3    ;NO
  784.     CPI    CR    ;CARRIAGE RETURN
  785.     JZ    ADMP3    ;YES, OK
  786.     CPI    LF    ;LINE FEED
  787.     JZ    ADMP3    ;YES, OK
  788.     CPI    TAB
  789.     JNZ    ADMP4    ;SKIP OTHER
  790.     MVI    A,' '    ;SPACE FOR TAB
  791. ;
  792. ADMP3    EQU    $+OFFSET
  793.     CALL    OUTT    ;SEND
  794. ;
  795. ADMP4    EQU    $+OFFSET
  796.     CALL    TSTOP    ;DONE?
  797.     JMP    ADMP2    ;NO
  798. ;
  799. ;--> SEARCH FOR 1 OR 2 ASCII CHARACTERS
  800. ;    NO SPACE BETWEEN ASCII CHARACTERS
  801. ;    FORMAT [START] [STOP] 1 OR 2 ASCII CHARACTERS
  802. ;
  803. ASCS    EQU    $+OFFSET
  804.     CALL    RDHLDE    ;RANGE
  805.     CALL    GETCH    ;FIRST CHAR
  806.     MOV    C,A
  807.     CALL    GETCH    ;2ND OR CR
  808.     JC    SEAR2    ;ONLY ONE CHARACTER
  809.     MOV    B,A    ;2ND
  810.     JMP    SEAR3
  811. ;
  812. ;--> INPUT FROM PORT
  813. ;
  814. IPORT    EQU    $+OFFSET
  815.     CALL    READHL    ;PORT
  816.     MOV    C,L    ;PORT TO C
  817.     MVI    A,INC    ;IN CODE
  818.     CALL    PUTIO    ;SETUP INPUT
  819.     MOV    L,A
  820.     CALL    OUTLL    ;HEX VALUE
  821. ;
  822. ;--> PRINT L REGISTER IN BINARY (8080 VERSION)
  823. ;
  824. BITS    EQU    $+OFFSET
  825.     MVI    B,8    ;8 BITS
  826. ;
  827. BIT2    EQU    $+OFFSET
  828.     MOV    A,L
  829.     ADD    A    ;SHIFT LEFT
  830.     MOV    L,A
  831.     MVI    A,'0'/2    ;HALF OF 0
  832.     ADC    A    ;DOUBLE+CARRY
  833.     CALL    OUTT    ;PRINT BIT
  834.     DCR    B
  835.     JNZ    BIT2    ;8 TIMES
  836.     RET
  837. ;
  838. ;--> OUTPUT BYTE FROM DESIGNATED PORT 
  839. ;    FORMAT: O,[PORT],[BYTE]
  840. ;
  841. OPORT    EQU    $+OFFSET
  842.     CALL    READHL    ;PORT
  843.     MOV    C,L
  844.     CALL    READHL    ;DATA
  845.     MVI    A,OUTC    ;OUT OPCODE
  846. ;
  847. ;--> I/O ROUTINE AFTER ALAN R. MILLER IN
  848. ;    8080/Z80 ASSEMBLY LANGUAGE TECHNIQUES
  849. ;    FOR IMPROVED PROGRAMING
  850. ;
  851. PUTIO    EQU    $+OFFSET
  852.     STA    PORTN    ;IN OR OUT CODE
  853.     MOV    A,C    ;PORT NUMBER
  854.     STA    PORTN+1
  855.     MVI    A,RETC    ;RET OPCODE
  856.     STA    PORTN+2
  857.     MOV    A,L    ;OUTPUT BYTE
  858.     JMP    PORTN    ;EXECUTE
  859. ;
  860. ;--> HEXADECIMAL MATH,
  861. HMATH    EQU    $+OFFSET
  862.     CALL    HHLDE    ;TWO NUMBERS
  863.     PUSH    H    ;SAVE HL
  864.     DAD    D
  865.     CALL    OUTHL    ;PRINT IT
  866.     POP    H
  867.     MOV    A,L
  868.     SUB    E    ;LOW BYTES
  869.     MOV    L,A
  870.     MOV    A,H
  871.     SBB    D
  872.     MOV    H,A    ;HIGH BYTES
  873.     JMP    OUTHL
  874. ;
  875. ;--> REPLACE ONE HEX BYTE WITH ANOTHER
  876. ;    OVER A GIVEN RANGE
  877. ;    FORMAT: R[START] [STOP] [ORIG] [NEW]
  878. ;
  879. REPL    EQU    $+OFFSET
  880.     CALL    HLDEBC    ;RANGE, 1ST BYTE
  881.     JC    ERROR    ;NO 2ND
  882.     PUSH    H
  883.     CALL    READHL    ;2ND BYTE
  884.     MOV    C,L    ;INTO C
  885.     POP    H
  886. ;
  887. REPL2    EQU    $+OFFSET
  888.     MOV    A,M    ;FETCH BYTE
  889.     CMP    B    ;A MATCH?
  890.     JNZ    REPL3    ;NO
  891.     MOV    M,C    ;SUBSTITUTE
  892.     MOV    A,C
  893.     CMP    M    ;SAME?
  894.     JNZ    ERRB    ;NO, BAD
  895. ;
  896. REPL3    EQU    $+OFFSET
  897.     CALL    TSTOP    ;DONE?
  898.     JMP    REPL2
  899. ;
  900. ;--> COMPARE TWO BLOCKS OF MEMORY
  901. ;    FORMAT: V[1ST BEG.] [1ST END] [2ND BEG]
  902. ;
  903. VERM    EQU    $+OFFSET
  904.     CALL    HLDEBC    ;THREE ADDRESSES
  905. ;
  906. VERM2    EQU    $+OFFSET
  907.     LDAX    B    ;FETCH BYTE
  908.     CMP    M    ;SAME AS OTHER
  909.     JZ    VERM3    ;YES
  910.     PUSH    H    ;DIFFERENT
  911.     PUSH    B
  912.     CALL    CRHL    ;PRINT 1ST POINTER
  913.     MOV    C,M    ;FIRST BYTE
  914.     CALL    OUTHEX    ;PRINT IT
  915.     MVI    A,':'
  916.     CALL    OUTT
  917.     POP    H
  918.     CALL    OUTHL    ;SECOND POINTER
  919.     MOV    C,M    ;2ND BYTE
  920.     CALL    OUTHX    ;PRINT IT
  921.     MOV    C,L    ;RESTORE C
  922.     MOV    B,H    ;AND B
  923.     POP    H    ;AND H,L
  924. ;
  925. VERM3    EQU    $+OFFSET
  926.     CALL    TSTOP    ;DONE?
  927.     INX    B    ;SECOND POINTER
  928.     JMP    VERM2
  929. ;
  930. ;================================================
  931. ;                 Messages
  932. ;================================================
  933. ;
  934. STMSG    EQU    $+OFFSET
  935.     DB    CR,LF
  936.     DB    'NORTH * STAR  Monitor   Version  2.4',CR,LF
  937.     DB    CR,LF
  938.     DB    0
  939. ;
  940. INSTR    EQU    $+OFFSET
  941.     DB    CR,LF
  942.     DB    'ASCII LOAD, DUMP -->A[ L  D  S ] [1ST ADR] [2ND ADR] ',CR,LF
  943.         DB      '      or SEARCH',CR,LF
  944.     DB    'BACK GENTLY      -->B',CR,LF
  945.     DB    'CALL SUBROUTINE  -->C[ADR]',CR,LF
  946.     DB    'DUMP MEMORY      -->D[1ST ADR] [2ND ADR]',CR,LF
  947.     DB    'FILL MEMORY      -->F[1ST ADR] [2ND ADR] [HEX BYTE]',CR,LF
  948.     DB    '                 -->F[1ST ADR] [2ND ADR] ''[ASCII]',CR,LF
  949.     DB    'GO ANYWHERE      -->G[ADR]',CR,LF
  950.     DB    'HEX MATH + -     -->H[1ST HEX] [2ND HEX]',CR,LF
  951.     DB    'INPUT FROM PORT  -->I[PORT NUMBER]',CR,LF
  952.     DB    'LOAD MEMORY      -->L[START ADR]',CR,LF
  953.     DB    '                   ADR BYTE [NEW BYTE]   ^X HALT',CR,LF
  954.     DB    'MOVE MEMORY      -->M[1ST ADR] [2ND ADR] [NEW START]',CR,LF
  955.     DB    'OUTPUT TO PORT   -->O[PORT NUMBER] [BYTE]',CR,LF
  956.     DB    'PRINTER TOGGLE   -->P',CR,LF
  957.     DB    'REPLACE MEMORY   -->R[1ST ADR] [2ND ADR] [TARGET] [BYTE]'
  958.     DB    CR,LF
  959.     DB    'SEARCH FOR BYTE  -->S[1ST ADR] [2ND ADR] [BYTE1] [BYTE2]'
  960.     DB    CR,LF
  961.     DB    'COMMAND TABLE    -->T',CR,LF
  962.     DB    'COMPARE BLOCKS   -->V[1ST ADR] [2ND ADR] [1ST ADR BLOCK2]'
  963.     DB    CR,LF
  964.     DB    'DISP STACK POINT -->X',CR,LF
  965.     DB    CR,LF
  966.     DB    0
  967. ;
  968. E1MSG    EQU    $+OFFSET
  969.     DB    'ADDRESS RANGE ERROR',CR,LF
  970.     DB    0
  971. ;
  972. E2MSG    EQU    $+OFFSET
  973.     DB    'COMMAND ERROR',CR,LF
  974.     DB    0
  975. ;
  976. ;================================================
  977. ;             End of Program
  978. ;================================================
  979. ;
  980. PROEND    EQU    $+OFFSET
  981. SOUEND:    NOP
  982. ;
  983. OLDSTK    EQU    $+OFFSET
  984.     DS    2
  985. ;
  986.     END
  987.