Reply by Tim Williams September 17, 20132013-09-17
Don't see anything wrong offhand, but I don't remember the serial port so 
well.

I have an XT-compatible if you'd like to test further back.

The BIOS, and DOS, have some serial drivers, but I don't remember if 
interrupts are offered.  It's pretty standard to work directly with the 
serial hardware, so that doesn't matter much.

You should ask DOS to patch in the interrupt -- see INT 21h, AH = 25h. 
That way if your program closes abruptly, DOS knows what to fix.

You can also further use DOS to install your own CTRL+BREAK handler (INT 
23h) if occasional freezes are a possibility, as sometimes happens in 
development.

BTW, which assembler are you using?  I mostly use MASM, have you 
considered it?  Automatic stack frames is niiice. ;-)

Tim

-- 
Deep Friar: a very philosophical monk.
Website: http://seventransistorlabs.com

"Hul Tytus" <ht@panix.com> wrote in message 
news:l17t16$ct9$1@reader1.panix.com...
> sci.electronics.design > rs232 interupt on old ibm pc type machines > > Below are an rs232 initialization and a handler routine that work well > on > later vintage ibm pc types, roughly 200 mc and above. The AT vintage > types > however are a bust. The 8250 registers and the interupt mask register in > the > interupt controller appear as expected in both cases. > Anyone have an idea what is missing for the older machines? > > Hul > > _____________________________________________________ > ; interupt enable bits > DATAIN equ 1 ; data availalbe > TRANEMP equ 2 ; transmit holding reg empty > RECLINE equ 4 ; receive line status > MODSTAT equ 8 ; modem status > > ptype rsinit ; rsinit(port) -- port assumed 0 for now > ; initialize interupt req #4 (int 0c) for rs232 line > push bx > push cx > push dx > push ds > mov ax, DDDTA ; base of data > mov ds, ax > > mov dx, 0 > call irsadd ; return port address for '0' port (com1) > inc dx > in al, dx > or al, DATAIN ; enable incoming data interupt > out dx, al > > add dx, 3 > in al, dx > or al, 8 ; set out2 bit in uart to enable interupts > out dx, al > > push cs > pop cx > mov dx, offset rs4hand ; new address for irq 4 handler > ; see below > push ds > mov bx, 0 > mov ds, bx > mov bx, 2ch > cli > mov ax, [bx] ; read old address and > mov [bx], dx ; place the new one > add bx, 2 > mov dx, [bx] ; ditto > mov [bx], cx > sti > pop ds > mov word ptr ds:[intcadd], ax > mov word ptr ds:[intcadd+2], dx ; the org address has been saved > > mov dx, 21h ; interrupt control reg > in al, dx ; read current interrupt mask register > and al, 0FFh-10h ; allow interrupts from COM1 > out dx, al > > pop ds > pop dx > pop cx > pop bx > ret > rsinit endp > > rs4hand proc near ; handler for interrupt #4 > sti ;Allow interrupts ? > push ax > push bx > push dx > push ds > mov ax, DGROUP > mov ds, ax > > mov dx, 20h ; System interrupt controller > mov al, 20h ; Reset interrupt pending > out dx, al ; Put back to system controller > > mov dx, 0 ; assume port 0 -- ie COM1 > call irsadd ; returns address for passed port > inc dx > inc dx ; point at interrupt id reg > > in al, dx ; get interrupt type > test al, 1 ; any interrupt pending? > jnz rs4hnd1 ; no - return > cmp al, 4 > jnz rs4hnd1 > dec dx > dec dx > in al, dx > call rsinplc ; places al in recieved data buffer > > rs4hnd1: > pop ds > pop dx > pop bx > pop ax > iret > rs4hand Endp >
Reply by September 17, 20132013-09-17
Thanks Jasen, I'll take a look.

Hul


