home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / modems / modem / sendout8.aqm / SENDOUT8.ASM
Encoding:
Assembly Source File  |  1985-02-09  |  12.8 KB  |  480 lines

  1. ;
  2. ;TITLE 'SENDOUT UTILITY V.8 FOR CP/M AND MODEM AS OF 1/19/83 AAJ'
  3. ;
  4. ;THIS ROUTINE WRITTEN BY AL JEWER AND RELEASED IN PUBLIC
  5. ;DOMAIN 4/8/81. 
  6. ; THIS PROGRAM AND DOCUMENTATION COPYRIGHT 1981, 1982, 1983 
  7. ; BY AL JEWER. THIS SOFTWARE MUST NOT BE SOLD.
  8. ;
  9. ;THIS CP/M TRANSIENT COMMAND IS INVOKED IN THIS MANNER:
  10. ;
  11. ;A>SENDOUT XMODEM S FILENAME.TYP
  12. ;
  13. ;IN THIS EXAMPLE, THE STRING "XMODEM S FILENAME.TYP"
  14. ;WILL BE SENT OUT THE MODEM PORT TO A REMOTE SYSTEM.
  15. ;THIS IS FOR USE IN:
  16. ;
  17. ;        1) TRANSFERRING MULTIPLE PROGRAMS TO & FROM
  18. ;            REMOTE USING A SUBMIT FILE
  19. ;
  20. ;        2) SENDING COMMANDS WITHOUT HAVING TO
  21. ;            ENTER & EXIT THE "MODEM" PROGRAM
  22. ;
  23. ;THE STRING CAN BE UP TO 127 CHARACTERS LONG, AND IS 
  24. ;ECHOED TO THE LOCAL CONSOLE AS IT IS SENT.
  25. ;
  26. ;  DEFAULT MODE OF OPERATION
  27. ;
  28. ;THE PROGRAM WILL WAIT FOR A ">" CHARACTER BEFORE IT
  29. ;SENDS THE LINE, TO ALLOW THE REMOTE TO BE READY FOR
  30. ;THE COMMAND LINE. AS THE LINE IS SENT, THE PROGRAM 
  31. ;WILL CHECK THE CHARACTERS ECHOED BACK TO ASSURE THAT
  32. ;THE COMMAND LINE HAS BEEN TRANSMITTED PROPERLY.
  33. ;IF AN ERROR IS DETECTED, THE PROGRAM WILL SEND OUT
  34. ;A ^U FOLLOWED BY A CARRIAGE RETURN, THEN RETRY 
  35. ;SENDING THE LINE, UNTIL A PROPER TRANSMISSION IS MADE.
  36. ;
  37. ;  SPECIAL MODE OF OPERATION (FOR NON-CP/M SYSTEMS)
  38. ;
  39. ; TO ALLOW USE WITH OTHER SYSTEMS, PROVISION HAS BEEN 
  40. ; MADE TO CHANGE THE PROMPT CHARACTER IN THE COMMAND 
  41. ; LINE, USING AN ASTRISK TO INDICATE THIS MODE.
  42. ; THE COMMAND THEN TAKES THE FORM:
  43. ;
  44. ; SENDOUT *?COMMAND LINE
  45. ;
  46. ; THIS COMMAND LINE WILL CAUSE THE SENDOUT PROGRAM TO 
  47. ; WAIT FOR A '?' CHARACTER INSTEAD OF THE MORE USUAL '>'.
  48. ; ALSO, IN THE CASE WHERE A TRANSMISSION ERROR OCCURS,
  49. ; THE PROGRAM WILL SEND ASCII 'DELETE' CHARACTERS (07FH)
  50. ; TO CANCEL THE INPUT LINE. THIS IS USED INSTEAD OF THE 
  51. ; ^U USUALLY USED IN CP/M.
  52. ;
  53. ; OR,
  54. ;
  55. ; SENDOUT *^JCOMMAND LINE
  56. ;
  57. ; THIS MODE WORKS THE SAME AS ABOVE, EXCEPT IN THIS CASE,
  58. ; THE 'TRIGGER' CHARACTER WILL BE A CONTROL-J (LINE FEED).
  59. ; NOTE THAT YOU MUST TYPE THE UP-ARROW CHARACTER TO 
  60. ; INDICATE THAT THE ASCII CHARACTER FOLLOWING IS ACTUALLY
  61. ; A CONTROL CHARACTER. THIS ALLOWS USING ANY ASCII CHARACTER
  62. ; AS THE TRIGGER CHARACTER (EXCEPT, OF COURSE, FOR '^').
  63. ;
  64. ;UPDATES: (IN REVERSE ORDER TO MINIMIZE READING TIME)
  65. ;
  66. ;19-JAN-83 MODIFIED BY AL JEWER TO ALLOW USE WITH NON-CP/M
  67. ;          SYSTEMS BY ALLOWING USER-SPECIFIED 'TRIGGER'
  68. ;          CHARACTER. CHANGED APPLE MODS TO GENERAL 
  69. ;          PURPOSE MEMORY-MAPPED I/O ROUTINES. ELIMINATED
  70. ;          MULTIPLE NAMES FOR PORTS AND MASK BITS.
  71. ;
  72. ; 5-OCT-82 ADDED EQUATES TO ALLOW USE WITH AN INTEL
  73. ;          I8251 USART SERIAL PORT.
  74. ;                DAVE MABRY
  75. ;
  76. ;15-JAN-81 MODIFIED BY JOHN LIMPERT TO ADD MEMORY
  77. ;       MAPPED I/O FOR THE APPLE ][ WITH A D.C.
  78. ;       HAYES MICROMODEM IN SLOT #2. SET APPLE
  79. ;       TRUE FOR THIS CONFIGURATION.
  80. ;
  81. ;10-DEC-81 MODIFIED BY AL JEWER TO REMOVE REFERENCE TO
  82. ;       LOCAL CONSOLE PORT (FUNCTION NOW PERFORMED 
  83. ;       BY BIOS CALLS)
  84. ;       ALSO ADDED RETRY COUNTER TO GIVE UP IF PHONE
  85. ;       LINE GETS TOO HORRIBLE.
  86. ;
  87. ;23-NOV-81 MODIFIED BY JOHN LABOVITZ. ADDED SOME
  88. ;       SIGNON MESSAGES, AND ABILITY TO ABORT
  89. ;       BY A ^C.
  90. ;
  91. ;15-AUG-81 MODIFIED BY HOWARD BOOKER TO INCLUDE
  92. ;       CONDITIONAL EQUATES FOR THE DC HAYES
  93. ;       80-103A MODEM CARD.
  94. ;
  95. ;10-APR-81 REWRITTEN BY AL JEWER TO CHECK ECHOED
  96. ;       STRING FOR VALID TRANSFER.
  97. ;
  98. ;08-APR-81 MODIFIED BY TOM JORGENSON FOR SUPPORT
  99. ;       OF OTHER MODEM/PORT TYPES (ESP. H89)
  100. ;
  101. ;ANY QUESTIONS OR COMMENTS:
  102. ;
  103. ;    AL JEWER
  104. ;    PO BOX 123
  105. ;    WHITEWATER, WI. 53190
  106. ;
  107. ;    (414) 563-9932 (F4 RCPM SYSTEM)
  108. ;
  109. ;BASE DEFINITION, CHANGE THIS TO 4200H IF ALTERNATE CP/M
  110. ;(RELOCATED) VERSION SUCH AS HEATH/LIFEBOAT OR TRS-80
  111. ;
  112. BASE    EQU    0    ;BASE OF MEMORY SEGMENT
  113. ;
  114. ;THESE SHOULD BE O.K. AS IS
  115. ;
  116. CBOOT    EQU    BASE    ;JUMP HERE TO COLD BOOT CP/M
  117. BDOS    EQU    BASE+5    ;BDOS FUNCTION CALL ADDRESS
  118. BUFFER    EQU    BASE+80H ;INPUT LINE BUFFER
  119. CONOUT    EQU    2    ;CP/M CONSOLE OUTPUT FROM E
  120. PLINE    EQU    9    ;CP/M PRINT STRING AT (DE)
  121. CSTAT    EQU    11    ;CP/M CONSOLE STATUS
  122. CONIN    EQU    1    ;CP/M CONSOLE INPUT
  123. CR    EQU    0DH    ;ASCII CHARACTERS
  124. LF    EQU    0AH
  125. CTLU    EQU    'U'-40H ;CONTROL-U
  126. CTLC    EQU    'C'-40H ;CONTROL-C
  127. DELETE    EQU    07FH    ;ASCII DELETE CHARACTER (RUBOUT)
  128. ;
  129. ; IF YOU REQUIRE DEFAULTS FOR OTHER THAN CP/M SYSTEMS, CHANGE THE 
  130. ; EQUATES BELOW TO MATCH YOUR SYSTEM REQUIREMENTS.
  131. ;
  132. CANCEL    EQU    CTLU    ;THIS CHARACTER CANCELS INPUT LINE
  133. ;
  134. DEFAULT    EQU    '>'    ;DEFAULT TRIGGER CHARACTER (SYSTEM PROMPT)
  135. ;
  136. SPECIAL    EQU    '*'    ;THIS CHARACTER, WHEN USED AS THE 1ST 
  137. ;            ;CHARACTER OF THE CP/M COMMAND LINE TAIL,
  138. ;            ;INDICATES A REQUEST FOR THE NON-CP/M MODE.
  139. ;            ;(SEE DOCUMENTATION ABOVE)
  140. ;
  141. FALSE    EQU    0
  142. TRUE    EQU    NOT FALSE
  143. ;
  144. PMAPIO    SET    TRUE    ;*** DO NOT CHANGE THIS STATEMENT ***
  145.             ;THIS FLAG SETS PORT MAPPED OR MEMORY 
  146.             ;MAPPED I/O ROUTINES. IT IS ACTUALLY
  147.             ;SET UP IN EQUATES BELOW.
  148.             ;IF YOU ADD EQUATES FOR A DIFFERENT MODEM 
  149.             ;TYPE WHICH USES MEMORY MAPPED I/O, ADD
  150.             ;A 'PMAP SET FALSE' STATEMENT TO YOUR 
  151.             ;EQUATE BLOCK (EX: APPLE EQUATES)
  152. ;
  153. FASTCLK EQU    TRUE     ;TRUE IF 4MHZ OR GREATER
  154. ;
  155. RETRYS    EQU    32    ;RETRY THIS MANY TIMES BEFORE GIVING UP
  156. ;
  157. ;CHOOSE YOUR MODEM/PORT TYPE HERE:
  158. ;
  159. APPLE    EQU    FALSE    ;TRUE, IF APPLE WITH MMII
  160. H89    EQU    FALSE    ;TRUE, IF H89
  161. PMMI    EQU    TRUE     ;TRUE, IF PMMI
  162. DCH    EQU    FALSE    ;TRUE, IF DCH
  163. INTEL    EQU    FALSE    ;TRUE, IF INTEL MDS-225 OR EQUIVALENT
  164. ;
  165.     IF    PMMI
  166. ;
  167. ;CHANGE THE FOLLOWING IF YOUR PMMI IS NOT AT THE 
  168. ;STANDARD BASE ADDRESS OF 0C0H.
  169. ;
  170. TPORT    EQU    0C0H    ;THIS IS STATUS PORT
  171. DPORT    EQU    TPORT+1 ;DATA I/O PORT
  172. POTBMT    EQU    1    ;XMIT BUFFER EMPTY FLAG
  173. PODAV    EQU    2    ;DATA AVAILABLE FLAG
  174. ;
  175.     ENDIF        ;PMMI
  176. ;
  177.     IF    H89
  178. ;
  179. ;SHOULD USE THESE AS LONG AS YOU CONFORM
  180. ;TO STD PORT ADDRESS (330Q)
  181. ;
  182. TPORT    EQU    335Q    ;STATUS PORT (8250 UART)
  183. DPORT    EQU    330Q    ;DATA PORT
  184. POTBMT    EQU    040Q    ;THRE BIT (TX BUFFER EMPTY)
  185. PODAV    EQU    001Q    ;DATA AVAILABLE FLAG
  186. ;
  187.     ENDIF        ;H89
  188. ;
  189.     IF DCH
  190. ;
  191. ;STANDARD DC HAYES MODEL 80-103A PORTS
  192. ;
  193. TPORT    EQU    81H    ;STATUS PORT (TR1602 UART)
  194. DPORT    EQU    80H    ;DATA PORT
  195. POTBMT    EQU    02H    ;THRE BIT (TX BUFFER EMPTY)
  196. PODAV    EQU    01H    ;DATA AVAILABLE FLAG
  197. ;
  198.     ENDIF        ;DCH
  199. ;
  200.     IF APPLE
  201. ;
  202. PMAPIO    SET    FALSE    ;APPLE USES MEMORY MAPPED I/O
  203. ;
  204. ;APPLE ][ WITH MICROMODEM IN SLOT #2
  205. ;
  206. TPORT     EQU    0E0A6H    ;ACIA CSR
  207. DPORT     EQU    0E0A7H    ;ACIA DATA BUFFER
  208. POTBMT    EQU    02H    ;TRANSMIT REGISTER EMPTY BIT
  209. PODAV     EQU    01H    ;RECEIVER DATA AVAILABLE BIT
  210. ;
  211.     ENDIF        ;APPLE
  212. ;
  213. ;
  214.     IF    INTEL
  215. ;
  216. TPORT    EQU    0F7H    ; STATUS PORT (I8251 USART)
  217. DPORT    EQU    0F6H    ; DATA PORT
  218. POTBMT    EQU    1    ; TRANSMITTER READY
  219. PODAV    EQU    2    ; RECIEVER READY (IE CHAR AVAILABLE)
  220. ;
  221.     ENDIF        ;INTEL MDS-225
  222. ;
  223. ORG    BASE+100H    ;START OF TPA
  224. ;
  225. START:    JMP     START1    ;AROUND COPYRIGHT NOTICE
  226.     DB    'Copyright 1981, 1982, 1983 Al Jewer'
  227. START1:    LXI     H,0    ;GET THE SYSTEM STACK POINTER 
  228.     DAD    SP    ;TO THE HL
  229.     SHLD    OLDSTK    ;STORE FOR EXIT
  230.     LXI    SP,STACK ;SET SAFE STACK
  231.     CALL    ILPRT    ;SAY HELLO TO THE FOLKS
  232.     DB    'SENDOUT V. 8.0  --  Type ^C to ABORT',CR,LF,0
  233.     MVI    A,RETRYS ;SET RETRY COUNTER 
  234.     STA    TRYNUM    ;TO ITS INITIAL VALUE
  235.     LHLD    1    ;GET WARM BOOT ADDRESS
  236.     LXI    D,4    ;PLUS 1 TABLE POSITION & 1 JMP
  237.     DAD    D    ;GIVES CONSTAT VECTOR AT (HL)
  238.     MOV    E,M    ;LO BYTE OF CONSTAT
  239.     INX    H    ;POINT TO HI BYTE
  240.     MOV    D,M    ;CONSTAT VECTOR NOW IN DE
  241.     XCHG        ;CONSTAT VECTOR NOW IN HL
  242.     SHLD    CST+1    ;INIT THE CONSTAT CALL
  243.     LXI    H,2    ;DISTANCE TO NEXT VECTOR
  244.     DAD    D    ;THIS IS CONIN VECTOR AT (HL)
  245.     MOV    E,M    ;LO BYTE OF CONIN
  246.     INX    H    ;POINT TO HI BYTE
  247.     MOV    D,M    ;CONIN VECTOR NOW IN DE
  248.     XCHG        ;CONIN VECTOR NOW IN HL
  249.     SHLD    CIN+1    ;INIT THE CONIN CALL
  250.     LXI    H,BUFFER ;POINT TO COMMAND LINE BUFFER
  251.     MOV    A,M    ;GET THE CHARACTER COUNT
  252.     ORA    A    ;ZERO LENGTH?
  253.     JZ    ERROR    ;RETURN IF SO
  254.     DCR    A    ;LENGTH OF 1? (THIS WOULD BE SPACE ONLY)
  255.     JZ    ERROR    ;IGNORE THIS TOO
  256.     INR    A    ;RESTORE VALUE
  257.     INR    A    ;ADD 1 FOR FINAL CR
  258.     INX    H    ;SKIP THE LEADING SPACE
  259.     SHLD    STRING    ;STORE DEFAULT STRING ADDRESS
  260.     STA    SLEN    ;AND DEFAULT STRING LENGTH
  261.     MOV    B,A    ;STRING LENGTH IN B
  262.     INX    H    ;SKIP THE SPACE
  263.     MOV     A,M    ;GET THE 1ST CHARACTER ON THE LINE
  264.     CPI     SPECIAL    ;IS IT ALTERNATE PROMPT REQUEST?
  265.     JNZ    NOSPCL    ;JUMP IF EVERYTHING IS NORMAL
  266.     DCR    B    ;SOAK UP TRIGGER CHARACTER & NEW PROMPT.
  267.     DCR     B    ;
  268.     INX    H    ;POINT TO NEW TRIGGER CHARACTER
  269.     MOV     A,M    ;GET IT
  270.     CPI    '^'    ;CONTROL CHARACTER REQUEST?
  271.     JNZ    NOCTRL    ;JUMP IF NOT
  272.     DCR     B    ;SOAK UP THE CONTROL CHARACTER
  273.     INX    H    ;POINT TO THE ASCII CHARACTER TO CONVERT
  274.     MVI    A,-40H    ;SUBTRACT 40H TO MAKE INTO CONTROL CHARACTER
  275.     ADD    M    ;TRIGGER CHARACTER TO A
  276. NOCTRL:    STA    PROMPT    ;STORE NEW TRIGGER CHARACTER
  277.     MOV     A,B    ;GET STRING LENGTH
  278.     STA    SLEN    ;STORE FOR LATER
  279.     SHLD    STRING    ;POINT TO STRING START -1
  280. NOSPCL:    JMP    PDATA    ;JUMP TO TEST CURRENT CHARACTER
  281. ;
  282. PIN:    LXI    B,8000H ;TIME COUNTER TO B
  283.     LXI    H,TRYNUM ;POINT TO RETRY COUNTER
  284.     DCR    M    ;BUMP IT
  285.     JNZ    PLOOP    ;CONTINUE IF NOT EXHAUSTED
  286.     CALL    ILPRT    ;ELSE PRINT THE BAD NEWS
  287.     DB    CR,LF,'Can''t send string -- Aborting.....',CR,LF,0
  288.     JMP    BOOT    ;AND KICK OUT
  289. ;
  290. PLOOP:    PUSH B        ;SAVE THE TIMEOUT COUNTER
  291. CST:    CALL    $-$    ;THIS IS INITED TO STATUS ADDR. IN BIOS
  292.             ;(WE DO THIS TO SAVE TIME IN LOOP)
  293.     ORA    A    ;KEY PRESSED?
  294.     JZ    PLOOP1    ;CONTINUE IF NO KEYPRESS
  295. CIN:    CALL    $-$    ;THIS IS INITED TO CONSOLE INPUT ADDR.
  296.             ;IN BIOS
  297.     CPI    CTLC    ;EXIT REQUEST?
  298.     JNZ    PLOOP1    ;CONTINUE IF NOT
  299.     CALL    ILPRT    ;ELSE EXIT
  300.     DB    CR,LF,'SENDOUT aborted by ^C'
  301.     DB    CR,LF,'Returning to CP/M...',0
  302.     JMP    BOOT
  303. ;
  304. PLOOP1: POP    B    ;RESTORE THE TIMEOUT COUNTER
  305.     DCX    B    ;COUNT THE LOOP
  306.     MOV    A,B    ;CHECK FOR DONE
  307.     ORA    C
  308.     JZ    TRYAGN    ;JUMP IF TIMED OUT
  309. ;
  310.     IF    FASTCLK
  311.     XTHL        ;WASTE TIME ON FAST SYSTEMS
  312.     XTHL
  313.     XTHL
  314.     XTHL
  315.     ENDIF        ;FASTCLK
  316. ;
  317. PL2:
  318. IF PMAPIO
  319.     IN    TPORT    ;GET THE STATUS PORT
  320. ELSE
  321.     LDA    TPORT    ;MEMORY MAPPED STATUS PORT
  322. ENDIF
  323.     ANI    PODAV    ;WE GOT A CHARACTER?
  324.     JZ    PLOOP    ;LOOP TILL TIMEOUT OR DATA RECEIVED
  325. ;
  326. PDATA:
  327. IF PMAPIO
  328.     IN    DPORT    ;GET THE CHARACTER
  329. ELSE
  330.     LDA    DPORT    ;GET CHARACTER FROM MEMORY MAPPED I/O
  331. ENDIF
  332.     ANI    7FH    ;DROP PARITY BIT JUST IN CASE
  333.     MOV    E,A    ;ECHO IT TO THE CRT
  334.     CALL    CRTOUT
  335.     MOV     C,A    ;GET ECHOED CHARACTER TO C REGISTER
  336.     LDA    PROMPT    ;GET DESIRED PROMPT CHARACTER TO A
  337.     CMP    C    ;SYSTEM PROMPT?
  338.     JNZ    PIN    ;LOOP TILL PROPER CHARACTER RECEIVED
  339. ;
  340. ;WE HAVE NOW RECEIVED A SYSTEM PROMPT, SO THE REMOTE SYSTEM
  341. ;IS READY TO RECEIVE THE COMMAND LINE.
  342. ;
  343.     LHLD     STRING    ;GET COMMAND LINE STRING ADDRESS
  344.     LDA     SLEN    ;GET STRING LENGTH 
  345.     MOV    B,A    ;TO B REGISTER AS COUNTER
  346. ;
  347. LOOP:    INX    H    ;POINT TO NEXT CHARACTER
  348.     DCR    B    ;COUNT THE CHARACTER
  349.     JNZ    NOTDUN    ;JUMP IF NOT FINISHED
  350.     MVI    E,LF    ;SEND LINE FEED TO LOCAL CONSOLE
  351.     CALL    CRTOUT
  352.     JMP    BOOT    ;DONE!
  353. ;
  354. NOTDUN: MVI    A,1    ;CHECK FOR LAST CHARACTER
  355.     CMP    B
  356.     JNZ    GO    ;JUMP IF NOT LAST ONE
  357.     MVI    M,CR    ;MAKE LAST CHARACTER CARRIAGE RETURN
  358. ;
  359. GO:    MOV    C,M    ;GET CHARACTER
  360.     CALL    POUT    ;SEND OUT THE MODEM
  361. GO1:    LXI    D,0    ;TIME COUNTER TO D
  362. ;
  363. RECLP:
  364. IF PMAPIO
  365.     IN    TPORT    ;CHECK FOR CHARACTER
  366. ELSE
  367.     LDA     TPORT
  368. ENDIF
  369.     ANI    PODAV    ;CHARACTER RECEIVED?
  370.     JNZ    GOTONE    ;JUMP IF WE GOT A CHARACTER
  371.     DCX    D    ;COUNT THE TIMER
  372.     MOV    A,D
  373.     ORA    E
  374.     JZ    TRYAGN    ;JUMP IF TIMED OUT
  375. ;
  376.     IF    FASTCLK
  377.     MVI A,14    ;WASTE TIME IF AT 4 MHZ
  378. WASTE:    DCR A        ;COUNT THE LOOP
  379.     JNZ WASTE    ;AND LOOP TILL DONE
  380.     ENDIF        ;FASTCLK
  381. ;
  382.     JMP    RECLP    ;CONTINUE WAITING
  383. ;    
  384. GOTONE:
  385. IF PMAPIO
  386.     IN    DPORT    ;GET THE CHARACTER
  387. ELSE
  388.     LDA    DPORT
  389. ENDIF
  390.     ANI    7FH    ;DROP PARITY
  391.     JZ    GO1    ;IGNORE NULLS
  392.     MOV    E,A
  393.     CALL    CRTOUT    ;DISPLAY TO LOCAL CONSOLE
  394.     CMP    M    ;IS IT THE SAME AS WHAT WE SENT?
  395.     JZ    LOOP    ;JUMP IF OK
  396. ;
  397. TRYAGN:    LDA     PROMPT    ;GET OUR TRIGGER CHARACTER
  398.     CPI    DEFAULT    ;NORMAL CHARACTER?
  399.     JZ    CANLINE    ;CANCEL LINE IF SO
  400.     LDA    SLEN    ;GET STRING LENGTH
  401.     SUB    B    ;GET NUMBER THAT WE SENT
  402.     MOV    B,A    ;TO B REGISTER AS COUNTER
  403.     MVI    C,DELETE ;DELETE CHARACTERS CANCEL LINE
  404. DELLOOP:CALL    POUT    ;SEND THE DELETES
  405.     DCR     B    ;COUNT THE DELETES
  406.     JNZ    DELLOOP    ;LOOP TILL ALL SENT
  407.     JMP    GNP    ;AND CONTINUE
  408. ;
  409. CANLINE:MVI    C,CANCEL ;CANCEL THE LINE
  410.     CALL    POUT
  411. GNP:    MVI    C,CR    ;THEN GET NEW PROMPT
  412.     CALL    POUT
  413.     JMP    PIN
  414. ;
  415. POUT:
  416. IF PMAPIO
  417.     IN    TPORT    ;GET PHONE STATUS PORT
  418. ELSE
  419.     LDA    TPORT    ;GET MEMORY MAPPED STATUS PORT
  420. ENDIF
  421.     ANI    POTBMT    ;MASK FOR XMIT BUFFER EMPTY
  422.     JZ    POUT    ;WAIT FOR PHONE
  423.     MOV    A,C    ;SEND THE CHARACTER
  424. IF PMAPIO
  425.     OUT    DPORT
  426. ELSE
  427.     STA    DPORT    
  428. ENDIF
  429.     RET
  430. ;
  431. CRTOUT: PUSH    H    ;SAVE AFFECTED REGISTERS
  432.     PUSH    B
  433.     PUSH    PSW
  434.     MVI    C,CONOUT
  435.     CALL    BDOS    ;SEND TO CONSOLE
  436.     POP    PSW
  437.     POP    B
  438.     POP    H
  439.     RET
  440. ;
  441. ERROR:    CALL    ILPRT
  442.     DB    CR,LF,'Command error.'
  443.     DB    CR,LF,'Format: SENDOUT string'
  444.     DB    CR,LF,'Where "string" is any string to'
  445.     DB    CR,LF,'send out to the modem.',0
  446.             ;FALL THRU TO REBOOT ROUTINE
  447. ;
  448. BOOT:    LHLD     OLDSTK    ;GET SYSTEM STACK
  449.     SPHL        ;RESTORE IT
  450.     XRA    A    ;SHOW EVERYTHING OK
  451.     RET        ;BACK TO CP/M WITH NO REBOOT REQUIRED
  452. ;
  453. ILPRT:    XTHL        ;SAVE HL, GET MSG
  454.     PUSH    B    ;SAVE B
  455. ILPLP:    MOV    E,M    ;GET CHAR
  456.     CALL    CRTOUT    ;PRINT IT
  457.     INX    H    ;POINT TO NEXT
  458.     MOV    A,M    ;GET IT
  459.     ORA    A    ;TEST FOR END
  460.     JNZ    ILPLP    ;NOPE, LOOP
  461.     POP    B    ;YUP, RESTORE...
  462.     XTHL        ;...
  463.     RET        ;AND RETURN
  464. ;
  465. PROMPT:    DB DEFAULT    ;SYSTEM PROMPT CHARACTER STORED HERE
  466. ;
  467. OLDSTK:    DS 2        ;SYSTEM STACK STORAGE
  468. ;
  469. STRING:    DS 2        ;COMMAND LINE STRING START POINTER
  470. ;
  471. SLEN    DS 1        ;COMMAND LINE STRING LENGTH 
  472. ;
  473. TRYNUM: DS 1        ;RETRY COUNTER STORAGE
  474. ;
  475.     DS 60        ;STACK AREA
  476. STACK    EQU    $
  477. ;
  478.     END    START
  479.