-!PCKERM.ASM_PCKERM.ASM
-1,1
;	.XLIST
-23,89
IBMPC   EQU     0               ; For IBM PC conditional assembly.
Z100	EQU	1		; For Heath/Zenith Z-100
STEVE   EQU     0               ; For Steve's homebrew assembly.

; System dependent parameters

IF IBMPC
 
DEFESC  EQU     ']'-100Q        ; The default escape character.

MDMDAT	EQU	03F8H		; Address of modem port (data)
MDMSTS	EQU	03FDH		; Address of modem port status
MDMCOM	EQU	03FBH		; Address of modem port command

MDMINP	EQU	1		; Input ready bit

MDMINTV	EQU	0030H		; Address of modem port interrupt vector
MDMINTO	EQU	0EFH		; Mask to enable interrupt for modem  port
MDMINTC	EQU	010H		; Bit to set to disable interrupts for modem
INTCONT	EQU	0021H		; Address of 8259 interrupt controller ICW2-3
INTCON1	EQU	0020H		; Address of 8259 ICW1
EOICOM	EQU	0064H		; End of interrupt
-97
; Interrupt types for extra system functions

BIOS    EQU     10H
COMM	EQU	14H
KEYB	EQU	16H
ENDIF

IF Z100

DEFESC  EQU     '\'-100Q        ; The default escape character.

; BIOS entry points

BIOS_SEG SEGMENT AT 40H		; Define segment where BIOS really is

	ORG	6*3
BIOS_AUXOUT LABEL FAR		; AUX output routine

	ORG	26*3
BIOS_AUXFUNC LABEL FAR		; AUX: function

BIOS_SEG ENDS			; End of BIOS segment defs

; Function codes for BIOS_AUXFUNC

CHR_READ	EQU	1	; Read character
CHR_STATUS	EQU	2	; Get status
  CHR_SFGS	EQU	0	; Get status subfunction
  CHR_SFGC	EQU	1	; Get config subfunction
CHR_CONTROL	EQU	3	; Control function
 CHR_CFSU	EQU	0	; Set new configuration parameters


B00455	EQU	0		; 45.5 baud
B0050	EQU	1		; 50 baud
B0075	EQU	2		; 75 baud
B0110	EQU	3		; 110 baud
B01345	EQU	4		; 134.5 baud
B0150	EQU	5		; 150 baud
B0300	EQU	6		; 300 baud
B0600	EQU	7		; 600 baud
B1200	EQU	8		; 1200 baud
B1800	EQU	9		; 1800 baud
B2000	EQU	10		; 2000 baud
B2400	EQU	11		; 2400 baud
B4800	EQU	12		; 4800 baud
B9600	EQU	13		; 9600 baud
B19200	EQU	14		; 19200 baud
B38400	EQU	15		; 38400 baud
ENDIF
 
BELL    EQU     07Q
TAB     EQU     11Q
LF      EQU     12Q
FF      EQU     14Q
CR      EQU     15Q
XON     EQU     21Q
XOFF    EQU     23Q
ESC     EQU     33Q
DEL     EQU     177Q
BS	EQU	08H
 
DOS     EQU     21H

CONIN   EQU     01H
CONOUT  EQU     02H
RDRIN   EQU     03H
PUNOUT  EQU     04H
LSTOUT  EQU     05H
DCONIO  EQU     06H
GTIOB   EQU     07H
PRSTR   EQU     09H
CONSTAT EQU     0BH
OPENF   EQU     0FH
CLOSF   EQU     10H
SFIRST  EQU     11H
SNEXT   EQU     12H
DELF    EQU     13H
READF   EQU     14H             ; Read from the file.
WRITEF  EQU     15H
MAKEF   EQU     16H
SETDMA	EQU	1AH		; Set disk transfer address
CFLSZ   EQU     23H
 
MAXPKT  EQU     '~'-' '+2Q      ; Maximum size of a packet.
MAXTRY  EQU     05Q             ; Default number of retries on a packet.
IMXTRY  EQU     20Q             ; Default number of retries send initiate.
DRPSIZ  EQU     5EH             ; Default receive packet size.
DSPSIZ  EQU     20H             ; Default send packet size.
DSTIME  EQU     08H             ; Default send time out interval.
DRTIME  EQU     05H             ; Default receive time out interval.
DSPAD   EQU     00H             ; Default send padding.
DRPAD   EQU     00H             ; Default receive padding.
DSPADC  EQU     00H             ; Default send padding char.
DRPADC  EQU     00H             ; Default receive padding char.
DSEOL   EQU     CR              ; Default send EOL char.
DREOL   EQU     CR              ; Default receive EOL char.
DSQUOT  EQU     '#'             ; Default send quote char.
DRQUOT  EQU     '#'             ; Default receive quote char.
 
