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-01.ZZ0 / DU314-01.Z80
Text File  |  2000-06-30  |  36KB  |  1,663 lines

  1. ;
  2. ; DU314-01.Z80
  3. ;
  4. ;Beginning of Program
  5. ;
  6. ;
  7. ; Environment Definition
  8. ;
  9.     if    z3env ne 0
  10. ;
  11. ; External ZCPR3 Environment Descriptor
  12. ;
  13.     jp    start
  14.     db    'Z3ENV'        ;This is a ZCPR3 Utility
  15.     db    1        ;External Environment Descriptor
  16. z3eadr:
  17.     dw    z3env
  18.  
  19. ;
  20. ; Space Added for Initial Macro Definitions
  21. ;
  22.     ;label to help locate when patching
  23.  
  24.     db    'INITIAL MACROS:'
  25.  
  26. imac0:    db    'G0,D',cr    ;macro 0 - display first directory sector
  27.     db    '-D',cr        ;macro 1 - back up one sector and display
  28.     db    '+D',cr        ;macro 2 - forward one sector and display
  29.     db    '-8D',cr    ;macro 3 - back 8 sectors and display
  30.     db    '+8D',cr    ;macro 4 - forward 8 sectors and display
  31.     db    'T0,S1,D',cr    ;macro 5 - display first disk sector
  32.     db    '+D,*',cr    ;macro 6 - forward, display, repeat
  33.     db    'D,<B,+,*',cr    ;macro 7 - display, put in queue, forward, rpt.
  34.     db    cr        ;macro 8
  35.     db    cr        ;macro 9
  36.  
  37.                 ;fill rest of 128 bytes with carriage returns
  38.  
  39.     if    imac0 + 128 - $ gt 0
  40.     rept    imac0 + 128 - $
  41.     db    cr
  42.     endm
  43.     endif
  44.  
  45. start:
  46.     ld    hl,(z3eadr)    ;pt to ZCPR3 environment
  47. ;
  48.     else
  49. ;
  50. ; Internal ZCPR3 Environment Descriptor
  51. ;
  52.     maclib    z3base.lib
  53.     maclib    sysenv.lib
  54. z3eadr:
  55.     jp    start
  56.     sysenv
  57. start:
  58.     ld    hl,z3eadr    ;pt to ZCPR3 environment
  59.     endif
  60.  
  61. ;
  62. ; Start of Program -- Initialize ZCPR3 Environment
  63. ;
  64.     call    z3vinit        ;initialize the ZCPR3 Env and the VLIB Env
  65.     call    tinit        ;init terminal
  66.     ld    hl,0        ;GET PTR TO CP/M STACK
  67.     add    hl,sp        ;HL=SP
  68.     ld    (dutstk),hl    ;SAVE IT
  69. ;
  70.     call    codend        ;get free space
  71.     ld    de,100h        ;open area
  72.     add    hl,de        ;large stack area
  73.     ld    (savbuf),hl
  74.     add    hl,de        ;100H for SAVBUF
  75.     push    hl        ;save ptr
  76.     ld    (hl),126    ;allow 126-char input line
  77.     inc    hl
  78.     inc    hl        ;ptr to INBUF
  79.     ld    (inbuf),hl
  80.     pop    hl        ;pt to beginning
  81.     ld    de,400h        ;large area for expansion
  82.     add    hl,de
  83.     ld    (pinbuf),hl    ;ptr to PINBUF
  84.     add    hl,de
  85.     ld    (ctemp),hl    ;ptr to CTEMP
  86.     add    hl,de
  87.     ld    (ctempx),hl    ;ptr to CTEMPX
  88.     ld    (mtabl),hl    ;ptr to MACRO TABLE
  89.     ld    de,100h*10    ;10 macros
  90.     add    hl,de
  91.     ld    (gbuff),hl    ;group save buffer
  92.     ld    (direct),hl    ;directory load buffer
  93. ;
  94.     ld    hl,(savbuf)    ;top of stack
  95.     ld    sp,hl        ; SET STACK
  96. ;
  97.     call    getspeed
  98.     ld    (clock),a    ;set clock speed
  99.     call    getcrt        ;get CRT data
  100.     inc    hl        ;pt to screen size
  101.     ld    a,(hl)        ;get it
  102.     ld    (pagsiz),a    ;set page size
  103.     call    getmdisk    ;get max disk
  104.     ld    (mdisk),a    ;and set it
  105.     call    getmuser    ;get max user
  106.     ld    (muser),a    ;and set it
  107. ;
  108. ;Set up local jumps to BIOS
  109. ;
  110. start1:
  111.     ld    hl,(base+1)    ;WARM BOOT POINTER
  112.     ld    de,3        ;READY FOR ADD
  113.     add    hl,de
  114.     ld    (vconst+1),hl    ;CON: Status
  115.     add    hl,de
  116.     ld    (vconin+1),hl    ;CON: Input
  117.     add    hl,de
  118.     ld    (vconot+1),hl    ;CON: Output
  119.     add    hl,de
  120.     ld    (vlist+1),hl    ;LST: Output
  121.     add    hl,de        ;Skip PUNCH
  122.     add    hl,de        ;Skip RDR
  123.     add    hl,de
  124.     ld    (vhome+1),hl    ;Home Disk
  125.     add    hl,de
  126.     ld    (vseldk+1),hl    ;Select Disk
  127.     add    hl,de
  128.     ld    (vsetrk+1),hl    ;Set Track
  129.     add    hl,de
  130.     ld    (vstsec+1),hl    ;Set Sector
  131.     add    hl,de
  132.     ld    (setdma+1),hl    ;Set DMA Address
  133.     add    hl,de
  134.     ld    (vread+1),hl    ;Read Block From Disk
  135.     add    hl,de
  136.     ld    (vwrite+1),hl    ;Write Block To Disk
  137.     add    hl,de        ;Skip LISTST
  138.     add    hl,de
  139.     ld    (vsctrn+1),hl    ;CP/M 2.x Sector Translation Table
  140. ;    JMP    HELLO
  141. ;
  142. ;Initialization Complete -- Print Signon Message and Begin Command Processing
  143. ;
  144. hello:
  145.     call    getstp        ;SET UP CP/M PARAMETERS
  146.     call    initp        ;INITIALIZE BUFFER PARAMETERS
  147.     call    ilprt
  148.     db    'DU3 - Disk Utility III, Version '
  149.     db    vers/10+'0','.',(vers mod 10)+'0'
  150.     db    cr,lf,cr,lf
  151.     db    dim,'Type ? for Help',bright
  152.     db    cr,lf,0
  153. ;
  154. ;Clear Editor Reference
  155. ;
  156.     xor    a
  157.     ld    (edrun),a    ;EDITOR NOT RUNNING
  158. ;
  159. ;Save initial command line in INBUF
  160. ;
  161.     ld    hl,tbuff    ;PT TO COMMAND LINE BUFFER
  162.     ld    a,(hl)        ;GET CHAR COUNTER
  163.     inc    hl        ;PT TO FIRST CHAR
  164.     add    a,l        ;COMPUTE LOCATION OF AFTER LAST CHAR
  165.     ld    l,a
  166.     ld    a,h
  167.     adc    a,0
  168.     ld    h,a
  169.     ld    (hl),cr        ;SET ENDING CR
  170.     ld    hl,(inbuf)    ;PT TO BUFFER
  171.     ex    de,hl        ;... IN DE
  172.     ld    hl,tbuff+1    ;PT TO INPUT LINE
  173.     ld    b,128        ;COPY BUFFER
  174.     call    move
  175. ;
  176. ;Establish Initial Position
  177. ;
  178.     ld    de,0        ;GROUP 0
  179.     call    degroup        ;POSITION TO GROUP
  180.     call    inqsub        ;PRINT POSITION
  181. ;
  182. ;Check for initial command
  183. ;
  184.     ld    hl,(inbuf)    ;INPUT BUFFER
  185.     ld    a,(hl)
  186.     cp    cr
  187.     jp    z,prmptr    ;NO INITIAL COMMAND FROM COMMAND LINE
  188.     inc    hl        ;PT TO FIRST CHAR
  189. ;
  190. ;Got initial command, set it up
  191. ;
  192.     ld    a,(hl)        ;GET FIRST CHAR
  193.     cp    '/'        ;IF SLASH, PRINT INITIAL HELP (TOOLSET CONVENTION)
  194.     jp    z,ihelp        ;PRINT INITIAL HELP INFO
  195.     xor    a
  196.     ld    (ihflg),a    ;SET NO INITIAL HELP
  197.     ld    (inbuf),hl    ;SET UP POINTER TO INPUT LINE
  198.     jp    prmpte1        ;PROCESS AS THOUGH COMMAND LINE WAS TYPED
  199. ;
  200. ;Input Command Line From User at Console
  201. ;
  202. prmptr:
  203.     xor    a        ;A=0
  204.     ld    (ihflg),a    ;Set No Initial Help
  205.     ld    a,(edrun)    ;Check for Editor Running
  206.     or    a
  207.     jp    nz,edit0    ;Reenter Editor
  208.     call    sinbuf        ;Save old INBUF into PINBUF
  209. prmpte:
  210.     call    rdbuf        ;Read Input Line
  211. prmpte1:
  212.     call    exmac        ;Expand Macros
  213. ;
  214. ;Begin Processing Command Line in INBUF
  215. ;  At this point, HL points to next character to process
  216. ;
  217. prmpti:
  218.     ld    a,0ffh        ;SET INFINITE LOOP COUNT
  219.     ld    (togo),a    ;LOOP COUNT FOR MULTIPLE LOOPS
  220.     ld    (togo+1),a
  221. ;
  222. ;Minor Command Loop; This is the entry point for each individual command in
  223. ;  a Command Line; Commands may be separated by semicolons in this manner
  224. ;
  225. prompt    equ    $
  226. setstk:
  227.     ld    (stksav),hl    ;SAVE HL FOR STACK LOAD
  228.     ld    hl,(savbuf)    ;RESET STACK
  229.     ld    sp,hl
  230.     ld    hl,(stksav)    ;RESTORE HL
  231.     xor    a        ;ZERO 2-UP PRINT FOR DUAL-COLUMN PRINT
  232.     ld    (twoup),a    ;..SWITCH
  233.     ld    a,1
  234.     ld    (ftsw),a    ;TELL SEARCH NOT TO INCR
  235.     push    hl
  236.     ld    hl,tbuff    ;SET NO-READ INPUT BUFFER ADDRESS
  237.     ld    (bufad),hl    ;FOR RDBYTE
  238.     pop    hl
  239.     call    ctlcs        ;ABORT?
  240.     jp    z,prmptr    ;..YES, READ BUFFER
  241. ;
  242. ;Do we have to position in directory after find?
  243. ;
  244.     ld    a,(findfl)
  245.     or    a
  246.     jp    nz,posdir    ;POSITION IN DIRECTORY
  247. ;
  248. ;Begin Command Evaluation -- Check for EOL and Capitalize
  249. ;
  250.     ld    a,(hl)        ;GET NEXT CHAR IN COMMAND LINE
  251.     inc    hl        ;POINT TO FOLLOWING CHAR
  252.     cp    cr        ;END OF LINE PHYSICALLY?
  253.     jp    z,prmptr    ;INPUT NEW COMMAND LINE IF SO
  254.     cp    eolch        ;END OF LINE LOGICALLY?
  255.     jp    z,prompt    ;PROCESS NEXT ELEMENT IF SO
  256.     call    upcase        ;CAPITALIZE COMMAND
  257.     ld    (dumtyp),a    ;TYPE OF DUMP (A,D,H)
  258.     ld    de,cmdtbl    ;PT TO COMMAND TABLE
  259.     call    cmd        ;PROCESS
  260.     jp    what        ;ERROR RETURN
  261. ;
  262. ;Command dispatcher
  263. ;  If command not found, abort with error message
  264. ;  If command file, process command with HL pting to next command char and
  265. ;    A containing command letter
  266. ;
  267. cmd:
  268.     push    hl        ;SAVE HL
  269.     ld    b,a        ;COMMAND IN B
  270.     ex    de,hl        ;HL PTS TO COMMAND TABLE
  271. cmdlp:
  272.     ld    a,(hl)        ;GET COMMAND
  273.     or    a        ;0=END OF TABLE
  274.     jp    z,cmder
  275.     cp    b        ;COMPARE COMMAND
  276.     jp    z,cmdgo
  277.     inc    hl        ;PT TO ADR
  278.     inc    hl
  279.     inc    hl        ;PT TO NEXT CMND
  280.     jp    cmdlp
  281. cmdgo:
  282.     inc    hl        ;PT TO ADDRESS LOW
  283.     ld    e,(hl)
  284.     inc    hl        ;PT TO ADDRESS HIGH
  285.     ld    d,(hl)
  286.     pop    hl        ;RESTORE HL
  287.     pop    af        ;CLEAR RETURN ADDRESS
  288.     ld    a,b        ;COMMAND BACK INTO A
  289.     push    de        ;PLACE ADDRESS ON STACK
  290.     ret            ;"RUN COMMAND"
  291. cmder:
  292.     pop    hl        ;RESTORE HL
  293.     ld    a,b        ;RESTORE COMMAND CHAR IN CASE CMD RUN
  294.     ret            ;... IMMEDIATELY AGAIN ON A NEW TABLE
  295. ;
  296. ;Macro Expansion Routine -- Expand Macros
  297. ;
  298. exmac:
  299.     ld    hl,(ctemp)    ;BUILD INTO TEMPORARY BUFFER
  300.     ex    de,hl
  301.     ld    hl,(inbuf)    ;PT TO INPUT LINE
  302. exmac1:
  303.     ld    a,(hl)        ;GET CHAR
  304.     cp    '0'        ;SKIP IF LESS THAN '0'
  305.     jp    c,exmac2
  306.     cp    '9'+1        ;CHECK FOR RANGE
  307.     jp    nc,exmac2
  308.     inc    hl        ;PT TO NEXT CHAR
  309.     push    hl        ;SAVE PTR TO NEXT CHAR IN LINE
  310.     sub    '0'        ;CONVERT TO BINARY (0-9)
  311.     ld    b,a        ;RESULT IN B
  312.     ld    c,0
  313.     ld    hl,(mtabl)    ;PT TO BASE OF MACROS
  314.     add    hl,bc        ;PT TO MACRO
  315.     call    copym        ;COPY MACRO INTO LINE
  316.     dec    de        ;BACK UP OVER <CR>
  317.     pop    hl        ;GET PTR TO NEXT CHAR IN COMMAND LINE
  318. exmac2:
  319.     ld    a,(hl)        ;GET CHAR
  320.     ld    (de),a        ;PUT CHAR
  321.     inc    hl        ;PT TO NEXT
  322.     inc    de
  323.     call    mtest        ;TEST FOR END OF BUFFER
  324.     cp    cr        ;DONE?
  325.     jp    z,exmac3
  326.     cp    eolch        ;LOGICAL EOL?
  327.     jp    nz,exmac2
  328.     jp    exmac1        ;PROCESS NEXT COMMAND
  329. exmac3:
  330.     ld    hl,(ctemp)    ;COPY COMMAND LINE BACK
  331.     ex    de,hl
  332.     ld    hl,(inbuf)    ;INTO INBUF
  333.     ex    de,hl
  334.     call    copycr        ;COPY TO <CR>
  335.     ld    hl,(inbuf)    ;PT TO INBUF
  336.     ret            ;EXPANSION COMPLETE
  337. ;
  338. ;Copy Macro Into Command Line Buffer
  339. ;
  340. copym:
  341.     ld    a,(hl)        ;GET CHAR
  342.     ld    (de),a        ;PUT CHAR
  343.     inc    hl        ;PT TO NEXT
  344.     inc    de
  345.     call    mtest        ;CHECK FOR LIMIT
  346.     cp    cr        ;END OF MACRO?
  347.     jp    nz,copym
  348.     ret
  349. ;
  350. ;Test for Buffer Full
  351. ;
  352. mtest:
  353.     push    hl        ;SAVE HL
  354.     push    af        ;SAVE A
  355.     ld    hl,(ctempx)    ;CHECK FOR END OF BUFFER
  356.     ld    a,h        ;GET PAGE
  357.     cp    d        ;CHECK PAGE
  358.     jp    z,macerr
  359.     pop    af        ;GET A
  360.     pop    hl        ;GET HL
  361.     ret
  362. ;
  363. ;Macro Command Expansion Error
  364. ;
  365. macerr:
  366.     call    ilprt
  367.     db    cr,lf,'Error -- Macro Expanded Command Line too Long',0
  368.     jp    prmptr        ;NEW COMMAND
  369. ;
  370. ;Save INBUF into PINBUF for later processing by '@' command
  371. ;
  372. sinbuf:
  373.     ld    hl,(pinbuf)    ;PT TO PINBUF (PREVIOUS INBUF)
  374.     ex    de,hl
  375.     ld    hl,(inbuf)    ;PT TO INBUF
  376. ;
  377. ;Copy (HL) to (DE) until <CR> Encountered
  378. ;
  379. copycr:
  380.     ld    a,(hl)        ;GET CHAR
  381.     ld    (de),a        ;PUT CHAR
  382.     inc    hl        ;PT TO NEXT
  383.     inc    de
  384.     cp    cr        ;DONE?
  385.     jp    nz,copycr
  386.     ret
  387.  
  388. ;
  389. ;Command Not Found Error
  390. ;
  391. what:
  392.     pop    hl        ; RESTORE HL
  393.     call    ilprt
  394.     db    dim,'Invalid Command at or after ',bright,0
  395.     ld    a,b        ;GET COMMAND LETTER
  396.     call    type        ;PRINT IT
  397.     jp    prmptr
  398. ;
  399. ;Memory full error
  400. ;
  401. memful:
  402.     call    ilprt
  403.     db    '+++ Out of memory +++'
  404.     db    cr,lf,0
  405.     jp    prmptr
  406. ;
  407. ;COMMAND:  E
  408. ;Edit Current Block
  409. ;
  410. erow    equ    6        ;FIRST ROW OF EDITOR DISPLAY
  411. ecol    equ    4        ;FIRST COL OF EDITOR DISPLAY
  412. ecolc    equ    ecol+16*3+2    ;FIRST COL OF EDITOR CHAR DISPLAY
  413. ecurs    equ    '>'        ;EDITOR CURSOR
  414. ;
  415. edit:
  416.     call    sinbuf        ;SAVE COMMAND LINE AS PREVIOUS
  417.     ld    a,0ffh
  418.     ld    (edrun),a    ;EDITOR IS RUNNING
  419. ;
  420. ; SET UP ARROW KEYS
  421. ;
  422.     ld    hl,(envptr)    ;PT TO ENVIRONMENT DESCRIPTOR
  423.     ld    de,80h+10h    ;PT TO ARROW KEY INFO
  424.     add    hl,de
  425.     ld    de,edcurt    ;PT TO CURSOR TABLE
  426.     ld    b,4        ;4 ARROW KEYS
  427. edita:
  428.     ld    a,(hl)        ;GET CHAR
  429.     ld    (de),a        ;STORE CHAR
  430.     inc    hl        ;PT TO NEXT
  431.     inc    de        ;PT TO NEXT ENTRY
  432.     inc    de
  433.     inc    de
  434.     djnz    edita        ;COUNT DOWN
  435. ;
  436. ; REENTER EDIT WITH PTRS RESET
  437. ; REFRESH EDIT SCREEN
  438. ;
  439. edit0:
  440.     call    cls        ;NEW SCREEN
  441.     call    at
  442. ;    db    2,32        ;ROW 2, COL 32
  443.     db    2,ecol        ; <crw>
  444.     call    ilprt        ;BANNER
  445.     db    'DU3 Block Editor',0
  446.     ld    h,erow+9    ;POSITION FOR COMMAND DISPLAY
  447. ;    ld    l,1
  448.     ld    l,9        ; <crw>
  449.     call    gotoxy        ;POSITION CURSOR
  450.     call    ilprt        ;PRINT COMMAND SUMMARY
  451. ; added tabs to shift help over <crw>
  452.     db    ' -- Movement --'
  453.     db    '  -------------- Operation ---------------',cr,lf
  454.     db    tab,'      ^E          '
  455.     db    dim,'Enter: ',bright,'A',dim,' ASCII Chars',bright
  456.     db    '      .',dim,' Next Sector',bright,cr,lf    ; <crw>
  457.     db    tab,'       ^          '
  458.     db    dim,'       ',bright,'H',dim,' Hex Numbers',bright
  459.     db    '      ,',dim,' Last Sector',bright,cr,lf    ; <crw>
  460.     db    tab,'  ^S <-+-> ^D    '
  461.     db    '                     '
  462.     db    '     ^C',dim,' Exit DU3   ',bright
  463.     db    cr,lf
  464.     db    tab,'       v          '
  465.     db    'C',dim,' DU3 Command Line  ',bright
  466.     db    '     ^R',dim,' Rescreen   ',bright,cr,lf
  467.     db    tab,'      ^X          '
  468.     db    'X',dim,' Exit Editor to DU3',bright
  469.     db    '     ^W',dim,' Write Block',bright
  470.     db    0
  471.     call    at
  472. ;    db    2,65        ; <crw>
  473.     db    2,54
  474.     call    ilprt
  475.     db    dim,'Position:',bright,0
  476. ;    JMP    EDITCMD
  477. ;
  478. ; REFRESH SCREEN DISPLAY DATA ONLY
  479. ;
  480. editr:
  481.     xor    a        ;A=0
  482.     ld    (eindex),a    ;SET INDEX TO 0 (FIRST ELEMENT)
  483.     ld    (ederr),a    ;SET NO PREVIOUS ERROR
  484.     call    at        ;POSITION CURSOR
  485.     db    erow-2,ecol
  486.     call    inqsub        ;PRINT POSITION DATA
  487.     call    edplot        ;PLOT BUFFER DATA
  488. ;
  489. ; INPUT EDITOR COMMAND
  490. ;
  491. editcmd:
  492.     call    edercl        ;CLEAR EDITOR INVALID COMMAND MESSAGE
  493. editcmd1:
  494.     call    at        ;POSITION FOR COMMAND LINE
  495.     db    22,10
  496.     call    ilprt
  497.     db    dim,'Edit Command?  ',bright,bs,0
  498.     call    conin        ;GET CHAR
  499.     call    upcase        ;CAPITALIZE
  500.     ld    b,a        ;COMMAND IN B
  501.     ld    de,edcurt    ;PROCESS CURSOR COMMANDS FIRST
  502.     call    cmd        ;PROCESS COMMAND
  503.     ld    de,ecmdtbl    ;EDITOR COMMAND TABLE
  504.     call    cmd        ;PROCESS COMMAND
  505.     ld    a,0ffh        ;SET ERROR FLAG
  506.     ld    (ederr),a
  507.     call    at        ;CLEAR ERROR MESSAGE
  508.     db    23,15
  509.     call    ilprt
  510.     db    'Invalid Command',0
  511.     jp    editcmd1
  512. ;
  513. ;Clear Editor Invalid Command Message
  514. ;
  515. edercl:
  516.     ld    a,(ederr)    ;PREVIOUS ERROR?
  517.     or    a        ;0=NO
  518.     ret    z
  519.     xor    a        ;CLEAR FLAG
  520.     ld    (ederr),a
  521.     call    at        ;CLEAR ERROR MESSAGE
  522.     db    23,15
  523.     call    ilprt
  524.     db    '                         ',0
  525.     ret
  526. ;
  527. ;PLOT BUFFER DATA
  528. ;
  529. edplot:
  530.     ld    h,erow        ;SET ROW
  531.     ld    l,ecol-1    ;SET COLUMN (ONE BEFORE FOR LEADING SPACE)
  532.     call    gotoxy        ;POSITION CURSOR
  533.     ex    de,hl        ;POSITION IN DE
  534.     ld    hl,tbuff    ;PT TO DATA
  535.     ld    b,8        ;8 LINES
  536. edit00:
  537.     ld    c,16        ;16 ELEMENTS
  538. edit01:
  539.     call    space        ;PRINT LEADING SPACE (1ST SPACE WIPES CURSOR)
  540.     ld    a,(hl)        ;GET BYTE
  541.     call    hex        ;PRINT AS HEX
  542.     inc    hl        ;PT TO NEXT
  543.     dec    c        ;COUNT DOWN
  544.     jp    nz,edit01
  545.     ex    de,hl        ;POSITION AGAIN
  546.     inc    h        ;NEXT ROW
  547.     call    gotoxy
  548.     ex    de,hl
  549.     dec    b        ;COUNT DOWN
  550.     jp    nz,edit00
  551.     ld    h,erow        ;RESET ROW
  552.     ld    l,ecolc        ;RESET COL
  553.     call    gotoxy        ;POSITION CURSOR
  554.     ex    de,hl        ;POSITION IN DE
  555.     ld    hl,tbuff    ;PT TO DATA
  556.     ld    b,8        ;8 LINES
  557. edit02:
  558.     call    aster        ;PRINT BAR
  559.     ld    c,16        ;16 ELEMENTS
  560. edit03:
  561.     ld    a,(hl)        ;GET BYTE
  562.     and    7fh        ;MASK MSB
  563.     cp    7fh        ;7FH IS DOT
  564.     jp    z,edit7f
  565.     cp    ' '        ;SPACE OR MORE?
  566.     jp    nc,edit04
  567. edit7f:
  568.     ld    a,'.'        ;PRINT DOT
  569. edit04:
  570.     call    type        ;PRINT BYTE
  571.     inc    hl        ;PT TO NEXT
  572.     dec    c        ;COUNT DOWN
  573.     jp    nz,edit03
  574.     call    aster        ;PRINT ENDING BAR
  575.     ex    de,hl        ;POSITION AGAIN
  576.     inc    h        ;NEXT ROW
  577.     call    gotoxy
  578.     ex    de,hl
  579.     dec    b        ;COUNT DOWN
  580.     jp    nz,edit02
  581.     call    edcur        ;POSITION CURSOR
  582.     ret
  583. ;
  584. ;EDITOR COMMAND TABLE
  585. ;
  586. ecmdtbl:
  587.     db    cr        ;NOP
  588.     dw    editcmd
  589.     db    'C'-'@'        ;^C = EXIT DU3
  590.     dw    edcc
  591.     db    'R'-'@'        ;^R = REFRESH
  592.     dw    edit0
  593.     db    'E'-'@'        ;^E=UP
  594.     dw    edup
  595.     db    'X'-'@'        ;^X=DOWN
  596.     dw    eddown
  597.     db    'D'-'@'        ;^D=RIGHT
  598.     dw    edright
  599.     db    'S'-'@'        ;^S=LEFT
  600.     dw    edleft
  601.     db    'W'-'@'        ;WRITE BLOCK
  602.     dw    editwr
  603.     db    ' '        ;NOP
  604.     dw    editcmd
  605.     db    '+'        ;ADVANCE
  606.     dw    editplus
  607.     db    '.'        ; <crw>
  608.     dw    editplus
  609.     db    ','        ; <crw>
  610.     dw    editminus
  611.     db    '-'        ;BACKUP
  612.     dw    editminus
  613.     db    'A'        ;CHANGE ALPHA
  614.     dw    editalp
  615.     db    'C'        ;COMMAND LINE
  616.     dw    editcl
  617.     db    'H'        ;CHANGE HEX
  618.     dw    edithex
  619.     db    'X'        ;EXIT
  620.     dw    editx
  621.     db    0        ;END OF TABLE
  622. ;
  623. ;  ARROW KEY DEFINITONS FROM TCAP
  624. ;
  625. edcurt:
  626.     db    0        ;0 INDICATES NO ARROW KEYS
  627.     dw    edup
  628.     db    0
  629.     dw    eddown
  630.     db    0
  631.     dw    edright
  632.     db    0
  633.     dw    edleft
  634.     db    0        ;END OF TABLE
  635. ;
  636. ;EDITOR BUFFERS
  637. ;
  638. eindex:
  639.     ds    1        ;INDEX ENTRY
  640. ederr:
  641.     ds    1        ;ERROR FLAG
  642. edrun:
  643.     ds    1        ;FLAG SAYING THAT EDITOR IS RUNNING
  644. ;
  645. ;Write Block to Disk
  646. ;
  647. editwr:
  648.     call    edercl        ;CLEAR ERROR LINE
  649.     call    write        ;WRITE BLOCK
  650.     call    at
  651.     db    23,15        ;MESSAGE
  652.     call    ilprt
  653.     db    'Block Written',0
  654.     ld    a,0ffh        ;SET ERROR
  655.     ld    (ederr),a
  656.     jp    editcmd1
  657. ;
  658. ;Enter ASCII Chars
  659. ;
  660. editalp:
  661.     call    edercl        ;CLEAR ERROR LINE
  662.     call    at
  663.     db    22,35
  664.     call    ilprt
  665.     db    dim,'Enter Text (<hh> for Hex)',bright
  666.     db    cr,lf,' --> ',0
  667.     call    rdbuf1        ;INPUT TEXT WITHOUT PROMPT
  668.     call    edprcl        ;CLEAR PROMPT LINE
  669.     ld    a,(eindex)    ;PT TO POSITION
  670.     ld    de,tbuff    ;COMPUTE OFFSET
  671.     add    a,e
  672.     ld    e,a
  673.     ld    a,d
  674.     adc    a,0
  675.     ld    d,a        ;DE PTS TO BYTE, HL PTS TO TEXT
  676. edita1:
  677.     ld    a,(hl)        ;GET CHAR
  678.     cp    cr        ;EOL?
  679.     jp    z,edita2    ;REFRESH SCREEN
  680.     call    getval        ;GET ASCII OR <HEX> VALUE
  681.     ld    (de),a        ;UPDATE BYTE
  682.     inc    hl        ;PT TO NEXT INPUT CHAR
  683.     inc    e        ;PT TO NEXT BUFFER BYTE
  684.     jp    nz,edita1
  685. edita2:
  686.     call    edplot        ;REPLOT
  687.     jp    editcmd1    ;DONE-REFRESH SCREEN
  688. ;
  689. ;Enter Numbers
  690. ;
  691. edithex:
  692.     call    edercl        ;CLEAR ERROR LINE
  693.     call    at
  694.     db    22,35
  695.     call    ilprt
  696.     db    dim,'Enter Hex Numbers (#nn for Dec)'
  697.     db    bright
  698.     db    cr,lf,' --> ',0
  699.     call    rdbuf1        ;INPUT TEXT WITHOUT PROMPT
  700.     call    edprcl        ;CLEAR PROMPT LINE
  701.     ld    a,(eindex)    ;PT TO POSITION
  702.     ld    de,tbuff    ;COMPUTE OFFSET
  703.     add    a,e
  704.     ld    e,a
  705.     ld    a,d
  706.     adc    a,0
  707.     ld    d,a        ;DE PTS TO BYTE, HL PTS TO TEXT
  708. edith1:
  709.     ld    a,(hl)        ;GET HEX DIGIT
  710.     cp    cr        ;EOL?
  711.     jp    z,edita2    ;REFRESH SCREEN
  712.     cp    ' '        ;SKIP SPACES
  713.     jp    nz,edith2
  714.     inc    hl        ;SKIP SPACE
  715.     jp    edith1
  716. edith2:
  717.     push    de        ;SAVE PTR
  718.     call    hexin        ;GET VALUE AND POSITION HL
  719.     ld    a,e        ;... IN A
  720.     pop    de        ;GET PTR
  721.     ld    (de),a        ;PUT BYTE
  722.     inc    e        ;ADVANCE TO NEXT BYTE
  723.     jp    nz,edith1
  724.     jp    edita2        ;DONE-REFRESH
  725. ;
  726. ;CLEAR PROMPT LINE
  727. ;
  728. edprcl:
  729.     call    at        ;PROMPT LINE
  730.     db    22,35
  731.     ld    b,40        ;40 POSITIONS
  732.     call    edpcl
  733.     call    at        ;USER INPUT
  734.     db    23,1
  735.     ld    b,79        ;79 POSITIONS
  736. edpcl:
  737.     call    space        ;CLEAR PROMPT LINE WITH SPACES
  738.     dec    b
  739.     jp    nz,edpcl
  740.     ret
  741. ;
  742. ;Enter Command Line from Editor
  743. ;
  744. editcl:
  745.     call    edercl        ;CLEAR ERROR LINE
  746.     call    crlf        ;NEW LINE
  747.     jp    prmpte        ;GET COMMAND LINE FROM USER
  748. ;
  749. ;Advance to Next Block
  750. ;
  751. editplus:
  752.     call    nxtsec        ;ADVANCE SECTORS
  753. editp1:
  754.     push    hl
  755.     ld    hl,(cursec)
  756.     ex    de,hl
  757.     call    setsec        ;SET SECTOR
  758.     ld    hl,(curtrk)
  759.     ex    de,hl
  760.     call    settrk        ;SET TRACK
  761.     pop    hl
  762.     call    read        ;READ IN BLOCK
  763.     call    clcsub        ;CALCULATE GROUP DATA
  764.     jp    editr        ;REFRESH DATA ONLY
  765. ;
  766. ;Backup to Last Block
  767. ;
  768. editminus:
  769.     call    lstsec        ;BACKUP BLOCK
  770.     jp    editp1
  771. ;
  772. ;Exit EDIT Mode
  773. ;
  774. editx:
  775.     xor    a
  776.     ld    (edrun),a    ;EDITOR IS NOT RUNNING NOW
  777.     call    edercl        ;CLEAR ERROR LINE
  778.     jp    prmptr
  779. ;
  780. ;Exit DU3
  781. ;
  782. edcc:
  783.     call    edercl        ;CLEAR ERROR LINE
  784.     jp    exit
  785. ;
  786. ;EDIT MOVE: UP
  787. ;
  788. edup:
  789.     call    edccur        ;CLEAR CURSOR
  790.     ld    a,(eindex)    ;BACKUP INDEX BY 16
  791.     sub    16
  792. ;
  793. ;Common EDIT MOVE Routine - on input, A=new index
  794. ;
  795. edmove:
  796.     and    7fh        ;MOD 128
  797.     ld    (eindex),a
  798.     call    edcur        ;SET CURSOR
  799.     jp    editcmd
  800. ;
  801. ;EDIT MOVE: DOWN
  802. ;
  803. eddown:
  804.     call    edccur        ;CLEAR CURSOR
  805.     ld    a,(eindex)    ;INCREMENT INDEX BY 16
  806.     add    a,16
  807.     jp    edmove        ;COMMON ROUTINE
  808. ;
  809. ;EDIT MOVE: RIGHT
  810. ;
  811. edright:
  812.     call    edccur        ;CLEAR CURSOR
  813.     ld    a,(eindex)    ;INCREMENT INDEX BY 1
  814.     inc    a
  815.     jp    edmove        ;COMMON ROUTINE
  816. ;
  817. ;EDIT MOVE: LEFT
  818. ;
  819. edleft:
  820.     call    edccur        ;CLEAR CURSOR
  821.     ld    a,(eindex)    ;DECREMENT INDEX BY 1
  822.     dec    a
  823.     jp    edmove        ;COMMON ROUTINE
  824. ;
  825. ;EDIT SUBROUTINE: EDCUR
  826. ; Position Editor Cursor at EINDEX
  827. ;EDIT SUBROUTINE: EDCCUR
  828. ; Clear Editor Cursor at EINDEX
  829. ;
  830. edcur:
  831.     push    hl        ;SAVE HL
  832.     ld    c,ecurs        ;CURSOR CHAR
  833.     call    edsetcur
  834.     call    at        ;UPDATE DATA
  835. ;    db    2,75
  836.     db    2,64        ; <crw>
  837.     ld    a,(eindex)    ;PT TO BYTE AT CURSOR
  838.     ld    hl,tbuff
  839.     add    a,l
  840.     ld    l,a
  841.     ld    a,h
  842.     adc    a,0
  843.     ld    h,a        ;HL PTS TO BYTE AT CURSOR
  844.     ld    a,(hl)        ;GET BYTE
  845.     call    hex        ;PRINT AS HEX
  846.     call    space
  847.     ld    a,(hl)        ;GET BYTE
  848.     pop    hl        ;RESTORE HL
  849.     and    7fh        ;MASK
  850.     cp    7fh        ;7FH IS DOT
  851.     jp    z,edc7f
  852.     cp    ' '        ;OUTPUT CHAR OR DOT
  853.     jp    nc,type
  854. edc7f:
  855.     ld    a,'.'        ;DOT
  856.     jp    type
  857. edccur:
  858.     ld    c,' '        ;CLEAR CURSOR
  859. edsetcur:
  860.     call    edrow        ;COMPUTE ROW
  861.     and    0fh        ;COMPUTE COL MOD 16
  862.     ld    b,a        ;RESULT IN B
  863.     add    a,a        ;*2
  864.     add    a,b        ;*3
  865.     add    a,ecol        ;ADD IN COL
  866.     dec    a        ;SUBTRACT 1
  867.     ld    l,a        ;COL POSITION SET
  868.     call    gotoxy        ;POSITION CURSOR
  869.     ld    a,c        ;OUTPUT CHAR
  870.     jp    type
  871. ;
  872. ;Compute Row from EINDEX
  873. ;
  874. edrow:
  875.     ld    a,(eindex)    ;GET INDEX
  876.     ld    b,a        ;SAVE IN B
  877.     rrca            ;DIVIDE BY 16
  878.     rrca
  879.     rrca
  880.     rrca
  881.     and    0fh        ;MASK FOR LSB ONLY
  882.     add    a,erow        ;COMPUTE ROW
  883.     ld    h,a        ;ROW SET
  884.     ld    a,b        ;GET INDEX
  885.     ret
  886. ;
  887. ;COMMAND:  @
  888. ;Repeat Previous Command Line
  889. ;
  890. pcmd:
  891.     ld    a,(hl)        ;GET NEXT CHAR
  892.     cp    cr        ;SHOULD BE <CR>
  893.     jp    z,pcmd1
  894.     call    ilprt
  895.     db    cr,lf,'Warning:  Remainder of Command Line after "@" Deleted',0
  896. pcmd1:
  897.     call    ilprt
  898.     db    cr,lf,dim,'Command --',bright,cr,lf,0
  899.     ld    hl,(inbuf)    ;COPY INTO INBUF
  900.     ex    de,hl
  901.     ld    hl,(pinbuf)    ;GET PREVIOUS COMMAND
  902. pcmd2:
  903.     ld    a,(hl)        ;GET CHAR
  904.     ld    (de),a        ;PUT CHAR
  905.     inc    hl        ;PT TO NEXT
  906.     inc    de
  907.     cp    cr        ;END OF LINE?
  908.     push    af        ;SAVE FLAG
  909.     call    type        ;PRINT CHAR
  910.     pop    af        ;GET FLAG
  911.     jp    nz,pcmd2
  912.     ld    a,lf        ;<LF>
  913.     call    type
  914.     ld    hl,(inbuf)    ;RESTART COMMAND PROCESSING
  915.     jp    prmpti        ;INCLUDE LOOP CAPABILITY
  916. ;
  917. ;COMMAND:  :
  918. ;Define or Print Macro
  919. ;:n<text> Defines Macro n, 0<=n<=9; ::n Prints Macro n, 0<=n<=9
  920. ;
  921. mac:
  922.     ld    a,(hl)        ;GET NEXT CHAR
  923.     call    upcase        ;CAPITALIZE
  924.     cp    'P'        ;PRINT MACRO?
  925.     jp    nz,macrod    ;IF NOT, DEFINE MACRO
  926.     inc    hl        ;PT TO MACRO NUMBER
  927.     ld    a,(hl)        ;GET IT
  928.     call    upcase        ;CAPITALIZE
  929.     cp    '@'        ;PRINT PREVIOUS COMMAND?
  930.     jp    z,pcpr
  931.     push    af        ;SAVE A
  932.     call    cls
  933.     call    z,crlf
  934.     call    ilprt
  935.     db    dim,'Macro Definitions --',bright,0
  936.     pop    af        ;GET A
  937.     cp    'A'        ;PRINT ALL MACROS?
  938.     jp    z,amacpr
  939.     call    mnum        ;CHECK FOR VALID NUMBER AND RETURN # IN D
  940.     inc    hl        ;PT TO CHAR AFTER MACRO NUMBER
  941.     call    macpr        ;PRINT MACRO WHOSE NUMBER IS IN D
  942.     jp    prompt
  943. ;
  944. ;Print Previous Command
  945. ;
  946. pcpr:
  947.     inc    hl        ;PT TO CHAR AFTER '@'
  948.     ld    de,prompt    ;SET UP RET ADR
  949.     push    de        ;RETURN ADR ON STACK
  950.     push    hl        ;SAVE PTR
  951.     call    ilprt
  952.     db    dim,'Previous Command Line Definition --',bright
  953.     db    cr,lf,'@: ',0
  954.     ld    hl,(pinbuf)    ;PT TO PREVIOUS COMMAND
  955.     jp    mprint        ;USE MACRO PRINT FACILITY
  956. ;
  957. ;Print All Macros
  958. ;
  959. amacpr:
  960.     inc    hl        ;PT TO CHAR AFTER 'A'
  961.     ld    d,0        ;SET FOR FIRST MACRO
  962. amprl:
  963.     call    macpr        ;PRINT MACRO WHOSE NUMBER IS IN D
  964.     inc    d        ;INCREMENT MACRO NUMBER
  965.     ld    a,d        ;GET VALUE
  966.     cp    10        ;DONE?
  967.     jp    nz,amprl
  968.     jp    prompt        ;CONTINUE PROCESSING
  969. ;
  970. ;Print Macro Whose Number (0-9) is in D
  971. ;
  972. macpr:
  973.     push    hl        ;SAVE PTR
  974.     call    ilprt        ;PRINT HEADER
  975.     db    cr,lf,dim,0
  976.     ld    a,d        ;GET NUMBER
  977.     add    a,'0'        ;CONVERT TO ASCII
  978.     call    type        ;PRINT
  979.     call    ilprt
  980.     db    ': ',bright,0
  981.     ld    hl,(mtabl)    ;PT TO TABLE OF MACROS
  982.     ld    e,0        ;PAGE OFFSET OF ZERO; MACRO NUMBER ALREADY IN D
  983.     add    hl,de        ;PT TO MACRO
  984. mprint:
  985.     ld    a,(hl)        ;GET CHAR
  986.     inc    hl        ;PT TO NEXT
  987.     cp    cr        ;END OF MACRO?
  988.     push    af        ;SAVE FLAG
  989.     call    type        ;PRINT CHAR
  990.     pop    af        ;GET FLAG
  991.     jp    nz,mprint
  992.     ld    a,lf        ;<LF>
  993.     call    type
  994.     pop    hl        ;GET PTR TO NEXT CHAR
  995.     ret
  996. ;
  997. ;Check char in A for valid Macro Number (0-9), print error message if
  998. ; not, return number in D if so
  999. ;
  1000. mnum:
  1001.     sub    '0'        ;CONVERT TO 0-9
  1002.     jp    c,mnerr        ;ERROR IF LESS
  1003.     cp    10        ;RANGE?
  1004.     jp    nc,mnerr
  1005.     ld    d,a        ;RESULT IN D
  1006.     ret
  1007. mnerr:
  1008.     call    ilprt
  1009.     db    cr,lf,'Invalid Macro Number Specified in Command',0
  1010.     jp    prmptr        ;NEW COMMAND
  1011. ;
  1012. ;Define Macro
  1013. ;
  1014. macrod:
  1015.     call    mnum        ;CHECK NUMBER AND RETURN IN D
  1016.     inc    hl        ;PT TO CHAR AFTER MACRO NUMBER
  1017.     push    hl        ;SAVE PTR
  1018.     ld    hl,(mtabl)    ;PT TO MACRO TABLE
  1019.     ld    e,0        ;SET EVEN PAGE
  1020.     add    hl,de        ;PT TO MACRO ENTRY IN HL
  1021.     ex    de,hl        ;... IN DE
  1022.     pop    hl        ;PT TO MACRO TEXT
  1023.     call    copycr        ;COPY TO <CR>
  1024.     jp    prmptr        ;NEW COMMAND
  1025. ;
  1026. ;COMMAND:  !
  1027.  
  1028. ;Delay for user input
  1029. ;
  1030. uwait:
  1031.     call    wait        ; USE WAIT ROUTINE
  1032.     jp    prompt
  1033. ;
  1034. ;COMMAND:  #
  1035. ;Print disk statistics
  1036. ;
  1037. stats:
  1038.     push    hl        ;SAVE POINTER TO NEXT COMMAND
  1039.     call    cls
  1040.     call    z,crlf
  1041.     call    ilprt
  1042.     db    dim
  1043.     db    '    -- Queue Information --    ',bright,cr,lf
  1044.     db    cr,lf
  1045.     db    0
  1046.     call    qstats        ;PRINT STATUS INFO
  1047.     call    ilprt
  1048.     db    cr,lf
  1049.     db    dim
  1050.     db    '    -- Disk  Information --    ',bright,cr,lf
  1051.     db    cr,lf
  1052.     db    dim,'Disk Drive:',tab,tab,bright,' ',0
  1053.     ld    a,(drive)
  1054.     add    a,'A'        ;CONVERT TO ASCII
  1055.     call    type        ;PRINT DRIVE LETTER
  1056.  
  1057.     call    ilprt
  1058.     db    cr,lf,dim,'Tracks: ',tab,tab,bright,' ',0
  1059.     ld    hl,(maxtrk)    ;PRINT NUMBER OF TRACKS
  1060.     inc    hl
  1061.     call    dec
  1062.  
  1063.     call    ilprt
  1064.     db    cr,lf,dim,'Sectors/Track:',tab,tab,bright,' ',0
  1065.     ld    hl,(spt)    ;PRINT NUMBER OF SECTORS/TRACK
  1066.     call    dec
  1067.  
  1068.     call    ilprt
  1069.     db    cr,lf,dim,'Blocks/Group:',tab,tab,bright,' ',0
  1070.     ld    a,(blm)        ;PRINT SIZE OF A GROUP
  1071.     inc    a
  1072.     ld    l,a
  1073.     ld    h,0
  1074.     call    dec
  1075.  
  1076.     call    ilprt
  1077.     db    cr,lf,dim,'Total Groups:',tab,tab,bright,' ',0
  1078.     ld    hl,(dsm)    ;PRINT TOTAL NUMBER OF GROUPS ON A DISK
  1079.     call    dec
  1080.  
  1081.     call    ilprt
  1082.     db    cr,lf,dim,'Directory Entries:',tab,bright,' ',0
  1083.     ld    hl,(drm)    ;PRINT NUMBER OF DIRECTORY ENTRIES
  1084.     inc    hl
  1085.     call    dec
  1086.  
  1087.     call    ilprt
  1088.     db    cr,lf,dim,'System Tracks:',tab,tab,bright,' ',0
  1089.     ld    hl,(systrk)    ;PRINT NUMBER OF SYSTEM TRACKS
  1090.     call    dec
  1091. ;    call    swait
  1092.     call    crlf        ; <crw>
  1093.     call    crlf        ; <crw>
  1094.     pop    hl        ;RESTORE POINTER TO NEXT COMMAND
  1095.     jp    prompt
  1096.  
  1097. ;
  1098. ;COMMAND:  N
  1099. ;The following command resets the disk
  1100. ;system thru CP/M, and may be usable for
  1101. ;changing the disk density or format.
  1102. ;This can only be done if your BIOS resets
  1103. ;the auto-density select parameters at
  1104. ;every track-zero access.
  1105. ;
  1106. newdsk:
  1107.     push    hl        ;SAVE POINTER TO NEXT LETTER
  1108.     ld    c,resetdk    ;BDOS RESET DISK FUNCTION
  1109.     call    bdos
  1110.     ld    a,(drive)    ;RESELECT CURRENT DRIVE
  1111.     ld    c,a
  1112.     pop    hl
  1113.     call    select
  1114.     jp    prompt
  1115. ;
  1116. ;COMMAND:  Q
  1117. ;Queue Control
  1118. ;
  1119. queuer:
  1120.     ld    a,(hl)        ;GET 2ND ARGUMENT
  1121.     call    upcase        ;CAPITALIZE
  1122.     cp    eolch        ;END OF LINE?
  1123.     jp    z,qstat        ;STATUS REPORT
  1124.     cp    cr        ;END OF LINE?
  1125.     jp    z,qstat
  1126.     inc    hl        ;PT TO AFTER KEY CHAR
  1127.     push    hl        ;SAVE PTR
  1128.     cp    'Z'        ;ZERO QUEUE?
  1129.     jp    z,qzero
  1130.     cp    'S'        ;SAVE QUEUE?
  1131.     jp    z,qfsave
  1132.     pop    hl        ;GET PTR
  1133.     call    ilprt
  1134.     db    'Invalid Queue Command',cr,lf,0
  1135.     jp    prmptr        ;ABORT LINE ON ERROR
  1136. ;
  1137. ;  Zero the Queue
  1138. ;
  1139. qzero:
  1140.     ld    hl,(direct)    ;ZERO QUEUE
  1141.     ld    (qnxt),hl    ;SET NEXT
  1142.     ld    (qlst),hl    ;SET LAST
  1143.     ld    hl,0        ;ZERO COUNT
  1144.     ld    (qcnt),hl
  1145.     pop    hl        ;GET PTR AND FALL THRU TO QSTAT
  1146. ;
  1147. ;  Print Status of Queue
  1148. ;
  1149. qstat:
  1150.     push    hl        ;SAVE PTR TO NEXT CHAR
  1151. ;    call    cls        ; <crw>
  1152.     call    z,crlf
  1153.     call    ilprt
  1154.     db    dim,'    -- Queue Information --    ',bright,cr,lf,cr,lf,0
  1155.     call    qstats        ;PRINT STATUS
  1156.     pop    hl        ;RESTORE PTR
  1157.     jp    prompt
  1158. qstats:
  1159.     ld    hl,(qcnt)    ;GET SIZE OF QUEUE
  1160.     call    prqcnt        ;PRINT DATA
  1161.     call    prqspac        ;PRINT SPACE AVAILABLE INFO
  1162.     call    ilprt
  1163.     db    dim,tab,tab,tab,'  ',bright,cr,lf
  1164.     db    dim,'Group Save Buffer Address:',bright,' ',0
  1165.     push    hl
  1166.     ld    hl,(gbuff)    ;BC=ADDRESS
  1167.     ld    b,h
  1168.     ld    c,l
  1169.     pop    hl
  1170.     call    hexb1        ;PRINT AS HEX
  1171.     call    ilprt
  1172.     db    ' Hex',cr,lf
  1173.     db    0
  1174.     call    ilprt
  1175.     db    dim,'Address of Head of Queue: ',bright,' ',0
  1176.     ld    hl,(qnxt)    ;PRINT ADDRESS OF HEAD OF QUEUE
  1177.     ld    b,h        ;... ADDRESS IN BC
  1178.     ld    c,l
  1179.     call    hexb1        ;PRINT IN HEX
  1180.     call    ilprt
  1181.     db    ' Hex',cr,lf
  1182.     db    dim,'Address of Tail of Queue: ',bright,' ',0
  1183.     ld    hl,(qlst)    ;PRINT ADDRESS OF TAIL OF QUEUE
  1184.     ld    b,h
  1185.     ld    c,l
  1186.     call    hexb1
  1187.     call    ilprt
  1188.     db    ' Hex',cr,lf,0
  1189.     ret
  1190. ;
  1191. ;  Print Amount of Space Left in Queue
  1192. ;
  1193. prqspac:
  1194.     call    ilprt
  1195.     db    dim,'Blocks left in Queue:',tab,'  ',bright,' ',0    ; <crw>
  1196.     ld    bc,-1        ;SET COUNT
  1197.     ld    hl,(qlst)    ;GET PTR TO QUEUE TAIL
  1198. qstat1:
  1199.     inc    bc        ;INCREMENT COUNT
  1200.     ld    de,80h        ;PT TO NEXT QUEUE ELEMENT
  1201.     add    hl,de
  1202.     ex    de,hl        ;WRAP AROUND
  1203.     call    qwrap
  1204.     ld    hl,(qnxt)    ;GET PTR TO FIRST ELEMENT
  1205.     ex    de,hl
  1206.     ld    a,h        ;COMPARE
  1207.     cp    d
  1208.     jp    nz,qstat1
  1209.     ld    a,l
  1210.     cp    e
  1211.     jp    nz,qstat1
  1212.     ld    h,b        ;HL=BLOCK COUNT
  1213.     ld    l,c
  1214.     call    dec        ;PRINT AS DECIMAL
  1215.     call    crlf
  1216.     ret
  1217. ;
  1218. ;  Save Queue as a File
  1219. ;
  1220. qfsave:
  1221.     ld    a,(hl)        ;GET FIRST CHAR OF FILE NAME
  1222.     cp    eolch        ;EOL?
  1223.     jp    z,what
  1224.     cp    cr        ;EOL?
  1225.     jp    z,what
  1226.     ld    de,fcb        ;START TO FILL FCB
  1227.     xor    a        ;A=0
  1228.     ld    (de),a        ;SELECT DEFAULT DRIVE
  1229.     inc    de        ;PT TO FILE NAME
  1230.     ld    b,8        ;SAVE FILE NAME
  1231.     call    mvname
  1232.     ld    b,3        ;SAVE FILE TYPE
  1233.     call    mvname
  1234.     push    hl        ;SAVE PTR TO NEXT CHAR
  1235.     ld    hl,(qcnt)    ;ANY ELEMENTS IN QUEUE?
  1236.     ld    a,h
  1237.     or    l
  1238.     jp    z,qempty
  1239.     push    hl        ;SAVE QUEUE COUNT
  1240.     call    norite        ;CAN'T WRITE NOW
  1241.     ld    de,fcb        ;PT TO FCB
  1242.     call    fcbinit        ;INIT FCB
  1243.     ld    c,delf        ;DELETE FILE
  1244.     push    de        ;SAVE DE
  1245.     call    bdos
  1246.     pop    de
  1247.     call    fcbinit        ;INIT FCB AGAIN
  1248.     ld    c,makef        ;CREATE FILE
  1249.     call    bdos
  1250.     pop    bc        ;GET QUEUE COUNT IN BC
  1251.     ld    hl,(qnxt)    ;PT TO NEXT BLOCK IN QUEUE
  1252. qfs1:
  1253.     push    bc        ;SAVE COUNT
  1254.     ld    de,tbuff    ;COPY INTO TBUFF
  1255.     ld    b,128        ;128 BYTES
  1256.     call    move
  1257.     ex    de,hl        ;PT TO NEXT QUEUE BLOCK IN DE
  1258.     call    qwrap        ;WRAP AROUND
  1259.     push    de        ;SAVE PTRS
  1260.     ld    de,fcb        ;PT TO FCB
  1261.     ld    c,writef    ;WRITE BLOCK TO FILE
  1262.     call    bdos
  1263.     pop    hl        ;GET PTR TO NEXT BLOCK
  1264.     pop    bc        ;GET COUNT
  1265.     dec    bc        ;COUNT DOWN
  1266.     ld    a,b        ;DONE?
  1267.     or    c
  1268.     jp    nz,qfs1
  1269.     ld    de,fcb        ;CLOSE FILE
  1270.     ld    c,closef
  1271.     call    bdos
  1272.     call    ilprt
  1273.     db    'Queue Saved in File',cr,lf,0
  1274.     pop    hl        ;PT TO NEXT CHAR
  1275.     jp    prompt
  1276. fcbinit:
  1277.     push    de        ;SAVE PTR
  1278.     ld    hl,12        ;SKIP TO EX FIELD
  1279.     add    hl,de
  1280.     ld    b,24        ;ZERO 36 BYTES
  1281.     xor    a        ;A=0
  1282. fcbin1:
  1283.     ld    (hl),a        ;STORE ZEROES
  1284.     inc    hl
  1285.     djnz    fcbin1
  1286.     pop    de        ;RESTORE PTR
  1287.     ret
  1288. ;
  1289. ;COMMAND:  *
  1290. ;Repeat buffer contents
  1291. ;
  1292. repeat:
  1293.     call    decin        ;NN SPECIFIED?
  1294.     ld    a,d
  1295.     or    e
  1296.     jp    z,nnn        ;NO -- SET FOR INFINITE LOOP OR SIMPLE REPEAT
  1297.     ld    hl,(togo)    ;LOAD LOOP FLAG
  1298.     inc    hl        ;TEST FOR FIRST TIME
  1299.     ld    a,h
  1300.     or    l        ;WAS IT 0FFFFH?; IF SO, WE HAVE NEW VALUE
  1301.     jp    nz,nnn        ;NO: COUNTING
  1302.     ex    de,hl        ;GET COUNT
  1303.     ld    (togo),hl    ;SET COUNT
  1304. ;
  1305. nnn:
  1306.     ld    hl,(togo)    ;GET CURRENT COUNT
  1307.     ex    de,hl        ;DE=CURRENT COUNT, HL=COUNT LIMIT
  1308.     ld    hl,(inbuf)    ;PT TO FIRST CHAR FOR REPEAT
  1309.     inc    de        ;TEST FOR 0FFFFH
  1310.     ld    a,d        ;IF 0FFFFH, INX D MADE DE=0
  1311.     or    e
  1312.     jp    z,prompt    ;CONTINOUS LOOP IF 0FFFFH
  1313.     dec    de        ;COUNT DOWN
  1314.     dec    de        ;MAKE UP FOR PREV INX D
  1315.     ex    de,hl
  1316.     ld    (togo),hl    ;SET NEW COUNT (1 LESS THAN BEFORE)
  1317.     ld    a,h        ;ALL DONE?
  1318.     or    l
  1319.     ex    de,hl        ;GET BACK INBUF PTR IN HL
  1320.     jp    nz,prompt    ;KEEP GOING IF NOT YET ZERO
  1321.     jp    prmptr        ;ALL DONE
  1322. ;
  1323. ;COMMAND:  U
  1324. ;Set CP/M 2.x user number
  1325. ;
  1326. user:
  1327.     call    decin        ;GET REQUESTED USER NO.
  1328.     ld    a,(muser)    ;GET MAX USER
  1329.     inc    a        ; to MAX USER+1 <crw>
  1330.     ld    b,a        ;... IN B
  1331.     ld    a,e        ; input # in E
  1332.     cp    b        ;VALID?
  1333.     jp    nc,usrerr
  1334.     ld    a,d        ;HIGH-ORDER BYTE MUST BE ZERO FOR VALID NUMBER
  1335.     or    a
  1336.     jp    nz,usrerr
  1337.     ld    a,e        ;SAVE USER NUMBER
  1338.     ld    (unum),a
  1339.     ld    c,suser        ;SET USER NUMBER
  1340.     push    hl        ;SAVE CHAR POINTER
  1341.     call    bdos        ;SET USER NO.
  1342.     pop    hl
  1343.     jp    prompt
  1344. usrerr:
  1345.     call    ilprt
  1346.     db    'User Number Out of Range',cr,lf,0
  1347.     jp    prmptr
  1348. ;
  1349. ;COMMAND:  P
  1350. ;Toggle print flag
  1351. ;
  1352. prntff:
  1353.     ld    a,(pflag)    ;TOGGLE PRINT FLAG
  1354.     xor    1
  1355.     ld    (pflag),a
  1356.     jp    prompt
  1357. ;
  1358. ;COMMAND:  Z
  1359. ;Sleep routine, in seconds
  1360. ;
  1361. sleep:
  1362.     call    decin        ;GET COUNT IF ANY
  1363.     ld    a,e        ;ANY?
  1364.     or    a
  1365.     jp    nz,sleplp
  1366.     ld    e,1        ; 1 SEC DEFAULT
  1367. ;
  1368. sleplp:
  1369.     ld    a,(clock)    ; GET CLOCK SPEED
  1370.     ld    d,a
  1371. ;
  1372. sleep1:
  1373.     ld    bc,41700    ; APPROX 1 SEC @ 1MHz
  1374. ;
  1375. sleep2:
  1376.     dec    bc        ;COUNT DOWN FOR 1 MHz [5 CYCLES]
  1377.     ld    a,b        ;[5 CYCLES] <-- TOTAL TIME: 24 CYCLES
  1378.     or    c        ;[4 CYCLES] <-- (24 MU-SECS AT 1MHz)
  1379.     jp    nz,sleep2    ;[10 CYCLES]
  1380.     push    de
  1381.     call    ctlcs        ;ABORT?
  1382.     pop    de
  1383.     jp    z,prmptr
  1384.     dec    d        ;COUNT DOWN FOR CLOCK SPEED
  1385.     jp    nz,sleep1
  1386.     dec    e        ;COUNT DOWN NUMBER OF REQUESTED SECONDS
  1387.     jp    nz,sleplp
  1388.     jp    prompt
  1389. ;
  1390. ;Check for control-C or S
  1391. ;
  1392. ctlcs:
  1393.     call    const        ;CHAR AVAILABLE?
  1394.     or    a
  1395.     jp    nz,getc
  1396.     or    1        ;NO CHAR, RETURN NZ
  1397.     ret
  1398. ;
  1399. getc:    call    conin        ;INPUT CHAR
  1400.     and    1fh        ;ALLOW ASCII
  1401.     cp    'S'-40h        ;WAIT FOR NEXT CHAR IF ^S OR S OR s
  1402.     call    z,conin
  1403.     cp    'C'-40h        ;CHECK FOR ^C OR C OR c
  1404.     ret            ;0 SET IF CTL-C
  1405. ;
  1406. ;Initialize Memory Buffers
  1407. ;
  1408. initp:
  1409.     xor    a        ;A=0
  1410.     ld    (hexad),a    ;CLEAR ADDRESS
  1411.     ld    (hexad+1),a
  1412.     ld    (pflag),a    ;SET NO PRINT
  1413.     ld    (savefl),a    ;SET NO SAVE DONE
  1414.     ld    (wrflg),a    ;MAY NOT WRITE
  1415.     ld    (dirpos),a    ;SET NO DIRECTORY POSITION
  1416.     ld    (findfl),a    ;SET NO POSITION
  1417.     inc    a        ;A=1
  1418.     ld    (ftsw),a    ;SET SEARCH WITHOUT INCREMENT
  1419.     ld    (notpos),a    ;NOT POSITIONED
  1420.     ld    hl,0        ;HL=0
  1421.     ld    (qcnt),hl    ;SET NO ELEMENTS IN QUEUE
  1422.     ld    (mfptr),hl    ;SET NO MULTI FILE PTR
  1423.     ld    (curtrk),hl    ;SET TRACK 0
  1424.     inc    hl        ;HL=1
  1425.     ld    (cursec),hl    ;SET LOGICAL SECTOR 1
  1426.     ld    (physec),hl    ;SET PHYSICAL SECTOR 1
  1427.     ld    hl,(pinbuf)    ;SET PREVIOUS COMMAND TO NIL
  1428.     ld    (hl),cr        ;CLEAR PREVIOUS COMMAND
  1429.     ld    hl,(direct)    ;SET FIRST AND LAST QUEUE ELEMENT PTRS
  1430.     ld    (qnxt),hl
  1431.     ld    (qlst),hl
  1432.     ld    hl,(mtabl)    ;CLEAR MACRO TABLE
  1433.     ld    b,10        ;10 ENTRIES
  1434.     ld    de,imac0    ;point to beginning of default macro table
  1435.  
  1436. initp1:    push    hl        ;save pointer to start of each macro
  1437.  
  1438. initp2:    ld    a,(de)        ;get next initial macro character
  1439.     ld    (hl),a        ;store it in macro table
  1440.     inc    de
  1441.     inc    hl
  1442.     cp    cr        ;end of macro?
  1443.     jp    nz,initp2
  1444.  
  1445.     pop    hl        ;retrieve pointer to start of this macro
  1446.     dec    b        ;see if we've done all macros
  1447.     ret    z        ;if so, return
  1448.     inc    h        ;point to next macro
  1449.     jp    initp1
  1450. ;
  1451. ;Set up flags, etc, at initialization
  1452. ;Find our way at initialization
  1453. ;
  1454. getstp:
  1455.     push    hl
  1456.     ld    hl,(inbuf)    ;PT TO INPUT BUFFER
  1457.     ld    (hl),cr        ;INITIALIZE INPUT BUFFER
  1458.     pop    hl
  1459.     ld    c,suser        ;GET USER NUMBER
  1460.     ld    e,0ffh        ;GET USER
  1461.     call    bdos
  1462.     ld    (unum),a    ;SET USER NUMBER
  1463.     ld    c,getdsk
  1464.     call    bdos        ;GET CURRENT DISK
  1465.     ld    c,a        ;WE HAVE TO SELECT
  1466.     jp    select        ;TO GET THE DPH
  1467. ;
  1468. ;COMMAND:  L
  1469. ;Log in the selected disk
  1470. ;
  1471. login:
  1472.     call    dolog
  1473.     jp    prompt
  1474. ;
  1475. dolog:
  1476.     ld    a,(hl)        ;DISK REQUESTED?
  1477.     ld    de,0
  1478.     cp    cr        ;NO REQUEST OF PHYSICAL EOL
  1479.     jp    z,lgnodk
  1480.     cp    eolch        ;NO REQUEST IF LOGICAL EOL
  1481.     jp    z,lgnodk
  1482.     call    upcase        ;CAPITALIZE
  1483.     inc    hl        ;POINT TO NEXT CHAR
  1484.     sub    'A'        ;CONVERT TO 0-15
  1485.     ld    c,a        ;DISK NUMBER IN C
  1486.     ld    a,(mdisk)    ;GET MAX DISK
  1487.     ld    b,a        ;... IN B
  1488.     ld    a,c
  1489.     cp    b
  1490.     jp    c,select
  1491.     call    ilprt
  1492.     db    'Disk Letter Out of Range',cr,lf,0
  1493.     jp    prmptr
  1494. ;
  1495. ;Select Disk Whose Number is in C (A=0, B=1, etc)
  1496. ;
  1497. select:
  1498.     push    hl        ;SAVE PTR TO NEXT COMMAND LETTER
  1499.     ld    a,c
  1500.     ld    (drive),a    ;REMEMBER LATER WHERE WE ARE
  1501. ;
  1502. vseldk: call    $-$        ;ADDR FILLED IN BY 'INIT'
  1503.     ld    a,h
  1504.     or    l
  1505.     jp    z,what        ;SELECT ERROR
  1506.     ld    e,(hl)        ;GET THE SECTOR TABLE PNTR
  1507.     inc    hl
  1508.     ld    d,(hl)
  1509.     inc    hl
  1510.     ex    de,hl
  1511.     ld    (sectbl),hl    ;SET THE SECTOR TABLE PTR
  1512.     ld    hl,8        ;OFFSET TO DPBPTR
  1513.     add    hl,de
  1514.     ld    a,(hl)        ;PICK UP DPB POINTER
  1515.     inc    hl        ;  TO USE
  1516.     ld    h,(hl)        ;  AS PARAMETER
  1517.     ld    l,a        ;  TO LOGIT
  1518.     call    logit
  1519.     ld    hl,(systrk)    ;RESET TRACK AND SECTOR
  1520.     ex    de,hl        ;  TO DIRECTORY
  1521.     call    settrk        ;  ON EVERY
  1522.     ld    de,1        ;  LOGIN
  1523.     call    setsec        ;  CHANGE
  1524.     ld    hl,(physec)    ;THIS LOGIC WILL TELL
  1525.     ld    a,h        ;  IF FIRST SEC
  1526.     or    l        ;  IS PHYSICAL 0
  1527.     ld    (first0),a
  1528.     call    clcsub        ;CALCULATE WHAT GROUP/GRPDISP WE ARE IN
  1529.     pop    hl        ;GET PTR TO NEXT LETTER
  1530. ;
  1531. lgnodk:
  1532.     call    norite        ;SET NO DISK I/O DONE (NO POSITION)
  1533.     ret
  1534. ;
  1535. ;COMMAND:  <
  1536. ;Save the current sector
  1537. ;    Special Form of <S saves current block onto queue
  1538. ;    Special Form of <G saves indicated group onto queue
  1539. ;
  1540. save:
  1541.     ld    a,(wrflg)    ;READ DONE?
  1542.     or    a
  1543.     jp    z,badw        ;NONE TO SAVE
  1544.     ld    a,(hl)        ;CHECK FOR 'S'
  1545.     call    upcase        ;CAPITALIZE
  1546.     cp    'B'        ;BLOCK SAVE
  1547.     jp    z,qsav        ;SAVE ON STACK
  1548.     cp    'G'        ;GROUP SAVE
  1549.     jp    z,saveg
  1550.     push    hl
  1551.     ld    hl,(savbuf)    ;PT TO SAVBUF
  1552.     ex    de,hl        ;COPY INTO SAVBUF
  1553.     ld    hl,tbuff    ;FROM TBUFF
  1554.     ld    b,128        ;128 BYTES
  1555.     call    move
  1556.     ld    a,1        ;..SHOW
  1557.     ld    (savefl),a    ;..SAVED EXISTS
  1558.     pop    hl        ;GET PTR TO NEXT CHAR
  1559.     jp    prompt
  1560. ;
  1561. ;  Save Block on Queue
  1562. ;
  1563. qsav:
  1564.     inc    hl        ;SKIP OVER 2ND <
  1565.     push    hl        ;SAVE PTR TO NEXT CHAR
  1566.     ld    hl,(qlst)    ;SEE IF ANOTHER SAVE WILL FILL QUEUE
  1567.     ld    de,128        ;SET HL TO PT TO END OF NEXT SECTOR IN QUEUE
  1568.     add    hl,de
  1569.     ex    de,hl        ;DE PTS TO END OF NEXT BLOCK
  1570. qsav0:
  1571.     ld    hl,(qnxt)    ;SEE IF QUEUE IS FULL NOW
  1572.     ld    a,h        ;MAY BE SAME
  1573.     cp    d
  1574.     jp    nz,qsav1
  1575.     ld    a,l        ;MAY NOT BE SAME
  1576.     cp    e
  1577.     jp    z,qsav2        ;QUEUE IS FULL, SO ABORT
  1578. qsav1:
  1579.     ld    hl,(qlst)    ;GET PTR TO LAST QUEUE ELEMENT
  1580.     ex    de,hl        ;... IN DE
  1581.     ld    hl,tbuff    ;COPY FROM TBUFF
  1582.     ld    b,128        ;128 BYTES
  1583.     call    move
  1584.     call    qwrap        ;CHECK FOR WRAP AROUND
  1585.     ex    de,hl        ;HL PTS TO NEW LAST QUEUE POSITION
  1586.     ld    (qlst),hl    ;SAVE HL
  1587.     ld    hl,(qcnt)    ;INCREMENT SECTOR COUNT
  1588.     inc    hl
  1589.     ld    (qcnt),hl
  1590.     call    prqcnt        ;PRINT QUEUE COUNT
  1591.     pop    hl        ;PT TO NEXT CHAR
  1592.     jp    prompt
  1593. qsav2:
  1594.     call    ilprt
  1595.     db    'Block Queue is Full -- Block Not Saved',cr,lf,0
  1596.     ld    hl,(qcnt)    ;GET COUNT
  1597.     call    prqcnt        ;PRINT COUNT
  1598.     pop    hl        ;PT TO NEXT CHAR
  1599.     jp    prmptr
  1600. ;
  1601. ;  PRINT NUMBER OF ELEMENTS IN QUEUE
  1602. ;
  1603. prqcnt:
  1604.     call    ilprt
  1605.     db    dim,'Blocks in Queue:',tab,'  ',bright,' ',0
  1606.     call    dec        ;PRINT AS DECIMAL
  1607.     call    crlf
  1608.     ret
  1609. ;
  1610. ;  CHECK TO SEE IF QUEUE ELEMENT PTED TO BY DE SHOULD BE WRAPPED AROUND
  1611. ;    ON EXIT, DE PTS TO QUEUE ELEMENT WITH WRAP AROUND
  1612. ;
  1613. qwrap:
  1614.     ld    hl,(bdos+1)    ;CHECK FOR WRAP AROUND
  1615.     ld    a,h
  1616.     sub    10        ;BELOW CCP
  1617.     cp    d        ;WRAP AROUND IF EQUAL
  1618.     ret    nz
  1619.     ex    de,hl
  1620.     ld    hl,(direct)    ;NEXT ELEMENT IS HERE
  1621.     ex    de,hl        ;... IN DE
  1622.     ret
  1623. ;
  1624. ;This routine is common to Save Group (RG) and Write Group (WG); it is used
  1625. ;  to extract the group number, check it, and position DU3 to it
  1626. ;  On exit, GROUP = Group Number, GRPDIS = 0, and DU3 is positioned
  1627. ;
  1628. comg:
  1629.     inc    hl        ;PT TO CHAR AFTER 'G' OF '<G' COMMAND
  1630.     push    hl        ;SAVE PTR TO NEXT CHAR
  1631.     ld    a,(hl)        ;GET CHAR AFTER 'G'
  1632.     ld    hl,(group)    ;GET CURRENT GROUP
  1633.     call    upcase        ;CAPITALIZE
  1634.     cp    eolch        ;CURRENT IF LOGICAL EOL
  1635.     jp    z,comg1
  1636.     cp    cr        ;CURRENT IF PHYSICAL EOL
  1637.     jp    z,comg1
  1638.     pop    hl        ;RESTORE PTR    -jgm
  1639.     call    hexin        ;GET GROUP NUMBER IN HEX
  1640.     push    hl        ;SAVE PTR AGAIN    -jgm
  1641.     ld    hl,(dsm)    ;CHECK FOR BOUNDS ERROR
  1642.     call    subde        ;SUBTRACT GROUP NUMBER FROM DSM
  1643. ;    POP    H    ;RESTORE PTR
  1644.     jp    c,outlim    ;LIMIT ERROR IF CARRY
  1645. ;    PUSH    H    ;SAVE PTR AGAIN
  1646.     ex    de,hl        ;SAVE GROUP NUMBER
  1647.     ld    (group),hl
  1648. comg1:
  1649.     ld    (tgrp),hl    ;TEMPORARY GROUP NUMBER
  1650.     ex    de,hl        ;GROUP NUMBER IN DE
  1651.     xor    a        ;A=0
  1652.     ld    (grpdis),a    ;SET GROUP DISPLACEMENT
  1653.     call    gtksec        ;CONVERT GROUP NUMBER TO TRACK AND SECTOR
  1654.     call    settrk        ;SET TRACK
  1655.     ex    de,hl
  1656.     call    setsec        ;SET SECTOR
  1657.     pop    hl        ;GET PTR TO NEXT CHAR
  1658.     ret
  1659.  
  1660.  
  1661. ; END DU314-01.Z80
  1662.  
  1663.