home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / EPSON / EPSLINK.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  39KB  |  1,670 lines

  1. ;********************************* EPSNLINK.ASM
  2. ;        EPSON FILINK FOR CP/M SYSTEMS        *
  3. ;**********************************************
  4. ;
  5. ;                    12/23/84
  6. ;
  7. ; EPSNLINK (EPSLNK.ASM ON COMPUSERVE) is a communications
  8. ; program for CP/M machines that allows them to communicate
  9. ; with the EPSON PX-8 GENEVA using it's built-in program
  10. ; FILINK.COM permitting file transfer between machines
  11. ; using the ROM program in the GENEVA thereby always having
  12. ; available on board the GENEVA a means of communications
  13. ; without using valuable ram for a separate program.  It
  14. ; presents the same options in the same manner as FILINK
  15. ; making the human interface to each machine the same.
  16. ; Provisions are made in this source code to change the
  17. ; baud rate of the CP/M machine on entry to those of the
  18. ; GENEVA and to re-establish a default baud rate on exit.
  19. ; This requires software control of the baud rate on the
  20. ; CP/M machine which in this code requires the output of
  21. ; several bytes to several different ports.  Since my 'BIG'
  22. ; CP/M machine has a DCE serial port I use the 724 cable
  23. ; between the GENEVA and a switch box which is connected
  24. ; to the CP/M port.  If your CP/M thinks it is 'DATA
  25. ; TERMINAL EQUIPMENT' (DTE) use the 725 cable.
  26. ;    The program can be assembled using DRI's standard
  27. ; ASM.COM.  A knowledge of your machines ports & ready
  28. ; masks is required.  The I/O routines are at the beginning
  29. ; of the code ala XMODEM.  Any one who has configured one
  30. ; of the XMODEM programs should have no problem...novices
  31. ; will need some help.
  32. ;                              Community Business Systems
  33. ;                              Jim Dorsey (75765,317)
  34. ;
  35. ; 12/23/84...CONVERTED FROM Z80 TO 8080 MNEMONICS.
  36. ; 12/22/84...MOVE PORT I/O TO PROGRAM FRONT FOR
  37. ;            USER PATCHING IF NO ACCESS TO SOURCE CODE.
  38. ; 12/20/84...RENAME SYMBOLS.
  39. ; 10/20/84...INITIAL ASSY.
  40. ;
  41.     .ORG    0100H
  42. ;
  43.     JP    START
  44. ;
  45. ;**********************************************
  46. ;
  47. ; ASCII EQUATES
  48. ;
  49. STX    .EQUAL    02
  50. ETX    .EQUAL    03
  51. EOT    .EQUAL    04
  52. ENQ    .EQUAL    05
  53. BELL    .EQUAL    07
  54. BS    .EQUAL    08
  55. TAB    .EQUAL    09
  56. LF    .EQUAL    0AH
  57. CR    .EQUAL    0DH
  58. XOFF    .EQUAL    13H
  59. EOF    .EQUAL    1AH
  60. ESC    .EQUAL    1BH
  61. RUB    .EQUAL    7FH
  62. TRUE    .EQUAL    0FFFFH
  63. FALSE    .EQUAL    TRUE+01
  64. ;
  65. ; CP/M COMMANDS
  66. ;
  67. DIRCON    .EQUAL    06
  68. DRESET    .EQUAL    13
  69. SELDRV    .EQUAL    14
  70. OPNFIL    .EQUAL    15
  71. CLSFIL    .EQUAL    16
  72. SCHFIL    .EQUAL    17
  73. SCHNXT    .EQUAL    18
  74. DELFIL    .EQUAL    19
  75. REDNXT    .EQUAL    20
  76. WRTNXT    .EQUAL    21
  77. MAKFIL    .EQUAL    22
  78. RENFIL    .EQUAL    23
  79. SETDMA    .EQUAL    26
  80. ;
  81. ; CP/M ADDRESSES
  82. ;
  83. BOOT    .EQUAL    0000
  84. CURDSK    .EQUAL    0004
  85. BDOS    .EQUAL    0005
  86. FCB    .EQUAL    005CH
  87. DBUF    .EQUAL    0080H
  88. TPA    .EQUAL    0100H
  89. ;
  90. ; PROGRAM DEPENDENT EQUATES
  91. ;
  92. WAITIM    .EQUAL    5000        ;TIME TO WAIT FOR OTHER CHAR
  93. MAXDRV    .EQUAL    'C'        ;MAX DRIVE ON SYSTEM
  94. ;
  95. ;----------------------------------------------
  96. ;
  97. ; MODEM PORT EQUATES
  98. ;
  99. MSTATP    .EQUAL    06H        ;MODEM STATUS PORT
  100. MDMTBE    .EQUAL    04H        ;MODEM SEND BIT MASK (TBE)
  101. SNDRDY    .EQUAL    00H        ;MODEM SEND READY
  102.                 ;00/MDMTBE=RDYHI/RDYLO
  103. MDMRDA    .EQUAL    01H        ;MODEM RECEIVE BIT MASK (RDA)
  104. RECRDY    .EQUAL    00H        ;MODEM RECEIVE READY
  105.                 ;00/MDMRDA=RDYHI/RDYLO
  106. MIDATA    .EQUAL    04H        ;MODEM DATA IN PORT
  107. MODATA    .EQUAL    04H        ;MODEM DATA OUT PORT
  108. ;
  109. ;**********************************************
  110. ;
  111. ; MODEM PORT I/O ROUTINES
  112. ;
  113. ; RETURN 00/NZ = MODEM INPUT NOT/READY
  114. ;
  115. MDMIST:    IN    A,(MSTATP)    ;GET STATUS BYTE
  116.     AND    MDMRDA        ;GET STATUS BIT
  117.     XOR    RECRDY        ;TEST...RECEIVE DATA AVAILABLE?
  118.     LD    A,00        ;SET NO
  119.     RET    Z         ;NO
  120.     DEC    A        ;SET NZ...
  121.     RET            ;YES
  122. ;
  123. ;----------------------------------------------
  124. ;
  125. ; GET MODEM CHAR
  126. ;
  127. GTMCHR:    IN    A,(MIDATA)
  128.     RET    
  129. ;
  130. ;----------------------------------------------
  131. ;
  132. ; RETURN 00/NZ = MODEM OUTPUT PORT NOT/READY
  133. ;
  134. MDMOST:    IN    A,(MSTATP)    ;GET STATUS BYTE
  135.     AND    MDMTBE        ;GET STATUS BIT
  136.     XOR    SNDRDY        ;TEST...TRANSMIT BUF EMPTY?
  137.     LD    A,00        ;SET NO
  138.     RET    Z         ;NO
  139.     DEC    A        ;SET NZ...
  140.     RET            ;YES
  141. ;
  142. ;----------------------------------------------
  143. ;
  144. ; SEND CHR IN <E> TO MODEM
  145. ;
  146. MDMOUT:    LD    A,E
  147.     OUT    (MODATA),A
  148.     RET    
  149. ;
  150. ;**********************************************
  151. ;
  152. ; AUTOMATIC BAUD RATE SET PROCEDURE & TABLE
  153. ;
  154. ; If your system supports software baud rate
  155. ; control EPSNLINK can set the system baud rate to
  156. ; match the GENEVA's baud rate at run time and
  157. ; reset the host system to it's normal setting
  158. ; when it terminates.  In this system the normal
  159. ; baud is 1200 for a printer and the GENEVA is
  160. ; set for 9600.  Look at 'IF DOBAUD' for the
  161. ; manner in which the program uses the following
  162. ; table.  Also change the 'BITMS1' & 'BITMS2'
  163. ; messages to reflect the bauds that you use.
  164. ;
  165. DOBAUD    .EQUAL    FALSE    ;IF BAUD SET ACTIVE
  166. ;
  167. ; BAUD RATE STRINGS
  168. ;
  169. ;B###:    DEFB    BYTE COUNT,PORT1,BYTE1,PORT2,BYTE2,etc
  170. ;
  171. B110:    .BYTE    04,084H,001H,085H,001H,000H,000H
  172. B300:    .BYTE    04,084H,001H,085H,004H,000H,000H
  173. B1200:    .BYTE    04,084H,001H,085H,008H,000H,000H    ;2 STPBITS
  174. B2400:    .BYTE    04,084H,001H,085H,010H,000H,000H
  175. B4800:    .BYTE    04,084H,001H,085H,020H,000H,000H
  176. B9600:    .BYTE    04,084H,011H,085H,088H,000H,000H    ;1 STPBIT
  177. B19200:    .BYTE    04,084H,011H,085H,010H,000H,000H
  178. ;
  179. BAUD1    .EQUAL    B9600        ;START BAUD
  180. BAUD2    .EQUAL    B1200        ;END BAUD
  181. ;
  182. ;**********************************************
  183. :START1
  184. ;
  185. ; NOTE: The following code intercepts the CP/M
  186. ; boot vector at 0000H to trap any '^C's for
  187. ; an orderly exit after resetting the original
  188. ; baud rate.  If the host machine detects '^C's
  189. ; and reboots from ROM as does the GENEVA a more
  190. ; complex boot intercept is required.  I have
  191. ; code that will intercept a warm start in the
  192. ; GENEVA which can give a clue for doing it in
  193. ; other ROM based CP/M systems.  If you are running
  194. ; standard RAM based CP/M the following code should
  195. ; be ok.
  196. ;
  197. ;
  198. ;**********************************************
  199.  
  200.  
  201. START:  LD     C,6             ;INIT PORT
  202.         LD     A,(L03D1)       ;BYTE COUNT
  203.         LD     B,A
  204.         LD     HL,L03D2            ;03D2H
  205. ;
  206. ; 8080 EMULATOR FOR Z80 OTIR INSTRUCTION
  207. ;
  208. OTIR:   LD     A,C
  209.         LD     (PORT+1),A      ;MODIFY PGM
  210. ;
  211. ; LOOP & OUTPUT
  212. ;
  213. OUTLOP: LD     A,(HL)
  214.         INC     HL
  215. PORT:   OUT     (00),A          ;MODIFIED ABOVE TO PORT ADDR
  216.         DEC     B
  217.         JP      Z,OUTLOP          ;NO
  218.         JP      P,START1          ;NOW START PROGRAM
  219.  
  220.  
  221. ;
  222. ; KAYPRO PORT INIT BYTES
  223. ;
  224. L03D1:  .BYTE    09H             ;# BYTES TO OUTPUT
  225. ;
  226. L03D2:  .BYTE    00011000B       ;RESET
  227.         .BYTE    04H             ;REGISTER 04
  228.         .BYTE    01000111B       ;X16 CLOCK, 1 STOP BIT, EVEN PARITY
  229.         .BYTE    01H             ;REGISTER 01
  230.         .BYTE    00000000B       ;FOR SAFETY, RESET IT (?)
  231.         .BYTE    03H             ;REGISTER 03
  232.         .BYTE    10000001B       ;7 BIT, READ ENABLE
  233.         .BYTE    05H             ;REGISTER 05
  234.         .BYTE    00101000B       ;7 BIT, TRANSMIT ENABLE
  235. ;
  236. ; OLD START LOCATION
  237.  
  238. START1
  239. :    LD    HL,(BOOT+01)    ;GET BOOT ADDR
  240.     INC    HL
  241.     LD    (BOTADR+01),HL    ;SAVE IT
  242.     LD    BC,EXIT        ;EXIT ADDR
  243.     LD    E,(HL)        ;GET BOOT VECTOR...
  244.     LD    (HL),C        ;STO EXIT VECTOR...
  245.     INC    HL
  246.     LD    D,(HL)        ;TO TRAP '^C'S
  247.     LD    (HL),B
  248.     EX    DE,HL        ;GET VECTOR
  249.     LD    (BOTVEC+01),HL    ;SAVE IT
  250.     LD    SP,STACK
  251. ;
  252. ; RESTART ON ESC
  253. ;
  254. RESTRT:    LD    DE,HELLO    ;'FILINK (c) Copyright 1983'
  255.     CALL    PRTDE        ;PRINT DE->'$'
  256.     LD    B,05        ;TIME TO WAIT
  257.     LD    C,0FFH        ;WAIT FOR CONS INP
  258.     CALL    CKOTHR        ;DO TIME OUT
  259.     .IFNZ    DOBAUD
  260.      LD    DE,STATMS    ;'The RS-232C status is :'
  261.      CALL    PRTDE        ;PRINT DE->'$'
  262.      LD    DE,BITMS1    ;'bit rate =...'
  263.      CALL    PRTDE        ;PRINT DE->'$'
  264.      LD    HL,BAUD1    ;POINT TO START BAUD STRING
  265.      LD    A,(HL)        ;GET LGT
  266.      OR    A        ;CLR CRY
  267.      RRCA            ;LGT/2
  268.      LD    B,A
  269.      INC    HL
  270.      JP    C,OPTLOP        ;ODD # NO GOOD
  271.      JP    Z,OPTLOP        ;NO STRING
  272.      CALL    OUTI        ;LOOP & SET BAUD
  273.     .ENDIF    
  274. ;
  275. ; LOOP FOR NEXT OPERATION
  276. ;
  277. OPTLOP:    LD    SP,STACK
  278.     LD    DE,HLPMS1    ;0,0,'Press  ESC to restart,'
  279.     CALL    PRTDE        ;PRINT DE->'$'
  280.     LD    DE,SRMSG    ;'Send or Receive  (S/R) ? $'
  281.     CALL    PRTDE        ;PRINT DE->'$'
  282. ;
  283. ; LOOP FOR VALID OPTION
  284. ;
  285. BADOPT:    CALL    GETCON        ;LD <A> & <E> WITH CONSOLE INP
  286.     CALL    MAKEUC        ;MAKE <A> UC
  287.     LD    (USROPT),A    ;USER OPTION: S/R
  288.     CP    'S'        ;SEND?
  289.     JP    NZ,CHKRCV        ;NO
  290.     CALL    DCONIO        ;PRINT <E> TO CONS
  291.     CALL    GFNSND        ;GET FILENAME(S) & SEND
  292.     JP    GETOPT        ;DONE A SEND, GET C/X
  293. ;
  294. ;----------------------------------------------
  295. ;
  296. ; NOT S(end)
  297. ;
  298. CHKRCV:    CP    'R'        ;RECEIVE?
  299.     JP    NZ,BADOPT        ;NO, GET 'S'/'R'
  300.     CALL    DCONIO        ;YES, PRINT <E> TO CONS
  301.     CALL    GFNRCV        ;RECEIVE FILES
  302. ;
  303. ; LOOP FOR 'X' (EXIT)/'C' (CONTINUE)
  304. ;
  305. GETOPT:    CALL    GETCON        ;LD <A> & <E> WITH CONSOLE INP
  306.     CALL    MAKEUC        ;MAKE <A> UC
  307.     CP    'C'
  308.     JP    NZ,CHKXIT
  309.     CALL    DCONIO        ;PRINT <E> TO CONS
  310.     JP    OPTLOP        ;LOOP FOR NEXT OPERATION
  311. ;
  312. ;----------------------------------------------
  313. ;
  314. ; NOT 'C'ontinue...CHECK FOR EXIT
  315. ;
  316. CHKXIT:    CP    'X'        ;EXIT?
  317.     JP    NZ,GETOPT        ;NO, WAIT FOR 'X'/'C'
  318.     CALL    DCONIO        ;PRINT <E> TO CONS
  319.     JP    CLCXIT        ;CLEAR CONS INP & QUIT
  320. ;
  321. ;**********************************************
  322. ;
  323. ; SEND FILE(S)
  324. ;
  325. GFNSND:    CALL    GETFNT        ;GET REQ FN.T & PARSE INTO SYSFCB
  326.     CALL    CRLF        ;PRINT CRLF
  327.     LD    C,SCHFIL
  328.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  329.     CP    04        ;FILE FOUND?
  330.     JP    C,FILFND        ;YES
  331.     LD    DE,NFILMS    ;'  File not found$'
  332.     CALL    PRTDE        ;PRINT DE->'$'
  333.     JP    GFNSND        ;LOOK AGAIN
  334. ;
  335. ;----------------------------------------------
  336. ;
  337. ; FOUND 1ST FILE...STORE LIST OF FN.T'S TO SEND
  338. ;
  339. FILFND:    LD    HL,FLNLST    ;FILENAME LIST BUFFER
  340.     LD    (FLNPTR),HL    ;FILENAME LIST POINTER
  341. ;
  342. ; LOOP FOR NEXT FILE & ADD TO LIST
  343. ;
  344. FILOOP:    ADD    A,A
  345.     ADD    A,A
  346.     ADD    A,A
  347.     ADD    A,A
  348.     ADD    A,A        ;PNT TO ENTRY...
  349.     LD    C,A
  350.     LD    B,00
  351.     LD    HL,DBUF+01    ;PNT TO DIR REC START
  352.     ADD    HL,BC        ;WITH HL
  353.     PUSH    HL
  354.     EX    DE,HL
  355.     LD    HL,(FLNPTR)     ;PNT TO NEXT STO POSN
  356.     EX    DE,HL
  357.     POP    HL
  358.     LD    BC,0011
  359.     CALL    LDIR        ;STORE NAME
  360.     PUSH    HL
  361.     EX    DE,HL
  362.     LD    (FLNPTR),HL    ;NEXT STORAGE POSN
  363.     EX    DE,HL
  364.     POP    HL
  365.     LD    A,(FILCNT)    ;EXT COUNT
  366.     INC    A        ;+01
  367.     LD    (FILCNT),A    ;EXTENT COUNT
  368.     CP    65        ;DONE 64?
  369.     JP    NC,DONALL        ;YES, DONE PRINT '#T$' & CLOSE FILES
  370.     LD    C,SCHNXT    ;NO
  371.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  372.     CP    04        ;FOUND FILE
  373.     JP    C,FILOOP        ;YES, STORE NEXT
  374.     LD    HL,FLNLST    ;RE-INIT...
  375.     LD    (FLNPTR),HL    ;FILENAME LIST POINTER
  376.     LD    B,10        ;TIME TO WAIT
  377.     LD    C,'R'        ;CHECK FOR 'S'END...(RCR RDY)
  378.     CALL    CKOTHR        ;WAIT/TIME OUT
  379.     OR    A        ;RECEIVER READY?
  380.     JP    NZ,SENDAG        ;YES, SEND 'G'
  381.     LD    DE,RNRMSG    ;'Receiver is not ready.',0,'$'
  382.     CALL    PRTDE        ;PRINT DE->'$'
  383. ;
  384. ; LOOP & SEND 'R'eady & WAIT FOR 'S'end
  385. ;
  386. GETSOK:    LD    E,'R'
  387.     CALL    SENDE        ;SEND CHAR IN <E>    ('R'EADY-->)
  388.     CALL    CHKABT
  389.     CALL    MDMIST        ;GET OTHER'S INPUT STATUS
  390.     JP    Z,GETSOK        ;OTHER NOT READY
  391.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    ('S'END <--)
  392.     CP    'S'        ;OK TO SEND?
  393.     JP    NZ,GETSOK        ;NO
  394. ;
  395. ; RECEIVER READY...SEND 'G'ood
  396. ;
  397. SENDAG:    LD    E,'G'
  398.     CALL    SENDE        ;SEND CHAR IN <E>    ('G'OOD-->)
  399. ;
  400. ; LOOP FOR NEXT FILE TO SEND
  401. ;
  402. SNDLOP:    LD    HL,(FLNPTR)    ;FILENAME LIST POINTER
  403.     LD    DE,FCB+01
  404.     LD    BC,0011
  405.     CALL    LDIR        ;GET NEXT FILENAME
  406.     LD    (FLNPTR),HL    ;FILENAME LIST POINTER
  407.     CALL    CLRFCB        ;CLR SYS FCB 'ex' -> 'nc'
  408.     LD    C,OPNFIL    ;OPEN SEND FCB
  409.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  410.     INC    A        ;FOUND IT?
  411.     LD    DE,CRMSG
  412.     JP    Z,CLFILS        ;NO, DONE
  413. ;
  414. ; CURRENT FN.T OPEN...SEND 'eot'
  415. ;
  416. SNDEOT:    CALL    CHKABT        ;QUIT IF TOO LONG
  417.     LD    E,EOT        ;GET 'eot'...FILENAME NEXT
  418.     CALL    SENDE        ;SEND CHAR IN <E>    (EOT -->)
  419.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (08/'X' <--)
  420.     CP    08        ;SEND FILENAME?
  421.     JP    NZ,SNDEOT        ;NO, SEND 'eot'
  422.     CALL    CRLF        ;YES, PRINT CRLF
  423.     LD    HL,FCB+01
  424.     LD    B,11
  425. ;
  426. ; LOOP, SEND FN.TYP & PRINT TO CONSOLE
  427. ;
  428. SNDFNT:    LD    E,(HL)
  429.     CALL    SENDE        ;SEND CHAR IN <E>    (FN.T -->)
  430.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (FN.T <--)
  431.     CP    E        ;SAME?
  432.     JP    NZ,SAYWHA        ;NO, PRINT '?'
  433.     LD    A,E        ;GET CHAR
  434.     AND    7FH        ;STRIP PARITY
  435.     LD    E,A        ;GET CHAR
  436.     CALL    DCONIO        ;PRINT <E> TO CONS
  437.     LD    A,B
  438.     CP    04        ;4 CHARS LEFT?
  439.     JP    NZ,DONPRD        ;NO
  440.     LD    E,'.'        ;YES, PRINT '.' TO CONS
  441.     CALL    DCONIO        ;PRINT <E> TO CONS
  442. ;
  443. ; ANY '.' PRINTED TO CONS
  444. ;
  445. DONPRD:    INC    HL
  446.     DEC    B
  447.     JP    NZ,SNDFNT        ;NOT 11 CHARS, NOT DONE
  448.     LD    E,ENQ        ;END OF FN SEND 'enq'
  449.     CALL    SENDE        ;SEND CHAR IN <E>    (ENQ -->)
  450.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (09  <--)
  451.     CP    09        ;09...READY FOR FILE?
  452.     JP    NZ,SNDEOT        ;NO...RESEND FN.T
  453.     JP    PRTSND        ;YES, SEND FILE
  454. ;
  455. ;----------------------------------------------
  456. ;
  457. ; BAD FILENAME CHAR ECHOED BACK
  458. ;
  459. SAYWHA:    LD    E,'?'
  460.     CALL    DCONIO        ;PRINT <E> TO CONS
  461.     JP    SNDEOT        ;RESEND FN.T
  462. ;
  463. ;----------------------------------------------
  464. ;
  465. ; PRINT 'SENDING' & SEND
  466. ;
  467. PRTSND:    LD    DE,SNDMSG    ;'   Sending $'
  468.     CALL    PRTDE        ;PRINT DE->'$'
  469. ;
  470. ; LOOP FOR NEXT SECTOR TO SEND
  471. ;
  472. SNXTSC:    LD    C,SETDMA
  473.     LD    DE,DBUF
  474.     CALL    BDOS
  475.     LD    C,REDNXT
  476.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  477.     OR    A        ;OK READ?
  478.     JP    NZ,DONSND        ;NO, DONE
  479. ;
  480. ; LOOP & SEND 'stx' & SAME BLOCK
  481. ;
  482. SNDSTX:    LD    E,STX
  483.     CALL    SENDE        ;SEND CHAR IN <E>    (STX -->)
  484.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    ('N'/'P'ROCEED <--)
  485.     CP    'P'        ;'P'ROCEED?
  486.     JP    NZ,SNDSTX        ;NO
  487.     LD    E,'.'        ;YES
  488.     CALL    DCONIO        ;TELL CONSOLE
  489.     LD    HL,DBUF
  490.     LD    C,00        ;INIT CHKSUM
  491.     LD    B,128        ;BYTE COUNT
  492. ;
  493. ; LOOP & SEND 128 BYTES
  494. ;
  495. SNDBLK:    LD    E,(HL)        ;GET CHAR
  496.     CALL    SENDE        ;SEND CHAR IN <E>    (BLOCK -->)
  497.     LD    A,E        ;GET CHAR
  498.     XOR    C        ;TO CHKSUM
  499.     LD    C,A        ;RESTO CHKSUM
  500.     INC    HL        ;BUMP PNTR
  501.     DEC    B
  502.     JP    NZ,SNDBLK        ;NOT 128 YET
  503.     LD    E,C        ;GET CHKSUM
  504.     CALL    SENDE        ;SEND CHAR IN <E>    (CHKSUM -->)
  505. ;
  506. ; LOOP & WAIT FOR 'B'/'G'
  507. ;
  508. GODBAD:    CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    ('B'/'G' <--)
  509.     CP    'B'        ;'B'AD?
  510.     JP    Z,SNDSTX        ;YES, RESEND 'stx' & SAME BLOCK
  511.     CP    'G'        ;NO, 'G'OOD?
  512.     JP    Z,SNXTSC        ;YES, GET NEXT SECTOR
  513.     JP    GODBAD        ;WAIT SOME MORE
  514. ;
  515. ;----------------------------------------------
  516. ;
  517. ; END OF FILE
  518. ;
  519. DONSND:    LD    E,ETX        ;'etx'...END OF FILE
  520.     CALL    SENDE        ;SEND CHAR IN <E>    (ETX -->)
  521.     CALL    FILCLS        ;CLOSE FILE
  522.     JP    NZ,SENDOK        ;OK CLOSE
  523. ;
  524. ; BAD CLOSE...LOOP FOR CONS CHAR
  525. ;
  526. SNDNOK:    LD    E,0FFH
  527.     CALL    DCONIO        ;GET CONS INP
  528.     OR    A        ;ANY CHAR?
  529.     JP    Z,SNDNOK        ;NO
  530. ;
  531. ; CURRENT FILE CLOSED
  532. ;
  533. SENDOK:    LD    HL,FILCNT    ;FILE COUNT
  534.     DEC    (HL)        ;DONE?
  535.     JP    NZ,SNDLOP        ;NO
  536.     LD    E,XOFF        ;YES, 'xoff'...DONE
  537.     CALL    SENDE        ;SEND CHAR IN <E>    (XOFF -->)
  538.     CALL    CRLF        ;PRINT CRLF
  539.     LD    DE,DONMSG    ;'Done',00,EXIT OR CONTINUE'
  540.     CALL    PRTDE        ;PRINT DE->'$'
  541.     RET    
  542. ;
  543. ;**********************************************
  544. ;
  545. ; RECEIVE FILE(S)
  546. ;
  547. GFNRCV:    CALL    GETFNT        ;GET REQ FN.T & PARSE INTO SYSFCB
  548.     CALL    CRLF        ;PRINT CRLF
  549.     LD    C,DRESET
  550.     CALL    BDOS        ;RESET SYSTEM
  551.     LD    C,SELDRV
  552.     LD    HL,CURDSK
  553.     LD    E,(HL)
  554.     CALL    BDOS        ;SELECT CCP DRIVE
  555.     LD    HL,FCB        ;PNT TO REQUESTED FN.T
  556.     LD    DE,CURFNT    ;PLACE TO STORE IT
  557.     LD    BC,0012
  558.     CALL    LDIR        ;GET REQ FN.T FCB TO CURFNT
  559.     LD    A,(FNTOUS)    ;00/NZ=USE SENT/REQ FN.T
  560.     LD    (ENTFLG),A    ;CUR FN.T TO USE FLAG
  561.     LD    B,10        ;TIME TO WAIT
  562.     LD    C,00        ;WAIT FOR 'R' (SNDR RDY) FROM OTHER
  563.     CALL    CKOTHR        ;WAIT/TIME OUT
  564.     OR    A        ;SENDER READY?
  565.     JP    NZ,SNDSND        ;YES
  566.     LD    DE,SNDRMS    ;'Sender $'
  567.     CALL    PRTDE        ;PRINT DE->'$'
  568.     LD    DE,NRDYMS    ;'is not ready.',0,'$'
  569.     CALL    PRTDE        ;PRINT DE->'$'
  570. ;
  571. ; LOOP FOR 'R'eady FROM SENDER
  572. ;
  573. GETRDY:    CALL    MDMIST        ;GET OTHER'S INPUT STATUS
  574.     JP    Z,GETRDY        ;PORT NOT READY
  575.     CALL    CHKABT
  576.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    ('R'EADY <--)
  577.     CP    'R'        ;'R'EADY?
  578.     JP    NZ,GETRDY        ;NO
  579. ;
  580. ; SENDER READY...SEND 'S'end TO SENDER
  581. ;
  582. SNDSND:    LD    E,'S'
  583.     CALL    SENDE        ;SEND CHAR IN <E>    ('S'END -->)
  584. ;
  585. ; LOOP FOR 'G' FROM SENDER
  586. ;
  587. GTGOOD:    CALL    CHKABT
  588.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    ('G'OOD <--)
  589.     CP    'G'
  590.     JP    NZ,GTGOOD
  591. ;
  592. ; LOOP FOR NEXT FILE RECEIVE
  593. ;
  594. GTFLOP:    CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (XOFF/EOT <--)
  595.     CP    XOFF        ;'xoff'...END OF XFRS?
  596.     JP    NZ,GTAFIL        ;NO
  597.     CALL    CRLF        ;YES, PRINT CRLF
  598.     LD    DE,DONMSG    ;'Done',00,EXIT OR CONTINUE'
  599.     CALL    PRTDE        ;PRINT DE->'$'
  600.     RET            ;DONE RECEIVE SESSION
  601. ;
  602. ;----------------------------------------------
  603. ;
  604. ; READY TO RECEIVE (NEXT) FILE...SET UP SYSTEM FCB
  605. ;
  606. GTAFIL:    LD    DE,FCB        ;SYSTEM FCB
  607.     LD    HL,CURFNT    ;PNT TO REQ FN.T
  608.     LD    BC,0012
  609.     CALL    LDIR        ;GET IT TO SYSFCB
  610.     PUSH    AF        ;SAVE CHAR
  611.     LD    A,(ENTFLG)    ;CUR FN.T TO USE FLAG
  612.     LD    (FNTOUS),A    ;00/NZ=USE SENT/REQ FN.T
  613.     POP    AF
  614.     CP    EOT        ;'eot'?
  615.     JP    Z,FNNEXT        ;YES, GET SNDRS FCB TO SNDFCB
  616.     LD    E,A        ;NO, GET CHAR (?)
  617.     CALL    DCONIO        ;PRINT <E> TO CONS
  618. ;
  619. ; BAD FN...SEND 'X'
  620. ;
  621. BADFLN:    LD    E,'X'
  622.     CALL    SENDE        ;SEND CHAR IN <E>    (X -->)
  623.     JP    GTFLOP        ;RESTART FILE TRANSFER
  624. ;
  625. ;----------------------------------------------
  626. ;
  627. ; GOT 'eot'...FN.T NEXT
  628. ;
  629. FNNEXT:    LD    E,08        ;SEND 08...RDY FOR FN.T
  630.     CALL    SENDE        ;SEND CHAR IN <E>    (08 -->)
  631.     LD    HL,SNDFCB+01    ;SENDERS FILENAME FCB
  632.     LD    B,11        ;MAX FN.T CHARS
  633. ;
  634. ; LOOP & GET FN.T FROM SENDER TO SNDFCB
  635. ;
  636. FNLOOP:    CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (FN.T <--)
  637.     CP    ' '        ;VALID FN.T CHAR?
  638.     JP    C,BADFLN        ;NO
  639.     LD    (HL),A        ;YES, SAVE IT
  640.     LD    E,A        ;& ECHO
  641.     CALL    SENDE        ;SEND CHAR IN <E>    (FN.T -->)
  642.     INC    HL
  643.     DEC    B
  644.     JP    NZ,FNLOOP        ;NOT 11 CHARS YET
  645.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (ENQ <--)
  646.     CP    ENQ        ;'enq',  END FN?
  647.     JP    NZ,BADFLN        ;NO
  648. ;
  649. ; GOT SENDERS FN.T & 'enq' MOVE IT TO SYSFCB IF USING SND NAME
  650. ;
  651. MOVFCB:    LD    DE,FCB+01    ;DESTINATION
  652.     LD    HL,SNDFCB+01    ;SENDERS FILENAME FCB
  653.     LD    B,11
  654. ;
  655. ; LOOP & STO FN
  656. ;
  657. STOFN:    LD    A,(FNTOUS)    ;00/NZ=USE SENT/REQ FN.T
  658.     OR    A        ;USE SENDERS FN.T?
  659.     JP    Z,STOFN1        ;YES
  660.     LD    A,(DE)
  661.     CP    '?'        ;WILD CARD?
  662.     JP    NZ,STOFN2        ;NO
  663. ;
  664. ; STORE SENDERS FN.T IN SYSTEM FCB
  665. ;
  666. STOFN1:    LD    A,(HL)        ;SENDERS FN.T CHR
  667.     LD    (DE),A        ;TO SYSTEM FCB
  668. ;
  669. ; SENDERS FN.T CHAR STORED IF USING HIS FN.T
  670. ;
  671. STOFN2:    INC    DE        ;BUMP PUT PNTR
  672.     INC    HL        ;& GET PNTR
  673.     DEC    B
  674.     JP    NZ,STOFN        ;NOT 11 CHARS YET
  675.     CALL    CRLF        ;PRINT CRLF
  676.     LD    HL,SNDFCB+01    ;SENDERS FILENAME FCB
  677.     CALL    PRTFNT        ;PRINT FN TO CONSOLE
  678.     LD    A,(FNTOUS)    ;00/NZ=USE SENT/REQ FN.T
  679.     OR    A        ;USING SENDERS FN.T?
  680.     JP    Z,PRTARW        ;YES, PRINT ARROW & IT'S NAME
  681.     LD    HL,FCB+11    ;NO...
  682.     LD    B,03        ;'TYP' LENGTH
  683.     CALL    FILSPC        ;FILL ANY EMBEDDED SPACES
  684.     LD    B,08        ;'FILENAME' LENGTH
  685.     CALL    FILSPC        ;FILL ANY EMBEDDED SPACES
  686.     JP    PRTARW        ;PRINT ' ==> '
  687. ;
  688. ;----------------------------------------------
  689. ;
  690. ; FILL ANY EMBEDDED FN.T SPACES WITH '$'S
  691. ;
  692. FILSPC:    LD    A,(HL)
  693.     DEC    HL
  694.     CP    ' '        ;AT SPACE?
  695.     JP    NZ,NOTSPC        ;NO, SOLID
  696.     DEC    B        ;END OF FN/T?
  697.     JP    NZ,FILSPC        ;NO
  698.     RET            ;YES
  699. ;
  700. ;----------------------------------------------
  701. ;
  702. ; END STRING AT SOLID
  703. ;
  704. ENDSTR:    LD    A,(HL)
  705.     DEC    HL
  706.     CP    ' '        ;EMBEDDED SPACE?
  707.     JP    NZ,NOTSPC        ;NO
  708.     INC    HL        ;YES, PNT BACK TO IT
  709.     LD    (HL),'$'    ;FILL IT
  710.     DEC    HL        ;GO ON TO NEXT
  711. ;
  712. ; ANY EMBEDDED SPACE FILLED WITH '$'
  713. ;
  714. NOTSPC:    DEC    B        ;END OF FN/T?
  715.     JP    NZ,ENDSTR        ;NO
  716.     RET            ;YES, DONE
  717. ;
  718. ;----------------------------------------------
  719. ;
  720. ; PRINT ' ==> ' & RECEIVE FN.T
  721. ;
  722. PRTARW:    LD    DE,ARWMSG    ;'  ==>  $'
  723.     CALL    PRTDE        ;PRINT DE->'$'
  724.     LD    HL,FCB+01    ;PNT TO RECEIVE FILE NAME
  725.     CALL    PRTFNT        ;PRINT FN TO CONSOLE
  726.     CALL    CLRFCB        ;CLR SYS FCB 'ex' -> 'nc'
  727.     XOR    A        ;SET NO OVERWRITE
  728.     LD    (OVWFLG),A    ;00/NZ=NO OVERWRITE
  729.     LD    C,SCHFIL
  730.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  731.     INC    A        ;FOUND IT?
  732.     JP    Z,NEWFIL        ;NO
  733.     LD    DE,OVWMSG    ;YES, 'Overwrite (Y/N) ?  $'
  734.     CALL    PRTDE        ;PRINT DE->'$'
  735. ;
  736. ; LOOP FOR FILENAME OVERWRITE OK
  737. ;
  738. ASKOVW:    CALL    GETCON        ;LD <A> & <E> WITH CONSOLE INP
  739.     CALL    MAKEUC        ;MAKE <A> UC
  740.     CP    'N'
  741.     JP    NZ,CKOWOK        ;NO
  742.     CALL    DCONIO        ;PRINT <E> TO CONS
  743.     CALL    GETFNT        ;GET REQ FN.T & PARSE INTO SYSFCB
  744.     JP    MOVFCB
  745. ;
  746. ;**********************************************
  747. ;
  748. ; CHECK FOR OVERWRITE
  749. ;
  750. CKOWOK:    CP    'Y'        ;OVERWRITE?
  751.     JP    NZ,ASKOVW        ;NO
  752.     CALL    DCONIO        ;PRINT <E> TO CONS
  753.     LD    HL,OVWFLG    ;00/NZ=NO OVERWRITE
  754.     LD    (HL),01        ;SET OVERWRITE OK
  755.     LD    DE,SPCMSG    ;'           $'
  756.     CALL    PRTDE        ;PRINT DE->'$'
  757. ;
  758. ; ANY OVERWRITE QUESTION TAKEN CARE OF OR NO FILE TO OVERWRITE
  759. ;
  760. NEWFIL:    LD    HL,FCB+09    ;PNT TO 'TYP'
  761.     LD    DE,SNDFCB+09    ;SENDERS FILENAME FCB
  762.     LD    B,03
  763. ;
  764. ; LOOP & STORE RECEIVE TYPE IN SNDFCB 'TYP' LOC
  765. ;     AND SET SYSTEM FCB TO FILENAME.$$$
  766. ;
  767. FILTYP:    LD    A,(HL)        ;GET ORIG TYPE
  768.     LD    (HL),'$'    ;MAKE TYPE = TEMP
  769.     LD    (DE),A        ;SAVE ORIG TYPE
  770.     INC    HL
  771.     INC    DE        ;BUMP
  772.     DEC    B
  773.     JP    NZ,FILTYP
  774.     CALL    FILDEL        ;DELETE ANY TEMP FILE @ FCB
  775.     LD    C,MAKFIL    ;MAKE FN.$$$
  776.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  777.     INC    A
  778.     LD    DE,DIRFMS    ;'  Directory full$'
  779.     JP    Z,PRTCLS        ;DE->$, CLOSE & WAIT TO CNT
  780.     LD    A,0FFH
  781.     LD    (MORFLG),A    ;00/NZ=NO/MORE FILES
  782.     LD    E,09        ;SAY 'READY FOR FILE'
  783.     CALL    SENDE        ;SEND CHAR IN <E>    (09 -->)
  784.     LD    DE,RCVMSG    ;'    Receiving $'
  785.     CALL    PRTDE        ;PRINT DE->'$'
  786. ;
  787. ; LOOP FOR BLOCKS
  788. ;
  789. GETBLK:    LD    HL,DBUF        ;PLACE TO GET BLOCK
  790.     LD    C,00        ;INIT CHKSUM
  791.     LD    D,128        ;BLOCK LGT
  792. ;
  793. ; LOOP FOR 'stx'S & GET BLOCKS
  794. ;
  795. GETSTX:    CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (STX/ETX <--)
  796.     CP    STX        ;'stx'...ANOTHER BLOCK?
  797.     JP    Z,SNDPCD        ;YES, SEND 'P' TO SENDER
  798.     CP    ETX        ;'etx'...EOF?
  799.     JP    Z,GOTETX        ;YES
  800.     LD    E,'N'
  801.     CALL    SENDE        ;SEND CHAR IN <E>    ('N' -->)
  802.     JP    GETSTX        ;WAIT FOR 'stx'
  803. ;
  804. ;----------------------------------------------
  805. ;
  806. ; SEND 'P'roceed TO SENDER
  807. ;
  808. SNDPCD:    LD    E,'P'        ;P(ROCEED)
  809.     CALL    SENDE        ;SEND CHAR IN <E>    ('P'ROCEED -->)
  810. ;
  811. ; LOOP & GET 128 BYTES
  812. ;
  813. GTABLK:    CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (BLOCK <--)
  814.     LD    (HL),A        ;STO CHAR
  815.     XOR    C        ;TO CHKSUM
  816.     LD    C,A        ;RESTO IT
  817.     INC    HL        ;PNTR
  818.     DEC    D        ;DONE 128?
  819.     JP    NZ,GTABLK        ;NO
  820.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER    (CHKSUM <--)
  821.     XOR    C        ;CKSUM OK
  822.     JP    Z,CKSMOK        ;YES
  823.     LD    E,'B'        ;NO
  824.     CALL    DCONIO        ;PRINT <E> TO CONS
  825.     LD    E,'B'
  826.     CALL    SENDE        ;SEND CHAR IN <E>    ('B'AD -->)
  827.     JP    GETBLK
  828. ;
  829. ;----------------------------------------------
  830. ;
  831. ; LOOP FOR NEXT RECEIVE SECTOR
  832. ;
  833. CKSMOK:    LD    E,'.'
  834.     CALL    DCONIO        ;PRINT <E> TO CONS
  835.     LD    C,SETDMA
  836.     LD    DE,DBUF
  837.     CALL    BDOS
  838.     LD    C,WRTNXT    ;WRITE BLOCK TO DISK
  839.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  840.     OR    A        ;OK WRITE?
  841.     JP    Z,SNDGOD        ;YES
  842.     CALL    FILCLS        ;NO, CLOSE FILE
  843.     XOR    A
  844.     LD    (MORFLG),A    ;00/NZ=NO/MORE FILES
  845.     LD    DE,DSKFMS    ;'  Disk full$'
  846.     JP    PRTCLS        ;DE->$, CLOSE & WAIT TO CNT
  847. ;
  848. ;**********************************************
  849. ;
  850. ; GOT OK WRITE
  851. ;
  852. SNDGOD:    LD    E,'G'        ;SEND 'G'OOD
  853.     CALL    SENDE        ;SEND CHAR IN <E>    ('G'OOD -->)
  854.     JP    GETBLK
  855. ;
  856. ;**********************************************
  857. ;
  858. ; GOT 'etx'...EOF
  859. ;
  860. GOTETX:    CALL    FILCLS        ;CLOSE FILE
  861.     JP    NZ,CLOSOK        ;OK CLOSE
  862. ;
  863. ; LOOP FOR CONSOLE CHAR
  864. ;
  865. GTCNCH:    CALL    CHKABT        ;CHECK CONS FOR ABORT
  866.     LD    E,0FFH
  867.     CALL    DCONIO        ;GET CONS CHAR
  868.     OR    A        ;ANY CHAR?
  869.     JP    Z,GTCNCH        ;NO
  870. ;
  871. ; OK CLOSE/GOT RESPONSE TO 'CLOSE ERROR'
  872. ;
  873. CLOSOK:    LD    HL,FCB        ;RECEIVE FN.$$$
  874.     LD    DE,SNDFCB    ;SENDERS FILENAME FCB
  875.     LD    BC,0009
  876.     CALL    LDIR
  877.     XOR    A
  878.     LD    (SNDFCB+12),A    ;CLEAR EXTENT AND...
  879.     LD    (SNDFCB+15),A    ;RECORD COUNT
  880.     LD    A,(OVWFLG)    ;00/NZ=NO/OVERWRITE
  881.     OR    A        ;OVER WRITE?
  882.     JP    Z,DELOK        ;NO, RENAME TO FN @ SNDFCB
  883.     LD    C,DELFIL    ;YES
  884.     LD    DE,SNDFCB
  885.     CALL    BDOS        ;DELETE SENDERS FN.T
  886.     CP    0FFH        ;OK DELETE?
  887.     JP    NZ,DELOK        ;YES
  888.     LD    DE,DELMSG    ;'  Delete error$'
  889.     JP    PRTRST        ;PRINT DE->$ & RESTART
  890. ;
  891. ;**********************************************
  892. ;
  893. ; OK TO RENAME TO FN @ SNDFCB
  894. ;
  895. DELOK:    LD    HL,SNDFCB    ;RECEIVE (SENDERS) FN.T FCB
  896.     LD    DE,FCB+16
  897.     LD    BC,0016
  898.     CALL    LDIR        ;TO SYSFCB+16 FOR RENAME
  899.     LD    C,RENFIL    ;FN.$$$ -> FN.TYP
  900.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  901.     INC    A
  902.     JP    Z,RNMERR        ;RENAME ERROR...RESTART
  903.     XOR    A        ;SET NO MORE
  904.     LD    (MORFLG),A    ;00/NZ=NO/MORE FILES
  905.     JP    GTFLOP        ;RESTART FILE XFR FOR NEXT FILE
  906. ;
  907. ;**********************************************
  908. ;
  909. ; RENAME ERROR...RESTART
  910. ;
  911. RNMERR:    LD    DE,RENMSG    ;'  Rename error$'
  912. ;
  913. ; PRINT DE->$ & RESTART
  914. ;
  915. PRTRST:    CALL    PRTDE        ;PRINT DE->'$'
  916.     CALL    CRLF        ;PRINT CRLF
  917.     CALL    FILDEL        ;DELETE FILE @ FCB
  918.     XOR    A
  919.     LD    (MORFLG),A    ;00/NZ=NO/MORE FILES
  920.     JP    OPTLOP        ;RESTART
  921. ;
  922. ;**********************************************
  923. ;
  924. ; PRINT FN TO CONSOLE
  925. ;
  926. PRTFNT:    LD    B,11        ;MAX CHARS
  927. ;
  928. ; LOOP & PRINT NAME
  929. ;
  930. PRTFLN:    LD    A,(HL)        ;GET CHAR
  931.     AND    7FH        ;STRIP PARITY
  932.     LD    E,A        ;GET CHAR
  933.     CALL    DCONIO        ;PRINT <E> TO CONS
  934.     LD    A,B
  935.     CP    04        ;AT TYPE?
  936.     JP    NZ,PTFLN1        ;NO
  937.     LD    E,'.'        ;YES, PRINT '.'
  938.     CALL    DCONIO        ;PRINT <E> TO CONS
  939. PTFLN1:    INC    HL
  940.     DEC    B
  941.     JP    NZ,PRTFLN
  942.     RET    
  943. ;
  944. ;**********************************************
  945. ;
  946. ; LD <A> & <E> WITH CONSOLE INP
  947. ;
  948. GETCON:    LD    E,0FFH
  949.     CALL    DCONIO        ;GET CONS CHAR
  950.     OR    A        ;ANY CONSOLE CHAR?
  951.     JP    Z,GETCON        ;NO, LD <A> & <E> WITH CONSOLE INP
  952.     CP    'C'-40H        ;ABORT?
  953.     LD    DE,ABTMSG    ;'  Aborted $'
  954.     JP    Z,PRTQIT        ;YES, PRINT DE->$ & QUIT
  955.     CP    ESC
  956.     LD    E,A        ;STO IN <E>
  957.     RET    NZ         ;NOT ESC
  958.     CALL    CRLF        ;PRINT CRLF
  959.     JP    RESTRT        ;RESTART
  960. ;
  961. ;**********************************************
  962. ;
  963. ; CLEAR SYSTEM FCB 'ex' -> 'nc'
  964. ;
  965. CLRFCB:    LD    HL,FCB+12
  966.     LD    DE,FCB+13
  967.     LD    (HL),00
  968.     LD    BC,0023
  969.     CALL    LDIR
  970.     RET    
  971. ;
  972. ;**********************************************
  973. ;
  974. ; CLOSE FILE, 00/NZ = BAD/OK CLOSE
  975. ;
  976. FILCLS:    LD    C,CLSFIL
  977.     CALL    DOBDOS        ;DO BDOS CALL IN <C> DE=FCB
  978.     INC    A        ;OK CLOSE?
  979.     RET    NZ         ;YES
  980.     LD    DE,CLSMSG    ;'  Close error$'
  981.     CALL    PRTDE        ;PRINT DE->'$'
  982.     XOR    A
  983.     RET    
  984. ;
  985. ;**********************************************
  986. ;
  987. ; DELETE FILE @ FCB
  988. ;
  989. FILDEL:    LD    C,DELFIL
  990. ;
  991. ; DO BDOS CALL IN <C> DE=FCB
  992. ;
  993. DOBDOS:    LD    DE,FCB
  994. ;
  995. ; DO BDOS CALL IN <C>
  996. ;
  997. DBDOS1:    PUSH    DE
  998.     PUSH    HL
  999.     CALL    BDOS
  1000.     POP    HL
  1001.     POP    DE
  1002.     RET    
  1003. ;
  1004. ;**********************************************
  1005. ;
  1006. ; DIRECT CONSOLE I/O
  1007. ;
  1008. DCONIO:    PUSH    BC
  1009.     LD    C,DIRCON
  1010.     CALL    DBDOS1        ;DO BDOS CALL IN <C>
  1011.     POP    BC
  1012.     RET    
  1013. ;
  1014. ;**********************************************
  1015. ;
  1016. ; PRINT DE->'$' WITH CR'S AT 00'S
  1017. ;
  1018. PRTDE:    LD    A,(DE)
  1019.     CP    '$'
  1020.     RET    Z 
  1021.     OR    A        ;TIME FOR CR?
  1022.     PUSH    DE
  1023.     LD    E,A        ;GET CHAR
  1024.     PUSH    AF        ;SAVE IT
  1025.     CALL    NZ,DCONIO        ;PRINT <E> TO CONS
  1026.     POP    AF
  1027.     CALL    Z,CRLF        ;PRINT CRLF
  1028.     POP    DE
  1029.     INC    DE
  1030.     JP    PRTDE
  1031. ;
  1032. ;**********************************************
  1033. ;
  1034. ; PRINT CRLF
  1035. ;
  1036. CRLF:    PUSH    AF
  1037.     LD    E,CR
  1038.     CALL    DCONIO        ;PRINT <E> TO CONS
  1039.     LD    E,LF
  1040.     CALL    DCONIO        ;PRINT <E> TO CONS
  1041.     POP    AF
  1042.     RET    
  1043. ;
  1044. ;**********************************************
  1045. ;
  1046. ; DONE...CRLF & CLOSE FILES
  1047. ;
  1048. DONALL:    LD    DE,CRMSG
  1049.     JP    CLFILS        ;DONE...CLOSE FILES
  1050. ;
  1051. ;**********************************************
  1052. ;
  1053. ; WAIT FOR CHR FRM OTHER
  1054. ;
  1055. GTOTHR:    CALL    MDMIST        ;GET MODEM INPUT STAT
  1056.     JP    NZ,GTMCHR        ;DATA AVAILABLE GET IT
  1057.     CALL    CHKABT        ;SEE IF QUIT
  1058.     JP    GTOTHR        ;NOTHING THERE
  1059. ;
  1060. ;**********************************************
  1061. ;
  1062. ; SEND CHAR IN <E>
  1063. ;
  1064. SENDE:    PUSH    DE        ;CHAR TO SEND
  1065.     LD    DE,WAITIM    ;TIME TO WAIT
  1066. ;
  1067. ; LOOP & WAIT FOR CHAR
  1068. ;
  1069. WAITCH:    CALL    CHKABT        ;CHECK CONS FOR ABORT
  1070.     CALL    MDMOST        ;RETURN MODEM OUTPUT STATUS
  1071.     JP    NZ,SNDCHR        ;PORT IS READY
  1072.     DEC    DE        ;PORT NOT READY...
  1073.     LD    A,D
  1074.     OR    E        ;TIME UP?
  1075.     JP    NZ,WAITCH        ;NO
  1076.     LD    DE,PNRMSG    ;'RS-232C is not ready.',0,'$'
  1077.     CALL    PRTDE        ;PRINT DE->'$'
  1078. ;
  1079. ; WAIT FOR OUTOK
  1080. ;
  1081. OTOKLP:    CALL    MDMOST        ;RETURN MODEM OUTPUT STATUS
  1082.     JP    NZ,SNDCHR
  1083.     CALL    CHKABT        ;CHECK CONS FOR ABORT
  1084.     JP    OTOKLP
  1085. ;
  1086. ;----------------------------------------------
  1087. ;
  1088. ; MODEM OUT READY, RECOVER CHR & SEND TO MODEM
  1089. ;
  1090. SNDCHR:    POP    DE        ;CHR IN <E>
  1091.     JP    MDMOUT        ;SEND IT
  1092. ;
  1093. ;**********************************************
  1094. ;
  1095. ; PRINT DE->$, CLOSE FILES & WAIT TO CONTINUE
  1096. ;
  1097. PRTCLS:    CALL    PRTDE        ;PRINT DE->'$'
  1098.     LD    A,(MORFLG)    ;00/NZ=NO/MORE FILES
  1099.     OR    A
  1100.     CALL    NZ,FILCLS        ;CLOSE FILE
  1101.     XOR    A
  1102.     LD    (MORFLG),A    ;00/NZ=NO/MORE FILES
  1103.     LD    DE,HLPMS1    ;0,0,'Press  ESC to restart,'
  1104.     CALL    PRTDE        ;PRINT DE->'$'
  1105.     LD    E,'.'
  1106.     CALL    DCONIO        ;PRINT <E> TO CONS
  1107. ;
  1108. ; WAIT FOR CONSOLE INPUT
  1109. ;
  1110. CONWAT:    CALL    GETCON        ;LD <A> & <E> WITH CONSOLE INP
  1111.     JP    CONWAT
  1112. ;
  1113. ;**********************************************
  1114. ;
  1115. ; GET REQUESTED FILENAME & PARSE INTO SYSFCB
  1116. ;
  1117. GETFNT:    LD    DE,ENTRMS    ;'Enter file name    $'
  1118.     CALL    PRTDE        ;PRINT DE->'$'
  1119.     LD    HL,FLNLST    ;FILENAME LIST BUFFER
  1120.     LD    DE,FLNLST+01    ;TO BE USED FOR INPUT
  1121.     LD    (HL),00
  1122.     LD    BC,0014
  1123.     CALL    LDIR        ;CLEAR LOCAL FCB
  1124.     LD    HL,FCB
  1125.     LD    DE,FCB+01
  1126.     LD    (HL),' '
  1127.     LD    BC,0011
  1128.     CALL    LDIR        ;CLEAR SYSTEM FCB FN.T
  1129.     XOR    A
  1130.     LD    (FCB+12),A    ;CLR EX...
  1131.     LD    (FCB+15),A    ;RC
  1132.     LD    (FCB+32),A    ;& NR
  1133.     LD    BC,0000        ;INIT <C>=CHAR COUNT
  1134. ;
  1135. ; LOOP FOR FILENAME CHARS
  1136. ;
  1137. GTFNT1:    LD    HL,FLNLST    ;FILENAME LIST BUFFER
  1138.     CALL    GETCON        ;LD <A> & <E> WITH CONSOLE INP
  1139.     CP    CR        ;END OF INPUT?
  1140.     JP    Z,ENDINP        ;YES
  1141.     CP    BS        ;ERASE?
  1142.     JP    Z,GOTBS        ;YES
  1143.     CP    RUB        ;ERASE?
  1144.     JP    NZ,NORUB        ;NO
  1145.     LD    E,BS
  1146. ;
  1147. ; GOT BS/RUB...ERASE
  1148. ;
  1149. GOTBS:    LD    A,C        ;GET COUNT
  1150.     OR    A        ;0 CHARS?
  1151.     JP    Z,GTFNT1        ;YES
  1152.     DEC    C        ;NO, DEC COUNT
  1153.     ADD    HL,BC        ;PNT TO CHAR
  1154.     LD    (HL),00        ;KILL IT
  1155.     CP    14        ;14 CHARS
  1156.     JP    Z,CHRIGN        ;YES, ERASE CHAR
  1157.     CALL    DCONIO        ;NO, PRINT <E> TO CONS
  1158. ;
  1159. ; OVER 14 CHARS IGNORED
  1160. ;
  1161. CHRIGN:    LD    DE,BSMSG    ;' ',BS,'$'
  1162.     CALL    PRTDE        ;PRINT DE->'$'
  1163.     JP    GTFNT1        ;GET NEXT
  1164. ;
  1165. ;----------------------------------------------
  1166. ;
  1167. ; NOT A BS
  1168. ;
  1169. NORUB:    CP    ' '+01        ;VALID CHAR?
  1170.     JP    C,GTFNT1        ;NO, GET ANOTHER
  1171.     LD    A,C        ;GET COUNT
  1172.     CP    14        ;14 CHARS?
  1173.     JP    NZ,GETMOR        ;NO
  1174.     DEC    C        ;YES, DEC COUNT
  1175. ;
  1176. ; NOT 14 CHARS
  1177. ;
  1178. GETMOR:    CALL    PTUSTO        ;GET CONS CHR, UC & STO @ HL+<C>
  1179.     LD    A,C        ;GET COUNT
  1180.     CP    14        ;14 CHARS?
  1181.     JP    NZ,GTFNT1        ;NO, GET NEXT
  1182.     LD    E,BS        ;YES, BS ONE
  1183.     CALL    DCONIO        ;PRINT <E> TO CONS
  1184.     JP    GTFNT1        ;GET NEXT
  1185. ;
  1186. ;----------------------------------------------
  1187. ;
  1188. ; GOT REQUESTED FN.T TO FLNLST...PARSE INTO SYSTEM FCB
  1189. ;
  1190. ENDINP:    LD    A,(FLNLST+01)    ;GET 2ND CHAR
  1191.     CP    ':'        ;DRIVE?
  1192.     LD    A,'A'-01
  1193.     JP    NZ,NODRIV        ;NO
  1194.     LD    A,(HL)        ;YES, GET IT
  1195.     INC    HL
  1196.     INC    HL        ;TO FILENAME
  1197.     LD    A,(FLNLST)    ;GET DRIVE
  1198.     CP    'A'-01        ;<'A'
  1199.     JP    Z,SELERR        ;DRIVE SELECT ERROR
  1200. ;
  1201. ; <A>=00/DRV=DEFAULT/DRIVE
  1202. ;
  1203. NODRIV:    SUB    'A'-01        ;OK DRIVE?
  1204.     JP    C,SELERR        ;NO, DRIVE SELECT ERROR
  1205.     CP    MAXDRV-'A'+01    ;> MAX DRIVE?
  1206.     JP    NC,SELERR        ;YES, DRIVE SELECT ERROR
  1207.     LD    (FCB),A        ;STO DRIVE
  1208.     LD    B,08        ;FN LENGTH
  1209.     LD    DE,FCB+01
  1210.     LD    A,(HL)
  1211.     CP    '0'        ;<#?
  1212.     JP    C,OKCHAR        ;YES
  1213.     CP    '9'+01        ;#?
  1214.     JP    C,BDSPEC        ;YES, BAD FILE DESC
  1215. ;
  1216. ; LOOP FOR 8 FILENAME CHARS
  1217. ;
  1218. OKCHAR:    LD    A,(HL)        ;GET FN.T CHAR
  1219.     CP    '*'        ;WILD CARD?
  1220.     JP    Z,PUT8QS        ;PUT 8 '?'S
  1221.     CP    '.'        ;END OF FN?
  1222.     JP    NZ,NOTFNE        ;NO
  1223.     LD    A,B        ;YES
  1224.     CP    08        ;8 CHARS LEFT?
  1225.     JP    Z,BDSPEC        ;YES, BAD FILE DESC
  1226.     JP    DOTYPE        ;DONE FILENAME...TO TYP
  1227. ;
  1228. ;----------------------------------------------
  1229. ;
  1230. ; CHECK FOR END OF STRING
  1231. ;
  1232. NOTFNE:    OR    A        ;NULL...END?
  1233.     JP    NZ,NONULL        ;NO
  1234.     LD    A,B        ;FN LGT
  1235.     CP    08        ;STILL 8 CHARS LEFT?
  1236.     JP    NZ,DONFNT        ;NO, DONE FN
  1237.     LD    A,(USROPT)    ;YES, USER OPTION: S/R
  1238.     CP    'S'        ;NO FILENAME...SEND?
  1239.     JP    Z,NFNINP        ;YES, 'NO FILENAME SPECIFIED'
  1240.     JP    DONFNT        ;DONE
  1241. ;
  1242. ;----------------------------------------------
  1243. ;
  1244. ; NOT NULL, STO CHAR
  1245. ;
  1246. NONULL:    LD    (DE),A        ;STO IN SYSFCB
  1247.     INC    DE        ;PUT PNTR
  1248.     INC    HL        ;GET PNTR
  1249.     DEC    B
  1250.     JP    NZ,OKCHAR        ;NOT 8 CHARS YET
  1251. ;
  1252. ; LOOP TO NULL/'.'
  1253. ;
  1254. FNDNUL:    LD    A,(HL)
  1255.     OR    A        ;NULL?
  1256.     JP    Z,DONFNT        ;YES, DONE
  1257.     CP    '.'        ;END OF FN?
  1258.     JP    Z,DOTYPE        ;GOT TO TYPE
  1259.     JP    BDSPEC        ;BAD FILE DESC
  1260. ;
  1261. ;----------------------------------------------
  1262. ;
  1263. ; GOT '*'
  1264. ;
  1265. PUT8QS:    PUSH    BC        ;FN/TYP COUNT
  1266. ;
  1267. ; LOOP & INSERT '?'S
  1268. ;
  1269. DOQLOP:    LD    A,'?'
  1270.     LD    (DE),A
  1271.     INC    DE
  1272.     DEC    B
  1273.     JP    NZ,DOQLOP
  1274.     POP    BC        ;FN.TP BAL
  1275.     DEC    B
  1276. ;
  1277. ; LOOP TO END OF FN
  1278. ;
  1279. EFNLOP:    INC    HL
  1280.     LD    A,(HL)
  1281.     CP    '.'        ;END OF FN?
  1282.     JP    Z,DOTYPE        ;YES
  1283.     OR    A        ;NULL?
  1284.     JP    Z,DONFNT        ;YES, DONE
  1285.     DEC    B
  1286.     JP    NZ,EFNLOP
  1287.     INC    HL
  1288.     JP    FNDNUL        ;GET TO NULL/'.'
  1289. ;
  1290. ;----------------------------------------------
  1291. ;
  1292. ; END OF FN (.)
  1293. ;
  1294. DOTYPE:    INC    HL
  1295.     LD    B,03        ;MAX TYP CHARS
  1296.     LD    DE,0065H
  1297. ;
  1298. ; LOOP FOR 3 TYP CHARS
  1299. ;
  1300. DOTYP1:    LD    A,(HL)
  1301.     LD    C,A
  1302.     AND    80H        ;GET BIT 7
  1303.     JP    Z,NTSPCL        ;NOT SPECIAL
  1304.     LD    A,B
  1305.     CP    01        ;'Y' BYTE?
  1306.     JP    NZ,BDSPEC        ;NO, SYSTEM FILE...BAD FILE DESC
  1307. ;
  1308. ; NOT SYSTEM FILE
  1309. ;
  1310. NTSPCL:    LD    A,C
  1311.     CP    '.'
  1312.     JP    Z,BDSPEC        ;BAD FILE DESC
  1313.     CP    '*'
  1314.     JP    Z,DOTPQS        ;FILL 'TYP' WITH '?'S
  1315.     OR    A        ;NULL?
  1316.     JP    Z,DONFNT        ;YES, DONE
  1317.     LD    (DE),A
  1318.     INC    DE
  1319.     INC    HL
  1320.     DEC    B
  1321.     JP    NZ,DOTYP1        ;LOOP FOR 3 CHARS
  1322.     JP    DONTYP        ;FINISHED TYPE
  1323. ;
  1324. ;----------------------------------------------
  1325. ;
  1326. ; FILL 'TYP' WITH '?'S
  1327. ;
  1328. DOTPQS:    PUSH    BC
  1329. ;
  1330. ; LOOP & FILL TYP WITH '?'S
  1331. ;
  1332. DTPQS1:    LD    A,'?'
  1333.     LD    (DE),A
  1334.     INC    DE
  1335.     DEC    B
  1336.     JP    NZ,DTPQS1        ;LOOP FOR 3 CHRS BALANCE
  1337.     POP    BC
  1338. ;
  1339. ; LOOP & FINISH FN.TYP
  1340. ;
  1341. FINTYP:    INC    HL
  1342.     DEC    B
  1343.     JP    NZ,FINTYP
  1344. ;
  1345. ; END OF 'TYP'
  1346. ;
  1347. DONTYP:    LD    A,(HL)        ;GET LAST
  1348.     OR    A        ;END WITH NULL?
  1349.     JP    NZ,BDSPEC        ;NO, BAD FILE DESC
  1350. ;
  1351. ; END OF FN.TYP...RETURN
  1352. ;
  1353. DONFNT:    LD    A,(FCB+01)    ;GET 1ST CHAR
  1354.     SUB    20H        ;-20H=00/NZ=USE SENT/REQ FN.T
  1355.     LD    (FNTOUS),A    ;00/NZ=USE SENT/REQ FN.T
  1356.     XOR    A        ;INIT...
  1357.     LD    (FILCNT),A    ;FILE COUNT
  1358.     RET    
  1359. ;
  1360. ;----------------------------------------------
  1361. ;
  1362. ; NO FILENAME SPECIFIED
  1363. ;
  1364. NFNINP:    LD    DE,NNAMSG    ;'  No file name specified$'
  1365.     JP    PRTERR        ;PRINT ERR MSG @ DE
  1366. ;
  1367. ;----------------------------------------------
  1368. ;
  1369. ; DRIVE SELECT ERROR
  1370. ;
  1371. SELERR:    LD    DE,DSELMS    ;'  Drive select error$'
  1372.     JP    PRTERR        ;PRINT ERR MSG @ DE
  1373. ;
  1374. ;----------------------------------------------
  1375. ; BAD FILE DESC
  1376. ;
  1377. BDSPEC:    LD    DE,BDFLMS    ;'  Bad file descriptor$'
  1378. ;
  1379. ; PRINT ERROR MSG @ DE AND REGET A FN.T FROM CONSOLE
  1380. ;
  1381. PRTERR:    CALL    PRTDE        ;PRINT DE->'$'
  1382.     JP    GETFNT        ;GET REQ FN.T & PARSE INTO SYSFCB
  1383. ;
  1384. ;**********************************************
  1385. ;
  1386. ; GET CONS CHAR, MAKE UC & STO @ HL+<C>
  1387. ;
  1388. PTUSTO:    CALL    DCONIO        ;GET CONS CHAR
  1389.     LD    A,E        ;GET CHAR
  1390.     CALL    MAKEUC        ;MAKE <A> UC
  1391.     ADD    HL,BC
  1392.     LD    (HL),A
  1393.     INC    C
  1394.     RET    
  1395. ;
  1396. ;**********************************************
  1397. ;
  1398. ; MAKE <A> UC
  1399. ;
  1400. MAKEUC:    CP    'a'
  1401.     RET    C 
  1402.     CP    'z'+01
  1403.     RET    NC 
  1404.     AND    5FH
  1405.     RET    
  1406. ;
  1407. ;**********************************************
  1408. ;
  1409. ; C=00/FF/'R'=CHK FOR 'R'/CONS INPT/'S' IN <B> COUNTS
  1410. ;
  1411. CKOTHR:    PUSH    DE
  1412.     PUSH    HL
  1413. ;
  1414. ; LOOP IF OTHER NOT READY
  1415. ;
  1416. CKOTH1:    CALL    CHKABT        ;CHECK CONS FOR ABORT
  1417.     DEC    B        ;MAX WAIT?
  1418.     LD    A,B        ;SET Z IF YES
  1419.     JP    NZ,CKOTH2        ;NO
  1420.     JP    CKOTH6        ;Z, RETURN OTHER NOT READY
  1421. ;
  1422. ;----------------------------------------------
  1423. ;
  1424. ; WAIT NOT UP
  1425. ;
  1426. CKOTH2:    LD    A,C
  1427.     CP    0FFH        ;CHECK CONSOLE?
  1428.     JP    NZ,CKOTH3        ;NO
  1429.     LD    E,0FFH        ;YES
  1430.     PUSH    BC
  1431.     CALL    DCONIO        ;GET CONS CHAR
  1432.     POP    BC
  1433.     OR    A        ;ANY CONS INPUT?
  1434.     JP    Z,CKOTH1        ;NO, RELOOP
  1435.     JP    CKOTH5        ;SET OTHER READY
  1436. ;
  1437. ;----------------------------------------------
  1438. ;
  1439. ; NOT CONSOLE CHECK
  1440. ;
  1441. CKOTH3:    OR    A        ;CHECK FOR 'S'END?
  1442.     JP    Z,CKOTH4        ;NO
  1443.     LD    E,'R'        ;YES
  1444.     CALL    SENDE        ;SEND CHAR IN <E>
  1445.     CALL    MDMIST        ;INPUT FROM OTHER?
  1446.     JP    Z,CKOTH1        ;NO
  1447.     CALL    GTOTHR        ;YES, WAIT FOR CHR FRM OTHER
  1448.     CP    'S'        ;'S'END?
  1449.     JP    NZ,CKOTH1        ;NO
  1450.     JP    CKOTH5        ;SET OTHER READY
  1451. ;
  1452. ;----------------------------------------------
  1453. ;
  1454. ; RECEIVING...CHK FOR 'R' FROM OTHER 
  1455. ;
  1456. CKOTH4:    CALL    MDMIST        ;GET OTHER'S INPUT STATUS
  1457.     JP    Z,CKOTH1        ;NOT READY
  1458.     CALL    GTOTHR        ;WAIT FOR CHR FRM OTHER
  1459.     CP    'R'
  1460.     JP    NZ,CKOTH1        ;NOT READY
  1461. ;
  1462. ; SET OTHER IS READY
  1463. ;
  1464. CKOTH5:    LD    A,0FFH
  1465. ;
  1466. ; RETURN OTHER NOT READY
  1467. ;
  1468. CKOTH6:    POP    HL
  1469.     POP    DE
  1470.     RET    
  1471. ;
  1472. ;**********************************************
  1473. ;
  1474. ; CLEAR ANY PENDING CONSOLE INPUT CHARS
  1475. ;
  1476. CLRCIN:    LD    E,0FFH
  1477.     CALL    DCONIO        ;GET CONS CHAR
  1478.     OR    A
  1479.     JP    NZ,CLRCIN
  1480.     RET    
  1481. ;
  1482. ;**********************************************
  1483. ;
  1484. ; CHECK CONS FOR ABORT
  1485. ;
  1486. CHKABT:    PUSH    BC
  1487.     PUSH    DE
  1488.     PUSH    HL
  1489.     LD    E,0FFH
  1490.     CALL    DCONIO        ;DIRECT CONSOLE I/O
  1491.     CP    'C'-40H
  1492.     JP    Z,EXIT        ;ABORT...SAY SO & CLOSE FILES
  1493.     POP    HL
  1494.     POP    DE
  1495.     POP    BC
  1496.     CP    ESC        ;RESTART?
  1497.     JP    Z,RESTRT        ;YES
  1498.     RET    
  1499. ;
  1500. ;----------------------------------------------
  1501. ;
  1502. ; ABORT...SAY SO & CLOSE FILES
  1503. ;
  1504. EXIT:    CALL    CLRCIN        ;CLEAR ANY CONS INP CHARS
  1505.     LD    DE,ABTMSG    ;'  Aborted $'
  1506. ;
  1507. ; DONE SEND...CLOSE FILES
  1508. ;
  1509. CLFILS:    PUSH    DE
  1510.     LD    A,(MORFLG)    ;00/NZ=NO/MORE FILES
  1511.     OR    A
  1512.     JP    Z,SNTALL        ;DONE ALL
  1513.     CALL    FILCLS        ;CLOSE FILE
  1514.     LD    A,(USROPT)    ;USER OPTION: S/R
  1515.     CP    'R'
  1516.     CALL    Z,FILDEL        ;BAD CLOSE...DELETE FILE @ FCB
  1517. ;
  1518. ; SENT ALL FILES
  1519. ;
  1520. SNTALL:    POP    DE
  1521. ;
  1522. ;**********************************************
  1523. ;
  1524. ; PRINT DE->$ & QUIT
  1525. ;
  1526. PRTQIT:    CALL    PRTDE        ;PRINT DE->'$'
  1527.     CALL    CLRCIN        ;CLR ANY CONS INP CHARS
  1528.     LD    B,02        ;TIME TO WAIT
  1529.     LD    C,0FFH        ;WAIT FOR CONSOLE
  1530.     CALL    CKOTHR        ;WAIT/TIME OUT
  1531. ;
  1532. ; CLEAR CONS INPUT & QUIT
  1533. ;
  1534. CLCXIT:    CALL    CLRCIN        ;CLR ANY CONS INP CHARS
  1535.     .IFNZ    DOBAUD
  1536.      LD    DE,STATMS    ;0,0,'The RS-232C status is :$'
  1537.      CALL    PRTDE        ;PRINT DE->'$'
  1538.      LD    DE,BITMS2    ;' bit rate = 1200'
  1539.      CALL    PRTDE        ;PRINT DE->'$'
  1540.      LD    HL,BAUD2    ;POINT TO END BAUD STRING
  1541.      LD    A,(HL)        ;GET LGT
  1542.      OR    A        ;CLR CRY
  1543.      RRCA            ;LGT/2
  1544.      LD    B,A
  1545.      INC    HL
  1546.      JP    C,DONBD2        ;ODD # NO GOOD
  1547.      JP    Z,DONBD2        ;NO STRING
  1548.      CALL    OUTI        ;LOOP & SET BAUD
  1549.     .ENDIF    
  1550. BOTADR:    LD    HL,0000        ;GET BOOT ADDR
  1551. BOTVEC:    LD    DE,0000        ;BOOT VECTOR
  1552.     LD    (HL),E
  1553.     INC    HL
  1554.     LD    (HL),D        ;RESTORE IT
  1555. DONBD2:    JP    BOOT
  1556. ;
  1557. ;**********************************************
  1558. ;
  1559. ; 8080-Z80 SUPPORT ROUTINES
  1560. ;
  1561. ; DO Z80 'LDIR'
  1562. ;
  1563. LDIR:    PUSH    AF
  1564. ;
  1565. ; LOOP & TRANSFER
  1566. ;
  1567. LDIR1:    LD    A,C
  1568.     OR    B
  1569.     JP    Z,POPRET
  1570.     LD    A,(HL)
  1571.     LD    (DE),A
  1572.     DEC    BC
  1573.     INC    DE
  1574.     INC    HL
  1575.     JP    LDIR1
  1576. ;
  1577. ; DONE, RECOVER AF
  1578. ;
  1579. POPRET:    POP    AF
  1580.     RET    
  1581. ;
  1582. ;----------------------------------------------
  1583. ;
  1584. ; DO Z80 'OUTI'
  1585. ;
  1586. OUTI:    PUSH    AF
  1587. ;
  1588. OUTI1:    LD    A,(HL)        ;GET PORT ADDRESS
  1589.     LD    (OUTPRT),A    ;STORE IT
  1590.     INC    HL        ;TO COMMAND BYTE
  1591.     LD    A,(HL)        ;GET IT
  1592. OUTPRT    .EQUAL    $+1        ;PORT LOCATION
  1593.     OUT    (00),A        ;SEND IT
  1594.     INC    HL        ;NEXT PORT ADDR
  1595.     DEC    B        ;DONE ALL?
  1596.     JP    NZ,OUTI1        ;NO
  1597.     POP    AF
  1598.     RET    
  1599. ;
  1600. ;**********************************************
  1601. ;
  1602. ; MESSAGES
  1603. ;
  1604. HELLO:    .BYTE    00,'EPSNLINK by Community Business Systems'
  1605.     .BYTE    ' 12/23/84',00
  1606.     .BYTE    'A file transfer program to communicate with'
  1607.     .BYTE    ' the EPSON PX-8 and QX-10$'
  1608. ;
  1609.     .IFNZ    DOBAUD
  1610. STATMS:     .BYTE    0,0,'The RS-232C status is :$'
  1611. ;
  1612. BITMS1:     .BYTE    ' bit rate = 9600'
  1613.      .BYTE    '  data bits = 8'
  1614.      .BYTE    '  stop bits = 1$'
  1615. ;
  1616. BITMS2:     .BYTE    ' bit rate = 1200'
  1617.      .BYTE    '  data bits = 8'
  1618.      .BYTE    '  stop bits = 2',0,'$'
  1619.     .ENDIF    
  1620. ;
  1621. HLPMS1:    .BYTE    0,0,'Press  ESC to restart,'
  1622.     .BYTE    ' or CTRL/C to exit from EPSNLINK$'
  1623. SRMSG:    .BYTE    0,'Send or Receive  (S/R) ? $'
  1624. SNDRMS:    .BYTE    0,'Sender $'
  1625. RNRMSG:    .BYTE    0,'Receiver '
  1626. NRDYMS:    .BYTE    'is not ready.',0,'$'
  1627. ENTRMS:    .BYTE    0,'Enter file name    $'
  1628. DONMSG:    .BYTE    'Done',00,'eXit or Continue'
  1629.     .BYTE    ' (X/C) ? $'
  1630. NNAMSG:    .BYTE    0,'  No file name specified$'
  1631. NFILMS:    .BYTE    '  File not found$'
  1632. SNDMSG:    .BYTE    '       Sending $'
  1633. ABTMSG:    .BYTE    0,0,'  Aborted $'
  1634. DIRFMS:    .BYTE    0,'  Directory full$'
  1635. SPCMSG:    .BYTE    '           $'
  1636. RCVMSG:    .BYTE    '    Receiving $'
  1637. ARWMSG:    .BYTE    '  ==>  $'
  1638. OVWMSG:    .BYTE    0,'Overwrite (Y/N) ?  $'
  1639. DSKFMS:    .BYTE    0,'  Disk full$'
  1640. RENMSG:    .BYTE    0,'  Rename error$'
  1641. DELMSG:    .BYTE    0,'  Delete error$'
  1642. CLSMSG:    .BYTE    0,'  Close error$'
  1643. DSELMS:    .BYTE    0,'  Drive select error$'
  1644. BDFLMS:    .BYTE    0,'  Bad file descriptor$'
  1645. PNRMSG:    .BYTE    0,'RS-232C is not ready.',0,'$'
  1646. BSMSG:    .BYTE    ' ',BS,'$'
  1647. CRMSG:    .BYTE    0,'$'
  1648. FNTOUS:    .BYTE    00        ;00/NZ=USE SENT/REQ FN.T
  1649. ENTFLG:    .BYTE    00        ;CUR FN.T TO USE FLAG
  1650. USROPT:    .BYTE    00        ;USER OPTION: S/R
  1651. MORFLG:    .BYTE    00        ;00/NZ=NO/MORE FILES
  1652. OVWFLG:    .BYTE    00        ;00/NZ=NO/OVERWRITE
  1653. FILCNT:    .BYTE    00        ;# OF FILES TO SEND
  1654. FLNPTR:    .WORD    FLNLST        ;FILENAME LIST POINTER
  1655. ;
  1656. STACK    .EQUAL    (($+100H)/100H*100H)+64
  1657. ;
  1658. CURFNT    .EQUAL    STACK        ;'DRFILENAMTYP'...REQ FN.T
  1659. ;
  1660. SNDFCB    .EQUAL    CURFNT+12    ;SENDERS FN.T FCB
  1661. ;
  1662. FLNLST    .EQUAL    SNDFCB+36    ;LIST OF FILENAMES TO SEND
  1663.                 ;& FN.T INPUT BUFFER
  1664. ;
  1665.     .END
  1666. MSG:    .BYTE    0,0,'  Aborted $'
  1667. DIRFMS:    .BYTE    0,'  Directory full$'
  1668. SPCMSG:    .BYTE    '           $'
  1669. RCVMSG: