home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / compress / ql40.arc / QL.002 < prev    next >
Text File  |  1991-08-11  |  39KB  |  1,814 lines

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