SOH     EQU     01H             ; Start of header char.
 
BUFSIZ  EQU     80H             ; Size of DMA.
MAXFIL  EQU     50H             ; Maximum number of files allowed.
 
DIASW   EQU     01H             ; Default is diagnostics on.
 
CMKEY   EQU     01H             ; Parse a keyword.
CMIFI   EQU     02H             ; Parse an input file spec (can be wild).
CMOFI   EQU     03H             ; Parse an output file spec.
CMCFM   EQU     04H             ; Parse a confirm.

-107,107
versio  db      'CUCCA'
IF IBMPC
	db	' IBM-PC'
ENDIF
IF Z100
	db	'/Stevens Heath/Zenith Z-100'
ENDIF
	db	' Kermit-86 - ver 1.0',cr,lf,
-117,117
	db	'type Ctrl-'
IF IBMPC
	db	']'
ENDIF
IF Z100
	db	'\'
ENDIF
	db	'-C to return to PC]',cr,lf,'$'
-118:tmsg2	db	cr,lf,'[Back at micro]',cr,lf,'$'
-164,164
IF IBMPC
        db      cr,lf,'VT52-EMULATION$'
ENDIF
IF Z100
	db	'$'
ENDIF
-169,169
IF IBMPC
bdhlp	db	cr,lf,'300   1200   1800   4800$'
ENDIF
IF Z100
bdhlp	db	cr,lf,'45.5	50	75	110	134.5	150	300'
	db	'	600	1200	1800'
	db	cr,lf,'	2000	2400	4800	9600	19200	38400'
ENDIF
-177,184
IF IBMPC
vtemst  db      cr,lf,'VT52 emulation on$'
novtst  db      cr,lf,'VT52 emulation off$'
ENDIF
ibmst   db      cr,lf,'IBM on$'
noibm   db      cr,lf,'IBM off$'
IF Z100
b04st	db	cr,lf,'Baud rate is 45.5$'
b05st	db	cr,lf,'Baud rate is 50$'
b07st	db	cr,lf,'Baud rate is 75$'
b11st	db	cr,lf,'Baud rate is 110$'
b13st	db	cr,lf,'Baud rate is 134.5$'
b15st	db	cr,lf,'Baud rate is 150$'
ENDIF
b03st	db	cr,lf,'Baud rate is 300$'
IF Z100
b06st	db	cr,lf,'Baud rate is 600$'
ENDIF
b12st	db	cr,lf,'Baud rate is 1200$'
b18st	db	cr,lf,'Baud rate is 1800$'
IF Z100
b20st	db	cr,lf,'Baud rate is 2000$'
b24st	db	cr,lf,'Baud rate is 2400$'
ENDIF
b48st	db	cr,lf,'Baud rate is 4800$'
IF Z100
b96st	db	cr,lf,'Baud rate is 9600$'
b19st	db	cr,lf,'Baud rate is 19200$'
b38st	db	cr,lf,'Baud rate is 38400$'
ENDIF
-191,191
outlin  db      cr,lf,'     CUCCA'
IF IBMPC
	db	' IBM-PC'
ENDIF
IF Z100
	db	'/Stevens Heath/Zenith Z-100'
ENDIF
	db	' Kermit-86 V1.0',
-199,200
IF IBMPC
clrlin  db      cr,'$'			; Clear line (just the cr part).
ENDIF
IF Z100
clrlin	db	cr,esc,'K$'		; Clear line on Z-100
clrscr	db	esc,'H',esc,'J$'	; Home and clear screen
homcur	db	esc,'H$'		; Home cursor
ENDIF
prsp	db	' $'			; Print a space.

; Cursor addressing items

IF IBMPC
-201:scrhi	dw	0434H			; Err when 8th bit is on.
-224
ENDIF

