home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug060.arc / CPM#006.LBR / VDBTYPE.ASM < prev   
Encoding:
Assembly Source File  |  1979-12-31  |  19.6 KB  |  1,299 lines

  1. ;----------------------------------------------------------------------
  2. ;    VDBTYPE.ASM VERSION 1.0 MAY 9, 1985 (C) Norman H. Strassner
  3. ;
  4. ; This assembly language subroutine will, when assembled by ASM.COM and
  5. ; loaded into high memory by Dbase][, permit the typing of text files
  6. ; using a simple 'CALL' from Dbase][. These files may be standard ASCII or
  7. ; squeezed text files and may reside inside a Novieleski library, in any
  8. ; drive or user area.
  9. ;
  10. ; ****** THIS FILE IS NOT AN INDEPENDENTLY EXECUTABLE .COM FILE ******
  11. ; ******   IT MUST BE USED AS A CALLED FUNCTION UNDER DBASE][    ******
  12. ;----------------------------------------------------------------------
  13. ; To assemble:
  14. ; A>REN VDBTYPE.ASM=VDBTYP10.ASM    ;(make it an easier name)
  15. ; A>ASM VDBTYPE.AAZ            ;You won't need a .PRN file
  16. ;
  17. ;  In Dbase][, the format would be as follows:
  18. ;
  19. ; 1. Load the hex file:     (Dbase][ assumes an extension of .HEX)
  20. ;    LOAD VDBTYPE
  21. ;
  22. ; 2. Establish a "SET CALL TO":
  23. ;
  24. ;    SET CALL TO 41984    (This may be changed according to the
  25. ;                'ORG' statement at start of the program)
  26. ;
  27. ; 3. Store the filename, including optional drive/user and library name
  28. ;    information to a memory variable:
  29. ;
  30. ;    STORE '[DRIVE] [USER] [:] [LIBRARY]  <FILENAME.EXT>' TO <MEMVAR>
  31. ;           ^^^^^^^^^^^^^^^^^^(see note below)^^^^^^^^^^^^^^^^^^^^^^^
  32. ;
  33. ; 4. Use the "CALL" instruction to pass the variable to VDBTYPE
  34. ;    CALL    <MEMVAR>
  35. ;
  36. ;    The filename will now be typed on your screen, with pauses every
  37. ; 23 lines.  A ^C will abort the listing and return you to Dbase][.
  38. ;
  39. ;-----------------------------------------------------------------------
  40. ; * Notes on filenames:
  41. ; Examples of valid filenames to store to a dbase][ memory variable:
  42. ; if the dbase variable name is 'FNAME'
  43. ;
  44. ; This will type 'TEST.DAT' from the default drive/user
  45. ;    STORE 'TEST.DAT' TO FNAME
  46. ;    CALL FNAME
  47. ;
  48. ; This will unsqueeze 'TEST.DQT' from drive B, user 5 and type it
  49. ;    STORE 'B5:TEST.DQT' TO FNAME
  50. ;    CALL FNAME
  51. ;
  52. ; This will get 'TEST.DQT' from the library 'TESTLBR', unsqueeze it,
  53. ; and type it out.
  54. ;    STORE 'A1:TESTLBR TEST.DQT' TO FNAME
  55. ;    CALL FNAME
  56. ;-------------------------------------------------------------------
  57. ;
  58. ;        SAMPLE DBASE][ PROGRAM FOR USE WITH VDBTYP
  59. ;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  60. ; *VDBTYPE.CMD
  61. ; SET TALK OFF
  62. ; ERASE
  63. ; LOAD VDBTYPE
  64. ; SET CALL TO 41984
  65. ; DO WHILE T
  66. ; ?
  67. ; ? 'Text typing program for Dbase][.'
  68. ; ?
  69. ; ? 'Any text file, squeezed or not, even residing in a library,'
  70. ; ? 'may be listed on your computer screen directly from Dbase][.'
  71. ; ?
  72. ; ? 'At the prompt below, you may enter any valid filename in the forms:'
  73. ; ?
  74. ; ? 'FILENAME.EXT       --->  types FILENAME.EXT'
  75. ; ? 'FILENAME.EQT       --->  unsqueezes and types FILENAME.EXT'
  76. ; ? 'A3:FILNAME.EXT       --->  types the file from drive A, User 3'
  77. ; ? 'LBRNAME FILENAME.EXT  --->  types the file from within a library'
  78. ; ?
  79. ; ACCEPT 'Enter the file to display, or RETURN to exit ' TO FNAME
  80. ; IF FNAME=' '
  81. ;  RETURN
  82. ; ENDIF
  83. ; CALL FNAME
  84. ; ENDDO
  85. ;
  86. ;-------------------------------------------------------------------
  87. ;
  88. ; From the original TYPEL32.MAC by ESKAY.  All required subroutines that
  89. ; were originally called using the M80 assembler (SYSLIB.REL and USQB.REL
  90. ; files) were disassembled and incorporated into this .ASM file for easier
  91. ; assembly with ASM.COM or LASM.COM
  92. ;
  93. ;
  94. ; Revision History:
  95. ;--May 9, 1985--
  96. ;    Original writing.  Donated to the public domain for free
  97. ; distribution and use.  No one may charge for the use of this program
  98. ; without the express written permission of the author.
  99. ;
  100. ; Please report any bugs or updates to:
  101. ;
  102. ;    Norman H. Strassner c/o
  103. ;    VIDEOMAN RCP/M, XBBS, and DATABASES
  104. ;    1950 N. Normandie Ave.
  105. ;    Los Angeles, Ca.  90027
  106. ;    Voice: (213) 661-5000
  107. ;    BBS:   (213) 666-8588  1200/300bd
  108. ;
  109. ;------------------------------------------------------------------
  110. ;
  111. ;some needed equates:
  112. CR    EQU    0DH
  113. LF    EQU    0AH
  114. BDOS    EQU    0005H
  115. ;
  116. MXDRV:    EQU    1+'P'-40H    ;highest accessible drive + 1 (a=2)
  117. MXUSR:    EQU    1+15        ;highest accessible user + 1
  118. MXLPS:    EQU    23        ;max lines per screen -1 (0= no page)
  119. ;
  120. ;-------------------------------------------------------------------------
  121. ;
  122. ; This program is 6k of .HEX file on disk, but will actually use
  123. ; about 4608 bytes (1200H bytes) of memory.  For an 'ORG' of A400H, the
  124. ; last byte used for buffer space is at B5FFH, so do not locate any other
  125. ; program in high memory less than B600H for an ORG of A400H.
  126. ;
  127. ; 0A400H IS THE LOWEST POSSIBLE FREE MEMORY ADDRESS THAT DBASE][ DOES NOT
  128. ; USE FOR ANYTHING EXCEPT SORT ROUTINES. ** IF A SORT IS USED FROM DBASE][,
  129. ; THIS PROGRAM WILL BE WIPED OUT AND WOULD NEED TO BE LOADED AGAIN
  130. ;
  131.     ORG    0A400H    ;change this to suite your requirments
  132.             ;dbase][ call set to 41984 for org at A400H
  133. ;
  134. ;-------------------------------------------------------------------------
  135. ;
  136. ;Start of program:
  137. ;
  138. TYPE:    CALL    PRINT
  139.     DB    CR,LF,'VDBTYPE 1.0 (C)1985 Norman H. Strassner',CR,LF,0
  140.  
  141. SKIPC:    SHLD    STRING        ;save the string pointer
  142. ;
  143.     LXI    H,0        ;set up a local stack
  144.     DAD    SP
  145.     SHLD    STACK
  146.     LXI    SP,STACK
  147. ;
  148.     LXI    D,DBUF        ;set up our own default buffer
  149.     CALL    SETDMA
  150. ;
  151.     MVI    A,MXLPS
  152.     DCR    A        ;first page is one less than normal
  153.     STA    LPS
  154.     CALL    PUTUD        ;save default du
  155.     LXI    H,BUFF+1024    ;...buffer size
  156.     MOV    A,H
  157.     STA    TOPRAM
  158.     CALL    RETUD        ;get current drive/user
  159.     MOV    H,B
  160.     MOV    L,C
  161.     SHLD    USERNO        ;save current du
  162.     LHLD    STRING
  163.     MOV    A,M
  164.     INX    H
  165.     DCR    A        ;see if any file??? a=1=no=z
  166.     JZ    WHAT
  167. ;
  168.     LXI    D,FCB
  169.     CALL    FNAME        ;parse file name
  170.     JZ    WHAT        ;not a valid file name
  171.     MOV    A,M        ;get delimiter
  172.     STA    FFLAG        ;set flag lbr/non-lbr
  173.     PUSH    H        ;save command line ptr
  174.     INX    B        ;check if current du:
  175.     MOV    A,B
  176.     ORA    C
  177.     DCX    B        ;restore du: value
  178.     JZ    CURRDU        ;skip this if current
  179.     MOV    A,B        ;get specified drive
  180.     DCR    B        ;get into range 0..f
  181.     CPI    0FFH        ;ff means current drive
  182.     MVI    H,MXDRV
  183.     MVI    L,MXUSR
  184.     JNZ    NEWDSK        ;skip if different
  185.     LDA    DRIVENO
  186.     MOV    B,A
  187.     JMP    CURDSK
  188. ;
  189. NEWDSK:
  190.     CMP    H
  191.     JNC    ILLDU        ;yes - complain
  192. CURDSK:
  193.     MOV    A,C        ;get specified user area
  194.     CPI    '?'        ;all user areas???
  195.     JZ    ILLDU        ;yes - complain
  196.     CPI    0FFH        ;current user area?
  197.     JNZ    NEWUSR
  198.     LDA    USERNO
  199.     MOV    C,A
  200.     JMP    CURUSR
  201. ;
  202. NEWUSR:
  203.     CMP    L        ;illegal user specified?
  204.     JNC    ILLDU        ;yes - complain
  205. CURUSR:    CALL    LOGUD        ;log into specified du:
  206. CURRDU:    LDA    FFLAG        ;get flag
  207.     CPI    ' '        ;lbr member request?
  208.     POP    H        ;get cmd line ptr back
  209.     JNZ    NOLBF        ;nope, must be singlefile
  210.     INX    H        ;get next char
  211.     LXI    D,MEMFCB    ;point to member fcb
  212.     CALL    FNAME        ;parse member name
  213.     LXI    H,FCB+9        ;default to .lbr
  214.     MVI    M,'L'
  215.     INX    H
  216.     MVI    M,'B'
  217.     INX    H
  218.     MVI    M,'R'
  219.     LXI    D,FCB
  220.     CALL    F$OPEN        ;attempt to open file
  221.     INR    A
  222.     JZ    NOFILE        ;not a lbr file
  223.     CALL    F$READ        ;read directory into default buffer
  224.     LXI    H,DBUF        ;point to dbuf
  225.     LXI    D,DIRNAME    ;point to 8 blanks
  226.     CALL    CPFN        ;compare
  227.     JNZ    NOLBR        ;not equal
  228.     LXI    D,14
  229.     DAD    D
  230.     MOV    A,M
  231.     STA    DIRSIZ        ;directory size
  232.     XRA    A
  233.     STA    MEMFCB
  234.     JMP    C00        ;skip into directory check
  235. ;
  236. DIRLP:    LXI    D,FCB
  237.     CALL    F$READ
  238. C00:    LXI    B,20H
  239.     LXI    H,DBUF
  240.     LXI    D,MEMFCB
  241.     CALL    CPFN
  242.     JZ    FOUND
  243.     CALL    CPFN0
  244.     JZ    FOUND
  245.     CALL    CPFN0
  246.     JZ    FOUND
  247.     CALL    CPFN0
  248.     JZ    FOUND
  249.     LDA    DIRS
  250.     INR    A
  251.     STA    DIRS
  252.     MOV    B,A
  253.     LDA    DIRSIZ
  254.     CMP    B
  255.     JNZ    DIRLP
  256.     CALL    PRINT
  257.     DB    CR,LF
  258.     DB    'Member file not found',CR,LF,0
  259.     JMP    EREXT
  260. ;
  261. ; found the member file name in the ldir
  262. ;
  263. FOUND:    LXI    D,12
  264.     DAD    D
  265.     PUSH    H        ;save pointer for now,
  266.     INX    H        ;point to size
  267.     INX    H
  268.     MOV    A,M        ;get low byte
  269.     INX    H
  270.     ORA    M        ;if a=0 then file is 0k
  271.     JZ    NULLEN        ;go complain
  272.     POP    H        ;get pointer back
  273.     MOV    A,M        ;get file address
  274.     INX    H
  275.     MOV    H,M
  276.     MOV    L,A
  277. ;
  278. ; enter here from non-lbr routine with hl=0000
  279. ;
  280. DOTYP:
  281.     SHLD    FCB+33        ;set random record
  282.     LXI    D,FCB        ;get fcb...
  283.     CALL    RNDREAD        ;...and read random
  284.     LXI    B,DBUF        ;point to buffer
  285.     LDAX    B        ;get first byte
  286.     CPI    76H        ;if not 76h (=not squeezed)...
  287.     JNZ    PLAIN        ;...then process as text
  288.     INX    B        ;point to and...
  289.     LDAX    B        ;...get next byte
  290.     CPI    0FFH        ;if ff then squeezed..
  291.     JNZ    PLAIN        ;...else plain text (?)
  292. ;
  293.     CALL    UINIT
  294.     CALL    USQ        ;now unsqueeze and print
  295.     JMP    GOTEOF
  296. ;
  297. ; this routine fills the buffer then calls the print routine
  298. ;
  299. PLAIN:
  300.     MVI    B,8        ;(bufsz*1024)/128
  301.                 ;128 bytes each for 8 buffers=1024 bytes
  302.     LXI    D,BUFF        ;this is the destination
  303. MLP:
  304.     LXI    H,DBUF        ;this is the dbuf
  305.     PUSH    D
  306.     LXI    D,FCB
  307.     CALL    F$READ
  308.     POP    D
  309.     JNZ    GOTEOF        ;...in unsqueezed single files
  310.     MVI    C,80H
  311. MMV1:
  312.     MOV    A,M        ;get a dbuf character
  313.     STAX    D        ;and move it to buff
  314.     INX    H        ;increment buff ptr
  315.     INX    D        ;increment dbuf ptr
  316.     DCR    C        ;move bc number of bytes total
  317.     JNZ    MMV1        ;buffer is full, print it
  318. ;
  319.     DCR    B        ;for 8 times
  320.     JNZ    MLP
  321.     CALL    BUFULL        ;print the buffer
  322.     JMP    PLAIN
  323. ;
  324. GOTEOF:    MVI    M,1AH        ;definitely eof
  325.     CALL    BUFULL
  326.     JMP    FINISHED
  327. ;
  328. ; this is the print buffer routine (bufull)
  329. ;
  330. BUFULL:    PUSH    H
  331.     PUSH    D
  332.     PUSH    B
  333.     PUSH    PSW
  334.     LXI    H,BUFF
  335. BUFLP:    MOV    A,M
  336.     CPI    1AH
  337.     JZ    FINISHED
  338.     CPI    'I'-40H
  339.     JZ    PROCTAB
  340.     ANI    7FH        ;strip high bits
  341.     CALL    CCOUT
  342.     CPI    LF
  343.     JZ    EOLN
  344.     CALL    CONDIN        ;get keybd char if available
  345.     JZ    GOON        ;none there, go on
  346.     CPI    'C'-40H        ;if ^c...
  347.     JZ    ABORT        ;...then finished
  348.     CPI    'S'-40H        ;if not ^s...
  349.     JNZ    GOON        ;...then go on, else...
  350.     CALL    CIN        ;...wait for keypress
  351.     CPI    'C'-40H
  352.     JZ    ABORT
  353.     JMP    GOON
  354. ;
  355. ; this is not the syslib routine by same name...
  356. ;
  357. CONDIN:
  358.     PUSH    H
  359.     PUSH    D
  360.     PUSH    B
  361.     MVI    C,6
  362.     MVI    E,0FFH
  363.     CALL    BDOS
  364.     ORA    A
  365.     POP    B
  366.     POP    D
  367.     POP    H
  368.     RET
  369. ;
  370. EOLN:    MVI    A,0FFH        ;reset tab counter
  371.     STA    TAB
  372.  
  373.     MVI    A,MXLPS        ;get max lines per screen
  374.     ORA    A
  375.     JZ    GOON        ;skip if no page mode
  376.     LDA    LPS
  377.     DCR    A
  378.     STA    LPS
  379.     JNZ    GOON
  380.     CALL    PRINT
  381.     DB    '[more]',CR,0
  382.     CALL    CIN
  383.     CPI    'C'-40H
  384.     JZ    ABORT
  385.     CALL    PRINT
  386.     DB    '       ',CR,0
  387.     MVI    A,MXLPS
  388.     STA    LPS
  389.     JMP    GOON
  390. ;
  391. PROCTAB:
  392.     LDA    TAB        ;get current tab value
  393.     MOV    B,A        ;save current
  394.     ANI    0F8H        ;round down to last full 8
  395.     ADI    8        ;make next tab stop
  396. TABLP:
  397.     CALL    SPOUT        ;put space
  398.     INR    B        ;continue spaces to..
  399.     CMP    B        ;...next tab stop
  400.     JNZ    TABLP
  401.     STA    TAB        ;save next tab stop
  402.     JMP    GO1
  403. ;
  404. ; print a space
  405. ;
  406. SPOUT:    PUSH    PSW
  407.     MVI    A,' '
  408.     CALL    CCOUT
  409.     POP    PSW
  410.     RET
  411. ;
  412. GOON:    LDA    TAB        ;increment...
  413.     INR    A
  414.     STA    TAB        ;...tab counter
  415. GO1:    INX    H        ;increment buffer pointer
  416.     LDA    TOPRAM        ;get top of ram
  417.     CMP    H        ;if not yet reached...
  418.     JNZ    BUFLP        ;...then get next char
  419.     POP    PSW        ;else return to caller...
  420.     POP    B        ;...to get more
  421.     POP    D
  422.     POP    H
  423.     RET
  424. ;
  425. ; read random record, save all regs
  426. ;
  427. RNDREAD:
  428.     PUSH    D
  429.     PUSH    H
  430.     MVI    C,33
  431.     CALL    BDOS
  432.     POP    H
  433.     POP    D
  434.     RET
  435. ;
  436. ; process non-lbr file
  437. NOLBF:
  438.     LXI    D,FCB
  439.     CALL    F$OPEN        ;open the file
  440.     JNZ    NOFILE        ;not found...
  441.     CALL    F$READ        ;read first sector
  442.     ORA    A
  443.     LXI    H,0
  444.     JZ    DOTYP        ;type it now...
  445.     CALL    PRINT
  446.     DB    CR,LF
  447.     DB    'Empty file?',CR,LF,0
  448.     JMP    WHAT
  449.  
  450. ; here are the messages
  451. ;
  452. ILLDU:    CALL    PRINT
  453.     DB    CR,LF
  454.     DB    'Bad drive/user',CR,LF,0
  455.     JMP    WHAT
  456. ;
  457. NOFILE:    CALL    PRINT
  458.     DB    CR,LF
  459.     DB    'No such file',CR,LF,0
  460.     JMP    EREXT
  461. ;
  462. CPFN0:
  463.     DAD    B
  464. ;
  465. CPFN:    PUSH    H
  466.     PUSH    D
  467.     PUSH    B
  468.     MVI    B,12    ;12 characters
  469. CLPCP:    LDAX    D
  470.     CMP    M    ;check file name
  471.     JNZ    QCPFN    ;no match - quit
  472.     INX    D
  473.     INX    H
  474.     DCR    B
  475.     JNZ    CLPCP
  476. QCPFN:    POP    B
  477.     POP    D
  478.     POP    H
  479.     RET
  480. ;
  481. NOLBR:    CALL    PRINT
  482.     DB    CR,LF
  483.     DB    'LBR directory may be damaged',CR,LF,0
  484.     JMP    EREXT
  485. ;
  486. NOMEM:    CALL    PRINT
  487.     DB    CR,LF
  488.     DB    'Specify member file',CR,LF,0
  489.     JMP    WHAT
  490. ;
  491. NULLEN:    CALL    PRINT
  492.     DB    CR,LF
  493.     DB    '0k - cannot type.',CR,LF,0
  494.     JMP    EREXT
  495. ;
  496. NOAMB:    CALL    PRINT
  497.     DB    CR,LF
  498.     DB    'Bad filename.',CR,LF,0
  499. ;
  500. WHAT:    CALL    PRINT
  501.     DB    ';;ERROR!',CR,LF,0
  502.     DB    CR,LF,0
  503.     JMP    EREXT
  504. ;
  505. ABORT:
  506.     CALL    PRINT
  507.     DB    CR,LF,'+++ABORTED+++',CR,LF,0
  508.     JMP    EREXT
  509. ;
  510. FINISHED:
  511.     CALL    PRINT
  512.     DB    CR,LF,'[--End of File--]  Press any key>',7,0
  513.     CALL    CIN
  514.     MVI    A,CR
  515.     CALL    CO
  516. EREXT:
  517.     CALL    GETUD        ;restore default du
  518.     LXI    D,80H
  519.     CALL    SETDMA
  520.     LHLD    STACK
  521.     SPHL
  522.     RET
  523. ;
  524. SETDMA:
  525.     MVI    C,1AH
  526.     JMP    5
  527. ;
  528. ;unsqueeze routine
  529. USQ:
  530.     XRA    A
  531.     STA    X0345
  532.     STA    X0346
  533.     LHLD    X033B
  534.     SHLD    X033F
  535.     SHLD    X0341
  536.     CALL    X0267
  537.     CALL    X0267
  538.     SHLD    X0347
  539. X013A:
  540.     CALL    X0216
  541.     JNZ    EREXT
  542.     ORA    A
  543.     JNZ    X013A
  544.     CALL    X0267
  545.     SHLD    X034B
  546.     LXI    D,0102H
  547.     CALL    CMP$HLDE
  548.     JC    X0180
  549.     CALL    PRINT
  550.     DB    CR,LF,'Illegal decode size.',0
  551.     JMP    WHAT
  552. ;
  553. X0180:
  554.     LXI    D,TABLE
  555. X0183:
  556.     SHLD    X034D
  557.     MOV    A,H
  558.     ORA    L
  559.     JZ    X01A7
  560.     PUSH    D
  561.     CALL    X0267
  562.     POP    D
  563.     XCHG
  564.     MOV    M,E
  565.     INX    H
  566.     MOV    M,D
  567.     INX    H
  568.     PUSH    H
  569.     CALL    X0267
  570.     XCHG
  571.     POP    H
  572.     MOV    M,E
  573.     INX    H
  574.     MOV    M,D
  575.     INX    H
  576.     XCHG
  577.     LHLD    X034D
  578.     DCX    H
  579.     JMP    X0183
  580. X01A7:
  581.     LXI    H,0
  582. X01AA:
  583.     PUSH    H
  584.     CALL    X02A2
  585.     POP    H
  586.     JNZ    X01D2
  587.     MOV    E,A
  588.     MVI    D,0
  589.     DAD    D
  590.     PUSH    H
  591.     PUSH    PSW
  592.     LHLD    X0343
  593.     LDA    TOPRAM
  594.     CMP    H
  595.     JNZ    X01C8
  596.     CALL    BUFULL
  597.     LXI    H,BUFF
  598. X01C8:
  599.     POP    PSW
  600.     MOV    M,A
  601.     INX    H
  602.     SHLD    X0343
  603.     POP    H
  604.     JMP    X01AA
  605. X01D2:
  606.     XCHG
  607.     LHLD    X0347
  608.     CALL    CMP$HLDE
  609.     RZ
  610.     CALL    PRINT
  611.     DB    CR,LF,'File checksum error',0
  612.     JMP    WHAT
  613. ;
  614. CMP$HLDE:
  615.     MOV    A,H
  616.     CMP    D
  617.     RNZ
  618.     MOV    A,L
  619.     CMP    E
  620.     RET
  621. ;
  622. X0216:
  623.     LHLD    X0341
  624.     XCHG
  625.     LHLD    X033F
  626.     CALL    CMP$HLDE
  627.     JZ    X022A
  628.     MOV    A,M
  629.     INX    H
  630.     SHLD    X033F
  631.     CMP    A
  632.     RET
  633. X022A:
  634.     LHLD    X033B
  635.     SHLD    X033F
  636.     SHLD    X0341
  637. X0233:
  638.     PUSH    H
  639.     XCHG
  640.     MVI    C,1AH
  641.     CALL    BDOS$CALL
  642.     LXI    D,FCB
  643.     MVI    C,14H
  644.     CALL    BDOS$CALL
  645.     POP    H
  646.     ORA    A
  647.     JNZ    X0256
  648.     LXI    D,80H
  649.     DAD    D
  650.     XCHG
  651.     LHLD    X033D
  652.     CALL    CMP$HLDE
  653.     XCHG
  654.     JNC    X0233
  655. X0256:
  656.     SHLD    X0341
  657.     XCHG
  658.     LHLD    X033F
  659.     CALL    CMP$HLDE
  660.     JNZ    X0216
  661.     MVI    A,0FFH
  662.     ORA    A
  663.     RET
  664. X0267:
  665.     CALL    X0216
  666.     JNZ    PREM$EOF
  667.     PUSH    PSW
  668.     CALL    X0216
  669.     JNZ    PREM$EOF
  670.     MOV    H,A
  671.     POP    PSW
  672.     MOV    L,A
  673.     RET
  674. PREM$EOF:
  675.     CALL    PRINT
  676.     DB    CR,LF,'Premature EOF',0
  677.     JMP    WHAT
  678. X02A2:
  679.     LDA    X0346
  680.     ORA    A
  681.     JZ    X02B2
  682.     DCR    A
  683.     STA    X0346
  684.     LDA    X0349
  685.     CMP    A
  686.     RET
  687. X02B2:
  688.     CALL    X02D4
  689.     CPI    90H
  690.     JNZ    X02CF
  691.     CALL    X02D4
  692.     ORA    A
  693.     JNZ    X02C5
  694.     MVI    A,90H
  695.     CMP    A
  696.     RET
  697. X02C5:
  698.     DCR    A
  699.     DCR    A
  700.     STA    X0346
  701.     LDA    X0349
  702.     CMP    A
  703.     RET
  704. X02CF:
  705.     STA    X0349
  706.     CMP    A
  707.     RET
  708. X02D4:
  709.     LXI    D,0
  710.     LDA    X034A
  711.     MOV    C,A
  712. X02DB:
  713.     LDA    X0345
  714.     ORA    A
  715.     JNZ    X02ED
  716.     PUSH    D
  717.     CALL    X0216
  718.     JNZ    PREM$EOF
  719.     POP    D
  720.     MOV    C,A
  721.     MVI    A,8
  722. X02ED:
  723.     DCR    A
  724.     STA    X0345
  725.     MOV    A,C
  726.     RRC
  727.     MOV    C,A
  728.     LXI    H,TABLE
  729.     JNC    X02FC
  730.     INX    H
  731.     INX    H
  732. X02FC:
  733.     DAD    D
  734.     DAD    D
  735.     DAD    D
  736.     DAD    D
  737.     MOV    E,M
  738.     INX    H
  739.     MOV    D,M
  740.     MOV    A,D
  741.     ANI    80H
  742.     JZ    X02DB
  743.     MOV    A,C
  744.     STA    X034A
  745.     MOV    A,D
  746.     CPI    0FEH
  747.     MVI    A,1AH
  748.     JZ    X0319
  749.     MOV    A,E
  750.     CMA
  751.     CMP    A
  752.     RET
  753. X0319:
  754.     POP    H
  755.     ORA    A
  756.     RET
  757. ;
  758. UINIT:
  759.     LXI    H,DBUF
  760.     SHLD    X033B
  761.     SHLD    X033F
  762.     SHLD    X0341
  763.     LXI    H,X0345
  764.     MVI    A,9
  765. X032D:
  766.     MVI    M,0
  767.     INX    H
  768.     DCR    A
  769.     JNZ    X032D
  770.     LXI    H,BUFF
  771.     SHLD    X0343
  772.     RET
  773. ;
  774. FNAME:
  775.     PUSH    D
  776.     MVI    A,0FFH
  777.     STA    L0485
  778.     STA    L0486
  779.     MVI    B,'$'
  780.     PUSH    D
  781.     XRA    A
  782. L03A0:
  783.     STAX    D
  784.     INX    D
  785.     DCR    B
  786.     JNZ    L03A0
  787.     POP    D
  788.     PUSH    H
  789. L03A8:
  790.     MOV    A,M
  791.     INX    H
  792.     CPI    ':'
  793.     JZ    L03BC
  794.     CPI    ','
  795.     JZ    L0417
  796. ;
  797.     CPI    '!'
  798.     JC    L0417
  799.     JMP    L03A8
  800. L03BC:
  801.     POP    H
  802.     MOV    A,M
  803.     CALL    MAKEUCASE
  804.     CPI    'A'
  805.     JC    L03D5
  806.     SUI    'A'
  807.     CPI    10H
  808.     JC    L03D0
  809. L03CD:
  810.     XRA    A
  811.     POP    D
  812.     RET
  813. L03D0:
  814.     INR    A
  815.     STA    L0485
  816.     INX    H
  817. L03D5:
  818.     MOV    A,M
  819.     CPI    ':'
  820.     JZ    L0418
  821.     CPI    '?'
  822.     JNZ    L03ED
  823.     STA    L0486
  824.     INX    H
  825.     MOV    A,M
  826.     CPI    ':'
  827.     JZ    L0418
  828.     JMP    L03CD
  829. L03ED:
  830.     XRA    A
  831.     MOV    B,A
  832. L03EF:
  833.     MOV    A,M
  834.     INX    H
  835.     CPI    ':'
  836.     JZ    L040B
  837.     SUI    '0'
  838.     JC    L03CD
  839.     CPI    LF
  840.     JNC    L03CD
  841.     MOV    C,A
  842.     MOV    A,B
  843.     ADD    A
  844.     ADD    A
  845.     ADD    B
  846.     ADD    A
  847.     ADD    C
  848.     MOV    B,A
  849.     JMP    L03EF
  850. L040B:
  851.     MOV    A,B
  852.     CPI    ' '
  853.     JNC    L03CD
  854.     STA    L0486
  855.     JMP    L0418
  856. L0417:
  857.     POP    H
  858. L0418:
  859.     MOV    A,M
  860.     CPI    ':'
  861.     JNZ    L041F
  862.     INX    H
  863. L041F:
  864.     MOV    A,M
  865.     CPI    ','
  866.     JZ    L042A
  867.     CPI    '!'
  868.     JNC    L0442
  869. L042A:
  870.     INX    D
  871.     MVI    B,0BH
  872.     MVI    A,'?'
  873. L042F:
  874.     STAX    D
  875.     INX    D
  876.     DCR    B
  877.     JNZ    L042F
  878. L0435:
  879.     LDA    L0485
  880.     MOV    B,A
  881.     LDA    L0486
  882.     MOV    C,A
  883.     POP    D
  884.     MVI    A,0FFH
  885.     ORA    A
  886.     RET
  887. L0442:
  888.     MVI    B,8
  889.     CALL    L045C
  890.     MVI    B,3
  891.     MOV    A,M
  892.     CPI    '.'
  893.     JNZ    L0456
  894.     INX    H
  895.     CALL    L045C
  896.     JMP    L0435
  897. L0456:
  898.     CALL    L047C
  899.     JMP    L0435
  900. L045C:
  901.     CALL    CHAR$CHK
  902.     JZ    L047C
  903.     INX    D
  904.     CPI    '*'
  905.     JNZ    L046E
  906.     MVI    A,'?'
  907.     STAX    D
  908.     JMP    L0470
  909. L046E:
  910.     STAX    D
  911.     INX    H
  912. L0470:
  913.     DCR    B
  914.     JNZ    L045C
  915. L0474:
  916.     CALL    CHAR$CHK
  917.     RZ
  918.     INX    H
  919.     JMP    L0474
  920. L047C:
  921.     INX    D
  922.     MVI    A,' '
  923.     STAX    D
  924.     DCR    B
  925.     JNZ    L047C
  926.     RET
  927. ;
  928. CHAR$CHK:
  929.     MOV    A,M
  930.     CALL    MAKEUCASE
  931.     ORA    A
  932.     RZ
  933.     CPI    '!'
  934.     JC    L04AA
  935.     CPI    '='
  936.     RZ
  937.     CPI    '_'
  938.     RZ
  939.     CPI    '.'
  940.     RZ
  941.     CPI    ':'
  942.     RZ
  943.     CPI    ';'    ;3bh
  944.     RZ
  945.     CPI    ','
  946.     RZ
  947.     CPI    '<'
  948.     RZ
  949.     CPI    '>'
  950.     RET
  951. L04AA:
  952.     CMP    M
  953.     RET
  954. ;
  955. F$OPEN:    ; open file:
  956.     PUSH    B
  957.     PUSH    D
  958.     PUSH    H
  959.     MVI    C,0FH
  960.     CALL    BDOS
  961.     CPI    0FFH
  962.     JNZ    L04BF
  963. L04B9:
  964.     MVI    A,0FFH
  965.     ORA    A
  966.     JMP    L04C0
  967. L04BF:
  968.     XRA    A
  969. L04C0:
  970.     POP    H
  971.     POP    D
  972.     POP    B
  973.     RET
  974. ;
  975. F$READ:    ; file read:
  976.     PUSH    H
  977.     PUSH    B
  978.     MVI    C,14H
  979.     CALL    BDOS$CALL
  980.     ORA    A
  981.     POP    B
  982.     POP    H
  983.     RET
  984. ;
  985. PRINT:    ;in line print routine
  986.     XTHL
  987.     CALL    PRINT1
  988.     XTHL
  989.     RET
  990. PRINT1:
  991.     PUSH    D
  992.     PUSH    B
  993.     PUSH    PSW
  994.     MVI    C,0
  995. PRINT$LP:
  996.     MOV    A,M
  997.     INX    H
  998.     ORA    A
  999.     JZ    L0543
  1000.     CPI    9
  1001.     JZ    L052D
  1002.     INR    C
  1003.     CALL    CCOUT
  1004.     CPI    CR
  1005.     JZ    L051A
  1006.     CPI    LF
  1007.     JZ    L051F
  1008.     CPI    7
  1009.     JZ    L051F
  1010.     CPI    8
  1011.     JZ    L0523
  1012.     JMP    PRINT$LP
  1013. L051A:
  1014.     MVI    C,0
  1015.     JMP    PRINT$LP
  1016. L051F:
  1017.     DCR    C
  1018.     JMP    PRINT$LP
  1019. L0523:
  1020.     MOV    A,C
  1021.     ORA    A
  1022.     JZ    PRINT$LP
  1023.     DCR    C
  1024.     DCR    C
  1025.     JMP    PRINT$LP
  1026. L052D:
  1027.     MOV    A,C
  1028.     ANI    7
  1029.     MOV    B,A
  1030.     MVI    A,8
  1031.     SUB    B
  1032.     MOV    B,A
  1033.     ADD    C
  1034.     MOV    C,A
  1035.     MVI    A,' '
  1036. L0539:
  1037.     CALL    CO
  1038.     DCR    B
  1039.     JNZ    L0539
  1040.     JMP    PRINT$LP
  1041. L0543:
  1042.     POP    PSW
  1043.     POP    B
  1044.     POP    D
  1045.     RET
  1046. ;
  1047. CCOUT:    ; character out (convert ctl chars):
  1048.     CPI    ' '
  1049.     JNC    CO
  1050.     CPI    0
  1051.     JZ    CO
  1052.     CPI    7
  1053.     JZ    CO
  1054.     CPI    8
  1055.     JZ    CO
  1056.     CPI    LF
  1057.     JZ    CO
  1058.     CPI    CR
  1059.     JZ    CO
  1060.     PUSH    PSW
  1061.     PUSH    PSW
  1062.     MVI    A,'^'
  1063.     CALL    CO
  1064.     POP    PSW
  1065.     ADI    '@'
  1066.     CALL    CO
  1067.     POP    PSW
  1068.     RET
  1069. ;
  1070. CIN:    ; character in:
  1071.     PUSH    B
  1072.     PUSH    H
  1073.     MVI    C,1
  1074.     CALL    BDOS$CALL
  1075.     POP    H
  1076.     POP    B
  1077.     RET
  1078. ;
  1079. CO:
  1080.     PUSH    PSW
  1081.     PUSH    B
  1082.     PUSH    D
  1083.     PUSH    H
  1084.     MOV    E,A
  1085.     MVI    C,2
  1086.     CALL    BDOS
  1087.     POP    H
  1088.     POP    D
  1089.     POP    B
  1090.     POP    PSW
  1091.     RET
  1092. ;
  1093. PUTUD:    ; save current du:
  1094.     PUSH    PSW
  1095.     PUSH    B
  1096.     PUSH    D
  1097.     PUSH    H
  1098.     MVI    C,19H
  1099.     CALL    BDOS
  1100.     STA    CURNTDSK
  1101.     MVI    E,0FFH
  1102.     MVI    C,' '
  1103.     CALL    BDOS
  1104.     STA    CURNTUSR
  1105.     JMP    L05C8
  1106. ;
  1107. GETUD:    ; restore default du:
  1108.     PUSH    PSW
  1109.     PUSH    B
  1110.     PUSH    D
  1111.     PUSH    H
  1112.     LDA    CURNTDSK
  1113.     MOV    E,A
  1114.     MVI    C,0EH
  1115.     CALL    BDOS
  1116.     LDA    CURNTUSR
  1117.     MOV    E,A
  1118.     MVI    C,' '
  1119.     CALL    BDOS
  1120. L05C8:
  1121.     POP    H
  1122.     POP    D
  1123.     POP    B
  1124.     POP    PSW
  1125.     RET
  1126. ;
  1127. LOGUD:
  1128.     PUSH    PSW
  1129.     PUSH    B
  1130.     PUSH    D
  1131.     PUSH    H
  1132.     MOV    E,C
  1133.     MVI    C,' '
  1134.     PUSH    B
  1135.     CALL    BDOS
  1136.     POP    B
  1137.     MOV    E,B
  1138.     MVI    C,0EH
  1139.     CALL    BDOS
  1140.     POP    H
  1141.     POP    D
  1142.     POP    B
  1143.     POP    PSW
  1144.     RET
  1145. RETUD:
  1146.     PUSH    PSW
  1147.     PUSH    D
  1148.     PUSH    H
  1149.     MVI    C,19H
  1150.     CALL    BDOS
  1151.     PUSH    PSW
  1152.     MVI    E,0FFH
  1153.     MVI    C,' '
  1154.     CALL    BDOS
  1155.     MOV    C,A
  1156.     POP    PSW
  1157.     MOV    B,A
  1158.     POP    H
  1159.     POP    D
  1160.     POP    PSW
  1161.     RET
  1162. ;
  1163. BDOS$CALL:    ; bdos call:
  1164.     PUSH    B
  1165.     PUSH    D
  1166.     CALL    BDOS
  1167.     POP    D
  1168.     POP    B
  1169.     RET
  1170. ;
  1171. DIVHD:
  1172.     PUSH    PSW
  1173.     PUSH    B
  1174.     PUSH    H
  1175.     LXI    H,0
  1176.     SHLD    L0662
  1177.     POP    H
  1178.     MOV    A,H
  1179.     CMP    D
  1180.     JC    L0647
  1181.     JNZ    L061C
  1182.     MOV    A,L
  1183.     CMP    E
  1184.     JC    L0647
  1185. L061C:
  1186.     MVI    B,10H
  1187. L061E:
  1188.     CALL    L064D
  1189.     PUSH    H
  1190.     LHLD    L0662
  1191.     CALL    L065E
  1192.     SHLD    L0662
  1193.     MOV    A,L
  1194.     SUB    E
  1195.     MOV    L,A
  1196.     MOV    A,H
  1197.     SBB    D
  1198.     MOV    H,A
  1199.     JC    L063F
  1200.     SHLD    L0662
  1201.     POP    H
  1202.     MOV    A,L
  1203.     ORI    1
  1204.     MOV    L,A
  1205.     JMP    L0640
  1206. L063F:
  1207.     POP    H
  1208. L0640:
  1209.     DCR    B
  1210.     JNZ    L061E
  1211. L0644:
  1212.     POP    B
  1213.     POP    PSW
  1214.     RET
  1215. L0647:
  1216.     LXI    H,0
  1217.     JMP    L0644
  1218. L064D:
  1219.     PUSH    PSW
  1220.     ANA    A
  1221. L064F:
  1222.     MOV    A,L
  1223.     RAL
  1224.     MOV    L,A
  1225.     MOV    A,H
  1226.     RAL
  1227.     MOV    H,A
  1228.     JNC    L065B
  1229.     POP    PSW
  1230.     STC
  1231.     RET
  1232. L065B:
  1233.     POP    PSW
  1234.     ORA    A
  1235.     RET
  1236. L065E:
  1237.     PUSH    PSW
  1238.     JMP    L064F
  1239. ;
  1240. MAKEUCASE:
  1241.     ANI    7FH
  1242.     CPI    61H
  1243.     RC
  1244.     CPI    7BH
  1245.     RNC
  1246.     ANI    '_'
  1247.     RET
  1248. ;
  1249. ;storage for unsqueeze routines
  1250. CURNTDSK:
  1251.     DB    0
  1252. CURNTUSR:
  1253.     DB    0
  1254. ;
  1255. L0485:    DB    0
  1256. L0486:    DB    0
  1257. L0662:    DW    0    ;divide storage
  1258. X033B:    DW    0
  1259. X033D:    DW    0
  1260. X033F:    DW    0
  1261. X0341:    DW    0
  1262. X0343:    DW    0
  1263. X0345:    DB    0
  1264. X0346:    DB    0
  1265. X0347:    DW    0
  1266. X0349:    DB    7EH
  1267. X034A:    DB    0FEH
  1268. X034B:    DW    0
  1269. X034D:    DW    0
  1270. ;
  1271. FFLAG:    DB    0        ;flag for lbr/non-lbr
  1272. TOPRAM:    DB    0        ;hi byte of buffer end
  1273. DIRS:    DB    0        ;# of dir sectors processed
  1274. DIRSIZ:    DB    0        ;# of total dir sectors
  1275. TAB:    DB    0        ;current line tab
  1276. LIN:    DB    0        ;line count
  1277. LPS:    DB    0        ;line count for page mode
  1278. USERNO:    DB    0        ;current user #
  1279. DRIVENO:DB    0        ;current drive
  1280. DIRNAME:DB    0,'           '
  1281. STRING:    DW    0
  1282. STORDMA:DW    0
  1283. ;
  1284.     DS    50        ;25 level stack
  1285. STACK:    DW    0        ;save cp/m stack pointer here
  1286. ;
  1287. MEMFCB    EQU    $
  1288. FCB    EQU    MEMFCB+37
  1289. DFCB    EQU    FCB+37
  1290. DBUF    EQU    DFCB+37
  1291. TABLE    EQU    DBUF+129
  1292. BUFF    EQU    ((TABLE    + 1034)    OR 0FFH) + 1 ;set on page boundry
  1293. ;
  1294.     END
  1295. 7
  1296. DFCB    EQU    FCB+37
  1297. DBUF    EQU    DFCB+37
  1298. TABLE    EQU    DBUF+129
  1299. BUFF    EQU    ((TABLE    + 1034)    OR 0FFH) + 1 ;set on pa