home *** CD-ROM | disk | FTP | other *** search
- ; Written by Chris Sokol
-
- PUBLIC _TTYAvail
- PUBLIC _TTYClose
- PUBLIC _TTYDone
- PUBLIC _TTYGet
- PUBLIC _TTYInit
- PUBLIC _TTYOpen
- PUBLIC _TTYPut
- PUBLIC _TTYTerm
-
- TTY_TEXT SEGMENT PUBLIC 'CODE'
-
- ASSUME cs:TTY_TEXT, ds:TTY_TEXT
-
- INCLUDE ttyio.inc
-
- Dummy DW 0 ; So OFFSET Handles[0] != 0
- Handles TTYHand MAX_TTYS DUP (<>)
- IrqPtrs TTYIrq 16 DUP (<>)
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYAvail:
- push bp
- mov bp, sp
- push ds
- push si
-
- mov ax, cs
- mov ds, ax
-
- mov al, 6[bp]
- call GetHand
- jnc AvCheck
-
- mov ax, ERRbhand
- jmps AvExit
-
- AvCheck:
- mov ax, [si].THrxbuf.TBin
- sub ax, [si].THrxbuf.TBout
- jz AvExit
-
- mov ax, 1
-
- AvExit:
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYClose:
- push bp
- mov bp, sp
- push ds
- push si
-
- mov ax, cs
- mov ds, ax
-
- mov al, 6[bp]
- call GetHand
- jnc ClClose
-
- mov ax, ERRbhand
- jmps ClExit
-
- ClClose:
- call HandClose
- call HandFree
-
- xor ax, ax
-
- ClExit:
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYDone:
- push bp
- mov bp, sp
- push ds
- push si
-
- mov ax, cs
- mov ds, ax
-
- mov al, 6[bp]
- call GetHand
- jnc DoCkDone
-
- mov ax, ERRbhand
- jmps DoExit
-
- DoCkDone:
- call [si].THselect
-
- UAddr UALiSta
- in al, dx
-
- and al, 60h
- cmp al, 60h
- je DoDone
-
- xor ax, ax
- jmps DoExit
-
- DoDone:
- mov ax, 1
-
- DoExit:
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYGet:
- push bp
- mov bp, sp
- push ds
- push si
- push di
-
- mov ax, cs
- mov ds, ax
-
- mov al, 6[bp]
- call GetHand
- jnc GeCkData
-
- mov ah, RXhinv
- jmps GeExit
-
- GeCkData:
- mov bx, [si].THrxbuf.TBout
- cmp bx, [si].THrxbuf.TBin
- jne GeGet
-
- mov ah, RXndat
- jmps GeExit
-
- GeGet:
- les di, [si].THrxbuf.TBbuff
- add di, bx
- add di, bx
-
- mov ax, es:[di]
-
- inc bx
- cmp bx, [si].THrxbuf.TBsize
- jne GeNoWrap
-
- xor bx, bx
-
- GeNoWrap:
- mov [si].THrxbuf.TBout, bx
-
- GeExit:
- pop di
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYInit:
- push di
-
- mov ax, cs
- mov es, ax
-
- lea di, Handles
-
- xor al, al
- mov cx, MAX_TTYS * SIZE TTYHand
-
- rep stosb
-
- pop di
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYOpen:
- push bp
- mov bp, sp
- push ds
- push si
-
- mov ax, cs
- mov ds, ax
-
- call HandAlloc ; Allocate handle (AX=h, SI=buf)
- jc OpExit ; If error C=1, AX=error
-
- push ax ; Save handle
-
- call HandOpen ; Init buf with params
- jc OpHOErr ; If error C=1, AX=error
-
- pop ax ; No error, restore handle and exit
- jmps OpExit
-
- OpHOErr:
- pop bx ; Buf init error, discard handle
- push ax ; Save error
-
- call HandFree ; Free buf pointed to by SI
-
- pop ax ; Restore error and exit
-
- OpExit:
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYPut:
- push bp
- mov bp, sp
- push ds
- push si
-
- mov ax, cs
- mov ds, ax
-
- mov al, 6[bp]
- call GetHand
- jnc PuPut
-
- mov ax, ERRbhand
- jmps PuExit
-
- PuPut:
- call [si].THselect
-
- mov ax, 8[bp]
- call QueueOut
-
- or ax, ax
- jnz PuExit
-
- call Resume
- xor ax, ax
-
- PuExit:
- pop si
- pop ds
- pop bp
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- _TTYTerm:
- push si
-
- xor si, si
-
- TeLoop:
- push si
- call FAR PTR _TTYClose
- pop ax
-
- inc si
-
- cmp si, MAX_TTYS
- jne TeLoop
-
- pop si
- retf
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;;; This is a block of 16 ISR entry points, one for each possible IRQ
-
- IVecList:
-
- IVEC_NO = 0
-
- REPT 16
- GenIVIdx %IVEC_NO
- IVEC_NO = IVEC_NO + 1
- ENDM
-
- IVEC_NO = 0
-
- REPT 16
- GenIVec %IVEC_NO
- IVEC_NO = IVEC_NO + 1
- ENDM
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- DebugOut:
- push es
- push di
- push ax
-
- mov ax, 0b800h
- mov es, ax
- mov di, 001d8h
-
- inc DebugCnt
-
- mov ax, DebugCnt
- call OutWord
-
- DOexit:
- pop ax
- pop di
- pop es
- ret
-
- DebugCnt DW 0
-
- OutWord:
- xchg al, ah
- call OutByte
-
- xchg al, ah
- call OutByte
- ret
-
- OutByte:
- push ax
-
- shr al, 1
- shr al, 1
- shr al, 1
- shr al, 1
-
- call OutNybb
-
- pop ax
-
- call OutNybb
- ret
-
- OutNybb:
- push ax
-
- and al, 0fh
- cmp al, 9
- jbe ONok
-
- add al, 7
-
- ONok:
- mov ah, 01fh
- add al, 30h
-
- mov es:[di], ax
- inc di
- inc di
-
- pop ax
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- GetHand:
- cmp al, MAX_TTYS
- jae GHBadHand
-
- lea si, Handles
-
- mov ah, SIZE TTYHand
- mul ah
-
- add si, ax
-
- test [si].THflags, THFopen
- jz GHBadHand
-
- clc
- ret
-
- GHBadHand:
- stc
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- HandAlloc:
- lea si, Handles
- xor ax, ax
-
- mov cx, MAX_TTYS
-
- HALoop:
- test [si].THflags, THFopen
- jz HAFound
-
- add si, SIZE TTYHand
- inc ax
-
- loop HALoop
-
- stc
- jmps HAExit
-
- HAFound:
- or [si].THflags, THFopen
-
- clc
-
- HAExit:
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- HandClose:
- call TermUART
- call TermIRQ
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- HandFree:
- and [si].THflags, 0ffffh-THFopen
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- HandOpen:
- call HOInitVars
- call HOInitParms
-
- call InitIRQ
-
- call InitUART
- call TermUART
- call InitUART
-
- xor ax, ax
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- Slctors DW SlctDummy
- DW SlctV0
- DW SlctV1
- DW SlctV2
- DW SlctV3
- DW SlctV4
- DW SlctV5
- DW SlctV6
- DW SlctV7
-
- HOInitParms:
- mov ax, 6[bp]
- mov [si].THioaddr, ax
-
- mov ax, 8[bp]
- mov [si].THirqno, ax
-
- mov bx, 10[bp]
- shl bx, 1
- mov ax, Slctors[bx]
- mov [si].THselect, ax
-
- mov ax, 12[bp]
- mov WORD PTR [si].THrxbuf.TBbuff, ax
-
- mov ax, 14[bp]
- mov WORD PTR [si].THrxbuf.TBbuff+2, ax
-
- mov ax, 16[bp]
- mov [si].THrxbuf.TBsize, ax
-
- mov ax, 18[bp]
- mov WORD PTR [si].THtxbuf.TBbuff, ax
-
- mov ax, 20[bp]
- mov WORD PTR [si].THtxbuf.TBbuff+2, ax
-
- mov ax, 22[bp]
- mov [si].THtxbuf.TBsize, ax
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- HOInitVars:
- xor al, al
- mov [si].THlins, al
- mov [si].THmdms, al
-
- mov al, LCWLen0+LCWLen1
- mov [si].THlinc, al
-
- mov al, MCDTR+MCOUT2
- mov [si].THmdmc, al
-
- xor ax, ax
- mov [si].THrxbuf.TBin, ax
- mov [si].THrxbuf.TBout, ax
-
- xor ax, ax
- mov [si].THtxbuf.TBin, ax
- mov [si].THtxbuf.TBout, ax
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- IHLSR:
- UAddr UALiSta
- in al, dx
-
- cmp al, [si].THlins
- je LSRsame
-
- mov [si].THlins, al
-
- mov ah, RXlins
- call QueueIn
-
- LSRsame:
- jmp IHLoop
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- IHMSR:
- UAddr UAMdSta
- in al, dx
-
- mov [si].THmdms, al
-
- mov ah, RXmdms
- call QueueIn
-
- test [si].THflags, THFhfctl
- jz MSRexit
-
- test al, MSCTS
- jz MSRwait
-
- and [si].THflags, 0ffffh-THFhwait
- call Resume
-
- jmps MSRexit
-
- MSRwait:
- or [si].THflags, THFhwait
-
- MSRexit:
- IF DEBUG
- xor ax, ax
- call MSROut
- ENDIF
-
- jmp IHLoop
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- IHRxD:
- UAddr UARxBuf
- in al, dx
-
- test [si].THflags, THFxfctl
- jz RxDnxfctl
-
- cmp al, 013h ; Ctrl-S
- jne RxDnpause
-
- or [si].THflags, THFxwait
- jmp IHLoop
-
- RxDnpause:
- cmp al, 011h ; Ctrl-Q
- jne RxDnxfctl
-
- and [si].THflags, 0ffffh-THFxwait
- call Resume
-
- jmp IHLoop
-
- RxDnxfctl:
- mov ah, RXchar
- call QueueIn
-
- jmp IHLoop
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- IHTxD:
- and [si].THflags, 0ffffh-THFxmit
- call Resume
-
- jmp IHLoop
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- Init8259:
- mov bl, 1
- mov cl, BYTE PTR [si].THirqno
- mov dx, MOCW1
-
- cmp cl, 8
- jb I82baseok
-
- sub cl, 8
- mov dx, SOCW1
-
- I82baseok:
- shl bl, cl
-
- xor bl, 0ffh
-
- in al, dx
- and al, bl
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- InitIRQ:
- push di
-
- mov al, BYTE PTR [si].THirqno
- mov ah, SIZE TTYIrq
- mul ah
-
- lea di, IrqPtrs
- add di, ax
-
- mov ax, [di].TItail
- mov [si].THprvirq, ax
-
- xor ax, ax
- mov [si].THnxtirq, ax
-
- mov bx, [di].TItail
- or bx, bx
- jz IIRQfirst
-
- mov [bx].THnxtirq, si
- jmps IIRQadded
-
- IIRQfirst:
- mov [di].TIhead, si
-
- IIRQadded:
- mov [di].TItail, si
-
- or bx, bx
- jnz IIRQnfirst
-
- call InitIVec
- call Init8259
-
- IIRQnfirst:
- pop di
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- InitIVec:
- push di ; DI = &TTYIrq
-
- xor ax, ax
- mov es, ax
-
- mov bx, [si].THirqno
-
- cmp bl, 8
- jb IIVmast
-
- mov di, 68h
- jmps IIVgetvec
-
- IIVmast:
- mov di, 08h
-
- IIVgetvec:
- add di, bx
-
- shl di, 1
- shl di, 1
-
- shl bx, 1
-
- mov ax, WORD PTR IVecList[bx]
- mov bx, cs
-
- cli
-
- xchg ax, es:[di]
- xchg bx, es:[di+2]
-
- pop di ; restore &TTYIrq
-
- mov WORD PTR [di].TIoldvec, ax
- mov WORD PTR [di].TIoldvec+2, bx
-
- sti
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- InitUART:
- call [si].THselect
-
- UAddr UAIntEn
- xor al, al
- out dx, al
-
- UAddr UALiCtl
- mov al, [si].THlinc
- out dx, al
-
- UAddr UAMdCtl
- mov al, [si].THmdmc
- out dx, al
-
- UAddr UARxBuf
- in al, dx
-
- UAddr UALiSta
- in al, dx
-
- UAddr UAMdSta
- in al, dx
-
- UAddr UAIntEn
- mov al, 0fh
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- UARTInts DW IHMSR
- DW IHTxD
- DW IHRxD
- DW IHLSR
-
- IntHand:
- push ds
- push es
- push di
- push ax
- push bx
- push cx
- push dx
-
- mov ax, cs
- mov ds, ax
-
- mov si, [si].TIhead
-
- IHLoop:
- call [si].THselect
-
- UAddr UAIntId
- in al, dx
-
- test al, 01h
- jnz IHnext
-
- xor bh, bh
- mov bl, al
- jmp UARTInts[bx]
-
- IHnext:
- test [si].THnxtirq, 0ffffh
- jz IHexit
-
- mov si, [si].THnxtirq
- jmps IHLoop
-
- IHexit:
- mov al, 20h
-
- cmp [si].THirqno, 8
- jb IHmaster
-
- out SOCW2, al
-
- IHmaster:
- out MOCW2, al
-
- pop dx
- pop cx
- pop bx
- pop ax
- pop di
- pop es
- pop ds
- pop si
- iret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- MSROut:
- push di
-
- mov bx, 0b800h
- mov es, bx
- mov di, 00094h
- add di, ax
-
- mov ah, 80h
- mov al, [si].THmdms
- xor bx, bx
-
- MSROloop:
- mov cl, MSRChars[bx]
-
- test al, ah
- jnz MSROhigh
-
- or cl, 20h
-
- MSROhigh:
- mov es:[di], cl
- mov BYTE PTR es:[di+1], 01fh
- inc di
- inc di
-
- shr ah, 1
- inc bx
-
- cmp bx, 4
- jne MSROloop
-
- mov al, '-'
- test [si].THflags, THFhwait
- jz MSROhout
-
- mov al, '+'
-
- MSROhout:
- mov es:[di], al
- mov BYTE PTR es:[di+1], 01fh
- inc di
- inc di
-
- mov al, '-'
- test [si].THflags, THFxwait
- jz MSROxout
-
- mov al, '+'
-
- MSROxout:
- mov es:[di], al
- mov BYTE PTR es:[di+1], 01fh
-
- pop di
- ret
-
- MSRChars DB 'QRDC'
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- OutBaud:
- xor bh, bh
- mov bl, al
- shl bx, 1
-
- UAddr UALiCtl
- mov al, [si].THlinc
- or al, LCDLAB
- out dx, al
-
- mov ax, BaudTab[bx]
-
- UAddr UADvLsb
- out dx, al
-
- UAddr UADvMsb
- mov al, ah
- out dx, al
-
- UAddr UALiCtl
- mov al, [si].THlinc
- out dx, al
-
- ret
-
- BaudTab DW 384
- DW 96
- DW 48
- DW 24
- DW 12
- DW 6
- DW 3
- DW 2
- DW 1
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- OutChar:
- or [si].THflags, THFxmit
-
- UAddr UATxBuf
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- OutLinC:
- mov [si].THlinc, al
-
- UAddr UALiCtl
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- OutMdmC:
- mov [si].THmdmc, al
-
- UAddr UAMdCtl
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- OutProc:
- IF DEBUG
- call DebugOut
- ENDIF
-
- cmp ah, TXchar
- je OPchar
-
- cmp ah, TXbaud
- je OPbaud
-
- cmp ah, TXhwfc
- je OPhwfc
-
- cmp ah, TXlinc
- je OPlinc
-
- cmp ah, TXmdmc
- je OPmdmc
-
- cmp ah, TXxofc
- je OPxofc
-
- ret
-
- OPbaud:
- jmp OutBaud
-
- OPchar:
- jmp OutChar
-
- OPlinc:
- jmp OutLinC
-
- OPmdmc:
- jmp OutMdmC
-
- OPhwfc:
- or al, al
- jz OPhdis
-
- or [si].THflags, THFhfctl
- and [si].THflags, 0ffffh-THFhwait
- ret
-
- OPhdis:
- and [si].THflags, 0ffffh-THFhfctl
- ret
-
- OPxofc:
- or al, al
- jz OPxdis
-
- or [si].THflags, THFxfctl
- and [si].THflags, 0ffffh-THFxwait
- ret
-
- OPxdis:
- and [si].THflags, 0ffffh-THFxfctl
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- QueueIn:
- push di
-
- les di, [si].THrxbuf.TBbuff
- mov bx, [si].THrxbuf.TBin
- add di, bx
- add di, bx
-
- inc bx
-
- cmp bx, [si].THrxbuf.TBsize
- jne QINoWrap
-
- xor bx, bx
-
- QINoWrap:
- cmp bx, [si].THrxbuf.TBout
- je QIExit
-
- mov es:[di], ax
- mov [si].THrxbuf.TBin, bx
-
- QIExit:
- pop di
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- QueueOut:
- push di
-
- les di, [si].THtxbuf.TBbuff
- mov bx, [si].THtxbuf.TBin
- add di, bx
- add di, bx
-
- inc bx
-
- cmp bx, [si].THtxbuf.TBsize
- jne QONoWrap
-
- xor bx, bx
-
- QONoWrap:
- cmp bx, [si].THtxbuf.TBout
- je QOFull
-
- mov es:[di], ax
- mov [si].THtxbuf.TBin, bx
-
- xor ax, ax
- jmps QOExit
-
- QOFull:
- mov ax, ERRqfull
-
- QOExit:
- pop di
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- Resume:
- pushf
-
- IF DEBUG
- mov ax, 000a0h
- call MSROut
- ENDIF
-
- cli
-
- test [si].THflags, THFxmit+THFhwait+THFxwait
- jnz ReExit
-
- ReLoop:
- mov bx, [si].THtxbuf.TBout
- cmp bx, [si].THtxbuf.TBin
- je ReExit
-
- les di, [si].THtxbuf.TBbuff
- add di, bx
- add di, bx
-
- inc bx
- cmp bx, [si].THtxbuf.TBsize
- jne ReNoWrap
-
- xor bx, bx
-
- ReNoWrap:
- mov [si].THtxbuf.TBout, bx
-
- mov ax, es:[di]
- call OutProc
-
- test [si].THflags, THFxmit
- jz ReLoop
-
- ReExit:
- popf
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- SlctDummy:
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- SlctV0:
- xor al, al
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV1:
- mov al, 1
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV2:
- mov al, 2
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV3:
- mov al, 3
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV4:
- mov al, 4
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV5:
- mov al, 5
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV6:
- mov al, 6
- UAddr UAHCR
- out dx, al
- ret
-
- SlctV7:
- mov al, 7
- UAddr UAHCR
- out dx, al
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- Term8259:
- mov bl, 1
- mov cl, BYTE PTR [si].THirqno
- mov dx, MOCW1
-
- cmp cl, 8
- jb T82baseok
-
- sub cl, 8
- mov dx, SOCW1
-
- T82baseok:
- shl bl, cl
-
- in al, dx
- or al, bl
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- TermIRQ:
- push di
-
- mov al, BYTE PTR [si].THirqno
- mov ah, SIZE TTYIrq
- mul ah
-
- lea di, IrqPtrs
- add di, ax
-
- mov ax, [si].THnxtirq
-
- mov bx, [si].THprvirq
- or bx, ax
- jz TIRQnprv
-
- mov [bx].THnxtirq, ax
- jmps TIRQlnxt
-
- TIRQnprv:
- mov [di].TIhead, ax
-
- TIRQlnxt:
- mov ax, [si].THprvirq
-
- mov bx, [si].THnxtirq
- or bx, bx
- jz TIRQnnxt
-
- mov [bx].THprvirq, ax
- jmps TIRQunlnkd
-
- TIRQnnxt:
- mov [di].TItail, ax
-
- TIRQunlnkd:
- mov ax, [di].TIhead
- and ax, [di].TItail ; if list is empty, then AX=0ffffh
- inc ax
- jnz TIRQnlast ; if inc != 0, then not empty
-
- call Term8259
- call TermIVec
-
- TIRQnlast:
- pop di
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- TermIVec:
- push di ; DI = &TTYIrq
-
- xor ax, ax
- mov es, ax
-
- mov ax, WORD PTR [di].TIoldvec
- mov bx, WORD PTR [di].TIoldvec+2
-
- mov di, [si].THirqno
- add di, 8
- shl di, 1
- shl di, 1
-
- cli
-
- mov es:[di], ax
- mov es:[di+2], bx
-
- sti
-
- pop di
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- TermUART:
- call [si].THselect
-
- xor al, al
-
- UAddr UAIntEn
- out dx, al
-
- UAddr UAMdCtl
- out dx, al
-
- ret
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- TTY_TEXT ENDS
-
- END
-