2025-04-27 07:49:33 -04:00

1193 lines
31 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;========================================================================
;
; Hot Key Service Function
;
;========================================================================
ASSUME CS:CODE, DS:CODE, ES:CODE
MainPos = 0
Sub1Pos = 112h
Sub2Pos = 133h
MsgLength = 16
eom = '$'
DataStr STRUC
mCurValue db ?
mMaxValue db ?
mCurPos dw ?
mDataAddr dw ?
mMsgs dw ?
DataStr ENDS
CurMenu dw 0 ; current main menu
tCodeStat db 0
tPrinter db 0
NorAttr db 70h
SelAttr db 7
BakAttr db 70h
OldCodeStat db 0
BilingCall db 0 ; [CHM001]
MainTbl label word
dw offset Menu1
dw offset Menu2
MainTblLng = ($-MainTbl)/2
Menu1 label word
Menu1Cur db 0
Menu1Max db Sub1DataLng-1
dw Sub1Pos
dw offset Sub1Data
dw offset Menu1Msg1
dw offset Menu1Msg2
dw offset Menu1Msg3
; dw offset Menu1Msg4
Sub1Data label byte
db 0
db HangeulMode or WSung
db HangeulMode or Chab
; db HangeulMode or WSung7
Sub1DataLng = $-Sub1Data
Menu1Msg1 db 'English',eom
Menu1Msg2 db 'KS C 5842 - 1991',eom
Menu1Msg3 db 'Chohab',eom
;Menu1Msg4 db 'Wansung 7 bit',eom
Menu2 label word
Menu2Cur db 0
Menu2Max db Sub2DataLng-1
dw Sub2Pos
dw offset Sub2Data
dw offset Menu2Msg1
dw offset Menu2Msg2
; dw offset Menu2Msg3
dw offset Menu2Msg4
dw offset Menu2Msg5
dw offset Menu2Msg6
Sub2Data label byte
db NoPrt
db KsPrt
; db wLbp
db wKmPrt
db cKmPrt
db TgPrt
Sub2DataLng = $-Sub2Data
Menu2Msg1 db 'None selected',eom
Menu2Msg2 db 'KS',eom
;Menu2Msg3 db 'QLBP',eom
Menu2Msg4 db 'KSSM',eom
Menu2Msg5 db 'KSSM(Chohab)',eom
Menu2Msg6 db 'TG(Chohab)',eom
MainMenu label byte
dw 0fh
db 'Hangeul BIOS environment changing program',0
dw 10bh
db 'CODE :',0
dw 129h
db 'PRINTER :',0
dw 215h
db 'USAGE : Enter, Esc, Arrows',eom
;========================================================================
; << EnvrChange >>
; FUNCTION = Hot_ key function ó<EFBFBD><EFBFBD>
; INPUT : none
; OUTPUT : none
; PROTECT : all
EXTRN PushKeyBuf:near
PUBLIC EnvrChange
public EscCode2Tbl, EscCode3Tbl, EscCodeNTbl, EscCode4Tbl
public EscCode2Addr, EscCode3Addr, EscCodeNAddr, EscCode4Addr
dSaveCurrPage db 0
dSaveCurPos dw 0
dSaveCurType dw 0
INCLUDE debug.inc
EnvrChange:
ASSUME DS:DATA, ES:CODE
@push ax,bx,cx,dx,si,di,es,ds
xor bx,bx
mov ds,bx
mov bx,cs
cmp bx,word ptr [rKbioInt+2]
jnz EnvrChgRet
mov bx,cs
mov es,bx
mov ds,bx
ASSUME DS:CODE
mov al,[CodeStat]
mov [OldCodeStat],al
if AltHotKey
test [HotStat],AltHotChg
jz NotAltChg
test [CodeStat],(Chab or WSung7)
jnz EnvrChgRet
and [CodeStat],not (HangeulMode or Chab or WSung or WSung7)
test al,HangeulMode
jnz @f
or [CodeStat],(HangeulMode or WSung)
@@:
call AltHotChgProc
jmp EnvrChgRet
NotAltChg:
endif ; if AltHotKey
call AdjustParms
call SaveScrn
call DispMain
call DispStatus
call MainLoop
call RestoreScrn
jc EnvrChgRet
call ChgEnvr
EnvrChgRet:
@pop ds,es,di,si,dx,cx,bx,ax
ret
if AltHotKey
AltHotChgProc:
test cs:[Card1st],HanCard
jz @f
mov ah,0fh
int 10h
cmp al,2
jz AltHotChgText
cmp al,3
jz AltHotChgText
test cs:[Card1st],VgaCard
jz @f
test cs:[Card1st],DualMnt
jnz @f
cmp al,7
jz AltHotChgText
@@:
if AtiVga
mov [PreModeV],al
endif ;AtiVga
call ChgEnvrProc
ret
AltHotChgText:
call SaveScrData
;if KseVga
; test cs:[KseCard],00000001b
; jz @f
; test [CodeStat],HangeulMode
; jnz @f
; CALL SaveEngPat
;@@:
;endif ; if KseVga
push es
test cs:[CodeStat],HangeulMode
jnz SetHanVideoI
call ChgParmH2E
jmp @f
SetHanVideoI:
call ChgParmE2H
@@:
push ax
push bx
mov ax,0
mov es,ax
ASSUME ES:DATA
mov ah,0fh
int 10h
or al, 80h
mov ah, 0
int 10h
JMP SetParmKse
cli
push ax
mov [ModeStat],0
and [KbStat],not HanKeyinMode
and [CodeStat],not HangeulVideoMode
mov [CurMode],al
call HanCardReset
call SearchMode
jnc @f
pop ax
or al, 080h
pushf
call [OLDVIDEO]
if KseVga
test cs:[KseCard],00000001b
jz SetParmKse
;or al,080h
;PUSHF
;CALL [OLDVIDEO]
; CALL LoadEngPat
call SetParmAlt
endif ; KseVga
JMP SetParmKse
@@:
pop ax
or [KbStat],HanKeyInMode
or [CodeStat],HangeulVideoMode
if KseVga
test cs:[KseCard],00000001b
jnz ProContKA
endif ; KseVga
if AtiVga
test cs:[KseCard],00000001b
jnz @f
call LoadEngPattern
mov bx,ax
cmp al,[PreModeV]
jnz @f
call HanCardSet
push si
call GetParmTbl
mov dx,03cch
in al,dx
mov ah,al
lodsb
pop si
cmp ah,al
jnz @f
jmp SetParmKse
@@:
mov [PreModeV],bl
mov ax,bx
endif ;AtiVga
ProContKA:
call PreModeSet
call ClearGrpBuf
if KseVga
test cs:[KseCard],00000001b
jz @f
or al,080h
PUSHF
CALL [OLDVIDEO]
@@:
endif ; KseVga
call LoadEngPattern
CALL SettingVariables
call HanCardSet
call SetParmAlt
SetParmKse:
pop bx
pop ax
pop es
assume es:code
sti
call WritScrData
if KseVga
test cs:[KseCard],00000001b
jz @f
call KseVEop
@@:
endif ; if KseVga
ret
SetParmAlt:
call GetParmTbl
mov dx,03c2h
lodsb
out dx,al
mov dx,03c4h
mov ah,1
lodsb
xchg ah,al
out dx,ax
mov dx,cx
mov cx,25
mov ax,0
out dx,ax
xor ah,ah
call OutParms
add dl,0ah-4
in al,dx
in al,dx
mov dx,03c0h
mov al,13h
out dx,al
lodsb
out dx,al
mov al,03fh
out dx,al
if KseVga
test cs:[KseCard],00000001b
jz @f
jmp SetParmVgaRet
@@:
endif ; KseVga
mov cx,02h
mov dx,01ceh
mov ah,0a8h
call OutParms
SetParmVgaRet:
ret
GetParmTbl:
push bx
mov bx,0
test [CodeStat],HangeulMode
jz @f
mov bx,1
@@:
push es
mov ax,0
mov es,ax
mov cx,ES:[rAddr6845]
pop es
test cs:[KseCard],MonoMntC
jz @f
or bx,000000100b
jmp SetParmProc
@@:
cmp cx,3b4h
jnz SetParmProc
or bx,000000010b
SetParmProc:
shl bx,1
if AtiVga
mov si,offset AttrTblAti
endif ; AtiVga
if KseVga
test cs:[KseCard],00000001b
jz @f
mov si,offset AttrTblKse
@@:
endif ; KseVga
mov si,[si+bx]
pop bx
ret
OutParms:
lodsb
xchg al,ah
out dx,ax
xchg al,ah
inc ah
loop OutParms
ret
if KseVga
KseEng2Vga db 067h
db 000h
db 05Fh,04Fh,050h,082h,055h,081h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,000h,000h
db 09Ch,00Eh,08Fh,028h,01Fh,096h,0B9h,0A3h,0FFh
db 008h
KseHan2Vga db 063h
db 001h
db 061h,052h,053h,023h,057h,06Fh,0BFh,01Fh,000h,04Fh,00Dh,06Eh,000h,000h,000h,000h
db 09Ch,00Eh,08Fh,028h,01Fh,096h,0B9h,0A3h,0FFh
db 000h
KseEng7Vga db 066h
db 000h
db 05Fh,04Fh,050h,082h,055h,081h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,000h,000h
db 09Ch,00Eh,08Fh,028h,00Fh,096h,0B9h,0A3h,0FFh
db 008h
KseHan7Vga db 062h
db 001h
db 061h,052h,053h,023h,057h,06Fh,0BFh,01Fh,000h,04Fh,00Dh,06Eh,000h,000h,000h,000h
db 09Ch,00Eh,08Fh,028h,00Fh,096h,0B9h,0A3h,0FFh
db 000h
KseEng7Mda db 0A6h
db 000h
db 060h,04Fh,056h,03Ah,051h,060h,070h,01Fh,000h,00Dh,00Bh,00Dh,000h,000h,000h,000h
db 05Eh,02Eh,05Dh,028h,00Dh,05Eh,00Eh,0A3h,0FFh
db 008h
KseHan7Mda db 0A6h
db 001h
db 05Fh,052h,055h,025h,053h,0E3h,0B0h,01Fh,000h,00Fh,00Eh,060h,000h,000h,000h,000h
db 090h,020h,08Fh,028h,00Dh,090h,000h,0A3h,0FFh
db 000h
AttrTblKse label byte
dw offset KseEng2Vga
dw offset KseHan2Vga
dw offset KseEng7Vga
dw offset KseHan7Vga
dw offset KseEng7Mda
dw offset KseHan7Mda
endif ; KseVga
if AtiVga
PreModeV DB 0
AtiEng2Vga db 067h
db 000h
db 05Fh,04Fh,050h,082h,055h,081h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,007h,080h
db 09Ch,00Eh,08Fh,028h,01Fh,096h,0B9h,0A3h,0FFh
db 008h
db 001h,072h
; db 048h,012h,000h,000h,054h,076h,004h,000h,001h,072h,005h,080h,000h,000h,000h,000h
; db 010h,000h,000h,000h,000h,008h,000h,02Dh,040h,073h,000h,063h,000h,090h,010h,008h
AtiHan2Vga db 063h
db 001h
db 05Fh,04Fh,050h,082h,054h,080h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,007h,080h
db 09Ch,00Eh,08Fh,028h,01Fh,096h,0B9h,0A3h,0FFh
db 000h
db 001h,0aeh
; db 048h,012h,000h,000h,054h,076h,004h,000h,001h,0AEh,005h,080h,000h,000h,000h,000h
; db 010h,000h,000h,000h,000h,008h,000h,02Dh,040h,073h,000h,063h,000h,090h,010h,028h
AtiEng7Vga db 066h
db 000h
db 05Fh,04Fh,050h,082h,055h,081h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,002h,030h
db 09Ch,00Eh,08Fh,028h,00Fh,096h,0B9h,0A3h,0FFh
db 008h
db 01h,079h
; db 048h,012h,000h,000h,054h,076h,004h,000h,001h,079h,005h,080h,000h,000h,000h,000h
; db 010h,000h,000h,000h,000h,008h,000h,02Dh,040h,073h,000h,063h,000h,090h,010h,008h
AtiHan7Vga db 062h
db 001h
db 05Fh,04Fh,050h,082h,054h,080h,0BFh,01Fh,000h,04Fh,00Dh,00Eh,000h,000h,007h,080h
db 09Ch,00Eh,08Fh,028h,01Fh,096h,0B9h,0A3h,0FFh
db 000h
db 00h,0cdh
; db 048h,012h,000h,000h,054h,076h,004h,000h,000h,0CDh,005h,080h,000h,000h,000h,000h
; db 010h,000h,000h,000h,000h,008h,000h,025h,040h,073h,000h,063h,000h,090h,010h,028h
AtiEng7Mda db 0A6h
db 001h
db 06Ch,04Fh,050h,02Bh,055h,067h,09Fh,01Fh,000h,00Fh,00Dh,00Fh,000h,000h,007h,080h
db 000h,000h,08Fh,028h,00Fh,091h,015h,0A3h,0FFh
db 000h
db 00h,093h
; db 058h,017h,000h,000h,054h,076h,004h,000h,000h,093h,005h,080h,000h,000h,000h,000h
; db 010h,007h,000h,000h,002h,008h,0A2h,025h,086h,0F1h,00Fh,062h,000h,0D0h,015h,008h
AtiHan7Mda db 0A6h
db 001h
db 06Ch,04Fh,050h,02Bh,055h,067h,09Fh,01Fh,000h,00Fh,00Dh,00Fh,000h,000h,007h,080h
db 000h,000h,08Fh,028h,00Fh,091h,015h,0A3h,0FFh
db 000h
db 00h,0e6h
; db 058h,017h,000h,000h,054h,076h,004h,000h,000h,0E6h,005h,080h,000h,000h,000h,000h
; db 000h,007h,000h,000h,002h,008h,0A2h,025h,086h,0F1h,00Fh,042h,000h,0D0h,015h,008h
AttrTblAti label byte
dw offset AtiEng2Vga
dw offset AtiHan2Vga
dw offset AtiEng7Vga
dw offset AtiHan7Vga
dw offset AtiEng7Mda
dw offset AtiHan7Mda
endif ; AtiVga
SaveScrData:
@push ds,es,cx,di,si
mov ah,0fh
int 10h
push ax
mov cs:[dSaveCurrPage],bh
mov ah,03h
int 10h
mov cs:[dSaveCurType],cx
mov cs:[dSaveCurPos],dx
mov cx,0
mov es,cx
mov cx,es:[rCrtStart]
les di,[CodeBuf2Addr]
lds si,[CodeBuf1Addr]
pop ax
mov dx,0b000h
cmp al,07h
jz @f
mov dx,0b800h
@@:
mov ds,dx
shr cx,1
shr cx,1
shr cx,1
shr cx,1
mov dx,ds
add cx,dx
mov ds,cx
mov cx,25*80
mov ax,ds
mov bx,si
rep movsw
@pop si,di,cx,es,ds
ret
WritScrData:
@push es,ds
lds si,[CodeBuf2Addr]
mov es,ax
mov di,bx
mov cx,25*80
rep movsw
mov bh,cs:[dSaveCurrPage]
mov dx,cs:[dSaveCurPos]
mov ah,02h
int 10h
mov cx,cs:[dSaveCurType]
mov ah,01h
int 10h
@pop ds,es
ret
endif ; AltHotKey
;------------------------------------------------------------------------
; << AdjustParms >>
; FUNCTION = initialize menu value
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP
AdjustParms:
mov [CurMenu],0
mov ah,[Printer]
and ah,00000111b
mov al,[CodeStat]
and al,HangeulMode or Chab or WSung or WSung7
test [CodeStat],ChabLoad
jnz @f
mov [Menu1Max],2-1
mov [Menu2Max],1-1
and al,HangeulMode or WSung
mov ah,NoPrt
@@:
mov [tPrinter],ah
mov [tCodeStat],al
mov si,offset Sub1Data
mov dx,si
mov cx,Sub1DataLng
@@:
cmp [si],al
jz @f
inc si
loop @b
mov si,dx ; initiale
@@:
sub si,dx
mov dx,si
mov [Menu1Cur],dl
mov al,[tPrinter]
mov si,offset Sub2Data
mov dx,si
mov cx,Sub2DataLng
@@:
cmp [si],al
jz @f
inc si
loop @b
mov si,dx ; initiale
@@:
sub si,dx
mov dx,si
mov [Menu2Cur],dl
ret
;------------------------------------------------------------------------
; << SaveScrn >>
; FUNCTION = save menu screen
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP
SaveScrn:
mov ah,0fh
int 10h
mov [dSaveCurrPage],bh
mov [NorAttr],70h
mov [SelAttr],7
mov [BakAttr],70h
cmp al,3
jbe @f
cmp al,7
jz @f
mov [NorAttr],7
mov [SelAttr],0fh
mov [BakAttr],0
@@:
mov ah,3
int 10h
mov [dSaveCurType],cx
mov [dSaveCurPos],dx
mov ah,1
or ch,20h
int 10h
xor dx,dx
mov di,offset MenuBuffer
mov cx,80*3
SaveLp:
mov ah,2
int 10h
mov ah,8
int 10h
stosw
inc dl
cmp dl,80
jb @f
xor dl,dl
inc dh
@@:
loop SaveLp
ret
;------------------------------------------------------------------------
; << DispMain >>
; FUNCTION = Display main menu
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP
DispMain:
mov bh,[BakAttr]
xor cx,cx
mov dx,024fh
mov ax,600h
int 10h
mov bh,[dSaveCurrPage]
mov bl,[NorAttr]
mov si,offset MainMenu
inc cx
DispMainLp:
lodsw
mov dx,ax
@@:
mov ah,2
int 10h
lodsb
cmp al,eom
jz @f
cmp al,0
jz DispMainLp
mov ah,9
int 10h
inc dl
jmp short @b
@@:
ret
;------------------------------------------------------------------------
; << DispStatus >>
; FUNCTION = display sub Menu
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP
DispStatus:
mov cx,MainTblLng
@@:
push cx
mov bl,[NorAttr]
call DispMenu
inc [CurMenu]
pop cx
loop @b
mov [CurMenu],0
mov bl,[SelAttr]
call DispMenu
ret
;------------------------------------------------------------------------
; << MainLoop >>
; FUNCTION = user interface
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP
MainLoop:
call GetKey
jc MainLoopAbort
xor ah,ah
shl ax,1
mov si,ax
call [si].KeySrv
jnc MainLoop
clc
MainLoopAbort:
ret
KeySrv label word
dw offset MenuUp ; up
dw offset MenuDown ; down
dw offset MenuLeft ; left
dw offset MenuRight; right
dw offset MenuSave ; enter
;--------------------------------
MenuUp:
mov bl,[NorAttr]
call DispMenu
mov si,[CurMenu]
shl si,1
mov si,[si].MainTbl
mov al,[si].mCurValue
dec al
cmp al,-1
jnz @f
mov al,[si].mMaxValue
@@:
mov [si].mCurValue,al
mov bl,[SelAttr]
call DispMenu
clc
ret
;--------------------------------
MenuDown:
mov bl,[NorAttr]
call DispMenu
mov si,[CurMenu]
shl si,1
mov si,[si].MainTbl
mov al,[si].mCurValue
mov ah,[si].mMaxValue
inc al
cmp al,ah
jbe @f
mov al,0
@@:
mov [si].mCurValue,al
mov bl,[SelAttr]
call DispMenu
clc
ret
;--------------------------------
MenuLeft:
mov bl,[NorAttr]
call DispMenu
dec [CurMenu]
cmp [CurMenu],-1
jnz @f
mov [CurMenu],MainTblLng-1
@@:
mov bl,[SelAttr]
call DispMenu
clc
ret
;--------------------------------
MenuRight:
mov bl,[NorAttr]
call DispMenu
inc [CurMenu]
cmp [CurMenu],MainTblLng
jb @f
mov [CurMenu],0
@@:
mov bl,[SelAttr]
call DispMenu
clc
ret
;--------------------------------
MenuSave:
stc
ret
;--------------------------------
DispMenu:
mov si,[CurMenu]
shl si,1
mov si,[si].MainTbl
mov dx,[si].mCurPos
mov al,[si].mCurValue
xor ah,ah
shl ax,1
add si,ax
mov si,[si].mMsgs
mov bh,[dSaveCurrPage]
push bx
mov ah,2
int 10h
mov cx,MsgLength
mov ah,9
mov al,' '
mov bl,[NorAttr]
int 10h
pop bx
mov cx,1
@@:
mov ah,2
int 10h
lodsb
cmp al,eom
jz @f
inc dl
mov ah,9
int 10h
jmp short @b
@@:
ret
;--------------------------------
GetKey:
xor ah,ah
pushf
call [OldKbioInt]
cmp ah,1 ; ESC key
jz GetKeyEnd
mov bl,ah
mov si,offset KeyTbl
mov cx,KeyTblLng
@@:
lodsw
cmp al,bl
jz @f
loop @b
mov ax,0e07h
int 10h
jmp short GetKey
@@:
mov al,ah
ret
GetKeyEnd:
stc
ret
KeyTbl label byte
db 48h,0 ; up
db 50h,1 ; down
db 4bh,2 ; left
db 4dh,3 ; right
db 1ch,4 ; enter
KeyTblLng = ($-KeyTbl)/2
;------------------------------------------------------------------------
; << ChgEnvr >>
; FUNCTION = check status & environment change
; INPUT : none
; OUTPUT : carry(set = no change & exit)
; PROTECT : DS, ES, BP
ChgEnvr:
test [CodeStat],ChabLoad
jz @f
mov al,[Menu2Cur]
xor ah,ah
mov si,ax
mov al,[si].Sub2Data
cmp [tPrinter],al
jz @f
mov [Printer],al
mov [PrtAuto],0
mov [HanCnt],0
xor ah,ah
mov si,ax
shl si,1
mov ax,[si].EscCode2Tbl
mov [EscCode2Addr],ax
mov ax,[si].EscCode3Tbl
mov [EscCode3Addr],ax
mov ax,[si].EscCodeNTbl
mov [EscCodeNAddr],ax
mov ax,[si].EscCode4Tbl
mov [EscCode4Addr],ax
@@:
mov al,[Menu1Cur]
xor ah,ah
mov si,ax
mov al,[si].Sub1Data
cmp [tCodeStat],al
jz ChgEnvrEnd
and [CodeStat],not (HangeulMode or Chab or WSung or WSung7)
or [CodeStat],al
ChgEnvrProc:
if not ComFile
push bx
mov bx,437
test [CodeStat],HangeulMode
jz @f
mov bx,1361
test [CodeStat],Chab
jnz @f
mov bx,949
@@:
mov ax,6602h
int 21h
pop bx
endif ; not ComFile
mov ah,0fh
int 10h
call ChgEnvrDo
mov ah,0f3h
int 16h
mov ah,0f3h
int 16h
if 0
; mov ah,0fh ; [CHM001]
; int 10h ; [CHM001]
; call ChgEnvrDo ; [CHM001]
mov ax, 6602h ; [CHM001]
mov bx, 437 ; [CHM001]
test [CodeStat], HangeulMode ; [CHM001]
jz ChangeCodePage ; [CHM001]
mov bx, 1361 ; [CHM001]
test [CodeStat], Chab ; [CHM001]
jnz ChangeCodePage ; [CHM001]
; test [CodeStat], Wsung7 ; [CHM001]
; jnz ChangeCodePage ; [CHM001]
mov bx, 949 ; [CHM001]
ChangeCodePage: ; [CHM001]
mov [BilingCall], 0ffh ; [CHM001]
int 21h ; [CHM001]
mov ah,0f3h
int 16h
mov ah,0f3h
int 16h
;@@:
; mov ah,1
; int 16h
; jz @f
; mov ah,0
; int 16h
; jmp short @b
;@@:
endif
test [KbStat],ReqEnvrChg
jnz ChgEnvrEnd
push ds
ASSUME DS:KbSeg
mov ax,SEG KbSeg
mov ds,ax
mov ax,1c0dh
mov bx,[rBufferTail]
call PushKeyBuf
pop ds
ASSUME DS:CODE
ChgEnvrEnd:
ret
;------------------------------------------------------------------------
; << ChgEnvrDo >>
; FUNCTION = mode set with given mode & status
; INPUT : AL = mode value
; OUTPUT : none
; PROTECT : DS, ES, BP
ChgEnvrDo:
push ax
test cs:[Card1st],VgaCard
jnz @f
test cs:[CodeStat],HangeulMode
jnz SetHanEnvr
call ChgParmH2E
jmp @f
SetHanEnvr:
call ChgParmE2H
@@:
test [CodeStat],ChabLoad
jz ChgEnvrContin
; push ds
; mov ax,6300h
; int 21h
; cmp byte ptr [si+1],0feh
; jnz @f
; mov byte ptr [si],0a1h
; test cs:[CodeStat],CHab
; jz @f
; mov byte ptr [si],084h
;@@:
; pop ds
mov [PrtAuto],0
mov [HanCnt],0
xor ah,ah
mov si,ax
shl si,1
mov ax,[si].EscCode2Tbl
mov [EscCode2Addr],ax
mov ax,[si].EscCode3Tbl
mov [EscCode3Addr],ax
mov ax,[si].EscCodeNTbl
mov [EscCodeNAddr],ax
mov ax,[si].EscCode4Tbl
mov [EscCode4Addr],ax
ChgEnvrContin:
pop ax
and al,01111111b
test [CodeStat],HangeulMode
jnz EnvrValidMode
cmp al,40h
jz @f
cmp al,60h
jz @f
cmp al,70h
jnz EnvrValidMode
@@:
and [KbStat],not ReqEnvrChg
int 11h
cmp al,00110000b
mov al,7
jpe EnvrValidMode
mov al,3
EnvrValidMode:
cmp al,3
jbe @f
cmp al,7
jz @f
and [KbStat],not ReqEnvrChg
@@:
push ax
mov al,[CodeStat]
xchg al,[OldCodeStat]
mov [CodeStat],al
call SaveCodeBuffer
mov dx,3bfh
mov al,3
out dx,al
mov dl,0b8h
mov al,28h
out dx,al
xor al,al
mov dl,0bfh
out dx,al
mov al,[OldCodeStat]
mov [CodeStat],al
test [Card1st],DualMnt
jz ModeSet1st
push ds
xor ax,ax
mov ds,ax
ASSUME DS:DATA
mov bl,byte ptr [rEquip]
mov ax,7
or byte ptr [rEquip],00110000b
test cs:[Card2nd],ColorMnt
jz @f
mov al,3
and byte ptr [rEquip],11101111b
@@:
int 10h
mov byte ptr [rEquip],bl
pop ds
ASSUME DS:CODE
ModeSet1st:
pop ax
if WINNT
call RestoreCodeBuffer
ret
else
xor ah,ah
if AltHotKey and AtiVga
mov [PreModeV],ah
endif ; AltHotKey and AtiVga
int 10h
call RestoreCodeBuffer
ret
endif
;--------------------------------
SaveCodeBuffer:
test [KbStat],ReqEnvrChg
jz SaveCodeBufferEnd
mov ah,0fh
int 10h ; get page #
mov [dSaveCurrPage],bh
mov ah,3
int 10h ; get cursor position
mov [dSaveCurPos],dx
mov [dSaveCurType],cx ; save cursor type
or ch,20h ; disable cursor
mov ah,1
int 10h
xor dx,dx
mov di,word ptr [CodeBuf2Addr]
@@:
mov ah,2
int 10h
mov ah,8
int 10h
stosw
inc dl
cmp dl,80
jb @b
xor dl,dl
inc dh
cmp dh,25
jb @b
jmp short ChgEnvrRestore
SaveCodeBufferEnd:
ret
;--------------------------------
RestoreCodeBuffer:
test [KbStat],ReqEnvrChg
jz RestoreCodeBufferEnd
mov al,[dSaveCurrPage]
mov ah,5
int 10h
mov bh,[dSaveCurrPage]
mov ah,3
int 10h ; get cursor position
; mov [dSaveCurType],cx ; save cursor type
or ch,20h ; disable cursor
mov ah,1
int 10h
xor dx,dx
mov cx,1
mov si,word ptr [CodeBuf2Addr]
@@:
mov ah,2
int 10h
lodsw
mov bl,ah
mov ah,9
int 10h
inc dl
cmp dl,80
jb @b
xor dl,dl
inc dh
cmp dh,25
jb @b
ChgEnvrRestore:
mov bh,[dSaveCurrPage]
mov cx,[dSaveCurType] ; restore cursor type
mov ah,1
int 10h
mov dx,[dSaveCurPos] ; restore cursor position
mov ah,2
int 10h
RestoreCodeBufferEnd:
ret
;------------------------------------------------------------------------
; << RestoreScrn >>
; FUNCTION = restore menu screen
; INPUT : none
; OUTPUT : none
; PROTECT : DS, ES, BP, FLAG
RestoreScrn:
pushf
mov bh,[dSaveCurrPage]
mov dx,MainPos
mov si,offset MenuBuffer
mov cx,80*3
RestoreLp:
mov ah,2
int 10h
push cx
lodsw
mov cx,1
mov bl,ah
mov ah,9
int 10h
pop cx
inc dl
cmp dl,80
jb @f
xor dl,dl
inc dh
@@:
loop RestoreLp
mov dx,[dSaveCurPos]
mov ah,2
int 10h
mov cx,[dSaveCurType]
mov ah,1
int 10h
popf
ret