home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / xlook.asm < prev   
Assembly Source File  |  1984-04-29  |  13KB  |  762 lines

  1. .PAGE 80,63
  2. ;DISK EXAMINE/MODIFY UTILITY.
  3. ;    This utility allows the user to examine absolute
  4. ;addresses on a disk.  Additionally he may alter, character by
  5. ;charater, the contents of any given sector.  Entire sectors
  6. ;may be moved from the bufer onto the disk.
  7. ;    All I/O is done through the BIOS for CPM.  There are
  8. ;no calls made to the BDOS.
  9. ;
  10. ;D.A. BARKER, January 1980.
  11. .PABS
  12. .SALL
  13. .OPSYN    .BLKB,DS
  14. .OPSYN    .BYTE,DB
  15. .OPSYN    .WORD,DW
  16. ;
  17. .IDENT    LOOK
  18. .PROGID    EXAM,1,2
  19. ;
  20. ;
  21. ;        *****************
  22. ;        * MISC. EQUATES *
  23. ;        *****************
  24. ;
  25. TEST    =    0
  26. CR    =    0DH
  27. LF    =    0AH
  28. DMADD    =    80H
  29. QUIT    =    0    ;USE CPM ENTRY
  30. ESC    =    1BH
  31. MAXDRV    =    2
  32. NSECS    =    26
  33. MAXGP    =    243
  34. ;
  35. ;        *************************
  36. ;        * I/0 ENTRY DEFINITIONS *
  37. ;        *************************
  38. ;
  39. COUT    =    12    ;THE FOLLOWING ARE BIOS JUMP TABLE
  40. KEYIN    =    9    ; ENTRY POINTS FOR THE VARIOUS
  41. .SETDMA    =    36    ; ROUTINES
  42. .SELDSK    =    27
  43. .SETTRK    =    30
  44. .SETSEC    =    33
  45. .READ    =    39
  46. .WRITE    =    42
  47. ;
  48. ;        **********************
  49. ;        * STRING DEFINITIONS *
  50. ;        **********************
  51. ;
  52. .DEFINE    ST1    =[     -- LOOK -- VERSION 1.3 -- D. A. BARKER  OCT. 21, 1980    ]
  53. .DEFINE    ST2    =[ Drive:]
  54. .DEFINE    ST3    =[         Track:]
  55. .DEFINE ST4    =[          Sector:]
  56. .DEFINE ST4.5    =[          Group:]
  57. .DEFINE    ST5    =[ Display is from:]
  58. .DEFINE    ST6    =[                 Auto-read is:]
  59.  
  60. ;
  61. ;        *********************
  62. ;        * MACRO DEFINITIONS *
  63. ;        *********************
  64. ;
  65. ;    CURSOR ADDRESSING
  66. ;    This routine should produce the sequence of characters
  67. ;necessary to position the cursor.  The third parameter should
  68. ;not require alteration.
  69. ;
  70. .DEFINE        XY [ROW,COL,Z(0)]  =
  71.         [
  72.         DB    ROW,COL
  73.         .IFE Z, DB 0
  74.         ]
  75. ;
  76. ;    INVERTING A STRING VALUE
  77. ;    This routine sets the MSB of each character of the
  78. ;argument string.  This is used for inverse video when the
  79. ;IObyte has been altered to accept inverse video rather than
  80. ;xy-addressing
  81. ;
  82. ;    I/O FUNCTIONS
  83. ;    Setup and do a BIOS function (FUNC).
  84. ;
  85. .DEFINE        GODO [FUNC]  =
  86.         [
  87.         PUSH    H
  88.         PUSH    D
  89.         LXI    D,FUNC
  90.         CALL    IOCALL
  91.         POP    D
  92.         POP    H
  93.         ]
  94. ;
  95. .DEFINE        TYPE  =  [CALL TYPEX]
  96. ;        
  97. .DEFINE        PRINT  =  [CALL PRNTMSG]
  98. ;
  99. .DEFINE        XYPR    =  [CALL POSPR]
  100. ;
  101. ;    GETKEY will set the zero flag if an Escape is typed.
  102. ;
  103. .DEFINE        GETKEY    =  [CALL GK]
  104. ;
  105. ;  THE MAIN PROGRAM BEGINS
  106. ;
  107. .LOC    0100H    ;MAKE IT A CPM TRANSIENT
  108. ;
  109. EXAM:
  110. INIT:    LXI    B,DMADD    ;THIS WILL NEVER CHANGE
  111.     GODO .SETDMA
  112.     LXI    H,100H
  113.     SHLD    DSKTBL
  114.     LXI    D,DSKTBL+2
  115.     LXI    H,DSKTBL
  116.     LXI    B,10
  117.     LDIR        ;INITIALIZE VARIOUS POINTERS
  118. ;
  119.     LXI    H,DMADD
  120.     MVI    M,0
  121.     LXI    D,DMADD+1
  122.     LXI    B,127
  123.     LDIR        ;CLEAR THE BUFFER AREA
  124. ;
  125. CLEAR:    CALL    CLRSC
  126. ;
  127.     CALL    WHITE    ;INVERT THE VIDEO
  128.     PRINT
  129.     .ASCII    ST1        ;PRINTING THE HEADER
  130.     DB    CR,LF        ;BLOCK AND STATUS DISPLAYS
  131.     .ASCII    ST2
  132.     .ASCII    ST3
  133.     .ASCII    ST4
  134.     .ASCII    ST4.5
  135.     .ASCII    /       /
  136.     DB    CR,LF
  137.     .ASCII    ST5
  138.     .ASCII    ST6
  139.     .ASCII    /               /
  140.     DB    0
  141.     CALL    BLACK    
  142. REENT:    LXI    SP,STACK    ;ENTRY HERE WILL UPDATE ALL
  143.     XYPR            ; STATUS DISPLAYS
  144.     XY [1,@ST2]
  145.     LHLD    DRIVE
  146.     MVI    A,'A'
  147.     ADD    L
  148.     TYPE
  149.     XYPR
  150.     XY [1,@ST2+@ST3]
  151.     MVI    H,0
  152.     DAD    H
  153.     LXI    D,DSKTBL
  154.     DAD    D
  155.     MOV    A,M
  156.     CALL    HEXOUT
  157.     XYPR
  158.     XY [1,@ST2+@ST3+@ST4]
  159.     INX    H
  160.     MOV    A,M
  161.     CALL    HEXOUT
  162. ;
  163.     XYPR
  164.     XY [1,@ST2+@ST3+@ST4+@ST4.5]
  165.     PUSH    H
  166.     MOV    A,M
  167.     LXI    H,GPTBL+NSECS
  168.     LXI    B,NSECS
  169.     CCDR        ;BC NOW CONTAINS LOGICAL SECTOR #
  170.     POP    H
  171.     DCX    H
  172.     MOV    L,M
  173.     MVI    H,0
  174.     DCR    L
  175.     DCR    L    ;TRACK-2
  176.     JP    .VALID    ;JMP IF TRACK > 1
  177.     PRINT
  178.     .ASCIZ /SYS*/
  179.     JMPR    .NTV
  180. ; NOW MULTIPLY HL BY 26
  181. .VALID:    DAD    H    ;X2
  182.     PUSH    H
  183.     POP    D
  184.     DAD    H    ;X4
  185.     DAD    H    ;X8
  186.     XCHG
  187.     DAD    D
  188.     XCHG        ;DE IS NOW X10
  189.     DAD    H    ;X16
  190.     DAD    D    ;X26
  191.     DAD    B    ;HL NOW THE TOTAL SECTOR NUMBER
  192.             ;NOW DIVIDE BY 8
  193.     MOV    A,L
  194.     ANI    0F8H
  195.     ORA    H
  196.     RRC
  197.     RRC
  198.     RRC
  199.     CALL    HEXOUT
  200.     MVI    A,':'
  201.     TYPE
  202.     MOV    A,L    ;GET REMAINDER
  203.     ANI    7
  204.     ADI    '1'    ;ADD ASCII BIAS & INCREMENT
  205.     TYPE
  206. ;
  207. .NTV:    LDA    AUTONO
  208.     ORA    A    ;CHECK FOR AUTO-READ
  209.     JNZ    RDSK    ;JUMP IF AUTO-READ
  210. ;
  211.     XYPR
  212.     XY [2,@ST5,1]
  213.     .ASCIZ    / BUFFER/
  214.     JMPR    LP
  215. RDRTN:    XYPR            ;EVERY DISK READ OR WRITE WILL
  216.     XY [2,@ST5,1]        ; RETURN HERE AND UPDATE THE 
  217.     .ASCIZ    / DISK  /    ; SECOND STATUS LINE
  218. LP:    LXI    H,AUTONO
  219.     XYPR
  220.     XY [2,@ST5+@ST6]
  221.     MOV    A,M
  222.     ORA    A
  223.     JRZ    ..OFF
  224.     PRINT
  225.     .ASCIZ    / ON /
  226.     JMPR    ..ON
  227. ..OFF:    PRINT
  228.     .ASCIZ    / OFF/
  229. ..ON:    CALL    SPIT     ;SPIT THE BUFFER ONTO THE SCREEN
  230. ;
  231. ;        *********************
  232. ;        * COMMAND PROCESSOR *
  233. ;        *********************
  234. ;
  235. GETCOM:    XYPR
  236.     XY [15,0]
  237.     CALL    ERAL    ;ERASE THE PROMPT LINE
  238.     GETKEY        ;GET THE COMMAND CHARACTER
  239.     LXI    H,CMDADD-1
  240.     LXI    B,CMDADD-CMDTBL+1
  241.     CCDR        ;SCAN THE TABLE BACKWARDS
  242.     LXI    H,CMDADD
  243.     DAD    B
  244.     DAD    B    ;HL NOW POINTS TO THE ROUTINE'S ADDRESS
  245.     MOV    E,M
  246.     INX    H
  247.     MOV    D,M
  248.     PUSH    D    ;SO A 'RET' WILL GO TO THE ROUTINE
  249. SETUP:    LHLD    DRIVE
  250.     MOV    C,L
  251.     MVI    H,0
  252.     DAD    H
  253.     LXI    D,DSKTBL
  254.     DAD    D    ;HL POINT TO CURRENT DISK'S TRACK LOC.
  255.     LXI    D,0
  256.     RET        ;GO EXECUTE THE CHOSEN ROUTINE
  257. ;
  258. ;        *********************
  259. ;        * THE COMMAND TABLE *
  260. ;        *********************
  261. ;
  262. CMDTBL:    .ASCII    /DTSIO+-GNLRWAHCQM?/[3]
  263. CMDADD:    DW    INFO,SELDRV,SELTRK,SELSEC,STPIN
  264.     DW    STPOUT,NXSEC,LSTSEC,GROUP,NXGP
  265.     DW    LSTGP,READ,WRITE,ASC,HXCMD
  266.     DW    CLEAR,QUIT,MODE,INFO,QUIT
  267. ;
  268. SELDRV:    CALL    ERAL
  269.     PRINT
  270.     .ASCIZ /DRIVE NUMBER?/
  271.     MVI    E,0    ;FOR THE GHX ROUTINE
  272.     CALL    GHX
  273.     CPI    MAXDRV
  274.     JRNC    SELDRV
  275.     STA    DRIVE
  276.     JMP    REENT
  277. ;
  278. SELTRK:    CALL    ERAL
  279.     PRINT
  280.     .ASCIZ    /DESIRED TRACK?/
  281.     CALL    GETHEX
  282.     CPI    77    ;MAXIMUM TRACK NUMBER + 1
  283.     JRNC    SELTRK
  284.     MOV    M,A
  285.     JMP    REENT
  286. ;
  287. SELSEC:    CALL    ERAL
  288.     PRINT
  289.     .ASCIZ    /DESIRED SECTOR?/
  290.     CALL    GETHEX
  291.     ORA    A
  292.     JRZ    SELSEC
  293.     CPI    NSECS+1
  294.     JRNC    SELSEC
  295.     INX    H    ;POINT TO CURRENT DRIVE'S SECTOR LOC.
  296.     MOV    M,A
  297.     JMP    REENT
  298. ;
  299. NXSEC:    INX    H
  300.     MOV    A,M
  301.     INR    A
  302.     CPI    NSECS+1
  303.     JRNC    ..NXT
  304.     MOV    M,A
  305.     JMP    REENT    ;STAY ON SAME TRACK
  306. ..NXT:    MVI    A,1
  307.     MOV    M,A
  308.     DCX    H    ;POINT TO CURRENT TRACK LOCATION
  309.     JMPR    STPIN
  310. ;
  311. LSTSEC:    INX    H
  312.     MOV    A,M
  313.     DCR    A
  314.     ORA    A
  315.     JRZ    ..LST
  316.     MOV    M,A
  317.     JMP    REENT    ;STAY ON THE SAME TRACK
  318. ..LST:    ADI    26
  319.     MOV    M,A
  320.     DCX    H    ;POINT TO CURRENT TRACK LOCATION
  321.     JMPR    STPOUT
  322. ;
  323. NXGP:    INX    H    ;GET PRESENT SECTOR #
  324.     MOV    A,M    
  325.     LXI    B,NSECS
  326.     XCHG        ;PUT SECTOR TABLE POINTER IN DE
  327.     LXI    H,GPTBL+1 ;POINT TO 2ND ENTRY OF THIS TABLE
  328.     CCIR        ;SEARCH FOR THE PRESENT SECTOR
  329.     MOV    A,M    ;GET THE NEXT SECTOR
  330.     XCHG        ;POINT HL TO THE TABLE
  331.     MOV    M,A
  332.     JPE    REENT    ;ODD PARITY MEANS END OF TABLE
  333.     DCX    H
  334. STPIN:    MOV    A,M
  335.     CPI    76    ;MAXIMUM TRACK NUMBER
  336.     JNC    REENT
  337.     INR    M
  338.     JMP    REENT
  339. ;
  340. LSTGP:    INX    H
  341.     MOV    A,M
  342.     LXI    B,NSECS
  343.     XCHG
  344.     LXI    H,GPTBL+NSECS
  345.     CCDR
  346.     MOV    A,M
  347.     XCHG
  348.     MOV    M,A
  349.     JPE    REENT
  350.     DCX    H
  351. STPOUT:    MOV    A,M
  352.     ORA    A
  353.     JZ    REENT
  354.     DCR    M
  355.     JMP    REENT
  356. ;
  357. ;        *********************
  358. ;        * SECTOR SKEW TABLE *
  359. ;        *********************
  360. ;    Assuming a sector interleave of 6 sectors
  361. ;
  362. GPTBL:    DB    22,1,7,13,19,25,5,11,17
  363.     DB    23,3,9,15,21,2,8,14,20
  364.     DB    26,6,12,18,24,4,10,16,22,1
  365. ;
  366. GROUP:    CALL    ERAL
  367.     PRINT
  368.     .ASCIZ    /GROUP NUMBER?/
  369.     CALL    GETHEX
  370.     CPI    MAXGP+1
  371.     JRNC    GROUP
  372.     MVI    A,0FFH
  373.     XCHG        ;HL CONTAIN THE GROUP NUMBER
  374.     DAD    H    ;MULTIPLY # BY 8
  375.     DAD    H
  376.     DAD    H
  377.     LXI    B,-NSECS
  378. ..AGN:    INR    A    ;DIVIDE THE # BY NSECS
  379.     DAD    B
  380.     JRC    ..AGN
  381.     ADI    2    ;QUOTIENT PLUS 2 IS NEW TRACK #
  382.     STAX    D    
  383.     DSBC    B    ;HL IS THE LOGICAL SECTOR NUMBER
  384.     LXI    B,GPTBL+1
  385.     DAD    B    ;(HL) IS NOW THE PHYSICAL SECTOR #
  386.     MOV    A,M
  387.     INX    D
  388.     STAX    D
  389.     JMP    REENT
  390. ;
  391. MODE:    LDA    AUTONO    ;TOGGLE THE AUTO-READ MODE
  392.     INR    A
  393.     ANI    1
  394.     STA    AUTONO
  395.     JNZ    RDSK
  396.     JMP    RDRTN
  397. ;
  398. ASC:    CALL    ERAL
  399.     PRINT
  400.     .ASCIZ    /ASCII BYTE NUMBER?/
  401.     CALL    GETHEX
  402.     CPI    80H
  403.     JRNC    ASC
  404. ..AGN:    CALL    MCUR    ;Position the cursor on the screen.
  405.     CALL    ACUR
  406.     CALL    MCUR0
  407.     JRNC    ..AGN
  408.     MOV    M,A    ;Update the DMA buffer.
  409.     MVI    C,1    ;Ready to advance by one.
  410.     CALL    RESTO
  411.     JMPR    ..AGN
  412. ;
  413. HXCMD:    CALL    ERAL
  414.     PRINT
  415.     .ASCIZ    /HEX BYTE NUMBER?/
  416.     CALL    GETHEX
  417.     CPI    80H
  418.     JRNC    HXCMD
  419. ..AGN:    CALL    MCUR
  420.     CALL    HCUR
  421.     CALL    MCUR0
  422.     JRNC    ..AGN
  423.     CALL    HEXFIL
  424.     MVI    C,0
  425.     JRZ    ..FWD
  426.     MOV    M,A
  427.     INR    C
  428. ..FWD:    CALL    RESTO
  429.     JMPR    ..AGN
  430. ;
  431. MCUR:    MOV    E,A    ;THE CURSOR POINTER
  432.     MVI    D,0
  433.     LXI    H,DMADD
  434.     DAD    D    ;HL TO THE CP IN THE BUFFER
  435.     CALL    HCUR    ;POSITION THE HEX CURSOR
  436.     CALL    BTYPE
  437.     CALL    BTYPE
  438.     CALL    ACUR    ;THE ASCII CURSOR
  439.     JMP    BTYPE
  440. MCUR0:    GETKEY
  441.     JZ    GIT    ;LEAVE ON AN 'ESC'
  442.     MVI    C,-1
  443.     CPI    'H'-40H    ;MOVE LEFT?
  444.     RC
  445.     JRZ    RESTO
  446.     MVI    C,10H
  447.     CPI    'J'-40H
  448.     RC
  449.     JRZ    RESTO
  450.     MVI    C,1
  451.     CPI    'L'-40H
  452.     JRZ    RESTO
  453.     CMC
  454.     RC
  455.     MVI    C,-10H
  456. RESTO:    PUSH    B
  457.     CALL    RS
  458.     POP    B
  459.     MOV    A,E
  460.     ADD    C
  461.     ANI    7FH    ;INSURE IN SECTOR
  462.     RET
  463. ;
  464. RS:    CALL    HCUR
  465.     MOV    A,M
  466.     CALL    HEXOUT
  467.     CALL    ACUR
  468.     MOV    A,M
  469.     ANI    7FH
  470.     CPI    20H
  471.     JRNC    ..FW
  472.     MVI    A,'.'
  473. ..FW:    CPI    0FFH
  474.     JRNZ    ..AGN
  475.     MVI    A,'.'
  476. ..AGN:    TYPE
  477.     RET
  478. ;
  479. HCUR:    PUSH    D
  480.     MOV    A,E
  481.     RRC
  482.     RRC
  483.     RRC
  484.     RRC
  485.     ANI    0FH
  486.     ADI    5
  487.     MOV    D,A
  488.     MOV    A,E
  489.     ANI    0FH
  490.     RLC
  491.     MOV    E,A
  492.     CALL    DEXY
  493.     MOV    A,D
  494.     POP    D
  495.     MOV    D,A
  496.     RET
  497. ACUR:    PUSH    D
  498.     MOV    A,E
  499.     ANI    0FH
  500.     ADI    24H
  501.     MOV    E,A
  502.     CALL    DEXY
  503.     POP    D
  504.     RET
  505. ;
  506. GIT:    CALL    RS
  507.     LXI    H,0
  508.     SHLD    AUTONO
  509.     JMP    REENT
  510. ;
  511. HEXFIL:    CALL    HEXIT
  512.     RZ
  513.     MOV    B,A
  514. ..AGN:    GETKEY
  515.     RZ
  516.     CPI    CR
  517.     JRZ    ..XIT
  518.     CALL    HEXIT
  519.     JRC    ..AGN
  520.     RLCR    B
  521.     RLCR    B
  522.     RLCR    B
  523.     RLCR    B
  524.     ORA    B
  525.     MOV    B,A
  526.     XRA    A
  527.     INR    A    ;JUST TO CLEAR Z-FLAG
  528. ..XIT:    MOV    A,B
  529.     RET
  530. ;
  531. RDSK:    CALL    SETUP
  532. READ:    CALL    IOSET
  533.     XYPR
  534.     XY [13,0]
  535.     GODO    .READ
  536. .IFN    TEST,    [
  537.     ORA    A
  538.     JZ    RDRTN
  539.     XYPR
  540.     XY [15,0,1]
  541.     .ASCIZ / ERROR ON READ!! /
  542.     GETKEY ]
  543.     JMP    RDRTN
  544. WRITE:    CALL    IOSET
  545.     XYPR
  546.     XY [13,0]
  547.     GODO    .WRITE
  548.     JMP    RDRTN
  549.  
  550. IOSET:    GODO    .SELDSK
  551.     MOV    C,M
  552.     GODO    .SETTRK
  553.     INX    H
  554.     MOV    C,M
  555.     GODO    .SETSEC
  556.     RET
  557. ;
  558. INFO:    CALL    CLRSC        ;SPLASH THE HELP TEXT TO THE SCREEN
  559.     XYPR
  560.     XY    [0,24,1]
  561.     .ASCII    /COMMAND SUMMARY/[CR][LF]
  562.     .ASCII    /D: select Drive (0,1,2,3)       /
  563.     .ASCII    /R: Read the current sector/[CR][LF]
  564.     .ASCII    /T: select Track (0 - 4C)       /
  565.     .ASCII    /W: Write buffer to disk/[CR][LF]
  566.     .ASCII    /S: select Sector (1 - 26)       /
  567.     .ASCII    /M: toggle the auto-read Mode/[CR][LF]
  568.     .ASCII    /I: step In               /[CR][LF]
  569.     .ASCII    /O: step Out                  /
  570.     .ASCII    /A: ASCII fill the buffer/[CR][LF]
  571.     .ASCII    /                   /
  572.     .ASCII    /H: Hex fill the buffer/[CR][LF]
  573.     .ASCII    /+: next physical sector       /[CR][LF]
  574.     .ASCII    /-: last physical sector        /
  575.     .ASCII    /^H: move cursor left/[CR][LF]
  576.     .ASCII    /                   /
  577.     .ASCII    /^L: move cursor right    /[CR][LF]
  578.     .ASCII    /The following 3 commands       /
  579.     .ASCII    /^J: move cursor down    /[CR][LF]
  580.     .ASCII    /assume sector interleave of 6       /
  581.     .ASCII    /^K: move cursor up    /[CR][LF]
  582.     .ASCII    /G: Group selection           /
  583.     .ASCII    /C: re-initialize the screen    /[CR][LF]
  584.     .ASCII    /N: Next logical sector           /
  585.     .ASCII    /Q: exit to CPM/[CR][LF]
  586.     .ASCII    /L: Last logical sector           /
  587.     .ASCII    /^C:  "   "  "/[CR][LF][0]
  588.     XYPR
  589.     XY [15,17,1]
  590.     .ASCIZ    /Esc: general command Escape./
  591.     GETKEY
  592.     JMP    CLEAR
  593.  
  594. ;
  595. ;        *********************
  596. ;        * MISC. SUBROUTINES *
  597. ;        *********************
  598. ;
  599. ;
  600. IOCALL:    LHLD    1    ;PICK UP THE BASE OF THE BIOS
  601.     MVI    L,0
  602.     DAD    D
  603.     PCHL        ;GO TO THE REQUESTED ROUTINE
  604. ;
  605. BTYPE:    MVI    A,'_'
  606. TYPEX:    MOV    C,A
  607.     GODO [COUT]
  608.     RET
  609. ;
  610. POSPR:    XTHL
  611.     MOV    D,M
  612.     INX    H
  613.     MOV    E,M
  614.     CALL    DEXY
  615.     JMPR    POSPR1
  616. PRNTMSG: XTHL
  617.     MOV    A,M
  618. ZAGN:    TYPE
  619. POSPR1:    INX    H
  620.     MOV    A,M
  621.     ORA    A
  622.     JRNZ    ZAGN
  623.     INX    H
  624.     XTHL
  625.     RET
  626. ;
  627. HEXOUT:    PUSH    B    ;SAVE BC
  628.     MVI    B,1    ;ITERATION COUNT
  629.     MOV    C,A
  630.     RAR
  631.     RAR
  632.     RAR
  633.     RAR
  634. ..AGN:    ANI    0FH
  635.     PUSH    B
  636.     ADI    '0'
  637.     CPI    '9'+1
  638.     JRC    ..OUT
  639.     ADI    7
  640. ..OUT:    TYPE
  641.     POP    B
  642.     DCR    B
  643.     JRNZ    ..DUN
  644.     MOV    A,C
  645.     JMPR    ..AGN
  646. ..DUN:    POP    B
  647.     RET
  648. ;
  649. ;    READ HEX VALUES IN FROM THE KEYBOARD
  650. ;
  651. GETHEX:    GETKEY
  652.     JZ    REENT
  653.     CALL    HEXIT
  654.     JRC    GETHEX
  655.     MOV    E,A
  656.     MOV    A,C
  657.     TYPE
  658. GHX:    GETKEY
  659.     JZ    REENT
  660.     CPI    CR
  661.     JRZ    ..EX
  662.     CALL    HEXIT
  663.     JRC    GHX
  664.     RLCR    E
  665.     RLCR    E
  666.     RLCR    E
  667.     RLCR    E
  668.     ORA    E
  669.     MOV    E,A
  670.     MOV    A,C
  671.     TYPE
  672. ..EX:    MOV    A,E
  673.     RET
  674. ;
  675. ;    CONVERT THE CONTENTS OF THE ACCUMULATOR TO
  676. ;    HEXIDECIMAL. SET CARRY ON ILLEGAL CHARACTERS
  677. ;
  678. HEXIT:    MOV    C,A
  679.     SUI    30H
  680.     RC
  681.     CPI    0AH
  682.     CMC
  683.     RNC
  684.     SUI    7
  685.     CPI    0AH
  686.     RC
  687.     CPI    10H
  688.     CMC
  689.     RET 
  690. GK:    GODO    KEYIN
  691.     CPI    ESC
  692.     RET
  693. ;
  694. ;        **************************************
  695. ;        * DISPLAY THE CONTENTS OF THE BUFFER *
  696. ;        **************************************
  697. ;
  698. SPIT:    XYPR
  699.     XY    [5,0]
  700.     LXI    H,DMADD
  701.     MVI    B,8    ;FOR 8 ROWS OF INFO
  702.     PUSH    H
  703. ..BGN:    MVI    C,10H    ;FOR 16 COLUMNS OF INFO
  704.     LXI    H,..BUF
  705.     XTHL        ;HL TO BUFFER AND STACK TO ..BUF
  706. ..AGN:    MOV    A,M
  707.     CALL    HEXOUT  
  708.     MOV    A,M
  709.     ANI    7FH
  710.     CPI    7FH
  711.     JRZ    ..BD
  712.     CPI    ' '
  713.     JRNC    ..OK
  714. ..BD:    MVI    A,'.'
  715. ..OK:    XTHL        ;GET THE ..BUF POSITION.
  716.     MOV    M,A
  717.     INX    H
  718.     XTHL
  719.     INX    H    ;ADVANCE IN THE BUFFER
  720.     DCR    C    ;SEE IF THERE IS MORE ON THIS LINE
  721.     JRNZ    ..AGN
  722.     XTHL
  723.     PRINT
  724.     .ASCII    /    /
  725. ..BUF:    DS    10H
  726.     DB    CR,LF,0
  727.     DCR    B    ;MORE FROM THIS SECTOR?
  728.     JRNZ    ..BGN
  729.     POP    H
  730.     RET
  731. DSKTBL:    DS    8    ;ROOM ENOUGH FOR 4 DRIVES
  732. DRIVE:    DS    1    ;CURRENT DRIVE
  733. AUTONO:    DS    1    ;AUTO OR MANUAL READ
  734.     DS    32
  735. STACK:    DS    1
  736. CLRSC:    PRINT
  737.     .ASCIZ    [ESC]/E/[0][0]
  738.     RET
  739. BLACK:    PRINT
  740.     .ASCIZ    [ESC]/q/[0][0]
  741.     RET
  742. WHITE:    PRINT
  743.     .ASCIZ    [ESC]/p/[0][0]
  744.     RET
  745. ERAL:    PRINT
  746.     .ASCIZ    [CR][ESC]/l/[0][0]
  747.     RET
  748. DEXY:    MVI    A,ESC
  749.     TYPE
  750.     MVI    A,'Y'
  751.     TYPE
  752.     MOV    A,D    ;THE ROW NUMBER
  753.     ADI    20H
  754.     TYPE
  755.     MOV    A,E    ;THE COLUMN NUMBER
  756.     ADI    20H
  757.     TYPE
  758.     RET
  759. .END    EXAM
  760.  
  761.