IF Z100
scrhi	db	esc,'Y',23H,54H,lf,'$'	; 8th bit on in character
scrrpr	db	esc,'Y',27H,20H,'$'	; Prompt when Kermit ends
screrr	db	esc,'Y',26H,20H,'$'	; Error messages
scrfln	db	esc,'Y',25H,2CH,'$'	; File name
scrnrt	db	esc,'Y',23H,35H,lf,'$'	; Number of retries
scrnp	db	esc,'Y',23H,35H,'$'	; Number of packets
scrfr	db	esc,'Y',26H,20H,'$'	; Rename file
scrst	db	esc,'Y',23H,54H,'$'	; Status
scrsp	db	esc,'Y',28H,20H,'$'	; send packet
scrrp	db	esc,'Y',2AH,20H,'$'	; Receive packet
ENDIF
-245,245
IF IBMPC
settab  db      07H             ; seven entries.
ENDIF
IF Z100
settab	db	06H		; Only six entries for Z-100
ENDIF
-258,259
IF IBMPC
        db      0EH,'VT52-EMULATION$'
        dw      vt52em
ENDIF
-272
IF IBMPC
-281
ENDIF
IF Z100
bdtab	db	010H		; 16 entries
	db	03H,'110$'
	dw	b0110
	db	04H,'1200$'
	dw	b1200
	db	03H,'134$'
	dw	b01345
	db	03H,'150$'
	dw	b0150
	db	04H,'1800$'
	dw	b1800
	db	05H,'19200$'
	dw	b19200
	db	04H,'2000$'
	dw	b2000
	db	04H,'2400$'
	dw	b2400
	db	03H,'300$'
	dw	b0300
	db	05H,'38400$'
	db	b38400
	db	02H,'45$'
	dw	b00455
	db	04H,'4800$'
	dw	b4800
	db	02H,'50$'
	dw	b0050
	db	03H,'600$'
	dw	b0600
	db	02H,'75$'
	dw	b0075
	db	04H,'9600$'
	dw	b9600
ENDIF
-282: 
-324,324
IF IBMPC
vtflg   db      1               ; VT52 emulation flag (default on).
ENDIF
-339,339
IF IBMPC
baud	db	B4800		; Use default of 4800.
ENDIF
IF Z100
auxcnf	db	4 dup(?)	; AUX port configuration info
baud	db	?		; Baud rate
auxcnf1	db	12 dup(?)	; Rest of configuration info
ENDIF
-388,390
-404
        call cmblnk             ; Clear the screen.
	call locate

-409,409
	mov ah,setdma		; Set disk transfer address.
-410:	mov dx,offset buff
-413,413
IF IBMPC
	mov dx,mdmcom		; LCR -- Initialize baud rate.
-418,418
	mov dx,mdmdat
-424,426
	mov dx,mdmcom
	mov al,bl
	out dx,al
ENDIF

IF Z100
	mov bx,ds		; Set up pointer to config info
	mov es,bx		;  .  .  .
	mov bx,offset auxcnf	;  .  .  .
	mov ah,chr_status	; Get the function code
	mov al,chr_sfgc		; And the subfunction to get config
	call bios_auxfunc	; Get the block
ENDIF
-486
IF IBMPC
-491
ENDIF

IF Z100
	mov dx,offset screrr	; Get address of string to position cursor
	mov ah,prstr		; Get the function code
	int dos			; Print the addressing string
	ret			; And return
ENDIF
-492:ERPOS	ENDP
-496
IF IBMPC
-501
ENDIF

IF Z100
	mov ah,prstr		; Get the function to print string
	mov dx,offset scrnrt	; Get the address of the string
	int dos			; Print the string
	ret			; And return
ENDIF
-507
IF IBMPC
-511
ENDIF

IF Z100
	mov ah,prstr		; Get the function to print string
	mov dx,offset scrhi	; Get the address of the string
	int dos			; Print the string
ENDIF
-618,618
read2:
IF IBMPC
	mov ah,2		; Position cursor.
-619:	mov dx,scrst
-621
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-624
IF IBMPC
-628
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrnp	; and string to move cursor
	int dos			; Print the string
ENDIF
-645
IF IBMPC
-649
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-650:        mov dx,offset infms3    ; Plus a little cuteness.
-652
IF IBMPC
-657,658
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrrpr	; and string to move cursor
	int dos			; Print the string
ENDIF
        jmp rskp
