home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / DU314A.LBR / DU314-02.ZZ0 / DU314-02.Z80
Text File  |  2000-06-30  |  35KB  |  2,162 lines

  1. ;
  2. ; DU314-02.Z80
  3. ;
  4.  
  5. ;
  6. ;This is the Save Group Routine; it copies the indicated group into the save
  7. ;  buffer.
  8. ;
  9. saveg:
  10.     call    comg        ;EXTRACT COMMON GROUP INFO -- GROUP NUMBER AND POS
  11.     push    hl
  12.     call    ilprt
  13.     db    'Reading from Group ',0
  14.     ld    hl,(group)    ;GET CURRENT GROUP
  15.     ld    b,h        ;VALUE IN BC
  16.     ld    c,l
  17.     call    hexb        ;PRINT AS HEX
  18.     call    ilprt
  19.     db    cr,lf,0
  20.     ld    hl,(qlst)    ;LAST PTR USED FOR READ
  21.     ld    (qptr),hl
  22.     pop    hl
  23.     ld    a,0        ;SET COPY FUNCTION TO SAVE
  24.     ld    (cpyfct),a    ;0=READ, 0FFH=WRITE
  25. ;
  26. ;Group Copy Routine -- if CPYFCT = 0, Read Group; if CPYFCT = 0FFH, Write Group
  27. ;
  28. copyg:
  29.     push    hl        ;SAVE PTR TO NEXT CHAR IN COMMAND LINE
  30.     call    norite        ;POSITIONING LOST
  31.     ex    de,hl        ;SAVE HL
  32.     ld    hl,(qptr)    ;PT TO NEXT QUEUE POSITION
  33.     ex    de,hl        ;... IN DE
  34.     ld    a,(blm)        ;GET NUMBER OF BLOCKS/GROUP
  35.     inc    a        ; ADD 1 TO BLM FOR CORRECT COUNT
  36.     ld    b,a        ;COUNT IN B
  37. ;
  38. copygl:
  39.     push    bc        ;SAVE COUNT
  40.     push    de        ;SAVE PTR TO NEXT BLOCK TO LOAD
  41.     ld    b,d        ;SET BC=DE FOR SET DMA
  42.     ld    c,e
  43.     call    setdma        ;SET ADDRESS TO LOAD
  44.     ld    a,(cpyfct)    ;READ OR WRITE?
  45.     or    a        ;0=READ
  46.     jp    nz,copyglw
  47.     call    read        ;READ BLOCK
  48.     ld    hl,(qcnt)    ;INCREMENT QUEUE ELEMENT COUNT
  49.     inc    hl
  50.     ld    (qcnt),hl
  51.     jp    copygl0
  52. copyglw:
  53.     ld    hl,(qcnt)    ;QUEUE EMPTY?
  54.     ld    a,h
  55.     or    l
  56.     jp    z,qempty
  57.     call    pwrite        ;WRITE BLOCK (NO CHECK)
  58.     ld    hl,(qcnt)    ;DECREMENT QUEUE ELEMENT COUNT
  59.     dec    hl
  60.     ld    (qcnt),hl
  61. copygl0:
  62.     call    nxtsec        ;COMPUTE NEXT SECTOR ADDRESS
  63.     ld    hl,(curtrk)    ;GET NEXT TRACK ADDRESS
  64.     ex    de,hl        ;... IN DE
  65.     call    settrk        ;SET IT
  66.     ld    hl,(cursec)    ;GET NEXT SECTOR ADDRESS
  67.     ex    de,hl        ;... IN DE
  68.     call    setsec        ;SET IT
  69.     pop    de        ;GET PTR TO NEXT BLOCK
  70.     pop    bc        ;GET COUNTER
  71.     ld    hl,80h        ;OFFSET TO NEXT BLOCK
  72.     add    hl,de
  73.     ld    (qptr),hl
  74.     ex    de,hl        ;DE PTS TO NEXT BLOCK
  75.     call    qwrap        ;ALLOW WRAP AROUND IN QUEUE
  76.     ld    a,(cpyfct)    ;0=READ
  77.     or    a        ;NO QUEUE OVERFLOW CHECK IF WRITE
  78.     jp    nz,copygl1
  79.     ld    hl,(qnxt)    ;CHECK FOR QUEUE OVERFLOW
  80.     ld    a,h        ;MUST NOT BE EQUAL
  81.     cp    d
  82.     jp    nz,copygl1
  83.     ld    a,l
  84.     cp    e
  85.     jp    z,qsav2
  86. copygl1:
  87.     djnz    copygl        ;LOOP UNTIL FINISHED
  88.     ld    hl,(qcnt)    ;PRINT COUNT
  89.     call    prqcnt
  90.     ld    hl,(qptr)    ;GET QUEUE PTR
  91.     ld    a,(cpyfct)    ;RESET PROPER QUEUE PTR
  92.     or    a        ;0=READ
  93.     jp    z,copygl2
  94.     ld    (qnxt),hl    ;NEXT PTR USED FOR WRITE
  95.     jp    copygl3
  96. copygl2:
  97.     ld    (qlst),hl    ;LAST PTR USED FOR READ
  98. copygl3:
  99.     ld    bc,tbuff    ;RESET DMA ADDRESS
  100.     call    setdma
  101.     xor    a        ;A=0
  102.     ld    (wrflg),a    ;SET NO READ DONE
  103.     ld    hl,(tgrp)    ;GET GROUP NUMBER
  104.     ex    de,hl        ;... IN DE
  105.     pop    hl        ;GET PTR TO NEXT CHAR
  106.     jp    posgrp        ;POSITION TO GROUP IN DE AND CONTINUE PROCESSING
  107.  
  108. ;
  109. ;COMMAND:  >
  110. ;Restore the current sector
  111. ;    Special Form >S gets next block from queue
  112. ;    Special Form >G gets next group from queue
  113. ;
  114. restor:
  115.     ld    a,(hl)        ;CHECK FOR SPECIAL FORM
  116.     call    upcase        ;CAPITALIZE
  117.     cp    'B'        ;BLOCK SAVE?
  118.     jp    z,qrestor
  119.     cp    'G'        ;GROUP SAVE?
  120.     jp    z,restrg
  121.     ld    a,(savefl)    ;SAVE DONE PREVIOUSLY?
  122.     or    a
  123.     jp    z,nosave    ;NONE TO SAVE
  124.     push    hl
  125.     ld    hl,(savbuf)    ;COPY FROM SAVBUF
  126.     ld    de,tbuff    ;INTO TBUFF
  127.     ld    b,128        ;128 BYTES
  128.     call    move
  129.     pop    hl        ;GET PTR TO NEXT CHAR
  130.     jp    prompt
  131. ;
  132. ;  Restore Sector from Queue
  133. ;
  134. qrestor:
  135.     inc    hl        ;PT TO NEXT CHAR
  136.     push    hl        ;SAVE PTR ON STACK
  137.     ld    hl,(qcnt)    ;GET ELEMENT COUNT
  138.     ld    a,h        ;EMPTY?
  139.     or    l
  140.     jp    z,qempty    ;ABORT IF EMPTY
  141.     dec    hl        ;COUNT DOWN
  142.     ld    (qcnt),hl
  143.     call    prqcnt        ;PRINT COUNT
  144.     ld    hl,(qnxt)    ;PT TO NEXT ELEMENT IN QUEUE
  145.     ld    de,tbuff    ;COPY INTO TBUFF
  146.     ld    b,128        ;128 BYTES
  147.     call    move
  148.     ex    de,hl        ;DE=PTR TO NEXT ELEMENT IN QUEUE
  149.     call    qwrap        ;CHECK FOR WRAP AROUND
  150.     ex    de,hl        ;HL PTS TO NEXT ELEMENT IN QUEUE
  151.     ld    (qnxt),hl    ;SAVE PTR
  152.     pop    hl        ;RESTORE PTR
  153.     jp    prompt
  154. qempty:
  155.     call    ilprt
  156.     db    'Error -- Queue Empty',cr,lf,0
  157.     pop    hl        ;RESTORE NEXT CHAR PTR
  158.     jp    prmptr
  159. ;
  160. ;Write Group Loaded in GBUFF to Disk
  161. ;
  162. restrg:
  163.     call    comg        ;GET GROUP NUMBER FROM COMMAND LINE AND POS
  164.     push    hl
  165.     call    ilprt
  166.     db    'Writing to Group ',0
  167.     ld    hl,(group)    ;GET GROUP NUMBER
  168.     ld    b,h        ;VALUE IN BC
  169.     ld    c,l
  170.     call    hexb        ;PRINT IN HEX
  171.     call    ilprt
  172.     db    cr,lf,0
  173.     ld    hl,(qnxt)    ;NEXT PTR USED FOR WRITE
  174.     ld    (qptr),hl
  175.     pop    hl
  176.     ld    a,0ffh        ;WRITE FUNCTION
  177.     ld    (cpyfct),a    ;COPY FUNCTION FOR GROUP COPY ROUTINE
  178.     jp    copyg        ;GROUP COPY ROUTINE
  179. ;
  180. nosave:
  181.     call    ilprt
  182.     db    '++ No "<" Save Command Issued ++'
  183.     db    cr,lf,0
  184.     jp    prmptr
  185. ;
  186. ;Move (HL) to (DE) length in B
  187. ;
  188. move:
  189.     ld    a,(hl)
  190.     ld    (de),a
  191.     inc    hl
  192.     inc    de
  193.     djnz    move
  194.     ret
  195. ;
  196. norite:
  197.     xor    a        ;GET 0
  198.     ld    (wrflg),a    ;CAN'T WRITE NOW
  199.     ret
  200. ;
  201. ;No match in search, try next char
  202. ;
  203. srnomt:
  204.     pop    hl
  205.     call    ctlcs        ;ABORT?
  206.     jp    nz,search    ;..YES
  207.     ld    hl,(inbuf)
  208.     ld    (hl),cr
  209.     jp    clcgrp        ;SHOW WHERE STOPPED
  210. ;
  211. ;COMMAND:  =
  212. ;Search for character string
  213. ;
  214. search:
  215.     push    hl        ;SAVE STRING POINTER
  216. ;
  217. srchl:
  218.     call    rdbyte        ;GET A BYTE
  219.     ld    b,a        ;SAVE IT
  220.     ld    a,(hl)        ;CHECK NEXT MATCH CHAR.
  221.     cp    '<'        ;WILL IT BE HEX?
  222.     ld    a,b        ;RESTORE DISK CHAR
  223.     jp    z,srchl1
  224.     and    7fh        ;NEXT CHAR IS ASCII...STRIP BIT 7
  225. ;
  226. srchl1:
  227.     push    af
  228.     call    getval        ;GET SEARCH VALUE
  229.     ld    b,a
  230.     pop    af
  231.     cp    b        ;MATCH?
  232.     jp    nz,srnomt    ;NO MATCH
  233.     inc    hl
  234.     ld    a,(hl)        ;DONE?
  235.     cp    cr        ;END OF LINE?
  236.     jp    z,srequ
  237.     cp    eolch        ;LOGICAL EOL?
  238.     jp    nz,srchl
  239. ;
  240. ;Got match
  241. ;
  242. srequ:
  243.     call    ilprt
  244.     db    '= at ',0
  245.     ld    a,(bufad)
  246.     and    7fh
  247.     call    hex
  248.     call    crlf
  249.     jp    clcgrp
  250. ;
  251. ;Get value from input buffer
  252. ;
  253. getval:
  254.     ld    a,(hl)        ;GET NEXT CHAR
  255.     cp    '<'        ;HEX ESCAPE?
  256.     ret    nz        ;NO, RETURN
  257. ;"<<" means one "<"
  258.     inc    hl
  259.     ld    a,(hl)
  260.     cp    '<'
  261.     ret    z
  262. ;Got hex
  263.     push    de
  264.     call    hexin        ;GET VALUE
  265.     cp    '>'        ;PROPER DELIM?
  266.     ld    a,e        ;GET VALUE
  267.     pop    de
  268.     jp    nz,what        ;ERROR
  269.     ret
  270. ;
  271. ;Read a byte at a time from disk
  272. ;
  273. rdbyte:
  274.     push    hl
  275.     ld    a,(ftsw)    ;FIRST READ?
  276.     or    a
  277.     jp    nz,read1
  278.     ld    hl,(bufad)
  279.     ld    a,l
  280.     or    a        ;IN BUFFER?
  281.     jp    m,nord        ;YES, SKIP READ
  282. ;
  283. ;Have to read
  284. ;
  285.     call    nxtsec        ;ADVANCE TO NEXT BLOCK
  286. ;
  287. read1:
  288.     xor    a
  289.     ld    (ftsw),a    ;NOT FIRST READ
  290.     ld    hl,(cursec)
  291.     ex    de,hl
  292.     call    setsec
  293.     ld    hl,(curtrk)
  294.     ex    de,hl
  295.     call    settrk
  296.     call    read
  297.     call    clcsub
  298.     ld    hl,tbuff
  299. ;
  300. nord:
  301.     ld    a,(hl)
  302.     inc    hl
  303.     ld    (bufad),hl
  304.     pop    hl
  305.     ret
  306. ;
  307. ;COMMAND:  V
  308. ;View the file in ASCII starting at
  309. ;current sector, stepping thru the disk
  310. ;
  311. view:
  312.     ld    a,(wrflg)
  313.     or    a
  314.     jp    z,baddmp
  315.     call    decin        ;GET DISPL IF ANY
  316.     push    hl
  317.     ld    a,e
  318.     or    a
  319.     jp    nz,viewlp
  320.     inc    e        ;DFLT=1
  321. ;
  322. viewlp:
  323.     ld    hl,tbuff    ;TO DATA
  324. ;
  325. vewchr:
  326.     call    ctlcs        ;ABORT?
  327.     jp    z,vewend
  328.     ld    a,(hl)        ;GET NEXT CHAR
  329.     cp    1ah        ;EOF?
  330.     jp    z,veweof
  331.     and    7fh        ;MASK
  332.     cp    7eh        ;ESC CHAR FOR H1500
  333.     jp    nc,viewhx    ;SHOW RUBOUT AND TILDE AS HEX
  334.     cp    ' '
  335.     jp    nc,viewpr
  336.     cp    cr        ;CR PASS
  337.     jp    z,viewpr
  338.     cp    lf        ;LF PASS
  339.     jp    z,viewpr
  340.     cp    tab        ;TAB PASS
  341.     jp    z,viewpr
  342. ;
  343. viewhx:
  344.     ld    a,(hl)        ;NOT ASCII...PRINT AS <NN>
  345.     call    bhex
  346.     jp    viewnp
  347. ;
  348. viewpr:
  349.     call    type
  350. ;
  351. viewnp:
  352.     inc    l
  353.     jp    nz,vewchr
  354.     dec    e
  355.     jp    z,vewend
  356.     push    de        ;SAVE COUNT
  357.     call    nxtsec
  358.     ld    hl,(cursec)
  359.     ex    de,hl
  360.     call    setsec
  361.     ld    hl,(curtrk)
  362.     ex    de,hl
  363.     call    settrk
  364.     call    read
  365.     pop    de        ;RESTORE COUNT
  366.     jp    viewlp
  367. ;
  368. veweof:
  369.     call    ilprt
  370.     db    cr,lf,dim,' ++ EOF ++',bright,cr,lf,0
  371. ;
  372. vewend:
  373.     pop    hl
  374.     call    crlf
  375.     jp    clcgrp
  376. ;
  377. ;COMMAND:  A or D
  378. ;Dump in hex or ASCII
  379. ;
  380. dump:
  381.     ld    a,(wrflg)
  382.     or    a
  383.     jp    nz,dumpok
  384. ;
  385. baddmp:
  386.     call    ilprt
  387.     db    '++ Can''t dump, no sector read ++',cr,lf,0
  388. ;
  389. expl:
  390.     call    ilprt
  391.     db    'Use G command following F,',cr,lf
  392.     db    'or R or S following T',cr,lf,0
  393.     jp    prmptr
  394. ;
  395. dumpok:
  396.     ld    a,(hl)        ;GET NEXT CHAR
  397.     cp    eolch        ;LOGICAL EOL?
  398.     jp    z,dumpdf    ;DFLT
  399.     cp    cr        ;PHYSICAL EOL?
  400.     jp    nz,dmpndf
  401. ;
  402. ;Use default
  403. ;
  404. dumpdf:
  405.     ld    bc,tbuff
  406.     ld    de,0ffh
  407.     jp    dump1
  408. ;
  409. dmpndf:
  410.     call    disp
  411.     ld    b,d
  412.     ld    c,e
  413.     cp    cr
  414.     jp    z,dump1
  415.     cp    eolch
  416.     jp    z,dump1
  417.     inc    hl        ;SKIP SEPCH
  418.     call    disp
  419. ;
  420. ;BC = start, DE = end
  421. ;
  422. dump1:
  423.     push    hl        ;SAVE COMMAND POINTER
  424.     ld    h,b
  425.     ld    l,c
  426. ;
  427. dumplp:
  428.     call    dumphl        ;PERFORM DUMP OF DIR ENTRY AT HL
  429.     pop    hl        ;RESTORE HL
  430.     jp    prompt
  431. ;
  432. ; PERFORM DUMP AT HL
  433. ;
  434. dumphl:
  435.     call    stndout        ;DIM
  436.     ld    a,l
  437.     and    7fh
  438.     call    hex        ;PRINT HEX VALUE
  439.     call    stndend        ;BRIGHT
  440.     call    space
  441.     call    space
  442.     ld    a,(dumtyp)
  443.     cp    'A'
  444.     jp    z,dumpas
  445.     push    hl        ;SAVE START
  446. ;
  447. ; DUMP 16 BYTES STARTING AT HL (CHECK FOR DE TERMINATION)
  448. ;
  449. dhex:
  450.     ld    a,(hl)
  451.     call    hex        ;PRINT HEX VALUE PTED TO BY HL
  452.     ld    a,l
  453.     and    3
  454.     cp    3        ;EXTRA SPACE EVERY 4
  455.     call    z,space
  456.     ld    a,l
  457.     and    7
  458.     cp    7        ;TWO EXTRA SPACES EVERY 8
  459.     call    z,space
  460.     ld    a,e        ;CHECK FOR END OF BYTES TO DUMP
  461.     cp    l
  462.     jp    z,dpop
  463.     inc    hl
  464.     ld    a,l        ;CHECK FOR END OF 16 BYTES
  465.     and    0fh
  466.     jp    nz,dhex
  467. ;
  468. dpop:
  469.     call    ctlcs        ;ABORT?
  470.     jp    z,prmptr
  471.     ld    a,(dumtyp)    ;CHECK FOR ASCII ALSO
  472.     cp    'H'
  473.     jp    z,dnoas        ;HEX ONLY
  474.     pop    hl        ;GET START ADDR
  475. ;
  476. ;  DUMP ASCII CHARS - HL PTS TO FIRST BYTE
  477. ;
  478. dumpas:
  479.     call    aster        ;PRINT FIRST ASTERISK TO SEPARATE TEXT
  480. ;
  481. dchr:
  482.     ld    a,(hl)        ;GET CHAR
  483.     and    7fh
  484.     cp    ' '
  485.     jp    c,dper
  486.     cp    7fh        ;TRAP DEL
  487.     jp    c,dok
  488. ;
  489. dper:
  490.     ld    a,'.'        ;PRINT PRINTING CHAR
  491. ;
  492. dok:
  493.     call    type        ;PRINT CHAR
  494.     ld    a,e        ;CHECK FOR END OF DUMP
  495.     cp    l
  496.     jp    z,dend
  497.     inc    hl
  498.     ld    a,l        ;CHECK FOR END OF 16 BYTES
  499.     and    0fh
  500.     jp    nz,dchr
  501. ;
  502. ; END OF ASCII DUMP
  503. ;
  504. dend:
  505.     call    aster        ;PRINT ENDING ASTERISK
  506.     call    crlf        ;NEW LINE
  507.     push    de
  508.     call    ctlcs        ;ABORT?
  509.     pop    de
  510.     jp    z,prmptr
  511.     ld    a,e        ;DONE WITH DUMP?
  512.     cp    l
  513.     jp    nz,dumphl
  514.     ret
  515. ;
  516. ; NO ASCII DUMP
  517. ;
  518. dnoas:
  519.     pop    bc        ;CLEAR STACK (START ADDRESS OF DUMP)
  520.     call    crlf        ;NEW LINE
  521.     ld    a,e        ;DONE WITH DUMP?
  522.     cp    l
  523.     jp    nz,dumphl
  524.     ret
  525. ;
  526. ;COMMAND:  G
  527. ;Position
  528. ;
  529. pos:
  530.     push    af
  531.     ld    a,(hl)
  532.     cp    eolch        ;LOGICAL EOL?
  533.     jp    z,posinq
  534.     cp    cr        ;PHYSICAL EOL?
  535.     jp    nz,posok
  536. ;
  537. posinq:
  538.     pop    af
  539.     jp    inq
  540. ;
  541. posok:
  542.     pop    af
  543.     cp    'T'        ;TRACK?
  544.     jp    z,postkd
  545.     cp    'S'        ;SECTOR?
  546.     jp    z,posscd
  547.     cp    'G'        ;GROUP?
  548.     jp    z,posgph
  549.     jp    what        ;ERROR OTHERWISE
  550. ;
  551. ;Position to Track
  552. ;
  553. postkd:
  554.     call    decin        ;GET NUMBER IN DECIMAL
  555. ;
  556. postrk:
  557.     push    hl
  558.     ld    hl,(maxtrk)    ;CHECK FOR BEYOND END OF DISK
  559.     call    subde
  560.     pop    hl
  561.     jp    c,outlim
  562.     call    settrk        ;SET TRACK
  563.     call    norite        ;TRACK DOESN'T READ
  564.     ld    a,1
  565.     ld    (notpos),a    ;SHOW NOT POSITIONED
  566.     jp    clcgrp
  567. ;
  568. ;Position to Sector
  569. ;
  570. posscd:
  571.     call    decin        ;GET NUMBER IN DECIMAL
  572.     ld    a,d
  573.     or    e
  574.     jp    z,what        ;DON'T ALLOW SECTOR 0
  575. ;
  576. possec:
  577.     push    hl
  578.     ld    hl,(spt)    ;CHECK FOR WITHIN RANGE
  579.     call    subde
  580.     pop    hl
  581.     jp    c,what
  582.     call    setsec        ;SET SECTOR
  583.     call    read        ;READ
  584.     xor    a
  585.     ld    (notpos),a    ;POSITIONED OK
  586. ;
  587. ;Calculate Group Number/Group Displacement and Print
  588. ;
  589. clcgrp:
  590.     call    clcsub
  591.     jp    inq
  592. ;
  593. ;Calculate group from track and sector
  594. ;  On exit, GROUP = Group Number and GRPDIS = Displacement within Group
  595. ;
  596. clcsub:
  597.     push    hl
  598.     ld    hl,(systrk)
  599.     ex    de,hl
  600.     ld    hl,(curtrk)
  601.     call    subde        ;COMPUTE RELATIVE TRACK NUMBER (SKIP SYSTEM TRACKS)
  602.     ex    de,hl
  603.     ld    hl,(spt)    ;MULTIPLY BY NUMBER OF SECTORS/TRACK
  604.     call    mult
  605.     ex    de,hl        ;DE=TOTAL NUMBER OF SECTORS IN TRACKS
  606.     ld    hl,(cursec)    ;GET SECTOR OFFSET FROM BEGINNING OF TRACK
  607.     dec    hl
  608.     add    hl,de        ;HL=TOTAL NUMBER OF SECTORS WITH OFFSET
  609.     ld    a,(blm)
  610.     ld    b,a
  611.     ld    a,l
  612.     and    b
  613.     ld    (grpdis),a    ;DISPLACEMENT WITHIN GROUP
  614.     ld    a,(bsh)
  615.     ld    b,a
  616. ;
  617. clclop:
  618.     call    rotrhl
  619.     djnz    clclop
  620.     ld    (group),hl    ;GROUP NUMBER
  621.     pop    hl
  622.     ret
  623. ;
  624. ;Position in the directory after a find
  625. ;(Does not work in CP/M-2.x)
  626. ;
  627. posdir:
  628.     push    hl        ;SAVE INBUF
  629.     ld    hl,(bsh)
  630.     xor    a
  631.     ld    (findfl),a    ;CANCEL POS REQ
  632.     ld    a,(dirpos)    ;GET POSITION
  633.     rra
  634.     rra
  635.     push    af
  636.     and    h
  637.     ld    (grpdis),a
  638.     pop    af
  639. ;
  640. posdlp:
  641.     rra
  642.     dec    l
  643.     jp    nz,posdlp
  644.     and    1        ;GET GROUP
  645.     ld    l,a        ;SETUP FOR POSGP2
  646.     ld    h,0
  647.     ld    (group),hl
  648.     ex    de,hl
  649. ;
  650. posgp2:
  651.     call    gtksec        ;CONVERT GROUP TO SECTOR/TRACK
  652.     call    settrk        ;SET TRACK
  653.     ex    de,hl
  654.     call    setsec        ;SET SECTOR
  655.     call    read        ;READ BLOCK
  656.     xor    a
  657.     ld    (notpos),a    ;NOW POSITIONED
  658.     pop    hl
  659.     jp    inq
  660. ;
  661. ;Position to Group
  662. ;
  663. posgph:
  664.     call    hexin        ;GET PARAMETER
  665. ;
  666. ;Position to Group Numbered in DE and Print Position
  667. ;
  668. posgrp:
  669.     call    degroup        ;GOTO GROUP
  670.     jp    c,outlim
  671.     jp    inq        ;PRINT POSITION
  672. ;
  673. ;Position to Group Numbered in DE
  674. ; Return with Carry Set if Out of Limits
  675. ;
  676. degroup:
  677.     push    hl
  678.     ld    hl,(dsm)    ;CHECK FOR WITHIN BOUNDS
  679.     call    subde
  680.     pop    hl
  681.     ret    c
  682.     push    hl        ;SAVE HL
  683.     ex    de,hl
  684.     ld    (group),hl    ;SET GROUP NUMBER
  685.     ex    de,hl
  686.     xor    a
  687.     ld    (grpdis),a    ;SET ZERO DISPLACEMENT
  688.     call    gtksec        ;CONVERT GROUP TO SECTOR/TRACK
  689.     call    settrk        ;SET TRACK
  690.     ex    de,hl
  691.     call    setsec        ;SET SECTOR
  692.     call    read        ;READ BLOCK
  693.     xor    a        ;SET NC AND FLAG
  694.     ld    (notpos),a    ;NOW POSITIONED
  695.     pop    hl
  696.     ret
  697. ;
  698. ;Convert Group Number in DE to Sector and Track; also, GRPDIS = Offset in Grp
  699. ;  On exit, DE = Track Number, HL = Sector Number
  700. ;
  701. gtksec:
  702.     ld    h,d        ;HL=GROUP NUMBER
  703.     ld    l,e
  704.     ld    a,(bsh)        ;GET NUMBER OF SECTORS IN GROUP
  705. ;
  706. gloop:
  707.     add    hl,hl
  708.     dec    a
  709.     jp    nz,gloop
  710.     ld    a,(grpdis)    ;ADD IN DISPLACEMENT WITHIN GROUP
  711.     add    a,l        ;CAN'T CARRY
  712.     ld    l,a
  713. ;
  714. ;Divide by number of sectors, quotient=track, remainder=sector
  715. ;
  716.     ex    de,hl        ;DE=TOTAL NUMBER OF SECTORS
  717.     ld    hl,(spt)    ;GET NUMBER OF SECTORS/TRACK
  718.     call    neg        ;HL = -SECTORS/TRACK
  719.     ex    de,hl
  720.     ld    bc,0        ;SET TRACK COUNTER TO ZERO
  721. ;
  722. divlp:
  723.     inc    bc        ;INCREMENT TRACK COUNT
  724.     add    hl,de        ;SUBTRACT SECTORS/TRACK FROM SECTORS TOTAL
  725.     jp    c,divlp
  726.     dec    bc        ;ADJUST TRACK COUNT
  727.     ex    de,hl
  728.     ld    hl,(spt)    ;ADD SECTORS/TRACK BACK IN TO ADJUST
  729.     add    hl,de        ;HL=NUMBER OF SECTORS ON LAST TRACK OF GROUP
  730.     push    hl
  731.     ld    hl,(systrk)    ;ADD IN NUMBER OF SYSTEM TRACKS
  732.     add    hl,bc
  733.     ex    de,hl        ;DE=TRACK NUMBER
  734.     pop    hl
  735.     inc    hl        ;HL=SECTOR NUMBER
  736.     ret
  737. ;
  738. ;COMMAND:  F
  739. ;Find Directory Entry for specified file
  740. ;
  741. posfil:
  742.     call    norite
  743.     ld    a,1
  744.     ld    (findfl),a    ;SO WE POSITION LATER
  745.     ld    de,fcb
  746.     xor    a        ;LOGGED IN DISK
  747.     ld    (de),a
  748.     inc    de
  749.     ld    b,8
  750.     call    mvname
  751.     ld    b,3
  752.     call    mvname
  753.     ld    a,'?'
  754.     ld    (de),a        ;LOOK IN ALL EXTENTS
  755.     ld    a,'D'        ;SET TYPE OF DUMP TO FULL
  756.     ld    (dumtyp),a
  757.     push    hl        ;SAVE PTR TO NEXT CHAR
  758.     ld    de,fcb
  759.     ld    c,srchf
  760.     call    bdos
  761.     inc    a
  762.     jp    nz,flok
  763.     ld    (dirpos),a    ;GRP 0 IF NOT FOUND
  764.     call    ilprt
  765.     db    '++ File Not Found ++',cr,lf,0
  766.     pop    hl        ;RESTORE PTR TO NEXT CHAR
  767.     jp    prompt
  768. ;
  769. flok:
  770.     dec    a
  771.     ld    (dirpos),a    ;SAVE POS. IN DIR
  772.     and    3
  773.     ld    l,a
  774.     ld    h,0
  775.     add    hl,hl        ;X32 BYTES/ENTRY
  776.     add    hl,hl
  777.     add    hl,hl
  778.     add    hl,hl
  779.     add    hl,hl
  780.     ld    de,tbuff
  781.     add    hl,de        ;HL POINTS TO ENTRY
  782.     ld    de,32
  783.     ex    de,hl
  784.     add    hl,de
  785.     ex    de,hl
  786.     call    dumphl        ;PRINT DIR ENTRY
  787.     ld    de,fcb        ;LOOK FOR NEXT EXTENT
  788.     ld    c,srchn
  789.     call    bdos
  790.     inc    a
  791.     jp    nz,flok
  792.     pop    hl        ;RESTORE PTR TO NEXT CHAR
  793.     jp    prompt
  794. ;
  795. mvname:
  796.     ld    a,(hl)        ;GET NEXT CHAR OF FILE NAME/TYPE
  797.     cp    '.'        ;END OF FILE NAME?
  798.     jp    z,mvipad    ;PAD OUT IF SO
  799.     cp    cr        ;END OF ENTRY?
  800.     jp    z,pad        ;PAD OUT IF SO
  801.     cp    eolch        ;END OF ENTRY?
  802.     jp    z,pad        ;PAD OUT IF SO
  803.     call    upcase        ;CAPITALIZE
  804.     ld    (de),a        ;STORE
  805.     inc    hl        ;PT TO NEXT
  806.     inc    de
  807.     djnz    mvname
  808.     ld    a,(hl)        ;CHECK FOR ERROR
  809.     cp    cr        ;OK IF EOL
  810.     ret    z
  811.     cp    eolch        ;OK IF LOGICAL EOL
  812.     ret    z
  813.     inc    hl
  814.     cp    '.'        ;OK IF DECIMAL
  815.     ret    z
  816.     jp    what
  817. ;
  818. mvipad:
  819.     inc    hl
  820. ;
  821. pad:
  822.     ld    a,' '        ;PRINT PADDING SPACES
  823.     ld    (de),a
  824.     inc    de
  825.     djnz    pad
  826.     ret
  827. ;
  828. ;COMMAND:  +
  829. ;Advance to Next Logical Sector
  830. ;
  831. plus:
  832.     ld    de,1        ;DFLT TO 1 SECT
  833.     ld    a,(hl)        ;GET NEXT CHAR
  834.     cp    cr        ;CR?
  835.     jp    z,plusgo    ;..YES, DFLT TO 1
  836.     cp    eolch
  837.     jp    z,plusgo
  838.     call    decin        ;GET #
  839.     ld    a,d
  840.     or    e
  841.     jp    nz,plusgo
  842.     ld    de,1        ;SET 1 IF VALUE OF ZERO
  843. ;
  844. plusgo:
  845.     call    nxtsec        ;ADVANCE TO NEXT LOGICAL SECTOR
  846.     dec    de        ;MORE TO GO?
  847.     ld    a,d
  848.     or    e
  849.     jp    nz,plusgo    ;..YES
  850. ;
  851. ;Ok, incremented to sector.  Setup and read
  852. ;
  853. plusmi:
  854.     push    hl
  855.     ld    hl,(cursec)
  856.     ex    de,hl
  857.     call    setsec        ;SET SECTOR
  858.     ld    hl,(curtrk)
  859.     ex    de,hl
  860.     call    settrk        ;SET TRACK
  861.     pop    hl
  862.     call    read        ;READ IT
  863.     jp    clcgrp        ;CALCULATE GROUP AND DISPLAY
  864. ;
  865. ;COMMAND:  -
  866. ;Back up to previous sector
  867. ;
  868. minus:
  869.     ld    de,1        ;SET DFLT
  870.     ld    a,(hl)        ;GET CHAR
  871.     cp    cr        ;CR?
  872.     jp    z,mingo        ;..YES, DFLT=1
  873.     cp    eolch
  874.     jp    z,mingo
  875.     call    decin        ;..NO, GET ##
  876.     ld    a,d
  877.     or    e
  878.     jp    nz,mingo
  879.     ld    de,1        ;ASSUME 1
  880. ;
  881. mingo:
  882.     call    lstsec        ;BACK UP ONE SECTOR
  883.     dec    de        ;COUNT DOWN ON NUMBER OF TIMES TO BACKUP
  884.     ld    a,d
  885.     or    e
  886.     jp    nz,mingo
  887.     jp    plusmi        ;READ BLOCK
  888. ;
  889. ;Go to last sector
  890. ; Wrap around to last sector of previous track or last sector of
  891. ; last track, as necessary
  892. ;
  893. lstsec:
  894.     push    hl
  895.     ld    hl,(cursec)    ;BACK UP SECTOR
  896.     dec    hl
  897.     ld    a,h
  898.     or    l
  899.     jp    nz,lsec1
  900.     ld    hl,(curtrk)    ;BEYOND SECTOR ZERO, SO BACK UP TRACK
  901.     ld    a,h
  902.     or    l
  903.     jp    nz,lsec0
  904.     ld    hl,(maxtrk)    ;WRAP TO END OF DISK
  905.     ld    (curtrk),hl
  906.     ld    hl,(maxsec)
  907.     jp    lsec1
  908. ;
  909. lsec0:
  910.     dec    hl
  911.     ld    (curtrk),hl
  912.     ld    hl,(spt)    ;GET NUMBER OF SECTORS/TRACK
  913. ;
  914. lsec1:
  915.     ld    (cursec),hl    ;SET NEW CURRENT SECTOR
  916.     pop    hl
  917.     ret
  918. ;
  919. ;Go to next sector
  920. ;  On exit, CURSEC = Current Sector and CURTRK = Current Track
  921. ;
  922. nxtsec:
  923.     push    hl
  924.     push    de
  925.     ld    hl,(cursec)    ;INCREMENT CURRENT SECTOR
  926.     inc    hl
  927.     ex    de,hl
  928.     ld    hl,(spt)    ;CHECK TO SEE IF BEYOND END OF TRACK
  929.     call    subde
  930.     ex    de,hl
  931.     jp    nc,nextok
  932.     ld    hl,(curtrk)    ;BEYOND END OF TRACK, SO INCR CURRENT TRACK
  933.     inc    hl
  934.     ex    de,hl
  935.     ld    hl,(maxtrk)    ;SEE IF BEYOND END OF DISK
  936.     call    subde
  937.     jp    nc,trask
  938.     ld    de,0        ;WRAP TO START OF DISK
  939. ;
  940. trask:
  941.     ex    de,hl
  942.     ld    (curtrk),hl    ;SET NEW CURRENT TRACK
  943.     ld    hl,1        ;SET SECTOR 1
  944. ;
  945. nextok:
  946.     ld    (cursec),hl    ;SET NEW CURRENT SECTOR
  947.     pop    de
  948.     pop    hl
  949.     ret
  950. ;
  951. ;Tell what group, displacement, track, sector, physical sector
  952. ;
  953. inq:
  954.     call    inqsub
  955.     jp    prompt
  956. ;
  957. ;Position inquiry subroutine
  958. ;Executed via: G S or T (with no operands)
  959. ;
  960. inqsub:
  961.     push    hl
  962.     ld    hl,(systrk)    ;CHECK IF IN SYSTEM TRACKS
  963.     ex    de,hl
  964.     ld    hl,(curtrk)
  965.     call    subde
  966.     jp    c,nogrp
  967.     call    ilprt        ;PRINT GROUP NUMBER IF NOT IN SYSTEM TRACKS
  968.     db    dim,'Group = ',bright,0
  969.     ld    hl,(group)
  970.     ld    b,h
  971.     ld    c,l
  972.     call    hexb        ;PRINT GROUP NUMBER IN BC
  973.     ld    a,':'
  974.     call    type
  975.     ld    a,(grpdis)
  976.     call    hex        ;PRINT GROUP DISPLACEMENT IN A
  977.     ld    a,','
  978.     call    type
  979. ;
  980. nogrp:
  981.     call    ilprt        ;PRINT TRACK NUMBER
  982.     db    dim,' Track = ',bright,0
  983.     ld    hl,(curtrk)
  984.     call    dec        ;TRACK NUMBER IN DECIMAL
  985.     call    ilprt        ;PRINT SECTOR NUMBER
  986.     db    dim,', Sector = ',bright,0
  987.     ld    hl,(cursec)
  988.     call    dec        ;SECTOR NUMBER IN DECIMAL
  989.     call    ilprt        ;PRINT PHYSCIAL SECTOR NUMBER
  990.     db    dim,', Physical Sector = ',bright,0
  991.     ld    hl,(physec)
  992.     call    dec        ;PHYSICAL SECTOR NUMBER IN DECIMAL
  993.     call    ilprt
  994.     db    '              ',cr,lf,0    ; remove prev. output
  995.                         ; ..in editor <crw>
  996. ;    call    crlf
  997.     pop    hl
  998.     ret
  999. ;
  1000. ;COMMAND:  C
  1001. ;Change Contents of Current Block
  1002. ;
  1003. chg:
  1004.     ld    a,(hl)        ;GET TYPE (HEX, ASCII)
  1005.     call    upcase
  1006.     push    af        ;SAVE "H" OR "A"
  1007.     inc    hl
  1008.     call    hexin        ;GET DISP IN HEX
  1009.     call    disp1        ;VALIDATE DISP TO DE
  1010.     inc    hl
  1011.     ld    bc,0        ;SHOW NO 'THRU' ADDR
  1012.     cp    '-'        ;TEST DELIM FR. DISP
  1013.     jp    nz,chgnth    ;NO THRU
  1014.     push    de        ;SAVE FROM
  1015.     call    hexin
  1016.     call    disp1        ;GET THRU
  1017.     inc    hl        ;SKIP END DELIM
  1018.     ld    b,d
  1019.     ld    c,e        ;BC = THRU
  1020.     pop    de        ;GET FROM
  1021.     jp    chgah
  1022. ;
  1023. chgnth:
  1024.     cp    sepch
  1025.     jp    nz,what
  1026. ;
  1027. chgah:
  1028.     pop    af
  1029.     cp    'H'        ;HEX?
  1030.     jp    z,chghex
  1031.     cp    'A'        ;ASCII?
  1032.     jp    nz,what
  1033. ;
  1034. ;Change ASCII
  1035. ;
  1036. chgalp:
  1037.     ld    a,(hl)        ;GET CHAR
  1038.     cp    cr
  1039.     jp    z,prompt
  1040.     cp    eolch
  1041.     jp    z,prompt
  1042. ;
  1043. ;The following print of the deleted byte is commented out; if leading
  1044. ;  semicolons are removed, deleted bytes will be printed
  1045. ;
  1046. ;    LDAX    D    ;GET BYTE THAT IS REPLACED
  1047. ;    CPI    ' '
  1048. ;    JC    CHGAHX
  1049. ;    CPI    7EH    ;DON'T PRINT ESC CHAR FOR H1500
  1050. ;    JNC    CHGAHX
  1051. ;    JMP    CHGA2
  1052. ;
  1053. ;CHGAHX:
  1054. ;    CALL    BHEX
  1055. ;    JMP    CHGA3
  1056. ;
  1057. ;CHGA2:
  1058. ;    CALL    TYPE
  1059. ;
  1060. ;End of print of delete bytes
  1061. ;
  1062. chga3:
  1063.     ld    (back),hl    ;IN CASE "THRU"
  1064.     call    getval        ;GET ASCII OR <HEX> VALUE
  1065.     ld    (de),a        ;UPDATE BYTE
  1066.     inc    hl        ;PT TO NEXT INPUT CHAR
  1067. ;
  1068. ;See if 'THRU' requested
  1069. ;
  1070.     ld    a,c
  1071.     or    a
  1072.     jp    z,chanth
  1073.     cp    e        ;DONE?..
  1074.     jp    z,prompt    ;..YES
  1075.     ld    hl,(back)
  1076. ;
  1077. chanth:
  1078.     inc    e
  1079.     jp    nz,chgalp
  1080.     ld    a,(hl)
  1081.     cp    cr
  1082.     jp    z,prompt
  1083.     cp    eolch
  1084.     jp    z,prompt
  1085.     jp    what
  1086. ;
  1087. ;Change hex
  1088. ;
  1089. chghcm:
  1090.     inc    hl
  1091. ;
  1092. chghex:
  1093.     ld    a,(hl)        ;GET HEX DIGIT
  1094.     cp    cr
  1095.     jp    z,prompt
  1096.     cp    eolch
  1097.     jp    z,prompt
  1098.     cp    sepch        ;DELIM?
  1099.     jp    z,chghcm
  1100.     push    de
  1101.     ld    (hexad),hl    ;IN CASE 'THRU'
  1102.     call    hexin        ;POSITIONS TO DELIM
  1103.     ld    a,e        ;GET VALUE
  1104.     pop    de        ;..ADDR
  1105. ;
  1106. ;The following comments out the echo of the deleted byte; removing the
  1107. ;  leading semicolons restores the echo
  1108. ;
  1109. ;    PUSH    PSW    ;SAVE VALUE
  1110. ;    LDAX    D    ;GET OLD
  1111. ;    CALL    HEX    ;ECHO IN HEX
  1112. ;    POP    PSW    ;GET NEW
  1113. ;
  1114. ;End of echo of bytes
  1115. ;
  1116.     ld    (de),a        ;SAVE NEW BYTE
  1117.     ld    a,c        ;SEE IF 'THRU'
  1118.     or    a
  1119.     jp    z,chhnth    ;..NO.
  1120.     cp    e        ;..YES, DONE?
  1121.     jp    z,prompt
  1122.     ld    hl,(hexad)    ;..NO: MORE
  1123. ;
  1124. chhnth:
  1125.     inc    e
  1126.     jp    nz,chghex
  1127.     ld    a,(hl)
  1128.     cp    cr
  1129.     jp    z,prompt
  1130.     cp    eolch
  1131.     jp    z,prompt
  1132.     jp    what
  1133. ;
  1134. ;COMMAND:  R
  1135. ;Read Current Block into TBUFF
  1136. ;COMMAND:  RG
  1137. ;Read Specified Group into GBUFF
  1138. ;
  1139. doread:
  1140.     ld    a,(notpos)    ;POSITIONED?
  1141.     or    a
  1142.     jp    nz,cantrd
  1143.     call    read        ;READ BLOCK
  1144.     jp    prompt
  1145. ;
  1146. cantrd:
  1147.     call    ilprt
  1148.     db    '++ Can''t read - not positioned ++',cr,lf
  1149.     db    'Position by:',cr,lf
  1150.     db    tab,'Track then Sector, or',cr,lf
  1151.     db    tab,'Group',cr,lf,0
  1152.     jp    prompt
  1153. ;
  1154. ;COMMAND:  W
  1155. ;Write Current Block to Disk
  1156. ;COMMAND:  WG
  1157. ;Write Specified Group from GBUFF
  1158. ;
  1159. dorite:
  1160.     call    write        ;DO WRITE
  1161.     jp    prompt
  1162. ;
  1163. ;Print Byte in A as Hex Digits
  1164. ;
  1165. bhex:
  1166.     push    af
  1167.     ld    a,'<'
  1168.     call    type
  1169.     pop    af
  1170.     call    hex
  1171.     ld    a,'>'
  1172.     call    type
  1173.     ret
  1174. ;
  1175. ;Print Number in BC as Hex Digits
  1176. ;  HEXB does not print MS Byte if DSM shows small disk size
  1177. ;  HEXB1 prints BC regardless
  1178. ;
  1179. hexb:
  1180.     ld    a,(dsm+1)
  1181.     or    a
  1182.     jp    z,hexx
  1183. hexb1:
  1184.     ld    a,b
  1185.     call    hex
  1186. ;
  1187. hexx:
  1188.     ld    a,c
  1189. ;
  1190. ;Print Byte in A as 2 Hex Digits
  1191. ;
  1192. hex:
  1193.     push    af
  1194.     rra            ;GET HIGH NYBBLE
  1195.     rra
  1196.     rra
  1197.     rra
  1198.     call    nibbl        ;PRINT IT
  1199.     pop    af        ;GET LOW NYBBLE
  1200. ;
  1201. nibbl:
  1202.     and    0fh        ;MASK LOW NYBBLE
  1203.     cp    10        ;0-9?
  1204.     jp    c,hexnu
  1205.     add    a,7        ;CONVERT TO A-F
  1206. ;
  1207. hexnu:
  1208.     add    a,'0'        ;CONVERT TO ASCII
  1209.     jp    type        ;PRINT IT
  1210. ;
  1211. ;Decimal output routine
  1212. ;  Print Number in HL as decimal digits
  1213. ;
  1214. dec:
  1215.     push    bc
  1216.     push    de
  1217.     push    hl
  1218.     xor    a        ;SET NO LEADING DIGIT
  1219.     ld    (ddig),a
  1220.     ld    bc,10000
  1221.     call    dprt
  1222.     add    hl,bc
  1223.     ld    bc,1000
  1224.     call    dprt
  1225.     add    hl,bc
  1226.     ld    bc,100
  1227.     call    dprt
  1228.     add    hl,bc
  1229.     ld    bc,10
  1230.     call    dprt
  1231.     add    hl,bc
  1232.     ld    a,l        ;ALWAYS PRINT LSD
  1233.     add    a,'0'        ;ASCII
  1234.     call    type
  1235.     pop    hl
  1236.     pop    de
  1237.     pop    bc
  1238.     ret
  1239. dprt:
  1240.     push    bc        ;SAVE BC
  1241.     ld    d,0ffh        ;SET -1
  1242. dprtl:
  1243.     inc    d        ;ADD 1 TO OUTPUT DIGIT
  1244.     ld    a,l        ;L-C
  1245.     sub    c
  1246.     ld    l,a
  1247.     ld    a,h        ;H-B
  1248.     sbc    a,b
  1249.     ld    h,a
  1250.     jp    nc,dprtl
  1251.     pop    bc        ;RESTORE BC
  1252.     ld    a,(ddig)    ;GET LEADING DIGIT FLAG
  1253.     or    d        ;CHECK FOR ZERO STILL
  1254.     ld    (ddig),a    ;SET FLAG
  1255.     ld    a,d        ;GET DIGIT TO PRINT
  1256.     ret    z        ;ABORT IF BOTH ZERO
  1257.     add    a,'0'        ;ASCII
  1258.     jp    type
  1259. ddig:    ds    1        ;TEMP FOR DEC USE ONLY
  1260. ;
  1261. ;Print <SP>
  1262. ;
  1263. space:
  1264.     ld    a,' '
  1265.     jp    type
  1266. ;
  1267. ;Print a dim '|'
  1268. ;
  1269. aster:
  1270.     call    stndout        ;DIM
  1271.     ld    a,'|'
  1272.     call    type
  1273.     jp    stndend        ;BRIGHT
  1274. ;
  1275. ;Inline print routine
  1276. ;  Print Chars ending in 0 pted to by Return Address; return to byte after
  1277. ;
  1278. ilprt:
  1279.     ex    (sp),hl        ;PT TO STRING
  1280. ilplp:
  1281.     call    ctlcs        ;ABORT?
  1282.     jp    z,prmptr
  1283.     ld    a,(hl)        ;GET CHAR
  1284. ;    CPI    1    ;PAUSE? -- ^A
  1285. ;    JNZ    ILPOK
  1286. ;    CALL    CONIN    ;WAIT FOR ANY CHAR
  1287. ;    CPI    3    ;ABORT?
  1288. ;    JZ    PRMPTR
  1289. ;    JMP    ILPNX
  1290. ;
  1291. ;ILPOK:
  1292.     cp    dim        ;GOTO DIM?
  1293.     jp    z,ilpdim
  1294.     cp    bright        ;GOTO BRIGHT?
  1295.     jp    z,ilpbri
  1296.     call    type        ;PRINT CHAR
  1297.     jp    ilpnx
  1298. ilpdim:
  1299.     call    stndout        ;ENTER STANDOUT MODE
  1300.     jp    ilpnx
  1301. ilpbri:
  1302.     call    stndend        ;EXIT STANDOUT MODE
  1303. ;
  1304. ilpnx:
  1305.     inc    hl        ;PT TO NEXT
  1306.     ld    a,(hl)        ;GET IT
  1307.     or    a        ;DONE?
  1308.     jp    nz,ilplp
  1309.     inc    hl        ;PT TO BYTE AFTER ENDING 0
  1310.     ex    (sp),hl        ;RESTORE HL AND RET ADR
  1311.     ret
  1312. ;
  1313. ;DISP calls DECIN, and validates a sector
  1314. ;displacement, then converts it to an address
  1315. ;
  1316. disp:
  1317.     call    decin
  1318. disp1:
  1319.     push    af        ;SAVE DELIMITER
  1320.     ld    a,d
  1321.     or    a
  1322.     jp    nz,badisp
  1323.     ld    a,e
  1324.     or    a
  1325.     jp    m,badisp
  1326.     add    a,80h        ;TO POINT TO BUFFER AT BASE+80H
  1327.     ld    e,a
  1328.     ld    d,base/256
  1329.     pop    af        ;GET DELIM
  1330.     ret
  1331. ;
  1332. badisp:
  1333.     call    ilprt
  1334.     db    '++ Bad Displacement (Not 0-7FH) ++'
  1335.     db    cr,lf,0
  1336.     jp    prmptr
  1337. ;
  1338. ;Input Number from Command Line -- Assume it to be Hex
  1339. ;  Number returned in DE
  1340. ;
  1341. hexin:
  1342.     ld    de,0        ;INIT VALUE
  1343.     ld    a,(hl)
  1344.     cp    '#'        ;DECIMAL?
  1345.     jp    z,hdin        ;MAKE DECIMAL
  1346. ;
  1347. hinlp:
  1348.     ld    a,(hl)        ;GET CHAR
  1349.     call    upcase        ;CAPITALIZE
  1350.     cp    cr        ;EOL?
  1351.     ret    z
  1352.     cp    eolch        ;EOL?
  1353.     ret    z
  1354.     cp    sepch
  1355.     ret    z
  1356.     cp    ' '        ;SPACE?
  1357.     ret    z
  1358.     cp    '-'        ;'THRU'?
  1359.     ret    z
  1360.     cp    '>'
  1361.     ret    z
  1362.     inc    hl        ;PT TO NEXT CHAR
  1363.     cp    '0'        ;RANGE?
  1364.     jp    c,what
  1365.     cp    '9'+1        ;RANGE?
  1366.     jp    c,hinnum
  1367.     cp    'A'        ;RANGE?
  1368.     jp    c,what
  1369.     cp    'F'+1        ;RANGE?
  1370.     jp    nc,what
  1371.     sub    7        ;ADJUST FROM A-F TO 10-15
  1372. ;
  1373. hinnum:
  1374.     sub    '0'        ;CONVERT FROM ASCII TO BINARY
  1375.     ex    de,hl
  1376.     add    hl,hl        ;MULT PREVIOUS VALUE BY 16
  1377.     add    hl,hl
  1378.     add    hl,hl
  1379.     add    hl,hl
  1380.     add    a,l        ;ADD IN NEW DIGIT
  1381.     ld    l,a
  1382.     ex    de,hl
  1383.     jp    hinlp
  1384. ;
  1385. hdin:
  1386.     inc    hl        ;SKIP '#'
  1387. ;
  1388. ;Input Number in Command Line as Decimal
  1389. ;  Number is returned in DE
  1390. ;
  1391. decin:
  1392.     ld    de,0
  1393.     ld    a,(hl)        ; GET 1ST CHAR
  1394.     cp    '#'        ; HEX?
  1395.     jp    nz,dinlp
  1396.     inc    hl        ; PT TO DIGIT
  1397.     jp    hinlp        ; DO HEX PROCESSING
  1398. ;
  1399. dinlp:
  1400.     ld    a,(hl)        ;GET DIGIT
  1401.     call    upcase        ;CAPITALIZE
  1402.     cp    '0'        ;RANGE?
  1403.     ret    c
  1404.     cp    '9'+1        ;RANGE?
  1405.     ret    nc
  1406.     sub    '0'        ;CONVERT TO BINARY
  1407.     inc    hl        ;PT TO NEXT
  1408.     push    hl
  1409.     ld    h,d
  1410.     ld    l,e
  1411.     add    hl,hl        ;X2
  1412.     add    hl,hl        ;X4
  1413.     add    hl,de        ;X5
  1414.     add    hl,hl        ;X10
  1415.     add    a,l        ;ADD IN DIGIT
  1416.     ld    l,a
  1417.     ld    a,h
  1418.     adc    a,0
  1419.     ld    h,a
  1420.     ex    de,hl        ;RESULT IN DE
  1421.     pop    hl
  1422.     jp    dinlp
  1423. ;
  1424. ;Read in a console buffer
  1425. ;
  1426. rdbuf:
  1427.     call    ilprt        ;PRINT PROMPT
  1428.     db    cr,lf,'DU3  ',0
  1429.     ld    a,(drive)    ;GET DRIVE NUMBER
  1430.     add    a,'A'        ;CONVERT TO ASCII
  1431.     call    type
  1432.     ld    a,(unum)    ;DISPLAY USER NUMBER
  1433.     ld    l,a        ;VALUE IN HL
  1434.     ld    h,0
  1435.     call    dec        ;PRINT IN DECIMAL
  1436.     call    ilprt        ;PRINT PROMPT
  1437.     db    '? ',0
  1438. ;
  1439. ;ENTRY POINT TO READ BUFFER WITHOUT PROMPT
  1440. ;
  1441. rdbuf1:
  1442.     ld    hl,(inbuf)    ;USE CP/M READLN
  1443.     dec    hl
  1444.     dec    hl
  1445.     ex    de,hl
  1446.     ld    c,10
  1447.     push    de
  1448.     call    bdos
  1449.     pop    de
  1450.     inc    de        ;PT TO CHAR COUNT
  1451.     ld    a,(de)        ;GET CHAR COUNT
  1452.     ld    b,a        ;CHAR COUNT IN B
  1453.     inc    de        ;PT TO INPUT LINE
  1454.     ex    de,hl        ;... IN HL
  1455.     add    a,l        ;ADD CHAR COUNT TO HL
  1456.     ld    l,a
  1457.     ld    a,h
  1458.     adc    a,0
  1459.     ld    h,a
  1460.     ld    a,cr        ;STORE ENDING CR
  1461.     ld    (hl),a        ;SET CR
  1462.     call    type        ;ECHO IT
  1463.     ld    a,lf        ;ECHO..
  1464.     call    type        ;..LF
  1465.     ld    hl,(inbuf)    ;SET PTR TO FIRST CHAR IN LINE
  1466.     ret
  1467. ;
  1468. ;Set paging flag for page routine
  1469. ;
  1470. pagset:
  1471.     ld    a,(pagsiz)    ;GET SIZE OF PAGE
  1472.     ld    (pagflg),a    ;SET FLAG
  1473.     ret
  1474. ;
  1475. ;Page output
  1476. ;
  1477. pager:
  1478.     ld    a,(pagflg)    ;GET FLAG
  1479.     cp    2        ;2 LINES LEFT?
  1480.     jp    z,wait        ;SAME AS USER DELAY
  1481.     dec    a        ;COUNT DOWN
  1482.     ld    (pagflg),a
  1483.     jp    crlf
  1484. ;
  1485. ;Delay Routine
  1486. ;
  1487. swait:
  1488.     call    at
  1489.     db    23,5        ;POSITION CURSOR
  1490.     jp    wait0
  1491. wait:
  1492.     call    crlf        ;NEW LINE
  1493. wait0:
  1494.     push    hl
  1495.     call    ilprt
  1496.     db    dim,'Type Any Character to Continue or ^C to Abort - ',bright,0
  1497.     pop    hl
  1498.     call    conin        ;GET RESPONSE
  1499.     cp    'C'-40h        ;^C?
  1500.     jp    z,wait1
  1501.     call    crlf        ;NEW LINE
  1502.     call    pagset        ;RESET PAGE COUNT
  1503.     ret
  1504. wait1:
  1505.     ld    a,(ihflg)    ;INITIAL HELP?
  1506.     or    a        ;0=NO
  1507.     jp    z,prmptr    ;ABORT TO COMMAND PROMPT
  1508.     jp    exit1        ;ABORT TO CP/M
  1509. ;
  1510. ;CRLF Routine
  1511. ;
  1512. crlf:
  1513.     ld    a,cr
  1514.     call    type
  1515.     ld    a,lf
  1516.     jp    type
  1517. ;
  1518. ;Convert to Upper Case
  1519. ;
  1520. upcase:
  1521.     and    7fh        ;MASK OUT MSB
  1522.     cp    60h        ;LESS THAN SMALL A?
  1523.     ret    c        ;RETURN IF SO
  1524.     and    5fh        ;MAKE UPPER CASE
  1525.     ret
  1526. ;
  1527. ;CON: Status Routine
  1528. ;
  1529. const:
  1530.     push    bc
  1531.     push    de
  1532.     push    hl
  1533. vconst:
  1534.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1535.     pop    hl
  1536.     pop    de
  1537.     pop    bc
  1538.     ret
  1539. ;
  1540. ;CON: Input Routine
  1541. ;
  1542. conin:
  1543.     push    bc
  1544.     push    de
  1545.     push    hl
  1546. vconin:
  1547.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1548.     pop    hl
  1549.     pop    de
  1550.     pop    bc
  1551.     ret
  1552. ;
  1553. ;Console out with TAB expansion
  1554. ;  Char in A
  1555. ;
  1556. type:
  1557.     push    bc        ;SAVE REGS
  1558.     push    de
  1559.     push    hl
  1560.     ld    c,a        ;FOR OUTPUT ROUTINE
  1561.     cp    tab
  1562.     jp    nz,type2
  1563. ;Tabulate
  1564. typtab:
  1565.     ld    a,' '        ;PRINT SPACE
  1566.     call    type
  1567.     ld    a,(tabcol)    ;GET COL COUNT
  1568.     and    7        ;DONE?
  1569.     jp    nz,typtab
  1570.     jp    typret
  1571. ;
  1572. ;Filter out control characters to
  1573. ;prevent garbage during view of file
  1574. ;
  1575. type2:
  1576.     cp    ' '
  1577.     jp    nc,typeq
  1578.     cp    cr
  1579.     jp    z,typeq
  1580.     cp    lf
  1581.     jp    nz,typncr
  1582. ;
  1583. typeq:
  1584. ;
  1585. ;CON: Output Routine
  1586. ;
  1587. vconot:    call    $-$        ;ADDR FILLED IN BY 'INIT'
  1588. ;
  1589. ;Update column used in tab expansion
  1590. ;
  1591.     ld    a,c        ;GET CHAR
  1592.     cp    cr
  1593.     jp    nz,typncr
  1594.     ld    a,0        ;RESET TAB COLUMN IF <CR>
  1595.     ld    (tabcol),a
  1596.     jp    typlst
  1597. ;
  1598. typncr:
  1599.     cp    ' '        ;CTL CHAR?
  1600.     jp    c,typlst    ;..NO CHANGE IN COL
  1601.     ld    a,(tabcol)    ;INCR TAB COUNT
  1602.     inc    a
  1603.     ld    (tabcol),a
  1604. ;
  1605. typlst:
  1606.     ld    a,(pflag)    ;CHECK FOR PRINTER OUTPUT
  1607.     and    1
  1608.     call    nz,list        ;FROM C REG
  1609. ;
  1610. typret:
  1611.     pop    hl        ;RESTORE REGS
  1612.     pop    de
  1613.     pop    bc
  1614.     ret
  1615. ;
  1616. ;LST: Output Routine
  1617. ;  Char in C
  1618. ;
  1619. list:
  1620.     push    bc        ;SAVED REGS
  1621.     push    de
  1622.     push    hl
  1623. vlist:
  1624.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1625.     pop    hl
  1626.     pop    de
  1627.     pop    bc
  1628.     ret
  1629. ;
  1630. ;Home Disk Routine
  1631. ;
  1632. home:
  1633.     push    hl
  1634. vhome:
  1635.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1636.     pop    hl
  1637.     ret
  1638. ;
  1639. ;Set track # in DE
  1640. ;
  1641. settrk:
  1642.     push    hl
  1643.     ld    hl,(maxtrk)    ;CHECK FOR WITHIN BOUNDS
  1644.     call    subde        ;IF TRACK # IN DE > MAX, THEN ERROR
  1645.     pop    hl
  1646.     jp    c,outlim
  1647.     ex    de,hl        ;RESET CURRENT TRACK
  1648.     ld    (curtrk),hl
  1649.     ex    de,hl
  1650.     ld    b,d        ;BC=TRACK NUMBER
  1651.     ld    c,e
  1652.     push    hl
  1653. ;
  1654. vsetrk:
  1655.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1656.     pop    hl
  1657.     ret
  1658. ;
  1659. ;Set Sector Number in DE
  1660. ;
  1661. setsec:
  1662.     push    hl
  1663.     push    de
  1664.     ld    hl,(systrk)    ;GET NUMBER OF SYSTEM TRACKS
  1665.     ex    de,hl
  1666.     ld    (cursec),hl    ;SET CURRENT SECTOR
  1667.     ld    hl,(curtrk)    ;GET CURRENT TRACK
  1668.     call    subde        ;SEE IF WE ARE IN THE SYSTEM TRACKS
  1669.     pop    bc        ;BC=SECTOR NUMBER
  1670.     ld    h,b        ;HL=SECTOR NUMBER
  1671.     ld    l,c
  1672.     jp    nc,notsys    ;IF NO CARRY FOR SUBDE, WE ARE NOT IN SYSTEM TRACKS
  1673.     ld    a,(first0)    ;SEE IF FIRST SEC 0
  1674.     or    a
  1675.     jp    nz,gstsec    ;NO, JUMP AWAY
  1676.     dec    hl        ;YES, SO DECREMENT
  1677.     jp    gstsec        ;REQUESTED, THEN GO
  1678. ;
  1679. ;Not in System Tracks, so Skew Factor is effective
  1680. ;
  1681. notsys:
  1682.     ld    hl,(sectbl)    ;GET PTR TO SECTOR TABLE
  1683.     ex    de,hl        ;... IN DE
  1684.     dec    bc        ;DECREMENT SECTOR NUMBER BY 1
  1685. ;
  1686. vsctrn:
  1687.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1688.     ld    a,(spt+1)    ;IF SPT<256 (HI-ORD = 0)
  1689.     or    a        ; THEN FORCE 8-BIT TRANSLATION
  1690.     jp    nz,gstsec    ; ELSE KEEP ALL 16 BITS
  1691.     ld    h,a
  1692. gstsec:
  1693.     ld    (physec),hl
  1694.     ld    b,h
  1695.     ld    c,l
  1696. ;
  1697. vstsec:
  1698.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1699.     pop    hl        ;RESTORE PTR TO NEXT CHAR
  1700.     ret
  1701. ;
  1702. ;Out of Disk Track Limit
  1703. ;
  1704. outlim:
  1705.     call    ilprt
  1706.     db    '++ Not Within Tracks 0-',0
  1707.     push    hl
  1708.     ld    hl,(maxtrk)    ;PRINT MAX TRACK NUMBER
  1709.     call    dec
  1710.     pop    hl
  1711.     call    ilprt
  1712.     db    ' ++',cr,lf,0
  1713.     call    norite        ;NOT POSITIONED
  1714.     jp    prmptr
  1715. ;
  1716. ;Set DMA Address
  1717. ;
  1718. setdma:
  1719.     jp    $-$        ;ADDR FILLED IN BY 'INIT'
  1720. ;
  1721. ;Read Next Block into DMA Address
  1722. ;
  1723. read:
  1724.     ld    a,1        ;SET FLAG
  1725.     ld    (wrflg),a
  1726.     push    hl        ;SAVE PTR TO NEXT CHAR
  1727. ;
  1728. vread:
  1729.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1730.     or    a        ;ERROR?
  1731.     jp    z,readok
  1732.     call    ilprt
  1733.     db    '++ READ Failed, Sector may be Invalid ++'
  1734.     db    cr,lf,0
  1735. ;
  1736. readok:
  1737.     pop    hl        ;GET PTR TO NEXT CHAR
  1738.     ret
  1739. ;
  1740. ;Write Block in DMA Address to Disk
  1741. ;
  1742. write:
  1743.     ld    a,(wrflg)    ;READ ALREADY PERFORMED?
  1744.     or    a        ;ERROR IF NOT
  1745.     jp    nz,pwrite
  1746. ;
  1747. badw:
  1748.     call    ilprt
  1749.     db    '++ Cannot Write Unless Read Issued ++'
  1750.     db    cr,lf,0
  1751.     jp    expl
  1752. ;
  1753. ;Do Write
  1754. ;
  1755. pwrite:
  1756.     push    hl        ;SAVE PTR TO NEXT CHAR
  1757.     ld    c,1        ;FORCE WRITE TYPE 1 IN CASE 2.x DEBLOCK USED
  1758. ;
  1759. vwrite:
  1760.     call    $-$        ;ADDR FILLED IN BY 'INIT'
  1761.     or    a        ;ERROR?
  1762.     jp    z,writok
  1763.     call    ilprt
  1764.     db    '++ WRITE Failed ++',cr,lf,0
  1765. ;
  1766. writok:
  1767.     pop    hl
  1768.     ret
  1769. ;    RET
  1770. ;
  1771. ;COMMAND:  X
  1772. ;Exit to CP/M
  1773. ;
  1774. exit:
  1775.     call    dinit        ;deinit terminal
  1776.     jp    base        ;WARM BOOT
  1777. ;
  1778. ;Quick Exit to CP/M
  1779. ;
  1780. exit1:
  1781.     ld    hl,(dutstk)    ;GET CP/M STACK PTR
  1782.     ld    sp,hl        ;SET SP
  1783.     ret
  1784.  
  1785. ;
  1786. ;********************************
  1787. ;*                *
  1788. ;*    Utility Subroutines    *
  1789. ;*                *
  1790. ;********************************
  1791. ;
  1792. grpcmp:
  1793.     ld    a,c
  1794.     inc    d
  1795.     dec    d
  1796.     jp    z,cmp8
  1797.     cp    (hl)
  1798.     inc    hl
  1799.     ret    nz
  1800.     ld    a,b
  1801. ;
  1802. cmp8:
  1803.     cp    (hl)
  1804.     ret
  1805. ;
  1806. ;2's complement HL ==> HL
  1807. ;
  1808. neg:
  1809.     ld    a,l
  1810.     cpl
  1811.     ld    l,a
  1812.     ld    a,h
  1813.     cpl
  1814.     ld    h,a
  1815.     inc    hl
  1816.     ret
  1817. ;
  1818. ;HL/2 ==> HL
  1819. ;
  1820. rotrhl:
  1821.     or    a
  1822.     ld    a,h
  1823.     rra
  1824.     ld    h,a
  1825.     ld    a,l
  1826.     rra
  1827.     ld    l,a
  1828.     ret
  1829. ;
  1830. ;Collect the number of '1' bits
  1831. ;in A as a count in C
  1832. ;
  1833. colect:
  1834.     ld    b,8        ;NUMBER OF BITS
  1835. ;
  1836. colop:
  1837.     rla
  1838.     jp    nc,coskip
  1839.     inc    c
  1840. ;
  1841. coskip:
  1842.     dec    b
  1843.     jp    nz,colop
  1844.     ret
  1845. ;
  1846. ;HL-DE ==> HL
  1847. ;  Carry Flag is Significant
  1848. ;
  1849. subde:
  1850.     ld    a,l
  1851.     sub    e
  1852.     ld    l,a
  1853.     ld    a,h
  1854.     sbc    a,d
  1855.     ld    h,a
  1856.     ret
  1857. ;
  1858. ;Quick Kludge multiply
  1859. ;HL*DE ==> HL
  1860. ;
  1861. mult:
  1862.     push    bc
  1863.     push    de
  1864.     ex    de,hl
  1865.     ld    b,d
  1866.     ld    c,e
  1867.     ld    a,b
  1868.     or    c
  1869.     jp    nz,mulcon
  1870.     ld    hl,0        ;FILTER SPECIAL CASE
  1871.     jp    mldone        ;  OF MULTIPLY BY 0
  1872. ;
  1873. mulcon:
  1874.     dec    bc
  1875.     ld    d,h
  1876.     ld    e,l
  1877. ;
  1878. multlp:
  1879.     ld    a,b
  1880.     or    c
  1881.     jp    z,mldone
  1882.     add    hl,de
  1883.     dec    bc
  1884.     jp    multlp
  1885. ;
  1886. mldone:
  1887.     pop    de
  1888.     pop    bc
  1889.     ret
  1890. ;
  1891. ;Routine to fill in disk params
  1892. ;with every drive change
  1893. ;
  1894. logit:
  1895.     ld    de,dpb        ;   THEN MOVE TO LOCAL
  1896.     ld    b,dpblen    ;  WORKSPACE
  1897.     call    move
  1898.     ld    hl,grpdis
  1899.     ld    a,(hl)
  1900.     push    af
  1901.     ld    a,(blm)
  1902.     ld    (hl),a
  1903.     push    hl
  1904.     ld    hl,(dsm)
  1905.     ex    de,hl
  1906.     call    gtksec
  1907.     ld    (maxsec),hl
  1908.     ex    de,hl
  1909.     ld    (maxtrk),hl
  1910.     pop    hl
  1911.     pop    af
  1912.     ld    (hl),a
  1913.     ret
  1914.  
  1915. ;***********************************
  1916. ;
  1917. ;  DU3 Command Table
  1918. ;
  1919. ;***********************************
  1920. cmdtbl:
  1921.     db    ' '        ;null command
  1922.     dw    prompt
  1923. ;
  1924.     db    ':'
  1925.     dw    mac
  1926. ;
  1927.     db    '@'
  1928.     dw    pcmd
  1929. ;
  1930.     db    '+'
  1931.     dw     plus
  1932. ;
  1933.     db    '-'
  1934.     dw    minus
  1935. ;
  1936.     db    '='
  1937.     dw    search
  1938. ;
  1939.     db    '<'
  1940.     dw    save
  1941. ;
  1942.     db    '>'
  1943.     dw    restor
  1944. ;
  1945.     db    '#'
  1946.     dw    stats
  1947. ;
  1948.     db    '?'
  1949.     dw    help
  1950. ;
  1951.     db    mulch
  1952.     dw    repeat
  1953. ;
  1954.     db    '!'
  1955.     dw    uwait
  1956. ;
  1957.     db    'A'
  1958.     dw    dump
  1959. ;
  1960.     db    'C'
  1961.     dw    chg
  1962. ;
  1963.     db    'D'
  1964.     dw    dump
  1965. ;
  1966.     db    'E'
  1967.     dw    edit
  1968. ;
  1969.     db    'F'
  1970.     dw    posfil
  1971. ;
  1972.     db    'G'
  1973.     dw    pos
  1974. ;
  1975.     db    'H'
  1976.     dw    dump
  1977. ;
  1978.     db    'L'
  1979.     dw    login
  1980. ;
  1981.     db    'M'
  1982.     dw    map
  1983. ;
  1984.     db    'N'
  1985.     dw    newdsk
  1986. ;
  1987.     db    'P'
  1988.     dw    prntff
  1989. ;
  1990.     db    'Q'
  1991.     dw    queuer
  1992. ;
  1993.     db    'R'
  1994.     dw    doread
  1995. ;
  1996.     db    'S'
  1997.     dw    pos
  1998. ;
  1999.     db    'T'
  2000.     dw    pos
  2001. ;
  2002.     db    'U'
  2003.     dw    user
  2004. ;
  2005.     db    'V'
  2006.     dw    view
  2007. ;
  2008.     db    'W'
  2009.     dw    dorite
  2010. ;
  2011.     db    'X'
  2012.     dw    exit
  2013. ;
  2014.     db    'Z'
  2015.     dw    sleep
  2016. ;
  2017.     db    0        ; End of Table
  2018. ;*************************************
  2019.  
  2020.     dseg            ; <crw>
  2021.  
  2022. ;
  2023. ;Temporary storage area
  2024. ;
  2025. clock:
  2026.     ds    1        ;clock speed
  2027. pagsiz:
  2028.     ds    1        ;page size
  2029. muser:
  2030.     ds    1        ;max user
  2031. mdisk:
  2032.     ds    1        ;max disk
  2033. stksav:
  2034.     ds    2        ;SAVE HL VALUE
  2035. dutstk:
  2036.     ds    2        ;OLD CP/M STACK POINTER; TOP OF DU3 STACK
  2037. bufad:
  2038.     ds    2        ;FORCES INITIAL READ
  2039. qcnt:
  2040.     ds    2        ;NUMBER OF SECTORS IN QUEUE
  2041. qnxt:
  2042.     ds    2        ;PTR TO NEXT SECTOR IN QUEUE
  2043. qlst:
  2044.     ds    2        ;PTR TO LAST SECTOR IN QUEUE
  2045. qptr:
  2046.     ds    2        ;G-P QUEUE PTR
  2047. hexad:
  2048.     ds    2        ;TO RE-FETCH A VALUE
  2049. togo:
  2050.     ds    2        ;REPEAT COUNT (FFFF=CONT)
  2051. twoup:
  2052.     ds    1
  2053. unum:
  2054.     ds    1        ;NUMBER OF CURRENT USER
  2055. only1:
  2056.     ds    1        ;FLAG TO PRINT ONLY 1 MAP ENTRY (0=NO)
  2057. mfptr:
  2058.     ds    2        ;MULTI FILE PTR FOR GETGRP
  2059. pagflg:
  2060.     ds    1        ;LINE COUNTER FOR PAGING
  2061. pflag:
  2062.     ds    1        ;1=PRINT
  2063. group:
  2064.     ds    2        ;GROUP NUMBER
  2065. grpdis:
  2066.     ds    1        ;DISPLACEMENT INTO GROUP
  2067. savefl:
  2068.     ds    1        ;SAVE FLAG
  2069. curtrk:
  2070.     ds    2        ;CURRENT TRACK NUMBER
  2071. cursec:
  2072.     ds    2        ;CURRENT SECTOR NUMBER
  2073. physec:
  2074.     ds    2        ;CURRENT PHYSICAL SECTOR NUMBER
  2075. tabcol:
  2076.     ds    1        ;TAB COLUMN
  2077. cpyfct:
  2078.     ds    1        ;GROUP COPY FUNCTION; 0=READ, 0FFH=WRITE
  2079. filect:
  2080.     ds    2        ;FILE COUNT
  2081. dirpos:
  2082.     ds    1        ;POSITION IN DIRECTORY
  2083. findfl:
  2084.     ds    1        ;1=MUST POSITION AFTER FIND
  2085. ftsw:
  2086.     ds    1        ;SEARCH W/O INCREMENT
  2087. notpos:
  2088.     ds    1        ;INITIALLY NOT POSITIONED
  2089. wrflg:
  2090.     ds    1        ;MAY NOT WRITE UNTIL '+', '-',
  2091. ;             OR 'G' COMMAND
  2092. tgrp:
  2093.     ds    2        ;TEMPORARY GROUP FLAG
  2094. first0:
  2095.     ds    1        ;SETS TO 0 IF FIRST SEC # IS 0
  2096. drive:
  2097.     ds    1        ;DRIVE NUMBER
  2098. maxtrk:
  2099.     ds    2        ;MAX TRACK NUMBER
  2100. maxsec:
  2101.     ds    2        ;MAX SECTOR NUMBER
  2102. sectbl:
  2103.     ds    2        ;POINTER TO SECTOR SKEW TABLE
  2104. ;
  2105. ihflg:
  2106.     ds    1        ;0=NOT AT INITIAL HELP, 0FFH=AT INITIAL HELP
  2107. dupflg:
  2108.     ds    1        ;SPACE OR STAR TO INDICATE MULTIPLE USERS
  2109. back:
  2110.     ds    2        ;TO BACK UP IN "CA0-7F,X"
  2111. dumtyp:
  2112.     ds    1
  2113. ;
  2114. ;The disk parameter block
  2115. ;is moved here from CP/M
  2116. ;
  2117. dpb    equ    $        ;DISK PARAMETER BLOCK (COPY)
  2118. spt:
  2119.     ds    2
  2120. bsh:
  2121.     ds    1
  2122. blm:
  2123.     ds    1
  2124. exm:
  2125.     ds    1
  2126. dsm:
  2127.     ds    2
  2128. drm:
  2129.     ds    2
  2130. al0:
  2131.     ds    1
  2132. al1:
  2133.     ds    1
  2134. cks:
  2135.     ds    2
  2136. systrk:
  2137.     ds    2
  2138. ;
  2139. ;End of disk parameter block
  2140. ;
  2141. savbuf:
  2142.     ds    2
  2143. inbuf:
  2144.     ds    2        ;INPUT LINE BUFFER
  2145. pinbuf:
  2146.     ds    2        ;PREVIOUS CONTENTS OF INPUT BUFFER
  2147. ctemp:
  2148.     ds    2        ;BUILD NEW COMMAND LINE BUFFER
  2149. ctempx:
  2150.     ds    2        ;END OF CTEMP
  2151. mtabl:
  2152.     ds    2        ;10 PAGES FOR 10 MACROS
  2153. gbuff:
  2154.     ds    2
  2155. direct:
  2156.     ds    2
  2157. ;
  2158.     end
  2159.  
  2160. ; END DU314-02.Z80
  2161.  
  2162.