home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol021 / du.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  28.5 KB  |  1,713 lines

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