]>
Commit | Line | Data |
---|---|---|
e58a7a25 L |
1 | IF NOT lasm\r |
2 | .printx * CPXSYS.ASM *\r | |
3 | ENDIF ;NOT lasm\r | |
4 | ; KERMIT - (Celtic for "FREE")\r | |
5 | ;\r | |
6 | ; This is the CP/M-80 implementation of the Columbia University\r | |
7 | ; KERMIT file transfer protocol.\r | |
8 | ;\r | |
9 | ; Version 4.0\r | |
10 | ;\r | |
11 | ; Copyright June 1981,1982,1983,1984,1985\r | |
12 | ; Columbia University\r | |
13 | ;\r | |
14 | ; Originally written by Bill Catchings of the Columbia University Center for\r | |
15 | ; Computing Activities, 612 W. 115th St., New York, NY 10025.\r | |
16 | ;\r | |
17 | ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,\r | |
18 | ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many\r | |
19 | ; others.\r | |
20 | ;\r | |
21 | ; This file contains the system-dependent code and data for KERMIT.\r | |
22 | ; It will be probably be broken into independent files to generate\r | |
23 | ; overlays for the various systems, one or more overlay possible\r | |
24 | ; from each file. For now, we will leave it in one piece.\r | |
25 | ;\r | |
26 | ; revision history:\r | |
27 | ;\r | |
28 | ;\r | |
29 | ; Edit 40, 28-Aug-89 by Mike Freeman of Bonneville Power Administration,\r | |
30 | ; P.O. Box 491, Vancouver WA 98666 USA, Telephone (206)690-2307:\r | |
31 | ; Home address: 301 N.E. 107th Street; Vancouver, WA 98685 USA\r | |
32 | ; Home telephone: (206)574-8221\r | |
33 | ; added support for Hewlett-Packard HP-125 Business Assistant computer\r | |
34 | ; running a HP-modified CP/M Version 2.2; communications on\r | |
35 | ; DAta Comm 1 or Data Comm 2 (8th-bit quoting must be used on\r | |
36 | ; Data Comm 2 to transfer binary files as Data Comm 2 only supports\r | |
37 | ; a 7-bit data path); printer cannot be used with communications on\r | |
38 | ; Data Comm 2 (the printer port).\r | |
39 | ; edit 39, 4 August, 1987b by OBSchou for Charles Lasner re. DECMATE II\r | |
40 | ; fixes to set xon/off control off for the duration of Kermit-80.\r | |
41 | ;\r | |
42 | ; His header reads:\r | |
43 | ;\r | |
44 | ; IBM mode restore program\r | |
45 | ;\r | |
46 | ; This routine must be run after using CP4DMF (and KERMIT-80) to restore\r | |
47 | ; the normal handling of XON/XOFF; the user may also elect to cold-boot\r | |
48 | ; the DECMATE instead.\r | |
49 | ;\r | |
50 | ; acknowledgments and limitations.\r | |
51 | ;\r | |
52 | ; This program is based on DECMATE specific implementation details\r | |
53 | ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE\r | |
54 | ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.\r | |
55 | ;\r | |
56 | ; usage consists of merely:\r | |
57 | ;\r | |
58 | ; CP4DMF run xon/xoff disable program\r | |
59 | ; KERMIT80 then run kermit\r | |
60 | ; <KERMIT-80 commands used normally here, including SET IBM ON>\r | |
61 | ; CP4DMU run this program to restore normal XON\r | |
62 | ;\r | |
63 | ; unless CP4DMU is run following KERMIT-80, the normal handling of\r | |
64 | ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another\r | |
65 | ; alternative).\r | |
66 | ;\r | |
67 | ; [Note - These edits now included in the init/de-init code]\r | |
68 | ;\r | |
69 | ; edit 38, 23 July, 1987 by OBSchou. Moved out commonly used code \r | |
70 | ; to CPXCOM.ASM, and adjusted this (ond other family) files accordingly.\r | |
71 | ; Also filtered out code now in other family files.\r | |
72 | ;\r | |
73 | ; edit 37 , 15 July 1987 by OBSchou for David Moore, who has submitted \r | |
74 | ; code for Teletek SYSTEMASTER (teletek) and for an ADM 22 terminal.\r | |
75 | ;\r | |
76 | ; edit 36 28 Jan 87 by OBSchou.\r | |
77 | ; Removed the printx etc and should only have this file if a system\r | |
78 | ; does not have a family file.\r | |
79 | ;\r | |
80 | ; edit 35 1st Dec 1986 by OBSchou. Added test for Amstrad PCW range (PCW)\r | |
81 | ; Links to CPXPCW.ASM, which was submitted by Ian Young, Lattice \r | |
82 | ; Logic Systems.\r | |
83 | ;\r | |
84 | ; edit 34 20 August by OBSchou for Brian Robertson, Aberdeen University:\r | |
85 | ; I have discovered a bug in my code for the BBC/Z80 version of Kermit. \r | |
86 | ; At startup the transmitter baud rate is read from the serial ULA. \r | |
87 | ; The TX and RX baud rates are then reset to this value and the \r | |
88 | ; value is stored in location 'baud:' for the STATUS (or SHOW) \r | |
89 | ; command. That is how it is supposed to work ! Unfortunately \r | |
90 | ; my code at present "misreads" the initial TX baud rate - there \r | |
91 | ; is some bit manipulation that needs to be done to extract the \r | |
92 | ; correct value.\r | |
93 | ;\r | |
94 | ; edit 33 30-May-86 OBSchou. Added two new enties to the overly. One for \r | |
95 | ; printer status and the other for the address of the family of \r | |
96 | ; computer using the overlay. If it is still in CPXSYS.ASM then it \r | |
97 | ; is a dollar only.\r | |
98 | ;\r | |
99 | ;edit 32, 27 May, 1986 by OBSchou Loughborough University for\r | |
100 | ; B Robertson, Aberdeen Univ. Computing Centre. Any mistakes my fault.\r | |
101 | ; Add support for APPLE II with serial cards based on the 6850 ACIA.\r | |
102 | ; Mod 380Z support to allow both MDS (5 1/4" discs) and FDS (8" discs)\r | |
103 | ; configurations.\r | |
104 | ;\r | |
105 | ; edit 31, 22 April, 1986, OBSchou. \r | |
106 | ; Kermit version 4.06 starts here. All previous edits have been \r | |
107 | ; put aside (leave in a BWR file?). Hived off some definitions \r | |
108 | ; to the CPSDEF.ASM file as that is where they belong. \r | |
109 | ; Start on splitting off individual \r | |
110 | ; systems from this huge file. It is done using the LINK facility \r | |
111 | ; LASM. We link to a collection of systems under CPXxxx.ASM.\r | |
112 | ; I have started with the systems I know, the Torch, Cifer and \r | |
113 | ; pci2651. These will all be held under CPXTOR.ASM\r | |
114 | ;\r | |
115 | ;\r | |
116 | ; Keep module name, edit number, and last revision date in memory.\r | |
117 | family: db 'CPXSYS.ASM (40) 28-Aug-89 $' ; now a family...\r | |
118 | ;\r | |
119 | \r | |
120 | \r | |
121 | ; Processor speed in units of 100KHz\r | |
122 | ; for cpt85xx, advance, apple,bbc,px8 & rm380z timing loop [12]\r | |
123 | IF rm380z \r | |
124 | cpuspd SET 40 ; 4.0 MHz CPU\r | |
125 | ENDIF; rm380z \r | |
126 | \r | |
127 | IF disc OR mmate OR s1008 OR access \r | |
128 | cpuspd SET 40 ; 4.0 MHz CPU\r | |
129 | ENDIF ;disc OR mmate OR s1008 OR access \r | |
130 | \r | |
131 | IF bbc ;[9]\r | |
132 | cpuspd SET 60 ; BBC with 6Mhz Z80\r | |
133 | ENDIF;bbc\r | |
134 | \r | |
135 | \r | |
136 | ; the basics...\r | |
137 | \r | |
138 | IF gener\r | |
139 | batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP\r | |
140 | defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP\r | |
141 | crtio equ 01010101B ; use CRT: device\r | |
142 | ptrio equ 01010110B ; use PTR: device\r | |
143 | ttyio equ 00000000B ; use TTY: device\r | |
144 | uc1io equ 01010111B ; use UC1: device\r | |
145 | ur1io equ 01101010B ; use UR1: device\r | |
146 | ur2io equ 01111110B ; use UR2: device\r | |
147 | ENDIF;gener\r | |
148 | \r | |
149 | IF robin\r | |
150 | batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP\r | |
151 | defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP\r | |
152 | lptio EQU 054H ;I/O byte CON=TTY,LIST=CRT,READER=PTR,PUNCH=PTP\r | |
153 | gppio EQU 057H ;I/O byte CON=UC1,LIST=CRT,READER=RDR,PUNCH=PTP\r | |
154 | ENDIF;robin\r | |
155 | \r | |
156 | \r | |
157 | IF dmII OR bbc ;[22]\r | |
158 | batio EQU 042H ;I/O byte CON=BAT,LIST=CRT,READER=RDR\r | |
159 | defio EQU 081H ;I/O byte CON=CRT,LIST=LPT,READER=RDR\r | |
160 | ENDIF;dmII\r | |
161 | \r | |
162 | IF mikko\r | |
163 | batio EQU 10110010B ; I/O byte console => serial line\r | |
164 | defio EQU 10000001B ; I/O byte console => CRT and Keyboard\r | |
165 | ENDIF;mikko\r | |
166 | ;\f\r | |
167 | IF lobo ;[hh]\r | |
168 | mnport EQU 0F7E4H ;Modem data port A\r | |
169 | mnprts EQU 0F7E5H ;Modem status/conrtol port A\r | |
170 | baudrt EQU 0F7D0H ;Baud rate port A\r | |
171 | output EQU 04H ;Transmit buffer empty\r | |
172 | input EQU 01H ;Receive data available\r | |
173 | z80 SET TRUE ;a good z80, here\r | |
174 | ENDIF;lobo\r | |
175 | \r | |
176 | IF osi\r | |
177 | mnport EQU 0CF01H ;Modem data port\r | |
178 | mnprts EQU 0CF00H ;Modem status port\r | |
179 | output EQU 02H ;Transmitter empty\r | |
180 | input EQU 01H ;Input data available\r | |
181 | z80 SET FALSE ;I don't know...\r | |
182 | ENDIF;osi\r | |
183 | \r | |
184 | IF vector\r | |
185 | mnport EQU 04H ;Modem data port\r | |
186 | mnprts EQU 05H ;Modem status port\r | |
187 | output EQU 01H ;Transmitter empty\r | |
188 | input EQU 02H ;Input data available\r | |
189 | z80 SET FALSE ;I don't know...\r | |
190 | ENDIF;vector\r | |
191 | \r | |
192 | IF delphi ;[7]\r | |
193 | mnport EQU 22H ;[7] Modem data port\r | |
194 | mnprts EQU 23H ;[7] Modem status port\r | |
195 | output EQU 01H ;[7] Transmitter empty\r | |
196 | input EQU 02H ;[7] Input data available\r | |
197 | baudrt equ 29h ;[7] Baud rate port for channel 2 (default)\r | |
198 | z80 SET true ;[7] We're using the z80 side of the dual processor\r | |
199 | ENDIF;[7] delphi\r | |
200 | \r | |
201 | IF trs80\r | |
202 | ;NEEDS display definition (e.g. trs80lb or trs80pt)\r | |
203 | mnport EQU 0F4H ;Modem data port (0F5H for port B)\r | |
204 | mnprts EQU 0F6H ;Modem status port (0F7H for port B)\r | |
205 | output EQU 04H ;Transmitter empty\r | |
206 | input EQU 01H ;Input data available\r | |
207 | z80 SET TRUE ;[hh] All TRS-80's but the CoCo\r | |
208 | ENDIF;trs80\r | |
209 | \r | |
210 | IF teletek\r | |
211 | mnport EQU 00H ;Modem data port (02 for port B (console))\r | |
212 | mnprts EQU 01H ;Modem status port (03 for port B (console))\r | |
213 | baudrt EQU 08H ;ctc0 control port (09 for port B (console))\r | |
214 | output EQU 04H ;Transmitter empty\r | |
215 | input EQU 01H ;Input data available\r | |
216 | z80 SET TRUE ;All Teleteks\r | |
217 | ENDIF;teletek\r | |
218 | \r | |
219 | IF osbrn1\r | |
220 | ;Osborne 1 uses 6850 ACIA, but memory mapped. Derived from Apple.\r | |
221 | BAUDRT EQU 0EFC1H ;Memory location where baud rates are stored.\r | |
222 | OSTOP EQU 4000H ;Where we move OSMOVE to at startup\r | |
223 | OSPORT EQU 2A01H ;Communications Port.\r | |
224 | OSPRTS EQU 2A00H ;Communications Port Status.\r | |
225 | OUTPUT EQU 02H ;Output Buffer Empty.\r | |
226 | INPUT EQU 01H ;Input Register Full.\r | |
227 | OSBIN1 EQU 57H ;First Init Character for 6850 ACIA (Reset)\r | |
228 | ;(I would have thought 03, but prom code writes 57 there)\r | |
229 | OSBI12 EQU 55H ;Second Init Character for ACIA (8-bits, 1200)\r | |
230 | OSBI03 EQU 56H ;Second init char. for ACIA (8 bits, 300)\r | |
231 | ;(don't ask.. I don't know why SETUP writes 55 and 56 either)\r | |
232 | z80 SET TRUE ;[hh] a z80 here, also\r | |
233 | ENDIF;osbrn1\r | |
234 | \r | |
235 | IF robin\r | |
236 | ;Those definitions below that are commented out are just for information\r | |
237 | ;***** NOT generally found in distributed documentation ****\r | |
238 | \r | |
239 | ;pbausl EQU 90H ;The Baud-Rate register.\r | |
240 | prntst EQU 49H ;Printer\r | |
241 | ;prndat EQU 48H\r | |
242 | contst EQU 41H ;Console\r | |
243 | ;condat EQU 40H\r | |
244 | gentst EQU 51H ;General port.\r | |
245 | ;gendat EQU 50H\r | |
246 | comtst EQU 59H ;COMM-Port\r | |
247 | ;comdat EQU 58H\r | |
248 | ;output EQU 01H ;Output ready bit.\r | |
249 | ;input EQU 02H ;Input ready bit.\r | |
250 | z80 SET TRUE ; This one's a Z80.\r | |
251 | ENDIF;robin\r | |
252 | \r | |
253 | IF s1008 ;[29]\r | |
254 | mnport equ 00 ;printer port data\r | |
255 | mnprts equ 01 ;printer port status\r | |
256 | output equ 4 ;transmitter ready\r | |
257 | input equ 2 ;receiver ready\r | |
258 | z80 equ FALSE ;not important\r | |
259 | ENDIF;s1008 [29]\r | |
260 | \r | |
261 | IF mmate ;[29]\r | |
262 | mnport EQU 89H ;MODEM data port\r | |
263 | mnprts EQU 8BH ;MODEM status/control port\r | |
264 | output EQU 04H ;Transmit buffer empty, ready to send\r | |
265 | input EQU 01H ;Receive data available\r | |
266 | baudrt EQU 93H ;MODEM baud rate port\r | |
267 | ;NOTE - also used for console\r | |
268 | z80 SET TRUE\r | |
269 | ENDIF;mmate [29]\r | |
270 | \r | |
271 | IF disc ;[29]\r | |
272 | mnport EQU 05 ;Discovery 83U port B data\r | |
273 | mnprts EQU 04 ;Discovery 83U port B status/command\r | |
274 | output EQU 04 ;Transmit buffer empty\r | |
275 | input EQU 01 ;Receiver ready\r | |
276 | z80 SET TRUE\r | |
277 | ENDIF;disc [29]\r | |
278 | \r | |
279 | IF cmemco ;[25]\r | |
280 | tuart EQU 020H ;TU-ART address\r | |
281 | mnport EQU tuart+1 ;Modem data port\r | |
282 | mnprts EQU tuart ;Modem status port\r | |
283 | output EQU 080H ;Transmitter empty\r | |
284 | input EQU 040H ;Input data available\r | |
285 | baudrt EQU tuart ;Baud rate port\r | |
286 | ;Note: Needs terminal definition \r | |
287 | z80 SET TRUE ;This one's a Z80.\r | |
288 | ENDIF;cmemco\r | |
289 | \r | |
290 | IF cpt85xx\r | |
291 | baudrt EQU 4Ch ; Baud rate generater (National MM5307)\r | |
292 | mnport EQU 4Bh ; Comm port data register (Intel 8251)\r | |
293 | mnprts EQU 4Ah ; Comm port command/status register\r | |
294 | output EQU 01h ; Transmitter buffer empty flag\r | |
295 | input EQU 02h ; Reciver buffer full flag\r | |
296 | TxEmpty EQU 04h ; Transmitter empty flag\r | |
297 | z80 SET FALSE ; It's really an 8080 [or 8085 ... same thing]\r | |
298 | ENDIF;cpt85xx\r | |
299 | \r | |
300 | IF mmdI ;Morrow MicroDecision - the single-board one\r | |
301 | mnport EQU 0FEH ;Morrow Printer UART data port\r | |
302 | mnprts EQU 0FFH ;Morrow Printer UART command/status\r | |
303 | output EQU 01H ;Output ready bit.\r | |
304 | input EQU 02H ;Input ready bit.\r | |
305 | ;Note: Needs terminal definition \r | |
306 | z80 SET FALSE ;I don't know...\r | |
307 | ENDIF;mmdI\r | |
308 | \r | |
309 | IF bbc ;[22]\r | |
310 | osbyte EQU 0FFF4H ; OS entry point\r | |
311 | osword EQU 0FFF1H ; " " "\r | |
312 | term EQU 0FFC8H ;Terminal mode OS entry\r | |
313 | z80 SET TRUE\r | |
314 | ENDIF;[22] bbc\r | |
315 | \r | |
316 | ;Two types of 380Z system\r | |
317 | IF rm380zm ;[27] MDS - 5 1/4" discs\r | |
318 | mnport EQU 0C8H ;Modem data port\r | |
319 | mnprts EQU 0C9H ;Modem status port\r | |
320 | ENDIF;[32] rm380zm\r | |
321 | \r | |
322 | IF rm380zf ;[32] FDS - 8" discs\r | |
323 | mnport EQU 0E8H ;Modem data port\r | |
324 | mnprts EQU 0E9H ;Modem status port\r | |
325 | ENDIF;[32] rm380zf\r | |
326 | \r | |
327 | IF rm380z ;[32] Common to both systems\r | |
328 | output EQU 01H ;Transmitter buffer empty\r | |
329 | input EQU 02H ;Input data available\r | |
330 | TxEmpty EQU 04h ;Transmitter empty flag\r | |
331 | z80 SET TRUE\r | |
332 | ENDIF;[22] rm380z\r | |
333 | \r | |
334 | IF px8 ; [29]\r | |
335 | z80 SET TRUE\r | |
336 | mnprts EQU 0dh ; used in sending a break\r | |
337 | ENDIF ;px8 [29]\r | |
338 | \r | |
339 | IF mdI ;Morrow Decision I - the big sucker\r | |
340 | mnport equ 48H ; Modem data port.\r | |
341 | mnprts equ 4DH ; Modem status port.\r | |
342 | output equ 20H ; Transmitter empty.\r | |
343 | input equ 1 ; Input data available.\r | |
344 | mbase equ 48H ; Base address of Multi I/O port\r | |
345 | ; selector area.\r | |
346 | grpsel equ 4FH ; Group select port.\r | |
347 | rbr equ 48H ; Read Data Buffer.\r | |
348 | group equ 1 ; Multi I/O Group byte for serial ports.\r | |
349 | congrp equ 1 ; Serial Port 1 for console\r | |
350 | mdmgrp equ 3 ; Serial Port 3 for modem.\r | |
351 | \r | |
352 | ; Following are needed for baud rate changes...[Toad Hall]\r | |
353 | \r | |
354 | dlm equ 49H ; Baud Rate Divisor (Most Sig Bit)\r | |
355 | dll equ 48H ; Baud Rate Divisor (Least Sig Bit)\r | |
356 | ier equ 49H ; Interrupt Enable Register\r | |
357 | lcr equ 4BH ; Line Control Register\r | |
358 | lsr equ 4DH ; Line Status Register\r | |
359 | msr equ 4EH ; Modem Status Register\r | |
360 | dlab equ 80H ; Divisor Latch Access Bit\r | |
361 | wls0 equ 1 ; Word Length Select Bit 0\r | |
362 | wls1 equ 2 ; Word Length Select Bit 1 for 8 bit word\r | |
363 | stb equ 4 ; Stop bit count - 2 stop bits\r | |
364 | imask equ 0 ; Interrupt mask (all disabled)\r | |
365 | z80 SET TRUE ; This one's a Z80.\r | |
366 | ENDIF ;mdI NOTE: needs terminal definition. [Toad Hall]\r | |
367 | \r | |
368 | IF mikko\r | |
369 | sioac EQU 0FF12H ;SIO channel A register(s) address\r | |
370 | sioo3 EQU 01000001B ;SIO Write Reg. 3 original setup (?)\r | |
371 | ;RX 7 bits,synch mode bits 0,RX enable\r | |
372 | sion3 EQU 11001111B ;SIO Write Reg. 3 KERMIT setup\r | |
373 | ;RX 8 bits,synch mode bits 0,RX enable\r | |
374 | sioo4 EQU 01001111B ;SIO Write Reg. 4 original setup (?)\r | |
375 | ;X16 clock,8 bit synch(ignored),\r | |
376 | ;2stop bits,par even(on)\r | |
377 | sion4 EQU 01000100B ;SIO Write Reg. 4 KERMIT setup\r | |
378 | ;X16 clock,8 bit synch(ignored),\r | |
379 | ;1stop bit,par off\r | |
380 | sioo5 EQU 10101010B ;SIO Write Reg. 5 original setup (?)\r | |
381 | ;DTR,TX 7 bits,TX enable,RTS\r | |
382 | sion5 EQU 11101010B ;SIO Write Reg. 5 KERMIT setup\r | |
383 | ;DTR,TX 8 bits,TX enable,RTS\r | |
384 | txclk EQU 0FF30H ;Baud rate generator (CTC) for transmitter\r | |
385 | rxclk EQU 0FF31H ;Baud rate generator (CTC) for receiver\r | |
386 | chmask EQU 0F1F2H ;Mask byte address for SIO ch. A reception\r | |
387 | z80 SET TRUE ;It's got a SIO and a CTC, it must be a Z80\r | |
388 | ENDIF;mikko\r | |
389 | \r | |
390 | \r | |
391 | IF access ;[29]\r | |
392 | mnport EQU 40H ;Modem data port A\r | |
393 | mnprts EQU 42H ;Modem status/conrtol port A\r | |
394 | output EQU 04H ;Transmit buffer empty\r | |
395 | input EQU 01H ;Receive data available\r | |
396 | z80 SET TRUE ;a good z80, here\r | |
397 | ENDIF;access [29]\r | |
398 | \r | |
399 | \r | |
400 | IF robin OR dmII\r | |
401 | z80 SET TRUE ; This one's a Z80\r | |
402 | ENDIF;robin OR dmII\r | |
403 | \r | |
404 | IF hp125 ;[MF]\r | |
405 | z80 SET TRUE ;HP-125 uses a Z80\r | |
406 | ENDIF;hp125 [MF]\r | |
407 | \r | |
408 | IF gener OR cpm3 ; To be truly generic, we must assume 8080.\r | |
409 | z80 SET FALSE\r | |
410 | ENDIF;gener OR cpm3\r | |
411 | ;\f\r | |
412 | IF osi\r | |
413 | defesc EQU ']'-100O ;The default escape character.\r | |
414 | ENDIF; osi \r | |
415 | \r | |
416 | IF vector\r | |
417 | defesc EQU '~' ;Vector can't type ']'.\r | |
418 | ENDIF;vector\r | |
419 | \r | |
420 | IF mikko OR osbrn1 OR lobo\r | |
421 | defesc EQU '\'-100O ;The default is Control \ -- it's easier B.E.\r | |
422 | ENDIF;mikko OR osbrn1 OR lobo\r | |
423 | \r | |
424 | IF cpt85xx\r | |
425 | defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)\r | |
426 | ENDIF;cpt85xx\r | |
427 | \r | |
428 | IF bbc OR rm380z OR px8 OR access OR S1008 ;[22] [29]\r | |
429 | defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)\r | |
430 | ENDIF ;bbc OR rm380z OR px8 OR access OR s1008[29]\r | |
431 | \r | |
432 | IF trs80\r | |
433 | defesc EQU '_'-100O ;CTRL-_ (Down-arrow on TRS-80 keyboard)\r | |
434 | ENDIF;trs80\r | |
435 | \r | |
436 | ; Select initial setting for VT-52 emulation flag.\r | |
437 | \r | |
438 | IF vt52 ; If console looks like (or is) VT52\r | |
439 | vtval EQU 0 ; we don't need VT52 emulation\r | |
440 | ENDIF;vt52\r | |
441 | \r | |
442 | ; If none of the above, default to VT52-EMULATION ON.\r | |
443 | IF NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125);[MF]\r | |
444 | vtval EQU 1\r | |
445 | ENDIF;NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125)[MF]\r | |
446 | \r | |
447 | \r | |
448 | ; sysxin - system dependent initialisation code, called from SYSINIT\r | |
449 | ;\r | |
450 | sysxin:\r | |
451 | \r | |
452 | IF dmII\r | |
453 | ; edit added by OBSchou for C. Lasner. If this dont work, tell me whats\r | |
454 | ; wrong, as I have no DMII or IBM to play with\r | |
455 | ;\r | |
456 | ; IBM mode fixup program\r | |
457 | ;\r | |
458 | ; This routine must be run before attempting to use KERMIT-80 with half\r | |
459 | ; duplex KERMIT implementations such as CMS-KERMIT, as the 6120 processor\r | |
460 | ; will otherwise "swallow" the XON character.\r | |
461 | ;\r | |
462 | ; acknowledgments and limitations.\r | |
463 | ;\r | |
464 | ; This program is based on DECMATE specific implementation details\r | |
465 | ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE\r | |
466 | ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.\r | |
467 | ;\r | |
468 | ; usage consists of merely:\r | |
469 | ;\r | |
470 | ; CP4DMF run this program\r | |
471 | ; KERMIT80 then run kermit\r | |
472 | ; <KERMIT-80 commands used normally here, including SET IBM ON>\r | |
473 | ; CP4DMU run companion program to restore normal XON\r | |
474 | ;\r | |
475 | ; unless CP4DMU is run following KERMIT-80, the normal handling of\r | |
476 | ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another\r | |
477 | ; alternative).\r | |
478 | ;\r | |
479 | ; CP4DMF.ASM\r | |
480 | ;\r | |
481 | ; last edit: 12-jun-87 20:00:00 Charles J. Lasner (CJL)\r | |
482 | \r | |
483 | ;oboff equ 3fh ; offset of outbyt routine for 6120\r | |
484 | ;prtctl equ 02h ; port control\r | |
485 | nocoxon equ 001h ; turn off comm. output XON\r | |
486 | \r | |
487 | lxi b,(nocoxon * 100h) + prtctl ; c/prtctl, b/no out. xon\r | |
488 | call outbyt\r | |
489 | ret ; and return\r | |
490 | \r | |
491 | ;outbyt has been catered for (in break routine)\r | |
492 | ENDIF ;dmII\r | |
493 | \r | |
494 | IF osbrn1 ;(Note now no longer needs code > 4000h as it is already there\r | |
495 | ; lxi d,ostop ;where we're moving it to\r | |
496 | ; lxi h,osmove ;what we're moving\r | |
497 | ; mvi b,osmct ;How many bytes we're moving\r | |
498 | ; call mover\r | |
499 | lda baudrt ; Find out what speed is current\r | |
500 | ani 1\r | |
501 | mvi a,osbi03 ; assume 300 baud\r | |
502 | jz osstr1\r | |
503 | mvi a,osbi12 ; nope, it's 1200.\r | |
504 | osstr1: sta speed ; save initial speed\r | |
505 | sta speed+1 ; as 16 bits, to match speed table entries\r | |
506 | mov d,a\r | |
507 | mov e,a ; get initial speed in DE\r | |
508 | call sysspd ;set up parity etc.\r | |
509 | ENDIF;osbrn1\r | |
510 | \r | |
511 | IF cpt85xx\r | |
512 | mvi a,80h ; Send UART reset [force idle] by setting\r | |
513 | out baudrt ; bit 7 of baud rate I/O port\r | |
514 | lxi H,0f0fh ; Clear reset and default to 9600 baud [23]\r | |
515 | shld speed ; store current speed\r | |
516 | xchg\r | |
517 | call sysspd ; set default baud rate\r | |
518 | mvi a,4Eh ; Set UART mode to async 16x clock, 8 data\r | |
519 | out mnprts ; bits, no parity, and 1 stop bit\r | |
520 | mvi a,37h ; Set command to Tx enable, DTR on, Rx enable,\r | |
521 | out mnprts ; break off, error reset, and RTS on\r | |
522 | ENDIF ; cpt85x\r | |
523 | \r | |
524 | IF bbc ;[22]\r | |
525 | lxi d,modstr ; Set MODE 3\r | |
526 | call prtstr\r | |
527 | mvi a,1 ; Set terminal mode on\r | |
528 | call term\r | |
529 | mvi a,0F2H ; Read current transmit speed\r | |
530 | lxi h,0FF00H ; .. 3 lsb of ULA register\r | |
531 | call osbyte ; FX242,0,255\r | |
532 | mov a,l\r | |
533 | ani 7 ; Mask of 3 lsb\r | |
534 | ;\r | |
535 | ; Edit of July 22, 1986 by B Robertson, Aberdeen Univ. Computing Centre.\r | |
536 | ; Correct bug in sysinit for BBC - reads the initial baud rate at\r | |
537 | ; start up incorrectly.\r | |
538 | ;\r | |
539 | ;\r | |
540 | rar ; Reverse order of 3 lsb\r | |
541 | rar ; Bit2 now in bit0\r | |
542 | jnc binit1 ;\r | |
543 | ori 2 ; Restore bit1\r | |
544 | binit1: ana a ; Set sign bit as appropriate\r | |
545 | jp binit2 ;\r | |
546 | ori 4 ; Bit0 now in bit2\r | |
547 | binit2: ani 7 ; Mask off unwanted bits\r | |
548 | ; End of Edit\r | |
549 | \r | |
550 | xri 7 ; Stored as 2's complement\r | |
551 | inr a\r | |
552 | sta speed ; Store 16 bit value\r | |
553 | sta speed+1\r | |
554 | mov e,a ; Ensure RX and TX speeds are the same\r | |
555 | call sysspd\r | |
556 | ENDIF;[22] bbc\r | |
557 | \r | |
558 | IF rm380z ;[22]\r | |
559 | mvi e,11h ;Output ctrl-Q to clear autopaging\r | |
560 | call outcon\r | |
561 | ENDIF;[22] rm380z\r | |
562 | \r | |
563 | \r | |
564 | IF lobo ;[hh]\r | |
565 | lxi d,siotbl ;[hh] address of status table\r | |
566 | mvi c,siolen ;[hh] length of the table\r | |
567 | siolup: ;[hh] loop here for each command byte\r | |
568 | ldax d ;[hh] load first byte into A\r | |
569 | inx d ;[hh] index pointer to next bute\r | |
570 | sta mnprts ;[hh] send it to status port A\r | |
571 | sta mnprts+2 ;[hh] and to status port B\r | |
572 | dcr c ;[hh] decrement the counter\r | |
573 | jnz siolup ;[hh] loop back for more commands\r | |
574 | mvi a,05H ;[hh] value for 300 baud\r | |
575 | sta baudrt ;[hh] starting default for port A\r | |
576 | sta baudrt+4 ;[hh] and for port B\r | |
577 | sta speed ;[hh] tell program they're set\r | |
578 | mvi a,0E4H ;[hh] value for port A\r | |
579 | sta port ;[hh] tell program we've set this, too\r | |
580 | mvi a,0D0H ;[hh] port A baud rate value\r | |
581 | sta port+1 ;[hh] save this as well, for consistancy\r | |
582 | ENDIF ;lobo\r | |
583 | \r | |
584 | IF mikko\r | |
585 | lxi d,mintbl ;Address of KERMIT Reg values (what)\r | |
586 | mvi c,minlen ;Length of table (how many)\r | |
587 | lxi h,sioac ;Send data to ch. A SIO registers (to where)\r | |
588 | call movmik\r | |
589 | mvi a,0FFH ;Set ch. A mask to use all bits\r | |
590 | sta chmask\r | |
591 | ENDIF;mikko\r | |
592 | \r | |
593 | IF mdI\r | |
594 | lxi h,96 ;Default 1200 baud modem port speed\r | |
595 | shld speed ;Store as modem port speed\r | |
596 | call sysspd ;Initialize the port\r | |
597 | ENDIF;mdI [Toad Hall]\r | |
598 | \r | |
599 | IF cmemco ;[25]\r | |
600 | mvi a,01h ; Reset TU-ART\r | |
601 | out tuart+2\r | |
602 | mvi a,90h ; Set default baud rate (2400), and 1 stop bit\r | |
603 | out tuart\r | |
604 | sta speed ; save for status display\r | |
605 | sta speed+1\r | |
606 | ENDIF;cmemco\r | |
607 | \r | |
608 | IF delphi ;[7]\r | |
609 | ;\r | |
610 | ; shove the default baud rate (1200) in to the Delphi port address\r | |
611 | ; for the baud rate generator on port 2, the default port; save this\r | |
612 | ; value so we can tell what speed is selected.\r | |
613 | ;\r | |
614 | mvi a,07h ;[7] get value for 1200 baud\r | |
615 | out baudrt ;[7] set it for port 2\r | |
616 | sta speed ;[7] save for status display\r | |
617 | sta speed+1\r | |
618 | ENDIF;[7] delphi\r | |
619 | \r | |
620 | IF px8 ; [29]\r | |
621 | lda 0f6a9h ; get baud rate value set by CONFIG\r | |
622 | sta px8blk+4 ; put into parameter block\r | |
623 | mov h, a ; initialise global speed indicator\r | |
624 | mov l, a\r | |
625 | shld speed\r | |
626 | lhld 6 ; base of CP/M\r | |
627 | ; buffer starts at ovlend+8192, immediately after sector buffer\r | |
628 | ; We must also allow (800h) for the CCP as Kermit exits with a RET\r | |
629 | lxi d, ovlend+8192+800h ; calc buffer length\r | |
630 | ora a ; clear carry\r | |
631 | db 0edh, 52h ; sbc hl, de\r | |
632 | shld px8blk+2\r | |
633 | call rsopen\r | |
634 | ENDIF ; px8 [29]\r | |
635 | \r | |
636 | IF disc ;[29]\r | |
637 | ;Initialization sequence for Discovery 83U port B\r | |
638 | ;Sets port to 9600 baud, 8 data bits, 1 stop bit, no parity\r | |
639 | mvi a,12 ;Register 12\r | |
640 | out mnprts\r | |
641 | mvi a,11 ;Low byte of time constant for 9600\r | |
642 | out mnprts\r | |
643 | mvi a,13 ;Register 13\r | |
644 | out mnprts\r | |
645 | mvi a,0 ;High byte of time constant for 9600\r | |
646 | out mnprts\r | |
647 | mvi a,14 ;Register 14\r | |
648 | out mnprts\r | |
649 | mvi a,3 ;Enable baud rate generator\r | |
650 | out mnprts\r | |
651 | mvi a,11 ;Register 11\r | |
652 | out mnprts\r | |
653 | mvi a,52h ;No Xtal, tclk=rclk=/trxc out=br gen\r | |
654 | out mnprts\r | |
655 | mvi a,4 ;Register 4\r | |
656 | out mnprts\r | |
657 | mvi a,44h ;16x clock, 1 stop, no parity\r | |
658 | out mnprts\r | |
659 | mvi a,3 ;Register 3\r | |
660 | out mnprts\r | |
661 | mvi a,71h ;rx 8 bit/ch, autoenable, rx enable\r | |
662 | out mnprts\r | |
663 | mvi a,5 ;Register 5\r | |
664 | out mnprts\r | |
665 | mvi a,0eah ;tx 8 bit/ch, tx enable, rts\r | |
666 | out mnprts\r | |
667 | ENDIF;disc [29]\r | |
668 | ;\r | |
669 | ;\f\r | |
670 | IF mikko ;currently for MIKROMIKKO only\r | |
671 | ; copy command block into memory-mapped SIO.\r | |
672 | movmik: di ;disable interrupts\r | |
673 | movmk1: ldax d ;Get a register value\r | |
674 | mov m,a ;Output it\r | |
675 | inx d ;Next value\r | |
676 | dcr c ;Decrement counter\r | |
677 | jnz movmk1 ;Repeat until done\r | |
678 | ei\r | |
679 | ret\r | |
680 | ENDIF;mikko\r | |
681 | \r | |
682 | ;\f\r | |
683 | IF osbrn1\r | |
684 | osmove:\r | |
685 | osflag equ 0EF08H ;Osborne 1 Bank-2 flag\r | |
686 | ;\r | |
687 | ; return modem status in A\r | |
688 | ;\r | |
689 | OSLDST:\r | |
690 | DI\r | |
691 | OUT 0\r | |
692 | LDA osprts ;Read the status port\r | |
693 | OUT 1\r | |
694 | EI\r | |
695 | ret\r | |
696 | ;\r | |
697 | ; set modem status from A\r | |
698 | ;\r | |
699 | OSSTST:\r | |
700 | DI\r | |
701 | OUT 0\r | |
702 | STA osprts ;Write the control port\r | |
703 | jmp osstex\r | |
704 | ;\r | |
705 | ; read character from modem into A\r | |
706 | ;\r | |
707 | OSLDDA:\r | |
708 | DI\r | |
709 | OUT 0\r | |
710 | LDA osport\r | |
711 | OUT 1\r | |
712 | EI\r | |
713 | ret\r | |
714 | ;\r | |
715 | ; output character in A to modem\r | |
716 | ;\r | |
717 | OSSTDA:\r | |
718 | DI\r | |
719 | OUT 0\r | |
720 | STA osport\r | |
721 | osstex:\r | |
722 | OUT 1\r | |
723 | mvi a,1\r | |
724 | sta osflag\r | |
725 | EI\r | |
726 | ret\r | |
727 | ENDIF;osbrn1\r | |
728 | \r | |
729 | IF lobo\r | |
730 | ; List of commands to set up SIO channel A for asynchronous operation.\r | |
731 | siotbl: DB 18H ; Channel reset\r | |
732 | DB 18H ; another, in case register 0 wasn't selected\r | |
733 | DB 04H ; Select register 4\r | |
734 | DB 44H ; 1 stop bit, clock*16\r | |
735 | DB 01H ; Select register 1\r | |
736 | DB 00H ; No interrupts enabled\r | |
737 | DB 03H ; Select register 3\r | |
738 | DB 0C1H ; Rx enable, 8 bit Rx character\r | |
739 | DB 05H ; Select register 5\r | |
740 | DB 0EAH ; Tx enable, 8 bit Tx character,\r | |
741 | ; raise DTR and RTS\r | |
742 | siolen equ $-siotbl ; length of command list\r | |
743 | ENDIF;lobo\r | |
744 | \r | |
745 | IF mikko\r | |
746 | ; command list to set SIO chip back to normal state\r | |
747 | miotbl: db 3 ;reg. 3\r | |
748 | db sioo3\r | |
749 | db 5 ;reg. 5\r | |
750 | db sioo5\r | |
751 | db 4 ;reg. 4\r | |
752 | db sioo4\r | |
753 | db 0 ;reselect reg. 0\r | |
754 | miolen equ $-miotbl ;MikroMikko SIO table length (original values)\r | |
755 | \r | |
756 | ; command list to set up SIO chip for operation with Kermit\r | |
757 | mintbl: db 3 ;reg. 3\r | |
758 | db sion3\r | |
759 | db 5 ;reg. 5\r | |
760 | db sion5\r | |
761 | db 4 ;reg. 4\r | |
762 | db sion4\r | |
763 | db 0 ;reselect reg. 0\r | |
764 | minlen equ $-mintbl ;MikroMikko SIO table length (KERMIT values)\r | |
765 | ENDIF;mikko\r | |
766 | \r | |
767 | \r | |
768 | IF bbc ;[22]\r | |
769 | modstr: db 16h,03h,'$' ; String to put screen into MODE 3\r | |
770 | ENDIF\r | |
771 | \r | |
772 | IF px8 ; [29]\r | |
773 | rsget: mvi b, 50h\r | |
774 | jmp rsiox\r | |
775 | rsinst: mvi b, 30h\r | |
776 | jmp rsiox\r | |
777 | rsput: mvi b, 60h\r | |
778 | jmp rsiox\r | |
779 | rsoutst:mvi b, 40h\r | |
780 | jmp rsiox\r | |
781 | rserst: mvi b, 90h\r | |
782 | jmp rsiox\r | |
783 | rsopen: lxi h, px8blk ; copy px8blk to px8prm\r | |
784 | lxi d, px8prm\r | |
785 | lxi b, 9\r | |
786 | call mover\r | |
787 | mvi b, 10h ; open code\r | |
788 | jmp rsiox\r | |
789 | rsclose:mvi b, 20h ; close code\r | |
790 | rsiox: lxi h, px8prm\r | |
791 | lxi d, 51h ; offset into BIOS jump table\r | |
792 | push h\r | |
793 | lhld 1 ; start of BIOS\r | |
794 | dad d\r | |
795 | xthl ; entry point on stack, px8prm addr in hl\r | |
796 | ret ; jump indirect\r | |
797 | \r | |
798 | px8prm: dw 0, 0\r | |
799 | db 0, 0, 0, 0, 0 ; the param area is overwritten in rsopen\r | |
800 | px8blk: dw ovlend+8192 ; buffer address\r | |
801 | dw 0 ; buffer size - overwritten\r | |
802 | db 0 ; baud rate - overwritten\r | |
803 | db 3 ; 8 bits/char\r | |
804 | db 0 ; no parity, it is done internally\r | |
805 | db 1 ; 1 stop bit\r | |
806 | db 0cfh ; special bits - activate xon/xoff\r | |
807 | ; The documentation suggests that the xon/xoff bit is bit 4, i.e the pattern\r | |
808 | ; should be 0efh, but the top bit is omitted from the diagram. I will try\r | |
809 | ; clearing both bit 4 and bit 5.\r | |
810 | ENDIF ; px8 [29]\r | |
811 | \r | |
812 | IF hp125 ;[MF]\r | |
813 | lxi b,73ffh ;Prepare Data Comm 1 to\r | |
814 | call bdos ;Transfer eight-bit data\r | |
815 | lxi d,jbuf ;Point to bios jump-table vector\r | |
816 | lxi b,7effh ;Set up special subfunction code to\r | |
817 | call bdos ;Get rdr routine address\r | |
818 | lhld jbuf+3 ;Remember this address\r | |
819 | shld readin+1 ;for our eight-bit rdr routine\r | |
820 | mvi a,1 ;We want to write into the bios jump table\r | |
821 | sta jbuf+1 ;...\r | |
822 | lxi h,readin ;Point to our rdr routine (all 8 bits)\r | |
823 | shld jbuf+3 ;as new RDR routine\r | |
824 | lxi d,jbuf ;Point to jump vector argument block\r | |
825 | lxi b,7effh ;Set subfunction code to\r | |
826 | call bdos ;Substitute our rdr routine in dispatch table\r | |
827 | lxi h,mapon1 ;Make Data Comm 1 the default port\r | |
828 | shld port ;at program-start\r | |
829 | xchg ;Put in DE\r | |
830 | call prtstr ;Print escape sequences to connect\r | |
831 | ;DAta Comm 1 to rdr/punch\r | |
832 | ENDIF ;hp125 [MF]\r | |
833 | \r | |
834 | ret ; end of sysxin\r | |
835 | \r | |
836 | ;\f\r | |
837 | ; system-dependent termination processing\r | |
838 | ; If we've changed anything, this is our last chance to put it back.\r | |
839 | sysexit:\r | |
840 | \r | |
841 | IF dmII\r | |
842 | ; Edited by OBSchou for Charles Lasner. His bug fix now in Kermit-80:\r | |
843 | ;\r | |
844 | ; IBM mode restore program\r | |
845 | ;\r | |
846 | ; This routine must be run after using CP4DMF (and KERMIT-80) to restore\r | |
847 | ; the normal handling of XON/XOFF; the user may also elect to cold-boot\r | |
848 | ; the DECMATE instead.\r | |
849 | ;\r | |
850 | ; acknowledgments and limitations.\r | |
851 | ;\r | |
852 | ; This program is based on DECMATE specific implementation details\r | |
853 | ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE\r | |
854 | ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.\r | |
855 | ;\r | |
856 | ; usage consists of merely:\r | |
857 | ;\r | |
858 | ; CP4DMF run xon/xoff disable program\r | |
859 | ; KERMIT80 then run kermit\r | |
860 | ; <KERMIT-80 commands used normally here, including SET IBM ON>\r | |
861 | ; CP4DMU run this program to restore normal XON\r | |
862 | ;\r | |
863 | ; unless CP4DMU is run following KERMIT-80, the normal handling of\r | |
864 | ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another\r | |
865 | ; alternative).\r | |
866 | ;\r | |
867 | ; CP4DMF.ASM\r | |
868 | ;\r | |
869 | ; last edit: 12-jun-87 20:00:00 Charles J. Lasner (CJL)\r | |
870 | ;\r | |
871 | coxon equ 000h ; enable comm. output XON\r | |
872 | ;oboff equ 3fh ; offset of outbyt routine for 6120\r | |
873 | ;prtctl equ 02h ; port control\r | |
874 | \r | |
875 | \r | |
876 | lxi b,(coxon * 100h) + prtctl ; c/prtctl, b/with out. xon\r | |
877 | call outbyt ;[OBS] declared elswhere\r | |
878 | ret ; and return\r | |
879 | \r | |
880 | ENDIF ;dmII\r | |
881 | \r | |
882 | IF mikko\r | |
883 | lxi d,miotbl ;Load the adress of original reg values\r | |
884 | mvi c,miolen ;Length of table\r | |
885 | lxi h,sioac ;Send data to ch A SIO registers\r | |
886 | call movmik\r | |
887 | mvi a,07FH ;Set ch A mask to use just 7 bits\r | |
888 | sta chmask\r | |
889 | ENDIF;mikko\r | |
890 | \r | |
891 | IF teletek\r | |
892 | ;Note - This code was handwritten onto the lising I was sent, with the \r | |
893 | ; comment that David had just thought of the code, so it was \r | |
894 | ; not on the listing. If you have problems I suggest you \r | |
895 | ; comment out these few lines.\r | |
896 | ;Bertil Schou.\r | |
897 | ;\r | |
898 | di\r | |
899 | mvi a,47h ; reset baud rate to 9600\r | |
900 | out baudrt\r | |
901 | mvi a,08h\r | |
902 | out baudrt\r | |
903 | ei\r | |
904 | ENDIF ;teletek\r | |
905 | \r | |
906 | IF cpt85xx\r | |
907 | mvi a,80h ; Reset (force idle) the 8251 UART via bit 7\r | |
908 | out baudrt ; of the baud rate generater port\r | |
909 | mvi a,00h ; and turn off the baud rate generater\r | |
910 | out baudrt\r | |
911 | ENDIF;cpt85xx\r | |
912 | \r | |
913 | IF bbc ;[22]\r | |
914 | mvi a,0 ; Turn off terminal mode\r | |
915 | call term\r | |
916 | ENDIF;[22] bbc\r | |
917 | \r | |
918 | IF px8 ;[29]\r | |
919 | call rsclose\r | |
920 | ENDIF ;px8 [29]\r | |
921 | \r | |
922 | IF hp125 ;[MF]\r | |
923 | lxi b,74ffh ;Set subfunction code to\r | |
924 | call bdos ;Reset Data Comm 1 for 7-bit data\r | |
925 | lhld readin+1 ;Get original rdr routine address\r | |
926 | shld jbuf+3 ;and store in jump vector\r | |
927 | lxi d,jbuf ;Point to jump vector\r | |
928 | lxi b,7effh ;Set subfunction code to\r | |
929 | call bdos ;Put original rdr routine back in bios\r | |
930 | ;dispatch table\r | |
931 | lxi d,mapoff ;Point to escape sequences to\r | |
932 | call prtstr ;Turn off Data Comm 1/2 mappings\r | |
933 | ENDIF ;hp125 [MF]\r | |
934 | \r | |
935 | ret\r | |
936 | \r | |
937 | ;\r | |
938 | ; system-dependent processing for start of CONNECT command\r | |
939 | ;\r | |
940 | syscon:\r | |
941 | IF robin OR trs80 OR cpt85xx ;For Robin/TRS80/CPT-85xx, add some more info\r | |
942 | lxi d,conmsg ; about obscure key combinations\r | |
943 | call prtstr\r | |
944 | ENDIF;robin OR trs80 OR cpt85xx\r | |
945 | \r | |
946 | IF osbrn1 ;*** This is Software dependent ***\r | |
947 | lhld 1 ;Modify back-arrow code to DELETE\r | |
948 | mvi l,0 ;Get BIOS-start address\r | |
949 | lxi d,85H ;Adress for key-code = XX85H\r | |
950 | dad d\r | |
951 | mov e,m ;Get it in DE\r | |
952 | inx h\r | |
953 | mov d,m\r | |
954 | xchg ;Memory pointer to HL\r | |
955 | mvi m,del ;modify the code\r | |
956 | ENDIF;osbrn1\r | |
957 | ret\r | |
958 | \r | |
959 | conmsg: ; Messages printed when entering transparent (CONNECT) mode:\r | |
960 | IF robin ; for Robin, control-S key is hidden\r | |
961 | db ' (Type Left Arrow to send CTRL-S)',cr,lf,'$'\r | |
962 | ENDIF;robin\r | |
963 | IF trs80 ; for TRS-80, the preferred escape key is hidden\r | |
964 | db ' (Control-_ is the Down-Arrow key on the TRS-80 keyboard)'\r | |
965 | db cr,lf,'$'\r | |
966 | ENDIF;trs80\r | |
967 | IF cpt85xx ; for CPT-85xx, some graphics map "funny" to keyboard in CP/M\r | |
968 | db ' (Use CODE + SHIFT + 1/2 key to generate a Control-\)'\r | |
969 | db cr,lf,'$'\r | |
970 | ENDIF;cpt85xx\r | |
971 | ;\f\r | |
972 | ; syscls - system-dependent close routine\r | |
973 | ; called when exiting transparent session.\r | |
974 | ;\r | |
975 | syscls:\r | |
976 | IF osbrn1\r | |
977 | lhld 1 ;Modify back-arrow code to BACKSPACE\r | |
978 | mvi l,0 ;Get BIOS address\r | |
979 | lxi d,85H ;Address for key-code =XX85H\r | |
980 | dad d\r | |
981 | mov e,m ;Get it in DE\r | |
982 | inx h\r | |
983 | mov d,m\r | |
984 | xchg ;Address to HL\r | |
985 | mvi m,bs ;Modify code\r | |
986 | ENDIF;osbrn1\r | |
987 | ret\r | |
988 | ;\f\r | |
989 | ; sysinh - help for system-dependent special functions.\r | |
990 | ; called in response to <escape>?, after listing all the\r | |
991 | ; system-independent escape sequences.\r | |
992 | ;\r | |
993 | sysinh:\r | |
994 | IF robin OR dmII OR cpt85xx OR lobo \r | |
995 | lxi d,inhlps ; we got options...\r | |
996 | call prtstr ; print them.\r | |
997 | ENDIF;robin OR dmII OR cpt85xx OR lobo \r | |
998 | \r | |
999 | IF bbc OR rm380z ; some more\r | |
1000 | lxi d,inhlps ; we got options...\r | |
1001 | call prtstr ; print them.\r | |
1002 | ENDIF;[22] bbc OR rm380z \r | |
1003 | \r | |
1004 | IF px8 OR access OR mmate OR disc ;and more...\r | |
1005 | lxi d,inhlps ; we got options...\r | |
1006 | call prtstr ; print them.\r | |
1007 | ENDIF ;px8 OR access OR mmate OR disc \r | |
1008 | \r | |
1009 | ret\r | |
1010 | \r | |
1011 | \r | |
1012 | ;additional, system-dependent help for transparent mode\r | |
1013 | ; (two-character escape sequences)\r | |
1014 | inhlps:\r | |
1015 | \r | |
1016 | IF robin OR dmII OR cpt85xx OR lobo\r | |
1017 | db cr,lf,'B Transmit a BREAK'\r | |
1018 | ENDIF;robin OR dmII OR cpt85xx OR lobo \r | |
1019 | \r | |
1020 | IF bbc OR rm380z \r | |
1021 | db cr,lf,'B Transmit a BREAK'\r | |
1022 | ENDIF;bbc OR rm380z \r | |
1023 | \r | |
1024 | IF px8 OR access OR mmate \r | |
1025 | db cr,lf,'B Transmit a BREAK'\r | |
1026 | ENDIF ;px8 OR access OR mmate \r | |
1027 | \r | |
1028 | IF disc ;[29] [32]\r | |
1029 | db cr,lf,'B Transmit a 300ms BREAK'\r | |
1030 | db cr,lf,'L Transmit a 5 second BREAK'\r | |
1031 | ENDIF;disc [29]\r | |
1032 | \r | |
1033 | IF lobo\r | |
1034 | db cr,lf,'D Drop the line'\r | |
1035 | ENDIF;lobo\r | |
1036 | \r | |
1037 | db '$' ;[hh] table terminator\r | |
1038 | \r | |
1039 | ;\r | |
1040 | ; sysint - system dependent special functions\r | |
1041 | ; called when transparent escape character has been typed;\r | |
1042 | ; the second character of the sequence is in A (and in B).\r | |
1043 | ; returns:\r | |
1044 | ; non-skip: sequence has been processed\r | |
1045 | ; skip: sequence was not recognized\r | |
1046 | \r | |
1047 | sysint: ani 137O ; convert lower case to upper, for testing...\r | |
1048 | \r | |
1049 | IF robin OR dmII OR cpt85xx OR lobo \r | |
1050 | cpi 'B' ; send break?\r | |
1051 | jz sendbr ; yes, go do it. return nonskip when through.\r | |
1052 | ENDIF;robin OR dmII OR cpt85xx OR lobo \r | |
1053 | \r | |
1054 | IF bbc OR rm380z ; [22] [25] ... some more\r | |
1055 | cpi 'B' ; send break?\r | |
1056 | jz sendbr ; yes, go do it. return nonskip when through.\r | |
1057 | ENDIF; bbc OR rm380z \r | |
1058 | \r | |
1059 | IF px8 OR access OR mmate ;[28] [29] and anothers\r | |
1060 | cpi 'B' ; send break?\r | |
1061 | jz sendbr ; yes, go do it. return nonskip when through.\r | |
1062 | ENDIF ; px8 OR access OR mmate [28] [29]\r | |
1063 | \r | |
1064 | IF lobo ;[hh]\r | |
1065 | cpi 'D' ;[hh] disconnect?\r | |
1066 | jz discon ;[hh] yes, go do it. nonskip return when done.\r | |
1067 | ENDIF ;lobo\r | |
1068 | \r | |
1069 | IF disc ;[29]\r | |
1070 | cpi 'B' ;Send short break?\r | |
1071 | jz sendbr\r | |
1072 | cpi 'L' ;Send long break?\r | |
1073 | jz sendlbr\r | |
1074 | ENDIF;disc [29]\r | |
1075 | \r | |
1076 | jmp rskp ; take skip return - command not recognized.\r | |
1077 | \r | |
1078 | \r | |
1079 | ;\f\r | |
1080 | IF robin ;Definitions & code to send a BREAK (ungenerically, no other way).\r | |
1081 | \r | |
1082 | comctl equ 59h ;VT180 communications port\r | |
1083 | crtctl equ 41h ;VT180 crt port\r | |
1084 | \r | |
1085 | ;VT180 serial port command bits\r | |
1086 | \r | |
1087 | txe equ 1 ;transmit enable\r | |
1088 | dtr equ 2 ;dtr on\r | |
1089 | rxe equ 4 ;rx enable\r | |
1090 | sndbrk equ 8\r | |
1091 | rerr equ 10h ;reset error\r | |
1092 | rts equ 20h ;RTS on\r | |
1093 | reset equ 40h ;port reset\r | |
1094 | \r | |
1095 | ;Send a break to the communications port.\r | |
1096 | ;\r | |
1097 | \r | |
1098 | sendbr: lxi h,38500 ;250 ms(?)\r | |
1099 | lda prtadr ;Get address of selected port\r | |
1100 | mov c,a ;Into C\r | |
1101 | mvi a,sndbrk+dtr\r | |
1102 | ; OUT C,A ;Want to send to port addressed by C\r | |
1103 | db 0EDH,079H ;Op code for above instruction\r | |
1104 | sndbr1: dcx h ;timing loop...\r | |
1105 | mov a,l\r | |
1106 | ora h\r | |
1107 | jnz sndbr1 ;...until over\r | |
1108 | lda prtadr ;Get the address for the port\r | |
1109 | mov c,a ;Into C\r | |
1110 | mvi a,txe+dtr+rxe+rerr+rts ;enable tr/rc, dtr, reset error\r | |
1111 | ; out c,a ;Z-80 only instruction\r | |
1112 | db 0EDH,079H ;Op code for above instruction\r | |
1113 | out contst ;reset ports\r | |
1114 | ret\r | |
1115 | ENDIF;robin\r | |
1116 | ;\f\r | |
1117 | IF dmII ;[jd] this added to send break on DECmate\r | |
1118 | \r | |
1119 | ; DECmate command codes for 6120 I/O processor\r | |
1120 | oboff equ 3fh ; offset of outbyt routine for 6120\r | |
1121 | prtctl equ 02h ; port control\r | |
1122 | brdat equ 06h ; data to tell 6120 to send a break\r | |
1123 | brdur equ 30 ; duration, 30 = 300 ms.\r | |
1124 | \r | |
1125 | sendbr: lxi b,(brdat * 100h) + prtctl ; c/prtctl, b/brdat\r | |
1126 | call outbyt\r | |
1127 | lxi b,brdur*100h ; b/duration, c/0\r | |
1128 | ; fall through into outbyt\r | |
1129 | \r | |
1130 | outbyt: lhld 1 ; get warm boot address\r | |
1131 | lxi d,oboff ; offset of outbyt routine\r | |
1132 | dad d ; compute address\r | |
1133 | pchl ; branch there (a callret)\r | |
1134 | \r | |
1135 | ENDIF;dmII\r | |
1136 | ;\f\r | |
1137 | IF access OR mmate ;[cjc] send break on Kaypro [29]\r | |
1138 | ; Officially, a "break" is 300 milliseconds of "space" (idle line is\r | |
1139 | ; "mark"). (or maybe 200 milliseconds; I forget.) The timing isn't\r | |
1140 | ; usually that critical, but we'll make an attempt, at least. Sending\r | |
1141 | ; too long a break can cause some modems to hang up.\r | |
1142 | \r | |
1143 | sendbr:\r | |
1144 | ; First, make sure the transmitter is really empty. (The SIO sets\r | |
1145 | ; "transmitter buffer empty" when it can accept another character;\r | |
1146 | ; the previous character is still being shifted onto the line.\r | |
1147 | ; Another status bit, "all done", is set to indicate that the\r | |
1148 | ; transmitter is really idle.\r | |
1149 | sndbr1: mvi a,1 ; select Read Register 1\r | |
1150 | out mnprts\r | |
1151 | in mnprts ; read the contents\r | |
1152 | ani 1 ; test "all done" flag\r | |
1153 | jz sndbr1 ; loop until it's nonzero.\r | |
1154 | ;\r | |
1155 | ; Next, set the "send break" bit to start the transmitter spacing.\r | |
1156 | mvi a,5 ; select Write Register 5\r | |
1157 | out mnprts\r | |
1158 | mvi a,0FAH ; Tx enable, 8 bit Tx character, Send Break,\r | |
1159 | out mnprts ; DTR and RTS on.\r | |
1160 | ;\r | |
1161 | ; Now, delay for 30 hundredths of a second\r | |
1162 | mvi a,30 ; delay count\r | |
1163 | call delay\r | |
1164 | ;\r | |
1165 | ; Time's up. Put transmitter back in normal state (data byte is the\r | |
1166 | ; same as the one in siotbl: for Write Register 5) and return.\r | |
1167 | mvi a,5 ; select Write Register 5\r | |
1168 | out mnprts\r | |
1169 | mvi a,0EAH ; Tx enable, 8 bit Tx character,\r | |
1170 | out mnprts ; DTR and RTS on.\r | |
1171 | ret ; done.\r | |
1172 | ENDIF;access OR mmate [29]\r | |
1173 | \r | |
1174 | IF lobo ;[hh] This routine sends a break tone or disconnects a modem\r | |
1175 | ; (those that respond to it) by setting the DTR line low\r | |
1176 | ; for 300 ms.\r | |
1177 | ;\r | |
1178 | sendbr: mvi a,05H ;[hh] write register 5\r | |
1179 | call outctl ;[hh] send it to control port\r | |
1180 | mvi a,0FAH ;[hh] value to send break tone\r | |
1181 | jmp sndbr1 ;[hh]\r | |
1182 | ;\r | |
1183 | discon: mvi a,05H ;[hh] write register 5\r | |
1184 | call outctl ;[hh] send it to the control port\r | |
1185 | mvi a,06AH ;[hh] DTR off and break tone on\r | |
1186 | sndbr1: call outctl ;[hh] send to control port\r | |
1187 | mvi a,30 ;[hh] delay count for 300 ms.\r | |
1188 | call delay ;[hh] wait a while...\r | |
1189 | mvi a,05H ;[hh] write register 5\r | |
1190 | call outctl ;[hh] get it's attention\r | |
1191 | mvi a,0EAH ;[hh] normal 8 bits, DTR on, RTS on, etc.\r | |
1192 | call outctl ;[hh] restore SIO\r | |
1193 | ret\r | |
1194 | ;\r | |
1195 | outctl: sta mnprts ;[hh]\r | |
1196 | ret\r | |
1197 | ENDIF ;lobo\r | |
1198 | ;\f\r | |
1199 | IF cpt85xx OR rm380z ;[lmj] [22] [25]\r | |
1200 | sendbr:\r | |
1201 | ;\r | |
1202 | ; Ensure that the transmitter has finished sending buffered chars\r | |
1203 | sndbr1: in mnprts ; get UART status\r | |
1204 | ani TxEmpty ; everything sent?\r | |
1205 | jz sndbr1 ; no, wait a bit more\r | |
1206 | ;\r | |
1207 | ; Begin sending a break by setting bit in UART command register\r | |
1208 | mvi a,3Fh ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS\r | |
1209 | out mnprts\r | |
1210 | ;\r | |
1211 | ; Wait for 250 milliseconds (using hundredths second delay routine)\r | |
1212 | mvi a,25\r | |
1213 | call delay\r | |
1214 | ;\r | |
1215 | ; Resume normal operation by clearing the SendBreak command bit\r | |
1216 | mvi a,37h ;Set TxEna, DTR, RxEna, ErrRst, RTS\r | |
1217 | out mnprts\r | |
1218 | ;\r | |
1219 | ret ;done\r | |
1220 | ENDIF;cpt85xx OR rm380z \r | |
1221 | \r | |
1222 | IF px8 ; [29]\r | |
1223 | sendbr: mvi a, 3fh ; set break bit\r | |
1224 | out mnprts\r | |
1225 | mvi a, 25\r | |
1226 | call delay ; wait 250 msec\r | |
1227 | mvi a, 37h ; clear break bit\r | |
1228 | out mnprts\r | |
1229 | ret\r | |
1230 | ENDIF ; px8 [29]\r | |
1231 | \r | |
1232 | ;\f\r | |
1233 | IF bbc ;[22]\r | |
1234 | sendbr:\r | |
1235 | ;\r | |
1236 | ; Ensure that the transmitter has finished sending buffered chars\r | |
1237 | sndbr1: mvi a,96h ; get ACIA status\r | |
1238 | mvi l,8\r | |
1239 | call osbyte ; *FX150,8\r | |
1240 | mov a,h\r | |
1241 | ani 2 ; everything sent?\r | |
1242 | jz sndbr1 ; no, wait a bit more\r | |
1243 | ;\r | |
1244 | ; Disable centisecond clock (system VIA) which interferes with break\r | |
1245 | lxi h,0FE4Eh ; system VIA interrupt enable register\r | |
1246 | mvi a,40H ; disable timer 1\r | |
1247 | call wrtiom ; write to I/O processor memory\r | |
1248 | ;\r | |
1249 | ; Begin sending a break by setting bit in ACIA control register\r | |
1250 | mvi a,9Ch\r | |
1251 | lxi h,9F60h ; Set Rxint, Txint, Break, RTS\r | |
1252 | call osbyte ; *FX 156,96,159\r | |
1253 | ;\r | |
1254 | ; Wait for 250 milliseconds (using hundredths second delay routine)\r | |
1255 | mvi a,25\r | |
1256 | call delay\r | |
1257 | ;\r | |
1258 | ; Resume normal operation by returning old control byte\r | |
1259 | mvi a,9Ch\r | |
1260 | mvi h,0 ;Set TxEna, DTR, RxEna, ErrRst, RTS\r | |
1261 | call osbyte ; *FX 156,oldvalue,0\r | |
1262 | ;\r | |
1263 | ; Enable centisecond clock (system VIA)\r | |
1264 | lxi h,0FE4Eh ; system VIA interrupt enable register\r | |
1265 | mvi a,0C0H ; enable timer 1\r | |
1266 | call wrtiom ; write to I/O processor memory\r | |
1267 | ;\r | |
1268 | ret ;done\r | |
1269 | ;\r | |
1270 | ; Routine to write byte in A to I/O processor memory address\r | |
1271 | ; given by HL\r | |
1272 | wrtiom:\r | |
1273 | shld parblk ; store address to parameter block\r | |
1274 | sta parblk+4 ; store data\r | |
1275 | lxi h,parblk ; load hl with address of param block\r | |
1276 | mvi a,6 ; write I/O processor memory\r | |
1277 | call osword ; go do it\r | |
1278 | ret\r | |
1279 | ;\r | |
1280 | parblk: DS 5 ; reserve space for parameter block\r | |
1281 | ENDIF;bbc [22]\r | |
1282 | ;\f\r | |
1283 | IF disc ;[29]\r | |
1284 | ; This is almost an exact copy of the bbI sendbr routine.\r | |
1285 | ; Modifications to include a long break have been made.\r | |
1286 | ;\r | |
1287 | ; Officially, a "break" is 300 milliseconds of "space" (idle line is\r | |
1288 | ; "mark"). (or maybe 200 milliseconds; I forget.) The timing isn't\r | |
1289 | ; usually that critical, but we'll make an attempt, at least. Sending\r | |
1290 | ; too long a break can cause some modems to hang up.\r | |
1291 | \r | |
1292 | sendlbr:\r | |
1293 | push d ;save d, this may not be necessary, but safe\r | |
1294 | mvi d,17 ;do short break 17 times (approx. 5 sec.)\r | |
1295 | jmp sndbr1\r | |
1296 | sendbr:\r | |
1297 | push d\r | |
1298 | mvi d,1 ;On short break, do only once\r | |
1299 | ; First, make sure the transmitter is really empty. (The SIO sets\r | |
1300 | ; "transmitter buffer empty" when it can accept another character;\r | |
1301 | ; the previous character is still being shifted onto the line.\r | |
1302 | ; Another status bit, "all done", is set to indicate that the\r | |
1303 | ; transmitter is really idle.\r | |
1304 | sndbr1: mvi a,1 ; select Read Register 1\r | |
1305 | out mnprts\r | |
1306 | in mnprts ; read the contents\r | |
1307 | ani 1 ; test "all done" flag\r | |
1308 | jz sndbr1 ; loop until it's nonzero.\r | |
1309 | ;\r | |
1310 | ; Next, set the "send break" bit to start the transmitter spacing.\r | |
1311 | mvi a,5 ; select Write Register 5\r | |
1312 | out mnprts\r | |
1313 | mvi a,0FAH ; Tx enable, 8 bit Tx character, Send Break,\r | |
1314 | out mnprts ; DTR and RTS on.\r | |
1315 | ;\r | |
1316 | ; Now, delay for 30*d hundredths of a second\r | |
1317 | sendbr2:\r | |
1318 | mvi a,30 ; delay count\r | |
1319 | call delay\r | |
1320 | ; The following has been added to allow doing .03 delay d times\r | |
1321 | dcr d ; decrement # of times to do loop\r | |
1322 | jnz sendbr2 ; if not done, do again\r | |
1323 | pop d ; reload d\r | |
1324 | ;\r | |
1325 | ; Time's up. Put transmitter back in normal state (data byte is the\r | |
1326 | ; same as the one in siotbl: for Write Register 5) and return.\r | |
1327 | mvi a,5 ; select Write Register 5\r | |
1328 | out mnprts\r | |
1329 | mvi a,0EAH ; Tx enable, 8 bit Tx character,\r | |
1330 | out mnprts ; DTR and RTS on.\r | |
1331 | ret ; done.\r | |
1332 | ENDIF ;disc [29]\r | |
1333 | \r | |
1334 | \r | |
1335 | ;\r | |
1336 | ; sysflt - system-dependent filter\r | |
1337 | ; called with character in E.\r | |
1338 | ; if this character should not be printed, return with A = zero.\r | |
1339 | ; preserves bc, de, hl.\r | |
1340 | ; note: <xon>,<xoff>,<del>, and <nul> are always discarded.\r | |
1341 | sysflt:\r | |
1342 | mov a,e ; get character for testing\r | |
1343 | IF mikko\r | |
1344 | cpi 'O'-100O ;Control-O's lock keyboard\r | |
1345 | rnz ; if not control-O, it's ok.\r | |
1346 | xra a ; don't allow control-O out.\r | |
1347 | ENDIF;mikko\r | |
1348 | \r | |
1349 | ret\r | |
1350 | \r | |
1351 | ; mdmflt - modem filter [30]\r | |
1352 | ; called with character to be sent to printer in E\r | |
1353 | ; with parity set as appropriate.\r | |
1354 | ; return with accumulator = 0 do do nothing,\r | |
1355 | ; <> 0 to send char in E.\r | |
1356 | mdmflt:\r | |
1357 | mov a,e ;[30] get character to test\r | |
1358 | ret\r | |
1359 | \r | |
1360 | \r | |
1361 | \r | |
1362 | ; prtflt - printer filter [30]\r | |
1363 | ; called with character to be sent to printer in E\r | |
1364 | ; returns with a = 0 to do nothing\r | |
1365 | ; a <> 0 to print it.\r | |
1366 | ;\r | |
1367 | ; this routine for those printer that automatically insert\r | |
1368 | ; a lf on cr, or cr for lf. Should this be shifted to \r | |
1369 | ; the system indep. stuff, in say 4.06?\r | |
1370 | prtflt:\r | |
1371 | mov a,e ; [30] get character to test\r | |
1372 | ret\r | |
1373 | \r | |
1374 | \r | |
1375 | ;\f\r | |
1376 | ; system-dependent processing for BYE command.\r | |
1377 | ; for lobo, hang up the phone.\r | |
1378 | sysbye:\r | |
1379 | IF lobo ;[hh]\r | |
1380 | call discon ;[hh] force modem to hang up\r | |
1381 | ENDIF;lobo\r | |
1382 | ret\r | |
1383 | \r | |
1384 | IF lasm\r | |
1385 | LINK CPXSY2.ASM ; If m80 then this ignored\r | |
1386 | ENDIF ; lasm\r |