home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / bye5 / whatsn05.lbr / WHATSN05.AQM / WHATSN05.ASM
Assembly Source File  |  1986-04-18  |  20KB  |  824 lines

  1.  
  2. ; WHATSN05 - Displays XMODEM.LOG (or LOG.SYS) in reverse order - 03/01/86
  3. ;
  4. ;              WHATSNEW.ASM
  5. ;                   by
  6. ;              Irvin M. Hoff
  7. ;             (01 March 1986)
  8. ;
  9.     ASEG            ; For M80 and RMAC, ignore if using MAC
  10. ;
  11. ;
  12. ; This program is really two-in-one.  It is for use with RCPM systems
  13. ; having a XMODEM.LOG (or LOG.SYS) of all file transfers created by the
  14. ; XMODEM file transfer program.  (If using MBYE, substitute the term
  15. ; LOG.SYS wherever appears and set the MBYE equate to YES.)
  16. ;
  17. ;    Program 1 = shows the XMODEM.LOG in reverse order, newest first
  18. ;    Program 2 = shows only uploads in reverse, ignoring downloads
  19. ;
  20. ;    WARNING:  Versions of XMODEM prior to 101 did not
  21. ;          mark uploads to private areas differently
  22. ;          from normal uploads.
  23. ;
  24. ;=======================================================================
  25. ;
  26. ; 03/01/86 - Added pagination, also allowed WHEEL users to specify
  27. ;   v05      WHATSNEW A to see uploads and downloads without maintaining
  28. ;            a second copy of program online.   - Michael Conley
  29. ;
  30. ;=======================================================================
  31. ;
  32. ; SHOWAL set to 0 - gives Program 1
  33. ; ---------------------------------
  34. ; Before configuring this, note that WHEEL users may show all files by
  35. ; typing "WHATSNEW A" on the command line, regardless of SHOWAL equate.
  36. ;
  37. ; When the SHOWAL option is set to "0", all files in the XMODEM.LOG are
  38. ; shown in reverse order.  This is particularly useful to SYSOPs to see
  39. ; who has most recently uploaded/downloaded any files and what they are.
  40. ; It can be placed in A15: with other private .COM files or A0: for all
  41. ; to use, if desired.  Call this program ALL.COM for easy reference.
  42. ;
  43. ; SHOWAL set to 1, gives Program 2
  44. ; --------------------------------
  45. ; This program displays the "R" (new files) entries entered by XMODEM
  46. ; into the XMODEM.LOG file, in inverse order.  It replaces the WHATSNEW
  47. ; files used in the past for RCPM systems.  (If the wheel byte is set
  48. ; for the SYSOP's use, it includes any "P" private uploads.  These are
  49. ; shown with an "*" after the drive/user number.)  This program is de-
  50. ; signed to work with XMDM101 or later.  It may need to be customized
  51. ; slightly, depending on how your LASTCALR file is arranged.  It goes in
  52. ; the A0: area and can be called from any drive/user area.  It is essen-
  53. ; tially self-maintaining, which makes it quite different from WHATSNEW
  54. ; programs previously used, made via D-29, etc.  It is 1k long and fully
  55. ; secure.  (Change equates below if your XMODEM.LOG isn't in A14: area.)
  56. ;
  57. ;    NOTE:  You can use DDT to set the following byte:
  58. ;
  59. ;        0103H 00 program 1, shows all file transfers
  60. ;              01 program 2, uploads only, for WHATSNEW.
  61. ;
  62. ;        Then  A>SAVE 5 NEW.COM
  63. ;
  64. ;    Suggestion:  Make one of each, call one ALL.COM and put on
  65. ;             A15: for easy use by the SYSOP and the other
  66. ;             WHATSNEW.COM and put on A0: for all to use.
  67. ;
  68. ;-----------------------------------------------------------------------
  69. ;
  70. ; INFO:
  71. ; ----
  72. ;    A companion program currently called XMDEL automatically
  73. ;    deletes all downloaded files from XMODEM.LOG, keeping
  74. ;    the uploads for WHATSNEW.  This minimimizes the length
  75. ;    of the XMODEM.LOG file, since "most" of the lines are
  76. ;    for downloads.    The combination of WHATSNEW and XMDEL make
  77. ;    the entire new file display almost fully self-maintaining.
  78. ;
  79. ;-----------------------------------------------------------------------
  80. ;
  81. ; OPTIONS:
  82. ; -------
  83. ;    SHOWAL  0 = Shows all files in the XMODEM.LOG in reverse manner
  84. ;            Makes this into a second program, see below
  85. ;         1 = Allows options above to work normally
  86. ;
  87. ;    OPTION  0 = No header, shows "R" lines of XMODEM.LOG "as is".
  88. ;         1 = Header, uses example 1 below  (OxGate 001 system)
  89. ;         2 = Header, uses example 2 below  (Potpourri system)
  90. ;
  91. ;    HEADER  0 = No header, regardless of option below
  92. ;         1 = use header selected by option below
  93. ;
  94. ;---------------
  95. ;
  96. ; Example 0:  (no header, no changes, before and after the same.  Picks
  97. ;          out the "R" lines from the XMODEM.LOG and displays in re-
  98. ;          verse order (newest uploads, first).
  99. ;
  100. ;---------------
  101. ;
  102. ; Example 1:  OxGate 001 (before)
  103. ;
  104. ; R6 02:22 B00>WHATSNEWLBR        26k Irv Hoff 1/22/85
  105. ;
  106. ;          (after)
  107. ;
  108. ; D/U     Filename   Size   Speed    Uploaded by
  109. ;
  110. ; B00: WHATSNEW.LBR  26k  1200 bps  Irv Hoff 1/22/85
  111. ;
  112. ;---------------
  113. ;
  114. ; Example 2:  Potpourri (before)
  115. ;
  116. ; R6 02:22 B00>WHATSN01LBR        26k 01/22/85 16:44 Irv Hoff
  117. ;
  118. ;          (after)
  119. ; D/U     Filename   Size   Speed      Date    Time   Uploaded by
  120. ;
  121. ; B00: WHATSN01.LBR  26k  1200 bps  01/22/85  16:44  Irv Hoff
  122. ;
  123. ;-----------------------------------------------------------------------
  124. ;
  125. ; Features:
  126. ; ---------
  127. ;    1) Should be placed in A0: so any user can call the program
  128. ;    2) Should be renamed to WHATSNEW.COM at that time
  129. ;    3) Automatically remembers current drive/user area
  130. ;    4) Jumps to A14: to read the XMODEM.LOG file, with full security
  131. ;    5) Opens the XMODEM.LOG file, if empty says "NO NEW FILES"
  132. ;    6) Copies each line starting with "R" into a one-line buffer
  133. ;    7) Customizes that line, if OPTION 1 or 2 is selected
  134. ;    8) Stores the line in a memory buffer
  135. ;    9) When all lines are read, displays them in inverse order,
  136. ;        thus showing most recent files first.
  137. ;      10) CTL-C, CTL-K, CTL-X, C, K, X, c, k, x all will abort after
  138. ;        finishing the current line.
  139. ;      11) Can be called from any drive/user area
  140. ;      12) Returns to original drive/user area from which it was called
  141. ;      13) WHEEL users may specify "WHATSNEW A" to see uploads and
  142. ;               downloads regardless of SHOWAL equate setting.
  143. ;      14) Pagination added -- equate sets page length or 0 to override
  144. ;          pagination feature.
  145. ;
  146. ; The SYSOP can readily customize this program to suit his preferences.
  147. ; The area around W7: and TDONE1: would be the sections to customize if
  148. ; selection 1 or 2 is not sufficient.
  149. ;                    - Notes by Irv Hoff W6FFC
  150. ;
  151. ;-----------------------------------------------------------------------
  152. ;
  153. ; 05/05/85  Added option to select MBYE's  LOG.SYS instead of XMODEM.LOG.
  154. ;   v04                 - Irv Hoff
  155. ;
  156. ; 02/22/85  Modest change to ABORT: area for CTL-S to work with TURBODOS
  157. ;   v03     systems.            - Irv Hoff
  158. ;
  159. ; 02/07/85  If a file was 100k or more, was not showing the first digit
  160. ;   v02     on some systems.        - Irv Hoff
  161. ;
  162. ; 02/02/85  Initial version - thanks to Wayne Masters for suggestions.
  163. ;   v01                 -  Irv Hoff
  164. ;
  165. ;-----------------------------------------------------------------------
  166. ;
  167. ; User choices
  168. ;
  169. ;
  170. NO    EQU    0
  171. YES    EQU    NOT NO
  172. ;
  173. MBYE    EQU    NO        ; Yes for LOG.SYS, No for XMODEM.LOG
  174. ;
  175. SHOWAL    EQU    1        ; 0=all file transfers, 1=uploads only
  176. OPTION    EQU    1        ; Must be 0, 1 or 2 (see above)
  177. HEADER    EQU    1        ; 0=no header, regardless of option
  178. ;
  179. DRIVE    EQU    'A'        ; XMODEM.LOG stored here in your system
  180. USER    EQU    14        ; XMODEM.LOG stored here in your system
  181. PGLEN    EQU    22        ; paging length / set to 0 for no paging
  182. ;
  183. WHEEL    EQU    03EH        ; Location of wheel byte for RCPM use
  184. ;-----------------------------------------------------------------------
  185. ;
  186. ; Equates
  187. ;
  188. CR    EQU    0DH        ; Carriage return
  189. EOF    EQU    1AH        ; End of file - ^Z
  190. LF    EQU    0AH        ; Line feed
  191. TBUF    EQU    0080H        ; Default buffer address
  192. TCHR    EQU    TBUF + 2    ; Address of first command line option char.
  193. ;
  194. ;
  195. ;-----------------------------------------------------------------------
  196. ;
  197. ; BDOS equates
  198. ;
  199. BDOS    EQU    0005H        ; CP/M BDOS entry address
  200. RDCON    EQU    1        ; Get character from console
  201. WRCON    EQU    2        ; Write character to console
  202. DIRCON    EQU    6        ; Direct console I/O
  203. PRINT    EQU    9        ; Print string (DE) until '$'
  204. CONST    EQU    11        ; Get console status function
  205. SELDSK    EQU    14        ; Select requested disk drive
  206. OPEN    EQU    15        ; Open disk file
  207. CLOSE    EQU    16        ; Close disk file
  208. READ    EQU    20        ; Read sequential file
  209. STDMA    EQU    26        ; Set DMA address
  210. SETUSR    EQU    32        ; Set user area on disk
  211. ;
  212. ;-----------------------------------------------------------------------
  213. ;
  214. ; Program starts here
  215. ;
  216. ;
  217.     ORG    100H
  218. ;
  219.     JMP    START
  220. ;
  221. ;
  222. SHOL:    DB    SHOWAL        ; Shows complete LOG file in reverse
  223. OPTN:    DB    OPTION        ; Simple selection without assembling
  224. HDR:    DB    HEADER        ; Selects header option
  225. ;
  226. ;
  227.  
  228. START:    LXI    H,0
  229.     DAD    SP        ; Get 'CCP' stack
  230.     SHLD    STACK        ; Save it for exit
  231.     LXI    SP,STACK    ; Set stack pointer
  232. ;
  233. AOPT:    LDA    WHEEL        ; See if wheel user
  234.     CPI    0
  235.     JZ    NOPT        ; NO? don't look for options
  236. AOPT1:    LDA    TBUF        ; See if option present
  237.     CPI    0
  238.     JZ    NOPT
  239.     LDA    TCHR
  240.     CPI    'A'        ; If it's an A, show uploads & downloads
  241.     JNZ    NOPT
  242.     MVI    A,0
  243.     STA    SHOL
  244.  
  245.  
  246. NOPT:    LDA    0004H        ; Get current drive/user
  247.     STA    DRUSER        ; Store
  248. ;
  249. ;
  250. ; Set drive/user to the XMODEM.LOG area listed above
  251.  
  252. ;
  253. ; Set drive/user to the XMODEM.LOG or LOG.SYS area listed above
  254. ;
  255.     MVI    E,USER        ; Set user to XMODEM.LOG area
  256.     MVI    C,SETUSR
  257.     CALL    BDOS
  258. ;
  259.     MVI    A,DRIVE        ; Set drive to XMODEM.LOG area
  260.     SUI    41H
  261.     MOV    E,A
  262.     MVI    C,SELDSK
  263.     CALL    BDOS
  264. ;
  265. ;
  266. ; Open source file
  267. ;
  268.     CALL    ILPRT
  269.     DB    CR,LF,0
  270.     LXI    D,FILE
  271.     MVI    C,OPEN
  272.     CALL    BDOS
  273.     INR    A        ; Check for no open
  274.     JZ    NONE        ; No file, exit
  275. ;
  276.     CALL    ILPRT
  277.     DB    'WHATSNEW Type ^S to pause, ^C, ^X or ^K to abort'
  278.     DB    CR,LF,CR,LF,'wait a moment...',0
  279. ;
  280.     LDA    0007H        ; Find end of TPA
  281.     DCR    A        ; Do not allow to get too close
  282.     DCR    A
  283.     STA    LENGTH        ; store new value for buffer area
  284.     LXI    H,0        ; Reset output pointers
  285.     SHLD    PTR
  286.     MVI    B,EOF        ; EOF to terminate reverse reading later
  287.     CALL    SEND1        ; Put in memory
  288.     MVI    B,LF        ; Allows a single line to be shown
  289.     CALL    SEND1        ; Put in memory
  290. ;
  291. ;
  292. ; Read sector from source file
  293. ;
  294. READLP:    LXI    D,TBUF
  295.     MVI    C,STDMA
  296.     CALL    BDOS
  297. ;
  298.     LXI    D,FILE
  299.     MVI    C,READ
  300.     CALL    BDOS
  301. ;
  302.     ORA    A        ; Read ok?
  303.     JZ    WRDISK        ; Yes, send it to output
  304.     CPI    1        ; End-of-file?
  305.     JZ    TDONE        ; Transfer done, close, exit
  306.     CALL    EXIT
  307.     DB    '++ SOURCE FILE READ ERROR ++','$'
  308. ;
  309. ;
  310. ; Write sector to output file (with buffering)
  311. ;
  312. WRDISK:    LXI    H,80H        ; Read buffer address
  313. ;
  314. WRDLOP:    MOV    A,M        ; Get byte from read buffer
  315.     ANI    7FH        ; Strip parity bit
  316.     CPI    7FH        ; Del (rubout)?
  317.     JZ    NEXT        ; Yes, ignore it
  318.     CPI    EOF        ; End of file marker?
  319.     JZ    TDONE        ; Transfer done, close, exit
  320.     MOV    B,A        ; Save the character for now
  321.     CPI    LF        ; New line?
  322.     JZ    SENDLF        ; If yes, exit
  323. ;
  324. ;
  325. ; Will show entire XMODEM.LOG in reverse if requested
  326. ;
  327.     LDA    SHOL
  328.     ORA    A
  329.     JZ    SEND
  330.     LDA    COLUMN        ; See if in first column
  331.     ORA    A
  332.     JNZ    WRDL3        ; If not, exit
  333.     INR    A
  334.     STA    COLUMN        ; Won't be in first column any longer
  335. ;
  336. ;
  337. ; Shows "P" entries only if wheel byte is set for SYSOP's use
  338. ;
  339.     MOV    A,B        ; Get the character back
  340.     CPI    'P'        ; This line a private upload?
  341.     JNZ    WRDL1        ; If not, exit
  342.     LDA    WHEEL
  343.     ORA    A
  344.     JZ    WRD2        ; "P" lines not shown without wheel byte
  345.     STA    PRIVT        ; To distinguish "P" lines when shown
  346.     STA    STORE        ; Just in case it is
  347.     JMP    WRDL4
  348. ;
  349. WRDL1:    CPI    'R'        ; This a "received file"?
  350.     STA    STORE        ; Set the flag just in case
  351.     JZ    WRDL4        ; If 'R', keep the flag set
  352. ;
  353. WRD2:    XRA    A
  354.     STA    STORE        ; Otherwise reset flag to zero
  355. ;
  356. WRDL3:    LDA    STORE        ; Storing into memory?
  357.     ORA    A
  358.     JZ    NEXT        ; If not, exit
  359. ;
  360. WRDL4:    LDA    COLUMN        ; Increment the column counter
  361.     INR    A
  362.     STA    COLUMN
  363. ;
  364. ;
  365. ; The following retains original format of XMODEM "R" lines
  366. ;
  367.     LDA    OPTN        ; Get option
  368.     ORA    A
  369.     JZ    SEND        ; If not customizing, exit
  370.     LDA    COLUMN        ; Get the column count back
  371.     CPI    3        ; User's modem speed is in column 2
  372.     JNZ    WR1        ; If not column 2, continue
  373.     MOV    A,B        ; Otherwise get the character
  374.     STA    STORE        ; Store it for conversion to baud rate
  375.     JMP    NEXT        ; Do not print the "MSPEED" number
  376. ;
  377. WR1:    CPI    11
  378.     JC    NEXT        ; Skip everything through column 9
  379.     CPI    14
  380.     JC    SEND        ; Print everything through column 12
  381.     JNZ    WR4
  382.     LDA    PRIVT        ; Going to distinguish a "P" line?
  383.     ORA    A
  384.     JZ    WR2
  385.     XRA    A
  386.     STA    PRIVT
  387.     MVI    B,'*'
  388.     CALL    SEND1
  389.     JMP    WR3
  390.  
  391. ;
  392. WR2:    MVI    B,':'        ; Stick in a colon after column 12
  393.     CALL    SEND1
  394. ;
  395. WR3:    MVI    B,' '        ; Send a space
  396.     JMP    SEND
  397. ;
  398. WR4:    CPI    22        ; Print through column 20
  399.     JC    SEND
  400.     JNZ    WR5
  401.     CALL    SEND1        ; Send character in colum 21
  402.     MVI    B,'.'        ; Add a period after the file name
  403.     JMP    SEND
  404. ;
  405. WR5:    CPI    27
  406.     JC    SEND        ; Print file type and some spaces
  407.     CPI    39
  408.     JC    NEXT        ; Ignore the "big gap"
  409.     CPI    43
  410.     JC    SEND        ; Print the file size
  411.     JZ    WR6
  412. ;
  413. ;
  414. ; Customizes area after the file size
  415. ;
  416.     LDA    OPTN
  417.     CPI    1
  418.     JZ    SEND        ; If option 2, exit
  419.     LDA    COLUMN        ; Get the column count back again
  420.     JMP    WR7        ; If not column 42, continue
  421. ;
  422. WR6:    CALL    SEND1        ; Print first space
  423.     CALL    SEND1        ; Add two extras
  424.     CALL    BAUD        ; Print the baud rate and two spaces
  425.     JMP    NEXT
  426. ;
  427. WR7:    CPI    52
  428.     JC    SEND        ; Print the date
  429.     JNZ    WR8
  430.     CALL    SEND1        ; Print first space after date
  431.     JMP    SEND        ; Add a space
  432. ;
  433. WR8:    CPI    58
  434.     JC    SEND        ; Print the time program was sent
  435.     JNZ    SEND        ; If not column 57, continue
  436.     CALL    SEND1        ; Print the first space
  437.     CALL    SEND1        ; Add two spaces
  438.     JMP    NEXT        ; Continue with rest of line (name)
  439. ;
  440. SEND:    PUSH    H        ; Keep buffer address
  441.     MOV    A,B        ; Get the character back
  442.     CALL    OUTCHR
  443.     POP    H        ; Get input buffer address back
  444. ;
  445. NEXT:    INR    L        ; Done with sector?
  446.     JZ    READLP        ; If yes get another sector
  447.     JMP    WRDLOP        ; No, get another byte
  448. ;...
  449. ;
  450. ;
  451. SEND1:    PUSH    H        ; Keep buffer address
  452.     MOV    A,B        ; Get the character back
  453.     CALL    OUTCHR
  454.     POP    H        ; Get input buffer address back
  455.     RET
  456. ;.....
  457. ;
  458. ;
  459. SENDLF:    XRA    A
  460.     STA    COLUMN        ; Othewise in column 0 now
  461.     CALL    ABORT        ; Want to quit already?
  462.     LDA    SHOL        ; Showing entire XMODEM.LOG?
  463.     ORA    A
  464.     JZ    SENDL1
  465.     LDA    STORE        ; End of a "R" line?
  466.     ORA    A
  467.     JZ    NEXT        ; If not, ignore this "LF"
  468. ;
  469. SENDL1:    INR    A        ; Just to get a positive value
  470.     STA    COUNT        ; Have at least one line to show
  471.     LDA    LAST+1        ; Get "H" value of current memory
  472.     MOV    C,A        ; Store temporarily
  473.     LDA    LENGTH
  474.     SUB    C
  475.     JNC    SEND
  476.     CALL    SEND1        ; Put the LF into memory
  477.     JMP    TOLONG        ; If same or more, memory full
  478. ;.....
  479. ;
  480. ;
  481. ;-----------------------------------------------------------------------
  482. ;
  483. ;              SUBROUTINES
  484. ;
  485. ;-----------------------------------------------------------------------
  486. ;
  487. ; Aborts the display when requested, but only at end of line
  488. ;
  489. ABORT:    PUSH    H
  490.     PUSH    D
  491.     PUSH    B
  492.     MVI    C,DIRCON    ; See if anything from console
  493.     MVI    E,0FFH        ; 
  494.     CALL    BDOS        ;
  495.     CPI    0        ; NO KEY?
  496.     JZ    CKPAG
  497. ABORT0:    
  498.     ANI    5FH        ; Convert to upper case
  499.     ORI    40H
  500.     CPI    'C'
  501.     JZ    ABORT1
  502.     CPI    'K'
  503.     JZ    ABORT1
  504.     CPI    'S'        ; How about S?
  505.     JZ    FINGER        ; If so, pause till next key
  506.     CPI    'X'
  507.     JZ    ABORT1
  508. CKPAG:
  509.     MVI    A,PGLEN        ; Are we paging?
  510.     CPI    0
  511.     JZ    NOABT        ; no, return
  512.     LDA    PGCNT        ; pickup current count
  513.     MOV    B,A        ; save in b
  514.     MVI    A,PGLEN        ; get total length
  515.     SUB    B        ; minus current count
  516.     CPI    0
  517.     JZ    FINGER        ; equal? then pause
  518. NOABT:
  519.     POP    B
  520.     POP    D
  521.     POP    H
  522.     RET
  523. ;
  524. ABORT1:    POP    B        ; Restore the registers
  525.     POP    D
  526.     POP    H
  527.     POP    H        ; Clear "CALL ABORT" from stack
  528.     CALL    EXIT        ; If yes, then print abort message
  529.     DB    CR,LF,'++ ABORTED ++','$'
  530. ;
  531. ;
  532. FINGER:
  533.     CALL    ILPRT
  534.     DB    '[more]',CR,0
  535. FING1:
  536.     MVI    C,DIRCON    ; Check to see if key pressed
  537.     MVI    E,0FFH
  538.     CALL    BDOS
  539.     CPI    0
  540.     JZ    FING1        ; If no key pressed, then wait more
  541.     PUSH    PSW        ; save the char
  542.     XRA    A
  543.     STA    PGCNT
  544.     POP    PSW
  545.     JMP    ABORT0        ; otherwise go back and check char
  546. ;.....
  547.  
  548. ; Backs up to the start of the previous line
  549. ;
  550. BACKUP:    DCX    H
  551.     MOV    A,M
  552.     CPI    EOF
  553.     JZ    BACK1
  554.     CPI    LF        ; End of line character?
  555.     JNZ    BACKUP        ; IF NOT, KEEP REVERSING
  556.     RET
  557. ;
  558. BACK1:    POP    H        ; Restore stack
  559.     JMP    TDONE4        ; All finished this file
  560. ;.....
  561. ;
  562. ;
  563. ; Shows the received baud rate
  564. ;
  565. BAUD:    LDA    STORE
  566.     CPI    '0'
  567.     JZ    B110
  568.     CPI    '1'
  569.     JZ    B300
  570.     CPI    '5'
  571.     JZ    B1200
  572.     CPI    '6'
  573.     JZ    B2400
  574.     MVI    B,' '
  575.     CALL    SEND1
  576.     CALL    SEND1
  577.     CALL    SEND1
  578.     CALL    SEND1
  579.     JMP    BFIN2
  580. ;...
  581. ;
  582. ;
  583. B110:    MVI    B,' '
  584.     CALL    SEND1
  585.     MVI    B,'1'
  586.     CALL    SEND1
  587.     MVI    B,'1'
  588.     CALL    SEND1
  589.     JMP    BFIN1
  590. ;
  591. B300:    MVI    B,' '
  592.     CALL    SEND1
  593.     MVI    B,'3'
  594.     JMP    BFINSH
  595. ;
  596. B1200:    MVI    B,'1'
  597.     CALL    SEND1
  598.     MVI    B,'2'
  599.     JMP    BFINSH
  600. ;
  601. B2400:    MVI    B,'2'
  602.     CALL    SEND1
  603.     MVI    B,'4'
  604. ;
  605. BFINSH:    CALL    SEND1
  606.     MVI    B,'0'
  607.     CALL    SEND1
  608. ;
  609. BFIN1:    MVI    B,'0'
  610.     CALL    SEND1
  611. ;
  612. BFIN2:    MVI    B,' '
  613.     CALL    SEND1
  614.     MVI    B,'b'
  615.     CALL    SEND1
  616.     MVI    B,'p'
  617.     CALL    SEND1
  618.     MVI    B,'s'
  619.     CALL    SEND1
  620.     MVI    B,' '
  621.     CALL    SEND1
  622.     MVI    B,' '
  623.     JMP    SEND1
  624. ;.....
  625. ;
  626. ;
  627. ; Print message then exit to CP/M
  628. ;
  629. EXIT:    POP    D        ; Get message address
  630.     MVI    C,PRINT        ; Print message
  631.     CALL    BDOS
  632.     CALL    ILPRT        ; Print CRLF before quitting
  633.     DB    CR,LF,0
  634. ;
  635.     LDA    DRUSER        ; Get original drive/user area back
  636.     RAR
  637.     RAR
  638.     RAR
  639.     RAR
  640.     ANI    0FH        ; Just look at the user area
  641.     MOV    E,A
  642.     MVI    C,SETUSR    ; Restore original user area
  643.     CALL    BDOS
  644. ;
  645.     LDA    DRUSER        ; Get the original drive/user back
  646.     ANI    0FH        ; Just look at the drive for now
  647.     MOV    E,A
  648.     MVI    C,SELDSK    ; Restore original drive
  649.     CALL    BDOS
  650. ;
  651.     LHLD    STACK
  652.     SPHL
  653.     RET
  654. ;.....
  655. ;
  656. ;
  657. ; Inline print routine - prints string pointed to by stack until a zero
  658. ; is found.  Returns to caller at the next address after the zero ter-
  659. ; minator.
  660. ;
  661. ILPRT:    XTHL            ; Save hl, get message address
  662. ;
  663. ILPLP:    MOV    A,M        ; Get char
  664.     CALL    TYPE        ; Output it
  665.     INX    H        ; Point to next
  666.     MOV    A,M        ; Test for end
  667.     ORA    A
  668.     JNZ    ILPLP
  669.     XTHL            ; Restore hl, ret address
  670.     RET            ; Return past the end of the message
  671. ;.....
  672. ;
  673. ;
  674. ; Output a character to the new file buffer - first, see if there is
  675. ; room in the buffer for this character.
  676. ;
  677. OUTCHR:    PUSH    PSW        ; Store the character for now
  678.     LHLD    PTR        ; Now get the buffer pointers
  679.     XCHG
  680.     LHLD    ADR
  681.     DAD    D
  682.     SHLD    LAST
  683.     XCHG
  684.     POP    PSW        ; Get the character back
  685.     STAX    D        ; Store the character
  686.     LHLD    PTR        ; Get the buffer pointer
  687.     INX    H        ; Increment them
  688.     SHLD    PTR        ; Store the new pointer address
  689.     RET
  690. ;.....
  691. ;
  692. ;
  693. ; Shows the line from memory, quits with a "LF" character
  694. ;
  695. SHOW:    INX    H        ; Next character position in line
  696.     MOV    A,M        ; Get the character
  697.     CALL    TYPE        ; Send to CRT display
  698.     MOV    A,M        ; Get the character again
  699.     CPI    LF        ; Was it a line feed?
  700.     JNZ    SHOW        ; If not, get next character
  701.     LDA    PGCNT        ; increment line counter
  702.     INR    A
  703.     STA    PGCNT    
  704.     RET            ; Otherwise finished this line
  705. ;.....
  706. ;
  707. ;
  708. ; Transfer is done - close destination file
  709. ;
  710. TDONE:    MVI    C,CLOSE
  711.     LXI    D,FILE
  712.     CALL    BDOS
  713.     CALL    ABORT
  714.     LDA    COUNT        ; See if anything to display
  715.     ORA    A
  716.     JZ    NONE        ; If not, say "NO NEW FILES"
  717. ;
  718.     CALL    ILPRT
  719.     DB    CR,0
  720.     LDA    HDR        ; Using a header?
  721.     ORA    A
  722.     JZ    TDONE2        ; If not skip header
  723.     LDA    SHOL        ; Showing entire XMODEM.LOG?
  724.     ORA    A
  725.     JZ    TDONE2        ; If yes, don't bother with header
  726. ;
  727. ;
  728. ; Customizes header
  729. ;
  730.     LDA    OPTN
  731.     ORA    A
  732.     JZ    TDONE2
  733.     CALL    ILPRT
  734.     DB    CR,'D/U    Filename   Size   Speed    ',0
  735.     LDA    OPTN
  736.     CPI    1
  737.     JZ    TDONE1
  738.     CALL    ILPRT
  739.     DB    '  Date    Time   Uploaded by',CR,LF,CR,LF,0
  740.     JMP    TDONE2
  741. ;
  742. TDONE1:    CALL    ILPRT
  743.     DB    'Uploaded by  Date',CR,LF,CR,LF,0
  744. ;
  745. TDONE2:    LHLD    LAST        ; Get address of last character stored
  746.     CALL    BACKUP        ; Print first line in memory
  747.     CALL    SHOW
  748. ;
  749. TDONE3:    CALL    ABORT
  750.     CALL    BACKUP        ; Need to back twice for rest of lines
  751.     CALL    BACKUP
  752.     CALL    SHOW
  753.     JMP    TDONE3        ; Keep going until all are printed
  754. ;
  755. TDONE4:    CALL    EXIT
  756.     DB    LF,CR,'[End of listing]','$'
  757. ;.....
  758. ;
  759. ;
  760. TOLONG:    CALL    ILPRT
  761.     DB    CR,'++ FILE TOO LONG, NEWEST ENTRIES LIKELY NOT '
  762.     DB    'SHOWN ++',CR,LF,CR,LF,0
  763.     JMP    TDONE
  764. ;
  765. ;.....
  766. ;
  767. ;
  768. ; Send character in A register to console
  769. ;
  770. TYPE:    PUSH    B
  771.     PUSH    D
  772.     PUSH    H
  773.     MOV    E,A        ; Character to E for CP/M
  774.     MVI    C,WRCON        ; Write to console
  775.     CALL    BDOS
  776.     POP    H
  777.     POP    D
  778.     POP    B
  779.     RET
  780. ;.....
  781. ;
  782. ;
  783. NONE:    CALL    EXIT
  784.     DB    CR,'++ NO NEW FILES ++','$'
  785. ;
  786. ;
  787. ; 'Declare' output file
  788. ;
  789. FILE:     IF    MBYE
  790.     DB    0,'LOG     ','S','Y'+80H,'S'
  791.      ENDIF            ; MBYE
  792. ;
  793.      IF    NOT MBYE
  794.     DB    0,'XMODEM  LOG'
  795.      ENDIF            ; NOT MBYE
  796. ;
  797.     DB    0,0,0,0,0,0,0,0,0,0
  798.     DB    0,0,0,0,0,0,0,0,0,0,0
  799. ;
  800. ADR:    DW    BUFFER        ; Address of buffer start
  801. LAST:    DW    0        ; Address of last character in buffer
  802. PTR:    DW    0        ; Pointer count for buffer
  803. ;
  804. COLUMN:    DB    0        ; Column of XMODEM.LOG line
  805. COUNT:    DB    0
  806. DRUSER:    DB    0        ; Original drive/user, for return
  807. LENGTH:    DB    0        ; Maximum length of useable memory
  808. PRIVT:    DB    0        ; Distinguishes "P" lines if shown
  809. STORE:    DB    0
  810. PGCNT:    DB    0        ; For paging
  811. ;
  812.     DS    100        ; Room for 50-level stack
  813. ;
  814. ;
  815. ; Set write buffer to even page boundry
  816. ;
  817.     ORG    ($+255)/256*256
  818. ;
  819. BUFFER    EQU    $        ;write buffer starts here
  820. STACK    EQU    BUFFER-2
  821. ;
  822. ;
  823.     END    START
  824.