read6:
IF IBMPC
	mov ah,2		; Position cursor.
-661
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-664
IF IBMPC
-668
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrrpr	; and string to move cursor
	int dos			; Print the string
ENDIF
-669:        jmp rskp
-1008,1008
send2:
IF IBMPC
	mov ah,2                ; Position cursor.
-1011
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-1014
IF IBMPC
-1018
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrnp	; and string to move cursor
	int dos			; Print the string
ENDIF
-1042
IF IBMPC
-1043:	mov ah,2                ; Position cursor.
-1046
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-1049
IF IBMPC
-1054,1055
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrrpr	; and string to move cursor
	int dos			; Print the string
ENDIF
        jmp rskp
send8:
IF IBMPC
	mov ah,2                ; Position cursor.
-1058
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrst	; and string to move cursor
	int dos			; Print the string
ENDIF
-1061
IF IBMPC
-1062:	mov ah,2
-1065
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrrpr	; and string to move cursor
	int dos			; Print the string
ENDIF
-1180
IF IBMPC
-1184
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrfln	; and string to move cursor
	int dos			; Print the string
ENDIF
-1744
IF IBMPC
-1748
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrfln	; and string to move cursor
	int dos			; Print the string
ENDIF
-1749:        mov ah,prstr            ; Print the file name.
-1762,1762
gf8x:
IF IBMPC
	mov ah,2		; Position cursor.
-1765
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrfr	; and string to move cursor
	int dos			; Print the string
ENDIF
-1921
IF IBMPC
-1925
ENDIF
IF Z100
	mov ah,prstr		; Get print string function
	mov dx,offset scrsp	; and string to move cursor
	int dos			; Print the string
ENDIF
-1959
IF IBMPC
-1960:outchr: mov al,ah               ; Char must be in al.
-1971
ENDIF

IF Z100
outchr:	mov al,ah		; Yes, get the character into al
	mov cx,0
	cmp ibmflg,0		; IBM mode?
	je outch1		; No, skip this
	or al,080H		; Yes, turn on parity bit
outch1:	call bios_auxout	; Send the character
ENDIF

-1986,1989
inchr:
IF IBMPC
	mov dx,mdmsts		; Get port status.
	in al,dx
	test al,mdminp		; Data available?
	jnz inchr3		; Read char ok.
ENDIF
IF Z100
	push	bx		; Save BX
	mov ah,chr_status	; Get the function
	mov al,chr_sfgs		; And the subfunction
	call bios_auxfunc	; Determine if anything to input
	cmp bl,0		; Is there?
	jnz inchr3		; Yes, go get it
	pop bx			; And restore BX
ENDIF
-2001,2002

inchr3:
IF IBMPC
	mov dx,mdmdat		; Read in the char.
	in al,dx
ENDIF
IF Z100
	mov ah,chr_read		; Get the function to read
	call bios_auxfunc	; Get a character
	pop bx			; Restore BX
ENDIF
-2016
IF IBMPC
-2020
ENDIF

IF Z100
	mov ah,prstr		; Get the function to print string
	mov dx,offset scrst	; Get the string address
	int dos			; Position the cursor
ENDIF
-2021:	mov ah,prstr
-2174,2174
IF IBMPC
-2178
ENDIF
-2192
IF IBMPC
-2197,2199
	mov bx,mdmintv
	push [bx]		; Serial Card Interrupt vector.
	mov bx,mdmintv+2
-2205,2205
	mov bx,mdmintv
-2206:	mov ax,offset serint
-2209,2209
	mov bx,mdmintv+2
-2227,2230
	in al,intcont		; Set up 8259 interrupt controller.
	and al,MDMINTO		; Enable INT4.
	out intcont,al
	mov dx,mdmcom		; Set up baud, parity, etc.
-2242,2242
ENDIF
IF Z100
	mov ssp,sp		; Save current stack pointer
ENDIF
telnoe: call plup		; Char at port (type to console) ?
IF IBMPC
-2245
ENDIF
-2253
IF IBMPC
-2254:	cmp al,BELL
-2261
ENDIF
IF Z100
	mov dl,al		; Get the character
	mov ah,dconio		; and the function
	int dos			; type the character
	jmp telnoe		; Get next character
