; KERMIT - (Celtic for "FREE") ; ; This is the CP/M-80 implementation of the Columbia University ; KERMIT file transfer protocol. ; ; Version 4.11 ; ; Copyright June 1981,1982,1983,1984,1985 ; Columbia University ; ; Originally written by Bill Catchings of the Columbia University Center for ; Computing Activities, 612 W. 115th St., New York, NY 10025. ; ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben, ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many ; others. ; ; This file contains the system-dependent code and data for the JWD 8080 ; computer system. ; ; ; Keep module name, edit number, and last revision date in memory. ; sysedt: db 'CPXSYS.ASM (35) 01-Dec-86$' family: db 'CPXJWD.ASM (1) 19-March-2026$' ; ; SER1 equ 8 ;base I/O address of second 8250 UART RXR equ 0 ;Receiver buffer register TXR equ 0 ;Transmitter buffer register IER equ 1 ;Interrupt enable register LCR equ 3 ;Line control register MCR equ 4 ;Modem control register LSR equ 5 ;Line status register MSR equ 6 ;Modem status register ; ; Define monitor serial port ; SER1RX equ SER1+RXR ;received data register SER1TX equ SER1+TXR ;transmit data register SER1IE equ SER1+IER ;interrupt enable register SER1LC equ SER1+LCR ;line control register SER1MC equ SER1+MCR ;modem control register SER1LS equ SER1+LSR ;line status register SER1MS equ SER1+MSR ;modem status register RXRDY equ 1 ;mask for rx buffer full TXRDY equ 32 ;mask for tx buffer empty TXEMT equ 64 ;mask for transmitter empty TXBRK equ 64 ;mask for set break DLABT equ 128 ;mask for divisor access bit ; ; ; sysxin - system dependent initialisation code ; sysxin: ; ; Initialize 8250 AUX serial port ; ; access baud generator, no parity, 1 stop bit, 8 data bits ; mvi a,83h out SER1LC ;line control register ; ; fixed baud rate of 19200: crystal is 1.843200 Mhz. ; Divisor is 1843200/(16*19200) = 6 ; mvi a,6 ;fix at 19.2 kbaud out SER1RX ;lsb xra a out SER1IE ;msb=0 ; ; access data registers, no parity, 1 stop bits, 8 data bits ; mvi a,3 out SER1LC ;line control register ; ; no loopback, OUT2 on, OUT1 on, RTS on, DTR on ; mvi a,0fH out SER1MC ;modem control register ; ; disable all interrupts: modem, receive error, transmit, and receive ; xra a out SER1IE ;interrupt enable register ; ret ; ; ; sysexit - system-dependent termination code ; sysexit: ; ; Re-initialize 8250 AUX serial port ; jmp sysxin ; ; ; syscon - system-dependent processing for start of CONNECT command ; syscon: ; ; Nothing required here for the JWD 8080 computer ; ret ; ; ; conmsg - Message to print when entering connect mode ; conmsg: ; ; This is just text data. Nothing required here for the JWD 8080 computer ; ; ; syscls - system-dependent close routine ; called when exiting transparent session. ; syscls: ; ; Nothing required here for the JWD 8080 computer ; ret ; ; ; sysinh - help for system-dependent special functions. ; called in response to ?, after listing all the ; system-independent escape sequences. ; sysinh: ; ; Nothing required here for the JWD 8080 computer ; ret ; ; ; inhlps - additional, system-dependent help for transparent mode ; (two-character escape sequences) ; inhlps: ; db cr,lf,'B Transmit a BREAK' db cr,lf db '$' ;table terminator ; ; ; sysint - system dependent special functions ; called when transparent escape character has been typed; ; the second character of the sequence is in A (and in B). ; returns: ; ; non-skip: sequence has been processed (ret) ; skip: sequence was not recognized (jmp rskp) ; sysint: ani 4fh ;Convert lower case to upper cpi 'B' ;Send break? jnz sysintex ;Return command not recognized sysint1: in SER1LS ;read device status ani TXRDY ;tx ready? jz sysint1 ;repeat if no xra a ;clear A out SER1TX ;send pad character sysint2: in SER1LS ;read device status ani TXRDY ;tx ready? jz sysint2 ;repeat if no in SER1LC ;get line control bits ori TXBRK ;break set out SER1LC ;turn on break sysint3: in SER1LS ;read device status ani TXEMT ;tx idle? jz sysint3 ;repeat if no in SER1LC ;get line control bits cma ;invert it ori TXBRK ;break set cma ;invert it out SER1LC ;turn off break ret ;done sysintex: jmp rskp ;command not recognized ; ; ; sysflt - system-dependent filter ; called with character in E. ; if this character should not be printed, return with A = zero. ; preserves bc, de, hl. ; note: ,,, and are always discarded. ; sysflt: mov a,e ;get character for testing ret ; ; ; mdmflt - modem filter [30] ; called with character to be sent to printer in E ; with parity set as appropriate. ; return with accumulator = 0 to do nothing, ; <> 0 to send char in E. mdmflt: mov a,e ;get character to test ret ; ; ; prtflt - printer filter [30] ; called with character to be sent to printer in E ; returns with a = 0 to do nothing ; a <> 0 to print it. ; prtflt: mov a,e ;get character to test ret ; ; ; system-dependent processing for BYE command. ; sysbye: ret ; ; ; This is the system-dependent command to change the baud rate. ; DE contains the two-byte value from the baud rate table; this ; value is also stored in 'speed'. ; sysspd: in SER1LC ;get line control bits ori DLABT ;set divisor access bit out SER1LC ;enable divisor latch access mov a,e ;get divisor out SER1RX ;set divisor xra a ;clear A out SER1IE ;msb=0 in SER1LC ;get line control bits cma ;invert ori DLABT ;set divisor latch access cma ;clear divisor latch access out SER1LC ;enable data register access ret ; ; Speed tables ; (Note that speed tables MUST be in alphabetical order for later ; lookup procedures, and must begin with a value showing the total ; number of entries. The speed help tables are just for us poor ; humans. ; ; db string length,string,divisor (2 identical bytes or 1 word) ; spdtbl: db 0ah ;10 entries db 06h,'115200$',01h,01h db 04h,'1200$',60h,60h db 05h,'14400$',08h,08h db 05h,'19200$',06h,06h db 04h,'2400$',30h,30h db 05h,'38400$',03h,03h db 04h,'4800$',18h,18h db 05h,'57600$',02h,02h db 03h,'600$',0c0h,0c0h db 04h,'9600$',0ch,0ch ; sphtbl: db cr,lf,' 600 1200 2400 4800 9600 19200 38400 57600 115200$' ; ; ; This is the system-dependent SET PORT command. ; HL contains the argument from the command table. ; sysprt: ret ; prttbl equ 0 prhtbl equ 0 ; ; ; selmdm - select modem port ; selcon - select console port ; selmdm is called before using inpmdm or outmdm; ; selcon is called before using inpcon or outcon. ; preserves BC, DE, HL. ; selmdm: selcon: ret ; ; ; inpcon - Get character from console, or return zero. ; Result is returned in A. destroys bc, de, hl. ; inpcon: mvi c,dconio ;direct console I/O BDOS call. mvi e,0FFH ;input. call bdos ret ; ; ; outcon - Output character in E to the console. ; Destroys bc, de, hl ; outcon: mvi c,dconio ;console output bdos call. call bdos ;output the char to the console. ret ; ; ; outmdm - output a char from E to the modem. ; the parity bit has been set as necessary. ; Returns nonskip; bc, de, hl preserved. ; outmdm: in SER1LS ;read device status ani TXRDY ;tx ready? jz outmdm ;repeat if no mov a,e ;get character to accumulator out SER1TX ;send it ret ; ; ; inpmdm - Get character from modem; return zero if none available. ; Destroys bc, de, hl. ; inpmdm: in SER1LS ;read device status ani RXRDY ;rx ready? rz ;return if no in SER1RX ;get character if ready ret ; ; ; flsmdm - flush comm line. ; Modem is selected. ; Currently, just gets characters until none are available. ; flsmdm: call inpmdm ;try to get a character ora a ;got one? jnz flsmdm ;if so, try for another ret ;receiver is drained so return. ; ; ; lptstat - get the printer status. Return a=0ffh if ok, or 0 if not. ; lptstat: xra a ;assume it is ok ret ; ; ; outlpt - output character in E to printer ; Console is selected. ; Preserves de. ; outlpt: push d ; save DE ana a jz outlp1 ; if A = 0 do nothing mvi c,lstout ; BDOS call to LST device call bdos ; char to printer outlp1: pop d ; restore saved register pair ret ; ; ;------------------------------------------------------------------------------ ; ; Screen manipulation routines ; ; csrpos - cursor position for ANSI terminals ; csrpos: push b ; save coordinates lxi d,curldn ; get cursor leadin sequence call prtstr ; print it pop h ; peek at coordinates push h ; then save away again mov l,h ; l = row mvi h,0 ; hl = row call nout ; output in decimal mvi e,';' ; follow with semicolon call outcon ; print it pop h ; restore column mvi h,0 ; hl = column call nout mvi e,'H' ; terminate with 'move cursor' command jmp outcon ; output it and return ; ; ; delchr - make delete look like a backspace. Unless delete is a printing ; character, we just need to print a backspace. (we'll output clrspc ; afterwards) ; delchr: mvi e,bs ;get a backspace jmp outcon ; ; ; clrspc - erase the character at the current cursor position ; clrspc: mvi e,' ' call outcon mvi e,bs ;get a backspace jmp outcon ; ; ; clrlin - erase the current line ; clrlin: lxi d,eralin jmp prtstr ; ; ; clrtop - erase the whole screen, and go home. preserves b (but not c) ; clrtop: lxi d,erascr jmp prtstr ; ; ; control codes for VT100 ; ttytyp: db 'VT100$' sysver: db 'JWD CP/M-80$' ; ; Note that we cannot support Graphics Mode or the H19 erase-screen command ; (E), because the sequences are more than three bytes. ; defesc EQU '\'-100O ;still Control-\ (just ran out of room...) vtval EQU 0 ;we probably don't want VT52 emulation outlin: db esc,3CH,esc,'[H',esc,'[J',cr,lf,tab,tab,'$' erascr: db esc,'[H',esc,'[J$' ;clear screen and go home. eralin: db cr,esc,'[K$' ;clear line. curldn: db esc,'[$' ;cursor leadin ttab: ta: db esc,'[A$' ;cursor up. tb: db esc,'[B$' ;cursor down. tc: db esc,'[C$' ;cursor right. td: db esc,'[D$' ;cursor left te: db '$',0,0,0 ;(can't) Clear display tf: db '$',0,0,0 ;(don't) Enter Graphics Mode tg: db '$',0,0,0 ;(don't) Exit Graphics mode th: db esc,'[H$' ;cursor home. ti: db esc,'M$',0 ;reverse linefeed. tj: db esc,'[J$' ;clear to end of screen. tk: db esc,'[K$' ;clear to end of line. ovlend equ $ ;end of overlay IF lasm ;not really needed, as M80 ignores END in include files END ENDIF ;lasm