Jasen Betts <jasen@xnet.co.nz> wrote:
> On 2013-09-16, Hul Tytus <ht@panix.com> wrote: > > sci.electronics.design > > rs232 interupt on old ibm pc type machines > > > > Below are an rs232 initialization and a handler routine that work well on > > later vintage ibm pc types, roughly 200 mc and above. The AT vintage types > > however are a bust. The 8250 registers and the interupt mask register in the > > interupt controller appear as expected in both cases. > > Anyone have an idea what is missing for the older machines?
> http://en.wikibooks.org/wiki/Serial_Programming/DOS_Programming
> any help?
> -- > ?? 100% natural
> --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
Reply by Jasen Betts September 17, 20132013-09-17
On 2013-09-16, Hul Tytus <ht@panix.com> wrote:
> sci.electronics.design > rs232 interupt on old ibm pc type machines > > Below are an rs232 initialization and a handler routine that work well on > later vintage ibm pc types, roughly 200 mc and above. The AT vintage types > however are a bust. The 8250 registers and the interupt mask register in the > interupt controller appear as expected in both cases. > Anyone have an idea what is missing for the older machines?
http://en.wikibooks.org/wiki/Serial_Programming/DOS_Programming any help? -- &#9858;&#9859; 100% natural --- news://freenews.netfront.net/ - complaints: news@netfront.net ---
Reply by Hul Tytus September 16, 20132013-09-16
sci.electronics.design
rs232 interupt on old ibm pc type machines

   Below are an rs232 initialization and a handler routine that work well on 
later vintage ibm pc types, roughly 200 mc and above. The AT vintage types 
however are a bust. The 8250 registers and the interupt mask register in the 
interupt controller appear as expected in both cases.
   Anyone have an idea what is missing for the older machines?

Hul

_____________________________________________________
; interupt enable bits
DATAIN	equ	1		; data availalbe
TRANEMP	equ	2		; transmit holding reg empty
RECLINE	equ	4		; receive line status
MODSTAT	equ	8		; modem status

ptype rsinit		; rsinit(port)  -- port assumed 0 for now
					; initialize interupt req #4 (int 0c) for rs232 line
	push bx
	push cx
	push dx
	push ds
	mov ax, DDDTA		; base of data
	mov ds, ax

	mov dx, 0
	call irsadd			; return port address for '0' port (com1)
	inc dx
	in al, dx
	or al, DATAIN	; enable incoming data interupt
	out dx, al

	add dx, 3
	in al, dx
	or al, 8		; set out2 bit in uart to enable interupts
	out dx, al

	push cs
	pop cx
	mov dx, offset rs4hand		; new address for irq 4 handler
								; see below
	push ds
	mov bx, 0
	mov ds, bx
	mov bx, 2ch
	cli
	mov ax, [bx]			; read old address and
	mov [bx], dx			; place the new one
	add bx, 2
	mov dx, [bx]			; ditto
	mov [bx], cx
	sti
	pop ds
	mov word ptr ds:[intcadd], ax
	mov word ptr ds:[intcadd+2], dx		; the org address has been saved

	mov dx, 21h			; interrupt control reg
	in al, dx 			; read current interrupt mask register
	and al, 0FFh-10h 	; allow interrupts from COM1
	out dx, al

	pop ds
	pop dx
	pop cx
	pop bx
	ret
rsinit endp

rs4hand   proc  near		; handler for interrupt #4
	sti			;Allow interrupts ?
	push ax
	push bx
	push dx
	push ds
	mov ax, DGROUP
	mov ds, ax

	mov dx, 20h		; System interrupt controller
	mov al, 20h		; Reset interrupt pending
	out dx, al		; Put back to system controller

	mov dx, 0		; assume port 0 -- ie COM1
	call irsadd		; returns address for passed port
	inc dx
	inc dx			; point at interrupt id reg

	in al, dx		; get interrupt type
	test al, 1		; any interrupt pending?
	jnz rs4hnd1		; no - return
	cmp al, 4
	jnz rs4hnd1
	dec dx
	dec dx
	in al, dx
	call rsinplc	; places al in recieved data buffer

rs4hnd1:
	pop ds
	pop dx
	pop bx
	pop ax
	iret
rs4hand Endp