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 / SIMTEL / CPMUG / CPMUG025.ARK / 88-MODEM.ASM next >
Assembly Source File  |  1984-04-29  |  32KB  |  1,192 lines

  1. ;**********************************************************************
  2. ;
  3. ; TITLE: 88-MODEM DRIVER ROUTINE WITH DISK FILE TRANSFER
  4. ;
  5. ; VERSION: 1.00            LAST REVISION: 7/7/78
  6. ;
  7. ; AUTHOR: TIM PUGH
  8. ;      9655-M HOMESTEAD COURT
  9. ;      LAUREL, MD. 20810
  10. ;      (301) 776-5253
  11. ;
  12. ;****************** SUMMARY OF CONTROL CHARACTERS *********************
  13. ;
  14. ;CONTROL CHARACTERS ARE INDICATED BY A "^" PRECEEDING THE CHARACTER.
  15. ;
  16. ; ^A    ASSIGN CONSOLE DEVICE
  17. ; ^B    TRANSMIT A "BREAK"
  18. ; ^D    DISCONTINUE CURRENT MODE
  19. ; ^F    FILE NAME SPECIFIED FOR SUBSEQUENT RX/TX
  20. ; ^R    RECEIVE (RX) A DISK FILE FROM A REMOTE DEVICE
  21. ; ^T    TRANSMIT (TX) A DISK FILE TO A REMOTE DEVICE
  22. ; ^W    ASCII ETB -- MUST BE THE LAST CHARACTER OF A TX FILE
  23. ;
  24. ;******************* OPERATING INSTRUCTIONS **************************
  25. ;
  26. ;THIS PROGRAM IS DESIGNED TO OPERATE UNDER CP/M.  IF A FILE TRANSFER
  27. ;IS TO BE PERFORMED, THE FILE NAME SHOULD BE SPECIFIED WHEN THE PROGRAM
  28. ;IS CALLED, E.G.
  29. ;                   88-MODEM  <FILENAME>.<FILETYPE>
  30. ;
  31. ;FOLLOWING THE PROGRAM SIGN ON MESSAGE, THE SYSTEM WAITS FOR OPERATOR
  32. ;INPUT.  AT THIS POINT THE OPERATOR CAN INITIATE HANDSHAKING (AS DES-
  33. ;CRIBED UNDER "FILE TX MODE" BELOW) BY ENTERING AN "H".  ALTERNATIVELY,
  34. ;THE OPERATOR CAN SELECT FROM ONE OF 6 BAUD RATES BY ENTERING A "B".
  35. ;FINALLY, HE CAN DEFAULT TO 300 BAUD AND NO HAND-SHAKE BY ENTERING
  36. ;A "CR" (CARRIAGE RETURN) AS THE INITIAL ENTRY.
  37. ;
  38. ;NEXT, THE OPERATOR IS DIRECTED TO SELECT THE MODE OF OPERATION BY ENTERING
  39. ;EITHER AN "O" FOR ORIGINATE OR AN "A" FOR ANSWER.  IF ANSWER MODE IS SELECTED,
  40. ;THE PROGRAM INITIALIZES THE SYSTEM ACCORDINGLY AND WAITS FOR RING DETECT.
  41. ;THE PHONE WILL BE ANSWERED ON THE FIRST RING AND GENERATES THE 2225 HZ
  42. ;CARRIER SIGNAL.  UPON DETECTION OF THE RESPONDING 1270 HZ TONE, A SIGN-ON
  43. ;MESSAGE IS TRANSMITTED TO THE REMOTE DEVICE AND A LOCAL MESSAGE DIRECTING
  44. ;THE COMMENCEMENT OF NORMAL TRANSMISSION IS DISPLAYED ON THE CONSOLE.
  45. ;IF THE REMOTE DEVICE IS A TERMINAL IT SHOUD BE IN HALF-DUPLEX MODE.
  46. ;OF THE ABOVE MENTIONED CONTROL CHARACTERS, ONLY ^T, ^R, AND ^D ARE
  47. ;SUPPORTED AT THE REMOTE DEVICE.  HOWEVER, ALL ARE SUPPORTED AT THE LOCAL
  48. ;CONSOLE.  IF THE LOCAL CONSOLE IS UNATTENDED, A FILE TRANSFER CAN BE
  49. ;INITIATED REMOTELY PROVIDED THE FILE NAME WAS PREVIOUSLY SPECIFIED.
  50. ;COMMUNICATIONS CAN BE TERMINATED REMOTELY SIMPLY BY HANGING UP THE PHONE.
  51. ;THIS CAUSES THE SYSTEM TO RETURN TO INITIALIZATION OF ANSWER MODE AND
  52. ;AWAIT THE NEXT REMOTE CALL.  ALTERNATIVELY, A "^D" ISSUED REMOTELY WILL
  53. ;TERMINATE COMMUNICATIONS AND TAKE THE SYSTEM OUT OF ANSWER MODE.  THIS
  54. ;MEANS THAT THE NEXT CALLER WON'T BE GREETED BY A PERHAPS UNEXPECTED
  55. ;2225HZ TONE.
  56. ;
  57. ;IF ORIGINATE MODE IS SELECTED, THE SYSTEM WAITS FOR DIAL TONE DETECTION.
  58. ;ONCE THE DIAL TONE HAS BEEN DETECTED - ANNOUNCED ON THE CONSOLE - DIALING
  59. ;CAN BEGIN.  CONVENTIONAL DIALING IS PERFORMED BY SIMPLY ENTERING THE
  60. ;NUMBER TO BE DIALED AT THE CONSOLE KEYBOARD.  AS EACH NUMBER IS DIALED
  61. ;A DASH IS DISPLAYED.  IT IS POSSIBLE TO EXCEED THE DIALING SPEED OF THE
  62. ;DEVICE.  THIS IS INDICATED BY THE ABSENCE OF A DASH BETWEEN DIGITS.
  63. ;
  64. ;BOTH AUTODIALING AND ROTARY DIALING ARE SUPPORTED.  AUTODIALING IS INIT-
  65. ;IATED BY ENTERING ONE OF 4 ALPHA CHARACTERS AS THE FIRST "DIGIT" DIALED.
  66. ;THE CHARACTERS SUPPORTED ARE "H,M,Z,W".  OTHER CHARACTERS MAY BE SELECTED
  67. ;PROVIDED THE 2 LSB'S OF THE ASCII CODE FOR THE SET SELECTED COVER THE
  68. ;RANGE OF 00,01,10,11.  THE PHONE NUMBERS ASSIGNED TO THESE CHARACTERS
  69. ;CAN BE FOUND IN THE LISTING JUST PRIOR THE THE "MESSAGES" SECTION.
  70. ;ROTARY DIALING IS SUPPORTED FOR THE CHARACTER "M" WHEREBY UP TO 4
  71. ;NUMBERS WILL BE DIALED IN SEQUENCE IF EACH PRECEEDING NUMBER IS FOUND
  72. ;BUSY.  THE SIZE OF THE ROTARY GROUP IS NOT RESTRICTED TO 4.  ANY NUMBER
  73. ;GREATER THAN OR EQUAL TO 2 CAN BE SUPPORTED.
  74. ;
  75. ;AFTER DIALING IS COMPLETED AND THE REMOTE CARRIER HAS BEEN DETECTED,
  76. ;THE SYSTEM IS PLACED IN THE "CHARACTER TX/RX MODE".  THIS IS THE MODE
  77. ;USED FOR KEYBOARD COMMUNICATIONS WITH THE REMOTE DEVICE.  WHILE IN
  78. ;THIS MODE, A BREAK MAY BE TRANSMITTED BY ENTERING A "^B".  IF
  79. ;MORE THAN ONE FILE IS TO BE TRANSFERRED, THE NEW FILE NAME CAN BE
  80. ;SPECIFIED BY ENTERING A "^F".  CONSOLE MESSAGES WILL PROMPT THE
  81. ;OPERATOR FOR APPROPRIATE ENTRIES.  IT IS POSSIBLE TO REASSIGN THE
  82. ;CONSOLE DEVICE BY ENTERING A "^A".  HERE TOO, CONSOLE MESSAGES WILL
  83. ;PROMPT THE OPERATOR FOR APPROPRIATE ENTRIES.  THIS FEATURE IS ONLY
  84. ;SUPPORTED ON SYSTEMS HAVING A TDL "ZAPPLE" MONITOR.
  85. ;
  86. ;IN ORDER TO INITIATE THE "FILE TX MODE" THE USER SHOULD ENTER A "^T".
  87. ;THE DATA IS DISPLAYED ON THE CONSOLE DEVICE AS IT IS TRANSMITTED.  UPON
  88. ;COMPLETION OF FILE TRANSMISSION, THE SYSTEM REVERTS TO THE CHARACTER
  89. ;MODE.  RETURN TO CHARACTER MODE PRIOR TO COMPLETION CAN BE FORCED BY
  90. ;ENTERING "^D".  "HAND-SHAKING" AS REQUIRED BY SOME UNIVAC 1100 SERIES
  91. ;COMPUTERS HAS BEEN INCLUDED.  TO ENABLE THIS, ENTER A "H" AS THE
  92. ;DIALING INITIATION CHARACTER (AS THE CONSOLE MESSAGE DIRECTS).
  93. ;THE END OF FILE IN THIS MODE IS "^W".  THUS, THE FILE TO BE TRANS-
  94. ;MITTED MUST HAVE A "^W" WRITTEN AS THE LAST CHARACTER ON THE FILE.
  95. ;
  96. ;TO INITIATE THE "FILE RX MODE" THE USER ENTERS A "^R".  OPERATION IS
  97. ;SIMILAR TO FILE TX MODE DESCRIBED ABOVE.  SINCE CHARACTER TRANSMISSION
  98. ;IS SUPPORTED IN THIS MODE, THE USER SHOULD SET UP FOR FILE TRANSFER
  99. ;BY ISSUEING A COMMAND TO THE REMOTE DEVICE EXCEPT FOR THE CARRIAGE
  100. ;RETURN.  TYPE "^R" AND AFTER THE READY MESSAGE IS GIVEN, TYPE "CR".
  101. ;THE CR WILL GO TO THE REMOTE DEVICE AND INITIATE TRANSMISSION.
  102. ;THIS MODE DOES NOT TERMINATE AUTOMATICALLY.  A "^D" MUST BE TYPED
  103. ;IN ORDER TO RETURN TO THE CHARACTER MODE.
  104. ;
  105. ;ESCAPE FROM THE CHARACTER MODE TO THE INITIAL DIALING SEQUENCE IS
  106. ;MADE BY ENTERING A "^D".
  107. ;
  108. ;RETURN TO CP/M IS EFFECTED BY ENTERING A "^D" WHILE IN THE "INITIAL
  109. ;DIALING SEQUENCE MODE".
  110. ;
  111. ;********************* MODEM CONTROL EQUATES **************************
  112. ;
  113. ;--I/O ADDRESSES
  114. ;
  115. MODEM0    EQU    0C0H    ;UART STATUS/CONTROL
  116. MODEM1    EQU    0C1H    ;DATA IN/OUT
  117. MODEM2    EQU    0C2H    ;FILTER & CONTROL WORD SELECT
  118. MODEM3    EQU    0C3H    ;(MODEM,DIALER,BAUD-RATE) CONTROL
  119. ;
  120. ;--UART/MODEM STATUS (IN MODEM0)
  121. ;
  122. TBE    EQU    001H    ;TRANSMIT BUFFER EMPTY
  123. RDA    EQU    002H    ;RECEIVE DATA AVAILABLE
  124. DBY    EQU    004H    ;DIALER BUSY
  125. PER    EQU    008H    ;PARITY ERROR
  126. OVR    EQU    010H    ;DATA OVERRUN
  127. BRK    EQU    020H    ;BREAK RECEIVED
  128. CTS    EQU    040H    ;CLEAR TO SEND
  129. DTD    EQU    080H    ;DIAL TONE DETECT
  130. ;
  131. ;--UART MODES (OUT MODEM0)
  132. ;
  133. ASCII1    EQU    024H    ;7 DATA BITS, EVEN PARITY, 1 STOP BIT
  134. ASCII2    EQU    004H    ;7 DATA BITS, ODD PARITY, 1 STOP BIT
  135. BIN1    EQU    02CH    ;8 DATA BITS, EVEN PARITY, 1 STOP BIT
  136. BIN2    EQU    00CH    ;8 DATA BITS, ODD PARITY, 1 STOP BIT
  137. ;
  138. ;--FILTER & CONTROL WORD SELECT CODES (OUT MODEM2)
  139. ;
  140. MMSELO    EQU    001H    ;MODEM MODE CONTROL SELECT - ORIGINATE
  141. MMSELA    EQU    031H    ;MODEM MODE CONTROL SELECT - ANSWER
  142. DLSEL    EQU    002H    ;DIALER DIGIT CONTROL SELECT 
  143. BDSEL    EQU    004H    ;BAUD/DIAL RATE CONTROL SELECT 
  144. INTEN    EQU    008H    ;INTERRUPT ENABLE 
  145. ;
  146. ;--MODEM MODES (OUT MODEM3)
  147. ;
  148. MMORIG    EQU    0C0H    ;ORIGINATE: OH,DTR
  149. MMLOW    EQU    043H    ;DTR,<=300,ESD,ELS
  150. MMLREL    EQU    04BH    ;DTR,<=300,BRK-REL,ESD,ELS
  151. MMHIGH    EQU    063H    ;DTR,>300,ESD,ELS
  152. MMHREL    EQU    06BH    ;DTR,>300,BRK-REL,ESD,ELS
  153. MMTERM    EQU    00EH    ;TERMINATE: BRK-REL,TX-BRK,ESD,ESS
  154. MMBRK    EQU    004H    ;TX-BREAK
  155. ;
  156. ;--DIAL & BAUD RATE CONSTANTS (OUT MODEM3)
  157. ;
  158. DRATE1    EQU    068H    ;DIAL RATE 10 PPS
  159. DRATE2    EQU    034H    ;DIAL RATE 20 PPS
  160. BAUD10    EQU    08EH    ;110 BAUD
  161. BAUD15    EQU    068H    ;150 BAUD
  162. BAUD30    EQU    034H    ;300 BAUD
  163. BAUD45    EQU    022H    ;450 BAUD
  164. BAUD50    EQU    01FH    ;500 BAUD
  165. BAUD60    EQU    01AH    ;600 BAUD
  166. ;
  167. ;********************** CP/M EQUATES ******************************
  168. ;
  169. ; CP/M FUNCTIONS ARE EXECUTED BY PASSING THE FUNCTION NUMBER IN
  170. ; REGISTER C AND THE INFORMATION (ADDRESS OR DATA) IN REGISTERS
  171. ; D,E (REGISTER E IF SINGLE BYTE DATA).  THE RESULT (IF APPLICABLE)
  172. ; IS RETURNED IN REGISTER A.  IF DOUBLE BYTE RESULT, THE MSB IS IN
  173. ; REGISTER B.
  174. ;
  175. ;--FDOS FUNCTIONS
  176. ;
  177. RESET    EQU    0    ;SYSTEM RESET
  178. RDCON    EQU    1    ;READ CONSOLE CHARACTER
  179. WRCON    EQU    2    ;WRITE CONSOLE CHARACTER
  180. RDRDR    EQU    3    ;READ CHARACTER FROM READER DEVICE
  181. WRPCH    EQU    4    ;WRITE CHARACTER TO PUNCH DEVICE
  182. WRLST    EQU    5    ;WRITE CHARACTER TO LIST DEVICE
  183. IOCHK    EQU    7    ;READ I/O CONFIGURATION BYTE
  184. IOSET    EQU    8    ;WRITE I/O CONFIGURATION BYTE
  185. WRCBUF    EQU    9    ;WRITE BUFFER CONTENTS TO CONSOLE
  186. RDCBUF    EQU    10    ;READ BUFFER CONTENTS FROM CONSOLE
  187. CONST    EQU    11    ;CONSOLE (DATA AVAILABLE) STATUS
  188. ;
  189. UNLOAD    EQU    12    ;UNLOAD DISK R/W HEAD
  190. DSKRES    EQU    13    ;DISK SYSTEM RESET
  191. DSKSEL    EQU    14    ;DISK SELECT (0,1,2,3)
  192. OPEN    EQU    15    ;OPEN DISK FILE (FCB ADDRESS)
  193. CLOSE    EQU    16    ;CLOSE DISK FILE  "    "
  194. SRCH    EQU    17    ;SEARCH FOR FILE  "     "
  195. SRCHN    EQU    18    ;SEARCH FOR NEXT FILE
  196. DELETE    EQU    19    ;DELETE DISK FILE (FCB ADDRESS)
  197. RDDISK    EQU    20    ;READ NEXT RECORD   "    "
  198. WRDISK    EQU    21    ;WRITE NEXT RECORD  "    "
  199. CREATE    EQU    22    ;CREATE DISK FILE   "    "
  200. RENAME    EQU    23    ;RENAME DISK FILE   "    "
  201. LOGALL    EQU    24    ;IDENTIFY ALL ON-LINE DISKS
  202. LOGSEL    EQU    25    ;IDENTIFY SELECTED DISK
  203. SETDMA    EQU    26    ;SET DMA ADDRESS VALUE
  204. ;
  205. ;--CP/M ADDRESS CONSTANTS
  206. ;
  207. BOOT    EQU    0    ;WARM START 
  208. FDOS    EQU    0005H    ;ENTRY TO FDOS
  209. TFCB    EQU    005CH    ;TRANSIENT FILE CONTROL BLOCK
  210. TBUFF    EQU    0080H    ;TRANSIENT BUFFER
  211. ;
  212. ;--FCB (FILE CONTROL BLOCK) CONSTANTS
  213. ;
  214. FCB    EQU    TFCB
  215. FCBDN    EQU    FCB+0    ;DISK NUMBER (0,1,2,3)
  216. FCBFN    EQU    FCB+1    ;FILE NAME (8 BYTES)
  217. FCBFT    EQU    FCB+9    ;FILE TYPE (3 BYTES)
  218. FCBEX    EQU    FCB+12    ;EXTENT (0 TO 15)
  219. FCBRC    EQU    FCB+15    ;REC COUNT (0 TO 128) - SIZE OF CURRENT EXTENT
  220. FCBNR    EQU    FCB+32    ;NEXT RECORD POINTER (0 TO RC)
  221. ;
  222. ;****************** MISCELLANEOUS EQUATES **************************
  223. ;
  224. ;--ASCII CONTROL CODES
  225. ;
  226. NHUL    EQU    000H    ;(^@) NULL (TIME FILL)
  227. SOH    EQU    001H    ;(^A) START OF HEADING
  228. STX    EQU    002H    ;(^B) START TEXT
  229. ETX    EQU    003H    ;(^C) END TEXT
  230. EOT    EQU    004H    ;(^D) END OF TRANSMISSION
  231. ENQ    EQU    005H    ;(^E) ENQUIRY - "WHO ARE YOU"
  232. ACK    EQU    006H    ;(^F) ACKNOWLEDGE - "YES"
  233. BEL    EQU    007H    ;(^G) BELL - HUMAN ATTENTION REQUIRED
  234. BS    EQU    008H    ;(^H) BACKSPACE
  235. HT    EQU    009H    ;(^I) HORIZONTAL TABULATION
  236. LF    EQU    00AH    ;(^J) LINE FEED
  237. VT    EQU    00BH    ;(^K) VERTICAL TABULATION
  238. FF    EQU    00CH    ;(^L) FORM FEED
  239. CR    EQU    00DH    ;(^M) CARRIAGE RETURN
  240. SO    EQU    00EH    ;(^N) SHIFT OUT - NONSTANDARD CODE FOLLOWS
  241. SI    EQU    00FH    ;(^O) SHIFT IN - RETURN TO STANDARD CODE
  242. ;
  243. DLE    EQU    010H    ;(^P) DATA LINK EXCAPE - CHANGE DATA COM CNTRL
  244. DC1    EQU    011H    ;(^Q) DEVICE CONTROL 1
  245. DC2    EQU    012H    ;(^R)    "       "    2
  246. DC3    EQU    013H    ;(^S)    "    "    3
  247. DC4    EQU    014H    ;(^T) DEVICE CONTROL 4
  248. NAK    EQU    015H    ;(^U) NEGATIVE ACKNOWLEDGE - "NO"
  249. SYN    EQU    016H    ;(^V) SYNCHRONOUS IDLE - ENABLES RESYNC
  250. ETB    EQU    017H    ;(^W) END TRANSMISSION BLOCK
  251. CAN    EQU    018H    ;(^X) CANCEL PREVIOUS DATA
  252. EM    EQU    019H    ;(^Y) END MEDIUM
  253. CLR    EQU    01AH    ;(^Z) CLEAR SCREEN ON LS-TERMINAL (ASCII: SUB)
  254. ESC    EQU    01BH    ;(^[) ESCAPE - FOR CODE EXTENSION
  255. FS    EQU    01CH    ;(^\) FILE SEPARATOR
  256. GS    EQU    01DH    ;(^]) GROUP    "
  257. RS    EQU    01EH    ;(^^) RECORD    "
  258. US    EQU    01FH    ;(^_) UNIT    "
  259. ;
  260. DEL    EQU    07FH    ;DELETE (RUBOUTS)
  261. ;
  262. ;--ZAPPLE I/O CONFIGURATION
  263. ;
  264. ZIOCHK    EQU    0F015H
  265. ZIOSET    EQU    0F018H
  266. ;
  267. ;################## PROGRAM STATEMENTS ##########################
  268. ;
  269.     ORG    100H
  270.     JMP    START
  271.     DS    40    ;STACK AREA
  272. STACK:    DS    2    ;STACK POINTER
  273. MMSEL:    DS    A    ;MODEM MODE SELECT (ORIGINATE OR ANSWER)
  274. MMODE:    DS    1    ;MODEM MODE
  275. CHCNT:    DS    1    ;CHARACTER POSITION COUNT
  276. BUFPTR:    DS    1    ;DATA BUFFER POINTER
  277. HSHAKE:    DS    1    ;HAND-SHAKE FLAG
  278. AUTOD:    DS    2    ;AUTO-DIAL FLAG
  279. ROTFLG:    DS    1    ;ROTARY DIALING FLAG
  280. ANSFLG:    DB    1    ;ANSWER MODE FLAG
  281. LFDFLG    DB    1    ;LINE FEED FLAG
  282. BLANKS:    DB    '                ' ;16 BLANKS
  283. ;
  284. ;--CONSOLE DATA BUFFER
  285. CBUFF    DB    16    ;BUFFER SIZE
  286. CBCNT    DS    1    ;COUNT OF CHARACTERS READ
  287. CBTXT    DS    16    ;CONSOLE DATA
  288. ;
  289. BDTBL:    ;BAUD RATE VALUE TABLE
  290.     DB    BAUD10    ;110 BAUD
  291.     DB    BAUD15    ;150 BAUD
  292.     DB    BAUD30    ;300 BAUD
  293.     DB    BAUD45    ;450 BAUD
  294.     DB    BAUD50    ;500 BAUD
  295.     DB    BAUD60    ;600 BAUD
  296. BDVAL:    DS    1    ;SELECTED BAUD RATE VALUE
  297. ;
  298. ;************************ PHONE NUMBERS ******************************
  299. ;
  300. ADRTBL:    ;PHONE NUMBER ADDRESS TABLE
  301.     DW    PHONEH
  302.     DW    PHONEM
  303.     DW    PHONEZ
  304.     DW    PHONEW
  305. ;
  306. PHONEM:    ;UNIV. OF MD.
  307.     DB    '4544821$'
  308.     DB    '4545201$'
  309.     DB    '4545401$'
  310.     DB    '4545405$'
  311.     DB    GS    ;GROUP SEPERATOR
  312. PHONEH:    DB    '7765253$';HOME PHONE
  313. PHONEZ:    DB    '8441212$';TIME SERVICE
  314. PHONEW:    DB    '9361212$';WEATHER SERVICE
  315. ;
  316. ;*********************** MESSAGES **********************************
  317. ;
  318. MSG1    DB    CLR,'              88-MODEM DRIVER ROUTINE'
  319.     DB    CR,LF,LF,LF
  320.     DB    'TO INITIALIZE THE SYSTEM, TYPE ONE OF THE FOLLOWING '
  321.     DB    'CHARACTERS:',CR,LF,LF
  322.     DB    'H (HAND-SHAKE INIT.), B (BAUD-RATE SEL.), '
  323.     DB    'CR (DEFAULT TO 300 BAUD)',CR,LF,LF,LF,BEL,'$'
  324. MSG1A    DB    'SPECIFY THE MODE BY TYPING THE APPROPRIATE CHARACTER '
  325.     DB    CR,LF,LF,'A --> ANSWER-MODE    O --> ORIGINATE-MODE'
  326.     DB    CR,LF,LF,'$'
  327. MSG1B    DB    CLR,'         ORIGINATE MODE -- WAITING FOR DIALTONE'
  328.     DB    CR,LF,LF,'$'
  329. MSG2    DB    BEL,'DIAL TONE RECEIVED:  COMMENSE DIALING - '
  330.     DB    'TERMINATED BY A CR',CR,LF,LF,'$'
  331. MSG2A    DB    LF,'WAITING FOR CARRIER DETECT',CR,LF,'$'
  332. MSG3    DB    LF,LF,'CONNECTION HAS BEEN BROKEN',CR,LF,'$'
  333. MSG4    DB    CLR,BEL,'CONNECTION HAS BEEN ESTABLISHED, BEGIN '
  334.     DB    'NORMAL TRANSMISSION',CR,LF,LF,LF,'$'
  335. MSG5    DB    CLR,BEL,'        RETURN TO CP/M EXECUTION'
  336.     DB    CR,LF,LF,LF,'$'
  337. MSG6    DB    BEL,'UNABLE TO OPEN FILE FOR TRANSMISSION',CR,LF,'$'
  338. MSG7    DB    BEL,'DISK READ ERROR',CR,LF,'$'
  339. MSG8    DB    BEL,'UNABLE TO CREATE FILE DUE TO INSUFFICIENT'
  340.     DB    ' DIRECTORY SPACE',CR,LF,'$'
  341. MSG9    DB    BEL,'FILE TRANSMISSION COMPLETED',CR,LF,LF,LF,'$'
  342. MSG10    DB    CR,LF,LF,LF,'READY TO RECEIVE FILE',CR,LF,LF,LF,'$'
  343. MSG11    DB    BEL,'UNABLE TO CLOSE FILE',CR,LF,'$'
  344. MSG12    DB    BEL,'ERROR IN EXTENDING FILE',CR,LF,'$'
  345. MSG13    DB    BEL,'DISK IS FULL',CR,LF,'$'
  346. MSG14    DB    BEL,'DISK DIRECTORY IS FULL',CR,LF,'$'
  347. MSG15    DB    '  HAND-SHAKE FLAG IS SET',CR,LF,LF,'$'
  348. MSG16    DB    '  BAUD-RATE SELECTION',CR,LF,LF
  349.     DB    'SELECT A BAUD RATE BY ENTERING APPROPRIATE DIGIT '
  350.     DB    'FROM THE FOLLOWING LIST:',CR,LF
  351.     DB    '1 (110 BAUD), 2 (150 BAUD), 3 (300 BAUD)',CR,LF
  352.     DB    '4 (450 BAUD), 5 (500 BAUD), 6 (600 BAUD)',CR,LF,LF,'$'
  353. MSG17    DB    CLR,'                       ANSWER MODE',CR,LF,LF,'$'
  354. MSG18    DB    'WAITING FOR RING-INDICATOR AND CARRIER-DETECT'
  355.     DB    CR,LF,LF,'$'
  356. MSG19    DB    CR,LF,LF,'                    HELLO THERE',CR,LF,LF
  357.     DB    '          PLEASE BEGIN YOUR TRANSMISSION',CR,LF,LF,'$'
  358. MSG20    DB    CR,LF,LF,'ENTER FILE NAME IN 2 PARTS AS FOLLOWS:',CR,LF
  359.     DB    '<FILENAME> CR',CR,LF
  360.     DB    '<FILETYPE> CR',CR,LF,LF,'>$'
  361. MSG21    DB    CR,LF,LF,'SELECT THE CONSOLE DEVICE FROM THE '
  362.     DB    'FOLLOWING LIST:',CR,LF
  363.     DB    '0 (TTY), 1 (CRT), 2 (BATCH), 3 (MODEM)',CR,LF,LF,'$'
  364. ;
  365. ;************************* SUBROUTINES *******************************
  366. ;
  367. ;++++++++++++++++++++++ COMMON SUBROUTINES ++++++++++++++++++++++++++
  368. ;
  369. EXIT:    ;RETURN TO CP/M
  370.     MVI    C,WRCBUF
  371.     LXI    D,MSG5
  372.     CALL    FDOS    ;TYPE EXIT MESSAGE
  373.     XRA    A    ;CLEAR A & CARRY
  374.     LHLD    STACK
  375.     SPHL        ;RESTORE CP/M STACK POINTER
  376.     RET
  377. ;
  378. CSTAT:    ;READ CONSOLE STATUS
  379.     MVI    C,CONST
  380.     CALL    FDOS
  381.     ORA    A
  382.     RET
  383. ;
  384. CRD$ST:    ;CONSOLE READ - GO TO "STOP" IF "^D"
  385.     MVI    C,RDCON
  386.     CALL    FDOS
  387.     CPI    EOT
  388.     RNZ        ;"^D" ?
  389.     POP    PSW    ;  YES, CORRECT STACK FOR NON-RETURN
  390.     XRA    A
  391.     STA    ROTFLG    ;RESET ROTARY FLAG
  392.     JMP    STOP
  393. ;
  394. MSTAT:    ;READ MODEM STATUS AND DISPLAY ON PORT 0FFH
  395.     IN    MODEM0
  396.     CMA
  397.     OUT    0FFH
  398.     CMA
  399.     RET
  400. ;
  401. MTBE:    ;MODEM TX BUFFER EMPTY TEST
  402.     CALL    MSTAT
  403.     ANI    TBE
  404.     JZ    MTBE
  405.     RET
  406. ;
  407. TCHAR:    ;TYPE A CHARACTER ON CONSOLE DEVICE
  408.     MVI    C,WRCON
  409.     MOV    E,A
  410.     CALL    FDOS
  411.     RET
  412. ;
  413. DCHAR:    ;DELETE A CHARACTER ON THE CONSOLE
  414.     MVI    A,BS
  415.     CALL    TCHAR
  416.     MVI    A,' '
  417.     CALL    TCHAR
  418.     MVI    A,BS
  419.     CALL    TCHAR
  420.     MVI    A,BEL
  421.     CALL    TCHAR
  422.     JMP    DIAL
  423. ;
  424. CRLF:    MVI    A,CR
  425.     CALL    TCHAR
  426.     MVI    A,LF
  427.     CALL    TCHAR
  428.     RET
  429. ;
  430. THEX:    ;TYPE THE PAIR OF HEX CHARACTERS IN REG A
  431.     PUSH    PSW
  432.     RAR
  433.     RAR
  434.     RAR
  435.     RAR
  436.     CALL    TNIB
  437.     POP    PSW
  438. TNIB:    ANI    0FH
  439.     CPI    10
  440.     JC    ISNUM
  441.     ADI    7
  442. ISNUM:    ADI    '0'
  443.     JMP    TCHAR
  444. ;
  445. DIALIT:    ;DIAL THE DIGIT IN REG A
  446.     ANI    00FH
  447.     OUT    MODEM3    ;SEND DIGIT TO DIALER
  448. DBUSY:    CALL    CSTAT    ;GET CONSOLE STATUS
  449.     JZ    D2    ;DATA AVAILABLE?
  450.     CALL    CRD$ST    ;  YES, TEST FOR "^D"
  451. D2:    CALL    MSTAT
  452.     ANI    DBY
  453.     JNZ    DBUSY    ;BUSY?
  454.     MVI    A,'-'    ;  NO
  455.     CALL    TCHAR    ;PROMPT FOR NEXT DIGIT
  456.     RET
  457. ;
  458. UART:    ;SET UP UART CONFIGURATION
  459.     MVI    A,ASCII1
  460.     OUT    MODEM0    ;SELECT THE NO. OF DATA BITS & PARITY TYPE
  461.     MVI    A,BDSEL
  462.     OUT    MODEM2
  463.     LDA    BDVAL
  464.     OUT    MODEM3    ;SET THE BAUD-RATE VALUE
  465.     RET
  466. ;
  467. MDM:    ;SET UP MODEM CONFIGURATION
  468.     LDA    MMSEL
  469.     OUT    MODEM2
  470.     LDA    MMODE
  471.     OUT    MODEM3
  472.     NOP!    NOP!    NOP
  473.     NOP!    NOP!    NOP
  474.     ANI    0F7H    ;RESET THE "BREAK-RLS." BIT
  475.     OUT    MODEM3
  476.     RET
  477. ;
  478. ;++++++++++++++++++ CHARACTER TX/RX SUBROUTINES +++++++++++++++++++++++
  479. ;
  480. BREAK:    ;TRANSMIT A BREAK TO REMOTE DEVICE
  481.     LDA    MMSEL
  482.     OUT    MODEM2
  483.     LDA    MMODE
  484.     ORA    MMBRK
  485.     OUT    MODEM3    ;TRANSMIT A BREAK
  486.     MVI    A,5
  487.     CALL    DELAY    ;INSERT 0.5 SEC DELAY
  488.     LDA    MMODE
  489.     ANI    0F3H
  490.     OUT    MODEM3    ;RESET BREAK & BREAK.RLS BITS
  491.     JMP    TRCHAR
  492. ;
  493. DELAY:    ;INSERT DELAY IN 100MS INCREMENTS (A.REG = INCREMENT.VAL)
  494.     MVI    B,100
  495. DEL1:    MVI    C,182    ;1MS = 182*(5.5 MICRO-SEC)
  496. DEL2:    DCR    C
  497.     JNZ    DEL2
  498.     DCR    B
  499.     JNZ    DEL1
  500.     DCR    A
  501.     JNZ    DELAY
  502.     RET
  503. ;
  504. MOVE:    ;SOURCE.ADDR=H,L   DEST.ADDR=D,E   BYTE.COUNT=A
  505.     ORA    A
  506.     RZ        ;BYTE.COUNT=0 ?
  507.     MOV    B,A    ;  NO
  508. MLOOP:    MOV    A,M
  509.     XCHG
  510.     MOV    M,A
  511.     XCHG
  512.     INX    D
  513.     INX    H
  514.     DCR    B
  515.     JNZ    MLOOP
  516.     RET
  517. ;
  518. FILE:    ;SET UP FCB (FILE.CONTROL.BLOCK) AS SPECIFIED BY OPERATOR
  519.     MVI    A,11
  520.     LXI    H,BLANKS
  521.     LXI    D,FCBFN
  522.     CALL    MOVE    ;BLANK FILL FCB <FILENAME> <FILETYPE>
  523.     MVI    C,WRCBUF
  524.     LXI    D,MSG20
  525.     CALL    FDOS    ;REQUEST <FILENAME> & <FILETYPE> FROM OPERATOR
  526.     MVI    C,RDCBUF
  527.     LXI    D,CBUFF
  528.     CALL    FDOS    ;GET <FILENAME> FROM CONSOLE
  529.     LDA    CBCNT
  530.     LXI    H,CBTXT
  531.     LXI    D,FCBFN
  532.     CALL    MOVE    ;WRITE FCB <FILENAME>
  533.     CALL    CRLF
  534.     MVI    A,'>'
  535.     CALL    TCHAR    ;PROMPT OPERATOR FOR <FILETYPE>
  536.     MVI    C,RDCBUF
  537.     LXI    D,CBUFF
  538.     CALL    FDOS    ;GET <FILETYPE> FROM CONSOLE
  539.     LDA    CBCNT
  540.     LXI    H,CBTXT
  541.     LXI    D,FCBFT
  542.     CALL    MOVE    ;WRITE FCB <FILETYPE>
  543.     CALL    CRLF
  544.     JMP    TRCHAR
  545. ;
  546. ASSIGN:    ;MAKE CONSOLE ASSIGNMENT (TEMPORARILY LIMITED TO TTY & CRT)
  547.     MVI    C,WRCBUF
  548.     LXI    D,MSG21
  549.     CALL    FDOS    ;PROMPT FOR CONSOLE SELECTION
  550.     MVI    C,RDCON
  551.     CALL    FDOS    ;READ SELECTION
  552.     PUSH    PSW
  553.     CALL    CRLF
  554.     POP    PSW
  555.     ANI    01H    ;TEMPORARILY ALLOWS FOR TTY & CRT ONLY
  556.     PUSH    PSW    ;SAVE THE SELECTION
  557.     CALL    ZIOCHK
  558.     ANI    0FCH    ;MASK OUT THE 2 LSBS'
  559.     MOV    B,A
  560.     POP    PSW    ;GET THE SELECTION
  561.     ORA    B
  562.     MOV    C,A
  563.     CALL    ZIOSET
  564.     JMP    TRCHAR
  565. ;
  566. ;+++++++++++++++++++++ FILE TX SUBROUTINES +++++++++++++++++++++++++
  567. ;
  568. OPENF:    ;OPEN DISK FILE FOR READING
  569.     MVI    C,OPEN
  570.     LXI    D,FCB
  571.     CALL    FDOS
  572.     CPI    255
  573.     JNZ    OPNOK    ;IS FILE IN DIRECTORY?
  574.     MVI    C,WRCBUF ;  NO
  575.     LXI    D,MSG6
  576.     CALL    FDOS    ;TYPE ERROR MESSAGE
  577.     POP    PSW    ;CORRECT STACK PTR FOR NON-RETURN
  578.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  579. OPNOK:    XRA    A
  580.     STA    FCBNR    ;NEXT-RECORD = 0
  581.     RET
  582. ;
  583. DISKR:    ;READ A DISK SECTOR (RECORD)
  584.     MVI    C,RDDISK
  585.     LXI    D,FCB
  586.     CALL    FDOS
  587.     CPI    0
  588.     RZ        ;NORMAL READ?
  589.     CPI    1    ;  NO
  590.     JNZ    DRERR    ;END OF FILE?
  591.     MVI    C,WRCBUF ;  YES
  592.     LXI    D,MSG9
  593.     CALL    FDOS    ;TYPE "END FILE" MSG
  594.     JMP     DRERRX
  595. DRERR:    MVI    C,WRCBUF
  596.     LXI    D,MSG7
  597.     CALL    FDOS    ;TYPE "READ ERR" MSG
  598. DRERRX:    POP    PSW    ;CORRECT STACK FOR NON-RETURN
  599.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  600. ;
  601. SHOW:    ;SHOW CHAR TRANSMITTED OR RECEIVED
  602.     CPI    LF
  603.     JZ    TCHAR
  604.     CPI    CR
  605.     JZ    TCHAR
  606.     CPI    ' '
  607.     JC    SHEX    ;ASCII CONTROL CHARACTER?
  608.     CPI    07FH    ;  NO
  609.     JC    TCHAR    ;ASCII PRINTABLE CHARACTER?
  610. SHEX:    ;SHOW HEX VALUE FOR NON-PRINTABLE CHARACTER
  611.     PUSH    PSW    ;  NO
  612.     MVI    A,'('
  613.     CALL    TCHAR
  614.     POP    PSW
  615.     CALL    THEX
  616.     MVI    A,')'
  617.     CALL    TCHAR
  618.     RET
  619. ;
  620. ;++++++++++++++++++++++ FILE RX SUBROUTINES +++++++++++++++++++++++++
  621. ;
  622. MAKEF:    ;CREATE A FILE FOR SUBSEQUENT WRITING
  623.     MVI    C,CREATE
  624.     LXI    D,FCB
  625.     CALL    FDOS
  626.     CPI    255
  627.     JNZ    MAKEOK    ;IS SUFFICIENT DIRECTORY SPACE AVAILABLE?
  628.     MVI    C,WRCBUF ;  NO
  629.     LXI    D,MSG8
  630.     CALL    FDOS    ;TYPE ERROR MSG.
  631.     POP    PSW    ;CORRECT STACK FOR NON-RETURN
  632.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  633. MAKEOK:    XRA    A
  634.     STA    FCBNR    ;NEXT-RECORD = 0
  635.     RET
  636. ;
  637. ST$BUF:    ;STORE CONTENTS OF REG A IN DISK BUFFER
  638.     PUSH    PSW
  639.     LDA    BUFPTR
  640.     MOV    E,A    ;D,E = DATA BYTE ADDRESS
  641.     MVI    D,0
  642.     INR    A
  643.     STA    BUFPTR    ;INCREMENTED BUFFER POINTER
  644. ;--STORE A BYTE A ADDRESS: TBUFF+(D,E)
  645.     LXI    H,TBUFF
  646.     DAD    D
  647.     POP    PSW
  648.     MOV    M,A
  649. ;--TEST FOR BUFFER FULL
  650.     LDA    BUFPTR
  651.     CPI    080H
  652.     RNZ        ;IS BUFFER FULL?
  653.     POP    PSW    ;YES, CORRECT STACK FOR NON-RETURN
  654.     JMP    RFULL
  655. ;
  656. DISKW:    ;WRITE A DISK SECTOR (RECORD)
  657.     MVI    C,WRDISK
  658.     LXI    D,FCB
  659.     CALL    FDOS
  660.     CPI    0
  661.     RZ        ;NORMAL WRITE?
  662.     CPI    1    ;  NO
  663.     JNZ    DR1    ;ERROR IN EXTENDING FILE?
  664.     MVI    C,WRCBUF ;  YES
  665.     LXI    D,MSG12
  666.     CALL    FDOS    ;TYPE "EXTEND ERROR" MSG
  667.     JMP    DWERRX
  668. DR1:    CPI    2
  669.     JNZ    DR2    ;IS DISK FULL?
  670.     MVI    C,WRCBUF ;  YES
  671.     LXI    D,MSG13
  672.     CALL    FDOS    ;TYPE "DISK FULL" MSG
  673.     JMP    DWERRX
  674. DR2:    MVI    C,WRCBUF
  675.     LXI    D,MSG14
  676.     CALL    FDOS    ;TYPE "DIRECTORY FULL" MSG
  677. DWERRX:    POP    PSW    ;CORRECT STACK FOR NON-RETURN
  678.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  679. ;
  680. CLOSEF:    ;CLOSE DISK FILE (WRITING COMPLETED)
  681.     MVI    C,CLOSE
  682.     LXI    D,FCB
  683.     CALL    FDOS
  684.     CPI    255
  685.     RNZ        ;SUCESSFUL CLOSE?
  686.     MVI    C,WRCBUF ;  NO
  687.     LXI    D,MSG11
  688.     CALL    FDOS    ;TYPE ERROR MESSAGE
  689.     RET
  690. ;
  691. ;*********************** MAIN PROGRAM ***************************
  692. ;
  693. START:    ;INITIALIZE OUR STACK
  694.     LXI    H,0
  695.     DAD    SP    ;HL=STACK FROM CP/M
  696.     SHLD    STACK    ;SAVE CP/M STACK POINTER
  697.     LXI    SP,STACK ;LOAD OUR STACK PIONTER
  698. RESTRT:    XRA    A
  699.     STA    HSHAKE    ;RESET HAND-SHAKE FLAG
  700.     STA    AUTOD    ;RESET AUTO-DIAL FLAG
  701.     STA    ROTFLG    ;RESET ROTARY DIALING FLAG
  702.     STA    ANSFLG    ;RESET ANSWER MODE FLAG
  703.     STA    LFDFLG    ;RESET LINE FEED FLAG
  704.     MVI    A,BAUD30
  705.     STA    BDVAL    ;DEFAULT BAUD RATE VALUE = 300
  706.     MVI    A,MMLREL
  707.     STA    MMODE    ;DEFAULT MODEM MODE = MMLREL
  708.     MVI    C,WRCBUF
  709.     LXI    D,MSG1
  710.     CALL    FDOS    ;TYPE SIGN-ON MESSAGE
  711. ;--WAIT FOR CONSOLE INPUT
  712.     MVI    C,RDCON
  713.     CALL    FDOS    ;READ CONSOLE DATA
  714.     CPI    EOT
  715.     JZ    EXIT    ;"^D"?
  716.     ANI    05FH    ;  NO, SHIFT LC ALPLH TO UC
  717.     CPI    'H'
  718.     JNZ    BAUD    ;HAND-SHAKE REQUEST?
  719.     MVI    A,0FFH    ;  YES
  720.     STA    HSHAKE    ;SET THE HAND-SHAKE FLAG TO ON
  721.     MVI    C,WRCBUF
  722.     LXI    D,MSG15
  723.     CALL    FDOS    ;TYPE "HAND-SHAKE" MSG.
  724.     JMP    D0
  725. ;--BAUD RATE MODIFICATION
  726. BAUD:    CPI    'B'
  727.     JNZ    D0    ;BAUD-RATE CHANGE REQUEST?
  728.     MVI    C,WRCBUF;  YES
  729.     LXI    D,MSG16
  730.     CALL    FDOS    ;PROMPT FOR BAUD SELECTION
  731. BA1:    CALL    CSTAT
  732.     JZ    BA1    ;HAS OPERATOR RESPONDED?
  733.     MVI    C,RDCON    ;  YES, GET THE CHARACTER
  734.     CALL    FDOS
  735.     PUSH    PSW
  736.     CPI    '4'
  737.     JC    BA2    ;BAUD-RATE > 300 ?
  738.     MVI    A,MMHREL    ;  YES, CHANGE MODEM MODE ACCORDINGLY
  739.     STA    MMODE
  740. BA2:    CALL    CRLF
  741.     POP    PSW
  742.     ANI    07H
  743.     DCR    A
  744.     MOV    E,A
  745.     MVI    D,00H    ;D,E = TBL INDEX
  746.     LXI    H,BDTBL
  747.     DAD    D
  748.     MOV    A,M
  749.     STA    BDVAL    ;NEW TRANSMISSION BAUD-RATE VALUE
  750. ;--DETERMINE MODEM MODE (ORIGINATE/ANSWER)
  751. D0:    MVI    C,WRCBUF
  752.     LXI    D,MSG1A
  753.     CALL    FDOS    ;TYPE "MODE" MESSAGE
  754.     MVI    C,RDCON
  755.     CALL    FDOS    ;READ CONSOLE DATA
  756.     CPI    EOT
  757.     JZ    RESTRT    ;"^D"?
  758.     ANI    05FH    ;  NO, SHIFT LC ALPHA TO UC
  759.     CPI    'O'
  760.     JZ    ORIG    ;ORIGINATE-MODE SELECTED?
  761.     CPI    'A'    ;  NO
  762.     JNZ    D0    ;ANSWER-MODE SELEDTED?
  763.     MVI    A,0FFH    ;  YES
  764.     STA    ANSFLG
  765.     JMP    ANSWER
  766. ;
  767. ;++++++++++++++++++++++++ ORIGINATE MODE ++++++++++++++++++++++++++++++
  768. ;
  769. ;--SET UP DIALER BAUD RATE
  770. ORIG:    MVI    A,BDSEL    ;  NO
  771.     OUT    MODEM2
  772.     MVI    A,DRATE2
  773.     OUT    MODEM3
  774. ;--GO OFF-HOOK & SET BREAK RELEASE
  775.     MVI    A,MMSELO
  776.     OUT    MODEM2
  777.     MVI    A,MMORIG
  778.     OUT    MODEM3
  779.     MVI    C,WRCBUF
  780.     LXI    D,MSG1B
  781.     CALL    FDOS    ;TYPE "WAITING" MESSAGE
  782. ;--WAIT FOR DIAL TONE OR "^D"
  783. DTONE:    CALL    CSTAT    ;GET CONSOLE STATUS
  784.     JZ    D1    ;CONSOLE DATA AVAILABLE?
  785.     CALL    CRD$ST    ;  YES, TEST FOR "^D"
  786. D1:    CALL    MSTAT    ;GET MODEM STATUS
  787.     ANI    DTD
  788.     JNZ    DTONE    ;DIAL TONE PRESENT?
  789.     MVI    C,WRCBUF ;  YES, INFORM OPERATOR
  790.     LXI    D,MSG2
  791.     CALL    FDOS
  792. ;--BEGIN DIALING SEQUENCE
  793.     MVI    A,DLSEL
  794.     OUT    MODEM2
  795.     LDA    ROTFLG
  796.     ORA    A
  797.     JZ    DIAL    ;ROTARY DIALING IN PROGRESS?
  798.     POP    PSW    ;  YES, GET ROTARY CHARACTER
  799.     JMP    AUTODL
  800. DIAL:    CALL    CRD$ST    ;CONSOLE READ
  801.     CPI    CR
  802.     JZ    UARTO    ;CARRIAGE RETURN?
  803. ;--SCREEN OUT NON-DECIMAL "DIALED" CHARACTERS
  804.     CPI    '0'    ;  NO
  805.     JC    DCHAR    ;CONTROL CHAR. OR SYMBOL?
  806.     CPI    ':'    ;  NO
  807.     JC    DIGIT    ;NON-DECIMAL CHARACTER?
  808.     JMP    AUTODL    ;  YES, PERFORM AUTO-DIALING
  809. DIGIT:    CALL    DIALIT    ;DIAL A DIGIT
  810.     JMP    DIAL
  811. ;--AUTOMATIC DIALING ROUTINE
  812. AUTODL:    LXI    H,0FFFFH
  813.     SHLD    AUTOD    ;SET AUTO-DIAL FLAG
  814.     PUSH    PSW    ;SAVE CHARACTER FOR ROTARY DIALING TEST
  815.     ANI    03H
  816.     RLC
  817.     MOV    E,A
  818.     MVI    D,0
  819.     LXI    H,ADRTBL
  820.     DAD    D    ;H,L=INDIRECT ADDRESS OF PHONE NUMBER
  821.     MOV    E,M
  822.     INX    H
  823.     MOV    D,M
  824.     XCHG        ;H,L=ADDRESS OF PHONE NUMBER
  825. AU1:    MOV    A,M
  826.     CPI    GS
  827.     JZ    ROTEND    ;END OF ROTARY GROUP?
  828.     CPI    '$'    ;  NO
  829.     JZ    UARTO-1    ;DIALING COMPLETE?
  830.     PUSH    H    ;  NO
  831.     PUSH    PSW
  832.     CALL    TCHAR    ;TYPE DIGIT TO BE DIALED
  833.     POP    PSW
  834.     CALL    DIALIT
  835.     POP    H
  836.     INX    H
  837.     JMP    AU1
  838. ;--SET UP UART CONFIGURATION
  839.     PUSH    H    ;SAVE ADDRESS POINTER FOR ROTARY DIALING
  840. UARTO:    MVI    C,WRCON
  841.     MVI    E,LF
  842.     CALL    FDOS    ;SEND "LINE-FEED" TO CONSOLE
  843.     CALL    UART    ;ESTABLISH UART CONFIGURATION
  844. ;--WAIT FOR CTS (CARRIER DETECT)
  845.     MVI    C,WRCBUF
  846.     LXI    D,MSG2A
  847.     CALL    FDOS    ;TYPE "WAITING" MESSAGE
  848.     LXI    B,0FFFFH ;INITIALIZE TIME-OUT
  849.     PUSH    B
  850. CTS1:    POP    B
  851.     DCX    B
  852.     MOV    A,B
  853.     ORA    C
  854.     JZ    ROTARY    ;TIME-OUT EXPIRED?
  855.     PUSH    B    ;  NO
  856.     CALL    CSTAT    ;GET CONSOLE STATUS
  857.     JZ    C1    ;CONSOLE DATA AVAILABLE?
  858.     CALL    CRD$ST    ;  YES, TEST FOR "^D"
  859. C1:    CALL    MSTAT    
  860.     ANI    CTS
  861.     JZ    CTS1    ;CLEAR TO SEND?
  862.     JMP    MDMO    ;  YES, SET UP MODEM CONFIGURATION
  863. ;--ROTARY DIALING SEQUENCE
  864. ROTARY:    LDA    AUTOD
  865.     ORA    A
  866.     JZ    STOP    ;AUTO-DIAL MODE?
  867.     POP    H    ;  YES, GET PH# ADDRESS
  868.     INX    H
  869.     POP    PSW    ;GET CHARACTER WHICH INITIATED AUTO-DIAL
  870.     CPI    'M'
  871.     JNZ    STOP    ;ROTARY CHARACTER?
  872.     PUSH    PSW    ;  YES, SAVE FOR NEXT ITERATION
  873.     MVI    A,0FFH
  874.     STA    ROTFLG    ;SET ROTARY DIALING FLAG
  875.     SHLD    ADRTBL+2;STORE INCREMENTED POINTER
  876.     JMP    STOP    ;TRY THE NEXT PHONE NUMBER
  877. ROTEND:    LXI    H,PHONEM
  878.     SHLD    ADRTBL+2;RESTORE ORIGINAL POINTER
  879.     XRA    A
  880.     STA    ROTFLG    ;RESET ROTARY DIALING FLAG
  881.     POP    PSW    ;RESTORE STACK TO NORMAL
  882.     JMP    STOP
  883. ;--SET UP MODEM CONFIGURATION
  884. MDMO:    MVI    A,MMSELO
  885.     STA    MMSEL
  886.     CALL    MDM
  887. ;--PROMPT OPERATOR TO BEGIN COMMUNICATIONS
  888.     MVI    C,WRCBUF 
  889.     LXI    D,MSG4
  890.     CALL    FDOS    ;TYPE START TX MESSAGE
  891.     XRA    A
  892.     STA    ROTFLG    ;RESET ROTARY DIALING FLAG
  893.     JMP    TRCHAR
  894. ;
  895. ;++++++++++++++++++++++++ ANSWER MODE +++++++++++++++++++++++++++++++++
  896. ;
  897. ANSWER:    MVI    C,WRCBUF
  898.     LXI    D,MSG17
  899.     CALL    FDOS    ;TYPE "ANSWER MODE" MSG
  900.     MVI    A,0FFH
  901.     STA    LFDFLG    ;SET LINE.FEED FLAG
  902.     CALL    UART    ;SET UP UART CONFIGURATION
  903.     MVI    A,MMSELA
  904.     STA    MMSEL
  905.     CALL    MDM    ;SET UP MODEM CONFIGURATION
  906.     MVI    C,WRCBUF
  907.     LXI    D,MSG18
  908.     CALL    FDOS    ;TYPE "WAITING" MESSAGE
  909. ;--WAIT FOR CTS (RING INDICATOR & CARRIER DETECT)
  910. AN0:    CALL    CSTAT
  911.     JZ    AN1    ;CONSOLE DATA AVAILABLE?
  912.     MVI    C,RDCON    ;  YES
  913.     CALL    FDOS    ;READ CONSOLE DATA
  914.     CPI    EOT
  915.     JNZ    AN1    ;"^D"?
  916.     XRA    A    ;  YES
  917.     STA    ANSFLG    ;RESET ANSWER MODE FLAG
  918.     JMP    STOP
  919. AN1:    IN    MODEM0    ;  NO
  920.     ANI    CTS
  921.     JZ    AN0    ;HAS CONNECTION BEEN ESTABLISHED?
  922.     MVI    C,WRCBUF;  YES, INFORM CONSOLE OPERATOR
  923.     LXI    D,MSG4
  924.     CALL    FDOS
  925. ;--TRANSMIT SIGN-ON MESSAGE TO REMOTE DEVICE
  926.     LXI    H,MSG19    ;H,L = MESSAGE ADDRESS
  927. SIGNON:    CALL    MSTAT
  928.     ANI    TBE
  929.     JZ    SIGNON    ;TX BUFFER EMPTY?
  930.     MOV    A,M    ;  YES, GET NEXT CHARACTER
  931.     CPI    '$'
  932.     JZ    TRCHAR    ;MESSAGE COMPLETE?
  933.     OUT    MODEM1    ;  NO, TRANSMIT THE CHARACTER
  934.     INX    H
  935.     JMP    SIGNON
  936. ;
  937. ;+++++++++++++++++ CHARACTER TX/RX ROUTINE +++++++++++++++++++++++++++
  938. ;
  939. ;--TEST FOR LOSS OF "CTS"
  940. TRCHAR:    IN    MODEM0
  941.     ANI    CTS
  942.     JZ    STOP    ;LOSS OF CTS?
  943. ;--TEST FOR "LINE CHARACTER" AVAILABILITY
  944.     IN    MODEM0    ;  NO
  945.     ANI    RDA
  946.     JZ    NOCHAR    ;RECEIVE DATA AVAILABLE?
  947.     IN    MODEM1    ;  YES, READ DATA
  948.     PUSH    PSW
  949.     CALL    TCHAR    ;TYPE RECEIVED CHARACTER
  950.     LDA    LFDFLG
  951.     ORA    A
  952.     JZ    TR1    ;LINE FEED FLAG SET?
  953.     POP    PSW    ;  YES
  954.     CPI    CR
  955.     JNZ    TR1+1    ;CHARRIAGE RETURN?
  956. TRLF:    MVI    A,LF    ;  YES, SEND A LINE FEED
  957.     CALL    TCHAR
  958. TR0:    IN    MODEM0
  959.     ANI    TBE
  960.     JZ    TR0    ;TX BUFFER EMPTY?
  961.     MVI    A,LF    ;  YES
  962.     OUT    MODEM1    ;TRANSMIT LINE FEED TO LINE
  963.     JMP    NOCHAR
  964. TR1:    POP    PSW
  965.     CPI    DC4
  966.     JZ    TXFILE    ;"^T"?
  967.     CPI    DC2    ;  NO
  968.     JZ    RXFILE    ;"^R"?
  969.     CPI    EOT    ;  NO
  970.     JNZ    NOCHAR    ;"^D"?
  971.     XRA    A    ;  YES
  972.     STA    ANSFLG    ;RESET THE ANSER.MODE FLAG
  973.     JMP    STOP    ;TERMINATE ANSWER MODE
  974. ;--TEST FOR "LOCAL CHARACTER" AVAILABILITY
  975. NOCHAR:    CALL    CSTAT    ;GET CONSOLE STATUS
  976.     JZ    TRCHAR    ;CONSOLE DATA AVAILABLE?
  977.     CALL    CRD$ST    ;  YES, READ DATA & TEST FOR "^D"
  978.     CPI    DC4    
  979.     JZ    TXFILE    ;"^T"?
  980.     CPI    DC2    ;  NO
  981.     JZ    RXFILE    ;"^R"?
  982.     CPI    SOH
  983.     JZ    ASSIGN    ;IF "^A" THEN CHANGE CONSOLE ASSIGNMENT
  984.     CPI    STX
  985.     JZ    BREAK    ;IF "^B" THEN TRANSMIT A "BREAK"
  986.     CPI    ACK
  987.     JZ    FILE    ;IF "^F" THEN SET UP NEW FILE NAME
  988.     OUT    MODEM1    ;TRANSMIT DATA TO "LINE"
  989.     CPI    CR
  990.     JNZ    TRCHAR    ;CARRIAGE RETURN?
  991.     LDA    LFDFLG    ;  YES
  992.     ORA    A
  993.     JNZ    TRLF    ;LINE FEED FLAG SET?
  994.     JMP    TRCHAR    ;  NO
  995. ;
  996. ;+++++++++++++++++++++ FILE TX ROUTINE ++++++++++++++++++++++++++
  997. ;
  998. TXFILE:    CALL    OPENF    ;OPEN DISK FILE FOR READING
  999.     MVI    A,80H
  1000.     STA    BUFPTR    ;INITIALIZE THE BUFFER POINTER
  1001.     XRA    A
  1002.     STA    CHCNT    ;INITIALIZE CHARACTER POSITION COUNT
  1003. ;--START OF BYTE TRANSMIT LOOP
  1004. TXBYTE:    CALL    CSTAT    ;GET CONSOLE STATUS
  1005.     JZ    TF0    ;DATA AVAILABLE?
  1006.     MVI    C,RDCON    ;  YES
  1007.     CALL    FDOS
  1008.     CPI    EOT
  1009.     JZ    TRCHAR    ;"^D" ?
  1010. TF0:    IN    MODEM0    ;  NO
  1011.     ANI    RDA
  1012.     JZ    TF1A    ;RX DATA AVAILABLE?
  1013.     IN    MODEM1    ;  YES
  1014.     CPI    EOT
  1015.     JZ    TRCHAR    ;"^D"?
  1016. TF1A:    LDA    BUFPTR    ;  NO
  1017.     CPI    80H
  1018.     JNZ    TF1    ;BUFFER EMPTY?
  1019. ;--READ A SECTOR & EXIT IF END OF FILE
  1020.     CALL    DISKR    ;  YES
  1021.     XRA    A
  1022. TF1:    MOV    E,A    ;D,E = DATA BYTE ADDRESS
  1023.     MVI    D,0
  1024.     INR    A
  1025.     STA    BUFPTR    ;INCREMENTED BUFFER POINTER
  1026. ;--READ A BYTE AT ADDRESS: TBUFF+(D,E)
  1027.     LXI    H,TBUFF
  1028.     DAD    D
  1029.     MOV     A,M
  1030.     PUSH    PSW
  1031. ;--WAIT FOR UART TX BUFFER EMPTY
  1032. TF2:    CALL    MSTAT
  1033.     ANI    TBE
  1034.     JZ    TF2    ;UART TX BUFFER EMPTY?
  1035.     POP    PSW    ;  YES
  1036.     CPI    ETB
  1037.     JZ    TFEND    ;(^W) END TRANSMISSION BLOCK?
  1038.     CPI    HT    ;  NO
  1039.     JNZ    TF3    ;HORIZONTAL TAB?
  1040. ;--TRANSLATE HT INTO APPROPRIATE NUMBER OF SPACES
  1041.     LDA    CHCNT    ;  YES
  1042. SPACES:    MOV    B,A
  1043.     CALL    MTBE    ;INSURE MODEM TX BUFFER EMPTY
  1044.     MVI    A,' '
  1045.     OUT    MODEM1
  1046.     PUSH    B
  1047.     CALL    TCHAR
  1048.     POP    B
  1049.     INR    B
  1050.     MOV    A,B
  1051.     ANI    07H    ;MOD 8 COUNT VALUE
  1052.     JNZ    SPACES    ;FINAL SPACE SENT?
  1053.     STA    CHCNT
  1054.     JMP    TXBYTE
  1055. ;--SEND DATA BYTE & UPDATE CHCNT (CHARACTER POSITION COUNT)
  1056. TF3:    PUSH    PSW
  1057.     CALL    SHOW    ;DISPLAY BYTE ON CONSOLE
  1058.     POP    PSW
  1059.     OUT    MODEM1
  1060.     CPI    LF
  1061.     JZ    TFEOL    ;"LF" SIGNALS END OF TEXT LINE
  1062.     LDA    CHCNT
  1063.     INR    A
  1064.     STA    CHCNT    ;INCREMENTED CHAR POSITION COUNT
  1065.     JMP    TXBYTE
  1066. ;--PERFORM END OF LINE PROCESSING
  1067. TFEOL:    XRA    A
  1068.     STA    CHCNT    ;RESET CHAR POSITION COUNT
  1069.     LDA    HSHAKE
  1070.     ORA    A
  1071.     JNZ    TF4    ;HAND-SHAKE REQUIRED?
  1072.     MVI    A,5    ;  NO, GENERATE 0.5 SEC DELAY
  1073.     CALL    DELAY
  1074.     JMP    TXBYTE    ;BEGIN NEXT LINE
  1075. ;--PERFORM END OF TEXT LINE "HANDSHAKING"
  1076. TF4:    CALL    CSTAT
  1077.     JZ    TF4A    ;CONSOLE CHAR RECEIVED?
  1078.     JMP    TFEND    ;  YES, TERMINATE FILE TX
  1079. TF4A:    CALL    MSTAT    ;
  1080.     ANI    RDA
  1081.     JZ    TF4    ;RECEIVE DATA AVAILABLE?
  1082.     IN    MODEM1    ;  YES
  1083.     CPI    LF
  1084.     JNZ    TF4    ;"LINE FEED" RECEIVED FROM LINE?
  1085.     MVI    A,1    ;  YES, INSERT 100MS DELAY
  1086.     CALL    DELAY
  1087.     JMP    TXBYTE    ;BEGIN NEXT LINE
  1088. TFEND:    CALL    CRLF
  1089.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  1090. ;
  1091. ;+++++++++++++++++++++ FILE RX ROUTINE +++++++++++++++++++++++++++
  1092. ;
  1093. RXFILE:    MVI    C,DELETE
  1094.     LXI    D,FCB
  1095.     CALL    FDOS    ;DELETE NAMED FILE (IF IT EXISTS)
  1096.     CALL    MAKEF    ;CREATE FILE FOR RX DATA
  1097.     XRA    A
  1098.     STA    BUFPTR    ;INITIALIZE THE BUFFER POINTER
  1099.     MVI    C,WRCBUF
  1100.     LXI    D,MSG10
  1101.     CALL    FDOS    ;TYPE "READY" MSG
  1102. ;--RECEIVE A CHARACTER FROM THE REMOTE DEVICE
  1103. RCV:    IN    MODEM0
  1104.     ANI    RDA
  1105.     JNZ    GOTONE    ;RECEIVED DATA AVAILABLE?
  1106. ;--SUPPORT CHARACTER TX FROM CONSOLE
  1107.     CALL    CSTAT    ;  YES, GET CONSOLE STATUS
  1108.     JZ    RCV    ;DATA AVAILABLE?
  1109.     MVI    C,RDCON    ;  YES
  1110.     CALL    FDOS
  1111.     CPI    EOT
  1112.     JZ    RFEND    ;"^D" ?
  1113.     OUT    MODEM1    ;  NO, TRANSMIT CHARACTER
  1114.     JMP    RCV
  1115. ;--READ CHARACTER FROM EXTERNAL DEVICE
  1116. GOTONE:    IN    MODEM1
  1117.     CPI    ETB
  1118.     JZ    RF0    ;"^W"?
  1119.     CPI    EOT    ;  NO
  1120.     JZ    RFEND    ;"^D"?
  1121.     CPI    CR    ;  NO
  1122.     JZ    RFCR    ;CARRIAGE RETURN?
  1123.     CPI    DEL    ;  NO
  1124.     JZ    RCV    ;DO NOT RECORD RUBOUTS
  1125.     CPI    ' '
  1126.     JC    RCV    ;ASCII CONTROL CHARACTER?
  1127.     PUSH    PSW    ;  NO
  1128.     CALL    TCHAR    ;DISPLAY CHARACTER ON CONSOLE
  1129.     POP    PSW
  1130. RF0:    CALL    ST$BUF    ;STORE CHARACTER IN DISK BUFFER
  1131.     JMP    RCV
  1132. ;--CARRIAGE RETURN PROCESSING
  1133. RFCR:    PUSH    PSW
  1134.     CALL    TCHAR    ;TYPE "CR"
  1135.     POP    PSW
  1136.     CALL    ST$BUF    ;PUT IT IN BUFFER
  1137.     MVI    A,LF
  1138.     PUSH    PSW
  1139.     CALL    TCHAR    ;TYPE "LF"
  1140.     POP    PSW
  1141.     CALL    ST$BUF    ;PUT IT IN BUFFER
  1142.     LDA    LFDFLG
  1143.     ORA    A
  1144.     JZ    RCV    ;LINE.FEED FLAG SET?
  1145. RF1:    IN    MODEM0    ;  YES
  1146.     ANI    TBE
  1147.     JZ    RF1    ;TX BUFFER EMPTY?
  1148.     MVI    A,LF    ;  YES
  1149.     OUT    MODEM1    ;SEND LINE.FEED TO REMOTE DEVICE
  1150.     JMP    RCV
  1151. ;--BUFFER IS FULL - WRITE A DISK SECTOR
  1152. RFULL:    CALL    DISKW    ;  YES
  1153.     XRA    A
  1154.     STA    BUFPTR
  1155.     JMP    RCV
  1156. ;--WRITE FINAL SECTOR & CLOSE FILE
  1157. RFEND:    LDA    BUFPTR
  1158.     MOV    E,A
  1159.     MVI    D,0
  1160.     LXI    H,TBUFF
  1161.     DAD    D
  1162.     MVI    A,01AH    ;"^Z" INDICATES END OF FILE
  1163.     MOV    M,A
  1164.     CALL    DISKW    ;WRITE THE LAST RECORD
  1165.     CALL    CLOSEF
  1166.     JMP    TRCHAR    ;REVERT TO CHARACTER MODE
  1167. ;
  1168. ;+++++++++++++++++ TERMINATE COMMUNICATIONS +++++++++++++++++++++++
  1169. ;
  1170. ;--SEND A BREAK, HANG UP THE PHONE, INFORM THE OPERATOR
  1171. STOP:    MVI    A,MMSELO
  1172.     OUT    MODEM2
  1173.     MVI    A,MMTERM
  1174.     OUT    MODEM3
  1175.     MVI    C,WRCBUF
  1176.     LXI    D,MSG3
  1177.     CALL    FDOS    ;TYPE TERMINATION MESSAGE
  1178. ;--CONTINUE TO LOOP TILL LOSS OF CTS (CARRIER DETECT)
  1179. CTS2:    CALL    MSTAT
  1180.     ANI    CTS
  1181.     JNZ    CTS2    ;HAS CTS BEEN RESET?
  1182.     MVI    A,30    ;   YES
  1183.     CALL    DELAY    ;3 SECOND DELAY
  1184.     LDA    ROTFLG
  1185.     ORA    A
  1186.     JNZ    ORIG    ;ROTARY DIALING IN PROGRESS?
  1187.     LDA    ANSFLG    ;  NO
  1188.     ORA    A
  1189.     JNZ    ANSWER    ;ANSWER MODE?
  1190.     JMP    RESTRT    ;  NO
  1191.     END    START
  1192.