home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug040.ark / DU.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  25.7 KB  |  1,698 lines

  1. ;DISK UTILITY -    By Ward Christensen
  2. ;DU.ASM    V3.0    EDIT 10
  3. ;
  4. ;    8/6/78
  5. ;ORIGINALLY WRITTEN TO RECONSTRUCT BLOWN
  6. ;DISKS ON CBBS VIA REMOTE ACCESS
  7. ;
  8. ;        ----------------
  9. ;Sorry for the lack of comments in the code 
  10. ;portion of this program - it was just hacked
  11. ;together to satisfy my needs, but lots of
  12. ;other people found it useful.  Its external
  13. ;documentation is good, but its sadly lacking
  14. ;comments on the instructions.
  15. ;        ----------------
  16. ;
  17. ;    11/12/78 WLC
  18. ;ADD LOGIN COMMAND
  19. ;
  20. ;    11/26/78 WLC
  21. ;ADD DISK # TO LOGIN COMMAND
  22. ;
  23. ;    02/25/79 WLC
  24. ;PUT SECTOR READ INTO "S" COMMAND
  25. ;
  26. ;    10/10/79 WLC
  27. ;SAVE REGS IN BIOS CALLS
  28. ;TRANSLATE INPUT TO UPPER CASE
  29. ;ADD COMMANDS:     < SAVE SECTOR
  30. ;        > RESTORE SECT
  31. ;        / REPEAT
  32. ;ALLOW CHANGE FROM-THRU
  33. ;
  34. ;    01/06/80 WLC
  35. ;REWRITE "F" COMMAND
  36. ;
  37. ;    01/07/79
  38. ;ADD VIEW COMMAND
  39. ;
  40. ;    01/08/80
  41. ;REPOSITION AFTER "M" COMMAND
  42. ;
  43. CR    EQU    0DH
  44. LF    EQU    0AH
  45. TAB    EQU    09H
  46. ;
  47. ;Any valid command string may be placed as an
  48. ;operand of the original DU command, i.e.:
  49. ;
  50. ;    DU G0;D;G2;=OK<D><A><1A>;D
  51. ;
  52. ;Functions supported:
  53. ;
  54. ;    Tnn    Seek to track nn (no read)
  55. ;    Snn    Position to sector nn, and read
  56. ;    Gnn    Position to group nn and read.
  57. ;    G    Shows current position
  58. ;    V    Views the current sector.
  59. ;        (assumes ASCII data)
  60. ;    Vnn    Views nn sectors
  61. ;    Fname    print directory for file "name",
  62. ;        then positions to it's directory 
  63. ;        sector.
  64. ;
  65. ;    =string    Ascii search, starting at current
  66. ;        sector.  <xx> hex may be imbedded,
  67. ;        or used alone:  To find "IN 0FEH":
  68. ;        =<db><fe>
  69. ;
  70. ;    L    Re-logs in the current disk. You may pull
  71. ;        out a disk, put in a new, and "L" just
  72. ;        to log it in (prevents     CP/M 1.4
  73. ;        from getting R/O errors). (hmmm, on second
  74. ;        thought, I'm not doing any BDOS calls
  75. ;        anyway, so no R/O errors COULD occur..
  76. ;        owell, better safe than sorry)
  77. ;
  78. ;    Lx    Logs in disk 'x', such as: LB
  79. ;
  80. ;    D    Dump sector, hex + ASCII
  81. ;    A    Dump sector, ASCII only
  82. ;    H    Dump sector, hex only
  83. ;
  84. ;note all dump commands (D, A, H) may be optionally
  85. ;    followed by a starting and ending address:
  86. ;    D0,7F  is the same as just D
  87. ;    D3,5
  88. ;    A20,3F
  89. ;
  90. ;    CHaddr,val,val,val... change hex in sector
  91. ;    CAaddr,char string... change ASCII in sector
  92. ;        NOTE that <xx> may be hex imbedded
  93. ;        in the Ascii:  ca0,OK<d><a><1a>
  94. ;
  95. ;        ----> Use W to write changes to disk.
  96. ;        Note that the C command echoes
  97. ;        the overlaid data for verification.
  98. ;
  99. ;    CHaddr-addr,byte
  100. ; or    CAaddr-addr,byte    repeats a change
  101. ;
  102. ;    #    (Used by Ward to set the sector
  103. ;        order table to 1,2,3,4,5...
  104. ;        for my strange disks)
  105. ;
  106. ;    +    advance 1 sector (if below track 2,
  107. ;        this advances to next numerical, if
  108. ;        2 or >, advances based on CP/M's normal
  109. ;        sector scrambling algorithm, i.e. so +
  110. ;        will get the next logical sector of the file
  111. ;
  112. ;    -    backs up 1 logical sector
  113. ;
  114. ;        note + and - may take an amount:
  115. ;        for example, +F steps in 15 sectors
  116. ;
  117. ;    ?    Gives command summary
  118. ;
  119. ;    M    Dumps a map of the group allocations
  120. ;        for files.
  121. ;    Mn    Shows which file is allocated to
  122. ;        group "n".
  123. ;
  124. ;    R    Reads the sector currently positioned to
  125. ;        into memory.  Note R (Read) is implicit in
  126. ;        the G, +, and - commands, but N-O-T in the
  127. ;        S and T commands (I did it because I was
  128. ;        tired of disk reading after T command before
  129. ;        I had a chance to issue the S command)
  130. ;
  131. ;    W    Write back the current sector (N-O-T-E may
  132. ;        not be used after an F command, as CP/M was
  133. ;        used to find the file in the directory
  134. ;
  135. ;    X    Exit back to CP/M (Must press return).  Ctl-c
  136. ;        was too easy to hit over modem lines, so I
  137. ;        decided on 2-byte (X, CR) to exit.
  138. ;
  139. ;    P    Toggle printer switch on/off
  140. ;
  141. ;    Z    Sleep - causes the program to pause, such
  142. ;        as to look at a dump.  Z is 1 sec.  Znn
  143. ;        is nn tenths of a second on a 2 MHz 8080.
  144. ;
  145. ;    <    Saves current sector in a save buffer
  146. ;
  147. ;    >    Gets saved buffer.  < and > may be used
  148. ;        to move a sector to another place.
  149. ;
  150. ;    /    Repeats entire command.  Defaults
  151. ; or    /nn    to "forever".  NN may be 2 to 254
  152. ;
  153. ;multiple commands may be separated by ";"
  154. ;
  155. ;Example: the following commands will erase the
  156. ;    b disk directory to all E5's:
  157. ;
  158. ;    lb            log in b drive
  159. ;    g0            position to dir.
  160. ;    ch0-7f,e5        fill with e5
  161. ;    <            save the sector
  162. ;    >;w;+;/16        restore, write, next,
  163. ;                repeat 16       
  164. ;
  165. ;----This could be shortened to:
  166. ;
  167. ;    lb;g0;ch0-7f,e5;<
  168. ;    >;w;+;/16
  169. ;
  170.     ORG    100H
  171.     LXI    SP,STACK ;EXITS VIA JMP 0
  172. ;SET UP LOCAL JMPS TO BIOS
  173.     LHLD    1    ;WARM BOOT POINTER
  174.     LXI    D,3
  175.     DAD    D    
  176.     SHLD    VCONST+1
  177.     DAD    D
  178.     SHLD    VCONIN+1
  179.     DAD    D
  180.     SHLD    VCONOUT+1
  181.     DAD    D    ;LIST
  182.     SHLD    VLIST+1
  183.     DAD    D    ;PUNCH
  184.     DAD    D    ;RDR
  185.     DAD    D
  186.     SHLD    VHOME+1
  187.     DAD    D    ;SEL DISK
  188.     DAD    D
  189.     SHLD    VSETTRK+1
  190.     DAD    D
  191.     SHLD    VSETSEC+1
  192.     DAD    D
  193.     SHLD    VSETDMA+1
  194.     DAD    D
  195.     SHLD    VREAD+1
  196.     DAD    D
  197.     SHLD    VWRITE+1
  198.     CALL    ILPRT
  199.     DB    'DISK UTILITY (DU) V3.0 01/07/80',CR,LF
  200.     DB    CR,LF,'Type ? for help'
  201.     DB    CR,LF,'Type X to exit'
  202.     DB    CR,LF,0
  203.     LXI    H,80H    ;TO INPUT BUFF
  204.     MOV    A,M
  205.     ORA    A
  206.     JZ    PROMPTR    ;NO COMMAND
  207. ;
  208. ;GOT INITIAL COMMAND, SET IT UP
  209. ;
  210.     MOV    B,A    ;SAVE LENGTH
  211.     DCR    B
  212.     JZ    PROMPTR
  213.     LXI    D,INBUF
  214.     INX    H    ;SKIP LEN
  215.     INX    H    ;SKIP ' '
  216.     CALL    MOVE
  217.     MVI    A,CR
  218.     STAX    D
  219.     LXI    H,INBUF
  220.     JMP    PROMPTI
  221. ;
  222. PROMPTR    CALL    RDBUF
  223. PROMPTI    MVI    A,255
  224.     STA    TOGO    ;LOOP COUNT FOR "/"
  225. PROMPT    LXI    SP,STACK
  226.     XRA    A    ;ZERO 2-UP PRINT
  227.     STA    TWOUP    ;..SWITCH
  228.     MVI    A,1
  229.     STA    FTSW    ;TELL SEARCH NOT TO INCR
  230.     PUSH    H
  231.     LXI    H,100H
  232.     SHLD    BUFAD    ;FOR RDBYTE
  233.     POP    H
  234.     CALL    CTLCS    ;ABORT?
  235.     JZ    PROMPTR    ;..YES, READ BUFFER
  236. ;DO WE HAVE TO POSITION IN DIRECTORY AFTER FIND?
  237.     LDA    FINDFLG
  238.     ORA    A
  239.     JNZ    POSDIR    ;POSITION IN DIRECTORY
  240.     MOV    A,M
  241.     CPI    CR
  242.     JZ    PROMPTR
  243.     CPI    ';'    ;LOGICAL CR?
  244.     INX    H
  245.     JZ    PROMPT
  246.     CALL    UPCASE
  247.     STA    DUMTYPE    ;TYPE OF DUMP (A,D,H)
  248.     CPI    '!'    ! JZ WARDSK ;<----DON'T USE
  249.     CPI    '+'    ! JZ PLUS
  250.     CPI    '-'    ! JZ MINUS
  251.     CPI    '='    ! JZ SEARCH
  252.     CPI    '<'    ! JZ SAVE
  253.     CPI    '>'    ! JZ RESTORE
  254.     CPI    '?'    ! JZ HELP
  255.     CPI    'A'    ! JZ DUMP
  256.     CPI    'C'    ! JZ CHG
  257.     CPI    'D'    ! JZ DUMP
  258.     CPI    'F'    ! JZ POSFIL
  259.     CPI    'G'    ! JZ POS
  260.     CPI    'H'    ! JZ DUMP
  261.     CPI    'L'    ! JZ LOGIN
  262.     CPI    'M'    ! JZ MAP
  263.     CPI    'P'    ! JZ PRINTFF
  264.     CPI    'R'    ! JZ DOREAD
  265.     CPI    'S'    ! JZ POS
  266.     CPI    'T'    ! JZ POS
  267.     CPI    'V'    ! JZ VIEW
  268.     CPI    'W'    ! JZ DOWRITE
  269.     CPI    'X'    ! JZ 0
  270.     CPI    'Z'    ! JZ SLEEP
  271.     CPI    '/'    ! JZ REPEAT
  272. ;
  273. WHAT    CALL    ILPRT
  274.     DB    '?',0
  275.     JMP    PROMPTR
  276. ;
  277. ;REPEAT BUFFER CONTENTS
  278. ;
  279. REPEAT    CALL    DECIN    ;NN SPECIFIED?
  280.     MOV    A,E
  281.     ORA    A
  282.     JZ    NNN    ;NO.
  283.     LDA    TOGO    ;FIRST TIME?
  284.     CPI    0FFH    ;WAS IT 0FFH?
  285.     JNZ    NNN    ;NO:  COUNTING
  286.     MOV    A,E    ;GET COUNT
  287.     STA    TOGO    ;SET COUNT
  288. NNN    LXI    H,INBUF    ;READY TO REPEAT
  289.     LDA    TOGO
  290.     CPI    0FFH
  291.     JZ    PROMPT    ;CONTINUOUS
  292.     DCR    A    ;COUNT DOWN
  293.     STA    TOGO
  294.     JNZ    PROMPT
  295.     JMP    PROMPTR    ;RESET
  296. ;
  297. ;TOGGLE PRINT FLAG
  298. ;
  299. PRINTFF    LDA    PFLAG
  300.     XRI    1
  301.     STA    PFLAG
  302.     JMP    PROMPT
  303. ;
  304. ;SLEEP ROUTINE, IN TENTHS OF A SEC
  305. ;
  306. SLEEP    CALL    HEXIN    ;GET COUNT IF ANY
  307.     MOV    A,E    ;ANY?
  308.     ORA    A
  309.     JNZ    SLEEPLP
  310.     MVI    E,10
  311. SLEEPLP    LXI    B,8000    ;APPROX .1 SEC @ 2MHz
  312. SLEEP2    DCX    B
  313.     MOV    A,B
  314.     ORA    C
  315.     JNZ    SLEEP2
  316.     PUSH    D
  317.     CALL    CTLCS
  318.     POP    D
  319.     JZ    PROMPTR
  320.     DCR    E
  321.     JNZ    SLEEPLP
  322.     JMP    PROMPT
  323. ;
  324. ;CHECK FOR CONTROL-C OR S
  325. ;
  326. CTLCS    CALL    CONST
  327.     INR    A
  328.     RNZ        ;NO CHAR
  329.     CALL    CONIN
  330.     ANI    1FH    ;ALLOW ASCII
  331.     CPI    'S'-40H
  332.     CZ    CONIN
  333.     CPI    'C'-40H
  334.     RET        ;0 SET IF CTL-C
  335. ;
  336. LOGIN    MVI    C,RESETDK
  337.     PUSH    H
  338.     CALL    BDOS
  339.     POP    H
  340.     MOV    A,M    ;DISK REQ?
  341.     LXI    D,0
  342.     CPI    CR
  343.     JZ    LGNODK
  344.     CPI    ';'
  345.     JZ    LGNODK
  346.     CALL    UPCASE
  347.     INX    H
  348.     SUI    'A'
  349.     MOV    E,A
  350. LGNODK    MVI    C,SELDK
  351.     PUSH    H
  352.     CALL    BDOS
  353.     POP    H
  354.     CALL    NOWRITE
  355.     JMP    PROMPT
  356. ;
  357. ;READ IN THE DISK DIRECTORY
  358. ;
  359. READDIR    PUSH    H
  360.     CALL    NOWRITE    ;POSITIONING LOST
  361.     MVI    A,2
  362.     STA    CURTRK
  363.     MVI    A,1
  364.     STA    CURSEC
  365.     MVI    B,16    ;# OF SECTORS
  366.     LXI    D,DIRECT ;DMA ADDR
  367. RDIRLP    PUSH    B
  368.     PUSH    D
  369.     MOV    B,D
  370.     MOV    C,E
  371.     CALL    VSETDMA
  372.     LDA    CURTRK
  373.     CALL    SETTRK
  374.     LDA    CURSEC
  375.     CALL    SETSEC
  376.     CALL    READ
  377.     CALL    NEXTSEC
  378.     POP    D
  379.     POP    B
  380.     LXI    H,80H
  381.     DAD    D
  382.     XCHG
  383.     DCR    B
  384.     JNZ    RDIRLP
  385.     LXI    B,80H
  386.     CALL    VSETDMA
  387.     POP    H
  388.     RET
  389. ;
  390. ;MAP THE DIRECTORY
  391. ;
  392. MAP    CALL    READDIR    ;READ IN DIRECTORY
  393.     MVI    C,2    ;DFLT START
  394.     CALL    HEXIN
  395.     PUSH    H    ;SAVE INBUF PTR
  396.     MOV    A,E    ;GET START
  397.     ORA    A    ;NOTHING?
  398.     JZ    MAPDF    ;..YES, DFLT
  399.     MOV    C,E
  400. MAPDF    MOV    A,C
  401.     CALL    HEX
  402.     MVI    A,'-'
  403.     CALL    TYPE
  404.     CALL    GETGRP    ;GET GRP(C) TO HL
  405. MAPCONT    INR    C    ;NEXT GRP
  406.     JZ    MAPEND    ;DONE
  407.     PUSH    H
  408.     CALL    GETGRP    ;GET ANOTHER
  409.     POP    D    ;SEE IF SAME
  410.     CALL    CTLCS
  411.     JZ    MAPEND2
  412.     MOV    A,D
  413.     CMP    H
  414.     JNZ    MAPDIFF
  415.     MOV    A,E
  416.     CMP    L
  417.     JNZ    MAPDIFF
  418. ;SAME, CONTINUE
  419.     JMP    MAPCONT
  420. ;
  421. ;DIFFERENT FILE ENCOUNTERED
  422. ;
  423. MAPDIFF    MOV    A,C
  424.     DCR    A
  425.     CALL    HEX
  426.     XCHG
  427.     CALL    MAPNAME
  428.     JMP    MAPDF
  429. ;
  430. ;END
  431. ;
  432. MAPEND    MOV    A,C    ;GET LAST
  433.     DCR    A
  434.     CALL    HEX
  435.     CALL    MAPNAME
  436.     POP    H
  437.     CALL    CRLF
  438. ;
  439. ;END OF MAP - REPOSITION TO PREVIOUS GROUP
  440. ;
  441. MAPEND2    LDA    GROUP
  442.     PUSH    H
  443.     MOV    L,A
  444.     JMP    POSGRP2
  445. ;
  446. ;PRINT FILE NAME POINTED TO BY HL
  447. ;
  448. MAPNAME    CALL    SPACE
  449.     MOV    A,H
  450.     ORA    L    ;NONE?
  451.     JZ    NONAME
  452.     MOV    A,M    ;SEE IF ALLOC
  453.     ORA    A    ;ZERO?
  454.     MVI    A,' '
  455.     JZ    MAPNSP1
  456.     MVI    A,'('
  457. MAPNSP1    CALL    TYPE
  458.     PUSH    H    ;SAVE POINTER
  459.     INX    H    ;SKIP ALLOC BYTE
  460.     MVI    B,8
  461.     CALL    MAPN2
  462.     MVI    A,'.'
  463.     CALL    TYPE
  464.     MVI    B,3
  465.     CALL    MAPN2
  466.     CALL    SPACE
  467.     MOV    A,M    ;GET EXT
  468.     ORI    '0'
  469.     CALL    TYPE
  470.     POP    H
  471.     MOV    A,M
  472.     ORA    A
  473.     MVI    A,' '
  474.     JZ    MAPNSP2
  475.     MVI    A,')'
  476. MAPNSP2    CALL    TYPE    ;")" IF ERASED FILE
  477.     LDA    TWOUP
  478.     XRI    1
  479.     STA    TWOUP
  480.     JZ    CRLF
  481.     JMP    DELIM
  482. ;
  483. NONAME    CALL    ILPRT
  484.     DB    '++FREE++        ',0
  485.     LDA    TWOUP
  486.     XRI    1
  487.     STA    TWOUP
  488.     JZ    CRLF
  489. DELIM    MVI    A,':'
  490.     JMP    TYPE
  491. ;
  492. ;PRINT NAME, LENGTH IN B
  493. ;
  494. MAPN2    MOV    A,M
  495.     INX    H
  496.     CPI    ' '    ;PRINTABLE?
  497.     JC    MAPN2H    ;..NO, IN HEX
  498.     CPI    7FH    
  499.     JC    MAPN2A
  500. MAPN2H    CALL    BHEX
  501.     JMP    MAPN2Z
  502. MAPN2A    CALL    TYPE
  503. MAPN2Z    DCR    B
  504.     JNZ    MAPN2
  505.     RET
  506. ;
  507. ;FIND WHICH FILE GROUP(C) BELONGS TO
  508. ;
  509. GETGRP    LXI    H,DIRECT
  510.     MVI    A,64    ;# OF FILES
  511.     STA    FILECT
  512. GETGLP    PUSH    H    ;SAVE POINTER
  513.     LXI    D,15    ;DISP TO LENGTH
  514.     DAD    D
  515.     MOV    A,M    ;GET LENGTH
  516.     ORA    A    ;ZERO?
  517.     JZ    GETGNF    ;NO FILE
  518.     CPI    0E5H    ;UNUSED, FOMATTED DISK?
  519.     JZ    GETGNF
  520.     MOV    B,A    ;SAVE COUNT
  521.     DCR    B    ;ALLOW JP BELOW
  522. GETGL2    INX    H    ;TO NEXT
  523.     MOV    A,M    ;GET GRP
  524.     CMP    C    ;CORRECT ONE?
  525.     JZ    GETGOT    ;YES, GOT IT.
  526.     MOV    A,B    ;GET REC COUNT
  527.     SUI    8
  528.     MOV    B,A
  529.     JP    GETGL2
  530. ;NO FILE
  531. GETGNF    POP    H
  532.     LXI    D,32
  533.     DAD    D    ;TO NEXT ENTRY
  534.     LDA    FILECT
  535.     DCR    A
  536.     STA    FILECT
  537.     JNZ    GETGLP    ;MORE?
  538.     LXI    H,0    ;NO, NOT FOUND
  539.     RET
  540. ;
  541. ;GOT THE FILE
  542. ;
  543. GETGOT    POP    H    ;POINT TO NAME
  544.     RET
  545. ;
  546. ;SAVE THE CURRENT SECTOR
  547. ;
  548. SAVE    LDA    WRFLG
  549.     ORA    A
  550.     JZ    BADW    ;NONE TO SAVE
  551.     PUSH    H
  552.     LXI    H,80H
  553.     LXI    D,SAVEBUF
  554.     MVI    B,128
  555.     CALL    MOVE
  556.     MVI    A,1    ;..SHOW
  557.     STA    SAVEFLG    ;..SAVED EXISTS
  558.     POP    H
  559.     JMP    PROMPT
  560. ;
  561. ;RESTORE THE CURRENT SECTOR
  562. ;
  563. RESTORE    LDA    SAVEFLG
  564.     ORA    A
  565.     JZ    NOSAVE ;NONE TO SAVE
  566.     PUSH    H
  567.     LXI    H,SAVEBUF
  568.     LXI    D,80H
  569.     MVI    B,128
  570.     CALL    MOVE
  571.     POP    H
  572.     JMP    PROMPT
  573. ;
  574. NOSAVE    CALL    ILPRT
  575.     DB    '++NO "<" SAVE COMMAND ISSUED'
  576.     DB    CR,LF,0
  577.     JMP    PROMPTR
  578. ;
  579. ;MOVE (HL) TO (DE) LENGTH IN B
  580. ;
  581. MOVE    MOV    A,M
  582.     STAX    D
  583.     INX    H
  584.     INX    D
  585.     DCR    B
  586.     JNZ    MOVE
  587.     RET
  588. ;
  589. NOWRITE    XRA    A    ;GET 0
  590.     STA    WRFLG    ;CAN'T WRITE NOW
  591.     RET
  592. ;
  593. ;NO MATCH IN SEARCH, TRY NEXT CHAR
  594. ;
  595. SRNOMAT    POP    H
  596.     CALL    CTLCS    ;ABORT?
  597.     JNZ    SEARCH    ;..YES
  598.     LXI    H,INBUF
  599.     MVI    M,CR
  600.     JMP    CALCGRP    ;SHOW WHERE STOPPED
  601. ;
  602. ;SEARCH FOR CHARACTER STRING
  603. ;
  604. SEARCH    PUSH    H    ;SAVE STRING POINTER
  605. SRCHL    CALL    RDBYTE    ;GET A BYTE
  606.     PUSH    PSW
  607.     CALL    GETVAL    ;GET SEARCH VALUE
  608.     MOV    B,A
  609.     POP    PSW
  610.     CMP    B    ;MATCH?
  611.     JNZ    SRNOMAT    ;NO MATCH
  612.     INX    H
  613.     MOV    A,M    ;DONE?
  614.     CPI    CR
  615.     JZ    SREQU
  616.     CPI    ';'
  617.     JNZ    SRCHL
  618. ;GOT MATCH
  619. SREQU    CALL    ILPRT
  620.     DB    '= AT ',0
  621.     LDA    BUFAD
  622.     ANI    7FH
  623.     CALL    HEX
  624.     CALL    CRLF
  625.     JMP    CALCGRP
  626. ;
  627. ;GET VALUE FROM INPUT BUFFER
  628. ;
  629. GETVAL    MOV    A,M
  630.     CPI    '<'    ;HEX ESCAPE?
  631.     RNZ        ;NO, RETURN
  632. ;"<<" MEANS ONE "<"
  633.     INX    H
  634.     MOV    A,M
  635.     CPI    '<'
  636.     RZ
  637. ;GOT HEX
  638.     PUSH    D
  639.     CALL    HEXIN    ;GET VALUE
  640.     CPI    '>'    ;PROPER DELIM?
  641.     MOV    A,E    ;GET VALUE
  642.     POP    D
  643.     JNZ    WHAT    ;ERROR
  644.     RET
  645. ;
  646. ;READ A BYTE AT A TIME
  647. ;
  648. RDBYTE    PUSH    H
  649.     LDA    FTSW    ;FIRST READ?
  650.     ORA    A
  651.     JNZ    READ1
  652.     LHLD    BUFAD
  653.     MOV    A,H
  654.     ORA    A    ;AT 100?
  655.     JZ    NORD    ;NO, NO READ
  656. ;HAVE TO READ
  657.     CALL    NEXTSEC
  658. READ1    XRA    A
  659.     STA    FTSW    ;NOT FIRST READ
  660.     LDA    CURSEC
  661.     CALL    SETSEC
  662.     LDA    CURTRK
  663.     CALL    SETTRK
  664.     CALL    READ
  665.     CALL    CALCSUB
  666.     LXI    H,80H
  667. NORD    MOV    A,M
  668.     INX    H
  669.     SHLD    BUFAD
  670.     POP    H
  671.     RET
  672. ;
  673. ;VIEW THE FILE IN ASCII STARTING AT
  674. ;CURRENT SECTOR, STEPPING THRU THE DISK
  675. ;
  676. VIEW    LDA    WRFLG
  677.     ORA    A
  678.     JZ    BADDMP
  679.     CALL    HEXIN    ;GET DISPL IF ANY
  680.     PUSH    H
  681.     MOV    A,E
  682.     ORA    A
  683.     JNZ    VIEWLP
  684.     INR    E    ;DFLT=1
  685. VIEWLP    LXI    H,80H    ;TO DATA
  686. VIEWCHR    CALL    CTLCS
  687.     JZ    VIEWEND
  688.     MOV    A,M
  689.     CPI    1AH
  690.     JZ    VIEWEOF
  691.     CALL    TYPE
  692.     INR    L
  693.     JNZ    VIEWCHR
  694.     DCR    E
  695.     JZ    VIEWEND
  696.     PUSH    D    ;SAVE COUNT
  697.     CALL    NEXTSEC
  698.     LDA    CURSEC
  699.     CALL    SETSEC    
  700.     LDA    CURTRK
  701.     CALL    SETTRK
  702.     CALL    READ
  703.     POP    D    ;RESTORE COUNT
  704.     JMP    VIEWLP
  705. ;
  706. VIEWEOF    CALL    ILPRT
  707.     DB    CR,LF,TAB,'++EOF++',CR,LF,0
  708. ;
  709. VIEWEND    POP    H
  710.     CALL    CRLF
  711.     JMP    CALCGRP
  712. ;
  713. ;DUMP IN HEX OR ASCII
  714. ;
  715. DUMP    LDA    WRFLG
  716.     ORA    A
  717.     JNZ    DUMPOK
  718.     CALL    ILPRT
  719. BADDMP    DB    '++Can''t dump, no sector read.',CR,LF,0
  720. EXPL    CALL    ILPRT
  721.     DB    'Use G command following F,',CR,LF
  722.     DB    'or R or S following T',CR,LF,0
  723.     JMP    PROMPTR
  724. ;
  725. DUMPOK    MOV    A,M
  726.     CPI    ';'
  727.     JZ    DUMPDF    ;DFLT
  728.     CPI    CR
  729.     JNZ    DUMPNDF
  730. ;USE DEFAULT
  731. DUMPDF    LXI    B,80H
  732.     LXI    D,0FFH
  733.     JMP    DUMP1
  734. DUMPNDF    CALL    DISP
  735.     MOV    B,D
  736.     MOV    C,E
  737.     CPI    CR
  738.     JZ    DUMP1
  739.     CPI    ';'
  740.     JZ    DUMP1
  741.     INX    H    ;SKIP ','
  742.     CALL    DISP
  743. ;
  744. ;BC = START, DE = END
  745. ;
  746. DUMP1    PUSH    H    ;SAVE COMMAND POINTER
  747.     MOV    H,B
  748.     MOV    L,C
  749. DUMPLP    MOV    A,L
  750.     ANI    7FH
  751.     CALL    HEX
  752.     CALL    SPACE
  753.     CALL    SPACE
  754.     LDA    DUMTYPE
  755.     CPI    'A'
  756.     JZ    DUMPAS
  757.     PUSH    H    ;SAVE START
  758. DHEX    MOV    A,M
  759.     CALL    HEX
  760.     MOV    A,L
  761.     ANI    3
  762.     CPI    3
  763.     CZ    SPACE
  764.     MOV    A,L
  765.     ANI    7
  766.     CPI    7
  767.     CZ    SPACE
  768.     MOV    A,E
  769.     CMP    L
  770.     JZ    DPOP
  771.     INX    H
  772.     MOV    A,L
  773.     ANI    0FH
  774.     JNZ    DHEX
  775. DPOP    CALL    CTLCS
  776.     JZ    PROMPTR
  777.     LDA    DUMTYPE
  778.     CPI    'H'
  779.     JZ    DNOAS    ;HEX ONLY
  780.     POP    H    ;GET START ADDR
  781. DUMPAS    CALL    ASTER
  782. DCHR    MOV    A,M
  783.     CPI    ' '
  784.     JC    DPER
  785.     CPI    7FH
  786.     JC    DOK
  787. DPER    MVI    A,'.'
  788. DOK    CALL    TYPE
  789.     MOV    A,E
  790.     CMP    L
  791.     JZ    DEND
  792.     INX    H
  793.     MOV    A,L
  794.     ANI    0FH
  795.     JNZ    DCHR
  796. DEND    CALL    ASTER
  797.     CALL    CRLF
  798.     PUSH    D
  799.     CALL    CTLCS
  800.     POP    D
  801.     JZ    PROMPTR
  802.     MOV    A,E
  803.     CMP    L
  804.     JNZ    DUMPLP
  805.     POP    H
  806.     JMP    PROMPT
  807. ;
  808. DNOAS    POP    B
  809.     CALL    CRLF
  810.     MOV    A,E
  811.     CMP    L
  812.     JNZ    DUMPLP
  813.     POP    H
  814.     JMP    PROMPT
  815. ;
  816. ;POSITION
  817. ;
  818. POS    PUSH    PSW
  819.     MOV    A,M
  820.     CPI    ';'
  821.     JZ    POSINQ
  822.     CPI    CR
  823.     JNZ    POSOK
  824. POSINQ    POP    PSW
  825.     JMP    INQ
  826. ;
  827. POSOK    CALL    HEXIN
  828.     POP    PSW
  829.     CPI    'T'
  830.     JZ    POSTRK
  831.     CPI    'S'
  832.     JZ    POSSEC
  833.     CPI    'G'
  834.     JZ    POSGRP
  835.     JMP    WHAT
  836. ;
  837. POSTRK    MOV    A,E
  838.     CALL    SETTRK
  839.     CALL    NOWRITE    ;TRACK DOESN'T READ
  840.     JMP    CALCGRP
  841. ;
  842. POSSEC    MOV    A,E
  843.     ORA    A
  844.     JZ    WHAT
  845.     CPI    27
  846.     JNC    WHAT
  847.     CALL    SETSEC
  848.     CALL    READ
  849. ;
  850. CALCGRP    CALL    CALCSUB
  851.     JMP    INQ
  852. ;
  853. CALCSUB    PUSH    H
  854.     LDA    CURTRK
  855.     SUI    2    ;GRP 0 IS TRK 2
  856.     MOV    L,A
  857.     MVI    H,0
  858.     MOV    D,H
  859.     MOV    E,L
  860.     DAD    H    ;X2
  861.     DAD    D    ;X3
  862.     DAD    H    ;X6
  863.     DAD    H    ;X12
  864.     DAD    D    ;X13
  865.     DAD    H    ;X26
  866.     LDA    CURSEC
  867.     DCR    A
  868.     ADD    L
  869.     MOV    L,A
  870.     MOV    A,H
  871.     ACI    0
  872.     MOV    H,A
  873.     MOV    A,L
  874.     ANI    7
  875.     STA    GRPDISP
  876.     DAD    H
  877.     DAD    H
  878.     DAD    H
  879.     DAD    H
  880.     DAD    H
  881.     MOV    A,H
  882.     STA    GROUP
  883.     POP    H
  884.     RET
  885. ;
  886. ;POSITION IN THE DIRECTORY AFTER A FIND
  887. ;
  888. POSDIR    PUSH    H    ;SAVE INBUF
  889.     XRA    A
  890.     STA    FINDFLG    ;CANCEL POS REQ
  891.     LDA    DIRPOS    ;GET POSITION
  892.     RAR
  893.     RAR
  894.     PUSH    PSW
  895.     ANI    7    ;GET GRP DISPLACEMENT
  896.     STA    GRPDISP
  897.     POP    PSW
  898.     RAR
  899.     RAR
  900.     RAR
  901.     ANI    1    ;GET GROUP
  902.     STA    GROUP
  903.     MOV    L,A    ;SETUP FOR POSGRP2
  904.     JMP    POSGRP2    ;POSITION TO IT
  905. ;
  906. POSGRP    MOV    A,E
  907.     STA    GROUP
  908.     XRA    A
  909.     STA    GRPDISP
  910.     PUSH    H
  911.     MOV    L,E    ;MULTIPLY
  912. POSGRP2    MVI    H,0    ;BY 8
  913.     DAD    H
  914.     DAD    H
  915.     DAD    H
  916.     LDA    GRPDISP    ;MAY BE >0 IF "F" CMD.
  917.     ADD    L    ;CAN'T CARRY
  918.     MOV    L,A
  919. ;DIVIDE BY 26, QUOTIENT = TRK, REMAINDER = SECTOR
  920.     LXI    D,-26
  921.     MVI    B,0    ;TRK
  922. DIVLP    INR    B
  923.     DAD    D
  924.     JC    DIVLP
  925.     DCR    B
  926.     LXI    D,26
  927.     DAD    D
  928.     MOV    A,B
  929.     ADI    2    ;GROUP 0 IS TRK 2
  930.     CALL    SETTRK
  931.     MOV    A,L
  932.     INR    A
  933.     CALL    SETSEC
  934.     CALL    READ
  935.     POP    H
  936.     JMP    INQ
  937. ;
  938. POSFIL    CALL    NOWRITE
  939.     MVI    A,1
  940.     STA    FINDFLG    ;SO WE POSITION LATER
  941.     LXI    D,FCB
  942.     XRA    A    ;LOGGED IN DISK
  943.     STAX    D
  944.     INX    D
  945.     MVI    B,8
  946.     CALL    MVNAME
  947.     MVI    B,3
  948.     CALL    MVNAME
  949.     LXI    D,FCB
  950.     MVI    C,SRCHF
  951.     PUSH    H
  952.     CALL    BDOS
  953.     INR    A
  954.     JNZ    FLOK
  955.     STA    DIRPOS    ;GRP 0 IF NOT FOUND
  956.     CALL    ILPRT
  957.     DB    '++FILE NOT FOUND',CR,LF,0
  958.     POP    H
  959.     JMP    PROMPT
  960. ;
  961. FLOK    DCR    A
  962.     STA    DIRPOS    ;SAVE POS. IN DIR
  963.     ANI    3
  964.     MOV    L,A
  965.     MVI    H,0
  966.     DAD    H    ;X32 BYTES/ENTRY
  967.     DAD    H
  968.     DAD    H
  969.     DAD    H
  970.     DAD    H
  971.     LXI    D,80H
  972.     DAD    D    ;HL POINTS TO ENTRY
  973.     LXI    D,32
  974.     XCHG
  975.     DAD    D
  976.     XCHG
  977.     MVI    A,'D'
  978.     STA    DUMTYPE
  979.     JMP    DUMPLP    ;WHICH POPS H
  980. ;
  981. MVNAME    MOV    A,M
  982.     CPI    '.'
  983.     JZ    MVIPAD
  984.     CPI    CR
  985.     JZ    PAD
  986.     CPI    ';'
  987.     JZ    PAD
  988.     CALL    UPCASE
  989.     STAX    D
  990.     INX    H
  991.     INX    D
  992.     DCR    B
  993.     JNZ    MVNAME
  994.     MOV    A,M
  995.     CPI    CR
  996.     RZ
  997.     CPI    ';'
  998.     RZ
  999.     INX    H
  1000.     CPI    '.'
  1001.     RZ
  1002.     JMP    WHAT
  1003. ;
  1004. MVIPAD    INX    H
  1005. ;
  1006. PAD    MVI    A,' '
  1007.     STAX    D
  1008.     INX    D
  1009.     DCR    B
  1010.     JNZ    PAD
  1011.     RET
  1012. ;
  1013. PLUS    LXI    D,1    ;DFLT TO 1 SECT
  1014.     MOV    A,M    ;GET NEXT CHAR
  1015.     CPI    CR    ;CR?
  1016.     JZ    PLUSGO    ;..YES, DFLT TO 1
  1017.     CPI    ';'
  1018.     JZ    PLUSGO
  1019.     CALL    HEXIN    ;GET #
  1020.     MOV    A,E
  1021.     ORA    A
  1022.     JZ    WHAT
  1023. PLUSGO    CALL    NEXTSEC
  1024.     DCR    E    ;MORE TO GO?
  1025.     JNZ    PLUSGO    ;..YES
  1026. ;
  1027. ;OK, INCREMENTED TO SECTOR.  SETUP AND READ
  1028. ;
  1029. PLUSMI    LDA    CURSEC
  1030.     CALL    SETSEC    
  1031.     LDA    CURTRK
  1032.     CALL    SETTRK
  1033.     CALL    READ
  1034.     JMP    CALCGRP
  1035. ;
  1036. MINUS    LXI    D,1    ;SET DFLT
  1037.     MOV    A,M    ;GET CHAR
  1038.     CPI    CR    ;CR?
  1039.     JZ    MINGO    ;..YES, DFLT=1
  1040.     CPI    ';'
  1041.     JZ    MINGO
  1042.     CALL    HEXIN    ;..NO, GET ##
  1043.     MOV    A,E
  1044.     ORA    A
  1045.     JZ    WHAT
  1046. MINGO    LDA    CURSEC    ;GET CURR
  1047.     DCR    A    ;BACK UP
  1048.     JNZ    MINOK    ;TO 0?
  1049.     LDA    CURTRK    ;..YES, BACK..
  1050.     DCR    A    ;..UP 1..
  1051.     STA    CURTRK    ;..TRACK
  1052.     MVI    A,26    ;
  1053. MINOK    STA    CURSEC
  1054.     DCR    E
  1055.     JNZ    MINGO
  1056.     JMP    PLUSMI
  1057. ;
  1058. ;GO TO NEXT SECTOR
  1059. ;
  1060. NEXTSEC    LDA    CURSEC    ;GET CURRENT
  1061.     INR    A    ;BUMP IT
  1062.     CPI    27    ;NEXT TRACK?
  1063.     JNZ    NEXTOK    ;NO, CONI
  1064.     LDA    CURTRK    ;BUMP..
  1065.     INR    A    ;..CURR..
  1066.     STA    CURTRK    ;..TRK
  1067.     MVI    A,1    ;SECT=1
  1068. NEXTOK    STA    CURSEC
  1069.     RET
  1070. ;
  1071. ;TELL WHAT GRP, DISPLACEMENT, TRK, SECT, PHY SECT
  1072. ;
  1073. INQ    CALL    INQSUB
  1074.     JMP    PROMPT
  1075. ;
  1076. ;POSITION INQUIRY SUBROUTINE
  1077. ;    EXECUTED VIA: G S OR T (WITH NO OPERANDS)
  1078. ;
  1079. INQSUB    LDA    CURTRK
  1080.     CPI    2
  1081.     JC    NOGRP
  1082.     CALL    ILPRT
  1083.     DB    'G=',0
  1084.     LDA    GROUP
  1085.     CALL    HEX
  1086.     MVI    A,':'
  1087.     CALL    TYPE
  1088.     LDA    GRPDISP
  1089.     ORI    '0'
  1090.     CALL    TYPE
  1091.     MVI    A,','
  1092.     CALL    TYPE
  1093. NOGRP    CALL    ILPRT
  1094.     DB    ' T=',0
  1095.     LDA    CURTRK
  1096.     CALL    HEX
  1097.     CALL    ILPRT
  1098.     DB    ', S=',0
  1099.     LDA    CURSEC
  1100.     CALL    HEX
  1101.     CALL    ILPRT
  1102.     DB    ', PS=',0
  1103.     LDA    PHYSEC
  1104.     CALL    HEX
  1105.     CALL    CRLF
  1106.     RET
  1107. ;
  1108. CHG    MOV    A,M    ;GET TYPE (HEX, ASCII)
  1109.     CALL    UPCASE
  1110.     PUSH    PSW    ;SAVE "H" OR "A"
  1111.     INX    H
  1112.     CALL    DISP    ;GET, VALIDATE DISP TO DE
  1113.     INX    H
  1114.     LXI    B,0    ;SHOW NO 'THRU' ADDR
  1115.     CPI    '-'    ;TEST DELIM FR. DISP
  1116.     JNZ    CHGNTH    ;NO THRU
  1117.     PUSH    D    ;SAVE FROM
  1118.     CALL    DISP    ;GET THRU
  1119.     MOV    B,D
  1120.     MOV    C,E    ;BC = THRU
  1121.     POP    D    ;GET FROM
  1122.     JMP    CHGAH
  1123. CHGNTH    CPI    ','
  1124.     JNZ    WHAT
  1125. CHGAH    POP    PSW
  1126.     CPI    'H'
  1127.     JZ    CHGHEX
  1128.     CPI    'A'
  1129.     JNZ    WHAT
  1130. ;CHANGE ASCII
  1131. CHGALP    MOV    A,M
  1132.     CPI    CR
  1133.     JZ    PROMPT
  1134.     CPI    ';'
  1135.     JZ    PROMPT
  1136.     LDAX    D
  1137.     CPI    ' '
  1138.     JC    CHGAHX
  1139.     CPI    7FH
  1140.     JNC    CHGAHX
  1141.     JMP    CHGA2
  1142. CHGAHX    CALL    BHEX
  1143.     JMP    CHGA3
  1144. CHGA2    CALL    TYPE
  1145. CHGA3    CALL    GETVAL    ;ASCII OR <HEX>
  1146.     STAX    D    ;UPDATE CHAR
  1147.     INX    H    ;TO NEXT INPUT CHAR
  1148. ;SEE IF 'THRU' REQUESTED
  1149.     MOV    A,C
  1150.     ORA    A
  1151.     JZ    CHGANTH
  1152.     CMP    E    ;DONE?
  1153.     JZ    PROMPT
  1154.     DCX    H    ;..NO: MORE.
  1155. CHGANTH    INR    E
  1156.     JNZ    CHGALP
  1157.     MOV    A,M
  1158.     CPI    CR
  1159.     JZ    PROMPT
  1160.     CPI    ';'
  1161.     JZ    PROMPT
  1162.     JMP    WHAT
  1163. ;
  1164. ;CHANGE HEX
  1165. ;
  1166. CHGHCOM    INX    H
  1167. CHGHEX    MOV    A,M
  1168.     CPI    CR
  1169.     JZ    PROMPT
  1170.     CPI    ';'
  1171.     JZ    PROMPT
  1172.     CPI    ','    ;DELIM?
  1173.     JZ    CHGHCOM
  1174.     PUSH    D
  1175.     SHLD    HEXAD    ;IN CASE 'THRU'
  1176.     CALL    HEXIN    ;POSITIONS TO DELIM
  1177.     MOV    A,E    ;GET VALUE
  1178.     POP    D    ;..ADDR
  1179.     PUSH    PSW    ;SAVE VALUE
  1180.     LDAX    D    ;GET OLD
  1181.     CALL    HEX    ;ECHO IN HEX
  1182.     POP    PSW    ;GET NEW
  1183.     STAX    D    ;SAVE NEW
  1184. ;
  1185.     MOV    A,C    ;SEE IF 'THRU'
  1186.     ORA    A
  1187.     JZ    CHGHNTH    ;..NO.
  1188.     CMP    E    ;..YES, DONE?
  1189.     JZ    PROMPT
  1190.     LHLD    HEXAD    ;..NO: MORE
  1191. CHGHNTH    INR    E
  1192.     JNZ    CHGHEX
  1193.     MOV    A,M
  1194.     CPI    CR
  1195.     JZ    PROMPT
  1196.     CPI    ';'
  1197.     JZ    PROMPT
  1198.     JMP    WHAT
  1199. ;
  1200. DOREAD    CALL    READ
  1201.     JMP    PROMPT
  1202. ;
  1203. DOWRITE    CALL    WRITE
  1204.     JMP    PROMPT
  1205. ;
  1206. BHEX    PUSH    PSW
  1207.     MVI    A,'<'
  1208.     CALL    TYPE
  1209.     POP    PSW
  1210.     CALL    HEX
  1211.     MVI    A,'>'
  1212.     CALL    TYPE
  1213.     RET
  1214. ;
  1215. HEX    PUSH    PSW
  1216.     RAR
  1217.     RAR
  1218.     RAR
  1219.     RAR
  1220.     CALL    NIBBL
  1221.     POP    PSW
  1222. NIBBL    ANI    0FH
  1223.     CPI    10
  1224.     JC    HEXNU
  1225.     ADI    7
  1226. HEXNU    ADI    '0'
  1227.     JMP    TYPE
  1228. ;
  1229. SPACE    MVI    A,' '
  1230.     JMP    TYPE
  1231. ASTER    MVI    A,'*'
  1232.     JMP    TYPE
  1233. ;
  1234. ILPRT    XTHL
  1235. ILPLP    CALL    CTLCS    ;ABORT?
  1236.     JZ    PROMPTR
  1237.     MOV    A,M
  1238.     CALL    TYPE
  1239.     INX    H
  1240.     MOV    A,M
  1241.     ORA    A
  1242.     JNZ    ILPLP
  1243.     INX    H
  1244.     XTHL
  1245.     RET
  1246. ;
  1247. ;DISP CALLS HEXIN, AND VALIDATES A SECTOR
  1248. ;DISPLACEMENT, THEN CONVERTS IT TO AN ADDRESS
  1249. ;
  1250. DISP    CALL    HEXIN
  1251.     PUSH    PSW    ;SAVE DELIMITER
  1252.     MOV    A,D
  1253.     ORA    A
  1254.     JNZ    BADISP
  1255.     MOV    A,E
  1256.     ORA    A
  1257.     JM    BADISP
  1258.     ADI    80H    ;TO POINT TO BUFFER AT 80
  1259.     MOV    E,A
  1260.     POP    PSW    ;GET DELIM
  1261.     RET
  1262. ;
  1263. BADISP    CALL    ILPRT
  1264.     DB    '++BAD DISPLACEMENT (NOT 0-7F)'
  1265.     DB    CR,LF,0
  1266.     JMP    PROMPTR
  1267. ;
  1268. HEXIN    LXI    D,0
  1269.     MOV    A,M
  1270.     CPI    '#'    ;DECIMAL?
  1271.     JZ    HDIN    ;MAKE DECIMAL
  1272. HINLP    MOV    A,M
  1273.     CALL    UPCASE
  1274.     CPI    CR
  1275.     RZ
  1276.     CPI    ';'
  1277.     RZ
  1278.     CPI    ','
  1279.     RZ
  1280.     CPI    '-'    ;'THRU'?
  1281.     RZ
  1282.     CPI    '>'
  1283.     RZ
  1284.     INX    H
  1285.     CPI    '0'
  1286.     JC    WHAT
  1287.     CPI    '9'+1
  1288.     JC    HINNUM
  1289.     CPI    'A'
  1290.     JC    WHAT
  1291.     CPI    'F'+1
  1292.     JNC    WHAT
  1293.     SUI    7
  1294. HINNUM    SUI    '0'
  1295.     XCHG
  1296.     DAD    H
  1297.     DAD    H
  1298.     DAD    H
  1299.     DAD    H
  1300.     ADD    L
  1301.     MOV    L,A
  1302.     XCHG
  1303.     JMP    HINLP
  1304. ;
  1305. HDIN    INX    H    ;SKIP '.'
  1306. DECIN    LXI    D,0
  1307. DINLP    MOV    A,M
  1308.     CALL    UPCASE
  1309.     CPI    CR
  1310.     RZ
  1311.     CPI    ';'
  1312.     RZ
  1313.     CPI    ','
  1314.     RZ
  1315.     CPI    '-'    ;'THRU'?
  1316.     RZ
  1317.     INX    H
  1318.     CPI    '0'
  1319.     JC    WHAT
  1320.     CPI    '9'+1
  1321.     JNC    WHAT
  1322.     SUI    '0'
  1323.     PUSH    H
  1324.     MOV    H,D
  1325.     MOV    L,E
  1326.     DAD    H    ;X2
  1327.     DAD    H    ;X4
  1328.     DAD    D    ;X5
  1329.     DAD    H    ;X10
  1330.     ADD    L
  1331.     MOV    L,A
  1332.     MOV    A,H
  1333.     ACI    0
  1334.     MOV    H,A
  1335.     XCHG
  1336.     POP    H
  1337.     JMP    DINLP
  1338. ;
  1339. ;READ IN A CONSOLE BUFFER FULL
  1340. ;
  1341. RDBUF    CALL    ILPRT
  1342.     DB    CR,LF,':',0
  1343.     LXI    H,INBUF
  1344.     MVI    B,0
  1345. RDBLP    CALL    CONIN
  1346.     MOV    C,A    ;SAVE FOR BS TEST
  1347.     CPI    'U'-40H
  1348.     JZ    RDCTLU
  1349.     CPI    CR
  1350.     JZ    RDCR
  1351.     CPI    8
  1352.     JZ    RDBS
  1353.     CPI    7FH
  1354.     JZ    RDBS
  1355.     CPI    'R'-40H
  1356.     JZ    RDCTLR
  1357.     MOV    M,A
  1358.     INX    H
  1359.     INR    B
  1360.     JM    FULL
  1361.     CALL    TYPE
  1362.     JMP    RDBLP
  1363. ;
  1364. FULL    DCR    B
  1365.     DCX    H
  1366.     MVI    A,7    ;'DING'
  1367.     CALL    TYPE
  1368.     JMP    RDBLP
  1369. ;
  1370. ;GOT CR
  1371. ;
  1372. RDCR    MOV    M,A    ;SAVE IT
  1373.     CALL    TYPE    ;ECHO IT
  1374.     MVI    A,LF    ;ECHO..
  1375.     CALL    TYPE    ;..LF
  1376.     LXI    H,INBUF
  1377.     RET
  1378. ;
  1379. ;GOT DELETE OR BS, ECHO IF BS
  1380. ;
  1381. RDBS    XRA    A    ;AT FRONT..
  1382.     ORA    B    ;..OF LINE?
  1383.     JZ    RDCTLU    ;..YES, ECHO ^U
  1384.     DCX    H
  1385.     DCR    B
  1386.     MOV    A,C
  1387.     CPI    8    ;BS?
  1388.     JZ    BACKUP    ;ECHO THE BS
  1389.     MOV    A,M    ;ECHO..
  1390.     CALL    TYPE    ;..DELETED CHAR
  1391.     JMP    RDBLP
  1392. ;
  1393. BACKUP    MVI    A,8
  1394.     CALL    TYPE
  1395.     JMP    RDBLP
  1396. ;
  1397. ;GOT CTL-R, RETYPE
  1398. ;
  1399. RDCTLR    MVI    M,CR
  1400.     CALL    CRLF
  1401.     LXI    H,INBUF
  1402.     MVI    B,0
  1403. RDCRL    MOV    A,M
  1404.     CPI    CR
  1405.     JZ    RDBLP
  1406.     CALL    TYPE
  1407.     INR    B
  1408.     INX    H
  1409.     JMP    RDCRL
  1410. ;
  1411. ;GOT CTL-U OR BACKUP TO BEG. OF LINE.
  1412. ;
  1413. RDCTLU    MVI    A,'^'
  1414.     CALL    TYPE
  1415.     MVI    A,'U'
  1416.     CALL    TYPE
  1417.     JMP    RDBUF
  1418. ;
  1419. CRLF    MVI    A,CR
  1420.     CALL    TYPE
  1421.     MVI    A,LF
  1422.     JMP    TYPE
  1423. ;
  1424. UPCASE    CPI    60H
  1425.     RC
  1426.     ANI    5FH    ;MAKE UPPER CASE
  1427.     RET
  1428. ;
  1429. CONST    PUSH    B
  1430.     PUSH    D
  1431.     PUSH    H
  1432. VCONST    CALL    $-$
  1433.     POP    H
  1434.     POP    D
  1435.     POP    B
  1436.     RET
  1437. ;
  1438. CONIN    PUSH    B
  1439.     PUSH    D
  1440.     PUSH    H
  1441. VCONIN    CALL    $-$
  1442.     POP    H
  1443.     POP    D
  1444.     POP    B
  1445.     RET
  1446. ;
  1447. ;CONSOLE OUT WITH TAB EXPANSION
  1448. ;
  1449. TYPE    PUSH    B
  1450.     PUSH    D
  1451.     PUSH    H
  1452.     MOV    C,A    ;FOR OUTPUT ROUTINE
  1453.     CPI    TAB
  1454.     JNZ    VCONOUT
  1455. TYPETAB    MVI    A,' '
  1456.     CALL    TYPE
  1457.     LDA    TABCOL
  1458.     ANI    7
  1459.     JNZ    TYPETAB
  1460.     JMP    TYPERET
  1461. ;
  1462. VCONOUT    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  1463. ;
  1464. ;UPDATE COLUMN USED IN TAB EXPANSION
  1465. ;
  1466.     MOV    A,C    ;GET CHAR
  1467.     CPI    CR
  1468.     JNZ    TYPENCR
  1469.     MVI    A,0
  1470.     STA    TABCOL
  1471.     JMP    TYPELST
  1472. ;
  1473. TYPENCR    CPI    ' '    ;CTL CHAR?
  1474.     JC    TYPERET    ;..NO CHANGE IN COL
  1475.     LDA    TABCOL
  1476.     INR    A
  1477.     STA    TABCOL
  1478. TYPELST    LDA    PFLAG
  1479.     ANI    1
  1480.     CNZ    LIST    ;FROM C REG.
  1481. TYPERET    POP    H
  1482.     POP    D
  1483.     POP    B
  1484.     RET
  1485. ;
  1486. LIST:            ;TYPE SAVED REGS
  1487. VLIST    JMP    $-$
  1488. ;
  1489. HOME    PUSH    H
  1490. VHOME    CALL    $-$
  1491.     POP    H
  1492.     RET
  1493. ;
  1494. SETTRK    CPI    77
  1495.     JC    TRKOK
  1496.     CALL    ILPRT
  1497.     DB    '++not in tracks 0-76++'
  1498.     DB    CR,LF,0
  1499.     CALL    NOWRITE
  1500.     JMP    PROMPTR
  1501. ;
  1502. TRKOK    STA    CURTRK
  1503.     MOV    C,A
  1504.     PUSH    H
  1505. VSETTRK    CALL    $-$
  1506.     POP    H
  1507.     RET
  1508. ;
  1509. SETSEC    STA    CURSEC    ;LOGICAL
  1510.     MOV    C,A
  1511.     LDA    CURTRK
  1512.     CPI    2
  1513.     JC    GSETSEC    ;DON'T SCRAMBLE TRK'S 0-1
  1514.     PUSH    H
  1515.     LXI    H,SECTBL-1
  1516.     MOV    A,C
  1517.     ADD    L
  1518.     MOV    L,A
  1519.     MOV    A,H
  1520.     ACI    0
  1521.     MOV    H,A
  1522.     MOV    A,M
  1523.     POP    H
  1524.     MOV    C,A
  1525. GSETSEC    PUSH    H
  1526.     MOV    A,C    ;GET PHYSICAL SECTOR
  1527.     STA    PHYSEC
  1528. VSETSEC    CALL    $-$
  1529.     POP    H
  1530.     RET
  1531. ;
  1532. SETDMA:
  1533. VSETDMA    JMP    $-$
  1534. ;
  1535. READ    MVI    A,1
  1536.     STA    WRFLG
  1537.     PUSH    H
  1538. VREAD    CALL    $-$
  1539.     ORA    A
  1540.     JZ    READOK
  1541.     CALL    ILPRT
  1542.     DB    '++READ failed, sector may be invalid++'
  1543.     DB    CR,LF,0
  1544. READOK    POP    H
  1545.     RET
  1546. ;
  1547. WRITE    LDA    WRFLG
  1548.     ORA    A
  1549.     JNZ    PWRITE
  1550. BADW    CALL    ILPRT
  1551.     DB    '++CANNOT WRITE UNLESS READ ISSUED'
  1552.     DB    CR,LF,0
  1553.     JMP    EXPL
  1554. PWRITE    PUSH    H
  1555. VWRITE    CALL    $-$
  1556.     ORA    A
  1557.     JZ    WRITEOK
  1558.     CALL    ILPRT
  1559.     DB    '++WRITE failed++',CR,LF,0
  1560. WRITEOK    POP    H
  1561.     RET
  1562. ;
  1563. ;'SCUSE THIS KLUDGE - IT'S TO SET THE SCRAMBLE
  1564. ;TABLE TO 1,2,3,4,5.. FOR MY 3600 RPM "FLOPPY"..
  1565. ;
  1566. WARDSK    PUSH    H
  1567.     LXI    H,SECTBL
  1568.     MVI    B,1
  1569.     MVI    C,26
  1570. WARDLP    MOV    M,B
  1571.     INR    B
  1572.     DCR    C
  1573.     INX    H
  1574.     JNZ    WARDLP
  1575.     POP    H
  1576.     JMP    PROMPT
  1577. ;
  1578. ;HELP
  1579. ;
  1580. HELP    CALL    ILPRT
  1581.     DB    'Operands in brackets [...] are optional'
  1582.     DB    CR,LF
  1583.     DB    CR,LF
  1584.     DB    '+[n]    step in [n] sectors;'
  1585.     DB    CR,LF
  1586.     DB    '-[n]    step out [n] sectors'
  1587.     DB    CR,LF
  1588.     DB    '=xxx    search for ASCII xxx from curr sector.'
  1589.     DB    CR,LF
  1590.     DB    '    Caution: upper/lower case matters'
  1591.     DB    CR,LF
  1592.     DB    '    <nn> for hex: "IN 0" is: =<db><0>'
  1593.     DB    CR,LF
  1594.     DB    '    "(tab)H,0(CR)(LF)" is: =<9>H,0<D><A>'
  1595.     DB    CR,LF
  1596.     DB    '<    save current sector'
  1597.     DB    CR,LF
  1598.     DB    '>    restore saved sector'
  1599.     DB    CR,LF
  1600.     DB    '?    give help'
  1601.     DB    CR,LF
  1602.     DB    'A[ff,tt] ASCII dump'
  1603.     DB    CR,LF
  1604.     DB    'C    Change:'
  1605.     DB    CR,LF
  1606.     DB    '    CHaddr,byte,byte... (hex)'
  1607.     DB    CR,LF
  1608.     DB    '  or    CAaddr,data  (Ascii)'
  1609.     DB    CR,LF
  1610.     DB    '    <xx> Allowed for imbedded hex.'
  1611.     DB    CR,LF
  1612.     DB    '  or    CHfrom-thru,byte  e.g. ch0-7f,e5'
  1613.     DB    CR,LF
  1614.     DB    '  or    CAfrom-thru,byte'
  1615.     DB    CR,LF
  1616.     DB    'D[ff,tt] Dump (hex+ASCII)'
  1617.     DB    CR,LF
  1618.     DB    'Fn.t    Find file'
  1619.     DB    CR,LF
  1620.     DB    'Gnn    CP/M Allocation Group nn'
  1621.     DB    CR,LF
  1622.     DB    'H[ff,tt]    hex dump'
  1623.     DB    CR,LF
  1624.     DB    'L    Log in drive'
  1625.     DB    CR,LF
  1626.     DB    'Lx    Log in drive x'
  1627.     DB    CR,LF
  1628.     DB    'M[nn]    Map [from group nn]'
  1629.     DB    CR,LF
  1630.     DB    'P    Toggle printer switch'
  1631.     DB    CR,LF
  1632.     DB    'R    Read current sector'
  1633.     DB    CR,LF
  1634.     DB    'Snn    Sector nn'
  1635.     DB    CR,LF
  1636.     DB    'Tnn    Track nn'
  1637.     DB    CR,LF
  1638.     DB    'V[nn]    View [nn] ASCII sectors'
  1639.     DB    CR,LF
  1640.     DB    'W    Write current sector'
  1641.     DB    CR,LF
  1642.     DB    'X    Exit program'
  1643.     DB    CR,LF
  1644.     DB    'Z[nn]    Sleep [nn tenths]'
  1645.     DB    CR,LF
  1646.     DB    '/[nn]    Repeat [nn (decimal) times]'
  1647.     DB    CR,LF,CR,LF
  1648.     DB    'Cancel a function with C or Ctl-C.'
  1649.     DB    CR,LF
  1650.     DB    'Suspend output with S or Ctl-S.'
  1651.     DB    CR,LF
  1652.     DB    'Separate commands with ";".'
  1653.     DB    CR,LF
  1654.     DB    'All "nn" usage except "/" are '
  1655.     DB    'HEX.  Use #nn for decimal.'
  1656.     DB    CR,LF,0
  1657.     JMP    PROMPT
  1658. ;
  1659. ;DISK SECTOR ORDER - standard CP/M
  1660. ;
  1661. SECTBL    DB    1,7,13,19,25,5,11,17,23,3,09,15,21
  1662.     DB    2,8,14,20,26,6,12,18,24,4,10,16,22
  1663. ;
  1664. BUFAD    DW    100H    ;FORCES INITIAL READ
  1665. HEXAD    DW    0    ;TO RE-FETCH A VALUE
  1666. TOGO    DB    0FFH    ;REPEAT COUNT (FF=CONT)
  1667. TWOUP    DB    0
  1668. PFLAG    DB    0    ;1=PRINT
  1669. GROUP    DB    0
  1670. GRPDISP    DB    0
  1671. SAVEFLG    DB    0
  1672. CURTRK    DB    0
  1673. CURSEC    DB    1
  1674. PHYSEC    DB    1
  1675. TABCOL    DB    0
  1676. FILECT    DB    0
  1677. DIRPOS    DB    0
  1678. FINDFLG    DB    0    ;1=MUST POSITION AFTER FIND
  1679. FTSW    DB    1    ;SEARCH W/O INCREMENT
  1680. WRFLG    DB    0    ;MAY NOT WRITE UNTIL '+', '-',
  1681. ;             OR 'G' COMMAND
  1682.     DS    100    ;STACK SPACE
  1683. STACK:
  1684. DUMTYPE    DS    1
  1685. SAVEBUF    DS    128
  1686. INBUF    DS    128
  1687. ;
  1688. ;DIRECTORY READ IN HERE; ALSO SEARCH WORKAREA
  1689. ;
  1690. WORK:
  1691. DIRECT    DS    32*64
  1692. ;
  1693. FCB    EQU    5CH
  1694. BDOS    EQU    5
  1695. RESETDK    EQU    13
  1696. SELDK    EQU    14
  1697. SRCHF    EQU    17    ;SEARCH FIRST
  1698.