home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug078.ark / DUU.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  50.4 KB  |  2,831 lines

  1. ;DUU-01.ASM - Disk Utility Universal.
  2. ;
  3. ;Based upon DU.ASM  V7.5 Revised 1/23/81
  4. ;    which in turn was based upon the versions of
  5. ;    DU on CP/MUG volumes 40 and 46.
  6. ;
  7. ;Modified for CP/M UG 7/31 and 09/27/81 Ward Christensen
  8. ;
  9. ;DISK UTILITY - By Ward Christensen
  10. ;    
  11. ;PROCESSOR: ASM OR MAC
  12. ;
  13. ;DEPENDENCIES: None known - see comments below.
  14. ;
  15. ;REVISIONS (LAST FIRST):
  16. ;
  17. ;10/23/81 <WLC>    Deleted "U" command.  No longer used by
  18. ;    "F" (its only purpose).  I forgot to delete it
  19. ;    when "F" was rewritten.
  20. ;
  21. ;->    Made sure + and - check the "NOTPOS" flag; that
  22. ;    was a "loophole" that could "mislead" you.
  23. ;
  24. ;->    Added ability to put Hex into default decimal
  25. ;    fields.  Needed this to transfer files, where
  26. ;    their hex length is known, i.e. a file 29h
  27. ;    sectors long in contiguous extents may be
  28. ;    read into memory via: <<;+;/29h
  29. ;
  30. ;->    Added "E" (erase screen) command.  Store the
  31. ;    char sequence, 0ffH terminated, at 104h.
  32. ;    Useful as in "e;+;d;z20;/" to dump, sit, loop.
  33. ;    The screen clear "e" causes the display to "sit".
  34. ;
  35. ;->    Set "@" when using "F" command, so for example
  36. ;    to erase a file: "ffoo.zot;ch@,e5";w
  37. ;    Also change "not found" of "F" command so it
  38. ;    aborts, thus preventing, in the above ex., the
  39. ;    actual change-and-write.
  40. ;
  41. ;10/21/81 <WLC> "Z" command: make it wait a
  42. ;    decimal # of tenths of a second not hex.
  43. ;
  44. ;->    Add "<<" command, to save a sector, bumping
  45. ;    the sector address saved at.  The ">>" command
  46. ;    will get back the oldest saved sector.
  47. ;    Any time "<" is executed, all saved sectors
  48. ;    are "tossed".  Use this for "buffer reset".
  49. ;
  50. ;    For example, to transfer a single-density track 0
  51. ;    to the buffer, then to another disk:
  52. ;
  53. ;    t0;s1;<        position, restore buffer
  54. ;    <<;+;/26    save, step in 26 times
  55. ;    lb;t0;s1    log in drive b, position
  56. ;    >>;w;+;/26    restore, write, step, repeat 26
  57. ;        ----
  58. ;->    The "M" command needs space to read the directory......
  59. ;    into.  It uses the space FOLLOWING the highest active
  60. ;    read sector.  If you get "out of memory" on the "M"
  61. ;    command, you will have to issue "<" to reset the
  62. ;    buffer.
  63. ;
  64. ;->    Added symbol "@" to mean "the address at which
  65. ;    the last "=" (search) matched.  Thus to scan for
  66. ;    an "LIX" somewhere on the disk, and change it
  67. ;    to an LXI:
  68. ;    =LIX;CA@,LXI    
  69. ;    (Change ascii "@ where it matched" to LXI)
  70. ;
  71. ;    Note that + and - may be used with "@", i.e.
  72. ;    =LXI<9>H,9;CA@+6,5
  73. ;    would change the "9" to a "5".
  74. ;
  75. ;    May also be used with the CHfrom-thru,value,
  76. ;    but DUU would take the "-" as arithmetic on the
  77. ;    "@", and not as "thru".  Thus a "hack" need be
  78. ;    used: ch@+0-@+1f,e5        The "@+0" allows
  79. ;    the "-" to be taken in the context     of "thru".
  80. ;    ch@-@+1f,e5        would be interpreted as
  81. ;    "@ minus (@+1f)", which isn't what you want.
  82. ;
  83. ;10/10/81 <WLC> "F" command showed (S)ector 1 too
  84. ;    high because it called NEXTSEC before
  85. ;    displaying it
  86. ;
  87. ;================ TO CP/MUG AS OF HERE ================
  88. ;
  89. ;10/01/81 Corrected minor bug in "M" command so that
  90. ;    it now properly positions in input buffer if it
  91. ;    is ^C interrupted.  Thus "m;ffoo.asm" or some
  92. ;    such will work if the "M"-map is interrupted. (WLC)
  93. ;
  94. ;09/30/81 Moved the stack back to being in the program,
  95. ;    insted of "below BDOS".  Changing the stack from
  96. ;    beingd in the program, to being below BDOS,
  97. ;    introduced the (rare but potential) bug of the
  98. ;    directory read overlaying the stack.  I don't
  99. ;    understand the reason why it was changed in the 1st
  100. ;    place. (WLC)
  101. ;
  102. ;09/27/81 Changed "F" command to work with 2.2 to find
  103. ;    a file in the directory.  "F" with no operands
  104. ;    finds the next occurrence of the file.  I think
  105. ;    this obsoletes the "U" command, because the only
  106. ;    reason I could see for the "U" command was the
  107. ;    directory search of the old "U" command. (WLC)
  108. ;
  109. ;07/31/81 I compared this version (DU-V75) against my
  110. ;    current version, using a character-by-character
  111. ;    split-screen video compare.  The "significant"
  112. ;    changes turned out to be buried in "insignificant"
  113. ;    changes, i.e. case changes of comments, etc. I guess
  114. ;    I "over-reacted" to the significant stylistic
  115. ;    changes in DU, and "changed the program back" to "my
  116. ;    style" - i.e. deleted "type any char to continue",
  117. ;    colons after labels, less meaningful short labels,
  118. ;    etc.  Noise lines, i.e. ";" lines before continu-
  119. ;    ation labels, etc. made "+", "-", "/" all be back to
  120. ;    decimal numbers. (single density "+26" goes in a
  121. ;    track, not "+1a"). Also deleted historical comments
  122. ;    which are no longer relevant such as specific
  123. ;    controller mods which are now replaced by Ron
  124. ;    Fowler's excellent "universal" disk handling.  (WLC)
  125. ;
  126. ;    One warning: This program assumes track 0 to be
  127. ;    the same format as the rest of the disk.  This is
  128. ;    valid for hard disks, but for most floppy systems,
  129. ;    (take that to mean "all I have seen") track 0 is
  130. ;    single density.  On my tarbell, doing "t0;s1", which
  131. ;    should be the sector occupied by the BOOT, DUU
  132. ;    "hangs".  I found I have to do "t0;s2" to get the
  133. ;    first sector.  Also, attempts to go beyond the 26
  134. ;    sectors track 0 have on it, will hang the system.
  135. ;    09/27/81 Ward C.
  136. ;
  137. ;See DU.DOC for description and detailed instructions.
  138. ;    Also, some details are near the end of this
  139. ;    file in the form of the help text.
  140. ;
  141. ;This version of DU is compatible with CP/M 1.4 and 2.x
  142. ;and does not require alteration for various hardware
  143. ;configurations.  It adjusts itself automatically to
  144. ;the correct number of sectors, tracks, directory size,
  145. ;etc.  It has been tested on 5-1/4" and 8" floppy, and
  146. ;10 megabyte hard disk systems.
  147. ;
  148. ;Because of the automatic adaption feature, no conditional
  149. ;assembly options are included.  The only alteration that
  150. ;needs to be done is to use DDT to set the byte at 103h
  151. ;to zero for systems using a 2 mHz clock or non-zero for
  152. ;4 mHz clock.  This only affects the time delay used in
  153. ;the 'sleep' command.
  154. ;
  155. ;*************************************************
  156. ;*                          *
  157. ;*   This program has been heavily modified     *
  158. ;* to allow it to work without modification     *
  159. ;* on most versions of CP/M 1.4 and, hopefully,     *
  160. ;* all versions of CP/M 2.x.             *
  161. ;*   If you have difficulty getting this program *
  162. ;* to run, AND if you are using CP/M 2.x, AND     *
  163. ;* if you know your BIOS to be bug-free, leave     *
  164. ;* a message on Technical CBBS of Dearborn,     *
  165. ;* Michigan (313)-846-6127 with a description     *
  166. ;* of the problem and a summary of your hard-     *
  167. ;* ware configuration.                 *
  168. ;*   One known possible problem involves the     *
  169. ;* system tracks on some systems, and results     *
  170. ;* from the system sectors being skewed. There     *
  171. ;* is NO way for a program executing under CP/M     *
  172. ;* to know about this.  This program assumes the *
  173. ;* standard convention of no skew being used on     *
  174. ;* the system tracks. This usually isn't a prob- *
  175. ;* lem because the SYSGEN program can be used to *
  176. ;* get the system from the disk so that    it can     *
  177. ;* be modified.                     *
  178. ;*   This program should work under standard     *
  179. ;* versions of CP/M 1.4.  The only requirement     *
  180. ;* is that the BIOS "SETSEC" routine not modify     *
  181. ;* the sector number passed to it in the B      *
  182. ;* register.  Again, system tracks with skewed     *
  183. ;* sectors will be a problem.             *
  184. ;*   If you add any features or make any useful     *
  185. ;* changes to this program, please modem a copy     *
  186. ;* to the above CBBS, so the currency of the     *
  187. ;* program can be maintained.             *
  188. ;*                         *
  189. ;*         Ron Fowler             *
  190. ;*                         *
  191. ;*************************************************
  192. ;
  193. ;01/23/81 Changed SETSEC to ignore high-order result of
  194. ;      SECTRN if SPT<256.  This fixes some translation
  195. ;      problems where the BIOS leaves garbage in H. (BRR)
  196. ;
  197. ;01/13/81 Updated help messages for '#' and 'N' commands.
  198. ;      Modified sign-on message.  (RGF)
  199. ;
  200. ;01/12/81 Fixed problem with sector translation under
  201. ;      CP/M 1.4.  (RGF)
  202. ;
  203. ;01/11/81 Fixed problem with CP/M 1.4.  Added 'N' command.
  204. ;      Hard-code 'FASTCLOCK' as a boolean at 103h.  Add
  205. ;      fix for sector number being 0 in system tracks,
  206. ;      as suggested by Keith Petersen, W8SDZ. Added '#'
  207. ;      command and memory-full check. Changed login to
  208. ;      position to directory track at every log.  This
  209. ;      is necessary to set up the 'FIRST0' flag.  (RGF)
  210. ;
  211. ;01/08/81 Corrected error in MAP routine that caused map
  212. ;      to fail when >255 groups allocated.  Changed
  213. ;      'REPEAT' to allow up to 65535 repeats.  (RGF)
  214. ;    09/27/81 changed REPEAT back from HEX to decimal. <WLC>
  215. ;
  216. ;01/06/81 Modified to allow use with ALL systems, without
  217. ;      conditional assembly, thru use of disk parameter
  218. ;      block.  By Ron Fowler, Westland, Mich.
  219. ;
  220. ;01/05/81 Modified '+' and '-' commands as follows:
  221. ;        1) + at end of disk now wraps to start
  222. ;        2) - at start wraps back to end
  223. ;        3) argument for + & - now good to 65535
  224. ;                (RGF)
  225. ;    07/31/81 UN-DID THIS. (WLC)
  226. ;
  227. ;01/03/81 Modified logic in console status test to allow
  228. ;      any non-zero value to indicate char waiting.
  229. ;            (RGF)
  230. ;
  231. ;    09/27/81 WLC question about the above mod - "Why was
  232. ;    it done?"  The CP/M alteration guide says "CONST
  233. ;    ...return[s] a 0FFH in register A if a character is
  234. ;    ready to read, an 00H in register A if no console
  235. ;    characters are ready..."  Why allow "any non-zero value"????
  236. ;
  237. ;
  238. ;01/02/81 Made compatible with MACRO80 assembler
  239. ;    (labels made unique within 6 chars, and separated
  240. ;    multi-statement lines).  (RGF)
  241. ;    07/31/81 UN-DONE.  THIS IS AN "ASM" PROGRAM. I
  242. ;    "SLEEP", NOT "SLEP", AND "PROMPT" NOT "PRMPT". 
  243. ;    Since all CP/M systems come with ASM, I see nothing
  244. ;    wrong with taking advantage of all meaningful
  245. ;    characters a label may have, even if it excludes
  246. ;    assembly by the occasionl M-80 user, (who must have
  247. ;    ASM anyway).
  248. ;
  249. ;11/04/80 Forced write type 1 (pre-read and immediate
  250. ;    write) so deblocking BIOS's don't mess up.  Ignore
  251. ;    bit 7 in = command unless <nn> form was used. 
  252. ;    Display unprintables as <nn> in V command.  Show
  253. ;    user no. in M command (will always be 00 for 1.4)
  254. ;    and only print parentheses if E5 present.  (BRR)
  255. ;
  256. ;10/30/80 Fixed bug in backspace/control-X.  Corrected more
  257. ;      bit-7 stuff.    Added 'U' command to change user no.
  258. ;      under CP/M 2.x.  Added pauses in help file. (BRR)
  259. ;
  260. ;09/16/80 Fix backspace in line enter routine, add MAXDIR
  261. ;      equate, general cleanup of ASM file. (KBP)
  262. ;
  263. ;06/22/80 Put in 'Q' command.  Fix so 'P' (printer)
  264. ;      mode outputs L/F's.  (WLC)
  265. ;
  266. ;05/21/80 Make sector, track, be decimal, not hex.
  267. ;      Also dis-allow a read until positioned.
  268. ;      (DU otherwise not in sync with CP/M)  (WLC)
  269. ;
  270. ;02/24/80 Mod login command to not really do log, just
  271. ;      drive select.  (WLC)
  272. ;
  273. ;01/08/80 Reposition after 'M' command.  (WLC)
  274. ;
  275. ;01/07/79 Add VIEW command.  (WLC)
  276. ;
  277. ;01/06/80 Rewrite 'F' command.  (WLC)
  278. ;
  279. ;10/10/79 Save regs in BIOS calls, translate input to upper case
  280. ;      add commands: < save sector
  281. ;            > restore sect
  282. ;            / repeat
  283. ;      allow change from-thru.  (WLC)
  284. ;
  285. ;02/25/79 Put sector read into 'S' command.  (WLC)
  286. ;
  287. ;11/26/78 Add disk # to login command.  (WLC)
  288. ;
  289. ;11/12/78 Add login command.  (WLC)
  290. ;
  291. ;08/06/78 Originally written to reconstruct blown
  292. ;      disks on CBBS via remote access.  (WLC)
  293. ;
  294. ;
  295. ;        ----------------
  296. ;Sorry for the lack of comments in the code 
  297. ;portion of this program - it was just hacked
  298. ;together to satisfy my needs, but lots of
  299. ;other people found it useful.    Its external
  300. ;documentation is good, but its sadly lacking
  301. ;comments on the instructions.  (WLC)
  302. ;        ----------------
  303. ;
  304. ;System equates
  305. ;
  306. BASE    EQU    0    ;SET TO 4200H FOR HEATH OR TRS-80 ALTCPM
  307. ;
  308. FCB    EQU    BASE+5CH
  309. BDOS    EQU    BASE+5
  310. PRINT    EQU    9
  311. GVERS    EQU    12
  312. RESETDK EQU    13
  313. SELDK    EQU    14
  314. SRCHF    EQU    17    ;SEARCH FIRST
  315. SUSER    EQU    32
  316. GETDSK    EQU    25
  317. GETDPB    EQU    31
  318. ;
  319. TRNOFF    EQU    15    ;CP/M 1.4 OFFSET FROM BASE
  320.             ;OF BDOS TO SECTRAN ROUTINE
  321. SKWOFF    EQU    1AH    ;CP/M 1.4 OFFSET TO SKEW TABLE
  322. S2OFF    EQU    14    ;OFFSET INTO FCB FOR S2 BYTE
  323. DPBOFF    EQU    3AH    ;CP/M 1.4 OFFSET TO DPB WITHIN BDOS
  324. S2MASK    EQU    0FH    ;MASK FOR EXTENDED RC BITS OF S2
  325. DPBLEN    EQU    15    ;SIZE OF CP/M 2.x DISK PARM BLOCK
  326. ;
  327. ;
  328. ;Define ASCII characters
  329. ;
  330. CR    EQU    0DH    ;CARRIAGE RETURN
  331. LF    EQU    0AH    ;LINE FEED
  332. TAB    EQU    09H    ;TAB
  333. BS    EQU    08H    ;BACKSPACE
  334. ;
  335.     ORG    BASE+100H
  336. ;
  337.     JMP    PASTCK    ;JUMP OVER CLOCK BYTE AND I.D.
  338. ;
  339. CLOCK    DB    1    ;<---PUT NON-ZERO HERE FOR 4 MHZ CLOCK
  340. ;
  341. ;====> Store your erase-screen chars here, 0ffH terminated <===
  342. ;
  343. CLEAR    DB    1AH,0FFH,0,0,0,0,0    ;CRT ERASE SEQUENCE
  344. ;
  345. PASTCK    LXI    SP,STACK
  346.     MVI    C,GVERS    ;GET CP/M VERSION NR
  347.     CALL    BDOS
  348.     MOV    A,H    ;COMBINE THE TWO BYTE...
  349.     ORA    L    ;...VERSION NR FOR A FLAG
  350.     STA    VER2FL    ;SAVE IT
  351. ;
  352. ;Set up local jumps to BIOS
  353.     LHLD    BASE+1    ;WARM BOOT POINTER
  354.     LXI    D,3    ;READY FOR ADD
  355.     DAD    D    
  356.     SHLD    VCONST+1
  357.     DAD    D
  358.     SHLD    VCONIN+1
  359.     DAD    D
  360.     SHLD    VCONOUT+1
  361.     DAD    D
  362.     SHLD    VLIST+1
  363.     DAD    D    ;PUNCH
  364.     DAD    D    ;RDR
  365.     DAD    D
  366.     SHLD    VHOME+1
  367.     DAD    D
  368.     SHLD    VSELDK+1
  369.     DAD    D
  370.     SHLD    VSETTRK+1
  371.     DAD    D
  372.     SHLD    VSETSEC+1
  373.     DAD    D
  374.     SHLD    SETDMA+1
  375.     DAD    D
  376.     SHLD    VREAD+1
  377.     DAD    D
  378.     SHLD    VWRITE+1
  379.     LDA    VER2FL
  380.     ORA    A
  381.     JZ    DOCPM1
  382.     DAD    D    ;LISTST
  383.     DAD    D
  384.     SHLD    VSCTRN+1
  385.     JMP    HELLO
  386. ;
  387. DOCPM1    LHLD    BDOS+1
  388.     MVI    L,0     ;BDOS ON PAGE BOUNDARY
  389.     PUSH    H
  390.     LXI    D,TRNOFF ;CP/M 1.4 SECTRAN ROUTINE OFFSET
  391.     DAD    D
  392.     SHLD    VSCTRN+1
  393.     POP    H
  394.     LXI    D,SKWOFF ;CP/M 1.4 SKEW TABLE OFFSET
  395.     DAD    D
  396.     SHLD    SECTBL     ;SET UP SKEW TABLE POINTER
  397. ;
  398. HELLO    CALL    ILPRT
  399.     DB    CR,LF,'DISK UTILITY ver 7.5+mods 10/23/81'
  400.     DB    CR,LF
  401.     DB    'Universal Version (DUU)',CR,LF
  402.     DB    CR,LF
  403.     DB    'Type ? for help',CR,LF
  404.     DB    'Type X to exit'
  405.     DB    CR,LF,0
  406.     CALL    GETSTP        ;SET UP PARAMETERS
  407.     CALL    NOCONT        ;SHOW "F" NOT ALLOWED
  408.     LXI    H,BASE+80H ;TO INPUT BUFF
  409.     MOV    A,M
  410.     ORA    A
  411.     JZ    PROMPTR    ;NO COMMAND
  412. ;GOT INITIAL COMMAND, SET IT UP
  413.     MOV    B,A    ;SAVE LENGTH
  414.     DCR    B
  415.     JZ    PROMPTR
  416.     LXI    D,INBUF
  417.     INX    H    ;SKIP LEN
  418.     INX    H    ;SKIP ' '
  419.     CALL    MOVE
  420.     MVI    A,CR
  421.     STAX    D
  422.     LXI    H,INBUF
  423.     JMP    PROMPTI
  424. ;
  425. PROMPTC    CALL    CRLF
  426.     JMP    PROMPT
  427. ;
  428. PROMPRC    CALL    CRLF
  429. PROMPTR    XRA    A
  430.     STA    QFLAG
  431.     CALL    RDBUF
  432. PROMPTI    MVI    A,255
  433.     STA    TOGO    ;LOOP COUNT FOR "/"
  434.     STA    TOGO+1
  435. PROMPT    EQU    $
  436. SETSTK    LXI    SP,STACK
  437.     XRA    A    ;ZERO 2-UP PRINT
  438.     STA    TWOUP    ;..SWITCH
  439.     MVI    A,1
  440.     STA    FTSW    ;TELL SEARCH NOT TO INCR
  441.     PUSH    H
  442.     LXI    H,BASE+100H
  443.     SHLD    BUFAD    ;FOR RDBYTE
  444.     POP    H
  445.     CALL    CTLCS    ;ABORT?
  446.     JZ    PROMPRC    ;..YES, READ BUFFER
  447.     MOV    A,M
  448.     CPI    CR
  449.     JZ    PROMPTR
  450.     CPI    ';'    ;LOGICAL CR?
  451.     INX    H
  452.     JZ    PROMPT
  453.     CALL    UPCASE
  454.     STA    DUMTYPE    ;TYPE OF DUMP (A,D,H)
  455.     CPI    '+' ! JZ PLUS
  456.     CPI    '-' ! JZ MINUS
  457.     CPI    '=' ! JZ SEARCH
  458.     CPI    '<' ! JZ SAVE
  459.     CPI    '>' ! JZ RESTORE
  460.     CPI    '#' ! JZ STATS
  461.     CPI    '?' ! JZ HELP
  462.     CPI    'A' ! JZ DUMP
  463.     CPI    'C' ! JZ CHG
  464.     CPI    'D' ! JZ DUMP
  465.     CPI    'E' ! JZ ERASE
  466.     CPI    'F' ! JZ POSFIL
  467.     CPI    'G' ! JZ POS
  468.     CPI    'H' ! JZ DUMP
  469.     CPI    'L' ! JZ LOGIN
  470.     CPI    'M' ! JZ MAP
  471.     CPI    'N' ! JZ NEWDSK
  472.     CPI    'P' ! JZ PRINTFF
  473.     CPI    'Q' ! JZ QUIET
  474.     CPI    'R' ! JZ DOREAD
  475.     CPI    'S' ! JZ POS
  476.     CPI    'T' ! JZ POS
  477.     CPI    'V' ! JZ VIEW
  478.     CPI    'W' ! JZ DOWRITE
  479.     CPI    'X' ! JZ BASE
  480.     CPI    'Z' ! JZ SLEEP
  481.     CPI    '/' ! JZ REPEAT
  482. ;
  483. WHAT    XRA    A
  484.     STA    QFLAG
  485.     CALL    ILPRT
  486.     DB    '?',CR,LF,0
  487.     JMP    PROMPTR
  488. ;
  489. ;Memory full error
  490. ;
  491. MEMFULL    XRA    A
  492.     STA    QFLAG
  493.     CALL    ILPRT
  494.     DB    '+++ Out of memory +++',CR,LF
  495.     DB    ' (may be due to many "<<" stacked sectors)'
  496.     DB    CR,LF,0
  497.     JMP    PROMPTR
  498. ;
  499. ;Print disk statistics
  500. ;
  501. STATS    PUSH    H
  502.     CALL    ILPRT
  503.     DB    'Disk Information:',CR,LF
  504.     DB    'Tracks:',9,9,0
  505.     LHLD    MAXTRK
  506.     INX    H
  507.     CALL    DEC
  508.     CALL    ILPRT
  509.     DB    CR,LF,'Sec/trk:',9,0
  510.     LHLD    SPT
  511.     CALL    DEC
  512.     CALL    ILPRT
  513.     DB    CR,LF,'Grpsize:',9,0
  514.     LDA    BLM
  515.     INR    A
  516.     MOV    L,A
  517.     MVI    H,0
  518.     CALL    DEC
  519.     CALL    ILPRT
  520.     DB    ' (sectors per group)',CR,LF
  521.     DB    'Tot grps:',9,0
  522.     LHLD    DSM
  523.     CALL    DEC
  524.     CALL    ILPRT
  525.     DB    CR,LF,'Dir entries:',9,0
  526.     LHLD    DRM
  527.     INX    H
  528.     CALL    DEC
  529.     CALL    ILPRT
  530.     DB    CR,LF,'Sys tracks:',9,0
  531.     LHLD    SYSTRK
  532.     CALL    DEC
  533.     CALL    ILPRT
  534.     DB    CR,LF,CR,LF,'Sectors in "<<" buffer: ',0
  535.     LHLD    NUMSAVD
  536.     MVI    H,0
  537.     CALL    DEC
  538.     CALL    ILPRT
  539.     DB    CR,LF,'Number gotten via ">>": ',0
  540.     LHLD    NUMREST
  541.     MVI    H,0
  542.     CALL    DEC
  543.     CALL    CRLF
  544.     POP    H
  545.     JMP    PROMPT
  546. ;
  547. ;The following command resets the disk
  548. ;system thru CP/M, and may be usable for
  549. ;changing the disk density or format.
  550. ;This can only be done if your BIOS resets
  551. ;the auto-density select parameters at
  552. ;every track-zero access.
  553. ;
  554. NEWDSK    PUSH    H
  555.     CALL    NOCONT
  556.     MVI    C,RESETDK
  557.     CALL    BDOS
  558.     LDA    DRIVE
  559.     MOV    C,A
  560.     POP    H
  561.     CALL    SELECT
  562.     JMP    PROMPT
  563. ;
  564. ;QUIET MODE
  565. ;
  566. QUIET    STA    QFLAG    ;NOW QUIET
  567.     JMP    PROMPT
  568. ;
  569. ;REPEAT BUFFER CONTENTS
  570. ;
  571. REPEAT    CALL    DECIN    ;NN SPECIFIED?
  572.     MOV    A,D
  573.     ORA    E
  574.     JZ    NNN    ;NO.
  575.     LHLD    TOGO
  576.     INX    H    ;TEST FOR FIRST TIME
  577.     MOV    A,H
  578.     ORA    L    ;WAS IT 0FFFFH?
  579.     JNZ    NNN    ;NO    COUNTING
  580.     XCHG        ;GET COUNT
  581.     SHLD    TOGO    ;SET COUNT
  582. NNN    LHLD    TOGO
  583.     XCHG
  584.     LXI    H,INBUF    ;READY TO REPEAT
  585.     INX    D    ;TEST FOR 0FFFFH
  586.     MOV    A,D
  587.     ORA    E
  588.     JZ    PROMPT    ;CONTINOUS
  589.     DCX    D    ;COUNT DOWN
  590.     DCX    D    ;MAKE UP FOR PREV INX D
  591.     XCHG
  592.     SHLD    TOGO
  593.     MOV    A,H    ;ALL DONE?
  594.     ORA    L
  595.     XCHG        ;GET BACK INBUF PTR
  596.     JNZ    PROMPT    ;NO, KEEP GOING
  597.     JMP    PROMPTR    ;ALL DONE
  598. ;
  599. ;TOGGLE PRINT FLAG
  600. ;
  601. PRINTFF    LDA    PFLAG
  602.     XRI    1
  603.     STA    PFLAG
  604.     JMP    PROMPT
  605. ;
  606. ;SLEEP ROUTINE, IN TENTHS OF A SEC
  607. ;
  608. SLEEP    CALL    DECIN    ;GET COUNT IF ANY
  609.     MOV    A,E    ;ANY?
  610.     ORA    A
  611.     JNZ    SLEEPLP
  612.     MVI    E,10
  613. SLEEPLP    LXI    B,8000    ;APPROX .1 SEC @ 2MHz
  614.     LDA    CLOCK
  615.     ORA    A
  616.     JZ    SLEEP2
  617.     LXI    B,16000    ;APPROX .1 SEC @ 4 MHz
  618. SLEEP2    DCX    B
  619.     MOV    A,B
  620.     ORA    C
  621.     JNZ    SLEEP2
  622.     PUSH    D
  623.     CALL    CTLCS
  624.     POP    D
  625.     JZ    PROMPRC
  626.     DCR    E
  627.     JNZ    SLEEPLP
  628.     JMP    PROMPT
  629. ;
  630. ;CHECK FOR CONTROL-C OR S
  631. ;
  632. CTLCS    CALL    CONST
  633.     ORA    A
  634.     JNZ    GETC
  635.     ORI    1    ;NO CHAR, RETN NZ
  636.     RET
  637. GETC    CALL    CONIN
  638.     ANI    1FH    ;ALLOW ASCII
  639.     CPI    'S'-40H
  640.     CZ    CONIN
  641.     CPI    'C'-40H
  642.     RET        ;0 SET IF CTL-C
  643. ;
  644. ;Find our way at initialization
  645. ;
  646. GETSTP    MVI    C,GETDSK
  647.     CALL    BDOS    ;GET CURNT DSK
  648.     MOV    C,A    ;  WE HAVE TO SELECT
  649.     JMP    SELECT    ;  TO GET THE DPH
  650. ;
  651. LOGIN    CALL    NOCONT
  652.     CALL    DOLOG
  653.     JMP    PROMPT
  654. ;
  655. DOLOG    MOV    A,M    ;DISK REQ?
  656.     LXI    D,0
  657.     CPI    CR
  658.     JZ    LGNODK
  659.     CPI    ';'
  660.     JZ    LGNODK
  661.     CALL    UPCASE
  662.     INX    H
  663.     SUI    'A'
  664.     MOV    C,A
  665. SELECT    PUSH    H
  666.     MOV    A,C
  667.     STA    DRIVE    ;REMEMBER LATER WHERE WE ARE
  668. VSELDK    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  669.     LDA    VER2FL
  670.     ORA    A    ;IF NOT CP/M 2.x ...
  671.     JZ    SELSKP    ;..THEN SKIP THIS JUNK
  672.     MOV    A,H
  673.     ORA    L
  674.     JZ    WHAT    ;SELECT ERROR
  675.     MOV    E,M    ;GET THE SECTOR TABLE PNTR
  676.     INX    H
  677.     MOV    D,M
  678.     INX    H
  679.     XCHG
  680.     SHLD    SECTBL
  681.     LXI    H,8    ;OFFSET TO DPBPTR
  682.     DAD    D
  683.     MOV    A,M    ;PICK UP DPB POINTER
  684.     INX    H    ;  TO USE
  685.     MOV    H,M    ;  AS PARAMETER
  686.     MOV    L,A    ;  TO LOGIT
  687. SELSKP    CALL    LOGIT
  688.     LHLD    SYSTRK    ;RESET TRACK AND SECTOR
  689.     XCHG        ;  TO DIRECTORY
  690.     CALL    SETTRK    ;  ON EVERY
  691.     LXI    D,1    ;  LOGIN
  692.     CALL    SETSEC    ;  CHANGE
  693.     LHLD    PHYSEC    ;THIS LOGIC WILL TELL
  694.     MOV    A,H    ;  IF FIRST SEC
  695.     ORA    L    ;  IS PHYSICAL 0
  696.     STA    FIRST0
  697.     CALL    CALCSUB
  698.     POP    H
  699. ;
  700. LGNODK    CALL    NOWRITE
  701.     RET
  702. ;
  703. ;READ IN THE DISK DIRECTORY
  704. ;
  705. READDIR    PUSH    H
  706.     CALL    NOWRITE    ;POSITIONING LOST
  707.     LHLD    SYSTRK
  708.     SHLD    CURTRK
  709.     LXI    H,1
  710.     SHLD    CURSEC
  711.     LHLD    DRM    ;GET DIR SIZE FROM DPB
  712.     INX    H    ;MAKE 1-RELATIVE
  713.     CALL    ROTRHL
  714.     CALL    ROTRHL    ;DIVIDE BY 4 (4 NAMES/SECTOR)
  715.     MOV    B,H
  716.     MOV    C,L
  717.     LHLD    NXTSAVE    ;POSITION AFTER SAVE BUFFER
  718.     XCHG        ;MOVE TO DE
  719. RDIRLP    PUSH    B
  720.     PUSH    D
  721.     MOV    B,D
  722.     MOV    C,E
  723.     LDA    BDOS+2    ;CHECK MEM AVAIL
  724.     DCR    A
  725.     CMP    D
  726.     JC    MEMFULL
  727.     CALL    SETDMA
  728.     LHLD    CURTRK
  729.     XCHG
  730.     CALL    SETTRK
  731.     LHLD    CURSEC
  732.     XCHG
  733.     CALL    SETSEC
  734.     CALL    READ
  735.     CALL    NEXTSEC
  736.     POP    D
  737.     POP    B
  738.     LXI    H,80H
  739.     DAD    D
  740.     XCHG
  741.     DCX    B
  742.     MOV    A,B
  743.     ORA    C
  744.     JNZ    RDIRLP
  745.     LXI    B,BASE+80H
  746.     CALL    SETDMA
  747.     POP    H
  748.     RET
  749. ;
  750. ;MA THE DIRECTORY
  751. ;
  752. MAP    CALL    NOCONT    ;CAN'T CONTINUE "F" COMMAND
  753.     CALL    READDIR    ;READ IN DIRECTORY
  754.     MVI    C,0    ;INIT START GRP #
  755.     LDA    AL0    ;READ DIR GRP BITS
  756.     CALL    COLECT    ;COLLECT COUNT OF DIR GRPS..
  757.     LDA    AL1    ;..IN REGISTER C
  758.     CALL    COLECT
  759.     MVI    B,0    ;BC NOW HAS A DEFAULT START GRP #
  760.     CALL    HEXIN
  761.     PUSH    H    ;SAVE INBUF PTR
  762.     MOV    A,E    ;GET START
  763.     ORA    D    ;NOTHING?
  764.     JZ    MAPDF    ;..YES, DFLT
  765.     MOV    B,D
  766.     MOV    C,E
  767. ;
  768. MAPDF    CALL    HEXB
  769.     MVI    A,'-'
  770.     CALL    TYPE
  771.     CALL    GETGRP    ;GET GRP(C) TO HL
  772. MAPCONT    INX    B    ;NEXT GRP #
  773.     PUSH    H
  774.     LHLD    DSM    ;GET HIGHEST GRP #
  775.     INX    H    ;PLUS 1 FOR COMPARISON
  776.     MOV    A,L    ;WHEN BC REACHES DSM+1..
  777.     CMP    C    ;..THEN WE HAVE EXCEEDED..
  778.     JNZ    MAPC1    ;..THE DISK CAPACITY..
  779.     MOV    A,H
  780.     CMP    B
  781. MAPC1    POP    H
  782.     JZ    MAPEND    ;..AND WE ARE DONE
  783.     PUSH    H
  784.     CALL    GETGRP    ;GET ANOTHER
  785.     POP    D    ;SEE IF SAME
  786.     CALL    CTLCS
  787.     JZ    MAPEND2
  788.     MOV    A,D
  789.     CMP    H
  790.     JNZ    MAPDIFF
  791.     MOV    A,E
  792.     CMP    L
  793.     JZ    MAPCONT    ;SAME, CONTINUE
  794. ;
  795. ;DIFFERENT FILE ENCOUNTERED
  796. ;
  797. MAPDIFF    DCX    B
  798.     CALL    HEXB
  799.     INX    B
  800.     XCHG
  801.     CALL    MAPNAME
  802.     JMP    MAPDF
  803. ;
  804. ;END OF MAP
  805. ;
  806. MAPEND    DCX    B    ;GET LAST
  807.     CALL    HEXB
  808.     CALL    MAPNAME
  809. ;
  810. ;END OF MAP - REPOSITION TO PREVIOUS GROUP
  811. ;
  812. MAPEND2    CALL    CRLF
  813.     LHLD    GROUP
  814.     XCHG
  815.     JMP    POSGRP2    ;..WHICH POPS INBUF AND CONTINUES
  816. ;
  817. ;PRINT FILE NAME POINTED TO BY HL
  818. ;
  819. MAPNAME    CALL    SPACE
  820.     MOV    A,H
  821.     ORA    L    ;NONE?
  822.     JZ    NONAME
  823.     MOV    A,M    ;SEE IF ALLOC
  824.     CPI    0E5H    ;FREE?
  825.     MVI    A,' '
  826.     JNZ    MAPNSP1
  827.     MVI    A,'('
  828. MAPNSP1    CALL    TYPE
  829.     PUSH    H    ;SAVE POINTER
  830.     MOV    A,M
  831.     CALL    HEX    ;SHOW USER NUMBER
  832.     CALL    SPACE
  833.     INX    H    ;SKIP USER BYTE
  834.     PUSH    B
  835.     MVI    B,8
  836.     CALL    MAPN2
  837.     MVI    A,'.'
  838.     CALL    TYPE
  839.     MVI    B,3
  840.     CALL    MAPN2
  841.     POP    B
  842.     CALL    SPACE
  843.     MOV    A,M    ;GET EXT
  844.     CALL    HEX
  845.     POP    H
  846.     MOV    A,M
  847.     CPI    0E5H
  848.     MVI    A,' '
  849.     JNZ    MAPNSP2
  850.     MVI    A,')'
  851. MAPNSP2    CALL    TYPE    ;")" IF ERASED FILE
  852.     JMP    FLIP
  853. ;
  854. NONAME    CALL    ILPRT
  855.     DB    '    ++FREE++        ',0
  856. FLIP    LDA    TWOUP
  857.     XRI    1
  858.     STA    TWOUP
  859.     JZ    CRLF
  860. DELIM    MVI    A,':'
  861.     CALL    TYPE
  862.     JMP    SPACE
  863. ;
  864. ;PRINT NAME, LENGTH IN B
  865. ;
  866. MAPN2    MOV    A,M
  867.     ANI    7FH    ;STRIP POSSIBLE 2.x ATTRIBUTE BIT
  868.     INX    H
  869.     CPI    ' '    ;PRINTABLE?
  870.     JC    MAPN2H    ;..NO, IN HEX
  871.     CPI    7EH    ;7E IS LEADIN ON SOME CRTS
  872.     JC    MAPN2A
  873. MAPN2H    CALL    BHEX
  874.     JMP    MAPN2Z
  875. ;
  876. MAPN2A    CALL    TYPE
  877. MAPN2Z    DCR    B
  878.     JNZ    MAPN2
  879.     RET
  880. ;
  881. ;FIND WHICH FILE GROUP (BC) BELONGS TO
  882. ;
  883. GETGRP    LHLD    DRM    ;MAX DIR ENTRY #
  884.     INX    H    ;MAKE 1-RELATIVE
  885.     SHLD    FILECT
  886.     LHLD    NXTSAVE    ;DIR. READ IN AFTER SAVE BUFFER
  887. GETGLP    PUSH    H    ;SAVE POINTER TO NAME
  888.     MOV    A,M    ;PICK UP DN BYTE
  889.     LXI    D,14    ;NOW GET RECORD COUNT
  890.     DAD    D    ;  S2 PORTION ..
  891.     MOV    A,M    ;  IS 0 IN CP/M 1.4
  892.     CPI    0E5H
  893.     JZ    GETGNF
  894.     ANI    0FH
  895.     MOV    E,A
  896.     INX    H
  897.     MOV    A,M
  898.     ORA    E
  899.     JZ    GETGNF
  900.     MVI    E,16    ;FIRST SET FOR 8-BIT GRPS
  901.     LDA    DSM+1
  902.     ORA    A
  903.     JZ    SMALGRP
  904.     MVI    E,8    ;NOPE, BIG GROUPS
  905. SMALGRP    MOV    D,A    ;SAVE GRP SIZE INDICATOR
  906. GETGL2    INX    H    ;POINTING INTO DM FIELD
  907.     CALL    GRPCMP    ;COMPARE BC GRP # AGAINST 1 DM FLD
  908.     JZ    GETGOT    ;JUMP IF FOUND ONE
  909.     DCR    E    ;ELSE COUNT DOWN
  910.     JNZ    GETGL2    ;GO TEST SOME MORE
  911. GETGNF    POP    H    ;NOT THIS ONE!
  912.     LXI    D,32    ;SO GO TO NEXT
  913.     DAD    D
  914.     XCHG
  915.     LHLD    FILECT    ;THERE IS LIMIT TO EVERYTHING
  916.     DCX    H
  917.     SHLD    FILECT
  918.     MOV    A,H
  919.     ORA    L
  920.     XCHG        ;RE-ALIGN
  921.     JNZ    GETGLP
  922. ;
  923. ;Group is not allocated to any file
  924.     LXI    H,0    ;SAY SO
  925.     RET
  926. ;
  927. ;GOT THE FILE
  928. ;
  929. GETGOT    POP    H
  930.     RET
  931. ;
  932. ;SAVE THE CURRENT SECTOR.  IF "<" SAVE ONLY ONE, AND
  933. ;    RESET THE SAVED STACK.  IF "<<" SAVE, POINT
  934. ;    TO NEXT BUFFER ADDR.
  935. ;
  936. SAVE    LDA    WRFLG
  937.     ORA    A
  938.     JZ    BADW    ;NONE TO SAVE
  939.     MVI    A,'<'    ;TEST NEXT CHAR
  940.     CALL    NEXTEST    ;    FOR '<'
  941.     PUSH    H
  942.     LHLD    NXTSAVE
  943.     XCHG
  944.     JNZ    SAVECUR    ;SAVE, SECT ADDR IN DE
  945.     LXI    H,80H
  946.     DAD    D    ;HL = NEXT SECT
  947.     SHLD    NXTSAVE    ;SAVE NEXT SECT ADDR
  948.     LDA    NUMSAVD
  949.     INR    A
  950.     STA    NUMSAVD
  951.     JNZ    SAVENS
  952.     DCR    A
  953.     STA    NUMSAVD
  954.     XCHG
  955.     SHLD    NXTSAVE
  956.     XRA    A
  957.     STA    QFLAG
  958.     CALL    ILPRT
  959.     DB    '++ Can''t save more than 255 sectors'
  960.     DB    CR,LF,0
  961.     JMP    PROMPTR
  962. ;
  963. SAVECUR    CALL    RESETBF    ;RESET BUFF POINTERS
  964. ;
  965. SAVENS    LDA    BDOS+2
  966.     DCR    A
  967.     CMP    D
  968.     JZ    MEMFULL
  969.     LXI    H,BASE+80H
  970.     MVI    B,128
  971.     CALL    MOVE
  972.     MVI    A,1    ;..SHOW
  973.     STA    SAVEFLG    ;..SAVED EXISTS
  974.     POP    H
  975.     JMP    PROMPT
  976. ;
  977. ;RESTORE THE CURRENT SECTOR
  978. ;
  979. RESTORE    LDA    SAVEFLG
  980.     ORA    A
  981.     JZ    NOSAVE    ;NONE TO SAVE
  982.     MVI    A,'>'
  983.     CALL    NEXTEST    ;SEE IF WANT NEXT
  984.     PUSH    H
  985.     LHLD    NXTREST
  986.     JNZ    RESTN    ;OLD SECTOR
  987. ;
  988. ;REQUEST TO RESTORE "NEXT" SECTOR
  989. ;
  990.     XCHG        ;SAVE POINTER IN HL
  991.     LDA    NUMSAVD        ;COMPARE # SAVED
  992.     LXI    H,NUMREST    ;    TO
  993.     INR    M        ;    # RESTORED
  994.     CMP    M
  995.     JC    NOSAVE        ;EXIT IF ERROR
  996.     LXI    H,80H
  997.     DAD    D    ;GO TO NEXT BUFFER
  998.     SHLD    NXTREST
  999.     XCHG        ;OLD (UN-INCREMENTED) TO HL
  1000. ;
  1001. RESTN    LXI    D,BASE+80H
  1002.     MVI    B,128
  1003.     CALL    MOVE    ;FROM (HL) TO (DE) LEN. IN (B)
  1004.     POP    H
  1005.     JMP    PROMPT
  1006. ;
  1007. NOSAVE    XRA    A
  1008.     STA    QFLAG
  1009.     CALL    ILPRT
  1010.     DB    '++NO "<" SAVE COMMAND ISSUED',CR,LF
  1011.     DB    '  OR RESTORING MORE THAN SAVED'
  1012.     DB    CR,LF,0
  1013.     CALL    RESETBF    ;RESET BUFF POINTERS
  1014.     JMP    PROMPTR
  1015. ;
  1016. ;RESET "<<" AND ">>" BUFFER POINTERS
  1017. ;
  1018. RESETBF    XRA    A
  1019.     STA    NUMSAVD
  1020.     STA    NUMREST
  1021.     LXI    H,SAVEBUF
  1022.     SHLD    NXTSAVE
  1023.     SHLD    NXTREST
  1024.     RET
  1025. ;
  1026. ;MOVE (HL) TO (DE) LENGTH IN B
  1027. ;
  1028. MOVE    MOV    A,M
  1029.     STAX    D
  1030.     INX    H
  1031.     INX    D
  1032.     DCR    B
  1033.     JNZ    MOVE
  1034.     RET
  1035. ;
  1036. ;TEST IF CURR CHAR IN BUFFER IS = (A).
  1037. ;    BUMP HL IF SO
  1038. ;
  1039. NEXTEST    CMP    M    ;MATCH?
  1040.     RNZ        ;    NO, RET
  1041.     INX    H    ;    YES SKIP IT
  1042.     RET        ;    THEN RETURN
  1043. ;
  1044. NOWRITE    XRA    A    ;GET 0
  1045.     STA    WRFLG    ;CAN'T WRITE NOW
  1046.     RET
  1047. ;
  1048. ;NO MATCH IN SEARCH, TRY NEXT CHAR
  1049. ;
  1050. SRNOMAT    POP    H
  1051.     CALL    CTLCS    ;ABORT?
  1052.     JNZ    SEARCH    ;    NO
  1053.     LXI    H,INBUF    ;YES
  1054.     MVI    M,CR
  1055.     JMP    CALCGRP    ;SHOW WHERE STOPPED
  1056. ;
  1057. ;SEARCH FOR CHARACTER STRING
  1058. ;
  1059. SEARCH    CALL    NOCONT
  1060.     PUSH    H    ;SAVE STRING POINTER
  1061.     XRA    A    ;STORE 0
  1062.     STA    SECDISP    ;    INTO SECT DISPL.
  1063. SRCHL    CALL    RDBYTE    ;GET A BYTE
  1064.     MOV    B,A    ;SAVE IT
  1065.     MOV    A,M    ;CHECK NEXT MATCH CHAR.
  1066.     CPI    '<'    ;WILL IT BE HEX?
  1067.     MOV    A,B    ;RESTORE DISK CHAR
  1068.     JZ    SRCHL1
  1069.     ANI    7FH    ;NEXT CHAR IS ASCII...STRIP BIT 7
  1070. SRCHL1    PUSH    PSW
  1071.     CALL    GETVAL    ;GET SEARCH VALUE
  1072.     MOV    B,A
  1073.     POP    PSW
  1074.     CMP    B    ;MATCH?
  1075.     JNZ    SRNOMAT    ;NO MATCH
  1076.     INX    H
  1077.     MOV    A,M    ;DONE?
  1078.     CPI    CR
  1079.     JZ    SREQU
  1080.     CPI    ';'
  1081.     JNZ    SRCHL
  1082. ;GOT MATCH
  1083. SREQU    XRA    A
  1084.     STA    QFLAG
  1085.     CALL    ILPRT
  1086.     DB    '= AT ',0
  1087.     LDA    BUFAD
  1088.     ANI    7FH
  1089.     CALL    HEX
  1090.     CALL    CRLF
  1091.     JMP    CALCGRP
  1092. ;
  1093. ;GET VALUE FROM INPUT BUFFER
  1094. ;
  1095. GETVAL    MOV    A,M
  1096.     CPI    '<'    ;HEX ESCAPE?
  1097.     RNZ        ;NO, RETURN
  1098. ;"<<" MEANS ONE "<"
  1099.     INX    H
  1100.     MOV    A,M
  1101.     CPI    '<'
  1102.     RZ
  1103. ;GOT HEX
  1104.     PUSH    D
  1105.     CALL    HEXIN    ;GET VALUE
  1106.     CPI    '>'    ;PROPER DELIM?
  1107.     MOV    A,E    ;GET VALUE
  1108.     POP    D
  1109.     JNZ    WHAT    ;ERROR
  1110.     RET
  1111. ;
  1112. ;READ A BYTE AT A TIME
  1113. ;
  1114. RDBYTE    PUSH    H
  1115.     LDA    FTSW    ;FIRST READ?
  1116.     ORA    A
  1117.     JNZ    READ1
  1118.     LHLD    BUFAD
  1119.     MOV    A,L
  1120.     ORA    A    ;IN BUFFER?
  1121.     JM    NORD    ;YES, SKIP READ
  1122. ;
  1123. ;HAVE TO READ
  1124. ;
  1125.     CALL    NEXTSEC
  1126. READ1    XRA    A
  1127.     STA    FTSW    ;NOT FIRST READ
  1128.     LHLD    CURSEC
  1129.     XCHG
  1130.     CALL    SETSEC
  1131.     LHLD    CURTRK
  1132.     XCHG
  1133.     CALL    SETTRK
  1134.     CALL    READ
  1135.     CALL    CALCSUB
  1136.     LXI    H,BASE+80H
  1137. ;
  1138. ;CHECK IF THE BYTE "SECDISP" IS 0.  IF SO, WE ARE
  1139. ;READING FIRST BYTE OF "=" COMMAND SEARCH.
  1140. ;SO SAVE THE ADDRESS, SO THE "@" SYMBOL MAY
  1141. ;BE USED IN A CH OR CA COMMAND TO REFERENCE
  1142. ;"WHEREVER" THE MATCH WAS FOUND.
  1143. ;
  1144. NORD    LDA    SECDISP
  1145.     ORA    A
  1146.     JNZ    NORD2
  1147.     MOV    A,L    ;GET DISP
  1148.     STA    SECDISP
  1149. NORD2    MOV    A,M
  1150.     INX    H
  1151.     SHLD    BUFAD
  1152.     POP    H
  1153.     RET
  1154. ;
  1155. ;VIEW THE FILE IN ASCII STARTING AT
  1156. ;CURRENT SECTOR, STEPPING THRU THE DISK
  1157. ;
  1158. VIEW    CALL    NOCONT
  1159.     LDA    WRFLG
  1160.     ORA    A
  1161.     JZ    BADDMP
  1162.     CALL    DECIN    ;GET SECTOR COUNT
  1163.     PUSH    H
  1164.     MOV    A,E
  1165.     ORA    A
  1166.     JNZ    VIEWLP
  1167.     INR    E    ;DFLT=1
  1168. VIEWLP    LXI    H,BASE+80H ;TO DATA
  1169. VIEWCHR    CALL    CTLCS
  1170.     JZ    VIEWEND
  1171.     MOV    A,M
  1172.     CPI    1AH
  1173.     JZ    VIEWEOF
  1174.     ANI    7FH
  1175.     CPI    7EH
  1176.     JNC    VIEWHX    ;SHOW RUBOUT AND TILDE AS HEX
  1177.     CPI    ' '
  1178.     JNC    VIEWPR
  1179.     CPI    CR
  1180.     JZ    VIEWPR
  1181.     CPI    LF
  1182.     JZ    VIEWPR
  1183.     CPI    TAB
  1184.     JZ    VIEWPR
  1185. VIEWHX    MOV    A,M    ;NOT ASCII...PRINT AS <NN>
  1186.     CALL    BHEX
  1187.     JMP    VIEWNP
  1188. ;
  1189. VIEWPR    CALL    TYPE
  1190. VIEWNP    INR    L
  1191.     JNZ    VIEWCHR
  1192.     DCR    E
  1193.     JZ    VIEWEND
  1194.     PUSH    D    ;SAVE COUNT
  1195.     CALL    NEXTSEC
  1196.     LHLD    CURSEC
  1197.     XCHG
  1198.     CALL    SETSEC    
  1199.     LHLD    CURTRK
  1200.     XCHG
  1201.     CALL    SETTRK
  1202.     CALL    READ
  1203.     POP    D    ;RESTORE COUNT
  1204.     JMP    VIEWLP
  1205. ;
  1206. VIEWEOF    CALL    ILPRT
  1207.     DB    CR,LF,TAB,'++EOF++',CR,LF,0
  1208. VIEWEND    POP    H
  1209.     CALL    CRLF
  1210.     JMP    CALCGRP
  1211. ;
  1212. ;DUMP IN HEX OR ASCII
  1213. ;
  1214. DUMP    LDA    WRFLG
  1215.     ORA    A
  1216.     JNZ    DUMPOK
  1217. BADDMP    XRA    A
  1218.     STA    QFLAG
  1219.     CALL    ILPRT
  1220.     DB    '++Can''t dump, no sector read.',CR,LF,0
  1221. EXPL    XRA    A
  1222.     STA    QFLAG
  1223.     CALL    ILPRT
  1224.     DB    'Use G command following F,',CR,LF
  1225.     DB    'or R or S following T',CR,LF,0
  1226.     JMP    PROMPTR
  1227. ;
  1228. DUMPOK    MOV    A,M
  1229.     CPI    ';'
  1230.     JZ    DUMPDF    ;DFLT
  1231.     CPI    CR
  1232.     JNZ    DUMPNDF
  1233. ;
  1234. ;USE DEFAULT
  1235. DUMPDF    LXI    B,BASE+80H
  1236.     LXI    D,0FFH
  1237.     JMP    DUMP1
  1238. ;
  1239. DUMPNDF    CALL    DISP
  1240.     MOV    B,D
  1241.     MOV    C,E
  1242.     CPI    CR
  1243.     JZ    DUMP1
  1244.     CPI    ';'
  1245.     JZ    DUMP1
  1246.     INX    H    ;SKIP ','
  1247.     CALL    DISP
  1248. ;
  1249. ;BC = start, DE = end
  1250. ;
  1251. DUMP1    PUSH    H    ;SAVE COMMAND POINTER
  1252.     MOV    H,B
  1253.     MOV    L,C
  1254. DUMPLP    MOV    A,L
  1255.     ANI    7FH
  1256.     CALL    HEX
  1257.     CALL    SPACE
  1258.     CALL    SPACE
  1259.     LDA    DUMTYPE
  1260.     CPI    'A'
  1261.     JZ    DUMPAS
  1262.     PUSH    H    ;SAVE START
  1263. DHEX    MOV    A,M
  1264.     CALL    HEX
  1265.     MOV    A,L
  1266.     ANI    3
  1267.     CPI    3
  1268.     CZ    SPACE
  1269.     MOV    A,L
  1270.     ANI    7
  1271.     CPI    7
  1272.     CZ    SPACE
  1273.     MOV    A,E
  1274.     CMP    L
  1275.     JZ    DPOP
  1276.     INX    H
  1277.     MOV    A,L
  1278.     ANI    0FH
  1279.     JNZ    DHEX
  1280. DPOP    CALL    CTLCS
  1281.     JZ    PROMPRC
  1282.     LDA    DUMTYPE
  1283.     CPI    'H'
  1284.     JZ    DNOAS    ;HEX ONLY
  1285.     POP    H    ;GET START ADDR
  1286. DUMPAS    CALL    ASTER
  1287. DCHR    MOV    A,M
  1288.     ANI    7FH
  1289.     CPI    ' '
  1290.     JC    DPER
  1291.     CPI    7EH
  1292.     JC    DOK
  1293. DPER    MVI    A,'.'
  1294. DOK    CALL    TYPE
  1295.     MOV    A,E
  1296.     CMP    L
  1297.     JZ    DEND
  1298.     INX    H
  1299.     MOV    A,L
  1300.     ANI    0FH
  1301.     JNZ    DCHR
  1302. DEND    CALL    ASTER
  1303.     CALL    CRLF
  1304.     PUSH    D
  1305.     CALL    CTLCS
  1306.     POP    D
  1307.     JZ    PROMPTR
  1308.     MOV    A,E
  1309.     CMP    L
  1310.     JNZ    DUMPLP
  1311.     POP    H
  1312.     JMP    PROMPT
  1313. ;
  1314. DNOAS    POP    B
  1315.     CALL    CRLF
  1316.     MOV    A,E
  1317.     CMP    L
  1318.     JNZ    DUMPLP
  1319.     POP    H
  1320.     JMP    PROMPT
  1321. ;
  1322. ;POSITION
  1323. ;
  1324. POS    CALL    NOCONT
  1325.     PUSH    PSW
  1326.     MOV    A,M
  1327.     CPI    ';'
  1328.     JZ    POSINQ
  1329.     CPI    CR
  1330.     JNZ    POSOK
  1331. POSINQ    POP    PSW
  1332.     JMP    INQ
  1333. ;
  1334. POSOK    POP    PSW
  1335.     CPI    'T'
  1336.     JZ    POSTRKD
  1337.     CPI    'S'
  1338.     JZ    POSSECD
  1339.     CPI    'G'
  1340.     JZ    POSGRPH
  1341.     JMP    WHAT
  1342. ;
  1343. POSTRKD    CALL    DECIN
  1344. POSTRK    PUSH    H
  1345.     LHLD    MAXTRK
  1346.     CALL    SUBDE
  1347.     POP    H
  1348.     JC    OUTLIM
  1349.     CALL    SETTRK
  1350.     CALL    NOWRITE    ;TRACK DOESN'T READ
  1351.     MVI    A,1
  1352.     STA    NOTPOS    ;SHOW NOT POSITIONED
  1353.     JMP    CALCGRP
  1354. ;
  1355. POSSECD    CALL    DECIN
  1356.     MOV    A,D
  1357.     ORA    E
  1358.     JZ    WHAT    ;DON'T ALLOW SECTOR 0
  1359. POSSEC    PUSH    H
  1360.     LHLD    SPT
  1361.     CALL    SUBDE
  1362.     POP    H
  1363.     JC    WHAT
  1364.     CALL    SETSEC
  1365.     CALL    READ
  1366.     XRA    A
  1367.     STA    NOTPOS    ;POSITIONED OK
  1368. ;
  1369. CALCGRP    CALL    CALCSUB
  1370.     JMP    INQ
  1371. ;
  1372. ;CALCULATE GROUP FROM TRACK AND SECTOR
  1373. ;
  1374. CALCSUB    PUSH    H
  1375.     LHLD    SYSTRK
  1376.     XCHG
  1377.     LHLD    CURTRK
  1378.     CALL    SUBDE
  1379.     XCHG
  1380.     LHLD    SPT
  1381.     CALL    MULT
  1382.     XCHG
  1383.     LHLD    CURSEC
  1384.     DCX    H
  1385.     DAD    D
  1386.     LDA    BLM
  1387.     MOV    B,A
  1388.     MOV    A,L
  1389.     ANA    B
  1390.     STA    GRPDISP
  1391.     LDA    BSH
  1392.     MOV    B,A
  1393. CALCLOP    CALL    ROTRHL
  1394.     DCR    B
  1395.     JNZ    CALCLOP
  1396.     SHLD    GROUP
  1397.     POP    H
  1398.     RET
  1399. ;
  1400. POSGRPH    CALL    HEXIN
  1401. POSGRP    PUSH    H
  1402.     LHLD    DSM
  1403.     CALL    SUBDE
  1404.     POP    H
  1405.     JC    OUTLIM
  1406.     XCHG
  1407.     SHLD    GROUP
  1408.     XCHG
  1409.     XRA    A
  1410.     STA    GRPDISP
  1411.     PUSH    H
  1412. POSGRP2    CALL    GTKSEC
  1413.     CALL    SETTRK
  1414.     XCHG
  1415.     CALL    SETSEC
  1416.     CALL    READ
  1417.     XRA    A
  1418.     STA    NOTPOS    ;NOW POSITIONED
  1419.     POP    H
  1420.     JMP    INQ
  1421. ;
  1422. GTKSEC    MOV    H,D
  1423.     MOV    L,E
  1424.     LDA    BSH
  1425. GLOOP    DAD    H
  1426.     DCR    A
  1427.     JNZ    GLOOP
  1428.     LDA    GRPDISP
  1429.     ADD    L    ;CAN'T CARRY
  1430.     MOV    L,A
  1431. ;
  1432. ;Divide by nr of sectors, quotient=track, remainder=sector
  1433. ;
  1434.     XCHG
  1435.     LHLD    SPT
  1436.     CALL    NEG
  1437.     XCHG
  1438.     LXI    B,0
  1439. ;
  1440. DIVLP    INX    B
  1441.     DAD    D
  1442.     JC    DIVLP
  1443.     DCX    B
  1444.     XCHG
  1445.     LHLD    SPT
  1446.     DAD    D
  1447.     PUSH    H
  1448.     LHLD    SYSTRK
  1449.     DAD    B
  1450.     XCHG
  1451.     POP    H
  1452.     INX    H
  1453.     RET
  1454. ;
  1455. ;ZAP ABILITY TO DO "F" (FIND NEXT) BECAUSE ANOTHER
  1456. ;DISK COMMAND LOST POSITIONING.
  1457. ;
  1458. NOCONT    PUSH    H
  1459.     LXI    H,0
  1460.     SHLD    FCONT
  1461.     POP    H
  1462.     RET
  1463. ;
  1464. ;POSITION TO FILENAME BY "MANUALLY" READING
  1465. ;THE DIRECTORY.  THIS OVERCOMES THE 2.2 PROBLEM
  1466. ;OF BEING UNABLE TO DETECT WHAT SECTOR WAS
  1467. ;FOUND AFTER "SEARCH FIRST" BDOS FUNCTION
  1468. ;
  1469. POSFIL    MOV    A,M    ;GET CHAR AFTER 'F'
  1470.     CPI    CR
  1471.     JZ    PFCONT    ;NO NAME
  1472.     CPI    ';'    ;NEXT COMMAND?
  1473.     JZ    PFCONT
  1474.     LXI    D,FCB
  1475.     XRA    A    ;LOGGED IN DISK
  1476.     STAX    D
  1477.     INX    D
  1478.     MVI    B,8
  1479.     CALL    MVNAME
  1480.     MVI    B,3
  1481.     CALL    MVNAME
  1482.     PUSH    H
  1483.     LHLD    SYSTRK    ;TO
  1484.     SHLD    CURTRK    ;    DIR
  1485.     LXI    H,0    ;INIT TO 0, CALLS
  1486.     SHLD    CURSEC    ;    NEXTSEC B4 USING
  1487.     LHLD    DRM    ;# OF DIR ENTRIES-1
  1488.     INX    H    ;    EXACT #
  1489.     SHLD    NUMENT    ;# OF DIR ENTRIES
  1490.     LXI    B,80H+BASE
  1491.     CALL    SETDMA
  1492. PFRD    CALL    NEXTSEC
  1493.     LHLD    CURTRK
  1494.     XCHG
  1495.     CALL    SETTRK
  1496.     LHLD    CURSEC
  1497.     XCHG
  1498.     CALL    SETSEC
  1499.     CALL    READ
  1500.     LXI    H,80H+BASE
  1501. PFNRD    LXI    D,FCB+1    ;TO NAME
  1502.     INX    H    ;SKIP DISK BYTE
  1503. ;
  1504. ;SEE IF THIS NAME MATCHES
  1505. ;
  1506.     MVI    B,11    ;NAME LENGTH
  1507. PFMATLP    LDAX    D    ;GET NAME CHAR
  1508.     CPI    '?'
  1509.     JZ    PFMAT    ;MATCH ANY
  1510.     CMP    M    ;MATCH EXACTLY?
  1511.     JZ    PFMAT
  1512.     ORI    80H    ;TRY MATCH WITH HI BIT
  1513.     CMP    M
  1514.     JNZ    PFNMAT    ;    NO
  1515. PFMAT    INX    H
  1516.     INX    D
  1517.     DCR    B
  1518.     JNZ    PFMATLP
  1519. ;
  1520. ;GOT NAME
  1521. ;
  1522.     CALL    CALCSUB    ;COMPUTE GROUP
  1523.     CALL    INQSUB    ;SHOW WHICH ONE
  1524.     MOV    A,L    ;GET DISPLACEMENT
  1525.     ANI    060H    ;TO START OF NAME
  1526.     STA    SECDISP
  1527.     ORI    80H    ;PUT IT BACK 80-FF
  1528.     MOV    L,A
  1529.     SHLD    FCONT    ;SAVE FOR "F"IND NEXT
  1530.     LXI    D,32    ;DUMP LENGTH
  1531.     XCHG
  1532.     DAD    D    ;SET UP FOR DUMP
  1533.     XCHG
  1534.     XRA    A
  1535.     STA    NOTPOS    ;SHOW NOW POSITIONED
  1536.     MVI    A,'D'
  1537.     STA    DUMTYPE
  1538.     STA    WRFLG    ;ALLOW REWRITE
  1539.     JMP    DUMPLP    ;DUMPLP POPS H (CMD BUF ADDR)
  1540. ;
  1541. ;NOT FOUND
  1542. ;
  1543. PFNOTF    XRA    A
  1544.     STA    QFLAG
  1545.     CALL    ILPRT
  1546.     DB    '++FILE NOT FOUND',CR,LF,0
  1547.     POP    H    ;GET CMD BUFF PTR
  1548.     CALL    NOWRITE
  1549.     CALL    NOCONT
  1550.     MVI    A,1
  1551.     STA    NOTPOS
  1552.     JMP    PROMPTR
  1553. ;
  1554. ;CONTINUING FIND
  1555. ;
  1556. PFCONT    PUSH    H
  1557.     LHLD    FCONT
  1558.     MOV    A,H
  1559.     ORA    L
  1560.     JNZ    PFNMAT
  1561.     POP    H
  1562.     XRA    A
  1563.     STA    QFLAG
  1564.     CALL    ILPRT
  1565.     DB    '++Can''t continue F command',CR,LF,0
  1566.     JMP    PROMPTR
  1567. ;
  1568. ;NO MATCH, GET NEXT CHAR
  1569. ;
  1570. PFNMAT    XCHG        ;SAVE BUFF POINTER
  1571.     LHLD    NUMENT    ;GET # DIR ENTRIES
  1572.     DCX    H
  1573.     SHLD    NUMENT
  1574.     MOV    A,H
  1575.     ORA    L
  1576.     JZ    PFNOTF    ;NOT FOUND
  1577.     XCHG        ;BUFF BACK TO HL
  1578.     MOV    A,L    ;GET DISPLACEMENT
  1579.     ANI    0E0H    ;BACK TO START OF ENTRY
  1580.     ADI    32    ;ONE ENTRY
  1581.     MOV    L,A
  1582.     JNC    PFNRD    ;NO READ, STILL IN SECTOR
  1583.     JMP    PFRD    ;TO NEXT SECTOR
  1584. ;
  1585. MVNAME    MOV    A,M
  1586.     INX    H    ;IN CASE HAVE TO SKIP
  1587.     CPI    '.'    ;    '.'
  1588.     JZ    PADSP
  1589.     CPI    '*'    ;    OR '*'
  1590.     JZ    PADQ    ;FILL W/"?"
  1591.     DCX    H    ;
  1592.     CPI    CR
  1593.     JZ    PADSP
  1594.     CPI    ';'
  1595.     JZ    PADSP
  1596.     CALL    UPCASE
  1597.     STAX    D
  1598.     INX    H
  1599.     INX    D
  1600.     DCR    B
  1601.     JNZ    MVNAME
  1602.     MOV    A,M
  1603.     CPI    CR
  1604.     RZ
  1605.     CPI    ';'
  1606.     RZ
  1607.     INX    H
  1608.     CPI    '.'
  1609.     RZ
  1610.     JMP    WHAT
  1611. ;
  1612. PADSP    MVI    A,' '
  1613.     JMP    PAD
  1614. ;
  1615. PADQ    MVI    A,'?'
  1616. ;
  1617. PAD    STAX    D
  1618.     INX    D
  1619.     DCR    B
  1620.     JNZ    PAD
  1621.     MOV    A,M    ;SKIP '.'
  1622.     CPI    '.'    ;    AFTER '*'
  1623.     RNZ        ;    IN "*.*"
  1624.     INX    H
  1625.     RET
  1626. ;
  1627. PLUS    LDA    NOTPOS
  1628.     ORA    A
  1629.     JNZ    CANTRD
  1630.     CALL    NOCONT
  1631.     LXI    D,1    ;DFLT TO 1 SECT
  1632.     MOV    A,M    ;GET NEXT CHAR
  1633.     CPI    CR    ;CR?
  1634.     JZ    PLUSGO    ;..YES, DFLT TO 1
  1635.     CPI    ';'
  1636.     JZ    PLUSGO
  1637.     CALL    DECIN    ;GET DECIMAL #
  1638.     MOV    A,D
  1639.     ORA    E
  1640.     JZ    WHAT
  1641. PLUSGO    CALL    NEXTSEC
  1642.     DCX    D    ;MORE TO GO?
  1643.     MOV    A,D
  1644.     ORA    E
  1645.     JNZ    PLUSGO    ;..YES
  1646. ;
  1647. ;OK, INCREMENTED TO SECTOR.  SETUP AND READ
  1648. ;
  1649. PLUSMI    PUSH    H
  1650.     LHLD    CURSEC
  1651.     XCHG
  1652.     CALL    SETSEC
  1653.     LHLD    CURTRK
  1654.     XCHG
  1655.     CALL    SETTRK
  1656.     POP    H
  1657.     CALL    READ
  1658.     JMP    CALCGRP
  1659. ;
  1660. MINUS    LDA    NOTPOS
  1661.     ORA    A
  1662.     JNZ    CANTRD
  1663.     CALL    NOCONT
  1664.     LXI    D,1    ;SET DFLT
  1665.     MOV    A,M    ;GET CHAR
  1666.     CPI    CR    ;CR?
  1667.     JZ    MINGO    ;..YES, DFLT=1
  1668.     CPI    ';'
  1669.     JZ    MINGO
  1670.     CALL    DECIN    ;..NO, GET ##
  1671.     MOV    A,D
  1672.     ORA    E
  1673.     JZ    WHAT
  1674. MINGO    PUSH    H
  1675.     LHLD    CURSEC
  1676.     DCX    H
  1677.     MOV    A,H
  1678.     ORA    L
  1679.     JNZ    MINOK
  1680.     LHLD    CURTRK
  1681.     MOV    A,H
  1682.     ORA    L
  1683.     JNZ    SEASH
  1684.     LHLD    CURSEC
  1685.     INX    H
  1686.     SHLD    CURSEC
  1687. BOUNDS    XRA    A
  1688.     STA    QFLAG
  1689.     CALL    ILPRT
  1690.     DB    'Out of bounds',CR,LF,0
  1691.     JMP    PROMPTR
  1692. ;
  1693. SEASH    DCX    H
  1694.     SHLD    CURTRK
  1695.     LHLD    SPT
  1696. MINOK    SHLD    CURSEC
  1697.     POP    H
  1698.     DCX    D
  1699.     MOV    A,D
  1700.     ORA    E
  1701.     JNZ    MINGO
  1702.     JMP    PLUSMI
  1703. ;
  1704. ;Go to next sector
  1705. ;
  1706. NEXTSEC    PUSH    H
  1707.     PUSH    D
  1708.     LHLD    CURSEC
  1709.     INX    H
  1710.     XCHG
  1711.     LHLD    SPT
  1712.     CALL    SUBDE
  1713.     XCHG
  1714.     JNC    NEXTOK
  1715.     LHLD    CURTRK
  1716.     INX    H
  1717.     XCHG
  1718.     LHLD    MAXTRK
  1719.     CALL    SUBDE
  1720. ;
  1721. ;07/31/81 Delete wrap to start (hangs on my system,
  1722. ;    hangs on Micromation).  ...but mostly because
  1723. ;    the "front" of the disk has n-o-t-h-i-n-g to
  1724. ;    do with the "back" of the disk, so why wrap?
  1725. ;
  1726. ;    A less "emotional" and more "practical reason,
  1727. ;    is that commands such as "q+;/" (used to check
  1728. ;    if a disk is readable) or "=xxx" (which scans
  1729. ;    forward for a match) by "definition" shouldn't
  1730. ;    "wrap and run forever". <WLC>
  1731. ;
  1732.     JC    BOUNDS
  1733. ;
  1734.     XCHG
  1735.     SHLD    CURTRK
  1736.     LXI    H,1
  1737. ;
  1738. NEXTOK    SHLD    CURSEC
  1739.     POP    D
  1740.     POP    H
  1741.     RET
  1742. ;
  1743. ;TELL WHAT GROUP, DISPLACEMENT, TRACK, SECTOR, PHYSICAL SECTOR
  1744. ;
  1745. INQ    CALL    INQSUB
  1746.     JMP    PROMPT
  1747. ;
  1748. ;POSITION INQUIRY SUBROUTINE
  1749. ;EXECUTED VIA: G S OR T (WITH NO OPERANDS)
  1750. ;
  1751. INQSUB    PUSH    H
  1752.     LHLD    SYSTRK
  1753.     XCHG
  1754.     LHLD    CURTRK
  1755.     CALL    SUBDE
  1756.     JC    NOGRP
  1757.     CALL    ILPRT
  1758.     DB    'G=',0
  1759.     LHLD    GROUP
  1760.     MOV    B,H
  1761.     MOV    C,L
  1762.     CALL    HEXB
  1763.     MVI    A,':'
  1764.     CALL    TYPE
  1765.     LDA    GRPDISP
  1766.     CALL    HEX
  1767.     MVI    A,','
  1768.     CALL    TYPE
  1769. NOGRP    CALL    ILPRT
  1770.     DB    ' T=',0
  1771.     LHLD    CURTRK
  1772.     CALL    DEC
  1773.     CALL    ILPRT
  1774.     DB    ', S=',0
  1775.     LHLD    CURSEC
  1776.     CALL    DEC
  1777.     CALL    ILPRT
  1778.     DB    ', PS=',0
  1779.     LHLD    PHYSEC
  1780.     CALL    DEC
  1781.     CALL    CRLF
  1782.     POP    H
  1783.     RET
  1784. ;
  1785. CHG    MOV    A,M    ;GET TYPE (HEX, ASCII)
  1786.     CALL    UPCASE
  1787.     PUSH    PSW    ;SAVE "H" OR "A"
  1788.     INX    H
  1789.     CALL    DISP    ;GET, VALIDATE DISP TO DE
  1790.     INX    H
  1791.     LXI    B,0    ;SHOW NO 'THRU' ADDR
  1792.     CPI    '-'    ;TEST DELIM FR. DISP
  1793.     JNZ    CHGNTH    ;NO THRU
  1794.     PUSH    D    ;SAVE FROM
  1795.     CALL    DISP    ;GET THRU
  1796.     INX    H    ;SKIP END DELIM
  1797.     MOV    B,D
  1798.     MOV    C,E    ;BC = THRU
  1799.     POP    D    ;GET FROM
  1800.     JMP    CHGAH
  1801. ;
  1802. CHGNTH    CPI    ','
  1803.     JNZ    WHAT
  1804. ;
  1805. CHGAH    POP    PSW
  1806.     CPI    'H'
  1807.     JZ    CHGHEX
  1808.     CPI    'A'
  1809.     JNZ    WHAT
  1810. ;CHANGE ASCII
  1811. CHGALP    MOV    A,M
  1812.     CPI    CR
  1813.     JZ    PROMPTC
  1814.     CPI    ';'
  1815.     JZ    PROMPTC
  1816.     LDAX    D
  1817.     CPI    ' '
  1818.     JC    CHGAHX
  1819.     CPI    7EH
  1820.     JNC    CHGAHX
  1821.     JMP    CHGA2
  1822. ;
  1823. CHGAHX    CALL    BHEX
  1824.     JMP    CHGA3
  1825. ;
  1826. CHGA2    CALL    TYPE
  1827. CHGA3    SHLD    BACK    ;IN CASE "THRU"
  1828.     CALL    GETVAL    ;ASCII OR <HEX>
  1829.     STAX    D    ;UPDATE CHAR
  1830.     INX    H    ;TO NEXT INPUT CHAR
  1831. ;See if 'THRU' requested
  1832.     MOV    A,C
  1833.     ORA    A
  1834.     JZ    CHGANTH
  1835.     CMP    E    ;DONE?..
  1836.     JZ    PROMPTC    ;..YES
  1837.     LHLD    BACK
  1838. CHGANTH    INR    E
  1839.     JNZ    CHGALP
  1840.     MOV    A,M
  1841.     CPI    CR
  1842.     JZ    PROMPTC
  1843.     CPI    ';'
  1844.     JZ    PROMPTC
  1845.     JMP    WHAT
  1846. ;
  1847. ;CHANGE HEX
  1848. ;
  1849. CHGHCOM    INX    H
  1850. ;
  1851. CHGHEX    MOV    A,M
  1852.     CPI    CR
  1853.     JZ    PROMPTC
  1854.     CPI    ';'
  1855.     JZ    PROMPTC
  1856.     CPI    ','    ;DELIM?
  1857.     JZ    CHGHCOM
  1858.     PUSH    D
  1859.     SHLD    HEXAD    ;IN CASE 'THRU'
  1860.     CALL    HEXIN    ;POSITIONS TO DELIM
  1861.     MOV    A,E    ;GET VALUE
  1862.     POP    D    ;..ADDR
  1863.     PUSH    PSW    ;SAVE VALUE
  1864.     LDAX    D    ;GET OLD
  1865.     CALL    HEX    ;ECHO IN HEX
  1866.     POP    PSW    ;GET NEW
  1867.     STAX    D    ;SAVE NEW
  1868.     MOV    A,C    ;SEE IF 'THRU'
  1869.     ORA    A
  1870.     JZ    CHGHNTH    ;..NO.
  1871.     CMP    E    ;..YES, DONE?
  1872.     JZ    PROMPTC
  1873.     LHLD    HEXAD    ;..NO: MORE
  1874. CHGHNTH    INR    E
  1875.     JNZ    CHGHEX
  1876.     MOV    A,M
  1877.     CPI    CR
  1878.     JZ    PROMPTC
  1879.     CPI    ';'
  1880.     JZ    PROMPTC
  1881.     JMP    WHAT
  1882. ;
  1883. DOREAD    CALL    READ
  1884.     JMP    PROMPT
  1885. ;
  1886. CANTRD    XRA    A
  1887.     STA    QFLAG    ;NOT QUIET
  1888.     CALL    ILPRT
  1889.     DB    '++Can''t read or go +/-: not positioned',CR,LF
  1890.     DB    'Position by:',CR,LF
  1891.     DB    9,'Track then Sector, or',CR,LF
  1892.     DB    9,'Group or to file name via F',CR,LF,0
  1893.     JMP    PROMPT
  1894. ;
  1895. DOWRITE    CALL    WRITE
  1896.     JMP    PROMPT
  1897. ;
  1898. BHEX    PUSH    PSW
  1899.     MVI    A,'<'
  1900.     CALL    TYPE
  1901.     POP    PSW
  1902.     CALL    HEX
  1903.     MVI    A,'>'
  1904.     CALL    TYPE
  1905.     RET
  1906. ;
  1907. HEXB    LDA    DSM+1
  1908.     ORA    A
  1909.     JZ    HEXX
  1910.     MOV    A,B
  1911.     CALL    HEX
  1912. HEXX    MOV    A,C
  1913. HEX    PUSH    PSW
  1914.     RAR
  1915.     RAR
  1916.     RAR
  1917.     RAR
  1918.     CALL    NIBBL
  1919.     POP    PSW
  1920. NIBBL    ANI    0FH
  1921.     CPI    10
  1922.     JC    HEXNU
  1923.     ADI    7
  1924. HEXNU    ADI    '0'
  1925.     JMP    TYPE
  1926. ;
  1927. ;Decimal output routine
  1928. ;
  1929. DEC    PUSH    B
  1930.     PUSH    D
  1931.     PUSH    H
  1932.     LXI    B,-10
  1933.     LXI    D,-1
  1934. DECOU2    DAD    B
  1935.     INX    D
  1936.     JC    DECOU2
  1937.     LXI    B,10
  1938.     DAD    B
  1939.     XCHG
  1940.     MOV    A,H
  1941.     ORA    L
  1942.     CNZ    DEC
  1943.     MOV    A,E
  1944.     ADI    '0'
  1945.     CALL    TYPE
  1946.     POP    H
  1947.     POP    D
  1948.     POP    B
  1949.     RET
  1950. ;
  1951. SPACE    MVI    A,' '
  1952.     JMP    TYPE
  1953. ;
  1954. ASTER    MVI    A,'*'
  1955.     JMP    TYPE
  1956. ;
  1957. ;Inline print routine
  1958. ;
  1959. ILPRT    XTHL
  1960. ILPLP    CALL    CTLCS    ;ABORT?
  1961.     JZ    PROMPRC
  1962.     MOV    A,M
  1963.     CPI    1    ;PAUSE?
  1964.     JNZ    ILPOK
  1965.     CALL    CONIN
  1966.     CPI    3    ;ABORT?
  1967.     JZ    PROMPTR
  1968.     JMP    ILPNX
  1969. ;
  1970. ILPOK    CALL    TYPE
  1971. ILPNX    INX    H
  1972.     MOV    A,M
  1973.     ORA    A
  1974.     JNZ    ILPLP
  1975.     INX    H
  1976.     XTHL
  1977.     RET
  1978. ;
  1979. ;DISP CALLS HEXIN, AND VALIDATES A SECTOR
  1980. ;DISPLACEMENT, THEN CONVERTS IT TO AN ADDRESS
  1981. ;
  1982. DISP    CALL    HEXIN
  1983.     PUSH    PSW    ;SAVE DELIMITER
  1984.     MOV    A,D
  1985.     ORA    A
  1986.     JNZ    BADISP
  1987.     MOV    A,E
  1988.     ORA    A
  1989.     JM    BADISP
  1990.     ADI    80H    ;TO POINT TO BUFFER AT BASE+80H
  1991.     MOV    E,A
  1992.     MVI    D,BASE/256
  1993.     POP    PSW    ;GET DELIM
  1994.     RET
  1995. ;
  1996. BADISP    XRA    A
  1997.     STA    QFLAG    ;NOT QUIET
  1998.     CALL    ILPRT
  1999.     DB    '++BAD DISPLACEMENT (NOT 0-7F)'
  2000.     DB    CR,LF,0
  2001.     JMP    PROMPTR
  2002. ;
  2003. HEXIN    LXI    D,0
  2004.     MOV    A,M
  2005.     CPI    '#'    ;DECIMAL?
  2006.     JZ    HDIN    ;MAKE DECIMAL
  2007.     CPI    '@'
  2008.     JZ    GETDISP
  2009. HINLP    MOV    A,M
  2010.     CALL    UPCASE
  2011.     CPI    CR
  2012.     RZ
  2013.     CPI    ';'
  2014.     RZ
  2015.     CPI    ','
  2016.     RZ
  2017.     CPI    '-'    ;'THRU'?
  2018.     RZ
  2019.     CPI    '>'
  2020.     RZ
  2021.     INX    H
  2022.     CPI    'H'    ;TERMINATOR?
  2023.     JZ    HINLP    ;YES, SKIP IT
  2024.     CPI    '0'
  2025.     JC    WHAT
  2026.     CPI    '9'+1
  2027.     JC    HINNUM
  2028.     CPI    'A'
  2029.     JC    WHAT
  2030.     CPI    'F'+1
  2031.     JNC    WHAT
  2032.     SUI    7
  2033. HINNUM    SUI    '0'
  2034.     XCHG
  2035.     DAD    H
  2036.     DAD    H
  2037.     DAD    H
  2038.     DAD    H
  2039.     ADD    L
  2040.     MOV    L,A
  2041.     XCHG
  2042.     JMP    HINLP
  2043. ;
  2044. HDIN    INX    H    ;SKIP '#'
  2045. DECIN    CALL    SCANH    ;SEE IF xxxH
  2046.     JZ    HEXIN
  2047.     LXI    D,0
  2048. DINLP    MOV    A,M
  2049.     CALL    UPCASE
  2050.     CPI    CR
  2051.     RZ
  2052.     CPI    ';'
  2053.     RZ
  2054.     CPI    ','
  2055.     RZ
  2056.     CPI    '-'    ;'THRU'?
  2057.     RZ
  2058.     INX    H
  2059.     CPI    '0'
  2060.     JC    WHAT
  2061.     CPI    '9'+1
  2062.     JNC    WHAT
  2063.     SUI    '0'
  2064.     PUSH    H
  2065.     MOV    H,D
  2066.     MOV    L,E
  2067.     DAD    H    ;X2
  2068.     DAD    H    ;X4
  2069.     DAD    D    ;X5
  2070.     DAD    H    ;X10
  2071.     ADD    L
  2072.     MOV    L,A
  2073.     MOV    A,H
  2074.     ACI    0
  2075.     MOV    H,A
  2076.     XCHG
  2077.     POP    H
  2078.     JMP    DINLP
  2079. ;
  2080. ;SCAN TO SEE IF xxxH WAS SPECIFIED
  2081. ;
  2082. SCANH    MOV    D,H
  2083.     MOV    E,L    ;XFER HL TO DE
  2084. SCANHL    LDAX    D
  2085.     CALL    UPCASE
  2086.     CPI    'H'
  2087.     RZ
  2088.     INX    D    ;TO NEXT
  2089.     CPI    '0'
  2090.     RC
  2091.     CPI    '9'+1
  2092.     JC    SCANHL
  2093.     CPI    'A'
  2094.     RC
  2095.     CPI    'F'+1
  2096.     JC    SCANHL
  2097.     ORA    A    ;SET NON ZERO
  2098.     RET
  2099. ;
  2100. ;REQUEST TO GET DISPLACEMENT IN SECTOR
  2101. ;AT WHICH LAST "=" COMMAND MATCHED.
  2102. ;
  2103. GETDISP    INX    H    ;SKIP "@"
  2104.     MOV    A,M
  2105.     CPI    '-'
  2106.     JZ    DISPPM
  2107.     CPI    '+'
  2108.     JZ    DISPPM
  2109.     LDA    SECDISP    ;GET DISPLACEMENT
  2110.     ANI    7FH    ;MAKE IT RELATIVE TO 0
  2111.     MOV    E,A    ;SAVE IT
  2112.     MVI    D,0    ;SET DE = TO IT
  2113.     MOV    A,M    ;GET ENDING DELIM
  2114.     RET
  2115. ;
  2116. ;GOT + OR - DISPLACEMENT
  2117. ;
  2118. DISPPM    PUSH    PSW    ;SAVE +/-
  2119.     INX    H    ;TO NEXT
  2120.     CALL    HEXIN    ;GET VALUE TO DE
  2121.     POP    PSW    ;GET +/-
  2122.     CPI    '-'    ;IF -,
  2123.     CZ    COMDE    ;    COMPLEMENT DE
  2124.     LDA    SECDISP
  2125.     ADD    E
  2126.     ANI    7FH    ;PRESERVE SECT DISPL
  2127.     MOV    E,A
  2128.     MVI    D,0    ;DE = 0-7F
  2129.     MOV    A,M    ;GET DELIMITER FOR 
  2130.     RET        ;    FURTHER TESTS
  2131. ;
  2132. ;COMPLEMENT DE
  2133. ;
  2134. COMDE    MOV    A,D
  2135.     CMA
  2136.     MOV    D,A
  2137.     MOV    A,E
  2138.     CMA
  2139.     MOV    E,A
  2140.     INX    D    ;1'S COMP ==> 2'S COMP
  2141.     RET
  2142. ;
  2143. ;READ IN A CONSOLE BUFFER FULL
  2144. ;
  2145. RDBUF    MVI    A,':'
  2146.     CALL    TYPE
  2147. ;
  2148. RDBF1    LXI    H,INBUF
  2149.     MVI    B,0
  2150. RDBLP    CALL    CONIN
  2151.     MOV    C,A    ;SAVE FOR BS TEST
  2152. ;
  2153. ;Evaluate control characters
  2154. ;
  2155.     CPI    'U'-40H    ! JZ RDCTLU
  2156.     CPI    CR    ! JZ RDCR
  2157.     CPI    'H'-40H    ! JZ RDBS
  2158.     CPI    7FH    ! JZ RDBS
  2159.     CPI    'R'-40H    ! JZ RDCTLR
  2160.     CPI    'X'-40H ! JZ RDCTLX
  2161.     CPI    ' '    ! JC RDBCCC    ;CHECK ^C
  2162.     MOV    M,A
  2163.     INX    H
  2164.     INR    B
  2165.     JM    FULL
  2166.     CALL    TYPE
  2167.     JMP    RDBLP
  2168. ;
  2169. FULL    DCR    B
  2170.     DCX    H
  2171.     MVI    A,'*'    ;SIGNAL WE'RE FULL
  2172.     CALL    TYPE
  2173.     JMP    RDBLP
  2174. ;
  2175. ;GOT CR
  2176. ;
  2177. RDCR    MOV    M,A    ;SAVE IT
  2178.     CALL    TYPE    ;ECHO IT
  2179.     MVI    A,LF    ;ECHO..
  2180.     CALL    TYPE    ;..LF
  2181.     LXI    H,INBUF
  2182.     RET
  2183. ;
  2184. ;GOT DELETE OR BS, ECHO IF BS
  2185. ;
  2186. RDBS    XRA    A    ;AT FRONT..
  2187.     ORA    B    ;..OF LINE?
  2188.     JZ    RDCTLU    ;..YES, ECHO ^U
  2189.     DCX    H
  2190.     DCR    B
  2191.     MOV    A,C
  2192.     CPI    'H'-40H    ;BS?
  2193.     JZ    BACKUP    ;ECHO THE BS
  2194.     MOV    A,M    ;ECHO..
  2195.     CALL    TYPE    ;..DELETED CHAR
  2196.     JMP    RDBLP
  2197. ;
  2198. BACKUP    CALL    WIPER
  2199.     JMP    RDBLP
  2200. ;
  2201. RDCTLX    INR    B
  2202. RDCX1    DCR    B
  2203.     JZ    RDBF1
  2204.     CALL    WIPER
  2205.     JMP    RDCX1
  2206. ;
  2207. WIPER    PUSH    B
  2208.     PUSH    D
  2209.     PUSH    H
  2210.     LXI    D,BSMSG    ;BACKSPACE, SPACE, BACKSPACE
  2211.     MVI    C,PRINT
  2212.     CALL    BDOS
  2213.     POP    H
  2214.     POP    D
  2215.     POP    B
  2216.     RET
  2217. ;
  2218. BSMSG    DB    BS,' ',BS,'$'
  2219. ;
  2220. ;CHECK FOR ^C TYPED - MAY HAVE FORGOTTEN "X" EXITS
  2221. ;
  2222. RDBCCC    CPI    'C'-40H
  2223.     JNZ    RDBLP
  2224.     CALL    ILPRT
  2225.     DB    '^C Ignored - Use X command to '
  2226.     DB    'exit to CP/M',0
  2227. ;
  2228. ;GOT CTL-R, RETYPE
  2229. ;
  2230. RDCTLR    MVI    M,CR
  2231.     CALL    CRLF
  2232.     LXI    H,INBUF
  2233.     MVI    B,0
  2234. RDCRL    MOV    A,M
  2235.     CPI    CR
  2236.     JZ    RDBLP
  2237.     CALL    TYPE
  2238.     INR    B
  2239.     INX    H
  2240.     JMP    RDCRL
  2241. ;
  2242. ;GOT CTL-U OR BACKUP TO BEGINNING OF LINE.
  2243. ;
  2244. RDCTLU    MVI    A,'^'
  2245.     CALL    TYPE
  2246.     MVI    A,'U'
  2247.     CALL    TYPE
  2248.     CALL    CRLF
  2249.     JMP    RDBUF
  2250. ;
  2251. CRLF    MVI    A,CR
  2252.     CALL    TYPE
  2253.     MVI    A,LF
  2254.     JMP    TYPE
  2255. ;
  2256. UPCASE    CPI    60H
  2257.     RC
  2258.     ANI    5FH    ;MAKE UPPER CASE
  2259.     RET
  2260. ;
  2261. ;SCREEN CLEAR ROUTINE
  2262. ;
  2263. ERASE    LXI    D,CLEAR
  2264. ERLP    LDAX    D    ;GET CHAR
  2265.     CPI    0FFH
  2266.     JZ    PROMPT    ;DONE
  2267.     MOV    C,A
  2268.     PUSH    D
  2269.     PUSH    H
  2270.     CALL    VCONOUT
  2271.     POP    H
  2272.     POP    D
  2273.     INX    D
  2274.     JMP    ERLP
  2275. ;
  2276. CONST    PUSH    B
  2277.     PUSH    D
  2278.     PUSH    H
  2279. VCONST    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2280.     POP    H
  2281.     POP    D
  2282.     POP    B
  2283.     RET
  2284. ;
  2285. CONIN    PUSH    B
  2286.     PUSH    D
  2287.     PUSH    H
  2288. VCONIN    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2289.     POP    H
  2290.     POP    D
  2291.     POP    B
  2292.     RET
  2293. ;
  2294. ;CONSOLE OUT WITH TAB EXPANSION
  2295. ;
  2296. TYPE    PUSH    B
  2297.     PUSH    D
  2298.     PUSH    H
  2299.     MOV    C,A    ;FOR OUTPUT ROUTINE
  2300.     CPI    TAB
  2301.     JNZ    TYPE2
  2302. TYPETAB    MVI    A,' '
  2303.     CALL    TYPE
  2304.     LDA    TABCOL
  2305.     ANI    7
  2306.     JNZ    TYPETAB
  2307.     JMP    TYPERET
  2308. ;
  2309. ;FILTER OUT CONTROL CHARACTERS TO
  2310. ;PREVENT GARBAGE DURING VIEW OF FILE
  2311. ;
  2312. TYPE2    CPI    ' '
  2313.     JNC    TYPEQ
  2314.     CPI    CR
  2315.     JZ    TYPEQ
  2316.     CPI    LF
  2317.     JNZ    TYPENCR
  2318. TYPEQ    LDA    QFLAG
  2319.     ORA    A
  2320.     CZ    VCONOUT
  2321. ;UPDATE COLUMN USED IN TAB EXPANSION
  2322.     MOV    A,C    ;GET CHAR
  2323.     CPI    CR
  2324.     JNZ    TYPENCR
  2325.     MVI    A,0
  2326.     STA    TABCOL
  2327.     JMP    TYPELST
  2328. ;
  2329. VCONOUT    JMP    $-$    ;ADDR FILLED IN BY 'INIT'
  2330. ;
  2331. TYPENCR    CPI    ' '    ;CTL CHAR?
  2332.     JC    TYPELST    ;..NO CHANGE IN COL
  2333.     LDA    TABCOL
  2334.     INR    A
  2335.     STA    TABCOL
  2336. TYPELST    LDA    PFLAG
  2337.     ANI    1
  2338.     CNZ    LIST    ;FROM C REG.
  2339. TYPERET    POP    H
  2340.     POP    D
  2341.     POP    B
  2342.     RET
  2343. ;
  2344. LIST    PUSH    B    ;SAVED REGS
  2345.     PUSH    D
  2346.     PUSH    H
  2347. VLIST    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2348.     POP    H
  2349.     POP    D
  2350.     POP    B
  2351.     RET
  2352. ;
  2353. HOME    PUSH    H
  2354. VHOME    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2355.     POP    H
  2356.     RET
  2357. ;
  2358. ;Set track # in DE
  2359. ;
  2360. SETTRK    PUSH    H
  2361.     LHLD    MAXTRK
  2362.     CALL    SUBDE
  2363.     POP    H
  2364.     JC    OUTLIM
  2365.     XCHG
  2366.     SHLD    CURTRK
  2367.     XCHG
  2368.     MOV    B,D
  2369.     MOV    C,E
  2370.     PUSH    H
  2371. VSETTRK    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2372.     POP    H
  2373.     RET
  2374. ;
  2375. SETSEC    PUSH    H
  2376.     PUSH    D
  2377.     LHLD    SYSTRK
  2378.     XCHG
  2379.     SHLD    CURSEC
  2380.     LHLD    CURTRK
  2381.     CALL    SUBDE
  2382.     POP    B
  2383.     MOV    H,B
  2384.     MOV    L,C
  2385.     JNC    NOTSYS
  2386.     LDA    FIRST0    ;SEE IF FIRST SEC 0
  2387.     ORA    A
  2388.     JNZ    GSETSEC    ;NO, JUMP AWAY
  2389.     DCX    H    ;YES, SO DECREMENT
  2390.     JMP    GSETSEC    ;  REQUESTED, THEN GO
  2391. ;
  2392. NOTSYS    LHLD    SECTBL
  2393.     XCHG
  2394.     DCX    B
  2395. VSCTRN    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2396.     LDA    SPT+1    ;IF SPT<256 (HI-ORD = 0)
  2397.     ORA    A    ; THEN FORCE 8-BIT TRANSLATION
  2398.     JNZ    VSCTR1    ; ELSE KEEP ALL 16 BITS
  2399.     MOV    H,A
  2400. VSCTR1    LDA    VER2FL    ;SEE IF VERSION 2.x
  2401.     ORA    A    ;SET FLAGS
  2402.     JNZ    GSETSEC    ;JUMP IF CP/M 2.x
  2403.     MVI    H,0    ;CP/M 1.4 GOOD TO ONLY 8 BITS
  2404.     MOV    L,C    ;MOST BIOS'S RETURN THE
  2405.             ;  PHYSICAL SEC # IN REG C
  2406. GSETSEC    SHLD    PHYSEC    ;THIS MAY BE REDUNDANT IN
  2407.             ; MOST 1.4 VERSIONS, BUT
  2408.             ; SHOULD CAUSE NO PROBLEMS
  2409.     MOV    B,H
  2410.     MOV    C,L
  2411. VSETSEC    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2412.     POP    H
  2413.     RET
  2414. ;
  2415. OUTLIM    XRA    A
  2416.     STA    QFLAG
  2417.     CALL    ILPRT
  2418.     DB    '++not within tracks 0-',0
  2419.     PUSH    H
  2420.     LHLD    MAXTRK
  2421.     CALL    DEC
  2422.     POP    H
  2423.     CALL    ILPRT
  2424.     DB    '++'
  2425.     DB    CR,LF,0
  2426.     CALL    NOWRITE
  2427.     JMP    PROMPTR
  2428. ;
  2429. SETDMA    JMP    $-$    ;ADDR FILLED IN BY 'INIT'
  2430. ;
  2431. READ    MVI    A,1
  2432.     STA    WRFLG
  2433.     PUSH    H
  2434. VREAD    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2435.     ORA    A
  2436.     JZ    READOK
  2437.     XRA    A
  2438.     STA    QFLAG
  2439.     CALL    ILPRT
  2440.     DB    '++READ failed, sector may be invalid++'
  2441.     DB    CR,LF,0
  2442. READOK    POP    H
  2443.     RET
  2444. ;
  2445. WRITE    LDA    WRFLG
  2446.     ORA    A
  2447.     JNZ    PWRITE
  2448. BADW    XRA    A
  2449.     STA    QFLAG
  2450.     CALL    ILPRT
  2451.     DB    '++CANNOT WRITE UNLESS READ ISSUED'
  2452.     DB    CR,LF,0
  2453.     JMP    EXPL
  2454. ;
  2455. PWRITE    PUSH    H
  2456.     MVI    C,1    ;FORCE WRITE TYPE 1 IN CASE 2.x DEBLOCK USED
  2457. VWRITE    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  2458.     ORA    A
  2459.     JZ    WRITEOK
  2460.     XRA    A
  2461.     STA    QFLAG
  2462.     CALL    ILPRT
  2463.     DB    '++WRITE failed++',CR,LF,0
  2464. WRITEOK    POP    H
  2465.     RET
  2466. ;
  2467. ;HELP
  2468. ;    10/21/81 Put BACK tabs instead of all
  2469. ;        the spaces.  Sure wish I knew
  2470. ;        what motivated people to do such
  2471. ;        SENSLESS changes!
  2472. ;    09/27/81 DELETED "type any char to continue".
  2473. ;        (I find ^S an adequate means.  First
  2474. ;        time I asked for "H" with DU-77, and
  2475. ;        DID use ^S it took it as the "any char"
  2476. ;        and instead of stopping IT WENT.  <WLC> )
  2477. ;
  2478. HELP    CALL    ILPRT
  2479.     DB    'USE ^S to hold printing, ^C to abort it'
  2480.  DB CR,LF,CR,LF
  2481.     DB    'Operands in brackets [...] are optional;'
  2482.  DB CR,LF
  2483.     DB    '"xx" means hex; "nn" means decimal.  Where hex'
  2484.  DB CR,LF
  2485.     DB    'is the default, enter #nn for decimal.'
  2486.  DB CR,LF
  2487.     DB    'Change decimal input to hex via xxH (or Hxx).'
  2488.  DB CR,LF,CR,LF
  2489.     DB    '+[nn]    step in [nn] sectors;'
  2490.  DB CR,LF
  2491.     DB    '-[nn]    step out [nn] sectors'
  2492.  DB CR,LF
  2493.     DB    '#    print disk parameters for curr drive.'
  2494.  DB CR,LF
  2495.     DB    '    & # of saved (via "<<") sectors'
  2496.  DB CR,LF
  2497.     DB    '=sss    search for ASCII sss from curr sector.'
  2498.  DB CR,LF
  2499.     DB    '    Caution: upper/lower case matters.'
  2500.  DB CR,LF
  2501.     DB    '    Use <xx> for hex: <3b> for ";";'
  2502.  DB CR,LF
  2503.     DB    '    To find "IN 0" use: =<db><0>     or'
  2504.  DB CR,LF
  2505.     DB    '    for "(tab)H,0(CR)(LF)" use: =<9>H,0<D><A>'
  2506.  DB CR,LF
  2507.     DB    '    NOTE: After using "=", you may use "@" to'
  2508.  DB CR,LF
  2509.     DB    '    refer to the displacement of the match:'
  2510.  DB CR,LF
  2511.     DB    '    =LIX;ca@,LXI;w    would change LIX to LXI'
  2512.  DB CR,LF
  2513.     DB    '    @+xx and @-xx are allowed, too.'
  2514.  DB CR,LF
  2515.     DB    '<    save current sector into mem. buff.'
  2516.  DB CR,LF
  2517.     DB    '    (Resets memory pointer used by "<<").'
  2518.  DB CR,LF
  2519.     DB    '<<    save current sector, bump mem addr.'
  2520.  DB CR,LF
  2521.     DB    '    NOTE: this buffer is at 2000H, so you'
  2522.  DB CR,LF
  2523.     DB    '    can exit DUU and get at the sectors.'
  2524.  DB CR,LF
  2525.     DB    '    ALSO NOTE: # reports # of saved sects.'
  2526.  DB CR,LF
  2527.     DB    '>    restore saved sector'
  2528.  DB CR,LF
  2529.     DB    '>>    restore oldest saved sector, setup for next'
  2530.  DB CR,LF
  2531.     DB    '?    give help'
  2532.  DB CR,LF
  2533.     DB    'A[ff,tt] ASCII dump (hex ff, tt, 7F max)'
  2534.  DB CR,LF
  2535.     DB    'C    Change:'
  2536.  DB CR,LF
  2537.     DB    '    CHaddr,byte,byte... (hex)'
  2538.  DB CR,LF
  2539.     DB    '  or    CAaddr,data...  (Ascii)'
  2540.  DB CR,LF
  2541.     DB    '    <xx> Allowed for imbedded hex.'
  2542.  DB CR,LF
  2543.     DB    '  or    CHfrom-thru,byte  e.g. ch0-7f,e5'
  2544.  DB CR,LF
  2545.     DB    '  or    CAfrom-thru,byte'
  2546.  DB CR,LF
  2547.     DB    'D[ff,tt] Dump (hex+ASCII)'
  2548.  DB CR,LF
  2549.     DB    'E    Send erase-screen (string at 104H, FF ends)'
  2550.  DB CR,LF
  2551.     DB    'Fn.t    Find file'
  2552.  DB CR,LF
  2553.     DB    'F    Find next extent of file'
  2554.  DB CR,LF
  2555.     DB    'Gxx    CP/M Allocation Group xx'
  2556.  DB CR,LF
  2557.     DB    'H[ff,tt] hex dump'
  2558.  DB CR,LF
  2559.     DB    'L    Log in drive'
  2560.  DB CR,LF
  2561.     DB    'Lx    Log in drive x'
  2562.  DB CR,LF
  2563.     DB    'M[xx]    Map [from group xx]'
  2564.  DB CR,LF
  2565.     DB    'N    New disk'
  2566.  DB CR,LF
  2567.     DB    'P    Toggle printer switch'
  2568.  DB CR,LF
  2569.     DB    'Q    Quiet mode (no msgs)'
  2570.  DB CR,LF
  2571.     DB    'R    Read current sector'
  2572.  DB CR,LF
  2573.     DB    'Snn    Sector nn'
  2574.  DB CR,LF
  2575.     DB    'Tnn    Track nn'
  2576.  DB CR,LF
  2577.     DB    'V[nn]    View [nn] ASCII sectors'
  2578.  DB CR,LF
  2579.     DB    'W    Write current sector'
  2580.  DB CR,LF
  2581.     DB    'X    Exit program'
  2582.  DB CR,LF
  2583.     DB    'Z[nn]    Sleep [nn tenths]'
  2584.  DB CR,LF
  2585.     DB    '/[nn]    Repeat [nn times]'
  2586.  DB CR,LF,CR,LF
  2587.     DB    'Cancel a function with C or Ctl-C.'
  2588.  DB CR,LF
  2589.     DB    'Suspend output with S or Ctl-S.'
  2590.  DB CR,LF
  2591.     DB    'Separate commands with ";".'
  2592.  DB CR,LF
  2593.     DB    '    Example: g0'
  2594.  DB CR,LF
  2595.     DB    '    +;d;z20;/'
  2596.  DB CR,LF
  2597.     DB    '    would step in, dump, sleep 2 sec, '
  2598.  DB CR,LF
  2599.     DB    '    and repeat until control-c typed.'
  2600.  DB CR,LF,CR,LF
  2601.     DB    'See DU.DOC for complete examples.'
  2602.  DB CR,LF,CR,LF,0
  2603.     JMP    PROMPT
  2604. ;
  2605. ;    Subroutines
  2606. ;
  2607. GRPCMP    MOV    A,C
  2608.     INR    D
  2609.     DCR    D
  2610.     JZ    CMP8
  2611.     CMP    M
  2612.     INX    H
  2613.     RNZ
  2614.     MOV    A,B
  2615. CMP8    CMP    M
  2616.     RET
  2617. ;
  2618. ;2's complement HL ==> HL
  2619. ;
  2620. NEG    MOV    A,L
  2621.     CMA
  2622.     MOV    L,A
  2623.     MOV    A,H
  2624.     CMA
  2625.     MOV    H,A
  2626.     INX    H
  2627.     RET
  2628. ;
  2629. ;HL/2 ==> HL
  2630. ;
  2631. ROTRHL    ORA    A
  2632.     MOV    A,H
  2633.     RAR
  2634.     MOV    H,A
  2635.     MOV    A,L
  2636.     RAR
  2637.     MOV    L,A
  2638.     RET
  2639. ;
  2640. ;Collect the number of '1' bits
  2641. ;in A as a count in C
  2642. ;
  2643. COLECT    MVI    B,8
  2644. ;
  2645. COLOP    RAL
  2646.     JNC    COSKIP
  2647.     INR    C
  2648. ;
  2649. COSKIP    DCR    B
  2650.     JNZ    COLOP
  2651.     RET
  2652. ;
  2653. ;HL-DE ==> HL
  2654. ;
  2655. SUBDE    MOV    A,L
  2656.     SUB    E
  2657.     MOV    L,A
  2658.     MOV    A,H
  2659.     SBB    D
  2660.     MOV    H,A
  2661.     RET
  2662. ;
  2663. ;Quick Kludge multiply
  2664. ;HL=DE ==> HL
  2665. ;
  2666. MULT    PUSH    B
  2667.     PUSH    D
  2668.     XCHG
  2669.     MOV    B,D
  2670.     MOV    C,E
  2671.     MOV    A,B
  2672.     ORA    C
  2673.     JNZ    MULCON
  2674.     LXI    H,0    ;FILTER SPECIAL CASE
  2675.     JMP    MLDONE    ;    OF MULTIPLY BY 0
  2676. ;
  2677. MULCON    DCX    B
  2678.     MOV    D,H
  2679.     MOV    E,L
  2680. ;
  2681. MULTLP    MOV    A,B
  2682.     ORA    C
  2683.     JZ    MLDONE
  2684.     DAD    D
  2685.     DCX    B
  2686.     JMP    MULTLP
  2687. ;
  2688. MLDONE    POP    D
  2689.     POP    B
  2690.     RET
  2691. ;
  2692. ;Routine to fill in disk params
  2693. ;with every drive change
  2694. ;
  2695. LOGIT    LDA    VER2FL
  2696.     ORA    A    ;IF NOT CP/M 2.x THEN
  2697.     JZ    LOG14    ;    DO IT AS 1.4
  2698.     LXI    D,DPB    ;  THEN MOVE TO LOCAL
  2699.     MVI    B,DPBLEN ;  WORKSPACE
  2700.     CALL    MOVE
  2701.     JMP    LOGCAL
  2702. ;
  2703. LOG14    LHLD    BDOS+1    ;FIRST FIND 1.4 BDOS
  2704.     MVI    L,0
  2705.     LXI    D,DPBOFF ;THEN OFFSET TO 1.4'S DPB
  2706.     DAD    D
  2707.     MVI    D,0    ;SO 8 BIT PARMS WILL BE 16
  2708.     MOV    E,M    ;NOW MOVE PARMS
  2709.     INX    H
  2710.     XCHG
  2711.     SHLD    SPT
  2712.     XCHG
  2713.     MOV    E,M
  2714.     INX    H
  2715.     XCHG
  2716.     SHLD    DRM
  2717.     XCHG
  2718.     MOV    A,M
  2719.     INX    H
  2720.     STA    BSH
  2721.     MOV    A,M
  2722.     INX    H
  2723.     STA    BLM
  2724.     MOV    E,M
  2725.     INX    H
  2726.     XCHG
  2727.     SHLD    DSM
  2728.     XCHG
  2729.     MOV    E,M
  2730.     INX    H
  2731.     XCHG
  2732.     SHLD    AL0
  2733.     XCHG
  2734.     MOV    E,M
  2735.     XCHG
  2736.     SHLD    SYSTRK
  2737. ;
  2738. LOGCAL    LXI    H,GRPDISP
  2739.     MOV    A,M
  2740.     PUSH    PSW
  2741.     LDA    BLM
  2742.     MOV    M,A
  2743.     PUSH    H
  2744.     LHLD    DSM
  2745.     XCHG
  2746.     CALL    GTKSEC
  2747.     SHLD    MAXSEC
  2748.     XCHG
  2749.     SHLD    MAXTRK
  2750.     POP    H
  2751.     POP    PSW
  2752.     MOV    M,A
  2753.     RET
  2754. ;
  2755. ;Temporary storage area
  2756. ;
  2757. BUFAD    DW    BASE+100H ;FORCES INITIAL READ
  2758. HEXAD    DW    0    ;TO RE-FETCH A VALUE
  2759. TOGO    DW    0FFFFH    ;REPEAT COUNT (FFFF=CONT)
  2760. TWOUP    DB    0
  2761. PFLAG    DB    0    ;1=PRINT
  2762. GROUP    DW    0
  2763. GRPDISP    DB    0
  2764. SAVEFLG    DB    0
  2765. CURTRK    DW    0
  2766. CURSEC    DW    1
  2767. PHYSEC    DW    1
  2768. TABCOL    DB    0
  2769. FILECT    DW    0
  2770. DIRPOS    DB    0
  2771. FINDFLG    DB    0    ;1=MUST POSITION AFTER FIND
  2772. FTSW    DB    1    ;SEARCH W/O INCREMENT
  2773. NOTPOS    DB    1    ;INITIALLY NOT POSITIONED
  2774. WRFLG    DB    0    ;MAY NOT WRITE UNTIL '+', '-',
  2775. ;             OR 'G' COMMAND
  2776. QFLAG    DB    0    ;QUIET? (0=NO)
  2777. FIRST0    DB    0    ;SETS TO 0 IF FIRST SEC # IS 0
  2778. DRIVE    DB    0
  2779. MAXTRK    DW    0
  2780. MAXSEC    DW    0
  2781. VER2FL    DB    0
  2782. SECTBL    DW    0    ;POINTER TO SECTOR SKEW TABLE
  2783. NXTSAVE    DW    SAVEBUF    ;NEXT SECT BUFFER TO STORE INTO
  2784. ;             (READDIR READS DIR IN HERE, TOO)
  2785. NXTREST    DW    SAVEBUF    ;NEXT SECT BUFFER TO READ FROM
  2786. NUMSAVD    DB    0    ;# IN BUFFER
  2787. NUMREST    DB    0    ;# WRITTEN SO FAR
  2788. SECDISP    DB    0    ;DISP IN SECTOR AT WHICH MATCH
  2789. ;            ;OCCURRED
  2790. ;
  2791.     DS    120    ;STACK SPACE
  2792. STACK:
  2793. BACK    DS    2    ;TO BACK UP IN "CA0-7F,X"
  2794. NUMENT    DS    2    ;# OF DIR ENTRIES FOR "F" TO SCAN
  2795. FCONT    DS    2    ;FIND - CONTINUE SEARCH POINTER
  2796. DUMTYPE    DS    1
  2797. ;
  2798. ;    -    -    -    -    -    -    -
  2799. ;The disk parameter block
  2800. ;is moved here from CP/M
  2801. ;
  2802. DPB    EQU    $    ;DISK PARAMETER BLOCK (COPY)
  2803. SPT    DS    2
  2804. BSH    DS    1
  2805. BLM    DS    1
  2806. EXM    DS    1
  2807. DSM    DS    2
  2808. DRM    DS    2
  2809. AL0    DS    1
  2810. AL1    DS    1
  2811. CKS    DS    2
  2812. SYSTRK    DS    2
  2813. ;
  2814. ;End of disk parameter block
  2815. ;
  2816. INBUF    DS    128
  2817. ;
  2818. ;ORG TO 2000, SO SID/DDT MAY BE LOADED TO WORK
  2819. ;WITH DATA SAVED BY MULTIPLE "<<" COMMANDS.
  2820. ;(SHOULD DUU GROW, THIS WILL AUTOMATICALLY
  2821. ;BE ORGed TO 3000H WHEN NECESSARY)
  2822. ;
  2823.     ORG    ($+0FFFH) AND 0F000H
  2824. ;
  2825. SAVEBUF    EQU    $    ;X000 ALIGNED SECT BUFF
  2826. ;
  2827. ;NOTE DIRECTORY READ IN HERE "SOMEWHERE" DEPENDING
  2828. ;UPON WHERE NXTSAVE POINTS
  2829. ;
  2830.     END
  2831.