ENDIF
-2265
IF IBMPC
-2271,2273
	in al,intcont		; Interrupt control.
	or al,mdmintc		; Inhibit IRQ4.
	out intcont,al
-2283,2285
	mov bx,mdmintv+2	; Restore old interrupt vectors.
	pop [bx]
	mov bx,mdmintv
-2289
ENDIF
IF Z100
	mov sp,ssp
ENDIF
-2290:	mov ah,prstr
-2296
IF IBMPC
-2307,2311
	mov dx,mdmsts		; Asynch status port.
	in al,dx
	test al,mdminp		; Data available?
	jz retint		; Nope.
	mov dx,mdmdat
-2325,2326
	mov al,eoicom
	out intcon1,al		;Send End-of-Interrupt to 8259.
-2332
ENDIF
-2340
	nop			; Make sure we have 3 bytes
-2341:	jmp plup 
-2348
IF IBMPC
-2365
ENDIF
IF Z100
	push bx			; Save BX
	mov ah,chr_status	; Get the function we want
	mov al,chr_sfgs		; Get the subfunction to get status
	call bios_auxfunc	; Perform the function
	cmp bl,0		; Anything in queue?
	jne prtch1		; Yes, go get it
	pop bx			; Restore BX
	jmp rskp		; No, give skip return

prtch1:	mov ah,chr_read		; Want to read character
	call bios_auxfunc	; Do it
	and al,07FH		; Strip off parity bit
	pop bx			; And restore BX
ENDIF
-2369
IF IBMPC
-2392,2393
ENDIF
 
CONCHR  PROC    NEAR
IF IBMPC
-2414
ENDIF
IF Z100
	mov ah,dconio		; Determine if character present
	mov dl,0ffH		; Want input
	int dos			; Get status
	cmp al,00H		; Any characters there?
	jne nobrk		; if not, forget it
	jmp rskp		; Give skip return
ENDIF
-2415:
-2434
IF IBMPC
-2438
ENDIF
-2489,2490
IF IBMPC
	mov dx,mdmdat
	out dx,al
ENDIF
IF Z100
	call bios_auxout	; Send the character
ENDIF
-2495
IF IBMPC
-2525
ENDIF
-2526:        jmp telnoe              ; Return home.
-2528
IF IBMPC
-2657
ENDIF
-2733
IF IBMPC
-2747
ENDIF
-2813
IF IBMPC
-2814:	mov dx,03FBH		; LCR
-2827
ENDIF
IF Z100
	mov bx,ds		; Set up pointer to config info
	mov es,bx		;  .  .  .
	mov bx,offset auxcnf	;  .  .  .
	mov ah,chr_control	; Function is control
	mov al,chr_cfsu		; Subfunction is set new config
	call bios_auxfunc	; Set the configuration
ENDIF
-2848
IF IBMPC
-2854
ENDIF
-2872
IF Z100
	mov dx,offset b04st
	cmp baud,B00455
	jz stat9a
	mov dx,offset b05st
	cmp baud,B0050
	jz stat9a
	mov dx,offset b07st
	cmp baud,b0075
	jz stat9a
	mov dx,offset b11st
	cmp baud,B0110
	jz stat9a
	mov dx,offset b13st
	cmp baud,B01345
	jz stat9a
	mov dx,offset b15st
	cmp baud,B0150
	jz stat9a
	mov dx,offset b06st
	cmp baud,B0600
	jne stat9b
stat9a:	jmp stat9
stat9b:	mov dx,offset b20st
	cmp baud,B2000
	jz stat9
	mov dx,offset b24st
	cmp baud,B2400
	jz stat9
	mov dx,offset b96st
	cmp baud,B9600
	jz stat9
	mov dx,offset b19st
	cmp baud,B19200
	jz stat9
	mov dx,offset b38st
	cmp baud,B38400
	jz stat9
ENDIF
-3501
IF IBMPC
-3502:	mov ax,0920H	   		; Write spaces.
-3505
ENDIF
-3617
IF IBMPC
-3622
ENDIF
IF Z100
	mov ah,prstr		; Get the function code
	mov dx,offset clrscr	; Want to clear the screen
	int dos			; Do it
ENDIF
-3628
IF IBMPC
-3632
ENDIF
IF Z100
	mov ah,prstr		; Function is print string
	mov dx,offset homcur	; Home cursor
	int dos			; do it
ENDIF
-3633:	ret
   