Subject: *.pas to *.asm
From: Yousuf Khan Area # 17 (Assembly Language )
To: Y'ALL 21 Mar 91

Well it seems the impossible has happened to me: I now understand
Assembler more than I understand Pascal. So I found this routine,
written in TurboPascal, that detects what type of UART you have running.
I haven't used TP in 3 years+, so I need a translation of this pascal
code to assembler, if you will:

      xword:=MemW[BIOSdseg : 2 * i - 2];
	Writeln('$', hex(xword, 4));
	xbyte2:=Port[xword + 2];
	Port[xword + 2]:=$C1;
	for temp:=1 to 2 do;
	xbyte3:=Port[xword + 2];
	Port[xword + 2]:=xbyte2;
	case ((xbyte3 and $C0) shr 6) of
	  0: begin
	     xbyte2:=Port[xword + 7];
	     Port[xword + 7]:=$FA;
	     for temp:=1 to 2 do;
	     if Port[xword + 7] = $FA then begin
	       Port[xword + 7]:=$AF;
	       for temp:=1 to 2 do;
	       if Port[xword + 7] = $AF then begin
		 Port[xword + 7]:=xbyte2;
		 Write('16450')
	       end
	       else
		 Write('8250')
	     end
	     else
	       Write('8250')
	     end;
	  1: Write('???');
	  2: Write('16550');
	  3: Write('16550A')

This is of course a routine to detect the type of UART. There are
certain things I'm having trouble understanding. BIOSdseg, is this a
variable or a built-in TPascal function? $C0 & $C1, what are these?

Yousuf Khan

 * Origin: To never lose characters again (1:163/215.6)

FROM:	Scott Canion			Area # 17 (Assembly Language )
TO:	Yousuf Khan			21 Mar 91
SUBJECT: Re: *.pas to *.asm

On 19-Mar-91, sources inform us that Yousuf Khan @ 1:163/215.6 said:

 YK> Well it seems the impossible has happened to me: I now understand
 YK> Assembler more than I understand Pascal.

Thanks for the pascal code, Yousuf, it is very helpful.  Here is the assembly
version.  I tried to keep the variables close to the pascal source.  Are you
sure you have programmed in Pascal before? :-)

========================== beginning of program =============================

title "UART Detector"
page 60, 132

; comments -- the WRITE function is left up to your own implementation

; constants

BIOSdseg	equ	40h		; data segment for BIOS
i		equ	1		; COM PORT (1-4)

	.model	tiny			; tiny model (.COM)
	.code
	org	100h			; .COM files start at 100h

entry:
	jmp	start			; jump to start of progarm

; variables

xword		dw	?
xbyte2		db	?
xbyte3		db	?

jmp_table   dw      uart_8250_or_16450, uart_unknown, uart_16550, uart_16550a

; ------------------------ MAIN ------------------------------

start	proc
	mov	ax, BIOSdseg
	mov	es, ax			; move bios data segment into ES
	mov	dx, es:[2*i-2]		; get offset for serial port
	mov	xword, dx		; xword := serial port base address
	add	dx, 2			; dx := dx + 2
	in	al, dx			; al := port [dx]
	mov	xbyte2, al		; xbyte2 := al
	mov	al, 0c1h		; al := $C1
	out	dx, al			; port [dx] := al
	in	al, dx			; al := port [dx]
	and	al, 0c0h		; al := (al AND $C0)
	mov	cl, 5			; cl := 5
	shr	al, cl			; al := (al shr 5) (5 for word jmp)
	mov	ah, 0			; ah := 0
	mov	bp, ax			; bp := ax (al)
	mov	al, xbyte2		; al := xbyte2
	out	dx, al			; port [dx] := al
	jmp	cs:[jmp_table+bp]	;

uart_8250_or_16450:
	mov	dx, xword		; dx := xword
	add	dx, 7			; dx := dx + 7
	in	al, dx			; al := port [dx]
	mov	xbyte2, al		; xbyte2 := al
	mov	al, 0fah		; al := $FA
	out	dx, al			; port [dx] := al
	in	al, dx			; al := port [dx]
	cmp	al, 0fah		; if (al <> $FA)
	jne	uart_16450		; then uart is 16450
	mov	al, 0afh		; al := $AF
	out	dx, al			; port [dx] := al
	in	al, dx			; al := port [dx]
	cmp	al, 0afh		; if (al <> $AF)
	jne	uart_8250		; then uart is 8250
	mov	al, xbyte2		; else al := xbyte2
	out	dx, al			; port [dx] := al
	jmp	uart_16450		; uart is 16450

uart_8250:
	write	"8250"			; display "8250"
	jmp	exit

uart_16450:
	write	"16450"			; display "16450"
	jmp	exit

uart_unknown:
	write	"???"			; display "unknown"
	jmp	exit

uart_16550:
	write	"16550"			; display "16550"
	jmp	exit

uart_16550a:
	write	"16550A"		; display "16550A"
	jmp	exit

exit:
	mov	ax, 4c00h
	int	21h			; exit to DOS
start	endp				; end of proc

END	entry				; end of program

============================== end of program ===============================

--- QM v1.00
 * Origin: Scott's Excellent BBS HST/V.32bis (1:382/17.0)