home *** CD-ROM | disk | FTP | other *** search
- ;
- ; xcsvga.asm
- ;
- .286
- code segment byte public 'CODE'
- assume cs:code, ds:code
- ;
- include xcs.mac
- ;
- extrn OldInt08:dword
- extrn OldInt09:dword
- extrn OldInt10:dword
- extrn OldInt13:dword
- extrn OldInt16:dword
- extrn OldInt1c:dword
- extrn IntrBusy:byte
- ;
- extrn F8x8:dword
- extrn F8x14:dword
- extrn F8x16:dword
- extrn FPntr:dword
- ;
- extrn bAttr:byte
- extrn nAttr:byte
- extrn kAttr:byte
- extrn sAttr:byte
- extrn eAttr:byte
- extrn CurKey:word
- extrn LastKey:word
- ;
- extrn MyMode:byte
- extrn CurTextMode:byte
- extrn TextMode:byte
- extrn DispMode:byte
- ;
- extrn inColorText:byte
- extrn inGrCursor:byte
- extrn isTreatCC:byte
- extrn DisplayOpen:byte
- extrn ClockSwitch:byte
- extrn TimeOut:word
- extrn Author:byte
- ;
- extrn message:near
- extrn PushBackKeys:near
- ;
- COPY equ 0
- opXOR equ 18h
- ;
- Vi600x16 db 58h
- Vi768x16 db 5dh
- Vi400x256 db 5eh
- Vi480x256 db 5fh
- Vi600x256 db 5ch
- Vi768x256 db 0
- db 0, 0
- ;
- VRamSEG dw 0a000h
- VRamSEGOff db 0
- TextVRamSEG dw 0b800h
- TextPageMax db ?
- ChNumX db 4fh
- XMax db 50h
- YMax db 18h
- XbMax dw 640
- YbMax dw 480
- YLimit db 19h
- nHigh db 12h
- cHigh db 10h
- CursorEnd db 0fh
- CursorStart db 0eh
- ;XPos db ?
- ;YPos db ?
- ;XWrt db ?
- ;YWrt db ?
- PreColor dw ?
- ;
- CursorEnable db 1
- DrawingCursor db 0
- CursorActive db 0
- in43Lines db 0
- inScroll db 0
- inScanText db 0
- inTextStr db 0
- inAddNext db 0
- inSetVMode db 0
- FullPmtLine db 1
- inCCsecond db 0
- isCCleft db 0
- isCCcursor db 0
- inPmtOpr db 0
- ticker db 10h
- WaitTime db 0
- BiosWait db 0
- int8Busy db 0
- ;
- NopTime dw 0
- TimeEnable db 0
- PmtXPos db 0
- ;
- FontBuf db 36 dup(?)
- ;
- inFontA db ?
- inFontB db ?
- FSetA db ?
- FSetB db ?
- ;
- CurPage db ?
- DrawColor db 7
- DrawType db 0
- BitMask db 0ffh
- ;
- first db ?
- attr db ?
- CurX db ?
- CurY db ?
- LastX db ?
- LastY db ?
- ;
- attr0 db 07h
- ;
- include char.mac
- ;
- ScrBuf dw BUFSIZE dup(?)
- ScrType db BUFSIZE dup(?)
- ;
- ;
- ; TabChar[ '' ... ]
- ; Offset = 10h
- db 21h, 22h, 00h, 00h, 00h, 00h, 00h, 00h ; 10 - 17
- db 28h, 24h, 21h, 22h, 00h, 00h, 28h, 24h ; 18 - 1f
- ; Offset = 20h
- ;
- CharNumMax dw 07d0h
- xy dw ?
- SavePos dw ?
- CurOfs dw ?
- R1 dw ?
- R2 dw ?
- R3 dw ?
- R4 dw ?
- ;
- ; Offset = 30h
- ;
- VRamAddr dw 32 dup(?)
- BufOfs dw 32 dup(?)
- ;
- ; Offset = b0h
- ;
- TabAttr equ $ - 00b0h
- ; --------------------------------------------------
- ; b7 = Double VertLine; b6 = Double HoriLine
- ; b5 = None ; b4 = Block Char
- ; b3 = Down Attr ; b2 = Up Attr
- ; b1 = Right Attr ; b0 = Left Attribute
- ; --------------------------------------------------
- ; '░' '▒' '▓' b0 - b2
- db 0dfh, 0dfh, 0dfh
- ; --------------------------------------------------
- ; '│' '┤' '╡' '╢' '╖' '╕' b3 - b8
- db 0ch, 0dh, 4dh, 8dh, 89h, 49h
- ; --------------------------------------------------
- ; '╣' '║' '╗' '╝' '╜' '╛' b9 - be
- db 0cdh, 8ch, 0c9h, 0c5h, 85h, 45h
- ; --------------------------------------------------
- ; '┐' '└' '┴' '┬' '├' '─' bf - c4
- db 09h, 06h, 07h, 0bh, 0eh, 03h
- ; --------------------------------------------------
- ; '┼' '╞' '╟' '╚' '╔' '╩' c5 - ca
- db 0fh, 4eh, 8eh, 0c6h, 0cah, 0c7h
- ; --------------------------------------------------
- ; '╦' '╠' '═' '╬' '╧' '╨' cb - d0
- db 0cbh, 0ceh, 43h, 0cfh, 47h, 87h
- ; --------------------------------------------------
- ; '╤' '╥' '╙' '╘' '╒' '╓' d1 - d6
- db 4bh, 8bh, 86h, 46h, 4ah, 8ah
- ; --------------------------------------------------
- ; '╫' '╪' '┘' '┌' d7 - da
- db 8fh, 4fh, 05h, 0ah
- ; --------------------------------------------------
- ; '█' '▄' '▌' '▐' '▀' db - df
- db 0dfh, 0dfh, 1ch, 1ch, 0dfh
- ; --------------------------------------------------
- ;
- AuthorStr db 37h, 0e7h
- db 0dh,6dh, 0afh,9bh, 0dbh,0abh, 0ceh,0cch
- db 0dfh,8ch, 0dah,0dbh, 0fah,0cbh
- db 5ch,0dch, 0bah,9bh, 0ebh,0bch
- db 02h,02h, 56h,0e7h, 8fh,5ah, 0e7h,0a3h
- db 82h,37h, 73h,03h, 23h,13h, 23h,92h
- db 43h,23h, 33h,93h, 0d2h,33h, 23h,53h
- db 02h,13h, 56h,0e7h, 0eeh,8ah, 37h,0e7h
- AuthorName db 2ch,3bh, 0dah,0dbh, 0efh,4ch, 0,0
- ;
- color db 0,9,1,0,9,1,1, 1,0,9,1,1
- ;
- TimeStr db '12:00:00'
- VerStr db 'CHCS 1.0'
- ;
- TmpPos dw ?
- FontOprMark db 0
- PmtFirst db ?
- PmtFirstX db ?
- ; -------------------------------
- inBeep proc near
- ;
- ; IN: cx = Freq
- ; bx = Time
- ;
- mov al, 0b6h
- out 43h, al
- mov al, cl
- out 42h, al
- mov al, ch
- out 42h, al
- in al, 61h
- mov ah, al
- or al, 3
- out 61h, al
- inBeepDelay: mov cx, 2801h
- inBeepLoop0: loop inBeepLoop0
- dec bx
- jnz inBeepDelay
- mov al, ah
- out 61h, al
- ret
- inBeep endp
- ; -------------------------------
- SwitchVRamSEG proc near
- ;
- ; IN: ah = 0 ... A0000-BFFFF 128K
- ; ah = 1 ... A0000-AFFFF 64K
- ; ah = 2 ... B0000-B7FFF 32K
- ; ah = 3 ... B8000-BFFFF 32K
- ;
- push dx
- and ah, 3
- shl ah, 1
- shl ah, 1
- or ah, 1
- mov al, 06h
- mov dx, GCindex
- out dx, al
- inc dx
- mov al, ah
- out dx, al
- pop dx
- ret
- SwitchVRamSEG endp
- ; -------------------------------
- ResetGC proc near
- mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- mov al, 01h
- out dx, ax
- ret
- ResetGC endp
- ; -------------------------------
- CalcVRamAddr proc near
- ;
- ; IN: dx = Pos
- ; OUT: es:di = VRamPntr
- ;
- mov cl, dh
- xor ch, ch
- mov di, cx
- shl di, 1
- mov di, VRamAddr[di]
- cmp dh, YMax
- ja isPmtAddr
- AddrCont0: mov cl, dl
- add di, cx
- mov es, VRamSEG
- ret
- ;
- isPmtAddr: add di, 80*7
- jmp AddrCont0
- ;
- CalcVRamAddr endp
- ; -------------------------------
- inSetRegisters proc near
- ;
- ; IN: bh = DrawType
- ; bl = DrawColor
- ;
- mov dx, GCindex
- mov al, 0
- mov ah, DrawColor
- out dx, ax
- mov ax, 0f01h
- out dx, ax
- mov ah, DrawType
- mov al, 03h
- out dx, ax
- ret
- inSetRegisters endp
- ; -------------------------------
- inReRegisters proc near
- mov dx, GCindex
- mov ax, 0001h
- out dx, ax
- mov ax, 0ff08h
- out dx, ax
- mov ax, 0003h
- out dx, ax
- ret
- inReRegisters endp
- ; -------------------------------
- CalcVRamOfs proc near
- ;
- ; IN: ax = y
- ; cx = x
- ; OUT: es:di = VRamPntr
- ; cl = SetBit
- ;
- push bx
- xor bh, bh
- mov bl, XMax
- mul bx
- mov di, ax
- mov ax, cx
- xor ch, ch
- and cl, 7
- shr ax, 1
- shr ax, 1
- shr ax, 1
- add di, ax
- mov ax, VRamSEG
- mov es, ax
- pop bx
- ret
- CalcVRamOfs endp
- ; -------------------------------
- ScanLine proc near
- ;
- ; IN: bx = startx
- ; cx = endx
- ; dx = y
- ;
- push es
- push di
- cmp bx, cx
- jbe HLineNotSwap
- mov ax, bx
- mov bx, cx
- mov cx, ax
- HLineNotSwap: cli
- mov di, dx
- call inSetRegisters
- mov ax, di
- push cx
- mov cx, bx
- call CalcVRamOfs
- mov al, cl
- pop cx
- sub cx, bx
- inc cx
- or al, al
- je SlComplete
- mov bx, 0ffh
- push cx
- mov cl, al
- shr bx, cl
- pop cx
- xor ah, ah
- add cx, ax
- sub cx, 8
- jge SlSetMask
- neg cx
- shr bx, cl
- shl bx, cl
- xor cx, cx
- SlSetMask: mov dx, GCindex
- mov al, 08h
- mov ah, bl
- out dx, ax
- mov al, es:[di]
- cld
- stosb
- SlComplete: mov bx, cx
- cmp cx, 8
- jb SlTailing
- shr cx, 1
- shr cx, 1
- shr cx, 1
- mov dx, GCindex
- mov ax, 0ff08h
- out dx, ax
- mov ax, 0ffffh
- cld
- rep stosb
- SlTailing: and bx, 07h
- je SlDone
- mov ax, 0ffffh
- mov cl, bl
- shr ax, cl
- xor ah, 0ffh
- mov al, 08h
- mov dx, GCindex
- out dx, ax
- mov al, es:[di]
- cld
- stosb
- SlDone: call inReRegisters
- sti
- pop di
- pop es
- ret
- ScanLine endp
- ; -------------------------------
- VertLine proc near
- ;
- ; IN: bx = x0
- ; cx = y0
- ; dx = y
- ;
- push es
- push di
- cmp cx, dx
- jbe VLineNotSwap
- mov ax, cx
- mov cx, dx
- mov dx, ax
- VLineNotSwap: cli
- push cx
- push dx
- call inSetRegisters
- mov ax, cx
- mov cx, bx
- call CalcVRamOfs
- mov al, 80h
- or cl, cl
- je VLineSkipShr
- shr al, cl
- VLineSkipShr: mov dx, GCindex
- mov ah, al
- mov al, 8
- out dx, ax
- xor dh, dh
- mov dl, ChNumX
- pop cx
- pop ax
- sub cx, ax
- inc cx
- mov al, 0ffh
- cld
- VLineLoop: mov ah, es:[di]
- stosb
- add di, dx
- loop VLineLoop
- call inReRegisters
- sti
- pop di
- pop es
- ret
- VertLine endp
- ; -------------------------------
- HMLine proc near
- ;
- ; IN: dx = y
- ;
- cmp MyMode, 1
- jne HMLineQuit
- cmp FullPmtLine, 1
- jne HMLineQuit
- push bx
- push dx
- mov cx, XbMax
- xor bx, bx
- dec cx
- call ScanLine
- pop dx
- pop bx
- HMLineQuit: ret
- HMLine endp
- ;
- y0 dw 455
- dy dw 20
- ; -------------------------------
- HalfFrame proc near
- ;
- ; IN: ah = 0 ... Left-Top Corner
- ; ah = 1 ... Right-Bottom Corner
- ; cx = x1 (pixels)
- ; dx = x2 (pixels)
- ;
- push ax
- push cx
- push dx
- mov bx, cx
- mov cx, dx
- mov dx, y0
- or ah, ah
- jz isLTcorner
- add dx, dy
- isLTcorner: call ScanLine
- pop dx
- pop cx
- pop ax
- ;
- push cx
- push dx
- mov bx, dx
- cmp ah, 1
- je isRBcorner
- mov bx, cx
- isRBcorner: mov cx, y0
- mov dx, cx
- add dx, dy
- call VertLine
- pop dx
- pop cx
- ret
- HalfFrame endp
- ; -------------------------------
- TradeButton proc near
- cmp FullPmtLine, 1
- jne MakeTradeQuit
- or IntrBusy, I16Busy
- mov cx, 4
- mov dx, 43
- mov y0, 456
- mov dy, 18
- mov ah, 1
- mov DrawColor, 0
- call HalfFrame
- pusha
- mov bx, 7
- mov cx, 39
- mov dx, 471
- call ScanLine
- popa
- ;
- mov al, 9
- call SetLnColor
- mov ah, 0
- call HalfFrame
- pusha
- mov bx, 7
- mov cx, 39
- mov dx, 472
- call ScanLine
- popa
- mov y0, 455
- mov dy, 20
- and IntrBusy, NOT I16Busy
- MakeTradeQuit: ret
- TradeButton endp
- ; -------------------------------
- MakeButton proc near
- ;
- ; IN: dl = x1
- ; dh = x2
- ;
- cmp MyMode, 1
- jne MakeButtonQuit
- cmp FullPmtLine, 1
- jne MakeButtonQuit
- or IntrBusy, I16Busy
- push ax
- xor ah, ah
- mov al, dl
- mov cl, 3
- shl ax, cl
- add ax, 6
- mov bx, ax
- xor ah, ah
- mov al, dh
- shl ax, cl
- add ax, 2
- mov dx, ax
- mov cx, bx
- pop ax
- mov DrawColor, 0
- mov ah, 0
- call HalfFrame
- mov al, 9
- call SetLnColor
- mov ah, 1
- call HalfFrame
- and IntrBusy, NOT I16Busy
- MakeButtonQuit: ret
- MakeButton endp
- ; -------------------------------
- SetBarColor proc near
- ;
- ; IN: al = origin color
- ; OUT: al = color
- ;
- push cx
- mov cl, 4
- or al, al
- jz toSetBarColor
- cmp al, 9
- je isHiBarColor
- mov al, bAttr
- shr al, cl
- jmp toSetBarColor
- isHiBarColor: mov al, bAttr
- shr al, cl
- or al, 8
- toSetBarColor: mov DrawColor, al
- pop cx
- ret
- SetBarColor endp
- ; -------------------------------
- SetLnColor proc near
- ;
- ; IN: al = origin color
- ; OUT: al = color
- ;
- push cx
- mov cl, 4
- or al, al
- jz toSetLnColor
- cmp al, 9
- je isHiLnColor
- mov al, bAttr
- shr al, cl
- jmp toSetLnColor
- ;
- isHiLnColor: mov al, bAttr
- shr al, cl
- or al, al
- jz toSetLnColor
- cmp al, 6
- je toSetLnColor
- or al, 8
- toSetLnColor: mov DrawColor, al
- pop cx
- ret
- SetLnColor endp
- ; -------------------------------
- MakeBottomBar proc near
- cmp MyMode, 1
- jne MakeBarQuit
- cmp FullPmtLine, 1
- jne MakeBarQuit
- or IntrBusy, I16Busy
- mov cx, 7
- mov bx, 0
- mov dx, 450
- MakeBarLoop0: push cx
- mov al, color[bx]
- call SetBarColor
- call HMLine
- inc dx
- inc bx
- pop cx
- loop MakeBarLoop0
- add dx, 18
- MakeBarLoop1: mov al, color[bx]
-
- call SetBarColor
- call HMLine
- inc dx
- inc bx
- cmp dx, YbMax
- jb MakeBarLoop1
- and IntrBusy, NOT I16Busy
- MakeBarQuit: ret
- MakeBottomBar endp
- ; -------------------------------
- FillBG proc near
- ;
- ; IN: bl = bg
- ; cx = num
- ; dx = Pos
- ;
- push bp
- push si
- push di
- cmp dl, XMax
- jb FillBGCont0
- jmp FillBGQuit
- FillBGCont0: mov ah, YMax
- inc ah
- cmp dh, ah
- jbe FillBGCont1
- jmp FillBGQuit
- FillBGCont1: cli
- push dx
- and bl, 0fh
- mov ah, bl
- xor al, al
- mov dx, GCindex
- out dx, ax
- mov ax, 0f01h
- out dx, ax
- pop dx
- mov bx, cx
- call CalcVRamAddr
- xor dh, dh
- mov dl, nHigh
- mov bp, dx
- mov dl, XMax
- mov si, di
- mov ax, 0ffffh
- FillBGLoop: mov di, si
- mov cx, bx
- cld
- rep stosb
- add si, dx
- dec bp
- jne FillBGLoop
- call ResetGC
- sti
- FillBGQuit: pop di
- pop si
- pop bp
- ret
- FillBG endp
- ; -------------------------------
- ConvCharAttr proc near
- cmp inPmtOpr, 1
- je ConvAttrEnd
- cmp ah, 0a0h
- ja SetCCAttr
- cmp al, ' '
- jbe ConvAttrEnd
- cmp al, '0'
- jb SetSymAttr
- cmp al, '9'
- jbe SetDigitAttr
- cmp al, 'A'
- jb SetSymAttr
- cmp al, 'Z'
- jbe SetUpperAttr
- cmp al, 'a'
- jb SetSymAttr
- cmp al, 'z'
- jbe ConvAttrEnd
- cmp al, 0b0h
- jae ConvAttrEnd
- ;
- SetSymAttr: mov cl, 3
- test bl, 08h
- jnz toConvAttr
- dec cl
- jmp toConvAttr
- ;
- SetDigitAttr: mov cl, 4
- jmp toConvAttr
- ;
- SetUpperAttr: mov cl, 1
- jmp toConvAttr
- ; ║║╫╓╤╒╔½╫¬╗╗:
- SetCCAttr: mov cl, 5
- test bl, 08h
- jz toConvAttr
- mov ch, bl
- and ch, 0fh
- mov cl, 5
- cmp ch, 0fh
- je toConvAttr
- inc ch
- jmp ConvAttrVeri
- ;
- toConvAttr: mov ch, bl
- and ch, 0fh
- ; add ch, cl
- sub ch, cl
- ConvAttrVeri: and ch, 0fh
- and bl, 0f0h
- mov bh, bl
- mov cl, 4
- shr bh, cl
- cmp bh, ch
- jne ConvAttrSkip0
- dec ch
- and ch, 0fh
- ConvAttrSkip0: or bl, ch
- ConvAttrEnd: ret
- ConvCharAttr endp
- ; -------------------------------
- SetAttr proc near
- ;
- ; IN: bl = attr
- ; ax = char
- ; es:di = VRamAddr
- ;
- cmp inColorText, 1
- jne SetAttrCont0
- call ConvCharAttr
- SetAttrCont0: mov cx, ax
- mov dx, GCindex
- ;
- comment @
- mov ah, bl
- shr ah, 1
- shr ah, 1
- shr ah, 1
- shr ah, 1
- xor al, al
- out dx, ax ; Set Back Color
- mov ax, 0f01h
- out dx, ax ; enable SET/RESET
- mov al, 0ffh
- mov es:[di], al ; Write Back Color
- mov ax, 0001h
- out dx, ax ; disable SET/RESET
- @
- mov ah, bl
- and ah, 0fh
- xor al, al
- out dx, ax ; Set Fore Color
- mov ax, 0305h
- out dx, ax ; Set Write Mode 3
- ;
- xor bh, bh
- shr bl, 1
- shr bl, 1
- shr bl, 1
- shr bl, 1
- add bx, PreColor
- ;
- mov ah, es:[bx] ; Load Back Color
- mov ax, cx
- ret
- SetAttr endp
- ; -------------------------------
- inDrawC proc near
- ;
- ; IN: al = char
- ; bl = attr
- ; dx = Pos
- ;
- cmp dx, word ptr CurX
- jne inDrawCCont0
- cmp isCCcursor, 1
- jne inDrawCSkip0
- cmp CursorActive, 1
- jne inDrawCCont0
- push ax
- push bx
- push dx
- inc dl
- mov isCCcursor, 0
- call XorDrawCursor
- pop dx
- pop bx
- pop ax
- inDrawCSkip0: mov CursorActive, 0
- inDrawCCont0: call CalcVRamAddr
- cli
- mov ah, bl
- lea bx, CharTable
- xlat CharTable
- mov bl, ah
- xor ah, ah
- call SetAttr
- mov ch, ah
- mov dh, ah
- mov bh, al
- mov bl, nHigh
- mov dl, ChNumX
- mov cl, cHigh
- cmp cl, 14
- ja Fmul16
- jb Fmul8
- mul cl
- jmp inDrawCCont1
- ;
- Fmul16: shl ax, 1
- Fmul8: shl ax, 1
- shl ax, 1
- shl ax, 1
- ;
- inDrawCCont1: lds si, FPntr
- add si, ax
- cld
- inDrawCLoop0: movsb
- add di, dx
- loop inDrawCLoop0
- cmp bl, 16
- jbe inDrawCEnd
- mov cl, bl
- and cl, 3
- cmp bh, 0b0h
- jb inDrawCReAX
- cmp bh, 0dfh
- ja inDrawCReAX
- dec si
- dec si
- lodsw
- jmp inDrawCLoop1
- ;
- inDrawCReAX: xor ax, ax
- inDrawCLoop1: stosb
- xchg ah, al
- add di, dx
- loop inDrawCLoop1
- inDrawCEnd: mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- ;
- mov ax, cs
- mov ds, ax
- sti
- ret
- inDrawC endp
- ; -------------------------------
- LoadCFont proc near
- ;
- ; IN: dx = cchar
- ; OUT: [bx] = Dot Matrix
- ;
- push dx
- push ax
- mov dx, ax
- mov ax, cs
- mov es, ax
- lea bx, FontBuf
- xor cx, cx
- mov ah, 80h
- pushf
- call dword ptr OldInt16
- pop dx
- ;
- xor ax, ax
- cmp dh, 0a9h
- jne LoadCFontSet
- ;
- isCCTable: mov ax, [bx+30]
- LoadCFontSet: mov [bx+32], ax
- mov [bx+34], ax
- mov ax, dx
- pop dx
- ret
- LoadCFont endp
- ; -------------------------------
- inDrawCC proc near
- cmp dh, CurY
- jne inCCcont0
- cmp dl, CurX
- ja inCCcont0
- inc dl
- cmp dl, CurX
- jb inCCSkip0
- mov CursorActive, 0
- inCCSkip0: dec dl
- inCCcont0: push bx
- call LoadCFont
- mov si, bx
- call CalcVRamAddr
- pop bx
- cli
- call SetAttr
- xor dh, dh
- mov dl, ChNumX
- dec dl
- xor ch, ch
- mov cl, nHigh
- cld
- inCCLoop: movsw
- add di, dx
- loop inCCLoop
- mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- sti
- ret
- inDrawCC endp
- ; -------------------------------
- inDrawCC1 proc near
- cmp dh, CurY
- jne inCC1Skip
- cmp dl, CurX
- jne inCC1Skip
- mov CursorActive, 0
- inCC1Skip: push bx
- call LoadCFont
- mov si, bx
- call CalcVRamAddr
- pop bx
- cli
- call SetAttr
- xor dh, dh
- mov dl, ChNumX
- xor ch, ch
- mov cl, nHigh
- cld
- inCC1Loop: movsb
- inc si
- add di, dx
- loop inCC1Loop
- mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- sti
- ret
- inDrawCC1 endp
- ; -------------------------------
- inDrawCC2 proc near
- cmp dh, CurY
- jne inCC2Skip
- cmp dl, CurX
- jne inCC2Skip
- mov CursorActive, 0
- inCC2Skip: push bx
- call LoadCFont
- mov si, bx
- call CalcVRamAddr
- pop bx
- cli
- call SetAttr
- xor dh, dh
- mov dl, ChNumX
- xor ch, ch
- mov cl, nHigh
- cld
- inCC2Loop: inc si
- movsb
- add di, dx
- loop inCC2Loop
- mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- sti
- ret
- inDrawCC2 endp
- ; -------------------------------
- CalcBufOfs proc near
- ;
- ; IN: dx = Pos
- ; OUT: bx = y * XMax + x
- ;
- xor bh, bh
- mov bl, dh
- shl bx, 1
- mov bx, BufOfs[bx]
- add bl, dl
- adc bh, 0
- ret
- CalcBufOfs endp
- ; -------------------------------
- WriteScrBuf proc near
- ;
- ; IN: al = char
- ; bh = type
- ; bl = attr
- ; si = Offset
- ;
- push ax
- ; cmp dh, YMax
- ; ja SkipType
- mov ScrType[si], bh
- SkipType: mov ah, bl
- shl si, 1
- mov ScrBuf[si], ax
- ;
- cmp inScanText, 1
- je WriteScrBufEnd
- cmp TextMode, 1
- jne WriteScrBufEnd
- ; cmp dh, YMax
- ; ja WriteScrBufEnd
- push dx
- mov dx, TextVRamSEG
- mov es, dx
- pop dx
- mov es:[si], ax
- WriteScrBufEnd: shr si, 1
- pop ax
- ret
- WriteScrBuf endp
- ; -------------------------------
- PutC proc near
- ;
- ; IN: al = char
- ; bh = type
- ; dx = Pos
- ; si = Offset
- ;
- call WriteScrBuf
- call inDrawC
- ret
- PutC endp
- ; -------------------------------
- PutCC proc near
- ;
- ; IN: ax = cchar
- ; bh = attr1
- ; bl = attr2
- ; dx = Pos
- ; si = Offset
- ;
- mov cx, bx
- xchg ah, al
- mov bl, bh
- mov bh, 1
- call WriteScrBuf
- mov bx, cx
- xchg ah, al
- inc si
- mov bh, 2
- ;
- cmp inAddNext, 1
- jne toScrBuf
- mov inAddNext, 0
- cmp dh, YMax
- ja PutCC_0
- mov ScrType[si], bh
- jmp PutCC_0
- ;
- toScrBuf: call WriteScrBuf
- PutCC_0: mov bx, cx
- cmp dl, ChNumX
- jae PutCC1_2
- cmp bh, bl
- jne PutCC1_2
- call inDrawCC
- ret
- ;
- PutCC1_2: push ax
- push bx
- push dx
- mov bl, bh
- call inDrawCC1
- pop dx
- pop bx
- pop ax
- inc dl
- cmp dl, XMax
- jb PutCCSkip0
- inc dh
- xor dl, dl
- PutCCSkip0: call inDrawCC2
- ret
- PutCC endp
- ; -------------------------------
- CurToTab proc near
- ;
- ; IN: si = Offset for CurPos
- ; dx = Pos
- ;
- push es
- push si
- push dx
- shl si, 1
- mov ax, ScrBuf[si]
- shr si, 1
- mov bh, 88h
- mov bl, ah
- call WriteScrBuf
- call inDrawC
- pop dx
- pop si
- pop es
- ret
- CurToTab endp
- ; -------------------------------
- LeftToTab proc near
- ;
- ; IN: al = Left MoveNum to Set
- ; dx = Pos
- ; si = Offset for CurPos
- ;
- push es
- push si
- push dx
- sub dl, al
- xor ah, ah
- sub si, ax
- shl si, 1
- mov ax, ScrBuf[si]
- shr si, 1
- mov bh, 88h
- mov bl, ah
- call WriteScrBuf
- call inDrawC
- pop dx
- pop si
- pop es
- ret
- LeftToTab endp
- ; -------------------------------
- RightToTab proc near
- ;
- ; IN: al = Right MoveNum to Set
- ; dx = Pos
- ; si = Offset for CurPos
- ;
- push es
- push si
- push dx
- add dl, al
- xor ah, ah
- add si, ax
- shl si, 1
- mov ax, ScrBuf[si]
- shr si, 1
- mov bh, 88h
- mov bl, ah
- call WriteScrBuf
- call inDrawC
- pop dx
- pop si
- pop es
- ret
- RightToTab endp
- ; -------------------------------
- TestMatchLR proc near
- ;
- ; IN: ah = left char
- ; al = current char
- ; OUT: CF = 0 ... Matched
- ; CF = 1 ... noMatch
- ;
- push dx
- push bx
- cmp ah, 11h
- je MatchLRc1
- xor bh, bh
- mov bl, al
- mov dl, byte ptr [bx+TabAttr]
- test dl, 01h
- jz noMatchLR
- mov bl, ah
- mov dh, byte ptr [bx+TabAttr]
- test dh, 02h
- jz noMatchLR
- mov bx, dx
- and dx, 7070h
- cmp dh, dl
- jne noMatchLR
- test dl, 10h
- jz toTestUD ; Not Block Char
- cmp ah, al
- jne noMatchLR
- isMatchLR: clc
- pop bx
- pop dx
- ret
- ;
- toTestUD: test bh, 0ch
- jz isMatchLR
- test bl, 0ch
- jz isMatchLR
- ;
- MatchLRc1: cmp al, 0c4h
- je isMatchLR
- cmp al, 0cdh
- je isMatchLR
- ;
- noMatchLR: stc
- pop bx
- pop dx
- ret
- TestMatchLR endp
- ; -------------------------------
- TestMatchUD proc near
- ;
- ; IN: al = current char
- ; ah = upper char
- ; OUT: CF = 0 ... Matched
- ; CF = 1 ... noMatch
- ;
- push dx
- push bx
- xor bh, bh
- mov bl, al
- mov dl, byte ptr [bx+TabAttr]
- test dl, 04h
- jz noMatchUD
- mov bl, ah
- mov dh, byte ptr [bx+TabAttr]
- test dh, 08h
- jz noMatchUD
- and dx, 0b0b0h
- cmp dh, dl
- jne noMatchUD
- test dl, 10h
- jz isMatchUD ; Not Block Char
- cmp ah, al
- jne noMatchUD
- isMatchUD: clc
- pop bx
- pop dx
- ret
- ;
- noMatchUD: cmp ax, 1fd9h
- je isMatchUD
- cmp ax, 0bb1eh
- je isMatchUD
- stc
- pop bx
- pop dx
- ret
- TestMatchUD endp
- ; -------------------------------
- CheckUpper proc near
- ;
- ; IN: al = char
- ; si = Offset
- ; dx = Pos
- ;
- push si
- push di
- or dh, dh
- jz toUpperChecked
- dec dh
- xor bh, bh
- mov bl, XMax
- sub si, bx
- mov bh, ScrType[si]
- or bh, bh
- jz toUpperChecked
- cmp bh, 83h
- ja toUpperChecked
- push si
- shl si, 1
- mov ah, byte ptr ScrBuf[si] ; upper char
- call TestMatchUD
- pop si
- jc toUpperChecked
- cmp bh, 2
- je UpperChLeft
- jb UpperChRight
- push ax
- cmp ScrType[si], 83h
- ja UpperChanged
- mov ScrType[si], 88h
- jmp UpperChanged
- ;
- toUpperChecked: jmp UpperChecked
- ;
- UpperChLeft: cmp al, 0b0h
- jb SkipCheck12
- cmp al, 0b2h
- ja SkipCheck12
- shl si, 1
- mov cl, byte ptr ScrBuf[si-2]
- shr si, 1
- cmp cl, al
- jne UpperChecked
- SkipCheck12: push ax
- call CurToTab
- or dl, dl
- jz UpperChanged
- cmp ScrType[si-1], 1
- jne UpperChanged
- mov al, 01h
- call LeftToTab
- mov ScrType[si-1], 83h
- jmp UpperChanged
- ;
- UpperChRight: cmp al, 0b0h
- jb SkipCheck21
- cmp al, 0b2h
- ja SkipCheck21
- shl si, 1
- mov cl, byte ptr ScrBuf[si+2]
- shr si, 1
- cmp al, cl
- jne UpperChecked
- SkipCheck21: push ax
- call CurToTab
- cmp ScrType[si+1], 2
- jne UpperChanged
- mov al, 01h
- call RightToTab
- mov ScrType[si+1], 83h
- shl si, 1
- mov byte ptr ScrBuf[si+3], 00h
- shr si, 1
- UpperChanged: pop ax
- mov al, ah
- call CheckUpper
- UpperChecked: pop di
- pop si
- ret
- CheckUpper endp
- ; -------------------------------
- TreatUpper proc near
- ;
- ; IN: si = Offset of CurPos
- ; dx = CurPos
- ;
- push si
- push dx
- shl si, 1
- mov al, byte ptr ScrBuf[si]
- shr si, 1
- call CheckUpper
- pop dx
- pop si
- ret
- TreatUpper endp
- ; -------------------------------
- MakeAuthorStrx proc near
- pusha
- push es
- push cs
- pop es
- lea si, AuthorStr
- lea di, Author+1
- mov cl, 4
- cld
- MakeAuLoop0: lodsw
- or ax, ax
- jz MakeAuEnd
- ror ah, cl
- ror al, cl
- xchg ah, al
- stosw
- jmp MakeAuLoop0
- ;
- MakeAuEnd: pop es
- popa
- ret
- MakeAuthorStrx endp
- ; -------------------------------
- TreatFirst proc near
- cmp TextMode, 1
- jne TreatFirstQuit
- cmp isTreatTab, 1
- je TreatFirstCont0
- TreatFirstQuit: ret
- ;
- TreatFirstCont0:mov dx, xy
- cmp dl, 2
- jb TreatFirstQuit
- push si
- push di
- call CalcBufOfs
- mov si, bx
- mov ah, first
- push si
- shl si, 1
- mov bh, 2
- TreatFirstLoop: mov al, ah
- mov ah, byte ptr ScrBuf[si-2] ; last char
- call TestMatchLR
- jc FirstNotMatch
- sub si, 2
- dec bh
- jnz TreatFirstLoop
- pop si
- cmp dl, 3
- jb FirstCh3
- cmp ScrType[si-3], 1
- jne FirstCh3
- mov al, 03h
- call LeftToTab
- FirstCh3: mov al, 02h
- call LeftToTab
- mov al, 01h
- call LeftToTab
- mov ScrType[si], 88h
- jmp FirstEnd
- ;
- FirstNotMatch: pop si
- FirstEnd: mov first, 0
- pop di
- pop si
- ret
- TreatFirst endp
- ; -------------------------------
- TestFirst proc near
- cmp first, 0
- jne toTestFirst
- ret
- toTestFirst: cmp dx, xy
- je toSkipFirst
- push ax
- push bx
- push dx
- call TreatFirst
- pop dx
- pop bx
- pop ax
- toSkipFirst: mov first, 0
- ret
- TestFirst endp
- ; -------------------------------
- CheckCharType proc near
- ;
- ; IN: al = char
- ; bl = attr
- ; dl = x
- ; dh = y
- ; si = BufOfs
- ; OUT: al = char
- ; bl = attr
- ; dl = x
- ; dh = y
- ; ah = 0 ... ascii
- ; bh = type:
- ; bh = 0 ... ASCII
- ; bh = 80h ... Not Identify, Table Char or CC
- ; bh = 83h ... Not Identify, Table Char or CC
- ; bh = 86h ... ASCII 10h--12h, 17h--1Bh
- ; bh = 88h ... Normal Table Char
- ; ah != 0 ... CChar
- ; ax = cchar
- ; bh = attr1
- ;
- cmp al, 0a0h
- ja CheckCont0
- ascii: xor bh, bh
- cmp al, 1fh
- jbe testAscii
- isAscii: xor ah, ah
- cmp ScrType[si+1], 2
- jne isAsciiRet0
- cmp inScanText, 1
- jne isAsciiRet0
- ; mov ScrType[si+1], 0
- shl si, 1
- mov byte ptr ScrBuf[si+3], 00h
- shr si, 1
- isAsciiRet0: call TestFirst
- ret
- ;
- CheckCont0: cmp al, 0ffh
- je ascii
- mov ah, bl
- push ax
- push si
- jmp ContCheck
- ;
- testAscii: cmp al, 10h
- jb isAscii
- cmp al, 12h
- jb isAsciiTab
- cmp al, 17h
- jb isAscii
- isAsciiTab: cmp isTreatTab, 1
- jne isAscii
- cmp TextMode, 1
- jne isAscii
- mov ah, bl
- push ax
- push dx
- push si
- call CheckUpper
- call TestFirst
- pop si
- pop dx
- pop ax
- mov bh, 86h
- mov bl, ah
- xor ah, ah
- ret
- ;
- ;
- CheckTab: or dh, dh
- jz CheckLast0
- xor bh, bh
- mov bl, XMax
- sub si, bx
- cmp ScrType[si], 80h
- jb CheckLast
- push si
- shl si, 1
- mov ah, byte ptr ScrBuf[si] ; upper char
- call TestMatchUD
- pop si
- jc CheckLast
- add si, bx
- jmp isTabChar
- ;
- CheckLast: add si, bx
- CheckLast0: or dx, dx
- jz CheckNext
- mov ch, ScrType[si-1]
- or ch, ch
- jz CheckNext
- cmp ch, 86h
- jb toCheckL4
- push si
- shl si, 1
- mov ah, byte ptr ScrBuf[si-2] ; last char
- call TestMatchLR
- pop si
- jc CheckNext
- jmp isTabChar
- ;
- CheckNext: mov cl, ScrType[si+1]
- cmp cl, 83h
- jb toCheckL4
- push si
- shl si, 1
- mov ah, al
- mov al, byte ptr ScrBuf[si+2]
- call TestMatchLR
- mov al, ah
- pop si
- jc toCheckL4
- ;
- isTmpTab: pop si
- pop ax
- mov bh, 83h
- mov bl, ah
- xor ah, ah
- call TestFirst
- ret
- ;
- trunChecked: pop si
- mov al, bl
- toChecked: jmp TabChecked
- ;
- toCheckL4: cmp dl, 3
- jb toChecked
- or ch, ch
- jz toChecked
- mov ah, al
- mov bl, al
- push si
- shl si, 1
- mov bh, 3
- L4Loop: mov al, ah
- mov ah, byte ptr ScrBuf[si-2]
- cmp ah, 0b0h
- jb trunChecked
- cmp ah, 0dfh
- ja trunChecked
- call TestMatchLR
- jc trunChecked
- sub si, 2
- dec bh
- jnz L4Loop
- pop si
- cmp dl, 4
- jb SkipChange
- cmp ScrType[si-4], 1
- jne SkipChange
- mov al, 04h
- call LeftToTab
- SkipChange: sub si, 3
- sub dl, 3
- call CurToTab
- call TreatUpper
- inc dl
- inc si
- call CurToTab
- call TreatUpper
- inc dl
- inc si
- call CurToTab
- call TreatUpper
- inc dl
- inc si
- jmp toTab
- ;
- isTabChar: push dx
- call CheckUpper
- pop dx
- toTab: pop si
- pop ax
- trunTab: call TestFirst
- mov bh, 88h
- mov bl, ah
- xor ah, ah
- ret
- ;
- toAscii: pop si
- pop ax
- mov bh, 80h
- mov bl, ah
- xor ah, ah
- ;
- cmp ScrType[si+1], 1
- jne toAsciiRet
- cmp inScanText, 1
- jne toAsciiRet
- cmp dl, ChNumX
- je toAsciiRet
- ; mov ScrType[si+1], 0
- shl si, 1
- mov byte ptr ScrBuf[si+3], 00h
- shr si, 1
- toAsciiRet: call TestFirst
- mov first, al
- mov xy, dx
- ret
- ;
- ;
- ContCheck: cmp al, 0b0h
- jb TabChecked
- cmp al, 0dfh
- ja TabChecked
- cmp TextMode, 1
- jne TabChecked
- cmp isTreatTab, 1
- jne TabChecked
- jmp CheckTab
- ;
- AddNext: cmp dl, ChNumX
- je toAscii
- mov bh, ScrType[si+1]
- cmp bh, 1
- jbe toAscii
- cmp bh, 80h
- ja toAscii
- mov cl, al
- shl si, 1
- mov ax, ScrBuf[si+2] ; ah = attr2, al = cc2
- cmp cl, 0feh
- jne NextCont1
- cmp al, 0b0h
- je toTab
- NextCont1: pop si
- pop bx ; bh = attr1, bl = cc1
- mov cl, ah
- mov ah, bl ; ah = cc1
- mov bl, cl ; bl = attr2
- mov inAddNext, 1
- ;
- cmp ScrType[si+2], 2
- jne AddNextRet
- cmp inScanText, 1
- jne AddNextRet
- mov cl, ChNumX
- sub cl, dl
- cmp cl, 2
- jb AddNextRet
- ; mov ScrType[si+2], 0
- shl si, 1
- mov byte ptr ScrBuf[si+5], 00h
- shr si, 1
- AddNextRet: mov cx, dx
- inc cl
- cmp cx, xy
- je toReFirst
- call TestFirst
- toReFirst: mov first, 0
- ret
- ;
- TabChecked: cmp DispMode, 6
- jbe tCont0
- cmp first, 0
- je trunAscii
- tCont0: or dx, dx
- jz AddNext
- cmp inScanText, 1
- jne TabSkipVR
- or dl, dl
- jz trunNext
- TabSkipVR: mov ah, ScrType[si-1]
- or ah, ah
- jz trunNext
- cmp ah, 83h
- ja trunNext
- cmp ah, 2
- jne tConta
- cmp ScrType[si-2], 1
- je trunNext
- ;
- tConta: shl si, 1
- mov bx, ScrBuf[si-2] ; bh = attr1, bl = cc1
- cmp bl, 0feh
- jne tContb
- cmp al, 0b0h
- jne tContb
- jmp toTab
- ;
- trunAscii: jmp toAscii
- ;
- trunNext: jmp AddNext
- ;
- tContb: pop si
- pop ax ; ah = attr2, al = cc2
- mov cl, ah
- mov ah, bl ; ah = cc1
- mov bl, cl ; bl = attr2
- or dl, dl
- jnz SkipEOL
- dec dh
- mov dl, XMax
- SkipEOL: dec dl
- dec si
- cmp ah, al
- jne toCCRet1
- cmp dl, 2
- jb toCCRet1
- cmp word ptr ScrType[si+2], 8888h
- jne toCCRet1
- cmp al, 0b0h
- jb toCCRet1
- je toCCcont0
- cmp al, 0b1h
- je toCCcont0
- cmp al, 0b2h
- je toCCcont0
- cmp al, 0c4h
- jb toCCRet1
- je toCCcont0
- cmp al, 0cdh
- jne toCCRet1
- ;
- toCCcont0: shl si, 1
- cmp al, byte ptr ScrBuf[si+4]
- jne toCCcont1
- cmp al, byte ptr ScrBuf[si+6]
- jne toCCcont1
- shr si, 1
- mov ScrType[si], 88h
- inc dl
- inc si
- xor ah, ah
- mov bh, 88h
- call TestFirst
- ret
- ;
- toCCcont1: shr si, 1
- toCCRet1: cmp ScrType[si+2], 2
- jne toCCRetn
- cmp inScanText, 1
- jne toCCRetn
- mov cl, ChNumX
- sub cl, dl
- cmp cl, 2
- jb toCCRetn
- ; mov ScrType[si+2], 0
- shl si, 1
- mov byte ptr ScrBuf[si+5], 00h
- shr si, 1
- toCCRetn: call TestFirst
- ret
- CheckCharType endp
- ; -------------------------------
- PutChar proc near
- ;
- ; IN: al = char
- ; bl = attr
- ; dx = Pos
- ; si = BufOfs
- ;
- mov WaitTime, 0
- cmp dh, YMax
- ja PutCharRetn
- ;
- PutCharLoop: call CheckCharType
- or ah, ah
- jnz PutCharToCC
- call WriteScrBuf
- call inDrawC
- ret
- ;
- PutCharToCC: call PutCC
- PutCharRetn: ret
- ;
- comment @
- PutToVirScr: cmp dh, YLimit
- jae PutCharRetn
- cmp dh, YWrt
- jb skipSetXYWrt
- je skipSetYWrt
- mov YWrt, dh
- mov XWrt, 0
- jmp skipSetXYWrt
- ;
- skipSetYWrt: cmp dl, XWrt
- jbe skipSetXYWrt
- mov XWrt, dl
- skipSetXYWrt: mov bh, 0
- call WriteScrBuf
- ret
- @
- PutChar endp
- ; -------------------------------
- FillBlanks proc near
- ;
- ; IN: bl = attr
- ; cl = num
- ; dx = Pos
- ;
- push es
- shr bl, 1
- shr bl, 1
- shr bl, 1
- shr bl, 1
- xor ch, ch
- call FillBG
- pop es
- ret
- FillBlanks endp
- ; -------------------------------
- ClearArea proc near
- ;
- ; IN: al = Clear Lines
- ; bh = attr
- ; ch = top
- ; cl = left
- ; dx = right
- ;
- push es
- push di
- push bp
- push ds
- pop es
- xor ah, ah
- mov bp, ax
- mov ah, al
- mov al, dl
- cmp first, 0
- je ClearSkip0
- mov dx, xy
- cmp dh, ch
- jb ClearSkip0
- add ah, ch
- cmp dh, ah
- ja ClearSkip0
- cmp dl, cl
- jb ClearSkip0
- cmp dl, al
- ja ClearSkip0
- mov first, 0
- ClearSkip0: mov dx, cx
- push dx
- sub al, cl
- inc al
- mov cl, al
- mov bl, bh
- mov al, ch
- mov dh, XMax
- mul dh
- xor dh, dh
- xor ch, ch
- add ax, dx
- pop dx
- ClearLoop: push cx
- push bx
- push dx
- push ax
- push ax
- push cx
- lea di, ScrBuf
- shl ax, 1
- add di, ax
- mov ah, bh
- mov al, 20h
- cld
- rep stosw
- pop cx
- pop ax
- push ax
- push cx
- lea di, ScrType
- add di, ax
- xor al, al
- cld
- rep stosb
- pop cx
- push cx
- push bx
- mov bl, bh
- call FillBlanks
- pop bx
- pop cx
- pop ax
- cmp TextMode, 1
- jne ClearSkip1
- push es
- shl ax, 1
- mov di, ax
- mov ax, TextVRamSEG
- mov es, ax
- mov ah, bh
- mov al, 20h
- cld
- rep stosw
- pop es
- ClearSkip1: xor dh, dh
- mov dl, XMax
- pop ax
- add ax, dx
- pop dx
- pop bx
- pop cx
- inc dh
- dec bp
- jne ClearLoop
- pop bp
- pop di
- pop es
- ret
- ClearArea endp
- ; -------------------------------
- PreColors proc near
- push es
- push di
- push dx
- mov ax, YbMax
- xor cx, cx
- call CalcVRamOfs ; es:di = VRam Addr
- mov PreColor, di
- mov dx, GCindex
- mov ax, 0f01h
- out dx, ax ; enable SET/RESET
- mov cx, 16
- xor bl, bl
- PreColorLoop: mov ah, bl
- xor al, al
- out dx, ax ; Set Back Color
- mov al, 0ffh
- mov es:[di], al ; Write Back Color
- inc bl
- inc di
- loop PreColorLoop
- mov ax, 0001h
- out dx, ax ; disable SET/RESET
- pop dx
- pop di
- pop es
- ret
- PreColors endp
- ; -------------------------------
- LoadFontAB proc near
- mov al, DispMode
- cmp al, 0fh
- je FontToEGA
- cmp al, 10h
- je FontToEGA
- mov al, 4
- jmp LoadFontTo
- ;
- FontToEGA: mov al, 1
- LoadFontTo: mov ah, 11h
- mov bl, 0
- call EGAVGAFontOpr
- ret
- LoadFontAB endp
- ; -------------------------------
- Clear proc near
- ;
- ; IN: bh = attr0
- ;
- push di
- mov al, YMax
- ; mov YWrt, al
- ; mov XWrt, 0
- inc al
- xor cx, cx
- mov dl, ChNumX
- push bx
- call ClearArea
- pop ax
- mov bx, CharNumMax
- mov cx, BUFSIZE
- sub cx, bx
- jbe ClearRet0
- push es
- shl bx, 1
- lea di, ScrBuf
- add di, bx
- mov dx, ds
- mov es, dx
- mov ah, attr0
- mov al, 20h
- cld
- rep stosw
- pop es
- ClearRet0: pop di
- ret
- Clear endp
- ; -------------------------------
- ClearTextPage proc near
- push di
- cmp TextMode, 1
- jne ClearXPageRetn
- xor ch, ch
- mov cl, TextPageMax
- dec cl
- jz ClearXPageRetn
- mov bx, TextVRamSEG
- mov ax, 100h
- ClearXPageLoop: push ax
- push cx
- xor di, di
- add bx, ax
- mov es, bx
- mov ax, 0720h
- mov cx, CharNumMax
- cld
- rep stosw
- pop cx
- pop ax
- loop ClearXPageLoop
- ClearXPageRetn: pop di
- ret
- ClearTextPage endp
- ; -------------------------------
- GCenable proc near
- ;
- ; IN: ah = 00 ... Disable PAC
- ; ah = 20 ... Enable PAC
- ;
- push dx
- cli
- mov dx, 3dah
- in al, dx
- mov dx, 3c0h
- mov al, ah
- or al, 0fh
- out dx, al
- sti
- pop dx
- ret
- GCenable endp
- ; -------------------------------
- SetVGAStartAddr proc near
- cmp cs:TextMode, 1
- je VGAStartCont0
- ret
- VGAStartCont0: push ax
- push dx
- mov dx, GCindex
- mov ax, 0106h
- out dx, ax
- mov dx, 3c4h
- mov ax, 0404h
- out dx, ax
- mov ah, cs:VRamSEGOff
- or ah, ah
- jz VGAStartEnd0
- push es
- xor dx, dx
- mov es, dx
- mov al, 0ch
- mov dx, es:[463h]
- pop es
- out dx, al
- inc dx
- mov al, ah
- out dx, al
- VGAStartEnd0: pop dx
- pop ax
- ret
- SetVGAStartAddr endp
- ; -------------------------------
- DeterVGAStart proc near
- push es
- push ds
- mov ax, 0a000h
- mov ds, ax
- mov ax, 0b000h
- mov es, ax
- mov word ptr es:[0f000h], 0
- mov word ptr ds:[0f000h], 8888h
- cmp word ptr es:[0f000h], 8888h
- mov word ptr ds:[0f000h], 0
- pop ds
- pop es
- jne NoStartOffset
- mov VRamSEG, 0ae90h
- mov VRamSEGOff, 0e9h
- mov TextPageMax, 6
- call SetVGAStartAddr
- ret
- NoStartOffset: mov TextPageMax, 8
- ret
- DeterVGAStart endp
- ; -------------------------------
- CalcCharNum proc near
- xor ax, ax
- xor bx, bx
- mov cx, 32
- mov dl, nHigh
- mov dh, XMax
- CalcNumLoop: push ax
- push dx
- mul dh
- mov BufOfs[bx], ax ; *= XMax
- xor dh, dh
- mul dx
- mov VRamAddr[bx], ax ; *= nHigh
- pop dx
- pop ax
- inc ax
- inc bx
- inc bx
- loop CalcNumLoop
- dec dh
- mov ChNumX, dh ; ChNumX = XMax - 1
- ;
- xor bh, bh
- mov bl, YMax
- inc bl
- shl bx, 1
- mov ax, BufOfs[bx]
- mov CharNumMax, ax
- mov al, YMax
- ;
- ; mov YWrt, al
- ; mov XWrt, 0
- ; mov ax, BUFSIZE
- ; div byte ptr XMax
- ;
- inc al
- mov byte ptr YLimit, al
- ret
- CalcCharNum endp
- ; -------------------------------
- SetBiosMode proc near
- ;
- ; IN: al = Video Mode
- ;
- xor ah, ah
- and al, 7fh
- pushf
- call dword ptr OldInt10
- ret
- SetBiosMode endp
- ; -------------------------------
- SetDispMode proc near
- ;
- ; Int 10h Func 00h: Set Video Mode
- ; IN: ah = 0
- ; al = vmode
- ;
- push di
- mov CursorEnable, 0
- mov TimeEnable, 0
- mov inSetVMode, 1
- mov FullPmtLine, 0
- mov MyMode, 0
- xor dx, dx
- mov es, dx
- push ax
- mov bl, al
- call GCenable
- mov al, bl
- and al, 7fh
- cmp al, 2
- je toCEmode
- cmp al, 3
- je toWhichText
- cmp al, 6
- je toCCmode
- jmp toOld10Mode
- ;
- toCCmode: mov al, 12h
- call SetBiosMode
- mov VRamSEG, 0a000h
- mov VRamSEGOff, 0
- mov ah, 1
- call SwitchVRamSEG
- mov word ptr es:[44ch], 1000h
- mov word ptr es:[44eh], 0
- mov byte ptr es:[462h], 0
- mov TextMode, 0
- jmp VModeCont0
- ;
- toWhichText: cmp CurTextMode, 1
- jb toCEmode
- je toCCmode
- cmp in43Lines, 1
- je trunCEmode
- jmp toOld10Mode
- ;
- trunCEmode: mov in43Lines, 0
- mov CurTextMode, 0
- ;
- toCEmode: mov al, bl
- pushf
- call dword ptr OldInt10
- push word ptr es:[44ch]
- push word ptr es:[44eh]
- push word ptr es:[462h]
- mov al, 12h
- call SetBiosMode
- mov ah, 0
- call SwitchVRamSEG
- pop ax
- mov es:[462h], al
- pop ax
- mov word ptr es:[44eh], ax
- pop word ptr es:[44ch]
- mov bx, TextVRamSEG
- and bx, 0b800h
- add bx, ax
- mov TextVRamSEG, bx
- xor ah, ah
- call GCenable
- mov TextMode, 1
- call DeterVGAStart
- ;
- VModeCont0: mov MyMode, 1
- mov FullPmtLine, 1
- mov nHigh, 18
- mov cHigh, 16
- mov XMax, 80
- mov YMax, 24
- mov XbMax, 640
- mov YbMax, 480
- call CalcCharNum
- pop ax
- mov dl, al
- and al, 7fh
- mov DispMode, al
- mov es:[449h], al
- mov al, XMax
- mov es:[44ah], ax
- mov di, 450h
- mov cx, 8
- xor ax, ax
- cld
- rep stosw
- mov byte ptr es:[484h], 18h
- mov word ptr es:[485h], 10h
- call PreColors
- mov al, dl
- and dl, 7fh
- cmp dl, 3
- ja toClear
- test al, 80h
- jnz VModeNoClear
- toClear: call LoadFontAB
- mov bh, attr0
- call Clear
- jmp VModeCont1
- ;
- VModeNoClear: call DrawScrBuf
- ;
- VModeCont1: mov cx, 0e0fh
- mov es:[460h], cx
- mov word ptr CursorEnd, cx
- call SetVGAStartAddr
- call MakeAuthorStrx
- call message
- jmp VModeRet0
- ;
- ;
- toOld10Mode: and al, 7fh
- cmp CurTextMode, 1
- jne VModeCont2
- cmp al, 12h
- jne VModeCont2
- pop ax
- and al, 7fh
- push ax
- jmp toCCmode
- ;
- VModeCont2: mov TextMode, 0
- mov DispMode, al
- mov VRamSEG, 0a000h
- mov VRamSEGOff, 0
- pop ax
- call SetBiosMode
- mov al, DispMode
- cmp al, 12h
- je VModeToVGA
- cmp al, 11h
- je VModeToVGA
- cmp al, 10h
- je VModeToEGA
- cmp al, 0fh
- je VModeToEGA
- mov MyMode, 0
- jmp VModeRetn
- ;
- VModeToVGA: mov MyMode, 1
- mov nHigh, 16
- mov cHigh, 16
- mov XMax, 80
- mov YMax, 29
- mov XbMax, 640
- mov YbMax, 480
- jmp VModeSetVars
- ;
- VModeToEGA: mov MyMode, 1
- mov nHigh, 14
- mov cHigh, 14
- mov XMax, 80
- mov YMax, 24
- mov XbMax, 640
- mov YbMax, 350
- VModeSetVars: mov ah, 1
- call SwitchVRamSEG
- call CalcCharNum
- call LoadFontAB
- call PreColors
- mov bh, attr0
- call Clear
- ;
- VModeRet0: call ClearTextPage
- mov ah, 20h
- call GCenable
- mov word ptr CurX, 0
- VModeRetn: mov inSetVMode, 0
- mov CursorActive, 0
- mov CursorEnable, 1
- mov TimeEnable, 1
- pop di
- ret
- SetDispMode endp
- ; -------------------------------
- NoCursor proc near
- push ax
- push bx
- push cx
- push dx
- call HideCursor
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- NoCursor endp
- ; -------------------------------
- WriteTextScr proc near
- mov al, CursorEnable
- mov ah, TimeEnable
- push ax
- mov CursorEnable, 0
- mov TimeEnable, 0
- push es
- push si
- push di
- mov cx, CharNumMax
- mov ax, TextVRamSEG
- mov es, ax
- lea si, ScrBuf
- mov di, 0
- cld
- rep movsw
- pop di
- pop si
- pop es
- ;
- pop ax
- mov CursorEnable, al
- mov TimeEnable, ah
- ret
- WriteTextScr endp
- ; -------------------------------
- SaveTextScr proc near
- mov al, CursorEnable
- mov ah, TimeEnable
- push ax
- mov CursorEnable, 0
- mov TimeEnable, 0
- push es
- push ds
- push si
- push di
- lea di, ScrBuf
- push ds
- pop es
- mov cx, CharNumMax
- mov ax, TextVRamSEG
- mov ds, ax
- mov si, 0
- cld
- rep movsw
- pop di
- pop si
- pop ds
- pop es
- ;
- pop ax
- mov CursorEnable, al
- mov TimeEnable, ah
- ret
- SaveTextScr endp
- ; -------------------------------
- DrawScrBuf proc near
- cmp inDrawScrBuf, 0
- je dsCont0
- ret
- ;
- inDrawScrBuf db 0
- ;
- dsCont0: mov inDrawScrBuf, 1
- call SetVGAStartAddr
- call MakeAuthorStrx
- mov al, CursorEnable
- mov ah, TimeEnable
- push ax
- mov CursorEnable, 0
- mov TimeEnable, 0
- push es
- push si
- push di
- lea si, ScrBuf
- mov cx, CharNumMax
- xor dx, dx
- xor bx, bx
- DrawScrLoop: push dx
- push cx
- push bx
- push si
- mov ax, [si]
- mov si, bx
- mov bl, ah
- call PutChar
- pop si
- pop bx
- pop cx
- pop dx
- inc bx
- add si, +2
- inc dl
- cmp dl, XMax
- jne DrawScrSkip
- mov dl, 0
- inc dh
- DrawScrSkip: loop DrawScrLoop
- pop di
- pop si
- pop es
- ;
- pop ax
- mov CursorEnable, al
- mov TimeEnable, ah
- mov inDrawScrBuf, 0
- ret
- DrawScrBuf endp
- ; -------------------------------
- TreatPos proc near
- ;
- ; IN: al = 0 ... Save Pos
- ; al = 1 ... Restore Pos
- ;
- xor bx, bx
- mov es, bx
- cmp al, 1
- jb toSavePos
- je toRestorePos
- ret
- toSavePos: xor ah, ah
- call GetPos
- mov TmpPos, dx
- ret
- toRestorePos: and byte ptr es:[449h], 7fh
- mov bh, CurPage
- mov cx, 0e0fh
- call SetCursorType
- mov dx, TmpPos
- call SetCursorPos
- ret
- TreatPos endp
- ; -------------------------------
- VerifyConvert proc near
- ;
- ; OUT: CF = 0 ... Ok
- ; CF = 1 ... Not
- ;
- test IntrBusy, I10Busy
- jnz VerifyConvNot
- ; cmp DrawingCursor, 1
- ; je VerifyConvNot
- cmp DispMode, 3
- jne VerifyConvNot
- clc
- ret
- ;
- VerifyConvNot: stc
- ret
- VerifyConvert endp
- ; -------------------------------
- VModeToCmode proc near
- ;
- ; IN: bh = 0 ... to CE
- ; bh = 1 ... to CC
- ;
- call VerifyConvert
- jnc VMtoCmodeCont0
- ret
- VMtoCmodeCont0: cmp bh, CurTextMode
- jne VMtoCmodeCont1
- ret
- VMtoCmodeCont1: mov CurTextMode, bh
- mov al, 0
- call TreatPos
- cmp MyMode, 1
- je VMtoCmodeSkip
- call SaveTextScr
- VMtoCmodeSkip: mov ax, 83h
- int 10h
- mov al, 1
- call TreatPos
- ret
- VModeToCmode endp
- ; -------------------------------
- VModeToEmode proc near
- call VerifyConvert
- jnc toEmodeCont0
- ret
- toEmodeCont0: cmp CurTextMode, 2
- jne toEmodeCont1
- ret
- toEmodeCont1: mov CurTextMode, 2
- mov al, 0
- call TreatPos
- mov ax, 03h
- call SetDispMode
- mov ax, 1003h
- mov bl, 0
- pushf
- call dword ptr OldInt10
- call WriteTextScr
- mov al, 1
- call TreatPos
- mov dx, TmpPos
- mov ah, 02h
- mov bh, 0
- pushf
- call dword ptr OldInt10
- and IntrBusy, NOT I10Busy
- ret
- VModeToEmode endp
- ; -------------------------------
- ConvertVMode proc near
- cmp CurTextMode, 1
- ja ConvToCEmode
- je ConvToEmode
- mov bh, 1
- call VModeToCmode
- ret
- ConvToEmode: call VModeToEmode
- ret
- ConvToCEmode: mov bh, 0
- call VModeToCmode
- ret
- ConvertVMode endp
- ; -------------------------------
- CGACursorEmu proc near
- xor ax, ax
- mov es, ax
- mov al, es:[487h]
- and al, 1
- or al, al
- jz EmuCont0
- ret
- EmuCont0: mov cx, es:[460h]
- mov al, cl
- sub al, ch
- cmp cl, 07h
- ja EmuSkipAddEnd
- shl cl, 1
- inc cl
- EmuSkipAddEnd: cmp cl, nHigh
- jb EmuSkipAdapt
- mov cl, nHigh
- dec cl
- EmuSkipAdapt: cmp ch, 3
- ja EmuAdaptCh
- shl ch, 1
- ret
- EmuAdaptCh: mov ch, cl
- sub ch, al
- ret
- CGACursorEmu endp
- ; -------------------------------
- SetCursorType proc near
- ;
- ; Set Cursor Type: Int10h -- ah = 1
- ; (Text Mode Only)
- ; IN: ch = cursor start line
- ; cl = cursor end line
- ;
- push cx
- call HideCursor
- pop cx
- mov ah, 1
- pushf
- call dword ptr OldInt10
- call CGACursorEmu
- mov es:[460h], cx
- mov word ptr CursorEnd, cx
- call DrawCursor
- ret
- SetCursorType endp
- ; -------------------------------
- VerifyPage proc near
- ;
- ; IN: bh = Text Page ( ah != 0 )
- ; es = 0
- ; OUT: bh = CurPage ( ah = 0 )
- ; bh = Sele Page ( ah != 0 )
- ;
- cmp bh, CurPage
- jne VeriPageCont
- ret
- VeriPageCont: or ah, ah
- jz toCurPage
- and bh, 7
- cmp bh, TextPageMax
- jae toCurPage
- cmp TextMode, 1
- jne toCurPage
- ret
- toCurPage: mov bh, CurPage
- ret
- VerifyPage endp
- ; -------------------------------
- SetCursorPos proc near
- ;
- ; Set Cursor Position: Int10h -- ah = 2
- ; IN: bh = Page (Text Mode Only)
- ; dx = Pos
- ;
- push bx
- xor cx, cx
- mov es, cx
- call VerifyPage
- cmp dl, XMax
- jae SetPosRetn
- cmp dh, YLimit
- jb SetPosSkip
- mov dh, YLimit
- dec dh
- SetPosSkip: mov bl, bh
- xor bh, bh
- shl bl, 1
- and bl, 0fh
- mov es:[bx+450h], dx
- SetPosRetn: pop bx
- ret
- SetCursorPos endp
- ; -------------------------------
- GetPos proc near
- ;
- ; IN: bh = Page ( ah != 0)
- ; ( ah = 0, bh -> CurPage )
- ; OUT: dx = Pos
- ; es = 0
- ; bh = Text Page
- ;
- xor dx, dx
- mov es, dx
- call VerifyPage
- push bx
- mov bl, bh
- xor bh, bh
- shl bx, 1
- and bx, 000fh
- mov dx, es:[bx+450h]
- pop bx
- ret
- GetPos endp
- ; -------------------------------
- GetCursor proc near
- ;
- ; Get Current Cursor Pos & Type: Int10h -- ah = 3
- ; IN : bh = Page (Text Mode Only)
- ; OUT: dx = Cursor Pos
- ; cx = Cursor Type
- ;
- call GetPos
- cmp dh, YMax
- jbe GetCursorRet0
- mov dh, YMax
- GetCursorRet0: mov cx, es:[460h]
- mov [bp+10], dx
- mov [bp+12], cx
- ret
- GetCursor endp
- ; -------------------------------
- SelectPage proc near
- ;
- ; Select Active Page for Text Mode: ah = 05h
- ; IN: al = Page
- ;
- push ax
- call SetVGAStartAddr
- call MakeAuthorStrx
- pop ax
- mov bh, al
- call VerifyPage
- mov al, bh
- cmp al, CurPage
- jne SelePageCont
- ret
- SelePageCont: cli
- push ax
- mov bx, TextVRamSEG
- and bx, 0b800h
- add bh, al
- mov TextVRamSEG, bx
- call SaveTextScr
- call DrawScrBuf
- pop bx
- xor ax, ax
- mov es, ax
- mov bh, ah
- mov es:[462h], bl
- mov CurPage, bl
- mov al, bl
- mov cl, 4
- shl al, cl
- mov es:[44fh], al
- shl bx, 1
- and bx, 000fh
- sti
- ret
- SelectPage endp
- ; -------------------------------
- ScrollUpDn proc near
- ;
- ; Scroll Up/Down Screen: ah = 6/7
- ; IN: al = scroll line number (0 for all screen)
- ; bh = attr for fill blank lines
- ; ch = top
- ; cl = left
- ; dh = bottom
- ; dl = right
- ;
- push bp
- mov bp, sp
- sub sp, 10
- push si
- push di
- cmp ch, dh
- jbe ScrollCont0
- cmp cl, dl
- jbe ScrollCont0
- jmp ScrollRetn
- ;
- ScrollCont0: cmp dh, YMax
- jbe ScrollCont1
- mov dh, YMax
- ScrollCont1: cmp dl, XMax
- jb ScrollCont2
- mov dl, ChNumX
- ScrollCont2: mov bl, dh
- sub bl, ch
- inc bl
- cmp bl, al
- jae ScrollCont3
- jmp ScrollRetn
- ;
- ScrollCont3: call NoCursor
- cmp bl, al
- je ScrollClear0
- or al, al
- jz ScrollClear0
- mov [bp-9], ah
- mov [bp-1], al
- mov [bp-2], bh
- sub bl, al
- mov [bp-8], bl
- mov [bp-3], ch
- mov [bp-4], cl
- mov [bp-5], dh
- mov [bp-6], dl
- mov bl, dl
- sub bl, cl
- inc bl
- mov [bp-7], bl
- jmp ScrollLines
- ;
- ScrollClear0: xor al, al
- cmp cx, 0
- jne ClearLines
- mov al, dl
- inc al
- cmp al, XMax
- jne ClearLines
- cmp dh, YMax
- jne ClearLines
- call Clear
- jmp AreaCleared
- ClearLines: mov al, dh
- sub al, ch
- inc al
- call ClearArea
- AreaCleared: jmp ScrollRetn
- ;
- nToScroll db 32 dup(0)
- ;
- ScrollLines: push ds
- push ds
- pop es
- cmp ah, 7
- je SetDownPara
- mov dl, cl
- mov dh, ch
- add dh, al
- call CalcBufOfs
- push bx
- lea si, ScrBuf
- mov di, si
- shl bx, 1
- add si, bx
- mov dh, ch
- call CalcBufOfs
- push bx
- shl bx, 1
- add di, bx
- xor dh, dh
- mov dl, XMax
- jmp ParaSetted
- ;
- SetDownPara: mov dl, cl
- mov ch, dh
- sub dh, al
- call CalcBufOfs
- push bx
- lea si, ScrBuf
- mov di, si
- shl bx, 1
- add si, bx
- mov dh, ch
- call CalcBufOfs
- push bx
- shl bx, 1
- add di, bx
- xor dh, dh
- mov dl, XMax
- neg dx
- ParaSetted: push dx
- shl dx, 1
- xor ch, ch
- mov cl, [bp-8] ; high
- mov ah, cl
- mov cl, [bp-7] ; width
- cld
- MvScrBufLoop0: push di
- push si
- push cx
- xor bh, bh
- mov bl, [bp-8] ; high
- sub bl, ah
- mov byte ptr cs:nToScroll[bx], 0
- push ax
- MvScrBufLoop1: lodsw
- cmp ax, es:[di]
- jne StoreIt
- cmp al, ' '
- jne StoreIt
- add di, +2
- jmp SkipStore
- ;
- StoreIt: stosw
- mov al, [bp-7] ; width
- sub al, cl
- inc al
- mov byte ptr cs:nToScroll[bx], al
- SkipStore: loop MvScrBufLoop1
- pop ax
- pop cx
- pop si
- pop di
- add si, dx
- add di, dx
- dec ah
- jnz MvScrBufLoop0
- ;
- pop dx
- lea di, ScrType
- mov si, di
- pop ax
- add di, ax
- pop cx
- add si, cx
- push cx
- push ax
- push dx
- push bp
- xor ch, ch
- mov cl, [bp-7] ; width
- mov bx, cx
- mov cl, [bp-8] ; high
- mov bp, cx
- mov ax, si
- MvScrTypeLoop: push di
- mov si, ax
- mov cx, bx
- cld
- rep movsb
- pop di
- add ax, dx
- add di, dx
- dec bp
- jne MvScrTypeLoop
- pop bp
- pop dx
- pop di
- pop si
- push dx
- cmp TextMode, 1
- jne ScrollScreen
- push es
- push ds
- push bp
- shl dx, 1
- shl si, 1
- shl di, 1
- xor ch, ch
- mov cl, [bp-7] ; width
- mov bx, cx
- mov cl, [bp-8] ; high
- mov bp, cx
- mov ax, TextVRamSEG
- mov ds, ax
- mov es, ax
- mov ax, si
- MvTextLoop: push di
- mov si, ax
- mov cx, bx
- cld
- rep movsw
- pop di
- add ax, dx
- add di, dx
- dec bp
- jne MvTextLoop
- pop bp
- pop ds
- pop es
- ;
- ScrollScreen: mov bl, [bp-1] ; lines
- mov bh, [bp-2] ; attr
- mov dl, [bp-4] ; left
- mov dh, [bp-3] ; top
- cmp byte ptr [bp-9], 06h
- je ScrollSkip0
- mov dh, [bp-5] ; bottom
- inc dh
- ScrollSkip0: call CalcVRamAddr
- xor bh, bh
- mov bl, [bp-1] ; lines
- shl bx, 1
- mov ax, VRamAddr[bx]
- xor bh, bh
- mov bl, XMax
- cmp byte ptr [bp-9], 06h
- je ScrollSkip1
- sub di, bx
- neg ax
- ScrollSkip1: mov si, di
- add si, ax
- mov dx, GCindex
- mov ax, 0105h
- out dx, ax
- mov dx, bx
- pop dx
- push bp
- xor bh, bh
- mov bl, [bp-8] ; high
- mov bp, bx
- xor bx, bx
- mov al, nHigh
- mov ah, al
- push es
- pop ds
- ScrollVLoop0: push bx
- mov al, ah
- xor ch, ch
- mov cl, cs:nToScroll[bx]
- mov bx, cx
- ScrollVLoop1: push di
- push si
- mov cx, bx
- cld
- rep movsb
- pop si
- pop di
- add si, dx
- add di, dx
- dec al
- jne ScrollVLoop1
- pop bx
- inc bx
- dec bp
- jne ScrollVLoop0
- mov dx, GCindex
- mov ax, 0005h
- out dx, ax
- pop bp
- pop ds
- cmp byte ptr [bp-9], 6
- jne SetDnClearPara
- mov al, [bp-5]
- sub al, [bp-1]
- inc al
- mov [bp-8],al
- jmp ScrollClear
- SetDnClearPara: mov al, [bp-3]
- mov [bp-8], al
- ScrollClear: mov ch, [bp-8]
- mov cl, [bp-4]
- mov dl, [bp-6]
- mov al, [bp-1]
- mov bh, [bp-2]
- call ClearArea
- ScrollRetn: pop di
- pop si
- mov sp, bp
- pop bp
- ret
- ScrollUpDn endp
- ; -------------------------------
- GetVideo proc near
- ;
- ; IN: dx = Pos
- ; OUT: al = char
- ; ah = attr
- ;
- push bx
- call CalcBufOfs
- shl bx, 1
- cmp TextMode, 1
- jne GetVideoScrBuf
- ;
- mov ax, TextVRamSEG
- mov es, ax
- mov ax, es:[bx]
- pop bx
- ret
- ;
- GetVideoScrBuf: mov ax, ScrBuf[bx]
- pop bx
- ret
- GetVideo endp
- ; -------------------------------
- GetCurVideo proc near
- xor ah, ah
- call GetPos
- call GetVideo
- ret
- GetCurVideo endp
- ; -------------------------------
- ReadVideo proc near
- ;
- ; Read char & attr of CurPos: ah = 08h
- ; IN: bh = page
- ; OUT: al = char
- ; ah = attr
- ;
- push bx
- call GetPos
- call CalcBufOfs
- shl bx, 1
- pop dx
- cmp TextMode, 1
- jne GetFromScrBuf
- mov ax, TextVRamSEG
- and ax, 0b800h
- or ah, dh
- mov es, ax
- mov ax, es:[bx]
- jmp TransferIt
- ;
- GetFromScrBuf: mov ax, ScrBuf[bx]
- cmp FullPmtLine, 1
- je TransferIt
- xor ah, ah
- TransferIt: mov [bp+16], ax
- ret
- ReadVideo endp
- ; -------------------------------
- PutOne proc near
- mov BiosWait, 0
- call GetPos
- cmp bh, CurPage
- jne OneCont0
- mov cl, bl
- call CalcBufOfs
- mov si, bx
- mov bl, cl
- ;
- PutChTo: cmp ah, 09h
- je OneSkipGetAttr
- cmp TextMode, 1
- je OneGetFromVRam
- shl si, 1
- mov bl, byte ptr ScrBuf[si+1]
- shr si, 1
- jmp OneSkipGetAttr
- ;
- OneGetFromVRam: mov cx, TextVRamSEG
- mov es, cx
- shl si, 1
- mov bl, es:[si+1]
- shr si, 1
- OneSkipGetAttr: call PutChar
- ret
- ;
- OneCont0: mov cx, TextVRamSEG
- and cx, 0b800h
- add ch, bh
- mov es, cx
- mov cx, bx
- call CalcBufOfs
- mov si, bx
- mov bx, cx
- shl si, 1
- cmp ah, 09h
- jne OnePutB
- mov ah, bl
- mov es:[si], ax
- ret
- OnePutB: mov es:[si], al
- ret
- PutOne endp
- ; -------------------------------
- PutStr proc near
- ;
- ; Write char & attr at CurPos: ah = 09h
- ; Overwrite char at CurPos: ah = 0Ah
- ; IN: al = char
- ; bh = page
- ; bl = attr (ah = 09h)
- ; cx = write times
- ;
- cmp cx, 1
- ja PutStrCont0
- jb PutStrQuit
- call PutOne
- PutStrQuit: ret
- ;
- PutStrCont0: mov BiosWait, 0
- call GetPos
- push bx
- call CalcBufOfs
- mov si, bx
- shl si, 1
- pop bx
- cmp bh, CurPage
- jne PutPagex
- ;
- PutCurLoop: push si
- push dx
- push cx
- push bx
- push ax
- PutCurToScr: cmp ah, 09h
- je PutCurSkip0
- mov bl, byte ptr ScrBuf[si+1]
- PutCurSkip0: shr si, 1
- call PutChar
- PutCurCont1: pop ax
- pop bx
- pop cx
- pop dx
- pop si
- add si, +2
- inc dl
- cmp dl, XMax
- jne PutCurSkip1
- xor dl, dl
- inc dh
- cmp dh, YLimit
- jne PutCurSkip1
- dec dh
- PutCurSkip1: loop PutCurLoop
- ret
- ;
- PutPagex: mov dx, TextVRamSEG
- and dx, 0b800h
- add dh, bh
- mov es, dx
- ;
- PutStrLoop: cmp ah, 09h
- je StrPutW
- mov es:[si], al
- jmp PutStrCont1
- ;
- StrPutW: mov ah, bl
- mov es:[si], ax
- ;
- PutStrCont1: add si, +2
- cmp si, CharNumMax
- jb PutStrSkip1
- dec si
- dec si
- PutStrSkip1: loop PutStrLoop
- ret
- PutStr endp
- ; -------------------------------
- VeriPoint proc near
- ;
- ; IN: cx = x
- ; dx = y
- ;
- cmp cx, XbMax
- jae BadPoint
- PutSkipRePx: cmp DispMode, 6
- ja toVeriGrpPy
- cmp dx, 450
- jae BadPoint
- PointOk: clc
- ret
- ;
- toVeriGrpPy: cmp dx, YbMax
- jb PointOk
- BadPoint: stc
- ret
- VeriPoint endp
- ; -------------------------------
- PutPixel proc near
- ;
- ; IN: ah = 0ch
- ; al = color ( b7=1 -> XOR)
- ; cx = x
- ; dx = y
- ;
- call VeriPoint
- jc PutPixelQuit
- push word ptr DrawColor
- mov bl, al
- and bl, 0fh
- mov DrawColor, bl
- mov bh, COPY
- test al, 80h
- jz SkipSetXOR
- mov bh, opXOR
- SkipSetXOR: mov DrawType, bh
- mov ax, dx
- call CalcVRamOfs
- mov ah, 80h
- or cl, cl
- jz PntSkipShr
- shr ah, cl
- PntSkipShr: cli
- mov dx, GCindex
- mov al, 08h
- out dx, ax
- call inSetRegisters
- mov al, 0ffh
- mov ah, es:[di]
- stosb
- call inReRegisters
- sti
- pop word ptr DrawColor
- PutPixelQuit: ret
- PutPixel endp
- ; -------------------------------
- ReadPixel proc near
- ;
- ; IN: ah = 0dh
- ; cx = x
- ; dx = y
- ; OUT: al = color
- ;
- call VeriPoint
- jc RdPixelQuit
- mov ax, dx
- call CalcVRamOfs
- mov bh, 80h
- or cl, cl
- jz RdPixelSkip
- shr bh, cl
- RdPixelSkip: cli
- mov dx, GCindex
- mov al, 04h
- out dx, al
- inc dx
- xor bl, bl
- mov cx, 4
- RdPixelLoop: shl bl, 1
- mov al, cl
- dec al
- out dx, al
- mov ah, es:[di]
- and ah, bh
- jz RdPixelZero
- or bl, 1
- RdPixelZero: loop RdPixelLoop
- sti
- mov [bp+16], bl
- RdPixelQuit: ret
- ReadPixel endp
- ; -------------------------------
- ;TmpX db ?
- ;TmpY db ?
- ;TmpAttr db ?
- ; -------------------------------
- MyScrollUp proc near
- push bx
- push dx
- call GetVideo
- mov bh, ah
- xor cx, cx
- mov dh, YMax
- mov dl, ChNumX
- mov ax, 0601h
- call ScrollUpDn
- pop dx
- pop bx
- ret
- ;
- comment @
- cmp inScroll, 0
- je MyScrollCont0
- ret
- ;
- MyScrollCont0: mov inScroll, 1
- mov dh, YWrt
- xor dl, dl
- call GetVideo
- mov bh, ah
- mov TmpAttr, bh
- xor cx, cx
- mov dh, YMax
- mov dl, ChNumX
- ;
- mov al, YWrt
- sub al, dh ; scrollLines = YWrt-YMax;
- mov YWrt, dh ; YWrt = YMax
- push ax
- ;
- mov ah, 06h
- call ScrollUpDn
- ;
- mov bx, CharNumMax
- shl bx, 1
- pop ax
- mov si, bx
- mov dh, YMax
- sub dh, al ; dh = YMax-ScrollLines+1
- inc dh
- xor dl, dl ; dx = (0, YMax-ScrollLines+1)
- mov CursorEnable, 0
- call CalcBufOfs
- jmp skipy
- ;
- dloop: push dx
- push bx
- push si
- mov ax, word ptr ScrBuf[si]
- mov word ptr ScrBuf[si], 0720h ; clear
- mov si, bx
- mov bl, ah
- call PutChar
- pop si
- pop bx
- pop dx
- inc bx
- add si, +2
- inc dl ; x ++;
- cmp dl, XMax
- jne skipy ; if (x == XMax) {
- mov dl, 0 ; x = 0; y ++; }
- inc dh
- skipy: cmp dh, YMax
- jb dloop
- cmp dl, XWrt
- jb dloop
- xor ah, ah
- mov inScroll, ah
- mov XWrt, ah
- call SetCursorPos
- mov CursorEnable, 1
- ret
- @
- MyScrollUp endp
- ; -------------------------------
- TtyChar proc near
- ;
- ; Write Char, then Move Cursor Right: ah = 0Eh
- ; IN: al = char
- ;
- mov bh, CurPage
- call GetPos
- cmp al, ' '
- jae TtyToPut
- cmp al, 7
- jne TtyCont0
- ;
- ; mov cx, 0384h
- ; mov bx, 8
- mov cx, 0166h
- mov bx, 2
- call inBeep
- ret
- ;
- TtyCont0: cmp al, 8
- jne TtyCont1
- cmp dl, 0
- jne TtyBackSp
- ret
- TtyBackSp: dec dl
- call SetCursorPos
- ; mov al, 20h
- ; call PutOne
- ret
- ;
- TtyCont1: cmp al, 0ah
- jne TtyCont2
- inc dh
- jmp TtyRet0
- ;
- TtyCont2: cmp al, 0dh
- jne TtyToPut
- xor dl, dl
- jmp TtyRet0
- ;
- TtyToPut: push dx
- mov cl, bl
- call CalcBufOfs
- mov si, bx
- shl bx, 1
- cmp ah, 09h
- je TtySkipAttr
- cmp TextMode, 1
- je TtyGetFromVRam
- mov cl, byte ptr ScrBuf[bx+1]
- jmp TtySkipAttr
- ;
- TtyGetFromVRam: mov cx, TextVRamSEG
- mov es, cx
- mov cl, es:[bx+1]
- TtySkipAttr: mov bl, cl
- call PutChar
- pop dx
- inc dl
- mov BiosWait, 0
- ;
- TtyRet0: cmp dl, XMax
- jb TtyContw
- xor dl, dl
- inc dh
- comment @
- TtyCont3: cmp dh, YWrt
- jb TtyContw
- je TtyConty
- mov YWrt, dh
- mov XWrt, 0
- TtyConty: cmp dl, XWrt
- jbe TtyContw
- mov XWrt, dl
- @
- TtyContw: cmp dh, YLimit
- jb TtyCont4
- dec dh
- call MyScrollUp
- TtyCont4: xor ah, ah
- call SetCursorPos
- TtyCont5: ret
- TtyChar endp
- ; -------------------------------
- GetDispMode proc near
- ;
- ; Get Display Mode: ah = 0Fh
- ; OUT: ah = XMax
- ; al = DispMode
- ; bh = CurPage
- ;
- xor ax, ax
- mov es, ax
- mov al, es:[449h]
- mov ah, XMax
- mov bh, es:[462h]
- mov [bp+15], bh
- mov [bp+16], ax
- ret
- GetDispMode endp
- ; -------------------------------
- EGAVGAFontOpr proc near
- ;
- ; ah = 11h: EGA/VGA Font Operation
- ;
- mov FontOprMark, 0
- cmp al, 10h
- jb FontOprSkip0
- mov FontOprMark, 10h
- FontOprSkip0: and al, 0fh
- cmp al, 4
- ja FontOprQuit
- xor ah, ah
- shl ax, 1
- mov si, ax
- jmp word ptr cs:FontFunc[si]
- ;
- FontOprQuit: jmp FontOprRet0
- ;
- FontFunc label word
- dw offset FontFunc0
- dw offset FontFunc1
- dw offset FontFunc2
- dw offset FontFunc3
- dw offset FontFunc4
- ;
- FontFunc0: jmp FontOprRet0
- ;
- FontFunc1: or bl, bl
- jnz FFuncQuit
- mov ax, word ptr F8x14
- mov dx, word ptr F8x14+2
- mov word ptr FPntr, ax
- mov word ptr FPntr+2, dx
- mov cHigh, 14
- FFuncQuit: jmp FontOprRet0
- ;
- FontFunc2: or bl, bl
- jnz FFuncQuit
- cmp FontOprMark, 10h
- je toAsciiText
- mov ax, word ptr F8x8
- mov dx, word ptr F8x8+2
- mov word ptr FPntr, ax
- mov word ptr FPntr+2, dx
- mov cHigh, 8
- jmp FontOprRet0
- ;
- toAsciiText: push bx
- and IntrBusy, NOT I10Busy
- call VModeToEmode
- pop bx
- mov ax, 1112h
- pushf
- call dword ptr OldInt10
- mov in43Lines, 1
- jmp FontOprRet0
- ;
- FontFunc3: jmp FontOprRet0
- ;
- comment @
- mov bh, bl
- mov dl, bl
- and dl, 3
- mov FSetA, dl
- shr bl, 1
- shr bl, 1
- and bl, 3
- mov FSetB, bl
- mov dx, 3c4h
- mov al, 3
- mov ah, bh
- out dx, ax
- jmp FontOprRet0
- @
- ;
- FontFunc4: or bl, bl
- jnz FontOprRet0
- mov ax, word ptr F8x16
- mov dx, word ptr F8x16+2
- mov word ptr FPntr, ax
- mov word ptr FPntr+2, dx
- mov cHigh, 16
- jmp FontOprRet0
- ;
- FontOprRet0: ret
- EGAVGAFontOpr endp
- ; -------------------------------
- TextStr proc near
- ;
- ; Put Text String: ah = 13h
- ; IN: cx = string length
- ; dx = start Pos
- ; es:di (es:bp) = Addr of string
- ; al = 0 ... bl = attr of string, keep cursor.
- ; al = 1 ... bl = attr of string, move cursor.
- ; al = 2 ... attr in string, keep cursor.
- ; al = 3 ... attr in string, move cursor.
- ;
- mov ah, bl
- push es
- push cx
- push ax
- cmp dl, XMax
- jb TextStrSkip0
- mov dl, ChNumX
- TextStrSkip0: cmp dh, YMax
- jbe TextStrSkip1
- mov dh, YMax
- TextStrSkip1: pop ax
- push ax
- push dx
- test al, 01h
- jne TextStrSkip2
- call GetPos
- TextStrSkip2: mov SavePos, dx
- mov inTextStr, 1
- pop dx
- mov bh, CurPage
- call SetCursorPos
- pop ax
- pop cx
- pop es
- or cx, cx
- jz TextStrEnd
- ;
- TextStrLoop: push es
- push di
- push cx
- push bx
- push ax
- cmp al, 02h
- mov al, es:[di]
- jb TextStrSkip3
- mov ah, es:[di+1]
- TextStrSkip3: mov bl, ah
- mov ah, 09h
- call TtyChar
- pop ax
- pop bx
- pop cx
- pop di
- pop es
- inc di
- cmp al, 02h
- jb TextStrSkip4
- inc di
- TextStrSkip4: loop TextStrLoop
- ;
- TextStrEnd: mov inTextStr, 0
- and al, 01h
- jnz TextStrSkip5
- mov dx, SavePos
- call SetCursorPos
- TextStrSkip5: ret
- TextStr endp
- ; -------------------------------
- PromptOpr proc near
- ;
- ; Prompt Line Operation: ah = 14h / 20h
- ; IN: al = 0, (10: ah=20h): Clear Prompt Line
- ; al = 1, (11: ah=20h):
- ; al = 2, (12: ah=20h): Move Pmt Pos:
- ; dl = x
- ; al = 3, (13: ah=20h): Prompt Char:
- ; dl = char
- ; al = 80h : Get PmtLine Status
- ; al = bAttr
- ; bh = kAttr
- ; bl = sAttr
- ; ch = nAttr
- ; cl = eAttr
- ; bl = attr ( ah = 14h or ah = 20h,al=10-13h )
- ; dl = x or char
- ;
- cmp al, 80h
- je PmtOprAttrs
- cmp MyMode, 1
- je PmtOprCont0
- ret
- ;
- PmtOprAttrs: mov al, bAttr
- mov bh, kAttr
- mov bl, sAttr
- mov ch, nAttr
- mov cl, eAttr
- xor ah, ah
- mov [bp+16], ax
- mov [bp+14], bx
- mov [bp+12], cx
- ret
- ;
- PmtOprCont0: mov inPmtOpr, 1
- cmp al, 4
- jae PmtOprUse20h
- cmp ah, 14h
- je PmtOprContx
- mov bl, sAttr
- and bl, 0fh
- or bl, bAttr
- jmp PmtOprContx
- ;
- PmtOprUse20h: cmp ah, 20h
- jne PmtOprQuit
- cmp al, 10h
- jb PmtOprQuit
- cmp al, 14h
- jae PmtOprQuit
- and al, 03h
- PmtOprContx: xor ah, ah
- shl ax, 1
- mov si, ax
- jmp word ptr cs:PmtFunc[si]
- ;
- PmtOprQuit: jmp PmtOprRet0
- ;
- PmtFunc label word
- dw offset PmtFunc0
- dw offset PmtFunc1
- dw offset PmtFunc2
- dw offset PmtFunc3
- ;
- PmtFunc0: mov cl, 4
- shr bl, cl
- xor ch, ch
- mov cl, XMax
- mov dl, 0
- mov dh, YMax
- cmp FullPmtLine, 1
- jne PmtOprSkip0
- inc dh
- PmtOprSkip0: call FillBG
- mov PmtXPos, 0
- mov al, bAttr
- mov cl, 4
- shr al, cl
- mov DrawColor, al
- mov dx, 455
- call HMLine
- inc dx
- call HMLine
- add dx, 19
- call HMLine
- mov PmtFirst, 0
- jmp PmtOprRet0
- ;
- PmtFunc1: cmp cx, 1
- je PmtFunc3
- mov al, dl
- mov dl, PmtXPos
- mov dh, YMax
- cmp FullPmtLine, 1
- jne PmtOprSkip1
- inc dh
- PmtOprSkip1: mov ah, bl
- PmtOprLoop1: cmp dl, XMax
- jae PmtOpr1End
- push ax
- push cx
- push dx
- mov bl, ah
- call inDrawC
- pop dx
- pop cx
- pop ax
- inc dl
- loop PmtOprLoop1
- PmtOpr1End: cmp dl, XMax
- jb PmtOpr1Skip1
- xor dl, dl
- PmtOpr1Skip1: mov PmtXPos, dl
- jmp PmtOprRet0
- ;
- PmtFunc2: cmp dl, XMax
- jb PmtOprCont1
- jmp PmtOprRet0
- PmtOprCont1: mov PmtXPos, dl
- PmtToRet0: jmp PmtOprRet0
- ;
- PmtFunc3: mov bh, dl
- mov dl, PmtXPos
- cmp dl, XMax
- jae PmtToRet0
- mov dh, YMax
- cmp FullPmtLine, 1
- jne PmtOprSkip2
- inc dh
- PmtOprSkip2: cmp bh, 0a1h
- jb PmtOprToC
- cmp PmtFirst, 0
- je PmtOprSaveCC1
- dec dl
- cmp dl, PmtFirstX
- jne PmtOprSaveCC1
- ;
- mov ah, PmtFirst
- mov al, bh
- call inDrawCC
- mov PmtFirst, 0
- inc PmtXPos
- jmp PmtOprRet0
- ;
- PmtOprSaveCC1: mov PmtFirst, bh
- mov dl, PmtXPos
- mov PmtFirstX, dl
- inc PmtXPos
- toPmtOprVeri: jmp PmtOprVeriX
- ;
- PmtOprToC: cmp PmtFirst, 0
- jz PmtOprPutC
- push bx
- dec dl
- mov al, PmtFirst
- ; mov bl, PmtAttr
- call inDrawC
- mov PmtFirst, 0
- pop bx
- PmtOprPutC: cmp bh, 8
- jne PmtOprDrawC
- cmp PmtXPos, 0
- ja PmtOprDecX
- jmp PmtOprRet0
- ;
- PmtOprDecX: dec PmtXPos
- dec dl
- mov al, ' '
- call inDrawC
- jmp PmtOprRet0
- ;
- PmtOprDrawC: mov al, bh
- call inDrawC
- inc PmtXPos
- PmtOprVeriX: mov al, PmtXPos
- cmp al, XMax
- jne PmtOprRet0
- mov PmtXPos, 0
- PmtOprRet0: mov inPmtOpr, 0
- ret
- PromptOpr endp
- ; -------------------------------
- NewInt1c proc far
- sti
- pushf
- call dword ptr cs:OldInt1c
- test cs:IntrBusy, I08Busy OR I1cBusy OR I09Busy OR I10Busy OR I16Busy OR KeyBusy
- jz I1cCont0
- iret
- ;
- I1cCont0: or cs:IntrBusy, I1cBusy
- and cs:IntrBusy, NOT I0cBusy
- pusha
- push es
- push ds
- mov ax, cs
- mov ds, ax
- ;
- comment @
- cmp WaitTime, 1
- jb I1cSkipScroll
- mov dh, YWrt
- cmp dh, YMax
- jbe I1cSkipScroll
- call MyScrollUp
- ;
- I1cSkipScroll:
- @
- call ScanTextScr
- ;
- cmp ticker, 18
- jne I1cRet0
- mov ax, NopTime
- cmp ax, TimeOut
- jb SkipClose
- cmp TimeOut, 0
- je SkipClose
- call CloseDisplay
- SkipClose: cmp ClockSwitch, 1
- jne I1cRet0
- cmp DisplayOpen, 1
- jne I1cRet0
- test IntrBusy, I09Busy OR I0cBusy OR I10Busy OR I16Busy OR KeyBusy
- jnz I1cRet0
- cmp TimeEnable, 1
- jne I1cRet0
- call DrawTime
- ;
- I1cRet0: and IntrBusy, NOT I1cBusy
- I1cQuit: pop ds
- pop es
- popa
- iret
- NewInt1c endp
- ; -------------------------------
- OpenDisplay proc near
- push ax
- push bx
- mov ax, 1200h
- mov bl, 36h
- pushf
- call dword ptr OldInt10
- mov DisplayOpen, 1
- mov NopTime, 0
- pop bx
- pop ax
- ret
- OpenDisplay endp
- ; -------------------------------
- CloseDisplay proc near
- cmp DisplayOpen, 1
- jne CloseCRTExit
- mov ax, 1201h
- mov bl, 36h
- pushf
- call dword ptr OldInt10
- mov DisplayOpen, 0
- CloseCRTExit: ret
- CloseDisplay endp
- ; -------------------------------
- NewInt13 proc far
- sti
- pushf
- or cs:IntrBusy, I13Busy
- call dword ptr cs:OldInt13
-
- sti
- pushf
- and cs:IntrBusy, NOT I13Busy
- popf
- retf 2
- ;
- comment @
- push ax
- push bp
- mov bp, sp
- pushf
- pop ax
- mov [bp+08h], ax
- pop bp
- pop ax
- ;
- and cs:IntrBusy, NOT I13Busy
- iret
- @
- ;
- ; STACK: [SP+00] = bp; [SP+02] = ax;
- ; [SP+04] = IP; [SP+06] = CS; [SP+08] = FLAGs;
- ;
- NewInt13 endp
- ; -------------------------------
- XorDrawCursor proc near
- ;
- ; IN: dx = Pos
- ;
- cmp FullPmtLine, 1
- jne XorDrawQuit
- cmp CursorEnable, 0
- je XorDrawQuit
- ; cmp DrawingCursor, 1
- ; je XorDrawQuit
- cmp dh, YMax
- jbe XorDrawCont0
- XorDrawQuit: ret
- ;
- XorDrawAbort: mov inCCsecond, 0
- jmp XorDrawRet0
- ;
- XorDrawCont0: push di
- mov DrawingCursor, 1
- mov inCCsecond, 0
- call CalcBufOfs
- cmp CursorActive, 1
- je XorDrawConts
- cmp isTreatCC, 1
- jne XorDrawSkip0
- cmp word ptr ScrType[bx], 0201h
- jne XorDrawSkip0
- mov isCCcursor, 1
- jmp XorDrawConts
- ;
- XorDrawSkip0: mov isCCcursor, 0
- ; cmp CurKey, 0
- ; je XorReSecond
- cmp word ptr ScrType[bx-1], 0201h
- jne XorReSecond
- mov inCCsecond, 1
- jmp XorDrawConts
- XorReSecond: ;mov inCCsecond, 0
- XorDrawConts: call CalcVRamAddr
- xor ah, ah
- mov al, XMax
- mov cx, ax
- mov bx, word ptr CursorEnd ; bh = start,bl = end
- cmp bh, bl ; start > end ?
- ja XorDrawAbort
- or bl, bl ; end == 0 ?
- jz XorDrawAbort
- or bh, bh
- jz XorDrawSkip1
- mul bh
- add di, ax
- XorDrawSkip1: cli
- mov dx, GCindex
- mov ax, 1803h
- out dx, ax
- mov dx, 3c4h
- mov ax, 0f02h
- out dx, ax
- mov dx, cx
- dec dx
- mov cl, bl
- sub cl, bh
- inc cl
- xor ch, ch
- mov al, 0ffh
- mov bx, cx
- push di
- cld
- XorDrawLoop0: mov ah, es:[di]
- stosb
- add di, dx
- loop XorDrawLoop0
- pop di
- cmp isCCcursor, 1
- jne XorDrawSkip2
- inc di
- mov cx, bx
- XorDrawLoop1: mov ah, es:[di]
- stosb
- add di, dx
- loop XorDrawLoop1
- XorDrawSkip2: mov dx, GCindex
- mov ax, 0003h
- out dx, ax
- xor CursorActive, 01h
- XorDrawRet0: sti
- mov DrawingCursor, 0
- pop di
- ret
- XorDrawCursor endp
- ; -------------------------------
- SaveCurEnv proc near
- cmp MyMode, 1
- je SCECont0
- ret
- ;
- SCECont0: push es
- push dx
- push bx
- push ax
- mov isCCleft, 0
- mov bh, CurPage
- call GetPos
- mov word ptr LastX, dx
- call CalcBufOfs
- mov ax, word ptr ScrType[bx-2]
- cmp ax, 0201h
- jne SaveCurSkip0
- mov isCCleft, 1
- SaveCurSkip0: cmp CurKey, DEL
- jne SaveCurSkip1
- mov R1, 0
- cmp word ptr ScrType[bx], 0201h
- jne SaveCurRet0
- shl bx, 1
- mov CurOfs, bx
- inc bx
- inc bx ; bx -> CurX+1
- jmp SaveCurCont1
- ;
- SaveCurSkip1: dec bx ; bx -> CurX-2
- dec bx
- shl bx, 1
- mov CurOfs, bx
- SaveCurCont1: cmp TextMode, 1
- jne SaveFromBuf
- ;
- mov ax, TextVRamSEG
- mov es, ax
- mov ax, es:[bx]
- mov R1, ax
- mov ax, es:[bx+2]
- mov R2, ax
- ; mov ax, es:[bx+4]
- ; mov R3, ax
- ; jmp SaveCurRet0
- ;
- SaveFromBuf: mov ax, ScrBuf[bx]
- mov R1, ax
- mov ax, ScrBuf[bx+2]
- mov R2, ax
- ; mov ax, ScrBuf[bx+4]
- ; mov R3, ax
- SaveCurRet0: pop ax
- pop bx
- pop dx
- pop es
- ret
- SaveCurEnv endp
- ; -------------------------------
- DrawCursor proc near
- cmp CursorActive, 0
- jne DrawCurQuit
- mov dx, word ptr CurX
- call XorDrawCursor
- call AutoCCTreat
- DrawCurQuit: ret
- DrawCursor endp
- ; -------------------------------
- HideCursor proc near
- cmp CursorActive, 0
- je HideCurQuit
- mov dx, word ptr CurX
- call XorDrawCursor
- HideCurQuit: ret
- HideCursor endp
- ; -------------------------------
- MoveCursor proc near
- xor ax, ax
- mov es, ax
- call GetPos
- cmp dx, word ptr CurX
- jne MovCurCont0
- mov al, 0
- ret
- ;
- MovCurCont0: push dx
- call HideCursor
- pop dx
- cmp CursorActive, 0
- jne MovCurRet1
- mov word ptr CurX, dx
- call DrawCursor
- call AutoCCTreat
- MovCurRet1: mov al, 1
- ret
- MoveCursor endp
- ; -------------------------------
- TestArrowKey proc near
- mov bx, CurOfs
- mov dx, word ptr LastX
- cmp dl, 2
- jbe ArrowOk
- cmp dx, word ptr CurX
- je toSamePos
- ;
- mov dx, ScrBuf[bx]
- cmp dx, R1
- jne ArrowQuit
- mov dx, ScrBuf[bx+2]
- cmp dx, R2
- jne ArrowQuit
- ;
- ArrowOk: clc
- ret
- ;
- toSamePos: mov dx, ScrBuf[bx]
- cmp dx, R1
- jne ArrowOk
- mov dx, ScrBuf[bx+2]
- cmp dx, R2
- jne ArrowOk
- ArrowQuit: stc
- ret
- TestArrowKey endp
- ; -------------------------------
- AutoCCTreat proc near
- cmp isTreatCC, 1
- jne AutoQuit
- mov ax, CurKey
- cmp ax, 0
- je AutoQuit
- xor dx, dx
- mov es, dx
- test byte ptr es:[417h], 0fh
- jz AutoCont0
- AutoQuit: ret
- ;
- AutoCont0: cmp ax, BsKey
- je toAutoBs
- cmp ax, DEL
- je toAutoDEL
- ;
- cmp inCCsecond, 1
- jne AutoQuit
- ;
- cmp ax, PGUP
- je toAutoRepeat
- cmp ax, PGDN
- je toAutoRepeat
- ;
- ; cmp WaitTime, 1
- ; jb AutoQuit
- ;
- call TestArrowKey
- jc AutoQuit
- ;
- cmp ax, UP
- je toAutoRepeat
- cmp ax, DOWN
- je toAutoRepeat
- cmp ax, LEFT
- je toAutoRepeat
- cmp ax, RIGHT
- je toRepeatIt
- ret
- ;
- toAutoBs: cmp isCCleft, 1
- jne AutoQuit
- mov dx, word ptr LastX
- cmp dh, CurY
- jne AutoQuit
- dec dl
- cmp dl, CurX
- jne AutoQuit
- jmp toRepeatIt
- ;
- toAutoDEL: cmp R1, 0
- je DELQuit
- mov bx, CurOfs
- comment @
- ; cmp TextMode, 1
- ; jne CmpFromBuf
- ;
- mov ax, TextVRamSEG
- mov es, ax
- mov dx, es:[bx]
- cmp dx, R1
- jne DELQuit
- mov dx, es:[bx+2]
- cmp dx, R2
- je toRepeatIt
- jmp DELQuit
- ; @
- CmpFromBuf: mov dx, ScrBuf[bx]
- cmp dx, R1
- jne DELQuit
- mov dx, ScrBuf[bx+2]
- cmp dx, R2
- je toRepeatIt
- DELQuit: ret
- ;
- toAutoRepeat: mov ax, LEFT
- mov CurKey, ax
- toRepeatIt: or al, al
- jnz isBsKey
- mov al, 0e0h
- mov CurKey, ax
- isBsKey: mov ax, 1
- push ax
- lea ax, CurKey
- push ax
- call PushBackKeys
- pop cx
- pop cx
- mov CurKey, 0
- ret
- AutoCCTreat endp
- ; -------------------------------
- GetTimeStr proc near
- ;
- ; OUT: si = TimeStr
- ;
- mov ah, 02h
- int 1ah
- lea si, TimeStr
- mov al, cl
- mov ah, cl
- mov cl, 4
- shr al, cl
- and ah, 0fh
- add ax, 3030h
- mov [si+3], ax
- mov al, ch
- mov ah, ch
- shr al, cl
- and ah, 0fh
- add ax, 3030h
- mov [si], ax
- mov al, dh
- mov ah, dh
- shr al, cl
- and ah, 0fh
- add ax, 3030h
- mov [si+6], ax
- ret
- GetTimeStr endp
- ; -------------------------------
- DrawTime proc near
- cmp DispMode, 3
- je DrawTimeCont0
- cmp FullPmtLine, 1
- je DrawTimeCont0
- ret
- ;
- DrawTimeCont0: test IntrBusy, I09Busy OR I10Busy OR I16Busy OR KeyBusy
- jz DrawTimeCont1
- ret
- ;
- DrawTimeCont1: dec StrType
- jnz toPutTime
- mov StrType, 6
- lea si, VerStr
- jmp toPutVer
- ;
- toPutTime: call GetTimeStr
- toPutVer: cmp MyMode, 1
- jne PutTimeStr
- mov cx, 8
- mov dh, YMax
- inc dh
- mov dl, 72
- mov inPmtOpr, 1
- DrawTimeLoop: test IntrBusy, I09Busy OR I10Busy OR I16Busy OR KeyBusy
- jnz toTimeRet0
- push cx
- push dx
- push si
- mov al, [si]
- mov bl, eAttr
- or bl, bAttr
- call inDrawC
- pop si
- pop dx
- pop cx
- inc si
- inc dl
- loop DrawTimeLoop
- toTimeRet0: mov inPmtOpr, 0
- ret
- ;
- StrType db 6
- ;
- PutTimeStr: mov ax, TextVRamSEG
- mov es, ax
- mov bx, 72 * 2
- mov ah, 4eh
- mov cx, 8
- PutTimeLoop: mov al, [si]
- mov es:[bx], ax
- inc si
- inc bx
- inc bx
- loop PutTimeLoop
- DrawTimeRet0: ret
- DrawTime endp
- ; -------------------------------
- NewInt08 proc far
- pushf
- call dword ptr cs:OldInt08
- sti
- test cs:IntrBusy, NOT I13Busy
- jz toNew08
- i08Retn: iret
- ;
- toNew08: or cs:IntrBusy, I08Busy
- pusha
- push es
- push ds
- push cs
- pop ds
- ;
- comment @
- cmp WaitTime, 1
- jb I1cSkipScroll
- mov dh, YWrt
- cmp dh, YMax
- jbe I1cSkipScroll
- call MyScrollUp
- ;
- I1cSkipScroll:
- @
- inc WaitTime
- inc BiosWait
- dec byte ptr ticker
- jnz I08Cont1
- mov byte ptr ticker, 20
- inc NopTime
- ;
- I08Cont1: ; cmp WaitTime, 1
- ; jbe I08Exit
- call MoveCursor
- or al, al
- jnz I08Exit
- test ticker, 3
- jnz I08Exit
- cmp DisplayOpen, 0
- je I08Exit
- cmp CursorActive, 0
- jne I08HideCursor
- call DrawCursor
- jmp I08Exit
- ;
- I08HideCursor: cmp inGrCursor, 0
- je I08Exit
- call HideCursor
- ;
- I08Exit: and IntrBusy, NOT I08Busy
- pop ds
- pop es
- popa
- iret
- NewInt08 endp
- ; -------------------------------
- ScanTextScr proc near
- test IntrBusy, NOT I1cBusy
- jnz ScanTextQuit
- cmp BiosWait, 1
- jb ScanTextQuit
- cmp TextMode, 1
- je ScanTextCont0
- ScanTextQuit: ret
- ;
- ScanStart dw 0
- ;
- ScanTextCont0: mov inScanText, 1
- mov al, CursorEnable
- push ax
- mov CursorEnable, 0
- mov ax, TextVRamSEG
- mov es, ax
- mov ax, ScanStart
- mov di, ax
- lea si, ScrBuf
- add si, ax
- mov cx, CharNumMax
- shr ax, 1
- sub cx, ax
- ScanTextLoop: cld
- repz cmpsw
- jz ScanTextRet0
- push cx
- push si
- push di
- push es
- sub di, 2
- mov ax, di
- shr ax, 1
- mov si, ax
- div byte ptr XMax
- xchg ah, al
- mov dx, ax
- mov ax, es:[di]
- mov bl, ah
- call PutChar
- pop es
- pop di
- pop si
- pop cx
- jcxz ScanTextRet0
- ;
- test IntrBusy, NOT I1cBusy
- jnz ScanAbort
- ;
- mov al, 00h
- out 21h, al
- in al, 21h ; ╢┴8259A IMR╓╨╢╧╞┴▒╬╝─┤µ╞≈
- mov ah, al
- ;
- mov al, 0ah
- out 20h, al
- nop
- in al, 20h ; ╢┴8259A IRR╟δ╟≤╖■╬±╝─┤µ╞≈
- and al, ah
- jz ScanTextLoop
- ScanAbort: or IntrBusy, I0cBusy
- jmp ScanTextExit
- ;
- ScanTextRet0: xor di, di
- ScanTextExit: mov ScanStart, di
- pop ax
- mov CursorEnable, al
- mov inScanText, 0
- ret
- ScanTextScr endp
- ; -------------------------------
- NewInt10 proc far
- sti
- or ah, ah
- jz toNew10
- cmp cs:MyMode, 1
- jne toOld10
- cmp ah, 30h
- jb toNew10
- ;
- toOld10: or cs:IntrBusy, I10Busy
- pushf
- call dword ptr cs:OldInt10
- I10Retn: and cs:IntrBusy, NOT I10Busy
- iret
- ;
- toGCs: cmp al, 3
- jne toOld10
- jmp I10Retn
- ;
- toFont: cmp al, 20h
- jae toOld10
- cmp cs:TextMode, 1
- je JmpNew10
- jmp I10Retn
- ;
- VideoControl: or al, al
- jnz I10Retn
- or cs:IntrBusy, I10Busy
- iret
- ;
- toNew10: cmp ah, 10h
- jb JmpNew10
- je toGCs
- cmp ah, 11h
- je toFont
- cmp ah, 2fh
- je VideoControl
- ;
- JmpNew10: or cs:IntrBusy, I10Busy
- push ax
- push bx
- push cx
- push dx
- push es
- push ds
- push si
- push di
- push bp
- mov di, bp
- mov bp, cs
- mov ds, bp
- mov bp, sp
- ;
- cmp DisplayOpen, 1
- je I10Skip0
- call OpenDisplay
- I10Skip0: push ax
- mov al, ah
- xor ah, ah
- shl ax, 1
- mov si, ax
- pop ax
- call word ptr I10Entry[si]
- ;
- I10Ret0: and IntrBusy, NOT I10Busy
- pop bp
- pop di
- pop si
- pop ds
- pop es
- pop dx
- pop cx
- pop bx
- pop ax
- iret
- ;
- VGAConfig: call SetVGAStartAddr
- jmp toOldInt10
- ;
- VGAStatus: call SetVGAStartAddr
- ;
- toOldInt10: pop cx
- pop bp
- pop di
- pop si
- pop ds
- pop es
- pop dx
- pop cx
- pop bx
- pop ax
- jmp toOld10
- ;
- I10Entry label word
- dw offset SetDispMode ; 00
- dw offset SetCursorType ; 01
- dw offset SetCursorPos ; 02
- dw offset GetCursor ; 03
- dw offset toOldInt10 ; 04
- dw offset SelectPage ; 05
- dw offset ScrollUpDn ; 06
- dw offset ScrollUpDn ; 07
- dw offset ReadVideo ; 08
- dw offset PutStr ; 09
- dw offset PutStr ; 0A
- dw offset toOldInt10 ; 0B
- dw offset PutPixel ; 0C
- dw offset ReadPixel ; 0D
- dw offset TtyChar ; 0E
- dw offset GetDispMode ; 0F
- dw offset toOldInt10 ; 10
- dw offset EGAVGAFontOpr ; 11
- dw offset toOldInt10 ; 12
- dw offset TextStr ; 13
- dw offset PromptOpr ; 14
- dw 5 dup(offset toOldInt10)
- dw offset VGAConfig ; 1A
- dw offset VGAStatus ; 1B
- dw 4 dup(offset toOldInt10)
- dw offset PromptOpr ; 20
- dw 15 dup(offset toOldInt10)
- ;
- NewInt10 endp
- ;
- public NewInt08
- public NewInt10
- public NewInt13
- public NewInt1c
- public inBeep
- public MakeButton
- public MakeBottomBar
- public VModeToCmode
- public VModeToEmode
- public ConvertVMode
- public PromptOpr
- public DrawScrBuf
- public SaveCurEnv
- public OpenDisplay
- public CloseDisplay
- public VRamSEG
- public NopTime
- public TextVRamSEG
- public ScrBuf
- public AuthorStr
- public AuthorName
- public TradeButton
- public Vi600x16
- public CharTable
- public isTreatTab
- ;
- code ends
- end
-