home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv066.ark / MODEM3.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  34KB  |  1,537 lines

  1. ;
  2. ;MODEM.ASM V2.0, BY WARD CHRISTENSEN
  3. ;    (revised 12/6/79)
  4. ;
  5. ;CP/M - CP/M FILE TRANSFER PROGRAM, AND
  6. ;TERMINAL PROGRAM.
  7. ;
  8. ;NOTE: THIS FILE WILL ASSEMBLE, WITHOUT NEED FOR
  9. ;EDITING, TO WORK WITH A PMMI MM-103 MODEM.  SEE
  10. ;EQUATES FOR OTHER OPTIONS INCLUDING SYSTEM CLOCK
  11. ;FREQUENCY.
  12. ;
  13. * * * * * * * * * * * * * * * * * * * * * * * * *
  14. *                        *
  15. *    THIS PROGRAM DOCUMENTED IN "MODEM.DOC"    *
  16. *                        *
  17. * * * * * * * * * * * * * * * * * * * * * * * * *
  18. * THIS PROGRAM WAS "MODEM.ASM" BUT IS         *
  19. * TEMPORARILY NAMED "MODEM2.ASM" SO PEOPLE    *
  20. * WILL REALIZE IT IS AN ENHANCEMENT OF        *
  21. * THE ORIGINAL PROGRAM "MODEM.ASM" ON CP/M    *
  22. * USER'S GROUP DISK 25.                *
  23. * * * * * * * * * * * * * * * * * * * * * * * * *
  24. ;
  25. ;PLEASE PASS ON MODS, BUGS, ETC, SO YOUR
  26. ;FIXES OR ENHANCEMENTS MAY BE SHARED BY ALL,
  27. ;         TO:
  28. ;    Ward Christensen
  29. ;    688 E. 154th St. #5D
  30. ;    Dolton, Il. 60419
  31. ;
  32. ;    (312) 849-6279
  33. ;
  34. ;You may send a self-addressed stamped postcard
  35. ;to be informed of changes/bugs as they become
  36. ;known.
  37. ;
  38. ;    --------------
  39. ;
  40. ;    09/23/77
  41. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  42. ;
  43. ;    04/26/79
  44. ;REWRITTEN BY WARD CHRISTENSEN TO COMBINE
  45. ;IMPROVEMENTS TO THE ORIGINAL MADE BY WARD
  46. ;AND BY KEITH PETERSEN, W8SDZ, AND SUGGESTIONS
  47. ;BY JIM BELL WHICH KEITH IMPLEMENTED.  SEE
  48. ;MODEM.DOC FOR ADDITIONAL HISTORICAL
  49. ;INFORMATION AND DOCUMENTATION.
  50. ;
  51. ;    05/09/79
  52. ;ALLOW 'T' AND 'E' SUB-OPTIONS TO GO TO TERMINAL
  53. ;OR ECHO MODEM AFTER TRANSFERRING A FILE.  (WLC)
  54. ;
  55. ;    05/22/79
  56. ;ADD FEATURE TO MAKE RECEIVE FILE ROUTINE SAY
  57. ;FILE SUCCESSFULLY OPENED, WHEN IN QUIET MODE.
  58. ;MOVE INITIAL GOBBLE GARBAGE INPUTS TO BEFORE
  59. ;COMMAND CPI'S SO ALL MODES ARE CLEARED. CHANGE
  60. ;INITIAL SEND WAIT TO 80 SECS TO ALLOW MORE TIME
  61. ;FOR RECEIVING END TO COME UP. ADD 'H' AFTER MSG
  62. ;THAT SHOWS NUMBER OF SECTORS IN EXTENT ABOUT TO
  63. ;BE SENT.  (KBP)
  64. ;
  65. ;    05/24/79
  66. ;FIX MISSING RETURN INSTRUCTION AT END OF
  67. ;INITIALIZATION ROUTINE.  (KBP)
  68. ;
  69. ;    07/01/79
  70. ;MODIFIED PROGRAM TO ALLOW FOR NON-STANDARD VERSIONS OF
  71. ;CP/M. ALL REFERENCES TO ENTRIES INTO CP/M SHOULD BE MADE
  72. ;RELATIVE TO THE VARIABLE SYMBOL CALL "BASE". FOR EXAMPLE,
  73. ;THE EQUATE TO BDOS SHOULD BE BASE+5 INSTEAD OF 5. BASE
  74. ;WILL BE SET TO 0 WHEN THE VARIABLE STDCPM IS SET TO TRUE.
  75. ;(BOB MATHIAS).
  76. ;
  77. ;    07/24/79
  78. ;MOVE INITIALIZE LOCAL STACK TO BEGINNING OF PROGRAM
  79. ;SO DEFAULT STACK IS NOT USED. ADD CONDITIONAL ASSEMBLY
  80. ;OPTION TO TERMINAL ROUTINE FOR TIMESHARE SYSTEMS.
  81. ;CORRECT ERROR IN LOCAL ABORT ROUTINE (WAS LOOKING FOR
  82. ;CONTROL E - NOW CORRECTLY LOOKS FOR CONTROL X). ADD
  83. ;REGISTER SAVES TO CONOUT, KEYIN AND AND KEYBOARD STATUS
  84. ;ROUTINES, AS SOME CBIOS ROUTINES CLOBBER THEM. (KBP)
  85. ;
  86. ;    08/05/79
  87. ;ADDED D. C. HAYES MODEM SUPPORT BY JIM BELL  (KBP)
  88. ;
  89. ;    08/06/79
  90. ;ADDED EQUATES FOR EXTERNAL MODEM (NOT S-100 PLUG-IN)
  91. ;(KBP)
  92. ;
  93. ;    12/06/79
  94. ;CORRECTED ERROR IN HELP FILE. SAID T.110, NOW SAYS
  95. ;TO.110. BY WARD CHRISTENSEN. CORRECTED RECEIVE FILE
  96. ;ROUTINE SO TERMINAL OR ECHO MODE WORKS AFTER FILE
  97. ;TRANSFER IN QUIET MODE. MOVED CHECKS FOR "H" AND
  98. ;"X" OPTIONS SO MODEM IS NOT REINITIALIZED. (KBP)
  99. ;
  100. ;    01/02/80
  101. ;THIS NOW WILL SUPPORT THE INTEL 8251 CHIP AS A INTERFACE
  102. ;TO THE MODEM. IT WILL DO ALL SET UP AND READY OF THE
  103. ;8251 BEFORE CONTACT AND IF THE MODEM IS ALREADY CON-
  104. ;NECTED TO A STATION IT WILL ASUME THAT THE CHIP IS READY.
  105. ;    THESE MODIFACATIONS MAKE IT COMPATABLE WITH THE 
  106. ;DIGITAL GROUP COMMUNICATIONS BOARD. (BILL NADZAM)
  107. ;
  108. ;
  109. STDCPM    EQU    1    ;TRUE, IS STANDARD CP/M
  110. H8CPM    EQU    0    ;TRUE, IS HEATH H8 CP/M
  111. ;
  112. BASE    EQU    0    ;CP/M BASE ADDRESS
  113. ;
  114. ;
  115. USART    EQU    1    ;TRUE,IS 8251 CHIP AS MODEM INTF.
  116. ;
  117. PMMI    EQU    0    ;TRUE, IS PMMI
  118. ;
  119. DCH    EQU    0    ;TRUE, IS D.C. HAYES
  120. ;
  121. ;IF YOU ARE USING AN EXTERNAL MODEM (NOT S-100 PLUG-IN)
  122. ;CHANGE THESE EQUATES FOR YOUR MODEM PORT REQUIREMENTS
  123. ;
  124. INITREQ EQU    1    ;TRUE,IF MODEM PORT INIT. REQ'D
  125. INITC1    EQU    4EH    ;FIRST INIT CHAR TO CTL PORT
  126. INITC2    EQU    27H    ;2ND INIT CHAR TO CTL PORT
  127. ;
  128. ;
  129. ERRLIM    EQU    10    ;MAX ALLOWABLE ERRORS
  130. EXITCHR    EQU    'E'-40H ;CTL-E EXIT FROM T OR C
  131. DISCCHR    EQU    'D'-40H    ;CTL-D DISCONNECTS MODEM T/C
  132. ;
  133. FASTCLK    EQU    0    ;PUT 1 HERE FOR 4 MHZ CLOCK
  134. ;
  135. ;SOME TIME-SHARE COMPUTERS REQUIRE TERMINALS TO
  136. ;HAVE BIT 7 HIGH (MARKING), SO IN THE TERMINAL
  137. ;MODE WE FORCE IT TO HIGH IF THE FOLLOWING OPTION
  138. ;IS SELECTED:
  139. ;
  140. TIMESHR    EQU    0    ;PUT 1 HERE TO MAKE BIT 7 HIGH
  141. ;
  142. ;
  143. ;DEFINE ASCII CHARACTERS USED
  144. ;
  145. SOH    EQU    1    ;START OF HEADER
  146. EOT    EQU    4    ;END OF TRANSMISSION
  147. ACK    EQU    6    ;ACKNOWLEDGE
  148. NAK    EQU    15H    ;NEG ACKNOWLEDGE
  149. CAN    EQU    18H    ;CANCEL
  150. LF    EQU    10    ;LINEFEED
  151. CR    EQU    13    ;CARRIAGE RETURN
  152.     ORG    BASE+100H
  153. ;
  154. ;INIT PRIVATE STACK
  155.     LXI    H,0    ;HL=0
  156.     DAD    SP    ;HL=STACK FROM CP/M
  157.     SHLD    STACK    ;..SAVE IT
  158.     LXI    SP,STACK ;SP=MY STACK
  159. ;
  160. ;
  161.     CALL    START    ;GO PRINT ID
  162.     DB    'MODEM PROGRAM as of '
  163.     DB    '01/04/80',CR,LF,'$'
  164. START    POP    D    ;GET ID MESSAGE
  165.     MVI    C,PRINT
  166.     CALL    BDOS    ;PRINT ID MESSAGE
  167. ;
  168. ;INITIALIZE THE JMPS TO CP/M BIOS
  169. ;
  170.     CALL    INITADR
  171. ;
  172.     LDA    FCB+1    ;GET PRIMARY OPTION
  173.     CPI    'H'    ;MODEM H(ELP)?
  174.     JZ    HELP    ;..YES, GIVE HELP
  175.     CPI    'X'    ;MODEM X(AMPLES)?
  176.     JZ    EXAM    ;GIVE EXAMPLES
  177. ;
  178. ;SAVE PRIMARY OPTION, VALIDATE SECONDARY OPT.
  179. ;
  180.     CALL    PROCOPT
  181. ;
  182. ;INIT THE MODEM OR SERIAL PORT
  183. ;
  184.     CALL    INITMOD
  185. ;
  186. ;MOVE THE FILENAME FROM FCB 2 TO FCB 1
  187. ;
  188.     CALL    MOVEFCB
  189. ;
  190. ;GOBBLE UP GARBAGE CHARS FROM THE LINE
  191. ;PRIOR TO RECEIVE OR SEND
  192. ;
  193. ;
  194. ;JMP TO APPROPRIATE FUNCTION
  195. ;
  196.     LDA    OPTION    ;GET PRIMARY OPTION
  197. ;
  198.     CPI    'C'    ;(COMPAT W/EARLIER
  199.     JZ    TRMECHO    ;OPTION "COMPUTER")
  200. ;
  201.     CPI    'E'    ;TERMINAL IN ECHO
  202.     JZ    TRMECHO    ;..MODE?
  203. ;
  204.     CPI    'T'    ;TERMINAL..
  205.     JZ    TERM    ;..MODE?
  206. ;
  207.     CPI    'D'
  208.     JZ    DISCONN
  209. ;
  210.            CPI    'S'    ;SEND..
  211.     JZ    SENDFIL    ;..A FILE?
  212. ;
  213.     CPI    'R'    ;RECEIVE..
  214.     JZ    RCVFIL    ;..A FILE?
  215. ;
  216. ;INVALID OPTION
  217. ;
  218.     JMP    BADOPT
  219.     org    base+4000h    ;modified for osbornese
  220. * * * * * * * * * * * * * * * * * * * * *
  221. *                    *
  222. *    TERM: TERMINAL MODE        *
  223. *                    *
  224. * * * * * * * * * * * * * * * * * * * * *
  225. ;
  226. ;THIS PROGRAM SIMPLY SENDS KEYED CHARACTERS
  227. ;DOWN THE LINE, AND DISPLAYS CHARACTERS
  228. ;RECEIVED FROM THE LINE.  THIS MAKES IT
  229. ;SUITABLE FOR COMMUNICATION WITH TIME SHARING
  230. ;COMPUTERS, CBBS'S, OR ANOTHER PROGRAM
  231. ;RUNING "MODEM E" (ECHO MODE)
  232. ;
  233. ;TYPE THE "EXITCHR" (ORIGINALLY CTL-E) TO EXIT.
  234. ;OR THE "DISCCHR" (ORIGINALLY CTL-D) TO DISCONN.
  235. ;
  236. ;A FUTURE ENHANCEMENT WILL BE TO WRITE THE
  237. ;RECEIVED DATA IN MEMORY, AND ALLOW IT TO
  238. ;BE WRITTEN TO DISK
  239. ;
  240. TERM    CALL    STAT    ;LOCAL CHAR KEYED?
  241.     JZ    TERML    ;..NO, CHECK LINE
  242.     CALL    KEYIN    ;GET CHAR
  243.     CPI    EXITCHR    ;TIME TO END?
  244.     JZ    CKDIS    ;YES, CK DISCONN
  245.     CPI    DISCCHR    ;DISCONNECT REQUEST?
  246.     JZ    DISCONN    ;YES, DO IT
  247.     call    acsend    ;send the char
  248. ;
  249. ;SEE IF CHAR FROM LINE
  250. ;
  251. terml:    di
  252.     out    0
  253.     mvi    a,0
  254.     sta    0ef08h
  255.     lda    2a00h
  256.     sta    xyz
  257.     out    1
  258.     mvi    a,1
  259.     sta    0ef08h
  260.     ei
  261.     lda    xyz
  262.     ani    01h
  263.     cpi    00h
  264.     jz    term
  265.     di
  266.     out    0
  267.     mvi    a,0
  268.     sta    0ef08h
  269.     lda    2a01h
  270.     sta    xyz
  271.     out    1
  272.     mvi    a,1
  273.     sta    0ef08h
  274.     ei
  275.     lda    xyz
  276.     ani    7fh
  277.     CALL    TYPE    ;TYPE IT
  278.     JMP    TERM    ;LOOP
  279. ;
  280. * * * * * * * * * * * * * * * * * * * * *
  281. *                    *
  282. *    TRMECHO: TERMINAL WITH ECHO    *
  283. *                    *
  284. * * * * * * * * * * * * * * * * * * * * *
  285. ;
  286. ;TERMINAL PROGRAM WITH ECHO - SEE NOTES
  287. ;UNDER "TERM" ABOVE
  288. ;
  289. ;C A U T I O N   DON'T RUN WITH BOTH COMPUTERS
  290. ;IN "ECHO" MODE - LINE ERRORS (OR ANY CHAR)
  291. ;WILL BE ECHOED BACK AND FORTH AD INFINITUM.
  292. ;
  293. trmecho: di
  294.     out    0
  295.     mvi    a,0
  296.     sta    0ef08h
  297.     lda    2a00h
  298.     sta    xyz
  299.     out    1
  300.     mvi    a,1
  301.     sta    0ef08h
  302.     ei
  303.     lda    xyz
  304.     ani    01h
  305.     cpi    00h
  306.     jnz    linechr
  307.     CALL    STAT    ;CHECK LOCAL KB
  308.     JZ    TRMECHO    ;..NO CHAR
  309.     CALL    KEYIN    ;GET LOCAL CHAR
  310.     CPI    EXITCHR    ;END?
  311.     JZ    CKDIS    ;YES, CK DISCONN, EXIT
  312.     CPI    DISCCHR    ;DISCONN?
  313.     JZ    DISCONN    ;..YES, DO IT.
  314.     di
  315.     sta    xyz
  316.     out    0
  317.     mvi    a,0
  318.     sta    0ef08h
  319.     lda    2a01h
  320.     out    1
  321.     mvi    a,1
  322.     sta    0ef08h
  323.     ei
  324.     CALL    TYPE    ;ECHO IT LOCALLY
  325.     JMP    TRMECHO    ;..AND LOOP
  326. ;
  327. ;GOT CHAR FROM LINE
  328. ;
  329. linechr:di
  330.     out    0
  331.     mvi    a,0
  332.     sta    0ef08h
  333.     lda    2a00h
  334.     sta    xyz
  335.     out    1
  336.     mvi    a,1
  337.     sta    0ef08h
  338.     ei
  339.     lda    xyz
  340.     ani    01h
  341.     cpi    00h
  342.     jz    linechr
  343.     di
  344.     out    0
  345.     mvi    a,0
  346.     sta    0ef08h
  347.     lda    2a01h
  348.     sta    xyz
  349.     lda    2a01h
  350.     out    1
  351.     mvi    a,1
  352.     sta    0ef08h
  353.     ei
  354.     lda    xyz
  355.     CALL    TYPE    ;TYPE IT
  356.     JMP    TRMECHO    ;LOOP
  357. ;
  358. * * * * * * * * * * * * * * * * * * * * *
  359. *                    *
  360. *    SENDFIL: SENDS A CP/M FILE    *
  361. *                    *
  362. * * * * * * * * * * * * * * * * * * * * *
  363. ;
  364. ;THE CP/M FILE SPECIFIED IN THE MODEM COMMAND
  365. ;IS TRANSFERRED OVER THE PHONE TO ANOTHER
  366. ;COMPUTER RUNNING MODEM WITH THE "R" (RECEIVE)
  367. ;OPTION.  THE DATA IS SENT ONE SECTOR AT A
  368. ;TIME WITH HEADERS AND CHECKSUMS, AND RE-
  369. ;TRANSMISSION ON ERRORS.  
  370. ;
  371. SENDFIL    CALL    OPENFIL    ;OPEN THE FILE
  372.     MVI    E,80    ;WAIT 80 SEC..
  373.     CALL    WAITNAK    ;..FOR INITIAL NAK
  374. SENDLP    CALL    RDSECT    ;READ A SECTOR
  375.     JC    SENDEOF    ;SEND EOF IF DONE
  376.     CALL    INCRSNO    ;BUMP SECTOR #
  377.     XRA    A    ;ZERO ERROR..
  378.     STA    ERRCT    ;..COUNT
  379. SENDRPT    CALL    SENDHDR    ;SEND A HEADER
  380.     CALL    SENDSEC    ;SEND DATA SECTOR
  381.     CALL    SENDCKS    ;SEND CKSUM
  382.     CALL    GETACK    ;GET THE ACK
  383.     JC    SENDRPT    ;REPEAT IF NO ACK
  384.     JMP    SENDLP    ;LOOP UNTIL EOF
  385. ;
  386. ;FILE SENT, SEND EOT'S
  387. ;
  388. SENDEOF    MVI    A,EOT    ;SEND..
  389.     CALL    SEND    ;..AN EOT
  390.     CALL    GETACK    ;GET THE ACK
  391.     JC    SENDEOF    ;LOOP IF NO ACK
  392.     JMP    DONE    ;ALL DONE
  393. ;
  394. * * * * * * * * * * * * * * * * * * * * *
  395. *                    *
  396. *    RCVFIL: RECEIVE A FILE        *
  397. *                    *
  398. * * * * * * * * * * * * * * * * * * * * *
  399. ;
  400. ;RECEIVES A FILE IN BLOCK FORMAT AS SENT
  401. ;BY ANOTHER PERSON DOING "MODEM S FN.FT".
  402. ;
  403. RCVFIL    CALL    ERASFIL    ;ERASE THE FILE
  404.     CALL    MAKEFIL    ;..THEN MAKE NEW
  405.     LDA    QFLG    ;SEE IF IN QUIET MODE
  406.     ORA    A
  407.     JNZ    RCVLP    ;NOT IN QUIET MODE, SKIP MSG
  408.     CALL    ILPRT    ;PRINT:
  409.     DB    'FILE OPEN, READY TO RECEIVE',CR,LF,0
  410. RCVLP    CALL    RCVSECT    ;GET A SECTOR
  411.     JC    RCVEOT    ;GOT EOT
  412.     CALL    WRSECT    ;WRITE THE SECTOR
  413.     CALL    INCRSNO    ;BUMP SECTOR #
  414.     CALL    SENDACK    ;ACK THE SECTOR
  415.     JMP    RCVLP    ;LOOP UNTIL EOF
  416. ;
  417. ;GOT EOT ON SECTOR - FLUSH BUFFERS, END
  418. ;
  419. RCVEOT    CALL    WRBLOCK    ;WRITE THE LAST BLOCK
  420.     CALL    SENDACK    ;ACK THE SECTOR
  421.     CALL    CLOSFIL    ;CLOSE THE FILE
  422.     JMP    DONE    ;ALL DONE
  423. ;
  424. * * * * * * * * * * * * * * * * * * * * *
  425. *                    *
  426. *        SUBROUTINES        *
  427. *                    *
  428. * * * * * * * * * * * * * * * * * * * * *
  429. ;
  430. ;
  431. ;---->    RCVSECT: RECEIVE A SECTOR
  432. ;
  433. ;RETURNS WITH CARRY SET IF EOT RECEIVED.
  434. ;
  435. RCVSECT    XRA    A    ;GET 0
  436.     STA    ERRCT    ;INIT ERROR COUNT
  437. RCVRPT    LDA    QFLG    ;QUIET?
  438.     ORA    A
  439.     JZ    RCVSQ    ;YES, NO STAT MSG.
  440.     CALL    ILPRT    ;PRINT:
  441.     DB    'AWAITING #',0
  442.     LDA    SECTNO    ;GET SECTOR #
  443.     INR    A    ;(REAL INR LATER)
  444.     CALL    HEXO    ;PRINT IN HEX
  445.     CALL    CRLF    ;..THEN CRLF
  446. ;
  447. RCVSQ    MVI    B,10    ;10 SEC TIMEOUT
  448.     CALL    RECV    ;GET SOH/EOT
  449.     JC    RCVSTOT    ;TIMEOUT
  450.     CPI    SOH    ;GET SOH?
  451.     JZ    RCVSOH    ;..YES
  452. ;
  453. ;EARLIER VERS. OF MODEM PROG SENT SOME NULLS -
  454. ;IGNORE THEM
  455. ;
  456.     ORA    A    ;00 FROM SPEED CHECK?
  457.     JZ    RCVSQ    ;YES, IGNORE IT
  458.     CPI    EOT    ;END OF TRANSFER?
  459.     STC        ;RETURN WITH CARRY..
  460.     RZ        ;..SET IF EOT
  461. ;
  462. ;DIDN'T GET SOH  OR EOT - 
  463. ;
  464.     MOV    B,A    ;SAVE CHAR
  465.     LDA    VSEEFLG    ;VIEWING..
  466.     ORA    A    ;..MODE?
  467.     JZ    RCVSEH    ;YES, PRT.MSG
  468.     LDA    QFLG    ;QUIET..
  469.     ORA    A    ;..MODE?
  470.     JZ    RCVSERR    ;YES, SKIP MSG
  471. RCVSEH    MOV    A,B    ;GET CHAR
  472.     CALL    HEXO    ;SHOW IN HEX
  473.     CALL    ILPRT    ;PRINT:
  474.     DB    'H RCD, NOT SOH',CR,LF,0
  475. ;
  476. ;DIDN'T GET VALID HEADER - PURGE THE LINE,
  477. ;THEN SEND NAK.
  478. ;
  479. RCVSERR    MVI    B,1    ;WAIT FOR 1 SEC..
  480.     CALL    RECV    ;..WITH NO CHARS
  481.     JNC    RCVSERR    ;LOOP UNTIL SENDER DONE
  482.     MVI    A,NAK    ;SEND..
  483.     CALL    SEND    ;..THE NAK
  484.     LDA    ERRCT    ;ABORT IF..
  485.     INR    A    ;..WE HAVE REACHED..
  486.     STA    ERRCT    ;..THE ERROR..
  487.     CPI    ERRLIM    ;..LIMIT?
  488.     JC    RCVRPT    ;..NO, TRY AGAIN
  489. ;
  490. ;10 ERRORS IN A ROW - 
  491. ;
  492.     LDA    VSEEFLG    ;VIEWING..
  493.     ORA    A    ;..FILE?
  494.     JZ    RCVCKQ    ;YES, ASK RETRY/QUIT
  495.     LDA    QFLG    ;QUIET..
  496.     ORA    A    ;..MODE?
  497.     JZ    RCVSABT    ;ABORT
  498. RCVCKQ    CALL    CKQUIT    ;RETRY/QUIT?
  499.     JZ    RCVSECT    ;TRY AGAIN
  500. ;
  501. RCVSABT    CALL    CLOSFIL    ;KEEP WHATEVER WE GOT
  502.     CALL    ERXIT
  503.     DB    '++UNABLE TO RECEIVE BLOCK'
  504.     DB    CR,LF,'++ABORTING++$'
  505. ;
  506. ;TIMEDOUT ON RECEIVE
  507. ;
  508. RCVSTOT    LDA    VSEEFLG    ;VIEWING..
  509.     ORA    A    ;..MODE?
  510.     JZ    RCVSPT    ;YES, PRT MSG
  511.     LDA    QFLG    ;QUIET..
  512.     ORA    A    ;..MODE?
  513.     JZ    RCVSERR    ;YES, NO MSG
  514. RCVSPT    CALL    ILPRT
  515.     DB    '++TIMEOUT++ ',0
  516. RCVPRN    LDA    ERRCT    ;PRINT ERROR..
  517.     CALL    HEXO    ;..COUNT
  518.     CALL    CRLF
  519.     JMP    RCVSERR    ;BUMP ERR CT, ETC.
  520. ;
  521. ;GOT SOH - GET BLOCK #, BLOCK # COMPLEMENTED
  522. ;
  523. RCVSOH    MVI    B,1    ;TIMEOUT = 1 SEC
  524.     CALL    RECV    ;GET SECTOR
  525.     JC    RCVSTOT    ;GOT TIMEOUT
  526.     MOV    D,A    ;D=BLK #
  527.     MVI    B,1    ;TIMEOUT = 1 SEC
  528.     CALL    RECV    ;GET CMA'D SECT #
  529.     JC    RCVSTOT    ;TIMEOUT
  530.     CMA        ;CALC COMPLEMENT
  531.     CMP    D    ;GOOD SECTOR #?
  532.     JZ    RCVDATA    ;YES, GET DATA
  533. ;
  534. ;GOT BAD SECTOR #
  535. ;
  536.     LDA    VSEEFLG    ;VIEWING..
  537.     ORA    A    ;..MODE?
  538.     JZ    RCVBSE    ;..YES, PRT MSG
  539.     LDA    QFLG    ;QUIET..
  540.     ORA    A    ;..MODE?
  541.     JZ    RCVSERR    ;..YES, NO MSG
  542. ;
  543. RCVBSE    CALL    ILPRT    ;PRINT:
  544.     DB    '++BAD SECTOR # IN HDR',CR,LF,0
  545.     JMP    RCVSERR    ;BUMP ERROR CT.
  546. ;
  547. RCVDATA    MOV    A,D    ;GET SECTOR #
  548.     STA    RCVSNO    ;SAVE IT
  549.     MVI    A,1    ;SHOW..
  550.     STA    DATAFLG    ;GETTING DATA
  551.     MVI    C,0    ;INIT CKSUM
  552.     LXI    H,BASE+80H    ;POINT TO BUFFER
  553. RCVCHR    MVI    B,1    ;1 SEC TIMEOUT
  554.     CALL    RECV    ;GET CHAR
  555.     JC    RCVSTOT    ;TIMEOUT
  556.     MOV    M,A    ;STORE CHAR
  557.     INR    L    ;DONE?
  558.     JNZ    RCVCHR    ;NO, LOOP
  559. ;
  560. ;VERIFY CHECKSUM
  561. ;
  562.     MOV    D,C    ;SAVE CHECKSUM
  563.     XRA    A    ;SHOW..
  564.     STA    DATAFLG    ;..END OF DATA
  565.     MVI    B,1    ;TIMEOUT LEN.
  566.     CALL    RECV    ;GET CHECKSUM
  567.     JC    RCVSTOT    ;TIMEOUT
  568.     CMP    D    ;CHECKSUM OK?
  569.     JNZ    RCVCERR    ;NO, ERROR
  570. ;
  571. ;GOT A SECTOR, IT'S A DUP IF = PREV,
  572. ;    OR OK IF = 1 + PREV SECTOR
  573. ;
  574.     LDA    RCVSNO    ;GET RECEIVED
  575.     MOV    B,A    ;SAVE IT
  576.     LDA    SECTNO    ;GET PREV
  577.     CMP    B    ;PREV REPEATED?
  578.     JZ    RECVACK    ;ACK TO CATCH UP
  579.     INR    A    ;CALC NEXT SECTOR #
  580.     CMP    B    ;MATCH?
  581.     JNZ    ABORT    ;NO MATCH - STOP SENDER, EXIT
  582.     RET        ;CARRY OFF - NO ERRORS
  583. ;
  584. ;GOT CKSUM
  585. ;
  586. RCVCERR    LDA    VSEEFLG    ;VIEWING..
  587.     ORA    A    ;..MODE?
  588.     JZ    RCVCPR    ;..YES, PRT MSG
  589.     LDA    QFLG    ;QUIET..
  590.     ORA    A    ;..MODE?
  591.     JZ    RCVSERR    ;YES, NO MSG
  592. RCVCPR    CALL    ILPRT
  593.     DB    '++CKSUM++ ',0
  594.     JMP    RCVPRN    ;PRINT ERROR #
  595. ;
  596. ;PREV SECT REPEATED, DUE TO THE LAST ACK
  597. ;BEING GARBAGED.  ACK IT SO SENDER WILL CATCH UP 
  598. ;
  599. RECVACK    CALL    SENDACK    ;SEND THE ACK,
  600.     JMP    RCVSECT    ;GET NEXT BLOCK
  601. ;
  602. ;SEND AN ACK FOR THE SECTOR
  603. ;
  604. SENDACK    MVI    A,ACK    ;GET ACK
  605.     CALL    SEND    ;..AND SEND IT
  606.     RET
  607. ;
  608. ;---->    SENDHDR: SEND THE SECTOR HEADER
  609. ;
  610. ;SEND: (SOH) (BLOCK #) (COMPLEMENTED BLOCK #)
  611. ;
  612. SENDHDR    LDA    QFLG    ;QUIET..
  613.     ORA    A    ;..MODE?
  614.     JZ    SENDHNM    ;YES, SKIP STATUS MSG.
  615.     CALL    ILPRT    ;PRINT:
  616.     DB    'SEND # ',0
  617.     LDA    SECTNO    ;PRINT..
  618.     CALL    HEXO    ;..SECT #
  619.     CALL    CRLF    ;..THEN CR/LF
  620. ;
  621. SENDHNM    MVI    A,SOH    ;SEND..
  622.     CALL    SEND    ;..SOH,
  623.     LDA    SECTNO    ;THEN SEND..
  624.     CALL    SEND    ;..SECTOR #
  625.     LDA    SECTNO    ;THEN SECTOR #
  626.     CMA        ;..COMPLEMENTED..
  627.     CALL    SEND    ;..SECTOR #
  628.     RET        ;FROM SENDHDR
  629. ;
  630. ;---->    SENDSEC: SEND THE DATA SECTOR
  631. ;
  632. ;WHILE SENDING THE SECTOR, THE "DATAFLG" IS SET
  633. ;SUCH THAT IF "V" (VIEW THE FILE) WAS REQUESTED,
  634. ;THE "SHOW" ROUTINE WILL PRINT THE DATA, BUT NOT
  635. ;THE HDR OR CKSUM, OR ANY NON-FATAL MSGS.
  636. ;
  637. SENDSEC    MVI    A,1    ;SHOW NOW AT DATA..
  638.     STA    DATAFLG    ;..FOR VIEW COMMAND
  639.     MVI    C,0    ;INIT CKSUM
  640.     LXI    H,BASE+80H    ;POINT TO BUFFER
  641. SENDC    MOV    A,M    ;GET A CHAR
  642.     CALL    SEND    ;SEND IT
  643.     INR    L    ;POINT TO NEXT CHAR
  644.     JNZ    SENDC    ;LOOP IF <100H
  645.     XRA    A    ;SHOW NOT INTO DATA..
  646.     STA    DATAFLG    ;..FOR VIEW COMMAND
  647.     RET        ;FROM SENDSEC
  648. ;
  649. ;---->    SENDCKS: SEND THE CHECKSUM
  650. ;
  651. SENDCKS    MOV    A,C    ;SEND THE..
  652.     CALL    SEND    ;..CHECKSUM
  653.     RET        ;FROM SENDCKS
  654. ;
  655. ;---->    GETACK: GET THE ACK ON THE SECTOR
  656. ;
  657. ;RETURNS WITH CARRY CLEAR IF ACK RECEIVED.
  658. ;IF AN ACK IS NOT RECEIVED, THE ERROR COUNT
  659. ;IS INCREMENTED, AND IF LESS THAN "ERRLIM",
  660. ;CARRY IS SET AND CONTROL RETURNS.  IF THE
  661. ;ERROR COUNT IS AT "ERRLIM", THE PROGRAM
  662. ;ABORTS IF IN "QUIET" MODE, OR ASKS THE
  663. ;USER FOR QUIT/RETRY IF NOT.
  664. ;
  665. GETACK    MVI    B,10    ;WAIT 10 SECONDS MAX
  666.     CALL    RECVDG    ;RECV W/GARBAGE COLLECT
  667.     JC    GETATOT    ;TIMED OUT
  668.     CPI    ACK    ;OK? (CARRY OFF IF =)
  669.     RZ        ;YES, RET FROM GETACK
  670.     MOV    B,A    ;SAVE CHAR
  671.     ANI    7FH    ;STRIP PARITY BIT
  672.     CPI    CAN    ;CANCEL TRANSMISSION?
  673.     JZ    ABORT    ;..YES
  674.     LDA    QFLG    ;QUIET..
  675.     ORA    A    ;..MODE?
  676.     JZ    ACKERR    ;..YES, NO MSG
  677.     MOV    A,B    ;GET CHAR
  678.     CALL    HEXO    ;PRINT IN HEX
  679.     CALL    ILPRT    ;PRINT:
  680.     DB    'H RCD, NOT ACK',CR,LF,0
  681. ;
  682. ;TIMEOUT OR ERROR ON ACK - BUMP ERROR COUNT
  683. ;
  684. ACKERR    LDA    ERRCT    ;GET COUNT
  685.     INR    A    ;BUMP IT
  686.     STA    ERRCT    ;SAVE BACK
  687.     CPI    ERRLIM    ;AT LIMIT?
  688.     RC        ;NOT AT LIMIT
  689. ;
  690. ;REACHED ERROR LIMIT
  691. ;
  692.     LDA    VSEEFLG    ;VIEWING..
  693.     ORA    A    ;..FILE?
  694.     JZ    GACKV    ;YES, ASK QUIT/RETRY
  695.     LDA    QFLG    ;QUIET..
  696.     ORA    A    ;..MODE?
  697.     JZ    CSABORT ;..YES, NO MSG
  698. GACKV    CALL    CKQUIT    ;SEE IF WANT TO QUIT
  699.     STC        ;TO SHOW NO ACK
  700.     RZ        ;KEEP ON TRYIN'
  701. CSABORT    CALL    ERXIT
  702.     DB    'CAN''T SEND SECTOR '
  703.     DB    '- ABORTING',CR,LF,'$'
  704. ;
  705. ;TIMEOUT GETTING ACK
  706. ;
  707. GETATOT    LDA    QFLG    ;QUIET..
  708.     ORA    A    ;..MODE?
  709.     JZ    ACKERR    ;YES, NO MSG
  710.     CALL    ILPRT    ;PRINT:
  711.     DB    'TIMEOUT ON ACK',CR,LF,0
  712.     JMP    ACKERR
  713. ;---->    CKABORT: CHECK FOR LOCAL ABORT
  714. ;
  715. ;IF THE USER WANTS TO CANCEL THE TRANSMISSION,
  716. ;TYPING CTL-X WILL ABORT IT.  NOTE THIS TEST
  717. ;IS NOT MADE IF IN QUIET (NO CONSOLE I/O) MODE.
  718. ;
  719. CKABORT    LDA    VSEEFLG    ;VIEWING?
  720.     ORA    A
  721.     JZ    CKABGO    ;YES, CHECK
  722.     LDA    QFLG    ;SUPPRESSED..
  723.     ORA    A    ;..CONSOLE I/O?
  724.     RZ        ;YES, NO TEST
  725. CKABGO    CALL    STAT    ;KEY PRESSED?
  726.     RZ        ;NOTHING FROM KEYBOARD
  727.     CALL    KEYIN    ;GET DATA
  728.     CPI    CAN    ;TIME TO END?
  729.     RNZ        ;NO, CONTINUE
  730. ABORT    LXI    SP,STACK
  731. ABORTL    MVI    B,1    ;1 SEC. W/O CHARS.
  732.     CALL    RECV
  733.     JNC    ABORTL    ;LOOP UNTIL SENDER DONE
  734.     MVI    A,CAN    ;CONTROL X
  735.     CALL    SEND    ;STOP SENDING END
  736. ABORTW    MVI    B,1    ;1 SEC W/O CHARS.
  737.     CALL    RECV
  738.     JNC    ABORTW    ;LOOP UNTIL SENDER DONE
  739.     MVI    A,' '    ;GET A SPACE...
  740.     CALL    SEND    ;TO CLEAR OUT CONTROL X
  741.     CALL    ILPRT    ;EXIT WITH ABORT MSG
  742.     DB    'MODEM PROGRAM CANCELLED',CR,LF,0
  743.     JMP    CKDIS    ;CHECK FOR DISCONN.
  744. ;
  745. ;---->    INCRSNO: INCREMENT SECTOR #
  746. ;
  747. INCRSNO    LDA    SECTNO    ;INCR..
  748.     INR    A    ;..SECT..
  749.     STA    SECTNO    ;..NUMBER
  750.     RET
  751. ;
  752. ;---->    ERASFIL: ERASE THE INCOMING FILE.
  753. ;
  754. ;IF IT EXISTS, ASK IF IT MAY BE ERASED.
  755. ;
  756. ERASFIL    LXI    D,FCB    ;POINT TO CTL BLOCK
  757.     MVI    C,SRCHF ;SEE IF IT..
  758.     CALL    BDOS    ;..EXISTS
  759.     INR    A    ;FOUND?
  760.     RZ        ;..NO, RETURN
  761.     CALL    ILPRT    ;PRINT:
  762.     DB    '++FILE EXISTS, TYPE Y TO ERASE: ',0
  763.     CALL    KEYIN    ;GET CHAR
  764.     PUSH    PSW
  765.     CALL    TYPE    ;ECHO
  766.     CALL    CRLF    ;BACK TO START OF LINE
  767.     POP    PSW
  768.     ANI    5FH    ;MAKE UPPER CASE
  769.     CPI    'Y'    ;WANT ERASED?
  770.     JNZ    CKDIS    ;QUIT IF NOT ERASE
  771. ;
  772. ;ERASE OLD FILE
  773. ;
  774.     LXI    D,FCB    ;POINT TO FCB
  775.     MVI    C,ERASE    ;GET BDOS FNC
  776.     CALL    BDOS    ;DO THE ERASE
  777.     RET        ;FROM "ERASFIL"
  778. ;
  779. ;---->    MAKEFIL: MAKES THE FILE TO BE RECEIVED
  780. ;
  781. MAKEFIL    LXI    D,FCB    ;POINT TO FCB
  782.     MVI    C,MAKE    ;GET BDOS FNC
  783.     CALL    BDOS    ;TO THE MAKE
  784.     INR    A    ;FF=BAD?
  785.     RNZ        ;OPEN OK
  786. ;DIRECTORY FULL - CAN'T MAKE FILE
  787.     CALL    ERXIT
  788.     DB    '++ERROR - CAN''T MAKE FILE',CR,LF
  789.     DB    '++DIRECTORY MUST BE FULL',CR,LF,'$'
  790. ;
  791. ;---->    OPENFIL: OPENS THE FILE TO BE SENT
  792. ;
  793. OPENFIL    LXI    D,FCB    ;POINT TO FILE
  794.     MVI    C,OPEN    ;GET FUNCTION
  795.     CALL    BDOS    ;OPEN IT
  796.     INR    A    ;OPEN OK?
  797.     JNZ    OPENOK    ;..YES
  798.     CALL    ERXIT    ;..NO, ABORT
  799.     DB    'CAN''T OPEN FILE$'
  800. ;
  801. OPENOK    CALL    ILPRT    ;PRINT:
  802.     DB    'FILE OPEN, EXTENT LENGTH: ',0
  803.     LDA    FCB+15    ;GET # SECTORS
  804.     CALL    HEXO    ;PRINT IN HEX
  805.     MVI    A,'H'
  806.     CALL    TYPE    ;PRINT 'H' AFTER NUMBER
  807.     CALL    CRLF    ;..THEN CRLF
  808.     RET
  809. ;
  810. ;---->    CLOSFIL: CLOSES THE RECEIVED FILE
  811. ;
  812. CLOSFIL    LXI    D,FCB    ;POINT TO FILE
  813.     MVI    C,CLOSE    ;GET FUNCTION
  814.     CALL    BDOS    ;CLOSE IT
  815.     INR    A    ;CLOSE OK?
  816.     RNZ        ;..YES, RETURN
  817.     CALL    ERXIT    ;..NO, ABORT
  818.     DB    'CAN''T CLOSE FILE$'
  819. ;
  820. ;---->    RDSECT: READS A SECTOR
  821. ;
  822. ;FOR SPEED, THIS ROUTINE BUFFERS UP 16
  823. ;SECTORS AT A TIME.
  824. ;
  825. RDSECT    LDA    SECINBF    ;GET # SECT IN BUFF.
  826.     DCR    A    ;DECREMENT..
  827.     STA    SECINBF    ;..IT
  828.     JM    RDBLOCK    ;EXHAUSTED?  NEED MORE.
  829.     LHLD    SECPTR    ;GET POINTER
  830.     LXI    D,BASE+80H    ;TO DATA
  831.     CALL    MOVE128    ;MOVE TO BUFFER
  832.     SHLD    SECPTR    ;SAVE BUFFER POINTER
  833.     RET        ;FROM "READSEC"
  834. ;
  835. ;BUFFER IS EMPTY - READ IN ANOTHER BLOCK OF 16
  836. ;
  837. RDBLOCK    LDA    EOFLG    ;GET EOF FLAG
  838.     CPI    1    ;IS IT SET/
  839.     STC        ;TO SHOW EOF
  840.     RZ        ;GOT EOF
  841.     MVI    C,0    ;SECTORS IN BLOCK
  842.     LXI    D,DBUF    ;TO DISK BUFFER
  843. RDSECLP    PUSH    B
  844.     PUSH    D
  845.     MVI    C,STDMA    ;SET DMA..
  846.     CALL    BDOS    ;..ADDR
  847.     LXI    D,FCB
  848.     MVI    C,READ
  849.     CALL    BDOS
  850.     POP    D
  851.     POP    B
  852.     ORA    A    ;READ OK?
  853.     JZ    RDSECOK    ;YES
  854.     DCR    A    ;EOF?
  855.     JZ    REOF    ;GOT EOF
  856. ;
  857. ;READ ERROR
  858. ;
  859.     CALL    ERXIT
  860.     DB    '++FILE READ ERROR$'
  861. ;
  862. RDSECOK    LXI    H,80H    ;ADD LENGTH OF ONE SECTOR...
  863.     DAD    D    ;...TO NEXT BUFF
  864.     XCHG        ;BUFF TO DE
  865.     INR    C    ;MORE SECTORS?
  866.     MOV    A,C    ;GET COUNT
  867.     CPI    16    ;DONE?
  868.     JZ    RDBFULL    ;..YES, BUFF IS FULL
  869.     JMP    RDSECLP    ;READ MORE
  870. ;
  871. REOF    MVI    A,1
  872.     STA    EOFLG    ;SET EOF FLAG
  873.     MOV    A,C
  874. ;
  875. ;BUFFER IS FULL, OR GOT EOF
  876. ;
  877. RDBFULL    STA    SECINBF    ;STORE SECTOR COUNT
  878.     LXI    H,DBUF    ;INIT BUFFER..
  879.     SHLD    SECPTR    ;..POINTER
  880.     LXI    D,BASE+80H    ;RESET..
  881.     MVI    C,STDMA    ;..DMA..
  882.     CALL    BDOS    ;..ADDR
  883.     JMP    RDSECT    ;PASS SECT TO CALLER
  884. ;
  885. ;---->    WRSECT: WRITE A SECTOR
  886. ;
  887. ;WRITES THE SECTOR INTO A BUFFER.  WHEN 16
  888. ;HAVE BEEN WRITTEN, WRITES THE BLOCK TO DISK.
  889. ;
  890. ;ENTRY POINT "WRBLOCK" FLUSHES THE BUFFER AT EOF.
  891. ;
  892. WRSECT    LHLD    SECPTR    ;GET BUFF ADDR
  893.     XCHG        ;TO DE FOR MOVE
  894.     LXI    H,BASE+80H    ;FROM HERE
  895.     CALL    MOVE128    ;MOVE TO BUFFER
  896.     XCHG        ;SAVE NEXT..
  897.     SHLD    SECPTR    ;..BLOCK POINTER
  898.     LDA    SECINBF    ;BUMP THE..
  899.     INR    A    ;..SECTOR #..
  900.     STA    SECINBF    ;..IN THE BUFF
  901.     CPI    16    ;HAVE WE 16?
  902.     RNZ        ;NO, RETURN
  903. ;
  904. ;---->    WRBLOCK: WRITES A BLOCK TO DISK
  905. ;
  906. WRBLOCK    LDA    SECINBF    ;# SECT IN BUFFER
  907.     ORA    A    ;0 MEANS END OF FILE
  908.     RZ        ;NONE TO WRITE
  909.     MOV    C,A    ;SAVE COUNT
  910.     LXI    D,DBUF    ;POINT TO DISK BUFF
  911. DKWRLP    PUSH    H
  912.     PUSH    D
  913.     PUSH    B
  914.     MVI    C,STDMA    ;SET DMA
  915.     CALL    BDOS    ;TO BUFFER
  916.     LXI    D,FCB    ;THEN WRITE
  917.     MVI    C,WRITE    ;..THE..
  918.     CALL    BDOS    ;..BLOCK
  919.     POP    B
  920.     POP    D
  921.     POP    H
  922.     ORA    A
  923.     JNZ    WRERR    ;OOPS, ERROR
  924.     LXI    H,80H    ;LENGTH OF 1 SECT
  925.     DAD    D    ;HL= NEXT BUFF
  926.     XCHG        ;TO DE FOR SETDMA
  927.     DCR    C    ;MORE SECTORS?
  928.     JNZ    DKWRLP    ;..YES, LOOP
  929.     XRA    A    ;GET A ZERO
  930.     STA    SECINBF    ;RESET # OF SECTORS
  931.     LXI    H,DBUF    ;RESET BUFFER..
  932.     SHLD    SECPTR    ;..POINTER
  933. RSDMA    LXI    D,BASE+80H ;RESET..
  934.     MVI    C,STDMA    ;..DMA..
  935.     CALL    BDOS    ;..ADDR
  936.     RET
  937. ;
  938. WRERR    CALL    RSDMA    ;RESET DMA TO NORM.
  939.     MVI    C,CAN    ;CANCEL..
  940.     CALL    SEND    ;..SENDER
  941.     CALL    ERXIT    ;EXIT W/MSG:
  942.     DB    '++ERROR WRITING FILE',CR,LF,'$'
  943. ;
  944. ;---->    RECV: RECEIVE A CHARACTER
  945. ;
  946. ;TIMEOUT TIME IS IN B, IN SECONDS.  ENTRY VIA
  947. ;"RECVDG" DELETES GARBAGE CHARACTERS ON THE
  948. ;LINE.  FOR EXAMPLE, HAVING JUST SENT A SECTOR,
  949. ;CALLING RECVDG WILL DELETE ANY LINE-NOISE-INDUCED
  950. ;CHARACTERS "LONG" BEFORE THE ACK/NAK WOULD
  951. ;BE RECEIVED.
  952. ;
  953. RECVDG    EQU    $    ;RECEIVE W/GARBAGE DELETE
  954. ;
  955. RECV    PUSH    D    ;SAVE
  956. ;
  957. ;
  958. MSEC    LXI    D,50000    ;1 SEC DCR COUNT
  959.     CALL    CKABORT    ;CHECK FOR EXIT REQUEST
  960. mwti:    di
  961.     out    0
  962.     mvi    a,0
  963.     sta    0ef08h
  964.     lda    2a00h
  965.     sta    xyz
  966.     out    1
  967.     mvi    a,1
  968.     sta    0ef08h
  969.     ei
  970.     lda    xyz
  971.     ani    01h
  972.     cpi    00h
  973.     jnz    mchar
  974.     DCR    E    ;COUNT..
  975.     JNZ    MWTI    ;..DOWN..
  976.     DCR    D    ;..FOR..
  977.     JNZ    MWTI    ;..TIMEOUT
  978.     DCR    B    ;MORE SECONDS?
  979.     JNZ    MSEC    ;YES, WAIT
  980. ;
  981. ;MODEM TIMED OUT RECEIVING
  982. ;
  983.     POP    D    ;RESTORE D,E
  984.     STC        ;CARRY SHOWS TIMEOUT
  985.     RET
  986. ;
  987. ;GOT CHAR FROM MODEM
  988. ;
  989. mchar:    di
  990.     out    0
  991.     mvi    a,0
  992.     sta    0ef08h
  993.     lda    2a01h
  994.     sta    xyz    
  995.     out    1
  996.     mvi    a,1
  997.     sta    0ef08h
  998.     ei
  999.     lda    xyz
  1000.     POP    D    ;RESTORE DE
  1001. ;
  1002. ;CALC CHECKSUM
  1003. ;
  1004.     PUSH    PSW    ;SAVE THE CHAR
  1005.     ADD    C    ;ADD TO CHECKSUM
  1006.     MOV    C,A    ;SAVE CHECKSUM
  1007. ;
  1008. ;CHECK IF MONITORING REC'D DATA
  1009. ;
  1010.     LDA    RSEEFLG    ;SEE RECEIVED..
  1011.     ORA    A    ;..DATA?
  1012.     JZ    MONIN    ;..YES
  1013. ;
  1014. ;CHECK IF "VIEWING" AND THIS IS A DATA CHAR
  1015. ;
  1016.     LDA    VSEEFLG    ;VIEWING..
  1017.     ORA    A    ;..DATA?
  1018.     JNZ    NOMONIN    ;..NO
  1019. ;
  1020. ;"VIEW" REQUESTED.  SHOW THE CHAR IT IS DATA
  1021. ;
  1022.     LDA    DATAFLG    ;GET DATA FLAG
  1023.     ORA    A    ;TEST IT
  1024.     JZ    NOMONIN    ;..OFF, NOT DATA
  1025. MONIN    POP    PSW    ;..IS DATA,
  1026.     PUSH    PSW    ;GET IT,
  1027.     CALL    SHOW    ;..AND SHOW IT
  1028. NOMONIN    POP    PSW    ;RESTORE CHAR
  1029.     ORA    A    ;CARRY OFF: NO ERROR
  1030.     RET        ;FROM "RECV"
  1031. ;
  1032. ;---->    SEND: SEND A CHARACTER TO THE MODEM
  1033. ;
  1034. SEND    PUSH    PSW    ;SAVE THE CHAR
  1035. ;
  1036. ;CHECK IF MONITORING SENT DATA
  1037. ;
  1038.     LDA    SSEEFLG    ;CHECK IF MONITORING..
  1039.     ORA    A    ;..SENT DATA
  1040.     JZ    MONOUT    ;..YES
  1041. ;
  1042. ;CHECK IF "VIEWING" THE FILE
  1043. ;
  1044.     LDA    VSEEFLG    ;GET VIEW FLAG
  1045.     ORA    A    ;TEST IT
  1046.     JNZ    NOMONOT    ;NO
  1047.     LDA    DATAFLG    ;IS THIS
  1048.     ORA    A    ;..DATA?
  1049.     JZ    NOMONOT    ;..NO.
  1050. MONOUT    POP    PSW    ;GET THE CHAR
  1051.     PUSH    PSW    ;SAVE IT
  1052.     CALL    SHOW    ;SHOW IT
  1053. NOMONOT    POP    PSW    ;RESTORE CHAR
  1054.     PUSH    PSW    ;SAVE IT
  1055.     ADD    C    ;CALC CKSUM
  1056.     MOV    C,A    ;SAVE CKSUM
  1057. sendw:    di
  1058.     out    0    
  1059.     mvi    a,0
  1060.     sta    0ef08h
  1061.     lda    2a00h
  1062.     sta    xyz
  1063.     out    1
  1064.     mvi    a,1
  1065.     sta    0ef08h
  1066.     ei
  1067.     lda    xyz
  1068.     ani    02h
  1069.     cpi    00h
  1070.     jz    sendw
  1071.     POP    PSW    ;GET CHAR
  1072. acsend:    sta    xyz
  1073.     di
  1074.     out    0
  1075.     mvi    a,0
  1076.     sta    0ef08h
  1077.     lda    xyz
  1078.     sta    2a01h
  1079.     out    1
  1080.     mvi    a,1
  1081.     sta    0ef08h
  1082.     ei
  1083.     RET        ;FROM "SEND"
  1084. ;
  1085. ;---->    WAITNAK: WAITS FOR INITIAL NAK
  1086. ;
  1087. ;TO ENSURE NO DATA IS SENT UNTIL THE RECEIVING
  1088. ;PROGRAM IS READY, THIS ROUTINE WAITS FOR THE
  1089. ;THE FIRST TIMEOUT-NAK FROM THE RECEIVER.
  1090. ;(E) CONTAINS THE # OF SECONDS TO WAIT.
  1091. ;
  1092. WAITNAK    LDA    VSEEFLG    ;VIEWING?
  1093.     ORA    A
  1094.     JZ    WAITNPR    ;PRINT MSG
  1095.     LDA    QFLG    ;QUIET..
  1096.     ORA    A    ;..MODE?
  1097.     JZ    WAITNLP    ;YES, SKIP MSG
  1098. WAITNPR    CALL    ILPRT    ;PRINT:
  1099.     DB    'AWAITING INITIAL NAK',CR,LF,0
  1100. WAITNLP    CALL    CKABORT    ;ABORT IF LOCAL CTL-X
  1101.     MVI    B,1    ;TIMEOUT DELAY
  1102.     CALL    RECV    ;DID WE GET..
  1103.     CPI    NAK    ;..A NAK?
  1104.     RZ        ;YES, SEND BLOCK
  1105.     ANI    7FH    ;STRIP PARITY BIT
  1106.     CPI    CAN    ;CTL-X FROM REMOTE?
  1107.     JZ    ABORT    ;..YES, ABORT
  1108.     DCR    E    ;80 TRIES?
  1109.     JZ    ABORT    ;YES, ABORT
  1110.     JMP    WAITNLP    ;NO, LOOP
  1111. ;
  1112. ;---->    INITADR: INIT'S CP/M BDOS ADDRESSES
  1113. ;
  1114. ;THIS ROUTINE FILLS IN THE ADDRESSES OF VARIOUS
  1115. ;JMP AND CALL INSTRUCTIONS, SO THAT CP/M BDOS
  1116. ;IS BYPASSED WHILE ACCESSING THE CONSOLE.  THIS
  1117. ;IS DONE TO ALLOW CHARACTERS SUCH AS CONTROL-C
  1118. ;AND CONTROL-S TO BE KEYED WHILE IN TERMINAL
  1119. ;MODE, WITHOUT CP/M INTERPRETING THEM.
  1120. ;
  1121. INITADR    LHLD    BASE+1    ;GET WARM BOOT ADDR
  1122.     LXI    D,3    ;LENGTH OF A 'JMP'
  1123.     DAD    D    ;TO CONSOLE STAT
  1124.     SHLD    VSTAT+1    ;MODIFY CALL
  1125.     DAD    D    ;TO CONSOLE IN
  1126.     SHLD    VKEYIN+1 ;MODIFY CALL
  1127.     DAD    D    ;TO CONSOLE OUT
  1128.     SHLD    VTYPE+1    ;MODIFY CALL
  1129.     RET
  1130. ;
  1131. ;---->    PROCOPT: PROCESS COMMAND OPTIONS
  1132. ;1) SAVES THE PRIMARY OPTION IN 'OPTION';
  1133. ;2) SCANS THE SUB-OPTION CHARACTERS, AND FOR
  1134. ;EACH FOUND, ZEROS THE APPROPRIATE ENTRY IN
  1135. ;THE OPTION TABLE.  FOR EXAMPLE, IF 'D' IS 
  1136. ;CODED (DISCONNECT) THEN THE 'D' STORED AT
  1137. ;'DISCFLG' IS SET TO 0 SO IT CAN BE TESTED
  1138. ;LATER.
  1139. ;
  1140. PROCOPT    LXI    D,FCB+1    ;TO PRIMARY OPT.
  1141.     LDAX    D    ;GET PRIMARY
  1142.     STA    OPTION    ;SAVE IT
  1143. ;
  1144. OPTLP    INX    D    ;TO SECONDARY OPTION
  1145.     LDAX    D    ;GET CHAR
  1146. ;
  1147. ;IF YOU MOD THIS PROGRAM FOR >7 OPTIONS,
  1148. ;YOU MUST CHANGE THE FOLLOWING, SINCE
  1149. ;THERE WON'T BE A ' ' AFTER THE OPTION
  1150. ;IF A BAUD RATE WAS SPECIFIED.
  1151. ;
  1152.     CPI    ' '    ;NO MORE OPT'NS?
  1153.     JZ    ENDOPT    ;..YES
  1154. ;SET THE APPROP. OPT: STORE 0 IN IT
  1155.     LXI    H,OPTBL    ;HL = ADDR OF 'OAQDSRV'
  1156.     MVI    B,OPTBE-OPTBL ;OPT TABLE LEN
  1157. OPTCK    CMP    M    ;FOUND THE OPTION?
  1158.     JNZ    OPTNO    ;NO, DON'T SET IT
  1159.     MVI    M,0    ;SET THE OPTION
  1160.     JMP    OPTLP    ;GET NEXT OPTION
  1161. OPTNO    INX    H    ;TO NEXT
  1162.     DCR    B    ;MORE?
  1163.     JNZ    OPTCK
  1164. ;OPTION NOT IN TABLE
  1165.     JMP    BADOPT    ;SHOW BAD SUB OPTION
  1166. ;
  1167. ;IF "VIEW" WAS ASKED FOR, SET QUIET FLAG
  1168. ;
  1169. ENDOPT    LDA    VSEEFLG    ;VIEW..
  1170.     ORA    A    ;..ASKED FOR?
  1171.     RNZ        ;..NO, RET FROM 'PROCOPT'
  1172.     STA    QFLG    ;YES, NO HDR/CKSUM PRT
  1173.     RET        ;FROM 'PROCOPT'
  1174. ;
  1175. ;DONE - CLOSE UP SHOP
  1176. ;
  1177. DONE    LDA    VSEEFLG    ;VIEWING?
  1178.     ORA    A
  1179.     JZ    DONETC    ;SHOW MSG
  1180.     LDA    QFLG    ;QUIET
  1181.     ORA    A    ;..MODE?
  1182.     JZ    DONECTE    ;YES, CK TERM/ECHO
  1183. DONETC    CALL    ILPRT
  1184.     DB    CR,LF,'TRANSFER COMPLETE' 
  1185.     DB    CR,LF,0
  1186. ;
  1187. ;CHECK IF TERMINAL OR ECHO SUB COMMAND
  1188. ;WAS SPECIFIED
  1189. ;
  1190. DONECTE    LDA    TERMFLG    ;TERM?
  1191.     ORA    A
  1192.     JZ    TERM    ;..YES
  1193.     LDA    ECHOFLG    ;ECHO?
  1194.     ORA    A
  1195.     JZ    TRMECHO    ;..YES
  1196. ;
  1197. ;FALL INTO 'CKDIS'
  1198. ;
  1199. ;---->    CKDIS: CHECK IF DISCONNECT REQUESTED
  1200. ;
  1201. ;THIS ROUTINE IS JUMPED TO AT THE END OF
  1202. ;PROCESSING, AND DISCONNECTS THE PHONE IF
  1203. ;'D' WAS SPECIFIED AS A SUB-OPTION.
  1204. ;
  1205. CKDIS    LDA    DISCFLG    ;CHECK 'D' FLAG
  1206. disconn:    nop
  1207.     JMP    EXIT
  1208. ;
  1209. ;NO DISCONNECT, TYPE MSG AS REMINDER THAT PHONE'S
  1210. ;OFF HOOK
  1211. ;
  1212. ;
  1213. ;---->    INITMOD: INITIALIZES THE MODEM
  1214. ;
  1215. ;THIS ROUTINE IS USED TO INITIALIZE SERIAL
  1216. ;BOARDS, OR SETUP S-100 MODEM BOARDS.
  1217. ;JUST RETURNS IF NO INITIALIZATION REQUIRED.
  1218. ;
  1219. INITMOD:
  1220. ;
  1221. ;
  1222.     RET        ;**THIS MUST BE HERE**
  1223. ;
  1224. ;---->    MOVEFCB: MOVES FCB(2) TO FCB
  1225. ;
  1226. ;I ATTEMPTED TO MAKE THE MODEM COMMAND 'NATURAL',
  1227. ;I.E. MODEM SEND FILENAME (MODEM S FN.FT) RATHER
  1228. ;THAT MODEM FILENAME SEND (MODEM FN.FT S) SO THIS
  1229. ;ROUTINE MOVES THE FILENAME FROM THE SECOND FCB
  1230. ;TO THE FIRST
  1231. ;
  1232. MOVEFCB    LXI    H,FCB+16 ;FROM
  1233.     LXI    D,FCB    ;TO
  1234.     MVI    B,16    ;LEN
  1235.     CALL    MOVE    ;DO THE MOVE
  1236.     XRA    A    ;GET 0
  1237.     STA    FCBSNO    ;ZERO SECTOR #
  1238.     STA    FCBEXT    ;..AND EXTENT
  1239.     RET
  1240. ;
  1241. ;---->    SHOW: SHOWS CHAR SENT/RECEIVED
  1242. ;
  1243. ;CR, LF, AND TAB ARE SHOWN.  ALL OTHER
  1244. ;NON-PRINTABLE CHARACTERS ARE SHOWN IN
  1245. ;HEX AS (XX)
  1246. ;
  1247. SHOW    CPI    LF    ;LF?
  1248.     JZ    CTYPE    ;..YES, TYPE IT
  1249.     CPI    CR    ;CR?
  1250.     JZ    CTYPE    ;..YES, TYPE IT
  1251.     CPI    09    ;TAB
  1252.     JZ    CTYPE    ;..YES, TYPE IT
  1253.     CPI    ' '    ;CTL-CHR?
  1254.     JC    SHOWHEX    ;YES, SHOW IN HEX
  1255.     CPI    7FH    ;DEL?
  1256.     JC    CTYPE    ;NO, TYPE THE CHAR
  1257. SHOWHEX    PUSH    PSW    ;SAVE THE CHAR
  1258.     MVI    A,'('    ;TYPE..
  1259.     CALL    CTYPE    ;..'('
  1260.     POP    PSW    ;THEN..
  1261.     CALL    HEXO    ;..THE CHAR
  1262.     MVI    A,')'    ;THEN..
  1263.     JMP    CTYPE    ;..')' AND RETURN.
  1264. ;
  1265. ;---->    CTYPE: TYPES VIA CP/M SO TABS ARE EXPANDED
  1266. ;
  1267. CTYPE    PUSH    B    ;SAVE..
  1268.     PUSH    D    ;..ALL..
  1269.     PUSH    H    ;..REGS
  1270.     MOV    E,A    ;CHAR TO E
  1271.     MVI    C,WRCON    ;GET BDOS FNC
  1272.     CALL    BDOS    ;PRIN THE CHR
  1273.     POP    H    ;RESTORE..
  1274.     POP    D    ;..ALL..
  1275.     POP    B    ;..REGS
  1276.     RET        ;FROM "CTYPE"
  1277. ;
  1278. CRLF    MVI    A,CR
  1279.     CALL    TYPE
  1280.     MVI    A,LF
  1281. ;
  1282. ;---->    TYPE: TYPE VIA DIRECT CBIOS ACCESS
  1283. ;WE ASSUME CBIOS MAY DESTROY SOME REGISTERS,
  1284. ;SO SAVE THEM ALL.
  1285. ;
  1286. ;THIS ROUTINE BYPASSES CP/M'S CTL-S, CTL-C
  1287. ;TESTS.
  1288. ;
  1289. TYPE    PUSH    PSW    ;SAVE CHAR
  1290.     PUSH    B    ;AND OTHER REGISTERS
  1291.     PUSH    D
  1292.     PUSH    H
  1293.     MOV    C,A    ;FOR BIOS
  1294. VTYPE    CALL    $-$    ;MODIFIED AT INIT
  1295.     POP    H    ;RESTORE REGISTERS
  1296.     POP    D
  1297.     POP    B
  1298.     POP    PSW    ;..AND CHAR
  1299.     RET        ;FROM "TYPE"
  1300. ;
  1301. ;---->  STAT: KEYBOARD STATUS
  1302. ;
  1303. ;SAVE ALL REGISTERS, EXCEPT A, IN CASE
  1304. ;CBIOS CLOBBERS THEM.
  1305. ;
  1306. STAT    PUSH    B
  1307.     PUSH    D
  1308.     PUSH    H
  1309. VSTAT    CALL    $-$    ;ADDR SET AT INIT
  1310.     POP    H
  1311.     POP    D
  1312.     POP    B
  1313.     ORA    A    ;0 => NOT READY
  1314.     RET
  1315. ;
  1316. ;---->  KEYIN: KEYBOARD INPUT
  1317. ;
  1318. ;SAVE ALL REGISTERS, EXCEPT A, IN CASE
  1319. ;CBIOS CLOBBERS THEM.
  1320. ;
  1321. KEYIN    PUSH    B
  1322.     PUSH    D
  1323.     PUSH    H
  1324. VKEYIN    CALL    $-$    ;ADDR SET AT INIT
  1325.     POP    H
  1326.     POP    D
  1327.     POP    B
  1328.     ANI    7FH    ;STRIP PARITY IF THERE
  1329.     RET        ;FROM KEYIN
  1330. ;
  1331. ;---->  HEXO: HEX OUTPUT
  1332. ;
  1333. HEXO    PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  1334.     RAR        ;RIGHT..
  1335.     RAR        ;..JUSTIFY..
  1336.     RAR        ;..LEFT..
  1337.     RAR        ;..DIGIT..
  1338.     CALL    NIBBL    ;PRINT LEFT DIGIT
  1339.     POP    PSW    ;RESTORE RIGHT
  1340. NIBBL    ANI    0FH    ;ISOLATE DIGIT
  1341.     CPI    10    ;IS IS <10?
  1342.     JC    ISNUM    ;YES, NOT ALPHA
  1343.     ADI    7    ;ADD ALPHA BIAS
  1344. ISNUM    ADI    '0'    ;MAKE PRINTABLE
  1345.     JMP    TYPE    ;..THEN TYPE IT
  1346. ;
  1347. ;---->    CKQUIT: QUIT/RETRY AFTER MULTIPLE ERRS.
  1348. ;
  1349. ;RETURNS W/ ZERO SET IF "RETRY" ASKED FOR
  1350. ;
  1351. CKQUIT    XRA    A    ;ZERO..
  1352.     STA    ERRCT    ;..ERROR COUNT
  1353.     CALL    ILPRT    ;PRINT:
  1354.     DB    'MULTIPLE ERRORS ENCOUNTERED.  '
  1355.     DB    'TYPE Q TO QUIT, R TO RETRY: ',0
  1356.     CALL    KEYIN    ;QUIT/RETRY
  1357.     PUSH    PSW
  1358.     CALL    TYPE
  1359.     CALL    CRLF
  1360.     POP    PSW
  1361.     ANI    5FH    ;MAKE UPPER CASE
  1362.     CPI    'R'    ;RETRY?
  1363.     RZ        ;'KEEP ON TRUCKIN'
  1364.     CPI    'Q'    ;QUIT?
  1365.     JNZ    CKQUIT    ;NO, ASK AGAIN
  1366.     ORA    A    ;SET NON-ZERO
  1367.     RET
  1368. ;
  1369. ;---->    ILPRT: INLINE PRINT OF MSG
  1370. ;
  1371. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  1372. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  1373. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  1374. ;
  1375. ILPRT    XTHL        ;SAVE HL, GET HL=MSG
  1376. ILPLP    MOV    A,M    ;GET CHAR
  1377.     ORA    A    ;END OF MSG?
  1378.     JZ    ILPRET    ;..YES, RETURN
  1379.     CPI    1    ;PAUSE?
  1380.     JZ    ILPAUSE    ;..YES
  1381.     CALL    CTYPE    ;TYPE THE MSG
  1382. ILPNEXT    INX    H    ;TO NEXT CHAR
  1383.     JMP    ILPLP    ;LOOP
  1384. ;
  1385. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  1386. ;    SCROLL OFF OF VIDEO SCREENS
  1387. ;
  1388. ILPAUSE    CALL    ILPRT    ;PRINT:
  1389.     DB    CR,LF,'PRESS RETURN TO CONTINUE'
  1390.     DB    CR,LF,0
  1391.     CALL    KEYIN    ;GET ANY CHAR
  1392.     CPI    'C'-40H    ;REBOOT?
  1393.     JZ    EXIT    ;YES.
  1394.     JMP    ILPNEXT    ;LOOP
  1395. ;
  1396. ILPRET    XTHL        ;RESTORE HL
  1397.     RET        ;PAST MSG
  1398. ;
  1399. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  1400. ;
  1401. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  1402. ;NO REGISTERS SAVED.
  1403. ;
  1404. PRTMSG    MVI    C,PRINT    ;GET BDOS FNC
  1405.     JMP    BDOS    ;PRINT MESSAGE, RETURN
  1406. ;
  1407. ;---->    ERXIT: EXIT PRINTING MSG FOLLOWING CALL
  1408. ;
  1409. ERXIT    POP    D    ;GET MESSAGE
  1410.     CALL    PRTMSG    ;PRINT IT
  1411.     CALL    CKDIS    ;DISCONNECT?
  1412. ;
  1413. EXIT    LHLD    STACK    ;GET ORIGINAL STACK
  1414.     SPHL        ;RESTORE IT
  1415.     RET        ;--EXIT-- TO CP/M
  1416. ;
  1417. ;MOVE 128 CHARACTERS
  1418. ;
  1419. MOVE128    MVI    B,128    ;SET MOVE COUNT
  1420. ;
  1421. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  1422. ;
  1423. MOVE    MOV    A,M    ;GET A CHAR
  1424.     STAX    D    ;STORE IT
  1425.     INX    H    ;TO NEXT "FROM"
  1426.     INX    D    ;TO NEXT "TO"
  1427.     DCR    B    ;MORE?
  1428.     JNZ    MOVE    ;..YES, LOOP
  1429.     RET        ;..NO, RETURN
  1430. ;    ----------------
  1431. OPTION    DB    0    ;PRIMARY OPTION
  1432. ;
  1433. ;DATAFLG IS USED BY THE "V" SUBCOMMAND -
  1434. ;IT IS 0 WHEN A HEADER OR CKSUM IS BEING
  1435. ;SENT/RCD, AND 1 IF "VIEWABLE" DATA (THE
  1436. ;SECTOR ITSELF) IS
  1437. ;
  1438. DATAFLG    DB    0    ;AT HEADER, FIRST
  1439. ;
  1440. ;
  1441. ;SUB-OPTION TABLE.  IF AN OPTION IS IN EFFECT,
  1442. ;    THE CHARACTER IS SET TO BINARY 0
  1443. ;
  1444. OPTBL    EQU    $
  1445. ANSWFLG    DB    'A'    ;ANSWER MODE
  1446. DISCFLG    DB    'D'    ;DISCONNECT WHEN DONE
  1447. ECHOFLG    DB    'E'    ;TO ECHO AFTER XFER
  1448. ORIGFLG    DB    'O'    ;ORIGINATE MODE
  1449. QFLG    DB    'Q'    ;QUIET TRANSFER (NO MSGS)
  1450. RSEEFLG    DB    'R'    ;SEE WHAT'S RECEIVED
  1451. SSEEFLG    DB    'S'    ;SEE WHAT'S SENT
  1452. TERMFLG    DB    'T'    ;TO TERM AFTER XFER
  1453. VSEEFLG    DB    'V'    ;VIEW MESSAGES (NO HDR, ETC)
  1454. OPTBE    EQU    $    ;END OF OPTIONS
  1455. ;
  1456. RCVSNO    DB    0    ;SECT # RECEIVED
  1457. SECTNO    DB    0    ;CURRENT SECTOR NUMBER 
  1458. ERRCT    DB    0    ;ERROR COUNT
  1459. HOLDD    DB    86H    ;HOLD AREA - LAST DC HAYES CONT CHAR.
  1460. ;FOLLOWING 3 USED BY DISK BUFFERING ROUTINES
  1461. xyz    db    0
  1462. EOFLG    DB    0    ;EOF FLAG (1=TRUE)
  1463. SECPTR    DW    DBUF
  1464. SECINBF    DB    0    ;# OF SECTORS IN BUFFER
  1465.     DS    60    ;STACK AREA
  1466. STACK    DS    2    ;STACK POINTER
  1467. ;
  1468. ;16 SECTOR DISK BUFFER (OVERLAYS HELP MSGS)
  1469. ;
  1470. DBUF    EQU    $    ;16 SECTOR DISK BUFFER
  1471. ;
  1472. ;INVALID COMMAND
  1473. ;
  1474. BADOPT    CALL    TYPE
  1475.     CALL    ILPRT    ;EXIT W/ERROR
  1476.     DB    ': INVALID OPTION ON MODEM '
  1477.     DB    'COMMAND - ',CR,LF
  1478.  DB 'PRESS RETURN FOR HELP, CTL-C IF NOT',CR,LF,1,0
  1479. ;
  1480. HELP    CALL    ILPRT
  1481.  DB 'Format for command is:',cr,lf,cr,lf
  1482.  DB 'MODEM # FILENAME',CR,LF,CR,LF
  1483.  DB 'Where # is a 1 character primary option,',cr,lf
  1484.  DB ' which may be followed by sub-options,',cr,lf
  1485.  DB ' and by ".xxx" to set baud rate to xxx'
  1486.  DB cr,lf,cr,lf,1
  1487.  DB 'Primary Options:',cr,lf
  1488.  DB '    S to send a file',cr,lf
  1489.  DB '    R to receive a file',cr,lf
  1490.  DB '    T to act as a terminal',cr,lf
  1491.  DB '    E to act as a computer (echo data)',cr,lf
  1492.  DB '    H to print this help file'
  1493.  DB cr,lf,cr,lf,1
  1494.  DB 'Secondary options:',cr,lf
  1495.  DB '    T go to terminal mode after file xfer',cr,lf
  1496.  DB '    E go to echo mode after file xfer',cr,lf
  1497.  DB '    Q quiet mode - no status msgs',cr,lf
  1498.  DB '    R show chars received',cr,lf
  1499.  DB '    S show chars sent',cr,lf
  1500.  DB '    V view file sent/received (no status)',cr,lf
  1501.  DB CR,LF,'FOR EXAMPLES, TYPE: MODEM X',cr,lf,0
  1502.     JMP    EXIT
  1503. ;
  1504. EXAM    CALL    ILPRT
  1505.  DB 'Send another file:',CR,LF
  1506.  DB '    MODEM S fn.ft',cr,lf
  1507. JMP EXIT
  1508. ;
  1509. ; BDOS EQUATES (VERSION 2)
  1510. ;
  1511. RDCON    EQU    1
  1512. WRCON    EQU    2
  1513. PRINT    EQU    9
  1514. CONST    EQU    11    ;CONSOLE STAT
  1515. OPEN    EQU    15    ;0FFH=NOT FOUND
  1516. CLOSE    EQU    16    ;    "    "
  1517. SRCHF    EQU    17    ;    "    "
  1518. SRCHN    EQU    18    ;    "    "
  1519. ERASE    EQU    19    ;NO RET CODE
  1520. READ    EQU    20    ;0=OK, 1=EOF
  1521. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  1522. MAKE    EQU    22    ;0FFH=BAD
  1523. REN    EQU    23    ;0FFH=BAD
  1524. STDMA    EQU    26    ;SET DMA
  1525. BDOS    EQU    BASE+5
  1526. REIPL    EQU    BASE
  1527. FCB    EQU    BASE+5CH    ;SYSTEM FCB
  1528. FCBEXT    EQU    FCB+12        ;FILE EXTENT
  1529. FCBSNO    EQU    FCB+32        ;SECTOR #
  1530. FCB2    EQU    BASE+6CH    ;SECOND FCB
  1531.     END
  1532.