home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
203_01
/
yam11.asm
< prev
next >
Wrap
Assembly Source File
|
1979-12-31
|
14KB
|
560 lines
PAGE ,132
TITLE 'YAM11: YAM TERMIO ASSMELBY ROUTINES'
;DATE ( 7 nov 85)
; SMALL MODEL
.xlist
INCLUDE \LC\S\DOS.MAC
.list
; interrupt vectors
ser0 equ 0ch ;serial 0 interrupt
ser1 equ 0bh ;serial 1 interrupt
break equ 01bh ;break interrupt
cntlc equ 023h ;control-c handler
lpt equ 017h ;printer status
; monitor functions
get_status equ 02h ;get printer status
; dos functions
commint equ 14h ;monitor serial I/O
dos equ 21h ;ms-dos vector
dcio equ 6h ;dos direct console i/o
get_vector equ 35h ;get interrupt vector
set_vector equ 25h ;set interrupt vector
; i/o port addresses
cntl8259 equ 20h ;control port
mask8259 equ 21h ;interrupt mask register
; offsets to rest of ports
intenreg equ 1 ;interrupt enable
intidreg equ 2 ;interrupt identication
lcreg equ 3 ;line control
modctlreg equ 4 ;modem control
linestreg equ 5 ;line status
modstreg equ 6 ;modem status
; masks and data equates
charrdy equ 01h ;character ready
cr equ 0dh
eoi equ 20h ;non-specific eoi command
idisable equ 0f7h ;serial int disable
ienable equ 08H ;serial int enable
lf equ 0ah
mask3 equ 08h ;int3 disable mask
mask4 equ 010h ;int4 disable mask
mon_conout equ 14 ;funtion code
page_0 equ 0 ;page to output char to
rts equ 02h ;rts on mask
rtsoff equ 0fdh ;rts off mask
rxdmask equ 01h ;interrupt on rx data ready
txrdy equ 20h ;transmitter ready
unmask3 equ 0f7h ;int7 enable mask for 8259
unmask4 equ 0efh ;int4 enable mask for 8259
xoff equ 013h ;^s
;=======================================================
dseg
errflg dw 0 ;error flag for init comm
lowater dw 0 ;copy of LOWWATER
termflg db 0 ;true if in terminal mode
; global variables
extrn Dport:word ;actual data port #
extrn bufst:word ;pointer to buffer start
extrn bufend:word ;pointer to buffer end
extrn bufcq:word ;buffer pointer for modem
extrn bufcdq:word ;buffer pointer for console
extrn Ignrx:word ;Flag which says to throw away chars in rxnono
extrn rxnono:word ;pointer to buffer of characters to ignore
extrn Timeout:word ;timeout before next char rx
extrn Nfree:word ;number of free bytes in buffer
extrn overrun:word ;set if buffer overflows
extrn Wrapped:word ;indicates buffer pointer has looped
extrn Xoffflg:word ;flag indicating Xoff was sent
endds
;=======================================================
pseg
;storage locations in code segment
brk dd 0 ;break vector storage
ctlc dd 0 ;control-c vector storage
;*******************************************************
; return used for break interrupt handlers
cc_hand proc far
iret
cc_hand endp
;*******************************************************
; cause an INT3 for entry into debuggers.
; calling sequence:
; dbgint();
public dbgint
dbgint proc near
int 3
ret
dbgint endp
public init_com
init_com proc near
;*******************************************************
; initialze interrupt vectors for serial port. This will ensure
; all characters from the serial port are not missed. It also resets
; the control-c and break vector so they will not cause an abort back
; to the operating system, leaving interrupt vectors in a unknown state.
; calling sequence:
; init_comm(LOWWATER)
; where LOWWATER is the number of bytes left in the buffer
; at which XOFF is set to the modem.
cld ;auto increment
push bp ;save bp
mov bp,sp
mov ax,[bp+4] ;LOWWATER is parmeter to this routine
mov lowater,ax
cmp si,bx ;check for buffer overflow
pop bp ;done with passed parameters
push es ;save es for caller(required by lattice c or
;very strange things result
push ds ;we muck with ds
cli ;disable interrupts when setting vectors
; save the break interrupt vector. Save area is in code
; segment, thus the segment over-rides.
mov ah,get_vector
mov al,break
int dos
mov word ptr cs:brk,bx ;vector returned in es:bx
mov word ptr cs:brk+2,es
; save the contol-c interrupt vector
mov ah,get_vector
mov al,cntlc
int dos
mov word ptr cs:ctlc,bx ;vector returned in es:bx
mov word ptr cs:ctlc+2,es
; modify old break vector to point to our handler. It must
; return with an iret instruction. Since ds is changed to cs,
; mov will function properly with no segment override.
push cs
pop ds ;set ds=code segment
mov ah,set_vector
mov al,break ;break interrupt vector
mov dx,offset cc_hand ;pointer in ds:dx
int dos
; modify old control-c vector to point to our handler.
mov ah,set_vector
mov al,cntlc ;break interrupt vector
mov dx,offset cc_hand ;pointer in ds:dx
int dos
pop ds
pop es ;restore es for caller
sti ;re-enable system interrupts
ret 2 ;one passed parmeter
init_com endp
public setport
setport proc near
;*******************************************************
; set the interrupt vector for the requested comm port.
; only ports 0 and 1 are supported due to they are the only
; ones which support interrupts on most systems.
; calling sequence:
; setport(port_num);
cli
push bp ;save bp
mov bp,sp
mov bx,[bp+4] ;get modem port number
push ds
push bx
; modify serial interrupt vector to point to its handler
push cs
pop ds ;vector set to ds:dx
mov ah,set_vector
cmp bx,1 ;serial port #1 is at int 3
jz por1
mov al,ser0 ;serial #0 vector
jmp short setvec
por1: mov al,ser1 ;serial #1 interrupt vector
setvec: mov dx,offset ser_int
int dos
;enable 8259 mask
in al,mask8259 ;get mask
pop bx ;check port #
cmp bx,1 ;serial port #1 is at int 3
jz epor1
and al,unmask4 ;enable int4
jmp short emask
epor1: and al,unmask3 ;enable int3
emask: out mask8259,al
pop ds
pop bp
sti ;re-enable system interrupts
ret 2 ;one passed parmeter
setport endp
public resport
resport proc near
;*******************************************************
; reset the interrupt vector for the requested comm port.
; only ports 0 and 1 are supported due to they are the only
; ones which support interrupts on most systems.
; calling sequence:
; resport(port_num);
cli
push bp ;save bp
mov bp,sp
mov bx,[bp+4] ;get modem port number
; mask comm interrupt
in al,mask8259 ;get mask
cmp bx,1 ;serial port #1 is at int 3
jz dpor1
or al,mask4 ;disable int4
jmp short dmask
dpor1: or al,mask3 ;disable int3
dmask: out mask8259,al
; disable trisate buffer for comm interrupt
mov dx,[Dport]
add dx,modctlreg
in al,dx
and al,idisable and rtsoff
out dx,al ;set out2 line false
pop bp
sti ;re-enable system interrupts
ret 2 ;one passed parmeter
resport endp
public enblcm
enblcm proc near
;*******************************************************
; unmask comm interrupt
; enable bit for receive data interrupt and tristate buffer to allow
; interrupts from ACIA. Some of the MSDOS commands such as INT 14
; seem to muck with these bits. Mode is true if in terminal mode otherwise 0.
; Mode sets a flag used by the interrupt routine.
; calling sequence:
; enblcm(mode);
cli
push bp ;save bp
mov bp,sp
mov al,[bp+4] ;get termflag
mov termflg,al
mov dx,[Dport]
add dx,intenreg ;enable serial interrupts
mov al,rxdmask
out dx,al
; enable trisate buffer so interrupts can get to bus
mov dx,[Dport]
add dx,modctlreg
in al,dx
or al,ienable or rts
out dx,al ;set out2 line true
pop bp
sti
ret 2 ;one passed parameter
enblcm endp
public dsblcm
dsblcm proc near
;*******************************************************
; reset interrupt enable register of acia
; calling sequence:
; dsblcm();
cli
mov dx,[Dport]
add dx,intenreg ;offset to enable register
mov al,0 ;disable serial interrupts
out dx,al
sti
ret
dsblcm endp
public res_comm
res_comm proc near
;*******************************************************
; reset interrupt vectors set up in init_comm
; calling sequence:
; res_comm();
cld ;auto increment
cli ;disable interrupts when resetting vectors
push ds ;we muck with ds again
; restore break vector
mov ah,set_vector
mov al,break ;break interrupt vector