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 / ENTERPRS / CPM / UTILS / F / QL41.ARK / QL.002 < prev    next >
Text File  |  1990-04-13  |  47KB  |  2,224 lines

  1. ;.....
  2. ;
  3. ; (...Cont. from QL.001)
  4.  
  5. ;.....
  6. ;
  7. ; we're no longer working with a compressed file
  8. ; normal, unsq    & uncr all come here
  9. ; if we were extracting, go finish up, else
  10. ; find eof marker: only look in last sector read
  11. ; if no eof found, put one in at end of last sector
  12. ;
  13. FINDEOF:
  14.     LD    A,(EXTRACTING)    ; Were we extracting?
  15.     OR    A
  16.     JP    NZ,EXTRDONE    ; ***
  17.  
  18.     EX    DE,HL        ; Last dma now in HL
  19.     LD    BC,128
  20.     XOR    A        ; Clr cy
  21.     SBC    HL,BC        ; HL=start of last sector read
  22.     LD    A,EOF
  23.     CPIR            ; Look for eof thru 128 bytes
  24.     JR    Z,GOTEOF    ; Eof found
  25.     LD    (HL),A        ; Else put in our own eof marker
  26.                 ; Probably leaves some garbage at eof
  27.  
  28. GOTEOF:    LD    (EOFADR),HL    ; Save highest used adr
  29.     XOR    A        ; Clr cy
  30.     LD    DE,(BUFPTR)
  31.     SBC    HL,DE
  32.     LD    (FILELEN),HL    ; Save actual file len in bytes
  33.  
  34. ; chk if we really have a text file
  35. ; assume it's text:
  36. ;   IF the 1st byte is between 20h and 7fh or cr, lf or tab or formfeed
  37. ;   AND 90% of 1st 100 chars are printable (for wordstar hi bits)
  38. ; if text, set ptrs to 1 char past every 22nd lf in buffer
  39. ; else, set up for hex/ascii dumping instead of chaos of earlier versions
  40. ;   by setting ptrs to every 256 bytes of buffer
  41. ;
  42. ; 1st see if we really have a text file
  43. ;
  44.     LD    HL,(BUFPTR)
  45.     LD    A,(HL)
  46.     CALL    CHKOKCTRLS    ; Cr,lf,tab?
  47.     JR    Z,CHKTEXT    ; Text so far
  48.     CP    ' '
  49.     JR    C,ISNONTEXT    ; Ctrl char 1st
  50.     CP    7FH+1        ; This screens common init 0c3h
  51.     JR    NC,ISNONTEXT
  52.  
  53. CHKTEXT:
  54.     LD    B,100        ; # to scan
  55.     LD    C,0        ; Count of non-text chars
  56.  
  57. WASTEXT:
  58.     LD    A,(HL)
  59.     INC    HL
  60.     AND    7FH        ; Mask to ascii
  61.     CALL    CHKOKCTRLS
  62.     JR    Z,TEXTCH
  63.     CP    ' '        ; Some kind of ctrl char?
  64.     JR    NC,TEXTCH
  65.     INC    C        ; Non-text++
  66.  
  67. TEXTCH:    DJNZ    WASTEXT
  68.  
  69.     LD    A,C        ; Non-text count
  70.     CP    10        ; If < 10/100 are non-text,
  71.     JR    C,ISTEXT    ; It really is a text file
  72.  
  73. ;.....
  74. ;
  75. ; setup for a non-text file
  76. ;
  77. ISNONTEXT:
  78.     XOR    A
  79.     LD    (AFLAG),A
  80.     CALL    TOGLA
  81.  
  82.     LD    HL,(FILELEN)
  83.     LD    A,L
  84.     OR    A
  85.     LD    A,H        ; # of 256 byte pgs
  86.     JR    Z,EVENPG    ; Even page boundary
  87.     INC    A        ; For overage
  88.  
  89. EVENPG:    LD    (HIPG),A
  90.  
  91. ; set pg ptrs to every 256 bytes of buffer
  92.  
  93.     LD    B,A
  94.     LD    DE,(BUFPTR)
  95.     DEC    DE
  96.     LD    HL,(@PTRTBL)
  97.  
  98. SETPP:    LD    (HL),E
  99.     INC    HL
  100.     LD    (HL),D
  101.     INC    HL
  102.     INC    D        ; += 256 bytes
  103.     DJNZ    SETPP
  104.  
  105.     JP    STICKINEOF    ; Stick in eof adr for last pg finds
  106.                 ; -  and print page 1
  107.  
  108. ;................................
  109. ;                ;
  110. CHKOKCTRLS:            ; Subr to chk for ctrl chars ok in a text file
  111.     CP    TAB        ; Ret with Z set if tab,cr,lf,ff, or eof
  112.     RET    Z        ;
  113.     CP    CR        ;
  114.     RET    Z        ;
  115.     CP    FF        ;
  116.     RET    Z        ;
  117.     CP    LF        ;
  118.     RET    Z        ;
  119.     CP    1AH        ;
  120.     RET            ;
  121. ;...............................;
  122. ;.....
  123. ; Setup for a text file
  124. ;
  125. ; distinguish ws doc files by looking for 1st page break: 8ah
  126. ; if prev ch is 0dh or 8dh, assume it to be ws doc
  127. ;
  128. ISTEXT:    LD    A,0FFH        ;
  129.     LD    (AFLAG),A    ; Mark non-text flag false
  130.     CALL    TOGLA        ;
  131.     LD    (WSDOC),A    ;
  132.  
  133.     LD    HL,(BUFPTR)
  134.     LD    BC,(FILELEN)
  135.     LD    A,8AH        ; 1st possible ws doc pg break
  136.     CPIR
  137.     JP    PO,NOPGBRK    ; None found
  138.     DEC    HL
  139.  
  140. STILLLF:
  141.     DEC    HL        ; Back up to prev cr
  142.     LD    A,(HL)
  143.     AND    7FH
  144.     CP    LF
  145.     JR    Z,STILLLF    ; Skip if double sp
  146.  
  147.     CP    CR
  148.     JR    NZ,NOPGBRK    ; 8ah not preceded by 0dh or 8dh
  149.  
  150. ; it's a real pg break: go thru file and chg all 8ah to temp 0ah
  151. ; push adrs on stk so we can restore later
  152.  
  153.     LD    A,0FFh
  154.     LD    (WSDOC),A
  155.  
  156.     LD    HL,0
  157.     PUSH    HL        ; Flag top of stk
  158.  
  159.     LD    HL,(BUFPTR)
  160.     LD    BC,(FILELEN)
  161.     LD    A,8AH
  162.  
  163. FIND8AHNEXT:
  164.     CPIR            ; Look for 8ah to chg
  165.     JP    PO,NOPGBRK    ; All 8ah chg to 0ah
  166.     DEC    HL        ; HL now *8ah
  167.     PUSH    HL        ; Save adr on stk for later
  168.                 ; No stk overflow chking done??
  169.     LD    (HL),LF        ; Chg to real lf
  170.     INC    HL
  171.     JR    FIND8AHNEXT
  172.  
  173. ; set pg ptrs to ch following every 22nd lf
  174.  
  175. NOPGBRK:
  176.     LD    DE,(BUFPTR)    ;
  177.     LD    HL,(@PTRTBL)    ;
  178.     LD    (HL),E        ;
  179.     INC    HL        ;
  180.     LD    (HL),D        ;
  181.     INC    HL        ;
  182.     EX    DE,HL        ;
  183.  
  184.     LD    HL,(BUFPTR)    ; Point to front of file
  185.     LD    BC,(FILELEN)    ; Get actual file len
  186.     LD    IX,0        ; Pg ctr
  187.  
  188. SET1:    LD    A,(DISPLAY)    ; Usually every 22 lines
  189.  
  190. SET2:    PUSH    AF        ; Save line ctr
  191.     LD    A,LF
  192.     CPIR            ; Look for LF
  193.     JP    PO,SETDONE    ; BC = 0 = last lf before eof
  194.     POP    AF        ; Line ctr
  195.     DEC    A        ; Is this the 22nd line?
  196.     JR    NZ,SET2        ; Not a pg break
  197.  
  198. ; at pg break, store adr of start of next pg
  199.  
  200.     EX    DE,HL        ; DE=adr to store, HL=*ptrtbl
  201.     LD    (HL),E        ; Store lo adr of pg ptr
  202.     INC    HL
  203.     LD    (HL),D        ; Store hi adr
  204.     INC    HL
  205.     EX    DE,HL        ; Rst ptrs
  206.  
  207.     INC    IX        ; Pg++
  208.  
  209. ; chk for > 255 pgs NOT implemented
  210.  
  211.     JR    SET1
  212.  
  213. SETDONE:
  214.     POP    BC        ; B = line ctr fr stk
  215.     LD    A,(DISPLAY)
  216.     SUB    B        ; 22 - last line
  217.     JR    NZ,PARTIALPG    ;
  218.     LD    A,B        ; Display - 1
  219.     JR    NOPARTIALPG    ; This partial is really a full pg
  220. PARTIALPG:
  221.     INC    IX        ; For last partial pg
  222.  
  223. NOPARTIALPG:
  224.     LD    (LASTPGLINES),A    ; Moved down to here
  225.     PUSH    IX        ; Pg ctr
  226.     POP    HL
  227.     LD    A,L        ; Max 255 pgs allowed
  228.     LD    (HIPG),A    ; Save highest pg #
  229.  
  230. ; stick in eof adr for last pg finds
  231.  
  232.     LD    HL,(EOFADR)
  233.     EX    DE,HL
  234.  
  235. STICKINEOF:
  236.     LD    (HL),E
  237.     INC    HL
  238.     LD    (HL),D
  239.  
  240.     LD    A,(AFLAG)
  241.     OR    A
  242.     JR    NZ,PRPG1    ; Skip this text stuff if in non-text
  243.  
  244. ; if ws doc, restore 8ah removed before, adrs on stk
  245.  
  246.     LD    A,(WSDOC)
  247.     OR    A
  248.     JR    Z,PRPG1        ; Not ws doc
  249.  
  250. ; do the restore until we pop 0000 flag
  251.  
  252.     LD    B,8AH
  253.  
  254. POP8AHNEXT:
  255.     POP    HL        ; Adr where 8ah was before
  256.     LD    A,H
  257.     OR    L        ; At top of stk flag?
  258.     JR    Z,PRPG1        ; Yes, done
  259.     LD    (HL),B        ; Replace 8ah
  260.     JR    POP8AHNEXT
  261.  
  262. PRPG1:    LD    A,1
  263.     LD    (PAGE),A    ; Force pg 1 & print it
  264.  
  265. ; print the current page
  266.  
  267. PRPG:    CALL    CLEARSCREEN
  268.  
  269. ; chk for pg # beyond eof
  270.  
  271.     LD    A,(HIPG)
  272.     LD    B,A
  273.     LD    A,(PAGE)
  274.     CP    B        ; Pg # too big?
  275.     JR    C,PGNUMOK    ; No
  276.     LD    A,B
  277.     LD    (PAGE),A    ; Else, set highest pg num
  278.  
  279. ; chk if doing hex/ascii dump
  280.  
  281. PGNUMOK:
  282.     LD    A,(AFLAG)
  283.     OR    A        ; Non-text mode?
  284.     LD    A,(PAGE)
  285.     JR    Z,PRTEXT    ; No, do text
  286.     CALL    HEXASCII    ; Else, dump 256 bytes like ddt
  287.     JP    GETCMD
  288.  
  289. PRTEXT:    LD    L,A
  290.     LD    H,0
  291.     DEC    HL        ; Pg 1 is ptd to by 0'th ptr
  292.     ADD    HL,HL        ; *2 for word adr
  293.     LD    DE,(@PTRTBL)    ;
  294.     ADD    HL,DE        ; *start adr of pg we want
  295.     LD    E,(HL)        ; Lo pg adr
  296.     INC    HL
  297.     LD    D,(HL)        ; Hi pg adr
  298.     EX    DE,HL        ; HL = adr of pg we want
  299.     LD    a,(NLINES)    ;
  300.     LD    B,A        ; Lines/pg ctr, faster than cp adrs
  301.     DEC    B
  302.  
  303. ; B has # of lines to dump
  304.  
  305. PUTNEXT:
  306.     LD    A,(FOUND)
  307.     OR    A        ; Are we marking found $?
  308.     JR    Z,PUT1NEXT    ; No
  309.  
  310.     CALL    ATMATCHADR    ; Are we at the found $ yet?
  311.     JR    NZ,PUT1NEXT    ; No
  312.  
  313. ; start hilite of found $
  314.  
  315.     PUSH    BC        ; Save line ctr
  316.     CALL    ONHILITE    ;
  317.     CALL    Z,USEALT    ; (If that failed, use alternate method)
  318.  
  319.     LD    A,(STRLEN)
  320.     LD    B,A
  321.  
  322. ; dump ch of found $ in reverse video
  323.  
  324. INREVID:
  325.     LD    A,(HL)
  326.     INC    HL
  327.     CALL    PUTC        ; In rev vid
  328.     DJNZ    INREVID
  329.  
  330. ; stop hilite of found $
  331.  
  332.     CALL    OFFHILITE
  333.     CALL    Z,USEALT
  334.     XOR    A
  335.     LD    (FOUND),A    ; Took care of that match
  336.     PUSH    HL        ; Save buffer ptr
  337.     CALL    FINDAGAIN    ; Look for next occur of find$
  338.     POP    HL        ; Buffer ptr
  339.     POP    BC        ; Line ctr
  340.     JR    PUTNEXT
  341.  
  342. ; dump non-find $ chars
  343.  
  344. PUT1NEXT:
  345.     LD    A,(HL)        ; Get char
  346.     INC    HL        ; *char++
  347.     AND    7FH        ; Mask in case ws doc
  348.     CP    LF
  349.     JR    Z,FOUNDLF
  350.     CP    EOF        ; Is it eof?
  351.     JR    Z,HITEOF
  352.  
  353. ; all truncation logic removed to putc:
  354.  
  355. SENDCH:    CALL    PUTC
  356.     JR    PUTNEXT
  357.  
  358. FOUNDLF:
  359.     DJNZ    SENDCH        ; Line ctr--
  360.     LD    (CURRLINE),HL    ; *current line lf
  361.  
  362.     LD    A,(LINEBYLINE)
  363.     OR    A        ; Going line by line?
  364.     JR    Z,GETCMD    ; No
  365.     LD    A,CR        ; Else, don't put pg #
  366.     CALL    PUTC
  367.     JR    GET1
  368.  
  369. HITEOF:    DEC    HL        ; Back up to prev lf
  370.     LD    (CURRLINE),HL
  371.  
  372. SAYEOF:    LD    A,(INCOMPLETE)
  373.     OR    A
  374.     JR    Z,REALEOF
  375.     CALL    WARNING        ; Too big to fit
  376.     JR    GETCMD
  377.  
  378. REALEOF:
  379.     LD    A,(COL)
  380.     OR    A
  381.     CALL    NZ,CRLF        ; extra newline in case last line incomplete
  382.     CALL    MSG
  383.     DB    '*** End of File ***',0
  384.  
  385. ;
  386. ; get a command from user & execute it. Default cmd is forward 1 page.
  387. ;
  388. GETCMD:    CALL    CRLF        ; Move down to the "status line"
  389.     CALL    ONHALF
  390.     LD    A,(LIBRARY)    ; Working w/ library?
  391.     OR    A        ;
  392.     LD    HL,MEMBER    ; Use member name
  393.     JR    NZ,CPRFN    ; 
  394.  
  395. NALIB:    LD    HL,FCB1+1    ; Else use file's name
  396. CPRFN:    CALL    PRNFN        ;
  397.     CALL    PUTPGNUM    ; And the page number
  398.     CALL    OFFHALF
  399.  
  400. GET1:    XOR    A        ; 0 out jumpto
  401.     LD    (JUMPTO),A
  402.  
  403.     CALL    GETCHNUM    ; Sets jumpto
  404.  
  405. ; chk for jumpto
  406. ;
  407.     LD    B,A        ; Save cmd
  408.     LD    A,(JUMPTO)
  409.     OR    A        ; Jumpto <> 0?
  410.     JR    Z,JPTOIS0
  411.  
  412. GOTO:    LD    (PAGE),A    ; Else new pg is jumpto
  413.     JP    PRPG        ; Jumpto that page
  414.  
  415. JPTOIS0:
  416.     LD    A,B
  417.     OR    A        ; A was 0 on ret?
  418.     JR    NZ,GET3        ; No, see if letter cmd
  419.     LD    A,(CORE)
  420.     INC    A        ; Pg 0 if core, pg 1 if other
  421.     JR    GOTO        ; Else, force tof
  422.  
  423. ; chk letter cmds        ;
  424.  
  425. GET3:    LD    A,B        ; Get cmd back
  426.     CALL    UCASE        ;
  427.     LD    BC,ENDCMDS-CMDS    ; # of cmds
  428.     LD    HL,CMDS
  429.     CPIR            ; Try to match cmd
  430.     JR    NZ,DEFAULT    ; No matching cmd found
  431.     LD    H,B
  432.     LD    L,C        ; Inverse cmd number
  433.     ADD    HL,HL        ; *2 for word adrs
  434.     LD    DE,CMDADR
  435.     ADD    HL,DE        ; *cmd adr we want
  436.     LD    E,(HL)        ; Lo cmd adr
  437.     INC    HL
  438.     LD    D,(HL)        ; Hi cmd adr
  439.     EX    DE,HL        ; Cmd adr in HL
  440.     JP    (HL)        ; Go exec it
  441.  
  442. ;============================================================;
  443. ; The routines to handle commands when within a file follow. ;
  444. ;============================================================;
  445.  
  446. CMDS:    DB    ' '        ;
  447.     DB    '-'        ;
  448.     DB    'A'        ;
  449.     DB    'B'        ;
  450.     DB    CTRLC        ;
  451.     DB    'F'        ;
  452.     DB    'C'        ;
  453.     DB    CTRLK        ;
  454.     DB    'L'        ;
  455.     DB    'Q'        ;
  456.     DB    'R'        ;
  457.     DB    'T'        ;
  458.     DB    'X'        ;
  459.     DB    CTRLX        ;
  460.     DB    ESC        ;
  461.     DB    '/'        ;
  462.     DB    '?'        ;
  463.     DB    'E'        ;
  464.     DB    'H'        ;
  465. ENDCMDS:
  466.  
  467. ; in reverse order
  468.  
  469. CMDADR:    DW    HOME        ; H
  470.     DW    ENDFIL        ; E
  471.     DW    HELP        ; ?
  472.     DW    HELP        ; /
  473.     DW    QUIT        ; Esc
  474.     DW    QUIT        ; ^X
  475.     DW    QUIT        ; X
  476.     DW    TOGGLETRUNC    ; T
  477.     DW    REPEAT        ; R
  478.     DW    QUIT        ; Q
  479.     DW    SINGLELINE    ; L
  480.     DW    SYSTEM        ; ^K
  481.     DW    CASETGL        ; C
  482.     DW    FIND        ; F
  483.     DW    SYSTEM        ; ^C
  484.     DW    BACKAPAGE    ; B
  485.     DW    ALTDISPLAY    ; A
  486.     DW    BACKAPAGE    ; -
  487.     DW    SINGLELINE    ; <sp>
  488.  
  489. ;.....
  490. ;
  491. ; Major abort, right back to CP/M, skipping intermediate levels
  492. ;
  493. SYSTEM:    LD    A,0FFH
  494.     LD    (PUTCABRT),A
  495.     JP    QLEXIT        ; Fix stack and ret to system
  496.  
  497. ;.....
  498. ;
  499. ; default cmd is page forward, cancel any found marking
  500. ;
  501. DEFAULT:
  502.     XOR    A
  503.     LD    (FOUND),A
  504.     LD    HL,PAGE
  505.     INC    (HL)        ; Page++
  506. DEF1:    JP    PRPG
  507.  
  508. ;.....
  509. ;
  510. ; Go to end of file
  511. ;
  512. ENDFIL:    XOR    A
  513.     LD    (FOUND),A
  514.     LD    A,(HIPG)
  515.     LD    (PAGE),A    ; Set page to highest page #
  516.     JP    PRPG
  517. ;.....
  518. ;
  519. ; "Home", ie go to top of file
  520. ;
  521. HOME:    XOR    A
  522.     LD    (FOUND),A
  523.     LD    A,1
  524.     LD    (PAGE),A    ; Set page "1"
  525.     JP    PRPG
  526. ;......
  527. ;
  528. ; back 1 pg, cancel any found marking
  529. ;
  530. BACKAPAGE:
  531.     XOR    A
  532.     LD    (FOUND),A
  533.  
  534. BACKPAGE:
  535.     CALL    PGMINUS1
  536.     JR    DEF1
  537.  
  538. ;................................
  539.                 ;
  540. PGMINUS1:            ;
  541.     LD    A,(PAGE)    ;
  542.     DEC    A        ; Page--
  543.     JR    NZ,NOTPG0    ; Chk for page #0
  544.     LD    A,(CORE)    ; If core dumping, pg 0 is ok
  545.     INC    A        ; Else, force pg 1
  546.                 ;
  547. NOTPG0:    LD    (PAGE),A    ;
  548.     RET            ;
  549. ;...............................;
  550.  
  551. ;.....
  552. ;
  553. ; Toggle case sensitivity (when using 'find' command)
  554. ;
  555. CASETGL:
  556.     CALL    MSG
  557.     DB    'Case sensitive search: ',0
  558.     CALL    TOGLC        ; Toggle the flag and associated 'text'
  559. SAYN:    JR    Z,SAYNO
  560.     CALL    MSG
  561.     DB    'YES',0
  562.     JR    DBELOW
  563. SAYNO:    CALL    MSG
  564.     DB    'NO',0
  565. DBELOW:    CALL    DELAY4
  566.     JP    PRPG
  567.  
  568. ;.....
  569. ;
  570. ; Toggle long line truncation
  571. ;
  572. TOGGLETRUNC:            ;
  573.     CALL    MSG        ;
  574.     DB    'Truncation: ',0 ;
  575.     CALL    TOGLT        ;
  576.     JR    SAYN        ;
  577.  
  578. ;.....
  579. ;
  580. ; Toggle display between ascii <==> hex
  581. ;
  582. ALTDISPLAY:
  583.     LD    A,(CORE)
  584.     OR    A        ; Dumping core?
  585.     JP    NZ,HELP        ; ?
  586. ;;    JP    NZ,PRPG     ; If so, dont allow toggle to ascii
  587.     XOR    A
  588.     LD    (FOUND),A    ; Kill display of found $
  589.     LD    HL,(BUFPTR)
  590.     LD    (RESUMESRCH),HL    ; Resume srchs at tof
  591.     CALL    MSG        ;
  592.     DB    'Display mode: ',0
  593.     CALL    TOGLA        ;
  594.     JR    NZ,SAYHEX    ;
  595.     CALL    MSG        ;
  596.     DB    'ASCII',0    ;
  597.     JR    DBELO3        ;
  598. SAYHEX:    CALL    MSG        ;
  599.     DB    'HEX',0        ;
  600. DBELO3:    CALL    DELAY4        ;
  601.     LD    A,(AFLAG)    ;
  602.     OR    A        ;
  603.     JP    Z,ISTEXT    ; [re-] set up for a text file
  604.     JP    ISNONTEXT    ; Else likewise for a non-text file
  605.  
  606. ;................................ 
  607.                 ;
  608. TOGLC:    LD    HL,CFLAG    ; Flag to be flipped
  609.     LD    DE,CSTATE    ; Where to put text
  610.     LD    IX,PTNO        ; For zero, point to "NO"
  611.     LD    IY,PTYES    ; For non-zero, point to "YES"
  612.     LD    BC,PTYES-PTNO    ; #of chars
  613.     CALL    FLIPIT        ; Generic toggle subr to do all that
  614.     RET            ;
  615. ;...............................;
  616.  
  617. ;................................
  618.                 ;
  619. TOGLT:    LD    HL,TFLAG    ; Flag to be flipped
  620.     LD    DE,TSTATE    ; Where to put text
  621.     LD    IX,PTNO        ; For zero, point to "NO"
  622.     LD    IY,PTYES    ; For non-zero, point to "YES"
  623.     LD    BC,PTYES-PTNO    ; #of chars
  624.     CALL    FLIPIT        ; Generic toggle subr to do all that
  625.     RET            ;
  626. ;...............................;
  627.  
  628. ;................................
  629.                 ;
  630. TOGLA:    LD    HL,AFLAG    ; Flag to be flipped
  631.     LD    IX,PTASC    ; For zero, point to "ASCII"
  632.     LD    IY,PTHEX    ; For non-zero, point to "HEX"
  633.     LD    BC,PTASC-PTHEX    ; #of chars
  634.     LD    DE,ASTATE    ; Where to put abv text
  635.     CALL    FLIPIT        ; Generic toggle subr to do all that
  636.     RET            ;
  637. ;...............................;
  638.  
  639. ;................................
  640.                 ;
  641. FLIPIT:    LD    A,(HL)        ;
  642.     CPL            ;
  643.     LD    (HL),A        ;
  644.     OR    A        ; Nec?
  645.     PUSH    AF        ; Save stat for poss analysis on rtn, also
  646.     JR    Z,NOW0        ; Br if now zero (use ix as pointer)
  647.     PUSH    IY        ; Else use iy as pointer
  648.     JR    FL2        ;
  649. NOW0:    PUSH    IX        ; Else use ix as pointer
  650. FL2:    POP    HL        ; In any case, get it into hl
  651.     LDIR            ; Xfer appropriate text
  652.     POP    AF        ; For poss analysis of result of toggle
  653.     RET            ;
  654. ;...............................;
  655.  
  656. PTNO:    DB    ' NO'
  657. PTYES:    DB    'YES'
  658.  
  659. PTHEX:    DB    '  HEX'        ;
  660. PTASC:    DB    'ASCII'
  661.  
  662. ;.....
  663. ;
  664. ; Put up the menu screen and process appropriate commands
  665. ;
  666. HELP:
  667. ;
  668. HELPLP:    CALL    CLEARSCREEN
  669.     CALL    SIGNON        ; Commands and statuses
  670.     CALL    SUMMARY        ; File summary
  671.     CALL    REQCMD        ; Request command
  672.  
  673. GETAGN:    CALL    GETCHR        ; Get command
  674.     CALL    UCASE        ; Upcase if necessary
  675.     CP    'A'        ; Only 'A', 'C', or 'T' will be accepted
  676.     JR    NZ,ISNTA    ; - (or <ret>, obviously)
  677.     CALL    TOGLA        ; Perf appropriate toggle action
  678.     JR    HELPLP        ; And redisplay the new settings
  679.  
  680. ISNTA:    CP    'C'        ; As above
  681.     JR    NZ,ISNTC    ;
  682.     CALL    TOGLC        ;
  683.     JR    HELPLP        ;
  684.  
  685. ISNTC:    CP    'T'        ; As above
  686.     JR    NZ,ISNTT    ;
  687.     CALL    TOGLT        ;
  688.     JR    HELPLP        ;
  689.  
  690. ISNTT:    CP    CR        ; Check CR explicitly
  691.     JP    Z,PRPG      ;
  692.     CALL    CHEXIT        ; ^C, ^X rtn back to CP/M direct
  693.     JP    Z,QUIT        ; Other 'exit type' chars go here
  694.     JP    PRPG        ; Other commands continue?
  695.  
  696. ;.....
  697. ;
  698. ; Forward one line
  699. ;
  700. SINGLELINE:
  701.     LD    A,(LINEBYLINE)
  702.     INC    A        ; Turn on or incr linecount
  703.     LD    B,A        ; Save linebyline flag
  704.     LD    A,(AFLAG)
  705.     OR    A        ; In non-text mode?
  706.     LD    A,B        ; Get linebyline flag back
  707.     JR    NZ,NON1LINE    ; We're in non-text
  708.     LD    A,(NLINES)
  709.     LD    C,A
  710.     DEC    C
  711.     LD    A,B        ; Get linebyline flag back again
  712.     CP    C        ; 23 lines done 1 at a time?
  713.     JR    C,SAMEPAGE    ; No
  714.     JR    NEWPAGE
  715.  
  716. NON1LINE:
  717.     CP    17        ; Next non-text pg is 17 line forwards
  718.     JR    C,SAMEPAGE
  719.  
  720. NEWPAGE:
  721.     LD    A,(PAGE)    ; Else this is a new pg
  722.     INC    A
  723.     LD    (PAGE),A
  724.     LD    A,1        ; Line 1 of that pg
  725.  
  726. SAMEPAGE:
  727.     LD    (LINEBYLINE),A
  728.     CALL    CRLF        ; Leave pg number intact
  729.     LD    B,1        ; 1 line to display
  730.     LD    HL,(CURRLINE)    ; *curr line
  731.     LD    A,(AFLAG)
  732.     OR    A
  733.     JP    Z,PUTNEXT    ; Display a text line
  734.  
  735. ; else, dump a line in hex/ascii if not at eof
  736. ;
  737.     LD    A,(PAGE)    ; Current page
  738.     LD    B,A
  739.     LD    A,(HIPG)    ; Hipg
  740.     XOR    B
  741.     JP    Z,SAYEOF
  742.     CALL    DOHEXASCII
  743.     JP    GET1        ; Don't show pg#
  744.  
  745. ;.....
  746. ;
  747. ; Find occurrrence of a string
  748. ;
  749. FIND:    LD    A,0FFH
  750.     LD    (FRCMDMODE),A
  751.     CALL    FINDASTRING    ; B has pg+1 on ret fr find sub
  752.  
  753. FINDCHK:
  754.     LD    A,(STRLEN)
  755.     OR    A        ; Find $ given
  756.     JP    Z,PRPG        ; No, redisplay same pg
  757.  
  758.     LD    A,(FOUND)
  759.     OR    A        ; Did we find it?
  760.     JR    Z,NOFIND    ; No
  761.     LD    A,B        ; B=pg+1 where found
  762.     LD    (PAGE),A
  763.     JP    BACKPAGE    ; So back up a pg to print it
  764.  
  765. NOFIND:    CALL    MSG
  766.     DB    CR,LF,'  ** Not Found **',0
  767.     LD    A,(INCOMPLETE)
  768.     OR    A
  769.     CALL    NZ,WARNING    ; Couldn't search entire file
  770.     JP    GETCMD
  771.  
  772. ;.....
  773. ;
  774. ; Repeat find occurrence of a string
  775. ;
  776. REPEAT:    LD    DE,(RESUMESRCH)
  777.     LD    A,D
  778.     OR    E        ; Find in progress?
  779.     JR    Z,NOFIND    ; No, report it
  780.  
  781.     LD    A,0FFH
  782.     LD    (FRCMDMODE),A
  783.     CALL    FINDAGAIN    ; BC has pg+1
  784.     JR    FINDCHK
  785.  
  786. ;................................
  787.                 ;
  788. GETCHR:    PUSH    BC        ;
  789.     PUSH    DE        ;
  790. GETCHL:    LD    C,DIRIO        ; Simple character input subroutine
  791.     LD    E,0FFH        ; Read
  792.     CALL    BDOSC1        ;
  793.     OR    A        ; Anything typed?
  794.     JR    Z,GETCHL    ;
  795.     POP    DE        ;
  796.     POP    BC        ;
  797.     RET            ; Ret w/ char in A
  798. ;...............................;
  799.  
  800. ;.....
  801. ;
  802. ; accumulate numeric jumpto
  803. ; return if non-numeric or jumpto > hipg
  804. ;
  805. GETCHNUM:
  806.      IF    ZCPR3
  807.     CALL    GETSPEED
  808.     LD    DE,DELAY/4
  809.     LD    HL,00
  810.  
  811. DLYLP:    ADD    HL,DE
  812.     DEC    A
  813.     JR    NZ,DLYLP
  814.      ELSE
  815.     LD    HL,DELAY
  816.      ENDIF
  817.  
  818.     LD    (TIMER),HL    ; Reinit key delay timer
  819.  
  820. WAIT:    LD    C,DIRIO        ; Direct cons io
  821.     LD    E,0FFH        ; Read
  822.     CALL    BDOSC1
  823.     OR    A        ; Anything typed?
  824.  
  825.      IF    DELAY
  826.     JR    NZ,GOTKEY    ; Something typed
  827.     LD    A,(JUMPTO)    ; Building a jumpto number?
  828.     OR    A
  829.     JR    Z,WAIT        ; No, just waiting for godot
  830.     LD    HL,(TIMER)
  831.     DEC    HL        ; Timer--
  832.     LD    (TIMER),HL
  833.     LD    A,H
  834.     OR    L        ; Timer at 0?
  835.     RET    Z        ; Yes, exec jumpto now
  836.     JR    WAIT        ; Else loop
  837.      ELSE
  838.     JR    Z,WAIT        ; Wait for godot
  839.      ENDIF
  840.  
  841. ; chk for pg number digits to jump to
  842.  
  843. GOTKEY:    CP    '0'
  844.     RET    C        ; Non-numeric
  845.     CP    '9'+1
  846.     RET    NC
  847.  
  848. ; it's a digit: echo it
  849.  
  850.     PUSH    AF        ; Save digit
  851.     CALL    PUTC
  852.     POP    AF
  853.     SUB    '0'        ; Remove ascii # bias
  854.     LD    B,A        ; Save n
  855.  
  856. ; times 10 + add new digit
  857.  
  858.     LD    A,(JUMPTO)    ; So far
  859.     ADD    A,A        ; *2
  860.     LD    C,A
  861.     ADD    A,A        ; *4
  862.     ADD    A,A        ; *8
  863.     ADD    A,C        ; *10
  864.     ADD    A,B        ; Add in new digit
  865.     LD    (JUMPTO),A    ; So far
  866.  
  867. ; 0 here jumps to tof
  868.  
  869.     RET    Z
  870.  
  871. ; see if approx enuf digits to deduce jp pg: hipg / 8 < jpto
  872.  
  873.     LD    B,A
  874.     LD    A,(HIPG)
  875.     SRL    A
  876.     SRL    A
  877.     SRL    A        ; Hipg / 8
  878.     CP    B        ; Cy if < jpto?
  879.     JR    NC,GETCHNUM    ; Might need 1 more digit
  880.     RET
  881. ;------------------------------------------------------------------------------
  882. ;
  883. FINDAGAIN:            ; Repeat last find if there ever was one
  884.                 ; Do find 1st if not
  885.     LD    DE,(RESUMESRCH)    ; Repeat fr here if call fr display
  886.     LD    A,(FRCMDMODE)    ;
  887.     OR    A        ; Fr a real repeat cmd?
  888.     JR    Z,SET4MATCHSTART ; No, called fr display of matches
  889.                 ; So use resumesrch adr
  890.     LD    DE,(CURRLINE)    ; Default: start repeat at top of next pg
  891.     LD    HL,(EOFADR)    ;
  892.     XOR    A        ;
  893.     SBC    HL,DE        ; Start srch beyond eof?
  894.     JR    NC,SET4MATCHSTART ; >no
  895.     LD    DE,(BUFPTR)    ; Repeat srch fr tof: circular
  896.                 ;
  897. SET4MATCHSTART:            ;
  898.     JP    STARTSRCHHERE    ;
  899.  
  900. ; print find prompt, get $ to find, srch for it
  901. ;
  902. FINDASTRING:
  903.     XOR    A
  904.     LD    (HEXSRCH),A    ; Not hex srch yet
  905.     ld    a,cr        ;
  906.     call    putc        ; Output a cr, no lf
  907.     ld    b,60        ; ? #of blanks needed to overwrite
  908. blp:    call    space        ;
  909.     djnz    blp        ;    
  910.     CALL    MSG
  911.     DB    CR,'Find: ',0
  912.     LD    DE,STRMAX
  913.     LD    C,RDBUFF    ; Read user $
  914.     CALL    BDOSC1
  915.     LD    A,(STRLEN)
  916.     OR    A
  917.     JP    Z,FINDFAILS    ; Null $ aborts find
  918.  
  919. ; chk if finding a string of hex bytes
  920. ; B = user input ctr--
  921. ; C = hi nbl flag if yes (0ffh), else C = hi nbl
  922. ; DE = *temp hex $
  923. ; HL = *user input chars
  924. ;
  925.     LD    B,A        ; Ch count
  926.     LD    A,(STRING)
  927.     CP    HEXSIGNAL    ; Hex signal ch?
  928.     JR    NZ,FINDTEXT    ; No
  929.  
  930.     DEC    B        ; Count-- for signal char
  931.     JR    Z,FINDTEXT    ; Find - only
  932.     LD    A,1
  933.     CP    B        ; Find half nbl only?
  934.     JR    Z,FINDTEXT
  935.     LD    DE,HEXSTRING    ; *temp hex out $
  936.     LD    HL,STRING+1    ; Pt at 1st valid hex ch
  937.     LD    C,0FFH        ; Set hi/lo flag = hi nbl
  938.  
  939. NEXTHEX:
  940.     LD    A,(HL)        ; Next user char
  941.     INC    HL
  942.     CALL    MKHEXDIGIT    ; Strip ascii
  943.     JR    C,FINDTEXT    ; Bad hex digit, do normal text srch
  944.     PUSH    AF
  945.     LD    A,C
  946.     CP    0FFH        ; Doing hi nbl?
  947.     JR    NZ,LONBL    ; No, doing lo nbl
  948.  
  949. ; hi nbl goes in C
  950. ;
  951.     POP    AF
  952.     SLA    A
  953.     SLA    A
  954.     SLA    A
  955.     SLA    A        ; After shift to 4 hi bits
  956.     LD    C,A        ; Save hi nbl in C
  957.  
  958. ; this also sets hi/lo nbl flag to lo (not hi)
  959. ;
  960.     JR    GOTHI
  961.  
  962. LONBL:    POP    AF
  963.     OR    C        ; Combine hi & lo nbls
  964.     LD    (DE),A        ; Store into temp hex $
  965.     INC    DE        ; *temp++
  966.     LD    C,0FFH        ; Set hi nbl flag again
  967.  
  968. GOTHI:    DJNZ    NEXTHEX
  969.  
  970. ; ascii to hex transl done
  971. ;
  972.     LD    H,D
  973.     LD    L,E        ; *last hex byte stored
  974.     LD    DE,HEXSTRING    ; Base adr of hex$
  975.     XOR    A
  976.     SBC    HL,DE        ; # of bytes stored
  977.     LD    A,L
  978.     LD    (STRLEN),A    ; Adj string len
  979.     LD    C,A        ; # of bytes to copy
  980.     LD    B,0
  981.     LD    HL,HEXSTRING    ; Src
  982.     LD    DE,STRING    ; Lst
  983.     LDIR            ; Copy hex$ to string buffer
  984.     LD    A,0FFH
  985.     LD    (HEXSRCH),A    ; Call for a hex srch, no hi bit masking
  986.  
  987. FINDTEXT:
  988.     LD    DE,(BUFPTR)    ; Default srch start at tof
  989.  
  990.     LD    A,(CORE)
  991.     OR    A        ; Find in core dump?
  992.     JR    Z,FFILE        ; No, in a file
  993.     LD    DE,0        ; Default find in core starts at adr 0
  994.  
  995. FFILE:
  996.      IF    FINDFRTOP    ; Start find on curr pg
  997.      ELSE            ; Avoid assembler specific .NOT. syntax
  998.  
  999.     LD    A,(PAGE)    ; Curr pg
  1000.     LD    B,A        ; Save curr pg
  1001.     LD    A,(CORE)
  1002.     OR    A
  1003.     JR    NZ,FINCORE    ; Pg 0 is 0'th ptr in core
  1004.     DEC    B        ; 0'th ptr is pg 1 if not core
  1005.  
  1006. FINCORE:            ;
  1007.     LD    L,B        ;
  1008.     LD    H,0
  1009.     ADD    HL,HL        ; *2 for word adr
  1010.     LD    DE,(@PTRTBL)
  1011.     ADD    HL,DE        ; Idx into ptrtbl
  1012.     LD    E,(HL)        ; Get pg adr
  1013.     INC    HL
  1014.     LD    D,(HL)
  1015.      ENDIF            ; NOT FINDFRTOP
  1016.  
  1017. ; DE set for start of srch
  1018.  
  1019. STARTSRCHHERE:
  1020.     LD    A,(FRCMDMODE)    ; Are we in a find/repeat command?
  1021.     OR    A
  1022.     JR    NZ,SRCHFILE    ; Yes, search rest of file
  1023.  
  1024.     LD    A,(PAGE)    ; Fetch ptr of next page
  1025.     ADD    A,A
  1026.     LD    C,A
  1027.     LD    B,0
  1028.     LD    HL,(@PTRTBL)
  1029.     ADD    HL,BC
  1030.     LD    A,(HL)
  1031.     INC    HL
  1032.     LD    H,(HL)
  1033.     LD    L,A
  1034.     JR    ENDSRCHHERE
  1035.  
  1036. SRCHFILE:            ; Search rest of file
  1037.     LD    HL,(EOFADR)
  1038.     LD    A,(AFLAG)
  1039.     OR    A        ; In nontext display?
  1040.     JR    NZ,ENDSRCHHERE    ; Yes
  1041.     DEC    HL        ; Dont allow srch for eof if in text display
  1042.  
  1043. ; HL set for end of srch
  1044.  
  1045. ENDSRCHHERE:
  1046.     XOR    A        ; Clr cy
  1047.     LD    (FRCMDMODE),A    ; Set not fr cmd mode
  1048.     SBC    HL,DE        ; Len left to scan
  1049.     JR    C,FINDFAILS    ; Borrow = start srch beyond eof
  1050.     JR    Z,FINDFAILS    ; At eof: nothing to scan
  1051.  
  1052.     LD    B,H        ; Len goes in
  1053.     LD    C,L        ; BC for cpir
  1054.     EX    DE,HL        ; HL=start srch adr
  1055.     LD    IX,MATCHES    ; *matches so far
  1056.     LD    A,(HEXSRCH)    ; Hex searching?
  1057.     OR    A
  1058.     LD    IY,GETHEX    ; Use hex compare & get rtns
  1059.     JR    NZ,MATCH1ST
  1060.     LD    A,(CFLAG)    ; Case sensitive search?
  1061.     OR    A        ;
  1062.     LD    IY,GETUC    ; Use upcase compare & get rtns
  1063.     JR    Z,MATCH1ST
  1064.     LD    IY,GETLC    ; Else use lowercase compare & get rtns
  1065.  
  1066. ; find the 1st char of $
  1067.  
  1068. MATCH1ST:
  1069.     LD    (IX),0        ; Count of chars matched so far
  1070.     LD    DE,STRING    ; *$
  1071.     CALL    GSTRCHAR    ; Get 1st char to find
  1072.                 ; Diddle it according to cmp type
  1073.  
  1074. MATCHLP:
  1075.     CALL    DOCMP        ; Use proper compare routine - cy set on match
  1076.     CPI            ; Buffer++, cnt--
  1077.     JR    C,MTCHD1    ; Matched 1st char
  1078.     JP    PE,MATCHLP    ; Continue looping if cnt >0
  1079.  
  1080. FINDFAILS:
  1081.     XOR    A        ; Failure to find
  1082.     LD    (FOUND),A
  1083.     LD    (MATCHADR),A
  1084.     LD    (MATCHADR+1),A
  1085.     LD    HL,(BUFPTR)    ; Repeat finds start at tof
  1086.     LD    A,(CORE)
  1087.     OR    A
  1088.     JR    Z,FILEFAIL    ; Failed file srch
  1089.     LD    HL,00FFH    ; Failed core srch
  1090.                 ; Can't repeat on pg 1 anyway
  1091. FILEFAIL:
  1092.     LD    (RESUMESRCH),HL
  1093.     RET
  1094.  
  1095. GSTRCHAR:
  1096.     JP    (IY)        ; Jump to get rtn
  1097.  
  1098. DOCMP:    PUSH    BC        ; Need a register
  1099.     DEC    IY        ; Dec ptr by 2
  1100.     DEC    IY        ; To point to CMP vector
  1101.     PUSH    IY        ; Save on stack
  1102.     INC    IY        ; Inc ptr by 2
  1103.     INC    IY
  1104.     RET            ; Jump to vector
  1105.  
  1106.     JR    CMPHEX
  1107.  
  1108. GETHEX:    LD    A,(DE)
  1109.     RET
  1110.  
  1111.     JR    CMPLC
  1112.  
  1113. GETLC:    LD    A,(DE)
  1114.     AND    7FH
  1115.     RET
  1116.  
  1117.     JR    CMPUC
  1118.  
  1119. GETUC:    LD    A,(DE)
  1120.     AND    7FH
  1121.     CALL    UCASE
  1122.     RET
  1123.  
  1124. ; mask high bit before compare
  1125.  
  1126. CMPLC:    LD    B,(HL)        ; *buffer
  1127.     RES    7,B        ; Mask high bit
  1128.     CP    B        ; Compare
  1129.     JR    Z2C        ; Convert Z flag to cy
  1130.  
  1131. ; simple compare
  1132.  
  1133. CMPHEX:    CP    (HL)        ; Simple compare
  1134.     JR    Z2C        ; Convert Z flag to cy
  1135.  
  1136. ; convert both to uppercase before compare
  1137.  
  1138. CMPUC:    LD    B,A        ; Save
  1139.     LD    A,(HL)        ; *buffer
  1140.     AND    7FH        ; Mask high bit
  1141.     CALL    UCASE        ; Make uppercase if lower
  1142.     CP    B        ; Compare (finally!)
  1143.     LD    A,B
  1144.  
  1145. Z2C:    POP    BC        ; Restore
  1146.     SCF            ; Set carry
  1147.     RET    Z        ; If Z flag set
  1148.     OR    A        ; Clear carry
  1149.     RET
  1150.  
  1151. ; now try to match rest of $ sequentially
  1152.  
  1153. MTCHD1:    PUSH    HL        ; Push start adr of match +1
  1154.  
  1155. MATCHSEQ:
  1156.     INC    (IX)        ; Bump successes
  1157.     LD    A,(STRLEN)    ; # to match
  1158.     CP    (IX)        ; Matched whole $?
  1159.     JR    Z,FOUNDSTRING    ; Yes
  1160.  
  1161.     INC    DE        ; $++
  1162.     CALL    GSTRCHAR    ; A = *$ (diddled)
  1163.     CALL    DOCMP        ; Compare it
  1164.  
  1165. ; chk for eof
  1166. ;
  1167.     CPI            ; *buf++,cnt--
  1168.     JR    C,MATCHSEQ    ; This ch matched: chk next ch in $
  1169.     JP    PO,FINDFAILS    ; Fail if EOF
  1170.  
  1171. ; 2nd ch or later failed to match: back to 1st ch matched + 1
  1172. ;
  1173.     POP    HL        ; Restore *file to 1st ch matched + 1
  1174.     LD    A,(IX)        ; Count of successful matches
  1175.  
  1176. BACK2CH1P1:
  1177.     INC    BC        ; Adj len remaining to srch
  1178.     DEC    A        ; Successes--
  1179.     JR    NZ,BACK2CH1P1
  1180.     JP    MATCH1ST    ; Start srch again for 1st ch
  1181.  
  1182. ; find out what pg match is in
  1183. ;
  1184. FOUNDSTRING:
  1185.     POP    DE        ; *1st matching char + 1
  1186.     DEC    DE        ; *1st matching char
  1187.     LD    (MATCHADR),DE    ; Actual match adr of 1st found ch
  1188.     LD    L,A        ; Strlen
  1189.     LD    H,0
  1190.     ADD    HL,DE
  1191.     LD    (RESUMESRCH),HL    ; Resume after this match
  1192.  
  1193.     LD    IX,(@PTRTBL)    ;
  1194.     LD    A,(CORE)    ; Ff if in core
  1195.     LD    B,A        ; 0 if file
  1196.  
  1197. NEXTPG:    INC    B        ; Pg++
  1198.     LD    L,(IX)        ; Lo pg adr
  1199.     INC    IX
  1200.     LD    H,(IX)        ; Hi pg adr
  1201.     INC    IX        ; To next ptr
  1202.     XOR    A        ; Clr cy
  1203.     SBC    HL,DE
  1204.     JR    C,NEXTPG    ; Not far enuf
  1205.                 ; NC = HL > DE is 1 pg too far
  1206.     JR    Z,NEXTPG    ; HL = DE = 1st byte on next pg
  1207.  
  1208. ; B has page # + 1 so do backpage
  1209. ;
  1210.     LD    A,0FFH
  1211.     LD    (FOUND),A
  1212.     RET
  1213.  
  1214. ;..............................................................................
  1215. ;
  1216. ; called fr find for hex digit input
  1217. ; strip ascii stuff fr possible hex digit in a
  1218. ; cy set if invalid
  1219. ;
  1220. MKHEXDIGIT:            ;
  1221.     CP    '0'        ;
  1222.     RET    C        ; '0'
  1223.     CP    '9'+1        ; Cy if '0' to '9'
  1224.     JR    NC,CHKATHRUF    ;
  1225.     AND    0FH        ; Mask to hex nbl
  1226.     JR    OKHEX        ;
  1227.                 ;
  1228. CHKATHRUF:            ;
  1229.     SET    5,A        ; Tolower
  1230.     CP    'a'        ;
  1231.     RET    C        ; Invalid
  1232.     CP    'f'+1        ; Cy if 'a' to 'f'
  1233.     CCF            ;
  1234.     RET    C        ; No good
  1235.     ADD    A,0A9H        ; Make hex nbl
  1236.                 ;
  1237. OKHEX:    SCF            ;
  1238.     CCF            ; Set no cy for ok
  1239.     RET            ;
  1240. ;...............................;
  1241.  
  1242. ;==============================================================================
  1243. ;        General purpose (low level) subroutines
  1244. ;==============================================================================
  1245.  
  1246. ;------------------------------------------------------------------------------
  1247. ;        Screen management subroutines
  1248. ;------------------------------------------------------------------------------
  1249.  
  1250. ;..............................................................................
  1251. ;
  1252. ; Half Intensity on
  1253. ;
  1254. ONHALF:    CALL    BYECHK        ; Remote user?
  1255.     RET    NZ        ; Yes, forget it and return
  1256.  
  1257.     PUSH    HL        ; Save callers HL
  1258.     LD    A,(DIMSEQ)    ; Is there a hardcoded sequence?
  1259.     OR    A        ;
  1260.     JR    NZ,USEHC1    ; If so, use it no matter what
  1261.  
  1262. ;................................
  1263.                 ;
  1264.      IF    ZCPR3        ; If ZCPR3, check for TCAP
  1265.     CALL    GETVID        ;
  1266.     CALL    NZ,STNDOUT    ; We have one, use it
  1267.      ENDIF            ; NOT ZCPR3
  1268. ;...............................;
  1269.  
  1270. VDRET1:    POP    HL        ; Restore caller's reg & rtn
  1271.     RET            ;
  1272.  
  1273. USEHC1:    CALL    ESCMSG        ; Output the hardcoded sequence below
  1274. DIMSEQ:    DIMON            ; Macro containing the sequence
  1275.     DB    0        ; Terminating byte
  1276.     JR    VDRET1        ; Restore regs & rtn
  1277.  
  1278. ;..............................................................................
  1279. ;
  1280. ; Half Intensity off
  1281. ;
  1282. OFFHALF:
  1283.     CALL    BYECHK
  1284.     RET    NZ
  1285.  
  1286.     PUSH    HL
  1287.     LD    A,(DMOSEQ)
  1288.     OR    A
  1289.     JR    NZ,USEHC2
  1290.  
  1291. ;................................
  1292.                 ;
  1293.      IF    ZCPR3        ;
  1294.     CALL    GETVID        ;
  1295.     CALL    NZ,STNDEND    ;
  1296.      ENDIF            ;
  1297. ;...............................;
  1298.  
  1299. VDRET2:    POP    HL
  1300.     RET
  1301.  
  1302. USEHC2:    CALL    ESCMSG
  1303. DMOSEQ:    DIMOFF
  1304.     DB    0
  1305.     JR    VDRET2
  1306.  
  1307. ;..............................................................................
  1308. ;
  1309. ; Reverse video on
  1310. ;
  1311. ONHILITE:
  1312.     CALL    BYECHK
  1313.     INC    A        ; (complement sense of zero status)
  1314.     RET    Z        ; Return, indicating 'failure'
  1315.  
  1316.     PUSH    HL
  1317.     LD    A,(REVSEQ)
  1318.     OR    A
  1319.     JR    NZ,USEHC3    ; Go use hardcoded sequence if there is one
  1320.                 ; (else process Z3 if appropriate rtn w/ 0)
  1321. ;................................
  1322.                 ;
  1323.      IF    ZCPR3        ;
  1324.     CALL    GETVID        ;
  1325.     JR    Z,VDRET3    ; Rtn w/ zero cc, indicating failure
  1326.     CALL    STNDOUT        ;
  1327.     OR    0FFH        ; Rtn w/ non-zero cc, indicating success
  1328.      ENDIF            ;
  1329. ;...............................;
  1330.  
  1331. VDRET3:    POP    HL
  1332.     RET
  1333.  
  1334. USEHC3:    CALL    ESCMSG
  1335. REVSEQ:    REVON
  1336.     DB    0
  1337.     OR    0FFH        ; Return, indicating success
  1338.     JR    VDRET3
  1339.  
  1340. ;..............................................................................
  1341. ;
  1342. ; Reverse video off
  1343. ;
  1344. OFFHILITE:
  1345.     CALL    BYECHK
  1346.     INC    A
  1347.     RET    Z
  1348.  
  1349.     PUSH    HL
  1350.     LD    A,(RVOSEQ)
  1351.     OR    A
  1352.     JR    NZ,USEHC4
  1353.  
  1354. ;................................
  1355.                 ;
  1356.      IF    ZCPR3        ;
  1357.     CALL    GETVID        ;
  1358.     JR    Z,VDRET4    ;
  1359.     CALL    STNDEND        ;
  1360.     OR    0FFH        ;
  1361.      ENDIF            ;
  1362. ;...............................;
  1363.  
  1364. VDRET4:    POP    HL
  1365.     RET
  1366.  
  1367. USEHC4:    CALL    ESCMSG
  1368. RVOSEQ:    REVOFF
  1369.     DB    0
  1370.     OR    0FFH
  1371.     JR    VDRET4
  1372.  
  1373. ;..............................................................................
  1374. ;
  1375. ; Clear the screen
  1376. ;
  1377. CLEARSCREEN:
  1378.     PUSH    HL        ; Save callers HL
  1379.     PUSH    BC        ; And bc
  1380.     LD    A,(DELAYN)    ; Is there a delay?
  1381.     OR    A
  1382.     CALL    NZ,DELAYIT
  1383.     SUB    A        ; Clear the delay
  1384.     LD    (DELAYN),A
  1385.     CALL    BYECHK        ; Remote user?
  1386.     JR    NZ,USELFS    ; Yes, use lf's to clear screen
  1387.  
  1388.     LD    A,(CLRSEQ)    ; Is there a hardcoded sequence?
  1389.     OR    A        ;
  1390.     JR    NZ,USEHC    ; If so, use it no matter what
  1391.  
  1392. ;................................
  1393.                 ;
  1394.      IF    ZCPR3        ; If ZCPR, we have a possible alternative
  1395.     CALL    GETVID        ; Check for TCAP
  1396.     JR    Z,USELFS    ; If none, resort to using LF's (pretty poor)
  1397.     CALL    CLS        ; We have one, use it
  1398.     JR    VDRET        ; Clr some flags and return
  1399.      ENDIF            ; ZCPR3
  1400. ;...............................;
  1401.  
  1402. ;.....
  1403. ;
  1404. USELFS:    CALL    CRLF        ;
  1405. ;;    LD    A,(ROWS)    ; Screen height
  1406.     LD    A,24        ;
  1407.     LD    B,A        ;
  1408.  
  1409. LFLOOP:    LD    A,LF        ; ??
  1410.     CALL    PUTC        ;
  1411.     DJNZ    LFLOOP        ;
  1412.  
  1413. ;.....
  1414. ;
  1415. VDRET:    XOR    A        ; Clear some flags and return
  1416.     LD    (COL),A        ; Col ctr
  1417.     LD    (LINEBYLINE),A    ; Line by line flag
  1418.     POP    BC        ;
  1419.     POP    HL        ; Restor caller's hl
  1420.     RET            ;
  1421.  
  1422. ;................................
  1423.                 ;
  1424. USEHC:    CALL    ESCMSG        ; Output hardcoded clearscreen sequence below
  1425.                 ;
  1426. CLRSEQ:    CLRSCR            ; Macro containing clearscreen byte sequence
  1427.     DB    0        ; End of msg marker
  1428.     JR    VDRET        ; Return is same as above
  1429.  
  1430. ;..............................................................................
  1431. ;
  1432. USEALT:    PUSH    HL        ; Nec?
  1433.     CALL    MSG        ; Alternate method to mark 'found' strings
  1434.     MRKCHR            ; Character (or sequence) to use
  1435.     DB    0        ; Guarantee termination
  1436.     POP    HL        ;
  1437.     RET            ;
  1438.  
  1439. ;------------------------------------------------------------------------------
  1440. ;
  1441. ; Memory initialization routines
  1442.  
  1443. ;................................
  1444.                 ;
  1445. INI1MEM:LD    HL,INIT1    ; Init all memory from "init1" - "end1init"
  1446.     LD    DE,INIT1+1    ;
  1447.     LD    BC,END1INIT-INIT1-1
  1448.     LD    (HL),0        ;
  1449.     LDIR            ;
  1450.     RET            ;
  1451. ;...............................;
  1452.  
  1453. ;................................
  1454.                 ;
  1455. INI2MEM:LD    HL,INIT2    ; Init all memory from "init2" - "end2init"
  1456.     LD    DE,INIT2+1    ;
  1457.     LD    BC,END2INIT-INIT2-1
  1458.     LD    (HL),0        ;
  1459.     LDIR            ;
  1460.                 ;
  1461.     LD    HL,(@PTRTBL)    ; Also clear the whole 1k 'ptrtbl'
  1462.     LD    D,H        ;
  1463.     LD    E,L        ;
  1464.     INC    DE        ;
  1465.     LD    BC,1024-1    ;
  1466.     LD    (HL),0        ;
  1467.     LDIR            ;
  1468.     RET            ;
  1469. ;...............................;
  1470.  
  1471. ;------------------------------------------------------------------------------
  1472. ;
  1473. ; print a null terminated string at ret adr of this sub
  1474. ; ctrl chars are ok in ql msgs
  1475. ;
  1476. MSG:    LD    A,0FFH
  1477.     LD    (FROMQLMSG),A    ; Flag this as a ql msg: ctrl chars are ok
  1478.                 ;
  1479. MSG1:    EX    (SP),HL        ; HL=*string
  1480.     LD    A,(HL)        ; Get char
  1481.     INC    HL        ; *ch++
  1482.     EX    (SP),HL        ; Restore ret adr if done
  1483.     OR    A        ; Ch = 0 msg term?
  1484.     JR    Z,MSGDONE    ;
  1485.     CALL    PUTC        ; Print ch
  1486.     JR    MSG1        ;
  1487.                 ;
  1488. MSGDONE:            ;
  1489.     LD    (FROMQLMSG),A    ; Mark false
  1490.     RET            ;
  1491. ;...............................;
  1492.  
  1493. ;...............................;
  1494. ; Inline compare string
  1495. ; Compare (HL) with (SP) - ignore hi bits
  1496. ; Success if null reached on either
  1497. ; Only A is destroyed
  1498. ;
  1499. ILCMP:    EX    DE,HL
  1500.     EX    (SP),HL        ; Caller's DE now on stack
  1501.     PUSH    DE        ; Save caller's HL
  1502.  
  1503. ILCLOOP:
  1504.     LD    A,(HL)        ; *s
  1505.     OR    A        ; null?
  1506.     JR    Z,ILCDON
  1507.     LD    A,(DE)        ; *t++
  1508.     INC    DE
  1509.     OR    A        ; null?
  1510.     JR    Z,ILCDON
  1511.     XOR    (HL)        ; zero or 80h will match
  1512.     INC    HL        ; s++
  1513.     AND    7Fh        ; mask hi bit
  1514.     JR    Z,ILCLOOP    ; Continue if matched
  1515.  
  1516.     XOR    A        ; Search for a null
  1517. ILCFAIL:    
  1518.     CP    (HL)        ; Found yet?
  1519.     JR    Z,ILCF1        ; Yes, stop scanning
  1520.     INC    HL        ; s++
  1521.     JR    ILCFAIL
  1522.  
  1523. ILCF1:    INC    A        ; Reset Z flag
  1524.  
  1525. ILCDON:    INC    HL        ; bump past null
  1526.     POP    DE        ; Caller's HL restored
  1527.     EX    (SP),HL        ; Retn addr on stack
  1528.     EX    DE,HL        ; Caller's DE restored
  1529.     RET            ; Z flag set if compare succeeded
  1530.  
  1531. ;................................
  1532.                 ;
  1533. UCASE:    CP    'a'        ; Upcase the character in A
  1534.     RET    C        ; 'a'-1 and below should be left alone
  1535.     CP    'z'+1        ; 'z'+1 and above should be left alone
  1536.     RET    NC        ;
  1537.     SUB    20H        ; Else upcase it
  1538.     RET            ;
  1539. ;...............................;
  1540.  
  1541. ;................................
  1542.                 ; Downcase the character in A
  1543. DCASE:    CP    'A'        ; 'A'-1 and below should be left alone
  1544.     RET    C        ;
  1545.     CP    'Z'+1        ; 'Z'+1 and above should be left alone
  1546.     RET    NC        ;
  1547.     ADD    A,20H        ; Else downcase it
  1548.     RET            ;
  1549. ;...............................;
  1550.  
  1551. ;................................
  1552.                 ;
  1553. WHLCHK:                ; Check wheel byte status, ret w. NZ if "on"
  1554.      IF    ZCPR3        ;
  1555.     JP    GETWHL        ;
  1556.      ELSE            ;
  1557.                 ;
  1558.     LD    A,(WHEEL)    ;
  1559.     OR    A        ;
  1560.     RET            ;
  1561.      ENDIF            ;
  1562. ;...............................;
  1563.  
  1564. ;................................
  1565.                 ;
  1566. BYECHK:    LD    A,(BYE5FLAG+1)    ; Actual existance of bye is chkd at prog init
  1567.     OR    A        ; That byte will be non-zero if bye was found
  1568.     RET    Z        ; This subr just returns that flag status
  1569.     LD    A,0FFH        ; (if not 0, guarantee 0FF in A [useful])
  1570.     RET            ;
  1571. ;...............................;
  1572.  
  1573. ;................................
  1574. ; Screen delay routines        ;
  1575.                 ;
  1576. DELAY8:    LD    A,8        ; Note:  Delays occur
  1577.     LD    (DELAYN),A    ; when screen is cleared,
  1578.     RET            ; so multi-file operations
  1579. DELAY4:    LD    A,4        ; are not slowed down.
  1580.     LD    (DELAYN),A    ;
  1581.     RET            ;
  1582.                 ;
  1583. DELAYIT:            ;
  1584.     DEC    A        ;
  1585.     JR    Z,DELY1        ;
  1586.     CALL    DELY1        ;
  1587.     JR    DELAYIT        ;
  1588.                 ;
  1589. DELY1:    LD    BC,0        ;
  1590. LWAIT:    NOP            ;
  1591.     DJNZ    LWAIT        ;
  1592.     DEC    C        ;
  1593.     JR    NZ,LWAIT    ;
  1594.     RET            ;
  1595. ;...............................;
  1596.  
  1597. ;................................
  1598.                 ;
  1599. SPACE2:    CALL    SPACE        ; Output 2 spaces
  1600. SPACE:    LD    A,' '        ; Output 1 space
  1601.     JP    PUTC        ;
  1602. ;...............................;
  1603.  
  1604. ;................................
  1605.                 ;
  1606. CRLF:    LD    A,CR        ; Output a CR/LF sequence
  1607.     CALL    PUTC        ;
  1608.     LD    A,LF        ;
  1609.                 ;
  1610. ; fall thru to below        ;
  1611.  
  1612. ;................................
  1613. ;
  1614. ; 'Hi-level' character output routine, providing associated control functions.
  1615. ;
  1616. ; Character to be supplied in A. Regs BC,DE,HL,IX,IY are saved and restored
  1617. ;
  1618. PUTC:    PUSH    BC        ; Save registers
  1619.     PUSH    DE
  1620.     PUSH    HL
  1621.     PUSH    IX
  1622.     PUSH    IY
  1623.  
  1624.     PUSH    AF        ; }
  1625.     CALL    BYECHK        ; } Process and handle on the fly aborts, etc.
  1626.     CALL    NZ,CKABRT    ; } (if running remote only). Only adds a few
  1627.     POP    AF        ; } cycles during local operation.
  1628.  
  1629.     AND    7FH        ; Mask to ascii
  1630.  
  1631.     CP    CR
  1632.     JR    NZ,NOTCR
  1633.  
  1634. ; cr zeroes col ctr
  1635.  
  1636.     XOR    A
  1637.     LD    (COL),A
  1638.     LD    A,CR
  1639.     JR    PUTCH
  1640.  
  1641. NOTCR:    LD    B,A        ; Save ch
  1642.     LD    A,(TFLAG)    ;
  1643.     OR    A        ; Truncation on?
  1644.     JR    Z,NOTTOOLONG    ; No, any line len ok
  1645.     LD    A,(COL)        ;
  1646.     CP    COLUMNS-2    ; At max line len?
  1647.     JR    C,NOTTOOLONG    ; No, line len still ok
  1648.     JR    NZ,BIOSRET    ; Already marked '>': skip this char
  1649.  
  1650. ; at truncation pt: mark with '>'
  1651.  
  1652.     INC    A        ; To columns-1
  1653.     LD    (COL),A        ; So next ch won't mark trunc again
  1654.     LD    A,TRUNKCHAR    ; Truncation marker
  1655.     JR    PUTCH
  1656.  
  1657. NOTTOOLONG:
  1658.     LD    A,B        ; Get ch back
  1659.  
  1660.     CP    ' '
  1661.     JR    NC,PRINTABLE    ; Count all printables
  1662.  
  1663. ; chk ctrl chs we can handle
  1664.  
  1665.     CP    LF        ; Masked lf is ok
  1666.     JR    Z,PUTCH
  1667.  
  1668.     CP    TAB
  1669.     JR    NZ,NOTTAB
  1670.  
  1671. ; adjust col count assuming tabs 0,8,16...
  1672.  
  1673.      IF    EXPANDTABS    ; Expand tabs to equiv spaces
  1674.     LD    A,(COL)
  1675.     CPL
  1676.     AND    7        ; Mod 8
  1677.     INC    A
  1678.     LD    B,A        ; Spaces to next tab stop
  1679.  
  1680. XTAB:    CALL    SPACE        ; Send spaces to tab stop
  1681.     DJNZ    XTAB
  1682.     JR    BIOSRET        ; Restore regs & ret
  1683.      ELSE            ; Term can handle actual tab ch
  1684.     LD    A,(COL)
  1685.     AND    0F8H        ; Mask off lo 3 bits
  1686.     ADD    A,8        ; To next tab stop
  1687.     LD    (COL),A        ; Set new column
  1688.     LD    A,TAB
  1689.     JR    PUTCH
  1690.      ENDIF            ; Expand tabs
  1691.  
  1692. NOTTAB:    CP    BS
  1693.     JR    NZ,NOTBS
  1694.     LD    HL,COL
  1695.     DEC    (HL)        ; Col--
  1696.     JR    PUTCH
  1697.  
  1698. ; we must handle other ctrl chars specially, UNLESS they're coming from
  1699. ; a ql message, like clear screen or an escape seq
  1700. ; this should filter all remaining ws doc chars
  1701. ;
  1702. NOTBS:    LD    B,A        ; Save curr ch
  1703.     LD    A,(FROMQLMSG)
  1704.     OR    A
  1705.     LD    A,B        ; Get curr ch back
  1706.     JR    NZ,PUTCH    ; Ctrl ch from a ql msg, takes no line space
  1707.  
  1708.      IF    CTRLWORDSTAR
  1709.  
  1710. ; Display using the combination  ^ <char>
  1711. ;
  1712.     PUSH    BC        ; Save a copy of the char, still in B
  1713.     LD    A,'^'        ; "control"
  1714.     CALL    CONO        ; Output that
  1715.     LD    HL,COL        ; Adjust for the "^" character
  1716.     INC    (HL)        ; Col++
  1717.     POP    BC        ; Get the control char back
  1718.     LD    A,B        ; (char was in B)
  1719.     OR    40H        ; Make it the corresponding non-cntrl char
  1720.     JP    NOTCR        ; Start this routine all over again
  1721.      ENDIF            ; CTRLWORDSTAR
  1722.  
  1723.      IF    CTRLDIMVID
  1724.  
  1725. ; Display using dim video
  1726. ;
  1727.     PUSH    BC        ; Save the char, still in B
  1728.     CALL    ONHALF        ; Dim intensity
  1729.     POP    BC        ; Get the char back
  1730.     LD    A,'@'        ; Convert to letter
  1731.     OR    B        ;
  1732.     CALL    CONO        ; Print the char
  1733.     LD    HL,COL        ; Adjust for column
  1734.     INC    (HL)
  1735.     CALL    OFFHALF        ; Back to full intensity
  1736.     JR    BIOSRET        ; And return
  1737.      ENDIF            ; CTRLDIMVID
  1738.  
  1739.      IF    CTRLDUMMY
  1740.  
  1741. ; Display using default marker
  1742. ;
  1743.     LD    A,CTRLMARKER    ; Defined char to use
  1744.      ENDIF            ; CTRLDUMMY
  1745.  
  1746. PRINTABLE:
  1747.     OR    A        ; Filter out NULL's, and don't incr COL
  1748.     JR    Z,BIOSRET    ;
  1749.  
  1750.     LD    HL,COL        ;
  1751.     INC    (HL)        ; Col++
  1752.  
  1753. PUTCH:    CALL    CONO        ; Output the character
  1754.  
  1755. BIOSRET:
  1756.     JP    BDOSRET        ; Same code is there
  1757.  
  1758. ;..............................................................................
  1759. ;
  1760. ; put a null terminated escape sequence string at ret adr of this sub
  1761. ; avoid chg col ctr when init/term hiliting
  1762. ; destroys A,HL
  1763. ;
  1764. ESCMSG:    EX    (SP),HL        ; HL=*string
  1765.     LD    A,(HL)        ; Get char
  1766.     INC    HL        ; *ch++
  1767.     EX    (SP),HL        ; Restore ret adr if done
  1768.     OR    A        ; Ch = \0 msg term?
  1769.     RET    Z        ; Done
  1770.     LD    HL,ESCMSG    ; Ret adr is start of this rtn
  1771.     PUSH    HL        ; On stk
  1772.     PUSH    BC        ; Save regs
  1773.     PUSH    DE        ; In this order
  1774.     PUSH    HL        ; Putch: will restore them
  1775.     PUSH    IX        ;
  1776.     PUSH    IY        ;
  1777.     JR    PUTCH        ; Print char w/o chg to col ctr
  1778.                 ; Returns to escmsg:
  1779.  
  1780. ;................................
  1781.                 ; Low-level single char output.
  1782. CONO:                ; Use BIOS or BDOS, as requested;
  1783.      IF    USEBIOSCONOUT    ;
  1784.     LD    C,A        ; Goes in C for BIOS
  1785.     LD    HL,(BIOSCONOUT)    ;
  1786.     JP    (HL)        ; Do it; return directly from there
  1787.      ELSE            ;
  1788.     LD    E,A        ; Goes in E for BDOS
  1789.     LD    C,CONOUT    ; Console output function
  1790.     JP    BDOSEV        ; Output the char and return from there
  1791.      ENDIF            ;
  1792. ;...............................;
  1793.  
  1794.  
  1795. PUTPGNUM:
  1796.     CALL    MSG        ; Start page title in lower left corner
  1797.     DB    ': Page ',0
  1798.  
  1799. ; print current pg number
  1800.  
  1801.     LD    A,(PAGE)
  1802.     LD    L,A
  1803.     LD    H,0
  1804.     CALL    B2DEC        ; Convert to printable # & print
  1805.  
  1806.     CALL    MSG
  1807.     DB    ' of ',0
  1808.  
  1809. ; print max pg number
  1810.  
  1811.     LD    A,(HIPG)
  1812.     LD    L,A
  1813.     LD    H,0
  1814.     CALL    B2DEC
  1815.  
  1816. ; add marker if read was incomplete
  1817.  
  1818.     LD    A,(INCOMPLETE)
  1819.     OR    A
  1820.     JR    Z,NOPLUS
  1821.     LD    A,'+'
  1822.     CALL    PUTC
  1823.  
  1824. NOPLUS:    CALL    MSG
  1825.     DB    '  Cmnd or ''?'' for Menu: ',0
  1826.     RET
  1827.  
  1828. ;..............................................................................
  1829. ;
  1830. ; print binary # in HL as decimal, lead 0's suppressed
  1831. ;
  1832.      IF    DOSPLUS        ; Under dos+
  1833.  
  1834. B2DEC:    LD    D,H
  1835.     LD    E,L
  1836.     LD    C,211        ; New BDOS call to print DE as decimal #
  1837.     JP    BDOSCALL    ; &ret
  1838.      ELSE            ; The long way under cp/m 2.2
  1839.  
  1840. ; convert 16 bit binary # in HL to up to 5 ascii decimal digits & print
  1841. ; suppress leading 0's
  1842. ; rtn fr Alan Miller, 8080/z80 assembly language
  1843. ;
  1844. B2DEC:    LD    B,0        ; Leading 0 flag
  1845.     LD    DE,-10000    ; 2's cpl of 10k
  1846.     CALL    SUBP10
  1847.     LD    DE,-1000
  1848.     CALL    SUBP10
  1849.     LD    DE,-100
  1850.     CALL    SUBP10
  1851.     LD    DE,-10
  1852.     CALL    SUBP10
  1853.     LD    A,L
  1854.     ADD    A,'0'        ; Ascii bias
  1855.     JP    PUTC        ; &ret
  1856.  
  1857. ; subtract power of 10 & count
  1858.  
  1859. SUBP10:    LD    C,'0'-1        ; Ascii count
  1860.  
  1861. SUB1:    INC    C
  1862.     ADD    HL,DE        ; Add neg #
  1863.     JR    C,SUB1
  1864.  
  1865. ; one subt too many, add 1 back
  1866.  
  1867.     LD    A,D        ; Cpl DE
  1868.     CPL
  1869.     LD    D,A
  1870.     LD    A,E
  1871.     CPL
  1872.     LD    E,A
  1873.     INC    DE        ; Add back
  1874.     ADD    HL,DE
  1875.     LD    A,C        ; Get digit
  1876.  
  1877. ; chk for '0'
  1878.  
  1879.     CP    '1'        ; '0'?
  1880.     JR    NC,NONZERO    ; No
  1881.     LD    A,B        ; Chk leading 0 flag
  1882.     OR    A        ; Set?
  1883.     LD    A,C        ; Get digit
  1884.     RET    Z        ; Skip leading 0
  1885.  
  1886. PRDIGIT:
  1887.     JP    PUTC        ; Print interior 0
  1888.  
  1889. NONZERO:
  1890.     LD    B,0FFH        ; Set leading 0 flag
  1891.     JR    PRDIGIT
  1892.      ENDIF            ; Not dosplus
  1893. ;..............................................................................
  1894. ;
  1895. ; hex/ascii display code
  1896. ; pg 0 is now really pg 0 if core dumping
  1897. ; display 256 bytes from pg# in a
  1898. ;
  1899. HEXASCII:
  1900.     LD    B,A        ; Save pg to show
  1901.     LD    A,(CORE)
  1902.     OR    A
  1903.     JR    NZ,HEXOFCORE    ; Core dump 0'th pg ptr is pg 0
  1904.     DEC    B        ; 0'th pg ptr is page 1
  1905.  
  1906. HEXOFCORE:
  1907.     LD    H,B        ;
  1908.     LD    L,0
  1909.     LD    DE,(BUFPTR)    ; 1st pg of file dump is here
  1910.     LD    A,(CORE)
  1911.     OR    A        ; Displaying memory?
  1912.     JR    Z,DUMPHERE    ; No, showing file
  1913.     LD    DE,0        ; 1st pg is beg of mem
  1914.  
  1915. DUMPHERE:
  1916.     ADD    HL,DE        ; HL pts to pg start adr
  1917.     ld    a,(hipg)    ; are we on last pg?
  1918.     dec    a        ; (core dumps don't matter)
  1919.     cp    b
  1920.     jr    NZ,dump16    ; if not, show 16
  1921.     ld    a,(filelen)    ; get low byte of filelen
  1922.     dec    a        ; 80->7f, 00->ff
  1923.     and    80h        ; 8th bit set means even # of sectors
  1924.     jr    nz,dump16    ; if even, show 16 lines
  1925.     ld    b,8        ; else show only 8
  1926.     jr    nxtlinehexasc
  1927. dump16:    LD    B,16        ; Show 16 lines
  1928.  
  1929. NXTLINEHEXASC:
  1930.     PUSH    BC        ; Save ctr
  1931.     CALL    DOHEXASCII
  1932.     POP    BC        ; Restore ctr
  1933.     DJNZ    NXTLINEHEXASC
  1934.     RET
  1935.  
  1936. ; display 1 line (16 chs) of hex/ascii
  1937. ; on entry: HL pts into buffer at start of line
  1938. ; on exit:  HL pts into buffer after last byte printed
  1939.  
  1940. DOHEXASCII:
  1941.     LD    B,16        ; # of bytes per line
  1942.  
  1943. ; put the adr of this line
  1944.  
  1945.     PUSH    HL        ; Save ptr adr
  1946.     LD    A,(CORE)
  1947.     OR    A        ; Displaying core?
  1948.     JR    NZ,SHOWCOREADR    ; Yes, show real adr
  1949.     LD    DE,(BUFPTR)
  1950.     XOR    A        ; Clr cy
  1951.     SBC    HL,DE        ; Subtract start of buffer from real addr
  1952.     INC    H        ; Add 100h bias for cpm tpa
  1953.  
  1954. SHOWCOREADR:
  1955.     LD    A,H
  1956.     PUSH    AF
  1957.     CALL    PUTHINIBBLE
  1958.     POP    AF
  1959.     CALL    PUTLONIBBLE
  1960.     LD    A,L
  1961.     PUSH    AF
  1962.     CALL    PUTHINIBBLE
  1963.     POP    AF
  1964.     CALL    PUTLONIBBLE
  1965.     CALL    SPACE2
  1966.     POP    HL        ; Get ptr adr back
  1967.  
  1968. ; chk if marking a found string
  1969.  
  1970. HEXLOOP:
  1971.     LD    A,(FOUND)
  1972.     OR    A
  1973.     JR    Z,HEXNOMARK    ; Not marking
  1974.     LD    A,(HEXSRCH)
  1975.     OR    A
  1976.     JR    Z,HEXNOMARK    ; Showing on ascii side only
  1977.     CALL    ATMATCHADR
  1978.     JR    NZ,HEXNOMARK
  1979.     CALL    ONHILITE
  1980.     LD    A,(HL)
  1981.     INC    HL
  1982.     PUSH    AF        ; Save byte to display
  1983.     CALL    PUTHINIBBLE
  1984.     POP    AF
  1985.     CALL    PUTLONIBBLE
  1986.     CALL    OFFHILITE
  1987.     PUSH    BC
  1988.     PUSH    HL
  1989.     CALL    FINDAGAIN    ; Find next match
  1990.     POP    HL
  1991.     POP    BC
  1992.     JR    HEXBYTEDONE
  1993.  
  1994. HEXNOMARK:
  1995.     LD    A,(HL)
  1996.     INC    HL
  1997.     PUSH    AF        ; Save byte to display
  1998.     CALL    PUTHINIBBLE
  1999.     POP    AF
  2000.     CALL    PUTLONIBBLE
  2001.  
  2002. HEXBYTEDONE:
  2003.     CALL    SPACE
  2004.     LD    A,B        ; Byte ctr
  2005.     CP    9        ; Half way thru hex display?
  2006.     CALL    Z,SPACE        ; If so, add an extra space
  2007.     DJNZ    HEXLOOP
  2008.  
  2009. ; now do ascii transl of these chs
  2010.  
  2011.     CALL    SPACE
  2012.  
  2013.     LD    DE,-16
  2014.     ADD    HL,DE        ; Back ptr up 16
  2015.     LD    B,16
  2016.  
  2017. ; chk if marking a found ascii string, just like for hex
  2018.  
  2019. ASCIILOOP:
  2020.     LD    A,(FOUND)
  2021.     OR    A
  2022.     JR    Z,ASCNOMARK    ; Not marking
  2023.     LD    A,(HEXSRCH)
  2024.     OR    A
  2025.     JR    NZ,ASCNOMARK    ; Showing on hex side only
  2026.     CALL    ATMATCHADR
  2027.     JR    NZ,ASCNOMARK
  2028.     CALL    ONHILITE
  2029.     LD    A,(HL)
  2030.     INC    HL
  2031.     CALL    PUTCIFASCII
  2032.     CALL    OFFHILITE
  2033.     PUSH    BC
  2034.     PUSH    HL
  2035.     CALL    FINDAGAIN
  2036.     POP    HL
  2037.     POP    BC
  2038.     JR    ASCBYTEDONE
  2039.  
  2040. ASCNOMARK:
  2041.     LD    A,(HL)
  2042.     INC    HL
  2043.     CALL    PUTCIFASCII
  2044.  
  2045. ASCBYTEDONE:
  2046.     DJNZ    ASCIILOOP
  2047.  
  2048.     LD    (CURRLINE),HL    ; Save ptr to curr 'line'
  2049.     LD    A,CR
  2050.     CALL    PUTC
  2051.     LD    A,(LINEBYLINE)
  2052.     OR    A
  2053.     RET    NZ
  2054.     LD    A,LF
  2055.     JP    PUTC        ; &ret
  2056.  
  2057. PUTHINIBBLE:
  2058.     SRL    A
  2059.     SRL    A
  2060.     SRL    A
  2061.     SRL    A
  2062.  
  2063. PUTLONIBBLE:
  2064.     AND    0FH
  2065.     ADD    A,'0'        ; Ascii number bias (0-9)
  2066.     CP    '9'+1
  2067.     JP    C,PUTC
  2068.  
  2069.      IF    UCHEX
  2070.     ADD    A,07H        ; If you like caps (A-F)
  2071.      ELSE
  2072.     ADD    A,27H        ; Ascii small letter bias (a-f)
  2073.      ENDIF
  2074.  
  2075.     JP    PUTC
  2076.  
  2077. ; print ch if from 20h to 7eh, else '.'
  2078.  
  2079. PUTCIFASCII:
  2080.     CP    ' '
  2081.     JR    C,NONASCII
  2082.     CP    7EH+1
  2083.     JR    C,PUTASCII
  2084.  
  2085. NONASCII:
  2086.     LD    A,'.'
  2087.  
  2088. PUTASCII:
  2089.     JP    PUTC        ; &ret
  2090.  
  2091.  
  2092. ; set z if at found $ adr
  2093. ; also set cy if matchadr is later in buffer than HL (matchadr > HL)
  2094.  
  2095. ATMATCHADR:
  2096.     PUSH    HL        ; Save *buffer
  2097.     LD    DE,(MATCHADR)
  2098.     XOR    A
  2099.     SBC    HL,DE        ; Z = at match adr; cy if matchadr > HL
  2100.     POP    HL
  2101.     RET
  2102.  
  2103. ;------------------------------------------------------------------------------
  2104. ; Routine to check for and handle ^S (pause) and ^C, ^K, etc, (abort).
  2105. ; This routine is called continuously (from PUTC) when running remote.
  2106. ; Local users can wait till the next screen ends.
  2107. ;
  2108. CKABRT:    PUSH    AF        ; Save all regs
  2109.     PUSH    BC
  2110.     PUSH    DE
  2111.     PUSH    HL
  2112.     PUSH    IX
  2113.     PUSH    IY
  2114.  
  2115.     LD    C,DIRIO        ; Normally, just check console status.
  2116.     LD    E,0FFH        ;
  2117.     CALL    BDOSEV
  2118.     OR    A
  2119.     JR    NZ,GOT1        ; (if a character is available)
  2120.  
  2121. RETABT:    POP    IY
  2122.     POP    IX
  2123.     POP    HL
  2124.     POP    DE        ; Always return from this subr from here
  2125.     POP    BC
  2126.     POP    AF
  2127.     RET
  2128.  
  2129. ; Analyze the character received
  2130.  
  2131. GOT1:    CP    'S'-40H        ; ^S pauses
  2132.     JR    Z,WA4CH        ; Yes, go to pause loop
  2133.  
  2134. GOT1B:    AND    1FH        ; ^C, ^K, ^X, C, K, X, etc all abort
  2135.     CP    CTRLC
  2136.     JR    Z,ABRT
  2137.     CP    CTRLK
  2138.     JR    Z,ABRT
  2139.     CP    CTRLX
  2140.     JR    NZ,RETABT    ; Ignore other keys
  2141.  
  2142. ABRT:    LD    (PUTCABRT),A    ; Yes, aborting from PUTC
  2143.     JP    QLEXIT        ; Fix stack and exit direct
  2144.  
  2145. WA4CH:    LD    C,DIRIO        ; Loop till we get any character
  2146.     LD    E,0FFH
  2147.     CALL    BDOSEV
  2148.     OR    A
  2149.     JR    Z,WA4CH
  2150.     JR    GOT1B        ; Continue. Process the char also, but not ^S.
  2151.  
  2152. ;..............................................................................
  2153. ;
  2154. ;
  2155. ; Check if a filename typ is in "badtbl" (routine basicly from LTxx)
  2156. ;
  2157. CHKTYP:    LD    (DESAVE),DE    ; Points to the extension to be checked
  2158.     LD    B,3        ; #of chars in typ
  2159.     LD    HL,BADTBL-3    ; Index bad file type table
  2160. TSTTY1:    INC    HL        ; Next table address pointer
  2161.     DEC    B        ; Bump loop counter
  2162.     JR    NZ,TSTTY1    ; Do until at next table entry
  2163.     LD    A,(HL)        ; Get a byte
  2164.     OR    A        ;
  2165.     RET    Z        ; End of table, is 'typable', rtn w/ clr carry
  2166.     LD    B,3        ; 3 char file type
  2167.     LD    DE,(DESAVE)    ; DE was supplied pointing to typ in question
  2168. TSTTY2:    LD    A,(DE)        ; Get a byte from typ
  2169.     AND    7FH        ; Strip any file attribute bits
  2170.     CP    (HL)
  2171.     JR    Z,TSTTY3    ; Match, continue scan
  2172.     LD    A,(HL)
  2173.     CP    '?'        ; '?' in table matches all
  2174.     JR    NZ,TSTTY1    ; No match, next entry
  2175. TSTTY3:    INC    HL        ; Bump table address pointer
  2176.     INC    DE        ; Bump extent pointer
  2177.     DJNZ    TSTTY2        ;
  2178.     SCF            ; Match, file not 'typable', rtn w/ carry set
  2179.     RET            ;
  2180.  
  2181. ;..............................................................................
  2182. ;
  2183. ;
  2184. ; Table of non-ascii filetypes (displayed in dim video).
  2185. ; These selections (and the matching routine itself)
  2186. ; were adapted from CB Falconer's LTxx series programs.
  2187. ;
  2188. BADTBL:    DEFB    'ABS'        ; Intended to disable
  2189.     DEFB    'ARC'        ; ===================
  2190.     DEFB    'ARK'
  2191.     DEFB    'BAD'
  2192.     DEFB    'CRL'
  2193.     DEFB    'C?M'        ; COM, CQM, CZM, CPM (v20 executes on PCs)
  2194.     DEFB    'E?E'        ; EXE, EQE, EZE   (MSDOS executable)
  2195.     DEFB    'IRL'
  2196.     DEFB    'I?T'        ; INT, IQT, IZT
  2197.     DEFB    'O??'        ; OBJ, OQJ, OZJ, OVL, OVR etc
  2198.     DEFB    'P?D'        ; PCD, PQD, PZD   (executable by RUNPCD)
  2199.     DEFB    'TX#'
  2200.     DEFB    'RBM'
  2201.     DEFB    'R?L'        ; REL, RQL, RZL
  2202.     DEFB    'S?R'        ; SLR, SQR, SZR   (SLR format rel files)
  2203.     DEFB    'SYS'
  2204.     DEFB    0,0,0
  2205.     DEFB    0,0,0        ; Spares, for user configuration
  2206.     DEFB    0,0,0
  2207.     DEFB    0        ; Table end marker
  2208.  
  2209. ;-----------------------------------------------------------------------------
  2210. ; This is the end of QL proper.  The remainder of the code consists of
  2211. ; QFC.LIB (the choose-by-number file interface), UNC.LIB (the uncruncher),
  2212. ; and QL.DTA (the data area), all of which are separate files.  The main
  2213. ; file uses INCLUDEs to put these all together. If you wish, you may
  2214. ; eliminate all INCLUDEs and append everything end to end with your editor.
  2215. ; You may also make more files and use more INCLUDEs. The current breakup is
  2216. ; a compromise, and sections have rearranged so related code is somewhat
  2217. ; more 'together' than in previous versions, but the program could probably
  2218. ; use further improvement in this area.
  2219. ;-----------------------------------------------------------------------------
  2220. B    'TX#'
  2221.     DEFB    'RBM'
  2222.     DEFB    'R?L'        ; REL, RQL, RZL
  2223.     DEFB    'S?R'        ; SLR, SQR, SZR   (SLR format rel files)
  2224.     DEFB    'SYS'