]> cloudbase.mooo.com Git - kermit-80.git/blame - cpxsys.asm
Convert line endings to CP/M format (cr/lf).
[kermit-80.git] / cpxsys.asm
CommitLineData
e58a7a25
L
1IF NOT lasm\r
2.printx * CPXSYS.ASM *\r
3ENDIF ;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
117family: 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
123IF rm380z \r
124cpuspd SET 40 ; 4.0 MHz CPU\r
125ENDIF; rm380z \r
126\r
127IF disc OR mmate OR s1008 OR access \r
128cpuspd SET 40 ; 4.0 MHz CPU\r
129ENDIF ;disc OR mmate OR s1008 OR access \r
130\r
131IF bbc ;[9]\r
132cpuspd SET 60 ; BBC with 6Mhz Z80\r
133ENDIF;bbc\r
134\r
135\r
136; the basics...\r
137\r
138IF gener\r
139batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP\r
140defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP\r
141crtio equ 01010101B ; use CRT: device\r
142ptrio equ 01010110B ; use PTR: device\r
143ttyio equ 00000000B ; use TTY: device\r
144uc1io equ 01010111B ; use UC1: device\r
145ur1io equ 01101010B ; use UR1: device\r
146ur2io equ 01111110B ; use UR2: device\r
147ENDIF;gener\r
148\r
149IF robin\r
150batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP\r
151defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP\r
152lptio EQU 054H ;I/O byte CON=TTY,LIST=CRT,READER=PTR,PUNCH=PTP\r
153gppio EQU 057H ;I/O byte CON=UC1,LIST=CRT,READER=RDR,PUNCH=PTP\r
154ENDIF;robin\r
155\r
156\r
157IF dmII OR bbc ;[22]\r
158batio EQU 042H ;I/O byte CON=BAT,LIST=CRT,READER=RDR\r
159defio EQU 081H ;I/O byte CON=CRT,LIST=LPT,READER=RDR\r
160ENDIF;dmII\r
161\r
162IF mikko\r
163batio EQU 10110010B ; I/O byte console => serial line\r
164defio EQU 10000001B ; I/O byte console => CRT and Keyboard\r
165ENDIF;mikko\r
166;\f\r
167IF lobo ;[hh]\r
168mnport EQU 0F7E4H ;Modem data port A\r
169mnprts EQU 0F7E5H ;Modem status/conrtol port A\r
170baudrt EQU 0F7D0H ;Baud rate port A\r
171output EQU 04H ;Transmit buffer empty\r
172input EQU 01H ;Receive data available\r
173z80 SET TRUE ;a good z80, here\r
174ENDIF;lobo\r
175\r
176IF osi\r
177mnport EQU 0CF01H ;Modem data port\r
178mnprts EQU 0CF00H ;Modem status port\r
179output EQU 02H ;Transmitter empty\r
180input EQU 01H ;Input data available\r
181z80 SET FALSE ;I don't know...\r
182ENDIF;osi\r
183\r
184IF vector\r
185mnport EQU 04H ;Modem data port\r
186mnprts EQU 05H ;Modem status port\r
187output EQU 01H ;Transmitter empty\r
188input EQU 02H ;Input data available\r
189z80 SET FALSE ;I don't know...\r
190ENDIF;vector\r
191\r
192IF delphi ;[7]\r
193mnport EQU 22H ;[7] Modem data port\r
194mnprts EQU 23H ;[7] Modem status port\r
195output EQU 01H ;[7] Transmitter empty\r
196input EQU 02H ;[7] Input data available\r
197baudrt equ 29h ;[7] Baud rate port for channel 2 (default)\r
198z80 SET true ;[7] We're using the z80 side of the dual processor\r
199ENDIF;[7] delphi\r
200\r
201IF trs80\r
202;NEEDS display definition (e.g. trs80lb or trs80pt)\r
203mnport EQU 0F4H ;Modem data port (0F5H for port B)\r
204mnprts EQU 0F6H ;Modem status port (0F7H for port B)\r
205output EQU 04H ;Transmitter empty\r
206input EQU 01H ;Input data available\r
207z80 SET TRUE ;[hh] All TRS-80's but the CoCo\r
208ENDIF;trs80\r
209\r
210IF teletek\r
211mnport EQU 00H ;Modem data port (02 for port B (console))\r
212mnprts EQU 01H ;Modem status port (03 for port B (console))\r
213baudrt EQU 08H ;ctc0 control port (09 for port B (console))\r
214output EQU 04H ;Transmitter empty\r
215input EQU 01H ;Input data available\r
216z80 SET TRUE ;All Teleteks\r
217ENDIF;teletek\r
218\r
219IF osbrn1\r
220;Osborne 1 uses 6850 ACIA, but memory mapped. Derived from Apple.\r
221BAUDRT EQU 0EFC1H ;Memory location where baud rates are stored.\r
222OSTOP EQU 4000H ;Where we move OSMOVE to at startup\r
223OSPORT EQU 2A01H ;Communications Port.\r
224OSPRTS EQU 2A00H ;Communications Port Status.\r
225OUTPUT EQU 02H ;Output Buffer Empty.\r
226INPUT EQU 01H ;Input Register Full.\r
227OSBIN1 EQU 57H ;First Init Character for 6850 ACIA (Reset)\r
228;(I would have thought 03, but prom code writes 57 there)\r
229OSBI12 EQU 55H ;Second Init Character for ACIA (8-bits, 1200)\r
230OSBI03 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
232z80 SET TRUE ;[hh] a z80 here, also\r
233ENDIF;osbrn1\r
234\r
235IF 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
240prntst EQU 49H ;Printer\r
241;prndat EQU 48H\r
242contst EQU 41H ;Console\r
243;condat EQU 40H\r
244gentst EQU 51H ;General port.\r
245;gendat EQU 50H\r
246comtst 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
250z80 SET TRUE ; This one's a Z80.\r
251ENDIF;robin\r
252\r
253IF s1008 ;[29]\r
254mnport equ 00 ;printer port data\r
255mnprts equ 01 ;printer port status\r
256output equ 4 ;transmitter ready\r
257input equ 2 ;receiver ready\r
258z80 equ FALSE ;not important\r
259ENDIF;s1008 [29]\r
260\r
261IF mmate ;[29]\r
262mnport EQU 89H ;MODEM data port\r
263mnprts EQU 8BH ;MODEM status/control port\r
264output EQU 04H ;Transmit buffer empty, ready to send\r
265input EQU 01H ;Receive data available\r
266baudrt EQU 93H ;MODEM baud rate port\r
267 ;NOTE - also used for console\r
268z80 SET TRUE\r
269ENDIF;mmate [29]\r
270\r
271IF disc ;[29]\r
272mnport EQU 05 ;Discovery 83U port B data\r
273mnprts EQU 04 ;Discovery 83U port B status/command\r
274output EQU 04 ;Transmit buffer empty\r
275input EQU 01 ;Receiver ready\r
276z80 SET TRUE\r
277ENDIF;disc [29]\r
278\r
279IF cmemco ;[25]\r
280tuart EQU 020H ;TU-ART address\r
281mnport EQU tuart+1 ;Modem data port\r
282mnprts EQU tuart ;Modem status port\r
283output EQU 080H ;Transmitter empty\r
284input EQU 040H ;Input data available\r
285baudrt EQU tuart ;Baud rate port\r
286;Note: Needs terminal definition \r
287z80 SET TRUE ;This one's a Z80.\r
288ENDIF;cmemco\r
289\r
290IF cpt85xx\r
291baudrt EQU 4Ch ; Baud rate generater (National MM5307)\r
292mnport EQU 4Bh ; Comm port data register (Intel 8251)\r
293mnprts EQU 4Ah ; Comm port command/status register\r
294output EQU 01h ; Transmitter buffer empty flag\r
295input EQU 02h ; Reciver buffer full flag\r
296TxEmpty EQU 04h ; Transmitter empty flag\r
297z80 SET FALSE ; It's really an 8080 [or 8085 ... same thing]\r
298ENDIF;cpt85xx\r
299\r
300IF mmdI ;Morrow MicroDecision - the single-board one\r
301mnport EQU 0FEH ;Morrow Printer UART data port\r
302mnprts EQU 0FFH ;Morrow Printer UART command/status\r
303output EQU 01H ;Output ready bit.\r
304input EQU 02H ;Input ready bit.\r
305;Note: Needs terminal definition \r
306z80 SET FALSE ;I don't know...\r
307ENDIF;mmdI\r
308\r
309IF bbc ;[22]\r
310osbyte EQU 0FFF4H ; OS entry point\r
311osword EQU 0FFF1H ; " " "\r
312term EQU 0FFC8H ;Terminal mode OS entry\r
313z80 SET TRUE\r
314ENDIF;[22] bbc\r
315\r
316;Two types of 380Z system\r
317IF rm380zm ;[27] MDS - 5 1/4" discs\r
318mnport EQU 0C8H ;Modem data port\r
319mnprts EQU 0C9H ;Modem status port\r
320ENDIF;[32] rm380zm\r
321\r
322IF rm380zf ;[32] FDS - 8" discs\r
323mnport EQU 0E8H ;Modem data port\r
324mnprts EQU 0E9H ;Modem status port\r
325ENDIF;[32] rm380zf\r
326\r
327IF rm380z ;[32] Common to both systems\r
328output EQU 01H ;Transmitter buffer empty\r
329input EQU 02H ;Input data available\r
330TxEmpty EQU 04h ;Transmitter empty flag\r
331z80 SET TRUE\r
332ENDIF;[22] rm380z\r
333\r
334IF px8 ; [29]\r
335z80 SET TRUE\r
336mnprts EQU 0dh ; used in sending a break\r
337ENDIF ;px8 [29]\r
338\r
339IF mdI ;Morrow Decision I - the big sucker\r
340mnport equ 48H ; Modem data port.\r
341mnprts equ 4DH ; Modem status port.\r
342output equ 20H ; Transmitter empty.\r
343input equ 1 ; Input data available.\r
344mbase equ 48H ; Base address of Multi I/O port\r
345 ; selector area.\r
346grpsel equ 4FH ; Group select port.\r
347rbr equ 48H ; Read Data Buffer.\r
348group equ 1 ; Multi I/O Group byte for serial ports.\r
349congrp equ 1 ; Serial Port 1 for console\r
350mdmgrp equ 3 ; Serial Port 3 for modem.\r
351\r
352; Following are needed for baud rate changes...[Toad Hall]\r
353\r
354dlm equ 49H ; Baud Rate Divisor (Most Sig Bit)\r
355dll equ 48H ; Baud Rate Divisor (Least Sig Bit)\r
356ier equ 49H ; Interrupt Enable Register\r
357lcr equ 4BH ; Line Control Register\r
358lsr equ 4DH ; Line Status Register\r
359msr equ 4EH ; Modem Status Register\r
360dlab equ 80H ; Divisor Latch Access Bit\r
361wls0 equ 1 ; Word Length Select Bit 0\r
362wls1 equ 2 ; Word Length Select Bit 1 for 8 bit word\r
363stb equ 4 ; Stop bit count - 2 stop bits\r
364imask equ 0 ; Interrupt mask (all disabled)\r
365z80 SET TRUE ; This one's a Z80.\r
366ENDIF ;mdI NOTE: needs terminal definition. [Toad Hall]\r
367\r
368IF mikko\r
369sioac EQU 0FF12H ;SIO channel A register(s) address\r
370sioo3 EQU 01000001B ;SIO Write Reg. 3 original setup (?)\r
371 ;RX 7 bits,synch mode bits 0,RX enable\r
372sion3 EQU 11001111B ;SIO Write Reg. 3 KERMIT setup\r
373 ;RX 8 bits,synch mode bits 0,RX enable\r
374sioo4 EQU 01001111B ;SIO Write Reg. 4 original setup (?)\r
375 ;X16 clock,8 bit synch(ignored),\r
376 ;2stop bits,par even(on)\r
377sion4 EQU 01000100B ;SIO Write Reg. 4 KERMIT setup\r
378 ;X16 clock,8 bit synch(ignored),\r
379 ;1stop bit,par off\r
380sioo5 EQU 10101010B ;SIO Write Reg. 5 original setup (?)\r
381 ;DTR,TX 7 bits,TX enable,RTS\r
382sion5 EQU 11101010B ;SIO Write Reg. 5 KERMIT setup\r
383 ;DTR,TX 8 bits,TX enable,RTS\r
384txclk EQU 0FF30H ;Baud rate generator (CTC) for transmitter\r
385rxclk EQU 0FF31H ;Baud rate generator (CTC) for receiver\r
386chmask EQU 0F1F2H ;Mask byte address for SIO ch. A reception\r
387z80 SET TRUE ;It's got a SIO and a CTC, it must be a Z80\r
388ENDIF;mikko\r
389\r
390\r
391IF access ;[29]\r
392mnport EQU 40H ;Modem data port A\r
393mnprts EQU 42H ;Modem status/conrtol port A\r
394output EQU 04H ;Transmit buffer empty\r
395input EQU 01H ;Receive data available\r
396z80 SET TRUE ;a good z80, here\r
397ENDIF;access [29]\r
398\r
399\r
400IF robin OR dmII\r
401z80 SET TRUE ; This one's a Z80\r
402ENDIF;robin OR dmII\r
403\r
404IF hp125 ;[MF]\r
405z80 SET TRUE ;HP-125 uses a Z80\r
406ENDIF;hp125 [MF]\r
407\r
408IF gener OR cpm3 ; To be truly generic, we must assume 8080.\r
409z80 SET FALSE\r
410ENDIF;gener OR cpm3\r
411;\f\r
412IF osi\r
413defesc EQU ']'-100O ;The default escape character.\r
414ENDIF; osi \r
415\r
416IF vector\r
417defesc EQU '~' ;Vector can't type ']'.\r
418ENDIF;vector\r
419\r
420IF mikko OR osbrn1 OR lobo\r
421defesc EQU '\'-100O ;The default is Control \ -- it's easier B.E.\r
422ENDIF;mikko OR osbrn1 OR lobo\r
423\r
424IF cpt85xx\r
425defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)\r
426ENDIF;cpt85xx\r
427\r
428IF bbc OR rm380z OR px8 OR access OR S1008 ;[22] [29]\r
429defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)\r
430ENDIF ;bbc OR rm380z OR px8 OR access OR s1008[29]\r
431\r
432IF trs80\r
433defesc EQU '_'-100O ;CTRL-_ (Down-arrow on TRS-80 keyboard)\r
434ENDIF;trs80\r
435\r
436; Select initial setting for VT-52 emulation flag.\r
437\r
438IF vt52 ; If console looks like (or is) VT52\r
439vtval EQU 0 ; we don't need VT52 emulation\r
440ENDIF;vt52\r
441\r
442; If none of the above, default to VT52-EMULATION ON.\r
443IF NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125);[MF]\r
444vtval EQU 1\r
445ENDIF;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
450sysxin:\r
451\r
452IF 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
485nocoxon 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
492ENDIF ;dmII\r
493\r
494IF 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
504osstr1: 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
509ENDIF;osbrn1\r
510\r
511IF 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
522ENDIF ; cpt85x\r
523\r
524IF 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
544binit1: ana a ; Set sign bit as appropriate\r
545 jp binit2 ;\r
546 ori 4 ; Bit0 now in bit2\r
547binit2: 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
556ENDIF;[22] bbc\r
557\r
558IF rm380z ;[22]\r
559 mvi e,11h ;Output ctrl-Q to clear autopaging\r
560 call outcon\r
561ENDIF;[22] rm380z\r
562\r
563\r
564IF lobo ;[hh]\r
565 lxi d,siotbl ;[hh] address of status table\r
566 mvi c,siolen ;[hh] length of the table\r
567siolup: ;[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
582ENDIF ;lobo\r
583\r
584IF 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
591ENDIF;mikko\r
592\r
593IF 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
597ENDIF;mdI [Toad Hall]\r
598\r
599IF 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
606ENDIF;cmemco\r
607\r
608IF 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
618ENDIF;[7] delphi\r
619\r
620IF 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
634ENDIF ; px8 [29]\r
635\r
636IF 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
667ENDIF;disc [29]\r
668;\r
669;\f\r
670IF mikko ;currently for MIKROMIKKO only\r
671; copy command block into memory-mapped SIO.\r
672movmik: di ;disable interrupts\r
673movmk1: 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
680ENDIF;mikko\r
681\r
682;\f\r
683IF osbrn1\r
684osmove:\r
685osflag equ 0EF08H ;Osborne 1 Bank-2 flag\r
686;\r
687; return modem status in A\r
688;\r
689OSLDST:\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
699OSSTST:\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
707OSLDDA:\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
717OSSTDA:\r
718 DI\r
719 OUT 0\r
720 STA osport\r
721osstex:\r
722 OUT 1\r
723 mvi a,1\r
724 sta osflag\r
725 EI\r
726 ret\r
727ENDIF;osbrn1\r
728\r
729IF lobo\r
730; List of commands to set up SIO channel A for asynchronous operation.\r
731siotbl: 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
742siolen equ $-siotbl ; length of command list\r
743ENDIF;lobo\r
744\r
745IF mikko\r
746; command list to set SIO chip back to normal state\r
747miotbl: 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
754miolen equ $-miotbl ;MikroMikko SIO table length (original values)\r
755\r
756; command list to set up SIO chip for operation with Kermit\r
757mintbl: 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
764minlen equ $-mintbl ;MikroMikko SIO table length (KERMIT values)\r
765ENDIF;mikko\r
766\r
767\r
768IF bbc ;[22]\r
769modstr: db 16h,03h,'$' ; String to put screen into MODE 3\r
770ENDIF\r
771\r
772IF px8 ; [29]\r
773rsget: mvi b, 50h\r
774 jmp rsiox\r
775rsinst: mvi b, 30h\r
776 jmp rsiox\r
777rsput: mvi b, 60h\r
778 jmp rsiox\r
779rsoutst:mvi b, 40h\r
780 jmp rsiox\r
781rserst: mvi b, 90h\r
782 jmp rsiox\r
783rsopen: 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
789rsclose:mvi b, 20h ; close code\r
790rsiox: 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
798px8prm: dw 0, 0\r
799 db 0, 0, 0, 0, 0 ; the param area is overwritten in rsopen\r
800px8blk: 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
810ENDIF ; px8 [29]\r
811\r
812IF 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
832ENDIF ;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
839sysexit:\r
840\r
841IF 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
871coxon 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
880ENDIF ;dmII\r
881\r
882IF 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
889ENDIF;mikko\r
890\r
891IF 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
904ENDIF ;teletek\r
905\r
906IF 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
911ENDIF;cpt85xx\r
912\r
913IF bbc ;[22]\r
914 mvi a,0 ; Turn off terminal mode\r
915 call term\r
916ENDIF;[22] bbc\r
917\r
918IF px8 ;[29]\r
919 call rsclose\r
920ENDIF ;px8 [29]\r
921\r
922IF 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
933ENDIF ;hp125 [MF]\r
934\r
935 ret\r
936\r
937;\r
938; system-dependent processing for start of CONNECT command\r
939;\r
940syscon:\r
941IF 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
944ENDIF;robin OR trs80 OR cpt85xx\r
945\r
946IF 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
956ENDIF;osbrn1\r
957 ret\r
958\r
959conmsg: ; Messages printed when entering transparent (CONNECT) mode:\r
960IF robin ; for Robin, control-S key is hidden\r
961 db ' (Type Left Arrow to send CTRL-S)',cr,lf,'$'\r
962ENDIF;robin\r
963IF 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
966ENDIF;trs80\r
967IF 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
970ENDIF;cpt85xx\r
971;\f\r
972; syscls - system-dependent close routine\r
973; called when exiting transparent session.\r
974;\r
975syscls:\r
976IF 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
986ENDIF;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
993sysinh:\r
994IF robin OR dmII OR cpt85xx OR lobo \r
995 lxi d,inhlps ; we got options...\r
996 call prtstr ; print them.\r
997ENDIF;robin OR dmII OR cpt85xx OR lobo \r
998\r
999IF bbc OR rm380z ; some more\r
1000 lxi d,inhlps ; we got options...\r
1001 call prtstr ; print them.\r
1002ENDIF;[22] bbc OR rm380z \r
1003\r
1004IF px8 OR access OR mmate OR disc ;and more...\r
1005 lxi d,inhlps ; we got options...\r
1006 call prtstr ; print them.\r
1007ENDIF ;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
1014inhlps:\r
1015\r
1016IF robin OR dmII OR cpt85xx OR lobo\r
1017 db cr,lf,'B Transmit a BREAK'\r
1018ENDIF;robin OR dmII OR cpt85xx OR lobo \r
1019\r
1020IF bbc OR rm380z \r
1021 db cr,lf,'B Transmit a BREAK'\r
1022ENDIF;bbc OR rm380z \r
1023\r
1024IF px8 OR access OR mmate \r
1025 db cr,lf,'B Transmit a BREAK'\r
1026ENDIF ;px8 OR access OR mmate \r
1027\r
1028IF 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
1031ENDIF;disc [29]\r
1032\r
1033IF lobo\r
1034 db cr,lf,'D Drop the line'\r
1035ENDIF;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
1047sysint: ani 137O ; convert lower case to upper, for testing...\r
1048\r
1049IF 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
1052ENDIF;robin OR dmII OR cpt85xx OR lobo \r
1053\r
1054IF 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
1057ENDIF; bbc OR rm380z \r
1058\r
1059IF 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
1062ENDIF ; px8 OR access OR mmate [28] [29]\r
1063\r
1064IF lobo ;[hh]\r
1065 cpi 'D' ;[hh] disconnect?\r
1066 jz discon ;[hh] yes, go do it. nonskip return when done.\r
1067ENDIF ;lobo\r
1068\r
1069IF 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
1074ENDIF;disc [29]\r
1075\r
1076 jmp rskp ; take skip return - command not recognized.\r
1077\r
1078\r
1079;\f\r
1080IF robin ;Definitions & code to send a BREAK (ungenerically, no other way).\r
1081\r
1082comctl equ 59h ;VT180 communications port\r
1083crtctl equ 41h ;VT180 crt port\r
1084\r
1085;VT180 serial port command bits\r
1086\r
1087txe equ 1 ;transmit enable\r
1088dtr equ 2 ;dtr on\r
1089rxe equ 4 ;rx enable\r
1090sndbrk equ 8\r
1091rerr equ 10h ;reset error\r
1092rts equ 20h ;RTS on\r
1093reset equ 40h ;port reset\r
1094\r
1095;Send a break to the communications port.\r
1096;\r
1097\r
1098sendbr: 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
1104sndbr1: 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
1115ENDIF;robin\r
1116;\f\r
1117IF dmII ;[jd] this added to send break on DECmate\r
1118\r
1119; DECmate command codes for 6120 I/O processor\r
1120oboff equ 3fh ; offset of outbyt routine for 6120\r
1121prtctl equ 02h ; port control\r
1122brdat equ 06h ; data to tell 6120 to send a break\r
1123brdur equ 30 ; duration, 30 = 300 ms.\r
1124\r
1125sendbr: 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
1130outbyt: 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
1135ENDIF;dmII\r
1136;\f\r
1137IF 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
1143sendbr:\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
1149sndbr1: 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
1172ENDIF;access OR mmate [29]\r
1173\r
1174IF 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
1178sendbr: 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
1183discon: 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
1186sndbr1: 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
1195outctl: sta mnprts ;[hh]\r
1196 ret\r
1197ENDIF ;lobo\r
1198;\f\r
1199IF cpt85xx OR rm380z ;[lmj] [22] [25]\r
1200sendbr:\r
1201;\r
1202; Ensure that the transmitter has finished sending buffered chars\r
1203sndbr1: 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
1220ENDIF;cpt85xx OR rm380z \r
1221\r
1222IF px8 ; [29]\r
1223sendbr: 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
1230ENDIF ; px8 [29]\r
1231\r
1232;\f\r
1233IF bbc ;[22]\r
1234sendbr:\r
1235;\r
1236; Ensure that the transmitter has finished sending buffered chars\r
1237sndbr1: 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
1272wrtiom:\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
1280parblk: DS 5 ; reserve space for parameter block\r
1281ENDIF;bbc [22]\r
1282;\f\r
1283IF 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
1292sendlbr:\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
1296sendbr:\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
1304sndbr1: 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
1317sendbr2:\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
1332ENDIF ;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
1341sysflt:\r
1342 mov a,e ; get character for testing\r
1343IF 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
1347ENDIF;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
1356mdmflt:\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
1370prtflt:\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
1378sysbye:\r
1379IF lobo ;[hh]\r
1380 call discon ;[hh] force modem to hang up\r
1381ENDIF;lobo\r
1382 ret\r
1383\r
1384IF lasm\r
1385 LINK CPXSY2.ASM ; If m80 then this ignored\r
1386ENDIF ; lasm\r