TITLE ADDCOM for non-std com ports .... ac.asm
Cseg SEGMENT para public 'code'
org 0
assume cs:cseg,ds:cseg,es:nothing,ss:cseg
dw 0ffffh ;next dvc
dw 0ffffh
dw 8000h ;attr.
dw dvcstrat ;device strategy
dw dvcint ;device interrupt
db "edcom " ;mfg name/unit
msg0 db 13,10
db "Adding non-standard COM ports",10,13,10,13,0
db 0
L8250 dw 0 ;rs232 card address
jmptable equ $
dw INIT ;init
dw noop ;media check
dw noop ;build bpb
dw noop ;ioctl input
dw noop ;input
dw noop ;input, non-destruct
dw noop ;input status
dw noop ;input flush
dw noop ;output
dw noop ;output, verify
dw noop ;output status
dw noop ;output flush
dw noop ;ioctl output
rqheadr dd 0 ;request header ptr
;page
;device strategy
dvcstrat proc far
mov cs:word ptr rqheadr,bx ;save request header ptr
mov cs:word ptr rqheadr+2,es
ret
dvcstrat endp
;device interrupt
dvcint proc far
push ax ;save all regs
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
mov bx,cs
mov ds,bx
les di,cs:rqheadr ;es:di --> req. header
xor bx,bx
mov es:[di+3],bx ;status word = 0
mov bl,es:[di+2] ;get command
cmp bl,13 ;make sure in range
cmc
mov al,3 ;assume unknown command error
jc cont1 ;if bad command -->
shl bx,1 ;bx = index to jmp address
cld
call word ptr cs:[jmptable+bx] ;do command
;commands all return here
cont1:
les di,cs:rqheadr ;es:di --> req. header
mov ah,2 ;set done bit
rcr ah,1 ;rotate in cy flag for error bit
or es:[di+3],ax ;or in error condition
pop es ;restore all regs
pop ds
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
dvcint endp
;page
master proc near
;........................... INIT: ..........................................
Init:
push cs
pop ds
mov si,offset msg0 ;print sign-on
call outstr
call parms
les di,cs:rqheadr ;point to request header
mov word ptr es:[di+14],offset lastbyte ;set last byte needed
mov es:[di+16],cs
push cs
pop ds
mov si,offset msg2
mov al,numadds
or al,al
jz i1
add al,"0"
push ax
mov ah,14
int 10h
pop ax
mov si,offset msg1 ;tell user install ok
cmp al,"1"
je i1
mov si,offset msg1a
i1:
call outstr
xor ax,ax
clc
i2:
ret
;page
;........................... No Operation: ...................................
noop:
mov ax,3 ;unknown command
stc
ret
errop:
mov ax,3 ;unknown command
stc
ret
LASTBYTE db 0
;page
;........................... Get setup parameters .............................
parms:
les di,dword ptr cs:rqheadr ;point to request header
lds si,dword ptr es:[di+18] ;point to the command line after "="
add si,7 ;skip over name
mov cx,40 ;allow 40 chars
parms1:
call nxtchar ;get next char
jc parms9 ;if no more-->
cmp al,"C" ;is COMx ?
jne parms2
call nxtchar
cmp al,"O"
jne parms2
call nxtchar
cmp al,"M"
jne parms2 ;yes: no-->
call getnum ;pickup number
dec dx
mov cs:comnum,dx ;save COM number
call nxtchar
jc parms9
cmp al,"="
jne parms1
call gethexnum
add dx,4
in al,dx
xor al,1
mov ah,al
out dx,al
in al,dx
cmp al,ah
jne parms8
xor al,1
out dx,al
sub dx,4
inc cs:numadds
push es
mov bx,40h
mov es,bx
mov bx,cs:comnum
shl bx,1
mov es:[bx],dx
pop es
jmp parms1
parms2:
jmp parms1
parms8:
push ds
mov si,cs
mov ds,si
mov si,offset msg3
call outstr
mov ax,cs:comnum
add al,"1"
mov ah,14
int 10h
mov si,offset msg4
call outstr
pop ds
jmp parms1
parms9:
ret
;page
;........................... Next char ........................................
nxtchar:
jcxz nc10 ;if no more chars in buffer -->
lodsb ;get next char
dec cx ;decrement count remaining
cmp al,13 ;is CR ?
jz nc9 ;no: yes-->
cmp al,"a" ;force to CAPs
jc nc8
cmp al,"z"+1
jnc nc8
xor al,20h
nc8:
clc ;return good
ret
nc9:
dec si ;don't go passed CR
xor cx,cx ;no more chars
nc10:
stc ;return, none found
ret
;........................... Get number .......................................
getnum:
xor dx,dx ;init number = 0
gn1:
jcxz gn9 ;are any chars left? no-->
lodsb ;yes, get next one
dec cx ;dec # left
mov ah,al ;save char
sub ah,"0" ;adjust ascii to number
jc gn8 ;was char < "0" ? yes-->
cmp ah,10 ;is char > "9" ?
jnc gn8 ; yes-->
xchg ax,dx
mov ah,10 ;decimal shift left
mul ah
xchg ax,dx
add dl,ah ;add in ones
adc dh,0
jmp gn1 ;see if more
gn8:
dec si ;restore buffer ptr
inc cx ;restore # remaining
gn9:
ret
;page
;........................... gethexnum .......................................
gethexnum:
xor dx,dx
gh1: call nxtchar
jc gh9
mov ah,al
sub al,"0"
jc gh8
cmp al,10
jc gh4
add al,"0"
sub al,"A"
jc gh8
cmp al,6
jnc gh8
add al,10
gh4:
shl dx,1
shl dx,1
shl dx,1
shl dx,1
add dl,al
adc dh,0
jmp gh1
gh8:
dec si
inc cx
gh9:
ret
outstr:
lodsb
or al,al
jz o2
mov ah,14
push si
int 10h
pop si
jmp outstr
o2: ret
msg1 db " COM added",10,13,0
msg1a db " COMs added",10,13,0
msg2 db 13,10,"No COMs added",10,13,0
msg3 db 13,10,"COM",0
msg4 db ": device does not exist",7,13,10,0
comnum dw 0
numadds db 0
master endp
cseg ends
end