You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2795 lines
82 KiB
2795 lines
82 KiB
|
|
TITLE Initialization routines
|
|
|
|
;=======================================================================;
|
|
; (C)Copyright Qnix Computer Co. Ltd. 1985-1992. ;
|
|
; This program contains proprietary and confidential information. ;
|
|
; All rights reserved. ;
|
|
;=======================================================================;
|
|
|
|
;=======================================================================;
|
|
; ;
|
|
; SPECIFICATION for initialize ;
|
|
; ;
|
|
;=======================================================================;
|
|
;
|
|
; Keyboard type : english 84 KBD
|
|
; : hangeul 86 KBD(none standard)
|
|
; : hangeul 86 KBD(KS C 5853)
|
|
; : 101 KBD
|
|
; : 103 KBD(KS C 5853)
|
|
;
|
|
; Video card : MGA
|
|
; CGA
|
|
; EGA-mono
|
|
; EGA-color
|
|
; VGA
|
|
; Font card
|
|
; Dual monitor
|
|
; 茄臂/康巩 video card
|
|
; 巩磊磊屈 file 汲摹 : HIMEM, EMS, Ext., real memory
|
|
; UDC file 汲摹
|
|
;
|
|
; User definable 茄康/茄磊 key
|
|
; Configuration file 贸府
|
|
;
|
|
|
|
CODE SEGMENT PUBLIC WORD 'CODE'
|
|
ASSUME CS:CODE, DS:CODE, ES:CODE
|
|
|
|
INCLUDE EQU.INC
|
|
INCLUDE debug.inc
|
|
INCLUDE compose.INC
|
|
|
|
;************************************************************************
|
|
;** **
|
|
;** GLOBAL DATA & FLAG **
|
|
;** **
|
|
;************************************************************************
|
|
|
|
; ----------- EQUATION -----------
|
|
; ------------- FLAG -------------
|
|
; ------------- DATA -------------
|
|
|
|
extrn OldKbInt:dword, OldKbioInt:dword, OldRtcInt:dword, OldVdParms:dword
|
|
extrn OldVideo:dword, OldSavePtr:dword, OldInt15:dword, OldInt17:dword
|
|
extrn EndSegment:word, EndOffset:word
|
|
extrn MemStat:byte, MemSize:word
|
|
extrn EmsSeg:word, EmsHandle:word, MaxMemSize:word, CurEmsPage:word
|
|
extrn HanAddr:word, HanAddrH:byte, UdcAddr:word, UdcAddrH:byte
|
|
extrn CodeStat:byte, Card1st:byte, Card2nd:byte, HeKey:byte, HjKey:byte
|
|
extrn KbStat:byte, Printer:byte, ErrStat:byte, HjStat:byte, MachineType:byte
|
|
extrn WinSegment:word, WinOffset:word, KbdType:byte
|
|
|
|
extrn HanPatternPtr:word, PatGenAddr:word
|
|
|
|
extrn CodeBuf2Addr:dword, CodeBufSize:word
|
|
|
|
extrn GetHan1st:word, GetHan2nd:word, GetUdc1st:word, GetUdc2nd:word
|
|
extrn PutUdc1st:word, PutUdc2nd:word, HanOn1st:word, HanOn2nd:word
|
|
extrn HanOff1st:word, HanOff2nd:word
|
|
|
|
extrn GetFontHanExt:near, GetFontUdcExt:near, PutFontUdcExt:near
|
|
extrn GdtDataTbl:word
|
|
extrn GetFontHanEms:near, GetFontUdcEms:near, PutFontUdcEms:near
|
|
extrn GetFontHanReal:near, GetFontUdcReal:near, PutFontUdcReal:near
|
|
|
|
extrn Int9:near, Int16:near, Int8:near, Int10:near, Int17:near, Int15Srv:near
|
|
extrn ChgCode:near, VgaService:near
|
|
extrn InitEnd:near, Install:near
|
|
|
|
extrn VideoParms:byte
|
|
extrn Mda70h:byte, Mda07h:byte
|
|
extrn Cga40h:byte, Cga23h:byte
|
|
extrn RegSize:byte, CrtcSet:byte
|
|
|
|
extrn HanSavePtr:dword, VideoParmsTbl:byte
|
|
extrn Mode2E:byte, Mode3E:byte, Mode7:byte
|
|
extrn Mode07:byte, Mode23:byte
|
|
extrn Mode3V:byte, Mode07V:byte, Mode3Ega:byte, Mode7Ega:byte
|
|
|
|
extrn FontFilename:byte, iVersion:byte
|
|
|
|
extrn vdm_info:near
|
|
|
|
if Hwin31Sw
|
|
extrn OldInt2f:dword, Int2f:near
|
|
endif ; Hwin31Sw
|
|
|
|
if GetSwitch
|
|
if not comfile
|
|
extrn PtrSav:dword
|
|
InitBpb = 18 ; init BPB(Bios Parameter Block)
|
|
endif
|
|
endif ; GetSwitch
|
|
|
|
;************************************************************************
|
|
;** **
|
|
;** INITIALIZE **
|
|
;** **
|
|
;************************************************************************
|
|
;
|
|
|
|
ParsKeyboard PROC Near
|
|
|
|
@push bx, dx
|
|
lodsb ; Skip ':' character
|
|
xor bx, bx
|
|
@@:
|
|
lodsb
|
|
cmp al, '0'
|
|
jb @f
|
|
cmp al, '9'
|
|
ja @f
|
|
xchg ax, bx
|
|
mov dx, 10
|
|
mul dx
|
|
xor bh, bh
|
|
sub bl, '0'
|
|
add bx, ax
|
|
jmp @b
|
|
@@:
|
|
dec bx
|
|
dec si
|
|
cmp bx, 6
|
|
jae @HEUnknown
|
|
|
|
cmp bx, 0
|
|
jne @F
|
|
mov cs:HeKey, 38h
|
|
mov cs:HjKey, 1Dh
|
|
jmp short @HEend
|
|
@@:
|
|
cmp bx, 1
|
|
jne @f
|
|
mov cs:HeKey, 1Dh
|
|
mov cs:HjKey, 38h
|
|
jmp SHORT @HEend
|
|
@@:
|
|
cmp bx, 2
|
|
je @HEdefined
|
|
cmp bx, 4
|
|
jne @f
|
|
@HEdefined:
|
|
mov cs:HeKey, 0F0h
|
|
mov cs:HjKey, 0F1h
|
|
jmp short @HEend
|
|
@@:
|
|
cmp bx, 3
|
|
jne @F
|
|
mov cs:HeKey, 2
|
|
mov cs:HjKey, 2
|
|
jmp short @HEend
|
|
@@:
|
|
cmp bx, 5 ; BUGBUG - Testing code
|
|
jne @HEUnknown ; BUGBUG - Testing code
|
|
mov cs:HeKey, 1 ; BUGBUG - Testing code
|
|
mov cs:HjKey, 1 ; BUGBUG - Testing code
|
|
jmp short @HEend
|
|
@HEUnknown:
|
|
@pop dx, bx
|
|
stc ; Unknown number
|
|
ret
|
|
@HEend: ; OK
|
|
@pop dx, bx
|
|
clc
|
|
ret
|
|
|
|
ParsKeyboard ENDP
|
|
|
|
;------------------------------------------------------------------------
|
|
; << HanInit >>
|
|
; FUNCTION = 茄臂 BIOS 檬扁拳
|
|
; INPUT : SS, SP
|
|
; OUTPUT : CX:DX = 茄臂 BIOS狼 付瘤阜 segment:offset address
|
|
; PROTECT : SS, SP
|
|
;
|
|
; HanInit(-/CX, DX)
|
|
; {
|
|
; Save DS, ES, SI, DI, BP;
|
|
; DS = CS;
|
|
; ES = CS;
|
|
; SetMachineType(-/-);
|
|
; SetHeHjKey(-/-);
|
|
; if (CheckVideoCardType(-/flag) == CY)
|
|
; {
|
|
; /* disp error message */
|
|
; CX = CS;
|
|
; DX = 0;
|
|
; return;
|
|
; }
|
|
; CheckHanCard(-/-);
|
|
; GetConfigFile(-/-);
|
|
; SetVideoParms(-/-);
|
|
; CalcEndAddr(-/-);
|
|
; SetPatGen(-/-);
|
|
; SetCodeBuffer(-/-);
|
|
; CheckMemory(-/-);
|
|
; SetVector(-/-);
|
|
; InstallFontFile(-/-);
|
|
; jmp Install;
|
|
;
|
|
hbiosExist DB 0
|
|
codePage DB 0
|
|
|
|
public HanInit
|
|
HanInit:
|
|
push ds
|
|
push es
|
|
push di
|
|
push si
|
|
push bp
|
|
mov ax,cs
|
|
mov ds,ax
|
|
mov es,ax
|
|
if ComFile
|
|
mov ah, 66h
|
|
mov al, 1
|
|
int 21h ; Get Current Code Page
|
|
cmp bx, 949
|
|
jne @f
|
|
mov codePage, 2
|
|
jmp @join
|
|
@@:
|
|
cmp bx, 1361
|
|
jne @join
|
|
mov codePage, 4
|
|
@join:
|
|
push es
|
|
mov ax,0fd00h
|
|
int 10h
|
|
pop es
|
|
cmp al,0fdh
|
|
jne @f
|
|
mov hbiosExist, 1
|
|
@@:
|
|
call ParsCommand
|
|
mov dx,offset DupErrMsg
|
|
jc ComFileEnd
|
|
cmp [hbiosExist], 0
|
|
je @f
|
|
ComFileEnd:
|
|
mov ah, 9
|
|
int 21h
|
|
mov ax, 4C00h
|
|
int 21h
|
|
@@:
|
|
endif ; if ComFile
|
|
call SetMachineType
|
|
cmp [HeKey], 0
|
|
jnz @f
|
|
call SetHeHjKey
|
|
@@:
|
|
call CheckVideoCardType
|
|
jnc @f
|
|
mov dx,offset CardErrMsg
|
|
if ComFile
|
|
jmp short ComFileEnd
|
|
else
|
|
mov ah,9
|
|
int 21h
|
|
mov cx,cs
|
|
xor dx,dx
|
|
jmp InitEnd
|
|
endif ; if ComFile
|
|
@@:
|
|
mov [WinSegment],cs
|
|
|
|
;
|
|
; Get VDM Information.
|
|
;
|
|
mov si,offset vdm_info
|
|
mov ah,20h
|
|
BOP 43H
|
|
|
|
call GetConfigFile
|
|
call CheckHanCard
|
|
call InstPrinter
|
|
call SetVideoParms
|
|
call CalcEndAddr
|
|
call SetPatGen
|
|
call SetCodeBuffer
|
|
call CheckMemory
|
|
call SetVector
|
|
call InstallFontFile
|
|
if hdos60
|
|
push ax
|
|
mov ax,04f02h
|
|
int 2fh
|
|
pop ax
|
|
endif ; hdos60
|
|
jmp Install
|
|
CardErrMsg db cr,lf,'Invalid video card !!!',7,'$'
|
|
DupErrMsg db '茄臂 BIOS啊 捞固 汲摹登绢 乐嚼聪促!',7,cr,lf,'$'
|
|
;CardErrMsg db cr,lf,'Invalid video card !!!',7,'$'
|
|
;DupErrMsg db cr,lf,'Already installed !!!',7,'$'
|
|
|
|
|
|
ParsSkipOptions PROC Near
|
|
@@:
|
|
lodsb
|
|
cmp al, ' '
|
|
je @f
|
|
cmp al, 9
|
|
je @f
|
|
cmp al, cr
|
|
je @f
|
|
cmp al, lf
|
|
jne @b
|
|
@@:
|
|
dec si
|
|
ret
|
|
ParsSkipOptions ENDP
|
|
|
|
;------------------------------------------------------------------------
|
|
if ComFile
|
|
ParsCommand:
|
|
mov si,81h
|
|
@@:
|
|
lodsb
|
|
cmp al,cr
|
|
je ParsEnd
|
|
cmp al,lf
|
|
je ParsEnd
|
|
cmp al,'/'
|
|
jnz @b
|
|
lodsb
|
|
or al,20h
|
|
cmp al, 'u' ; "/u" = uninstall option
|
|
je ParsRemove
|
|
cmp al, '?'
|
|
je ParsHelp
|
|
call ParsSkipOptions
|
|
jmp @b
|
|
ParsEnd:
|
|
clc
|
|
ret
|
|
|
|
;-------------------------------
|
|
DispRemoveEnd:
|
|
mov ax, cs
|
|
mov ds, ax
|
|
mov bl, [codePage]
|
|
xor bh, bh
|
|
mov si, [si+bx]
|
|
mov ah, 0fh
|
|
int 10h
|
|
mov bl, 7
|
|
@@:
|
|
lodsb
|
|
or al,al
|
|
jz @ParsExit
|
|
mov ah,0eh
|
|
int 10h
|
|
jmp short @b
|
|
@ParsExit:
|
|
mov ax,4c00h
|
|
int 21h
|
|
|
|
ParsHelp:
|
|
mov bx, Offset msgHelp
|
|
call ShowMultiMessage
|
|
jmp @ParsExit
|
|
|
|
ParsBadCmd:
|
|
mov bx, Offset msgBadCmd
|
|
call ShowMultiMessage
|
|
jmp @ParsExit
|
|
|
|
ParsRemove:
|
|
cmp cs:[hbiosExist], 0
|
|
jnz @f
|
|
mov ax, cs
|
|
mov ds, ax
|
|
mov dx, Offset msgNotExist
|
|
mov ah, 9
|
|
int 21h
|
|
jmp @ParsExit
|
|
@@:
|
|
mov ax,0fd00h
|
|
int 10h
|
|
mov si,offset iVersion
|
|
mov di,si
|
|
mov cx,5
|
|
rep cmpsb ; compare same BIOS
|
|
mov si,offset msgUnknown
|
|
jnz DispRemoveEnd
|
|
mov si,offset msgUnable
|
|
push ds
|
|
xor ax,ax
|
|
mov ds,ax
|
|
ASSUME DS:DATA
|
|
mov dx,es
|
|
cmp dx,word ptr [rKbInt+2]
|
|
jnz DispRemoveEnd
|
|
cmp dx,word ptr [rVideoInt+2]
|
|
jnz DispRemoveEnd
|
|
cmp dx,word ptr [rKbioInt+2]
|
|
jnz DispRemoveEnd
|
|
cmp dx,word ptr [rRtcInt+2]
|
|
jnz DispRemoveEnd
|
|
and es:[CodeStat],not HangeulMode
|
|
call dword ptr es:[WinOffset]
|
|
cli
|
|
mov ax,word ptr es:[OldKbint]
|
|
mov bx,word ptr es:[OldKbint+2]
|
|
mov word ptr [rKbInt],ax
|
|
mov word ptr [rKbInt+2],bx
|
|
mov ax,word ptr es:[OldVideo]
|
|
mov bx,word ptr es:[OldVideo+2]
|
|
mov word ptr [rVideoInt],ax
|
|
mov word ptr [rVideoInt+2],bx
|
|
mov ax,word ptr es:[OldKbioInt]
|
|
mov bx,word ptr es:[OldKbioInt+2]
|
|
mov word ptr [rKbioInt],ax
|
|
mov word ptr [rKbioInt+2],bx
|
|
mov ax,word ptr es:[OldRtcInt]
|
|
mov bx,word ptr es:[OldRtcInt+2]
|
|
mov word ptr [rRtcInt],ax
|
|
mov word ptr [rRtcInt+2],bx
|
|
if Hwin31Sw
|
|
mov ax,word ptr es:[OldInt2f]
|
|
mov bx,word ptr es:[OldInt2f+2]
|
|
mov word ptr [rInt2f],ax
|
|
mov word ptr [rInt2f+2],bx
|
|
endif ; Hwin31Sw
|
|
mov ax,word ptr es:[OldVdParms]
|
|
mov bx,word ptr es:[OldVdParms+2]
|
|
mov word ptr [rVdParm],ax
|
|
mov word ptr [rVdParm+2],bx
|
|
mov ax,word ptr es:[OldInt17]
|
|
mov bx,word ptr es:[OldInt17+2]
|
|
cmp dx,word ptr [rPrinter+2]
|
|
jnz @f
|
|
mov word ptr [rPrinter],ax
|
|
mov word ptr [rPrinter+2],bx
|
|
@@:
|
|
mov ax,word ptr es:[OldSavePtr]
|
|
mov bx,word ptr es:[OldSavePtr+2]
|
|
cmp dx,word ptr [rSavePtr+2]
|
|
jnz @f
|
|
mov word ptr [rSavePtr],ax
|
|
mov word ptr [rSavePtr+2],bx
|
|
@@:
|
|
mov ax,word ptr es:[OldInt15]
|
|
mov bx,word ptr es:[OldInt15+2]
|
|
cmp dx,word ptr [rCasetInt+2] ; same segment ?
|
|
jnz @f ; jump if no
|
|
mov word ptr [rCasetInt],ax
|
|
mov word ptr [rCasetInt+2],bx
|
|
@@:
|
|
sti
|
|
pop ds
|
|
ASSUME DS:CODE
|
|
mov dx,es:[EmsHandle]
|
|
test es:[MemStat],HiMem
|
|
jz @f
|
|
mov ah,0dh
|
|
call es:[OldInt15]
|
|
mov ah,0ah
|
|
call es:[OldInt15]
|
|
@@:
|
|
test es:[MemStat],EmsMem
|
|
jz @f
|
|
mov ah,45h ; close handle
|
|
int 67h
|
|
@@:
|
|
mov ah,49h
|
|
int 21h
|
|
mov si,offset msgRemove
|
|
jmp DispRemoveEnd
|
|
|
|
U_Unable db 'Cannot remove installed HBIOS!', 7,cr,lf,0
|
|
C_Unable DB '泅犁 汲摹登绢 乐绰 HBIOS甫 力芭且 荐 绝嚼聪促!', 7,cr,lf,0
|
|
W_Unable DB '裡竵 �谩朅瘁 范揺 HBIOS焛 笰堘衖 畞 呆痵摗攁!', 7,cr,lf,0
|
|
msgUnable DW U_Unable, C_Unable, W_Unable
|
|
|
|
U_Unknown db 'Unknown Hangeul BIOS!', 7,cr,lf,0
|
|
C_Unknown DB '促弗 滚傈狼 茄臂 BIOS啊 汲摹登绢 乐嚼聪促!', 7,cr,lf,0
|
|
W_Unknown DB '攁焑 め稿穪 衑媔 BIOS坅 �谩朅瘁 范痵摗攁!', 7,cr,lf,0
|
|
msgUnknown DW U_Unknown, C_Unknown, W_Unknown
|
|
|
|
U_Remove db 'Uninstalled!',cr,lf,0
|
|
msgRemove DW U_Remove, U_Remove, U_Remove
|
|
|
|
U_Help DB 'Usage: HBIOS [/?|/U|/F|/K|/E|/P]', 0Dh, 0Ah
|
|
DB ' /? - Help', 0Dh, 0Ah
|
|
DB ' /U - Uninstall', 0Dh, 0Ah
|
|
DB ' /F:<font file name>', 0Dh,0Ah
|
|
DB ' - Specify Extended Font File', 0Dh,0Ah
|
|
DB ' /K:# - Set Han/Eng toggle key', 0Dh, 0Ah
|
|
DB ' 1 - Right Alt, Right Ctrl', 0Dh, 0Ah
|
|
DB ' 2 - Right Ctrl, Right Alt', 0Dh, 0Ah
|
|
DB ' 3 - 103 Key Keyboard Defined', 0Dh, 0Ah
|
|
DB ' 4 - 84 Key Keyboard (Alt-Shift, Ctrl-Shift)', 0Dh,0Ah
|
|
DB ' 5 - 86 Key Keyboard Defined', 0Dh,0Ah
|
|
DB ' 6 - Left Shift-Space, Left Ctrl-Space', 0Dh, 0Ah
|
|
DB ' /E - English Card Only', 0Dh, 0Ah
|
|
DB ' /P - Page 1 Only', 0Dh, 0Ah, '$'
|
|
W_Help DB '荤侩过: HBIOS [/?|/U|/F|/K|/E|/P]', 0Dh, 0Ah
|
|
DB ' /? - 档框富', 0Dh, 0Ah
|
|
DB ' /U - 皋葛府俊辑 昏力', 0Dh, 0Ah
|
|
DB ' /F:<臂裁 颇老 捞抚>', 0Dh,0Ah
|
|
DB ' - 犬厘 臂裁 颇老 瘤沥', 0Dh,0Ah
|
|
DB ' /K:# - 茄/康 傈券虐 棺 茄磊 函券虐 瘤沥', 0Dh, 0Ah
|
|
DB ' 1 - 坷弗率 Alt, 坷弗率 Ctrl', 0Dh, 0Ah
|
|
DB ' 2 - 坷弗率 Ctrl, 坷弗率 Alt', 0Dh, 0Ah
|
|
DB ' 3 - 103 虐焊靛 磊魄 沥狼', 0Dh, 0Ah
|
|
DB ' 4 - 84 虐焊靛 (Alt-Shift, Ctrl-Shift)', 0Dh, 0Ah
|
|
DB ' 5 - 86 虐焊靛 磊魄 沥狼', 0Dh,0Ah
|
|
DB ' 6 - 哭率 Shift-Space, 哭率 Ctrl-Space', 0Dh,0Ah
|
|
DB ' /E - 茄臂 墨靛 眉农窍瘤 臼澜', 0Dh, 0Ah
|
|
DB ' /P - 康巩墨靛俊辑 1Page 瘤盔', 0Dh, 0Ah, '$'
|
|
C_Help DB '琣秝ん: HBIOS [/?|/U|/F|/K|/E|/P]', cr,lf
|
|
DB ' /? - 暋稇爄', cr,lf
|
|
DB ' /U - � 煛礎� 琤笰', cr,lf
|
|
DB ' /F:<媔崺 蘟珐 贰焣>', cr,lf
|
|
DB ' - 崖竪 媔崺 蘟珐 弧各', cr,lf
|
|
DB ' /K:# - ', cr,lf,'$'
|
|
DB ' /E - English Card Only', 0Dh, 0Ah
|
|
DB ' /P - Page 1 Only', 0Dh, 0Ah
|
|
msgHelp DW U_Help, W_Help, C_Help
|
|
|
|
U_BadCmd DB 'Invalid option parameter', cr,lf,'$'
|
|
W_BadCmd DB '概俺 函荐啊 肋给登菌嚼聪促.', cr,lf,'$'
|
|
C_BadCmd DB '爜垇 �畞坅 竔〉朅傣痵摗攁.', cr,lf,'$'
|
|
msgBadCmd DW U_BadCmd, W_BadCmd, C_BadCmd
|
|
|
|
msgNotExist DB 'Cannot find resident HBIOS!', 0Dh,0Ah,'$'
|
|
|
|
|
|
ShowMultiMessage PROC Near
|
|
;
|
|
; BX < Offset Table for Message
|
|
; DS = Unknown
|
|
;
|
|
add bl, [codePage]
|
|
adc bh, 0
|
|
mov dx, [bx]
|
|
mov ah, 9
|
|
int 21h
|
|
ret
|
|
|
|
ShowMultiMessage ENDP
|
|
|
|
endif ; if ComFile
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetMachineType >>
|
|
; FUNCTION = check XT or AT machine type, KBD type
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetMachineType(-/-)
|
|
; {
|
|
; Save ES;
|
|
; ES = 0f000h;
|
|
; if (ES:[0fffeh] == 0fch), [MachineType] = AtMachine;
|
|
; ES = KbSeg
|
|
; if (ES:[rKbFlag] == Ext10xKey), [KbStat] = [KbStat] || Ext10xKey;
|
|
; Restore ES;
|
|
; }
|
|
;
|
|
TmpPatBuf label byte
|
|
SetMachineType:
|
|
push es
|
|
mov ax,0f000h
|
|
mov es,ax
|
|
mov di,0fffeh
|
|
cmp byte ptr es:[di],0fch
|
|
jnz @f
|
|
or [MachineType],AtMachine
|
|
@@:
|
|
ASSUME ES:KbSeg
|
|
mov ax,SEG KbSeg
|
|
mov es,ax
|
|
test es:[rKbFlag3],Ext10xKey
|
|
jz @f
|
|
or [KbStat],Ext10xKey
|
|
@@:
|
|
pop es
|
|
ASSUME ES:CODE
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetHeHjKey >>
|
|
; FUNCTION = set 茄康/茄磊 key
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetHeHjKey(-/-)
|
|
; {
|
|
; if ([KbStat] == Ext10xKey)
|
|
; {
|
|
; [HeKey] = Def101HeKey;
|
|
; [HjKey] = Def101HjKey;
|
|
; }
|
|
; else
|
|
; {
|
|
; if ([MachineType] == AtMachine)
|
|
; {
|
|
; [HeKey] = DefAtHeKey;
|
|
; [HjKey] = DefAtHjKey;
|
|
; }
|
|
; else
|
|
; {
|
|
; [HeKey] = DefXtHeKey;
|
|
; [HjKey] = DefXtHjKey;
|
|
; }
|
|
; }
|
|
; }
|
|
;
|
|
SetHeHjKey:
|
|
if not Kbd101On
|
|
test [KbStat],Ext10xKey
|
|
jz @f
|
|
mov al,DefAtKsHeKey
|
|
mov ah,DefKsHjKey
|
|
test [MachineType],AtMachine
|
|
jnz SetHeHjKeyRet
|
|
mov al,DefXtKsHeKey
|
|
mov ah,DefKsHjKey
|
|
jmp SetHeHjKeyRet
|
|
@@:
|
|
mov al,DefAtHeKey
|
|
mov ah,DefAtHjKey
|
|
test [MachineType],AtMachine
|
|
jnz SetHeHjKeyRet
|
|
mov al,DefXtHeKey
|
|
mov ah,DefXtHjKey
|
|
SetHeHjKeyRet:
|
|
else
|
|
mov al,Def101HeKey
|
|
mov ah,Def101HjKey
|
|
test [KbStat],Ext10xKey
|
|
jnz @f
|
|
mov al,DefAtHeKey
|
|
mov ah,DefAtHjKey
|
|
test [MachineType],AtMachine
|
|
jnz @f
|
|
mov al,DefXtHeKey
|
|
mov ah,DefXtHjKey
|
|
@@:
|
|
endif
|
|
mov [HeKey],al
|
|
mov [HjKey],ah
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << CheckVideoCardType >>
|
|
; FUNCTION = video card type苞 dual monitor 咯何甫 八荤窃.
|
|
; INPUT : none
|
|
; OUTPUT : CARRY(set = invalid video card)
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; CheckVideoCardType(-/-)
|
|
; {
|
|
; DX = -1;
|
|
; AX = 101ah;
|
|
; BX = -1;
|
|
; int 10h; /* VGA function */
|
|
; AX = 1a00h;
|
|
; int 10h; /* get card type */
|
|
; if ((BX != -1) && (AL == 1ah) && (BL < 14) && (BH < 14))
|
|
; {
|
|
; switch(BL)
|
|
; {
|
|
; case 1:
|
|
; [Card1st] = MgaCard;
|
|
; break;
|
|
; case 2:
|
|
; [Card1st] = CgaCard || ColorMnt;
|
|
; break;
|
|
; case 4:
|
|
; [Card1st] = EgaCardC || ColorMnt;
|
|
; break;
|
|
; case 5:
|
|
; [Card1st] = EgaCardM;
|
|
; break;
|
|
; case 0bh:
|
|
; [Card1st] = VgaCard;
|
|
; break;
|
|
; case 0ah:
|
|
; case 0ch:
|
|
; default:
|
|
; [Card1st] = VgaCard || ColorMnt;
|
|
; break;
|
|
; case 7:
|
|
; [Card1st] = McgaCard;
|
|
; break;
|
|
; case 6:
|
|
; case 8:
|
|
; [Card1st] = McgaCard || ColorMnt;
|
|
; }
|
|
; switch(BH)
|
|
; {
|
|
; case 1:
|
|
; [Card2nd] = MgaCard || DualMnt;
|
|
; break;
|
|
; case 2:
|
|
; [Card2nd] = CgaCard || ColorMnt || DualMnt;
|
|
; break;
|
|
; case 4:
|
|
; [Card2nd] = EgaCardC || ColorMnt || DualMnt;
|
|
; break;
|
|
; case 5:
|
|
; [Card2nd] = EgaCardM || DualMnt;
|
|
; break;
|
|
; case 0bh:
|
|
; [Card2nd] = VgaCard || DualMnt;
|
|
; break;
|
|
; case 0ah:
|
|
; case 0ch:
|
|
; [Card2nd] = VgaCard || ColorMnt || DualMnt;
|
|
; break;
|
|
; case 7:
|
|
; [Card2nd] = McgaCard || DualMnt;
|
|
; break;
|
|
; case 6:
|
|
; case 8:
|
|
; [Card2nd] = McgaCard || ColorMnt || DualMnt;
|
|
; default:
|
|
; }
|
|
; return;
|
|
; }
|
|
; else
|
|
; {
|
|
; AH = 12h;
|
|
; BX = 0ff10h;
|
|
; int 10h;
|
|
; if (BL == 0), return(CY);
|
|
; if ((BL != 10h) || (!BL))
|
|
; {
|
|
; if (ES:[rEquip] == 30h)
|
|
; {
|
|
; [Card1st] = EgaCard;
|
|
; AH = 0b8h;
|
|
; if (CheckVram(AH/flag) == ZR)
|
|
; [Card2nd] = CgaCard || ColorMnt || DualMnt;
|
|
; }
|
|
; else
|
|
; {
|
|
; [Card1st] = EgaCard || ColorMnt;
|
|
; AH = 0b0h;
|
|
; if (CheckVram(AH/flag) == ZR)
|
|
; [Card2nd] = MgaCard || DualMnt;
|
|
; }
|
|
; }
|
|
; if (ES:[rEquip] == 30h)
|
|
; {
|
|
; [Card1st] = MgaCard;
|
|
; AH = 0b8h;
|
|
; if (CheckVram(AH/flag) == ZR)
|
|
; [Card2nd] = CgaCard || ColorMnt || DualMnt;
|
|
; }
|
|
; else
|
|
; {
|
|
; [Card1st] = CgaCard || ColorMnt;
|
|
; AH = 0b0h;
|
|
; if (CheckVram(AH/flag) == ZR)
|
|
; [Card2nd] = MgaCard || DualMnt;
|
|
; }
|
|
; }
|
|
; if ([Card2nd] == DualMnt)
|
|
; [Card1st] = DualMnt;
|
|
; }
|
|
;
|
|
; CheckVram(AH/flag)
|
|
; {
|
|
; Save DS;
|
|
; AL = 0;
|
|
; DS = AX;
|
|
; AX = 55aah;
|
|
; DI = 0;
|
|
; xchg [DI+3],AX;
|
|
; xchg [DI+3],AX;
|
|
; xchg [DI+9],AX;
|
|
; xchg [DI+9],AX;
|
|
; Restore DS;
|
|
; /* cmp AX,55aah */
|
|
; }
|
|
;
|
|
CheckVideoCardType:
|
|
mov dx,-1
|
|
mov ax,101ah
|
|
mov bx,-1
|
|
int 10h
|
|
cmp bx,-1
|
|
jz CheckEga
|
|
mov ax,1a00H
|
|
int 10h
|
|
cmp al,1aH ; VGA?
|
|
jne CheckEga ; jump if no
|
|
VgaBoard:
|
|
cmp bl,VgaModeTblLng
|
|
jae CheckEga
|
|
cmp bh,VgaModeTblLng
|
|
jae CheckEga
|
|
mov al,bh
|
|
xor bh,bh
|
|
mov dl,[bx+VgaModeTbl]
|
|
cmp dl,-1 ; invalid vide card ?
|
|
jnz @f ; jump if no
|
|
mov dl,VgaCard or ColorMnt
|
|
xor dh,dh
|
|
jmp SetCardParm
|
|
@@:
|
|
mov bl,al
|
|
mov dh,[bx+VgaModeTbl]
|
|
jmp short SetCardParm
|
|
CheckEga:
|
|
mov ah,12H
|
|
mov bx,0ff10H
|
|
int 10h
|
|
cmp bl,10H ; which video mode
|
|
jz CheckCga
|
|
or bl,bl
|
|
jz CheckCardErr ; jump if installed 64KByte video memory only
|
|
or bh,bh ; color mode?
|
|
jz Check2ndEColor
|
|
int 11h
|
|
test al,00110000b
|
|
jpo Set1CE2M
|
|
jmp short SetE1M2C
|
|
CheckCardErr:
|
|
stc
|
|
ret
|
|
Check2ndEColor:
|
|
int 11h
|
|
test al,00110000b
|
|
jpo SetE1C2M
|
|
jmp short Set1ME2C
|
|
SetE1C2M:
|
|
mov dl,EgaCardC or ColorMnt
|
|
mov ah,0b0h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,MgaCard
|
|
jmp short SetCardParm
|
|
SetE1M2C:
|
|
mov dl,EgaCardM
|
|
mov ah,0b8h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,CgaCard or ColorMnt
|
|
jmp short SetCardParm
|
|
Set1CE2M:
|
|
mov dl,CgaCard or ColorMnt
|
|
mov ah,0b8h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,EgaCardM
|
|
jmp short SetCardParm
|
|
Set1ME2C:
|
|
mov dl,MgaCard
|
|
mov ah,0b0h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,EgaCardC or ColorMnt
|
|
jmp short SetCardParm
|
|
CheckCga:
|
|
int 11h
|
|
test al,30h
|
|
jpo Check2ndMono
|
|
mov dl,MgaCard
|
|
mov ah,0b8h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,CgaCard or ColorMnt
|
|
jmp short SetCardParm
|
|
Check2ndMono:
|
|
mov dl,CgaCard or ColorMnt
|
|
mov ah,0b0h
|
|
call CheckVRam
|
|
jnz SetCardParm
|
|
mov dh,MgaCard
|
|
SetCardParm:
|
|
cmp dh,-1
|
|
jz @f
|
|
or dl,DualMnt
|
|
or dh,DualMnt
|
|
@@:
|
|
mov [Card1st],dl
|
|
mov [Card2nd],0
|
|
test dl,DualMnt
|
|
jz @f
|
|
mov [Card2nd],dh
|
|
@@:
|
|
clc
|
|
ret
|
|
VgaModeTbl db -1 ; 0
|
|
db MgaCard ; 1
|
|
db CgaCard or ColorMnt ; 2
|
|
db -1 ; 3
|
|
db EgaCardC or ColorMnt ; 4
|
|
db EgaCardM ; 5
|
|
db McgaCard or ColorMnt ; 6
|
|
db McgaCard ; 7
|
|
db McgaCard or ColorMnt ; 8
|
|
db -1 ; 9
|
|
db VgaCard or ColorMnt ; A
|
|
db VgaCard ; B
|
|
db VgaCard or ColorMnt ; C
|
|
VgaModeTblLng = $-VgaModeTbl
|
|
CheckVram:
|
|
push ds
|
|
xor al,al
|
|
mov ds,ax
|
|
mov ax,55aah
|
|
xor di,di
|
|
xchg [di+3],ax
|
|
xchg [di+3],ax
|
|
xchg [di+7],ax
|
|
xchg [di+7],ax
|
|
cmp ax,55aah
|
|
pop ds
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << CheckHanCard >>
|
|
; FUNCTION = 茄臂 video card牢瘤 八荤窃
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; CheckHanCard(-/-)
|
|
; {
|
|
; switch([Card1st])
|
|
; {
|
|
; case MgaCard :
|
|
; if (MgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card1st] = [Card1st] || HanCard;
|
|
; [GetHan1st] = AX;
|
|
; [GetUdc1st] = AX;
|
|
; [PutUdc1st] = BX;
|
|
; [HanOn1st] = CX;
|
|
; [HanOff1st] = DX;
|
|
; }
|
|
; break;
|
|
; case CgaCard :
|
|
; if (CgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card1st] = [Card1st] || HanCard;
|
|
; [GetHan1st] = AX;
|
|
; [GetUdc1st] = AX;
|
|
; [PutUdc1st] = BX;
|
|
; [HanOn1st] = CX;
|
|
; [HanOff1st] = DX;
|
|
; }
|
|
; break;
|
|
; case EgaCardM :
|
|
; case EgaCardC :
|
|
; if (EgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card1st] = [Card1st] || HanCard;
|
|
; [GetHan1st] = AX;
|
|
; [GetUdc1st] = AX;
|
|
; [PutUdc1st] = BX;
|
|
; [HanOn1st] = CX;
|
|
; [HanOff1st] = DX;
|
|
; }
|
|
; break;
|
|
; case McgaCard :
|
|
; case VgaCard :
|
|
; if (VgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card1st] = [Card1st] || HanCard;
|
|
; [GetHan1st] = AX;
|
|
; [GetUdc1st] = AX;
|
|
; [PutUdc1st] = BX;
|
|
; [HanOn1st] = CX;
|
|
; [HanOff1st] = DX;
|
|
; }
|
|
; }
|
|
; switch([Card2nd])
|
|
; {
|
|
; case MgaCard :
|
|
; if (MgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card2nd] = [Card2nd] || HanCard;
|
|
; [GetHan2nd] = AX;
|
|
; [GetUdc2nd] = AX;
|
|
; [PutUdc2nd] = BX;
|
|
; [HanOn2nd] = CX;
|
|
; [HanOff2nd] = DX;
|
|
; }
|
|
; break;
|
|
; case CgaCard :
|
|
; if (CgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card2nd] = [Card2nd] || HanCard;
|
|
; [GetHan2nd] = AX;
|
|
; [GetUdc2nd] = AX;
|
|
; [PutUdc2nd] = BX;
|
|
; [HanOn2nd] = CX;
|
|
; [HanOff2nd] = DX;
|
|
; }
|
|
; break;
|
|
; case EgaCardM :
|
|
; case EgaCardC :
|
|
; if (EgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card2nd] = [Card2nd] || HanCard;
|
|
; [GetHan2nd] = AX;
|
|
; [GetUdc2nd] = AX;
|
|
; [PutUdc2nd] = BX;
|
|
; [HanOn2nd] = CX;
|
|
; [HanOff2nd] = DX;
|
|
; }
|
|
; break;
|
|
; case McgaCard :
|
|
; case VgaCard :
|
|
; if (VgaInit(-/flag) == NC)
|
|
; {
|
|
; [Card2nd] = [Card2nd] || HanCard;
|
|
; [GetHan2nd] = AX;
|
|
; [GetUdc2nd] = AX;
|
|
; [PutUdc2nd] = BX;
|
|
; [HanOn2nd] = CX;
|
|
; [HanOff2nd] = DX;
|
|
; }
|
|
; }
|
|
; if (([Card1st] != HanCard) && ([Card2nd] != HanCard))
|
|
; {
|
|
; if (FontInit(-/flag) == NC)
|
|
; {
|
|
; [Card1st] = [Card1st] || FontCard;
|
|
; [Card2nd] = [Card2nd] || FontCard;
|
|
; [HjStat] = [HjStat] || HjLoaded;
|
|
; [GetHan1st] = AX;
|
|
; [GetUdc1st] = AX;
|
|
; [PutUdc1st] = BX;
|
|
; [HanOn1st] = CX;
|
|
; [HanOff1st] = DX;
|
|
; [GetHan2nd] = AX;
|
|
; [GetUdc2nd] = AX;
|
|
; [PutUdc2nd] = BX;
|
|
; [HanOn2nd] = CX;
|
|
; [HanOff2nd] = DX;
|
|
; }
|
|
; }
|
|
; if (([Card1st] == HanCard) || ([Card2nd] == HanCard))
|
|
; [HjStat] = [HjStat] || HjLoaded;
|
|
; if (([Card1st] != HanCard) && ([Card2nd] == HanCard))
|
|
; {
|
|
; [GetHan1st] = [GetHan2nd];
|
|
; [GetUdc1st] = [GetUdc2nd];
|
|
; [PutUdc1st] = [PutUdc2nd];
|
|
; [HanOn1st] = [HanOn2nd];
|
|
; [HanOff1st] = [HanOff2nd];
|
|
; }
|
|
; if (([Card1st] == HanCard) && ([Card2nd] != HanCard))
|
|
; {
|
|
; [GetHan2nd] = [GetHan1st];
|
|
; [GetUdc2nd] = [GetUdc1st];
|
|
; [PutUdc2nd] = [PutUdc1st];
|
|
; [HanOn2nd] = [HanOn1st];
|
|
; [HanOff2nd] = [HanOff1st];
|
|
; }
|
|
; }
|
|
;
|
|
extrn GetFontMga:near, PutFontMga:near, HanOnMga:near, HanOffMga:near
|
|
extrn GetFontCga:near, PutFontCga:near, HanOnCga:near, HanOffCga:near
|
|
extrn GetFontEga:near, PutFontEga:near, HanOnEga:near, HanOffEga:near
|
|
extrn GetFontFont:near, PutFontFont:near, HanOnFont:near, HanOffFont:near
|
|
CheckHanCard:
|
|
mov bl,[Card1st]
|
|
and bx,CardType
|
|
call [bx+HanInitTbl]
|
|
jc @f
|
|
or [Card1st],HanCard
|
|
mov [GetHan1st],ax
|
|
mov [GetUdc1st],ax
|
|
mov [PutUdc1st],bx
|
|
mov [HanOn1st],cx
|
|
mov [HanOff1st],dx
|
|
@@:
|
|
test [Card1st],DualMnt
|
|
jz @f
|
|
mov bl,[Card2nd]
|
|
and bx,CardType
|
|
call [bx+HanInitTbl]
|
|
jc @f
|
|
or [Card2nd],HanCard
|
|
mov [GetHan2nd],ax
|
|
mov [GetUdc2nd],ax
|
|
mov [PutUdc2nd],bx
|
|
mov [HanOn2nd],cx
|
|
mov [HanOff2nd],dx
|
|
@@:
|
|
test [Card1st],HanCard
|
|
jnz @f
|
|
test [Card2nd],HanCard
|
|
jnz @f
|
|
call FontInit
|
|
jc @f
|
|
or [Card1st],FontCard
|
|
or [Card2nd],FontCard
|
|
or [HjStat],HjLoaded
|
|
mov [GetHan1st],ax
|
|
mov [GetUdc1st],ax
|
|
mov [PutUdc1st],bx
|
|
mov [HanOn1st],cx
|
|
mov [HanOff1st],dx
|
|
mov [GetHan2nd],ax
|
|
mov [GetUdc2nd],ax
|
|
mov [PutUdc2nd],bx
|
|
mov [HanOn2nd],cx
|
|
mov [HanOff2nd],dx
|
|
@@:
|
|
mov al,[Card1st]
|
|
or al,[Card2nd]
|
|
test al,HanCard
|
|
jz @f
|
|
or [HjStat],HjLoaded or UdcArea
|
|
@@:
|
|
xor bx,bx
|
|
test [Card1st],HanCard
|
|
jz @f
|
|
or bx,00000010b
|
|
@@:
|
|
test [Card2nd],HanCard
|
|
jz @f
|
|
or bx,00000100b
|
|
@@:
|
|
call [bx+SetFontPtrTbl]
|
|
ret
|
|
SetFontPtrTbl label word
|
|
dw offset NoFont ; 00
|
|
dw offset C1to2 ; 01
|
|
dw offset C2to1 ; 10
|
|
dw offset NoFont ; 11
|
|
C1to2:
|
|
mov ax,[GetHan1st]
|
|
mov [GetHan2nd],ax
|
|
mov ax,[GetUdc1st]
|
|
mov [GetUdc2nd],ax
|
|
mov ax,[PutUdc1st]
|
|
mov [PutUdc2nd],ax
|
|
mov ax,[HanOn1st]
|
|
mov [HanOn2nd],ax
|
|
mov ax,[HanOff1st]
|
|
mov [HanOff2nd],ax
|
|
NoFont:
|
|
ret
|
|
C2to1:
|
|
mov ax,[GetHan2nd]
|
|
mov [GetHan1st],ax
|
|
mov ax,[GetUdc2nd]
|
|
mov [GetUdc1st],ax
|
|
mov ax,[PutUdc2nd]
|
|
mov [PutUdc1st],ax
|
|
mov ax,[HanOn2nd]
|
|
mov [HanOn1st],ax
|
|
mov ax,[HanOff2nd]
|
|
mov [HanOff1st],ax
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
HanInitTbl label word
|
|
dw offset MgaInit
|
|
dw offset CgaInit
|
|
dw offset EgaInit
|
|
dw offset EgaInit
|
|
dw offset VgaInit
|
|
dw offset VgaInit
|
|
|
|
;------------------------------------------------------------------------
|
|
MgaInit:
|
|
if AltHotKey
|
|
if AtiVga
|
|
call CheckAti
|
|
jc @f
|
|
ret
|
|
@@:
|
|
endif ; if AtiVga
|
|
endif ; AltHotKey
|
|
mov di,offset TmpPatBuf
|
|
push di
|
|
push ds
|
|
mov cx,0a1a2h
|
|
call GetFontMga
|
|
pop ds
|
|
pop si
|
|
mov cx,32/2
|
|
xor dx,dx
|
|
@@:
|
|
lodsw
|
|
add dx,ax
|
|
loop @b
|
|
cmp dx,30h
|
|
jz @f
|
|
cmp dx,0c0h
|
|
jz @f
|
|
stc
|
|
ret
|
|
@@:
|
|
mov ax,offset GetFontMga
|
|
mov bx,offset PutFontMga
|
|
mov cx,offset HanOnMga
|
|
mov dx,offset HanOffMga
|
|
ret
|
|
|
|
;------------------------------------------------------------------------
|
|
CgaInit:
|
|
mov di,offset TmpPatBuf
|
|
push di
|
|
push ds
|
|
mov cx,0a1a2h
|
|
call GetFontCga
|
|
pop ds
|
|
pop si
|
|
mov cx,32/2
|
|
xor dx,dx
|
|
@@:
|
|
lodsw
|
|
add dx,ax
|
|
loop @b
|
|
cmp dx,30h
|
|
jz @f
|
|
stc
|
|
ret
|
|
@@:
|
|
mov ax,offset GetFontCga
|
|
mov bx,offset PutFontCga
|
|
mov cx,offset HanOnCga
|
|
mov dx,offset HanOffCga
|
|
ret
|
|
|
|
;------------------------------------------------------------------------
|
|
EgaInit:
|
|
VgaInit:
|
|
if ChkW32Trident
|
|
call CheckTrident
|
|
endif ; ChkW32Trident
|
|
test [KseCard],PassHanCdCheck
|
|
jz @f
|
|
stc
|
|
ret
|
|
@@:
|
|
if AtiVga
|
|
call CheckAti
|
|
jnc @f
|
|
endif ; if AtiVga
|
|
if KseVga
|
|
call CheckKasan
|
|
jnc @f
|
|
endif ; if KseVga
|
|
if ChkW32Trident
|
|
call CheckW32Tseng
|
|
endif ; ChkW32Trident
|
|
@@:
|
|
if not (KseVga or AtiVga)
|
|
stc
|
|
endif ; if not (KseVga or AtiVga)
|
|
ret
|
|
|
|
if ChkW32Trident
|
|
CheckW32Tseng:
|
|
push ds
|
|
mov ax,0c000h
|
|
mov ds,ax
|
|
mov bx,0076h
|
|
cmp ds:[bx],'sT'
|
|
jnz @f
|
|
add bx,2
|
|
cmp ds:[bx],'ne'
|
|
jnz @f
|
|
or cs:[KseCard],Page1Fix
|
|
@@:
|
|
pop ds
|
|
stc
|
|
ret
|
|
|
|
CheckTrident:
|
|
push ds
|
|
mov ax,0c000h
|
|
mov ds,ax
|
|
mov bx,0065h
|
|
cmp ds:[bx],'RT'
|
|
jnz @f
|
|
add bx,2
|
|
cmp ds:[bx],'DI'
|
|
jnz @f
|
|
or cs:[KseCard],PassHanCdCheck
|
|
@@:
|
|
pop ds
|
|
ret
|
|
endif ; ChkW32Trident
|
|
|
|
if KseVga
|
|
extrn KseGetFontVga:near, KsePutFontVga:near, KseHanOnVga:near
|
|
extrn KseHanOffVga:near, KseCard:byte
|
|
CheckKasan:
|
|
mov dx,258h
|
|
mov ax,0aaf1h ; sample data
|
|
out dx,ax
|
|
mov ax,002f2h ; init F2-02
|
|
out dx,ax
|
|
mov al,0f1h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
cmp al,0aah ; GaSan video card ?
|
|
jz @f
|
|
jmp NoneKasan
|
|
@@:
|
|
dec dl
|
|
mov ax,050f1h ; init F1-50
|
|
out dx,ax
|
|
mov ax,006f3h ; init F3-06
|
|
out dx,ax
|
|
mov ax,0fff5h ; init F5-FF
|
|
out dx,ax
|
|
mov ax,0c9f6h ; init F6-C9
|
|
out dx,ax
|
|
mov ax,0fef7h ; init F7-FE
|
|
out dx,ax
|
|
mov al,0f4h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,11110111b ; release KEY bit(FONT)
|
|
out dx,al
|
|
dec dl
|
|
mov al,0f0h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
or al,00000011b ; UDC write operation
|
|
out dx,al
|
|
mov dl,56h
|
|
mov al,80h
|
|
out dx,al ; set UDC write ready
|
|
mov bx,0c9a1h ; UDC code
|
|
mov ax,bx
|
|
shl al,1
|
|
shr ax,1
|
|
mov cx,32
|
|
mul cx
|
|
mov cx,dx
|
|
mov dx,250h ; font address register 250
|
|
mov bl,al
|
|
out dx,al
|
|
inc dl ; font address register 251
|
|
mov al,ah
|
|
out dx,al
|
|
inc dl ; font address register 252
|
|
mov al,cl
|
|
out dx,al
|
|
mov dl,54h ; font data register 254
|
|
mov al,55h ; sample data
|
|
out dx,al
|
|
mov dl,56h
|
|
out dx,al ; write data to UDC RAM
|
|
mov dl,54h
|
|
xor al,al
|
|
out dx,al
|
|
mov dl,58h
|
|
mov al,0f0h
|
|
out dx,al
|
|
inc dl
|
|
in al,dx
|
|
and al,11111110b ; set font read operation
|
|
out dx,al
|
|
mov dl,54h
|
|
in al,dx ; read sample data
|
|
mov ah,20h
|
|
mov dl,58h
|
|
mov al,0f0h
|
|
out dx,al
|
|
inc dl
|
|
in al,dx
|
|
and al,11111100b
|
|
or al,ah
|
|
out dx,al
|
|
or [KseCard],00000001b
|
|
clc
|
|
jmp CheckKasanRet
|
|
NoneKasan:
|
|
stc
|
|
ret
|
|
CheckKasanRet:
|
|
mov si,offset KseVga23
|
|
mov di,offset Mode23TextV
|
|
mov cx,64/2
|
|
rep movsw
|
|
mov si,offset KseVga23
|
|
mov di,offset Mode2TextE
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,offset KseVga7
|
|
mov di,offset Mode7TextV
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,offset KseVga7
|
|
mov di,offset Mode7TextE
|
|
mov cl,64/2
|
|
rep movsw
|
|
if AltHotKey
|
|
mov ax,01a00h
|
|
int 10h
|
|
cmp bl,5
|
|
jnz @f
|
|
or [KseCard],MonoMntC
|
|
mov si,offset KseMda7
|
|
mov di,offset Mode7TextE
|
|
mov cl,64/2
|
|
rep movsw
|
|
@@:
|
|
endif ; AltHotKey
|
|
mov ax,offset KseGetFontVga
|
|
mov bx,offset KsePutFontVga
|
|
mov cx,offset KseHanOnVga
|
|
mov dx,offset KseHanOffVga
|
|
ret
|
|
KseVga23 label byte
|
|
db 50h,18h,10h,00h,10h,00h,03h,00h,02h,063h
|
|
db 61h,52h,53h,23h,57h,06fh,0bfh,01fh,0,04fh,0eh,0fh,0,0,0,0
|
|
db 9ch,00eh,08fh,28h,1fh,96h,0b9h,0a3h,0ffh
|
|
db 0,01h,02h,03h,04h,05h,14h,07h,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh
|
|
db 0Ch,00h,0Fh,0;8h
|
|
db 00h,00h,00h,00h,00h,10h,0Eh,00h,0FFh
|
|
KseVga7 label byte
|
|
db 50h,18h,10h,00h,10h,00h,03h,00h,02h,062h
|
|
db 61h,52h,53h,23h,57h,06Fh,0bfh,01fh,0,04fh,0eh,0fh,0,0,0,0
|
|
db 9ch,00eh,08fh,28h,0fh,96h,0b9h,0a3h,0ffh
|
|
db 0,8,8,8,8,8,8,8,10h,18h,18h,18h,18h,18h,18h,18h
|
|
db 0Eh,0,0Fh,0;8h
|
|
db 00h,00h,00h,00h,00h,10h,0Ah,00h,0FFh
|
|
KseMda7 label byte
|
|
db 50h,18h,10h,00h,10h,00h,03h,00h,02h,0A6h
|
|
db 5Fh,52h,55h,25h,53h,0E3h,0B0h,01fh,0,00Fh,0eh,060h,0,0,0,0
|
|
db 90h,020h,08fh,28h,0Dh,90h,000h,0a3h,0ffh
|
|
db 0,8,8,8,8,8,8,8,10h,18h,18h,18h,18h,18h,18h,18h
|
|
db 0Eh,0,0Fh,0;8h
|
|
db 00h,00h,00h,00h,00h,10h,0Ah,00h,0FFh
|
|
endif ; if KseVga
|
|
|
|
if AtiVga
|
|
extrn AtiGetFontVga:near, AtiPutFontVga:near, AtiHanOnVga:near
|
|
extrn AtiHanOffVga:near, KseCard:byte
|
|
CheckAti:
|
|
|
|
mov cx,0a1a2h
|
|
mov dx,3ddh
|
|
mov ah,ch
|
|
mov al,10h
|
|
out dx,ax
|
|
mov ah,cl
|
|
mov al,8
|
|
out dx,ax
|
|
mov ax,201h
|
|
mov cl,4
|
|
cmp ch,0feh ; assume FExx
|
|
jnz @f
|
|
mov ah,6 ; set C9xx
|
|
mov cl,2
|
|
@@:
|
|
cmp ch,0c9h
|
|
jnz @f
|
|
mov cl,2
|
|
@@:
|
|
out dx,ax
|
|
mov al,cl
|
|
out dx,al
|
|
inc dx
|
|
xor bx,bx
|
|
mov cx,16
|
|
@@:
|
|
in al,dx
|
|
add bl,al
|
|
adc bh,0
|
|
inc di
|
|
loop @b
|
|
mov cl,16
|
|
@@:
|
|
inc di
|
|
in al,dx
|
|
add bh,al
|
|
loop @b
|
|
dec dx
|
|
mov ax,1
|
|
out dx,ax
|
|
cmp bx,8004h
|
|
jnz NoneAtiVga
|
|
mov dx,3ddh
|
|
mov ax,101h
|
|
out dx,ax
|
|
mov dx,1ceh
|
|
mov al,0bfh
|
|
mov ah,al
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
or al,00100000b
|
|
dec dx
|
|
xchg al,ah
|
|
out dx,ax
|
|
mov dx,1ceh
|
|
mov al,0bbh
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
mov bh,al
|
|
dec dx
|
|
mov ax,55bbh
|
|
out dx,ax
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
mov bl,al
|
|
dec dx
|
|
mov ax,0aabbh
|
|
out dx,ax
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
mov ah,bl
|
|
dec dx
|
|
cmp ax,55aah
|
|
jz @f
|
|
NoneAtiVga:
|
|
stc
|
|
ret
|
|
@@:
|
|
mov al,0bbh ;restore register value
|
|
mov ah,bh
|
|
out dx,ax
|
|
call AtiHanOffVga
|
|
mov si,offset AtiVga23
|
|
mov di,offset Mode23TextV
|
|
mov cx,64/2
|
|
rep movsw
|
|
mov si,offset AtiVga23
|
|
mov di,offset Mode2TextE
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,offset AtiVga7
|
|
mov di,offset Mode7TextV
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,offset AtiVga7
|
|
mov di,offset Mode7TextE
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov ax,01a00h
|
|
int 10h
|
|
cmp bl,5
|
|
jnz @f
|
|
or [KseCard],MonoMntC
|
|
@@:
|
|
mov ax,offset AtiGetFontVga
|
|
mov bx,offset AtiPutFontVga
|
|
mov cx,offset AtiHanOnVga
|
|
mov dx,offset AtiHanOffVga
|
|
clc
|
|
ret
|
|
AtiVga23 label byte
|
|
db 80,24,16,0,10H, 1,3,0,2, 063H
|
|
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,4Fh,0DH,0EH,0,0,0,0
|
|
db 9Ch,0Eh,8Fh,28h,1FH,96h,0B9h,0A3h,0FFh
|
|
db 0,1,2,3,4,5,14H,7,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
|
|
db 0CH,0,0FH,0;8
|
|
db 0,0,0,0,0,10H,0EH,0,0FFH
|
|
AtiVga7 label byte
|
|
db 80,24,16,0,10H, 1,3,0,2, 062h
|
|
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,4Fh,0DH,0EH,0,0,0,0
|
|
db 9Ch,0Eh,8Fh,28h,1FH,96h,0B9h,0A3h,0FFh
|
|
db 0,8,8,8,8,8,8,8,10H,18H,18H,18H,18H,18H,18H,18H
|
|
db 0EH,0,0FH,0;8
|
|
db 0,0,0,0,0,10H,0AH,0,0FFH
|
|
endif ; if AtiVga
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
FontInit:
|
|
mov ax,offset GetFontFont
|
|
mov bx,offset PutFontFont
|
|
mov cx,offset HanOnFont
|
|
mov dx,offset HanOffFont
|
|
stc
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << GetConfigFile >>
|
|
; FUNCTION = "HECON.CFG" file阑 佬绢辑 秦寸登绰 康开俊 汲摹窃
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; GetConfigFile(-/-)
|
|
; {
|
|
; /* open 'HECON.CFG' file */
|
|
; /* read file to end of file */
|
|
; /* copy data */
|
|
; }
|
|
;
|
|
GetConfigFile:
|
|
push ds
|
|
call SetPreConfig
|
|
mov ah,19h
|
|
int 21h
|
|
cmp al,2
|
|
jbe @f
|
|
mov al,2
|
|
@@:
|
|
add al,'A'
|
|
mov si,offset CfgFilename
|
|
mov [si],al ; set drive latter
|
|
if not GetSwitch
|
|
mov ax,3d00h
|
|
mov dx,offset CfgFilename
|
|
int 21h
|
|
jc GetConfigFileEnd
|
|
mov bx,ax
|
|
mov ah,3fh
|
|
mov cx,100
|
|
mov dx,offset EndOfInit
|
|
int 21h
|
|
jc GetConfigFileClose
|
|
mov si,dx
|
|
mov di,offset CfgFilename
|
|
add di,3
|
|
mov cx,9
|
|
rep cmpsb
|
|
jnz GetConfigFileClose
|
|
mov si,dx
|
|
add si,sFont
|
|
mov di,offset FontFileName
|
|
mov cx,StringLng
|
|
rep movsb
|
|
mov si,dx
|
|
mov al,[si].sCodeType
|
|
if hdos60
|
|
and al,WSung or Chab or WSung7 or HangeulMode
|
|
and [CodeStat],not (WSung or Chab or WSung7 or HangeulMode)
|
|
else ;hdos60
|
|
and al,WSung or Chab or WSung7 or HangeulMode or ChabLoad
|
|
and [CodeStat],not (WSung or Chab or WSung7 or HangeulMode or ChabLoad)
|
|
endif ; hdos60
|
|
or [CodeStat],al
|
|
mov al,[si].sMemory
|
|
and al,HiMem or EmsMem or ExtMem or RealMem
|
|
and [MemStat],not (HiMem or EmsMem or ExtMem or RealMem)
|
|
or [MemStat],al
|
|
mov al,[si].sKbdType
|
|
and al,SetKbd101
|
|
and [KbdType],not SetKbd101
|
|
or [KbdType],al
|
|
mov al,[si].sHeKey
|
|
or al,al
|
|
jz @f
|
|
or [KbStat],UserDefineKey
|
|
mov [HeKey],al
|
|
@@:
|
|
mov al,[si].sHjKey
|
|
or al,al
|
|
jz @f
|
|
or [KbStat],UserDefineKey
|
|
mov [HjKey],al
|
|
@@:
|
|
mov al,[si].sPrinterType
|
|
mov [Printer],al
|
|
GetConfigFileClose:
|
|
mov ah,3eh
|
|
int 21h
|
|
else
|
|
if ComFile
|
|
mov si,81h
|
|
else
|
|
lds si,[PtrSav]
|
|
lds si,[si].InitBpb ; ds:si points to CONFIG.SYS
|
|
endif ; ComFile
|
|
DBGNum 1
|
|
mov di,offset FontFileName
|
|
@gcfLoop:
|
|
lodsb
|
|
DBGNum ax
|
|
cmp al,CR ; terminate with CR or LF
|
|
je GetConfigFileEndj
|
|
cmp al,LF
|
|
je GetConfigFileEndj
|
|
cmp al,9
|
|
je GetConfigFileEndj
|
|
Cmp AL,"/" ; MS-DOS 5.00
|
|
jnz @gcfLoop
|
|
|
|
lodsb
|
|
or al, 20h
|
|
cmp al, 'f' ; file spec?
|
|
jne @f
|
|
call @fontFileOption
|
|
jmp @gcfLoop
|
|
@@:
|
|
cmp al, 'k'
|
|
jne @f
|
|
call ParsKeyboard
|
|
jmp @gcfLoop
|
|
@@:
|
|
if not ChkW32Trident
|
|
cmp al, 'e'
|
|
jne @f
|
|
or [KseCard],PassHanCdCheck
|
|
jmp @gcfLoop
|
|
@@:
|
|
cmp al, 'p'
|
|
jne @f
|
|
or [KseCard],Page1Fix
|
|
jmp @gcfLoop
|
|
@@:
|
|
endif ; not ChkW32Trident
|
|
call ParsSkipOptions
|
|
jmp @gcfLoop
|
|
GetConfigFileEndj:
|
|
jmp GetConfigFileEnd
|
|
|
|
@fontFileOption:
|
|
lodsb
|
|
cmp al,CR ; ill-terminate with CR or LF
|
|
je GetConfigFileEnd
|
|
cmp al,LF
|
|
je GetConfigFileEnd
|
|
cmp al," " ; skip delimiter " ", tab
|
|
je @b
|
|
cmp al,":" ; "/F:"?
|
|
jne GetConfigFileEnd
|
|
GetParmsFileSpec:
|
|
lodsb
|
|
cmp al,CR ; ill-terminate with CR or LF
|
|
je GetConfigFileEnd
|
|
cmp al,LF
|
|
je GetConfigFileEnd
|
|
cmp al," " ; skip delimiter " ", tab
|
|
je GetParmsFileSpec
|
|
cmp al,9
|
|
je GetConfigFileEnd
|
|
; je GetParmsFileSpec
|
|
mov ah,al
|
|
lodsb
|
|
xchg ah,al
|
|
cmp ah,":" ; is drive name given?
|
|
je HaveDrvName ; jump if so
|
|
; inc di
|
|
; inc di
|
|
HaveDrvName:
|
|
stosw
|
|
@@:
|
|
lodsb
|
|
cmp al,CR ; terminate with CR or LF
|
|
je ParseBpbRetJ
|
|
cmp al,LF
|
|
je ParseBpbRetJ
|
|
cmp al," " ; skip delimiter " ", tab, ","
|
|
je ParseBpbRetJ
|
|
cmp al,9
|
|
je ParseBpbRetJ
|
|
stosb
|
|
jmp @b
|
|
ParseBpbRetJ:
|
|
sub ax,ax
|
|
stosw
|
|
ret
|
|
endif
|
|
GetConfigFileEnd:
|
|
test [KbStat],UserDefineKey
|
|
jnz @f
|
|
test [KbdType],SetKbd101
|
|
jz @f
|
|
mov [HeKey],Def101HeKey
|
|
mov [HjKey],Def101HjKey
|
|
@@:
|
|
pop ds
|
|
ret
|
|
CfgFilename db 'C:\HECON.CFG',0
|
|
|
|
SetPreConfig:
|
|
and [CodeStat],not (WSung or Chab or WSung7 or HangeulMode or ChabLoad)
|
|
or [CodeStat],WSung or HangeulMode or ChabLoad
|
|
and [MemStat],not (HiMem or EmsMem or ExtMem or RealMem)
|
|
and [KbdType],not SetKbd101
|
|
and [Printer],11111000b
|
|
ret
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
extrn EscCode2Tbl:word, EscCode3Tbl:word, EscCodeNTbl:word, EscCode4Tbl:word
|
|
extrn EscCode2Addr:word, EscCode3Addr:word, EscCodeNAddr:word, EscCode4Addr:word
|
|
InstPrinter:
|
|
test [CodeStat],ChabLoad
|
|
jz InstPrinterEnd
|
|
mov al,[Printer]
|
|
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
|
|
InstPrinterEnd:
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetVideoParms >>
|
|
; FUNCTION = video parm阑 汲摹窃
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetVideoParms(-/-)
|
|
; {
|
|
; }
|
|
;
|
|
SetVideoParms:
|
|
mov al,[Card1st]
|
|
call SetVdParmsDo
|
|
test [Card1st],DualMnt
|
|
jz @f
|
|
mov al,[Card2nd]
|
|
call SetVdParmsDo
|
|
@@:
|
|
ret
|
|
SetVdParmsDo:
|
|
mov dl,al
|
|
and al,CardType
|
|
xor ah,ah
|
|
mov si,ax
|
|
jmp [si+SetVdParmsTbl]
|
|
SetVdParmsTbl label word
|
|
dw offset MParms
|
|
dw offset CParms
|
|
dw offset EParms
|
|
dw offset EParms
|
|
dw offset VParms
|
|
dw offset VParms
|
|
MParms:
|
|
test dl,HanCard
|
|
jnz @f
|
|
mov si,offset Mda70H
|
|
mov di,offset Mda07H
|
|
mov cx,10/2
|
|
rep movsw
|
|
mov ax,0e0dh
|
|
stosw
|
|
inc si
|
|
inc si
|
|
movsw
|
|
movsw
|
|
mov di,offset RegSize
|
|
add di,6
|
|
mov ax,8000h
|
|
stosw
|
|
mov di,offset CrtcSet
|
|
add di,7
|
|
mov al,0ah
|
|
test dl,DualMnt
|
|
jnz MgaTextEmu
|
|
mov al,8ah
|
|
MgaTextEmu:
|
|
stosb
|
|
@@:
|
|
ret
|
|
CParms:
|
|
test dl,HanCard
|
|
jnz @f
|
|
mov si,offset Cga40H
|
|
mov di,offset Cga23H
|
|
mov cx,10/2
|
|
rep movsw
|
|
mov ax,706h
|
|
stosw
|
|
inc si
|
|
inc si
|
|
movsw
|
|
movsw
|
|
mov di,offset RegSize
|
|
add di,4
|
|
mov ax,8000h
|
|
stosw
|
|
mov di,offset CrtcSet
|
|
add di,6
|
|
mov al,1eh
|
|
stosb
|
|
@@:
|
|
ret
|
|
EParms:
|
|
call InstallVdParmsPtr
|
|
xor ch,ch
|
|
mov si,offset Mode7Ega
|
|
mov bx,offset Mode3Ega
|
|
test dl,HanCard
|
|
jz @f
|
|
mov si,offset Mode7TextE
|
|
mov bx,offset Mode2TextE
|
|
@@:
|
|
mov di,offset Mode7
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,bx
|
|
mov di,offset Mode2E
|
|
mov cl,64/2
|
|
rep movsw
|
|
test dl,DualMnt
|
|
jz @f
|
|
mov di,offset Mode7Ega
|
|
mov [di].cMap,9
|
|
mov di,offset Mode3Ega
|
|
mov [di].cMap,0dh
|
|
test dl,HanCard
|
|
jnz @f
|
|
mov di,offset Mode7
|
|
mov [di].cMap,9
|
|
mov di,offset Mode2E
|
|
mov [di].cMap,0dh
|
|
@@:
|
|
mov si,offset Mode2E
|
|
mov di,offset Mode3E
|
|
mov cl,64/2
|
|
rep movsw
|
|
ret
|
|
VParms:
|
|
call InstallVdParmsPtr
|
|
xor ch,ch
|
|
|
|
IFDEF _X86_ ; On ALPHA, doesn't have full screen mode
|
|
mov si,offset Mode7TextV
|
|
mov bx,offset Mode23TextV
|
|
test dl,HanCard
|
|
jnz @f
|
|
|
|
;
|
|
; Hangul Video card is not found.
|
|
; HBIOS should emulate Hangul Video card for display Hangul character.
|
|
; We use graphic video mode.
|
|
;
|
|
mov si,offset Mode07V
|
|
mov bx,offset Mode3V
|
|
|
|
push es
|
|
push di
|
|
les di,dword ptr cs:[vdm_info.windowed_add]
|
|
mov al,es:[di]
|
|
pop es
|
|
pop di
|
|
|
|
cmp al,0 ; windowed mode ?
|
|
; 0 = windowed, 1 = full screen
|
|
jne @f
|
|
|
|
ENDIF ; _X86_
|
|
;
|
|
; Windowed mode doesn't need for set graphics video mode.
|
|
; Becase console window can display Hangul character without HBIOS.
|
|
;
|
|
|
|
mov si,offset Mode7TextV
|
|
mov bx,offset Mode23TextV
|
|
|
|
@@:
|
|
mov di,offset Mode07
|
|
mov cl,64/2
|
|
rep movsw
|
|
mov si,bx
|
|
mov di,offset Mode23
|
|
mov cl,64/2
|
|
rep movsw
|
|
test dl,DualMnt
|
|
jz @f
|
|
mov di,offset Mode07V
|
|
mov [di].cMap,9
|
|
mov di,offset Mode3V
|
|
mov [di].cMap,0dh
|
|
test dl,DualMnt
|
|
jnz @f
|
|
mov di,offset Mode07
|
|
mov [di].cMap,9
|
|
mov di,offset Mode23
|
|
mov [di].cMap,0dh
|
|
@@:
|
|
ret
|
|
InstallVdParmsPtr:
|
|
push es
|
|
push ds
|
|
xor ax,ax
|
|
mov ds,ax
|
|
ASSUME DS:DATA
|
|
les di,[rSavePtr]
|
|
mov word ptr cs:[OldSavePtr],di
|
|
mov word ptr cs:[OldSavePtr+2],es
|
|
mov word ptr [rSavePtr],offset HanSavePtr
|
|
mov word ptr [rSavePtr+2],cs
|
|
mov si,es
|
|
mov ds,si
|
|
mov si,di
|
|
mov di,cs
|
|
mov es,di
|
|
mov di,offset HanSavePtr
|
|
mov cx,7*2
|
|
rep movsw
|
|
mov word ptr cs:[HanSavePtr],offset VideoParmsTbl
|
|
mov word ptr cs:[HanSavePtr+2],cs
|
|
pop ds
|
|
pop es
|
|
ASSUME DS:CODE
|
|
push ds
|
|
lds si,[OldSavePtr]
|
|
lds si,[si]
|
|
mov di,offset VideoParmsTbl
|
|
test cs:[Card1st],00001000b
|
|
jnz @f
|
|
mov cx,64*23/2
|
|
rep movsw
|
|
pop ds
|
|
ret
|
|
@@:
|
|
mov cx,64*8/2
|
|
rep movsw
|
|
add si,64*3
|
|
add di,64*3
|
|
mov cx,64*18/2
|
|
rep movsw
|
|
pop ds
|
|
ret
|
|
;------------------------------------------------------------------------
|
|
; text VGA mode 7
|
|
Mode7TextV label byte
|
|
db 80,24,16,0,10H, 1,3,0,2, 062h
|
|
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,4Fh,0DH,0EH,0,0,0,0
|
|
db 9Ch,0Eh,8Fh,28h,1FH,96h,0B9h,0A3h,0FFh
|
|
db 0,8,8,8,8,8,8,8,10H,18H,18H,18H,18H,18H,18H,18H
|
|
db 0EH,0,0FH,8
|
|
db 0,0,0,0,0,10H,0AH,0,0FFH
|
|
|
|
Mode23TextV label byte
|
|
db 80,24,16,0,10H, 1,3,0,2, 063H
|
|
db 5Fh,4Fh,50h,82h,54h,80h,0BFh,1Fh,0,4Fh,0DH,0EH,0,0,0,0
|
|
db 9Ch,0Eh,8Fh,28h,1FH,96h,0B9h,0A3h,0FFh
|
|
db 0,1,2,3,4,5,14H,7,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
|
|
db 0CH,0,0FH,8
|
|
db 0,0,0,0,0,10H,0EH,0,0FFH
|
|
|
|
; text EGA mode 7
|
|
Mode7TextE label byte
|
|
db 80,24,16,0,10h, 1,3,0,3, 0A6h
|
|
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,0,0DH,0EH,0,0,0,0 ; crtc
|
|
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0E3h,0FFh ; crtc
|
|
db 0,8,8,8,8,8,8,8,10h,18h,18h,18h,18h,18h,18h,18h
|
|
db 0EH,0,0FH,8
|
|
db 0,0,0,0,0,10H,0Ah,0,0FFh
|
|
|
|
Mode2TextE label byte
|
|
db 80,24,16,0,10h, 1,3,0,3, 0A7h
|
|
db 5Bh,4Fh,53h,37h,52h,00h,09Fh,1Fh,0,0,0DH,0EH,0,0,0,0 ; crtc
|
|
db 90h,2Bh,8Fh,28h,0FH,95h,1Dh,0E3h,0FFh ; crtc
|
|
db 0,1,2,3,4,5,14H,7,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
|
|
db 0CH,0,0FH,8
|
|
db 0,0,0,0,0,10H,0Eh,0,0FFh
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << CalcEndAddr >>
|
|
; FUNCTION = calculate end of program
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; CalcEndAddr(-/-)
|
|
; {
|
|
; [EndSegment] = CS;
|
|
; [EndOffset] = ChgCode;
|
|
; if ([CodeStat] == ChabLoad), return;
|
|
; [EndOffset] = GenFont;
|
|
; if (([Card1st] < EgaCardM) || ([Card2nd] < EgaCardM))
|
|
; [EndOffset] = VgaService;
|
|
; }
|
|
;
|
|
CalcEndAddr:
|
|
mov [EndSegment],cs
|
|
mov [EndOffset],offset GenFont ; max size
|
|
test [CodeStat],ChabLoad
|
|
jnz @f
|
|
mov [EndOffset],offset ChgCode ; W/O code conversion & printer
|
|
mov al,[Card1st]
|
|
or al,[Card2nd]
|
|
test al,00001100b
|
|
jnz @f
|
|
mov [EndOffset],offset VgaService ; W/O VGA service
|
|
@@:
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetPatGen >>
|
|
; FUNCTION = install pattern generator
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetPatGen(-/-)
|
|
; {
|
|
; if ([Card1st != FontCard or HanCard) && ([Card1st != FontCard or HanCard)
|
|
; {
|
|
; [Ks2ChAddr] = Ks2Ch;
|
|
; DI = [EndOffset];
|
|
; [GetHan1st] = DI;
|
|
; [GetHan2nd] = DI;
|
|
; SI = GenFont;
|
|
; CX = GenFontLng;
|
|
; /* rep movsb */
|
|
; [EndOffset] = DI;
|
|
; }
|
|
; }
|
|
;
|
|
extrn Ks2Ch:near, Ks2ChAddr:word
|
|
SetPatGen:
|
|
mov di,[EndOffset]
|
|
test [Card1st],FontCard or HanCard
|
|
jnz @f
|
|
test [Card2nd],FontCard or HanCard
|
|
jnz @f
|
|
mov [GetHan1st],di
|
|
mov [GetHan2nd],di
|
|
jmp short SetPatGenDo
|
|
@@:
|
|
test [CodeStat],ChabLoad
|
|
jz @f
|
|
SetPatGenDo:
|
|
or [CodeStat],InstPatGen
|
|
mov [Ks2ChAddr],offset Ks2Ch
|
|
mov si,offset GenFont
|
|
mov [PatGenAddr],di
|
|
mov cx,offset CharTbl
|
|
sub cx,si
|
|
add cx,di
|
|
mov [HanPatternPtr],cx
|
|
mov cx,GenFontLng
|
|
rep movsb
|
|
mov [EndOffset],di
|
|
@@:
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetCodeBuffer >>
|
|
; FUNCTION = code buffer甫 犬焊窃
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetCodeBuffer(-/-)
|
|
; {
|
|
; [CodeBuf2Addr] = [EndOffset];
|
|
; [CodeBuf2Addr+2] = CS;
|
|
; switch ([Card1st])
|
|
; {
|
|
; case MgaCard:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case CgaCard:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case EgaCardM:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case EgaCardC:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case McgaCard:
|
|
; AX = 80*30;
|
|
; return;
|
|
; case VgaCard:
|
|
; AX = 80*05;
|
|
; }
|
|
; switch ([Card2nd])
|
|
; {
|
|
; case MgaCard:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case CgaCard:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case EgaCardM:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case EgaCardC:
|
|
; AX = 80*25;
|
|
; return;
|
|
; case McgaCard:
|
|
; AX = 80*30;
|
|
; return;
|
|
; case VgaCard:
|
|
; AX = 80*30;
|
|
; }
|
|
; [EndOffset] = [EndOffset] + AX;
|
|
; }
|
|
;
|
|
SetCodeBuffer:
|
|
mov ax,[EndOffset]
|
|
mov word ptr [CodeBuf2Addr],ax
|
|
mov word ptr [CodeBuf2Addr+2],cs
|
|
mov bl,[Card1st]
|
|
and bl,CardType
|
|
mov bh,[Card2nd]
|
|
and bh,CardType
|
|
cmp bl,bh
|
|
jae @f
|
|
mov bl,bh
|
|
@@:
|
|
xor bh,bh
|
|
mov ax,[bx+BufferSizeTbl]
|
|
add [EndOffset],ax
|
|
mov [CodeBufSize],ax
|
|
ret
|
|
BufferSizeTbl label word
|
|
dw 80*25*2 ; MGA card
|
|
dw 80*25*2 ; CGA card
|
|
dw 80*25*2 ; EGA mono card
|
|
dw 80*25*2 ; EGA color card
|
|
dw 80*30*2 ; MCGA card
|
|
dw 80*30*2 ; VGA card
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << CheckMemory >>
|
|
; CheckMemory(-/-)
|
|
; {
|
|
; }
|
|
;
|
|
CheckMemory:
|
|
mov dx,offset FontFileName
|
|
mov ax,3d00h ; find first filename
|
|
int 21h
|
|
jc CheckMemErr
|
|
mov bx,ax
|
|
mov ah,3eh ; close file
|
|
int 21h
|
|
test [Card1st],HanCard
|
|
jnz CheckMemErr
|
|
test [Card2nd],HanCard
|
|
jnz CheckMemErr
|
|
mov ax,188+6 ; 32*94*64+94*2*32 = 192512+6016 Byte
|
|
test [Card1st],FontCard
|
|
jz @f
|
|
mov ax,6 ; 94*2*32 = 6016 Byte
|
|
@@:
|
|
mov [MemSize],ax
|
|
test [MemStat],RealMem or ExtMem or EmsMem or HiMem
|
|
jz AutoMemory
|
|
test [MemStat],EmsMem
|
|
jz @f
|
|
call CheckEms
|
|
jc CheckMemErr
|
|
jmp short CheckMemEnd
|
|
@@:
|
|
test [MemStat],HiMem
|
|
jz @f
|
|
call CheckHimem
|
|
jc CheckMemErr
|
|
jmp short CheckMemEnd
|
|
@@:
|
|
test [MemStat],ExtMem
|
|
jz @f
|
|
call CheckExt
|
|
jc CheckMemErr
|
|
jmp short CheckMemEnd
|
|
@@:
|
|
test [MemStat],RealMem
|
|
jz CheckMemEnd
|
|
call CheckReal
|
|
jc CheckMemErr
|
|
CheckMemEnd:
|
|
ret
|
|
CheckMemErr:
|
|
and [MemStat],not (RealMem or ExtMem or EmsMem or HiMem)
|
|
ret
|
|
AutoMemory:
|
|
call CheckEms
|
|
jc @f
|
|
or [MemStat],EmsMem
|
|
jmp short AutoMemEnd
|
|
@@:
|
|
call CheckHimem
|
|
jc @f
|
|
or [MemStat],HiMem
|
|
jmp short AutoMemEnd
|
|
@@:
|
|
call CheckExt
|
|
jc @f
|
|
or [MemStat],ExtMem
|
|
jmp short AutoMemEnd
|
|
@@:
|
|
call CheckReal
|
|
jc CheckMemErr
|
|
or [MemStat],RealMem
|
|
AutoMemEnd:
|
|
ret
|
|
|
|
|
|
CheckEms:
|
|
push es
|
|
mov ax,3567h
|
|
int 21h
|
|
mov di,0ah
|
|
mov si,offset EmmDrvName
|
|
mov cx,EmmDrvNameLng
|
|
repe cmpsb
|
|
pop es
|
|
jnz @f
|
|
mov ah,46h ; get version
|
|
int 67h
|
|
or ah,ah
|
|
jnz @f
|
|
cmp al,30h ; version 3.0
|
|
jb @f
|
|
mov ah,41h ; get segment address
|
|
int 67h
|
|
or ah,ah
|
|
jnz @f
|
|
mov [EmsSeg],bx
|
|
mov ah,42h ; get page number
|
|
int 67h
|
|
or ah,ah
|
|
jnz @f
|
|
mov ax,16 ; kbyte units
|
|
mul bx
|
|
cmp [MemSize],ax
|
|
ja @f
|
|
mov [MaxMemSize],ax
|
|
clc
|
|
ret
|
|
@@:
|
|
stc
|
|
ret
|
|
EmmDrvName db 'EMMXXXX0'
|
|
EmmDrvNameLng = $-EmmDrvName
|
|
CheckHimem:
|
|
mov ax,4300h
|
|
int 2fh
|
|
cmp al,80h
|
|
jnz @f
|
|
push es
|
|
mov ax,4310h
|
|
int 2fh
|
|
mov ax,es
|
|
pop es
|
|
mov word ptr [OldInt15],bx
|
|
mov word ptr [OldInt15+2],ax
|
|
xor ah,ah
|
|
call [OldInt15]
|
|
cmp dl,1
|
|
jnz @f
|
|
cmp ax,200h ; V2.00
|
|
jb @f
|
|
mov ah,8
|
|
call [OldInt15]
|
|
or bl,bl
|
|
jnz @f
|
|
cmp [MemSize],ax
|
|
ja @f
|
|
mov [MaxMemSize],ax
|
|
clc
|
|
ret
|
|
@@:
|
|
stc
|
|
ret
|
|
CheckExt:
|
|
test [MachineType],AtMachine
|
|
jz @f
|
|
mov ah,88h
|
|
int 15h
|
|
cmp [MemSize],ax
|
|
ja @f
|
|
mov [MaxMemSize],ax
|
|
clc
|
|
ret
|
|
@@:
|
|
stc
|
|
ret
|
|
CheckReal:
|
|
int 12h
|
|
mov bx,cs
|
|
mov cl,6
|
|
shr bx,cl
|
|
sub ax,bx
|
|
sub ax,256 ; add 256 kbyte
|
|
cmp [MemSize],ax
|
|
ja @f
|
|
mov [MaxMemSize],ax
|
|
clc
|
|
ret
|
|
@@:
|
|
stc
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << SetVector >>
|
|
; FUNCTION = initialize vector table
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; SetVector(-/-)
|
|
; {
|
|
; Save ES;
|
|
; ES = 0;
|
|
; [OldKbInt] = ES:[rKbInt];
|
|
; [OldKbInt+2] = ES:[rKbInt+2];
|
|
; ES:[rKbInt] = Int9;
|
|
; ES:[rKbInt+2] = CS;
|
|
; [OldKbioInt] = ES:[rKbioInt];
|
|
; [OldKbioInt+2] = ES:[rKbioInt+2];
|
|
; ES:[rKbioInt] = Int16;
|
|
; ES:[rKbioInt+2] = CS;
|
|
; [OldRtcInt] = ES:[rRtcInt];
|
|
; [OldRtcInt+2] = ES:[rRtcInt+2];
|
|
; ES:[rRtcInt] = Int8;
|
|
; ES:[rRtcInt+2] = CS;
|
|
; [OldVideo] = ES:[rVideoInt];
|
|
; [OldVideo+2] = ES:[rVideoInt+2];
|
|
; ES:[rVideoInt] = Int10;
|
|
; ES:[rVideoInt+2] = CS;
|
|
; [OldVdParms] = ES:[rVdParm];
|
|
; [OldVdParms+2] = ES:[rVdParm+2];
|
|
; ES:[rVdParm] = VideoParms;
|
|
; ES:[rVdParm+2] = CS;
|
|
; if ([CodeStat] == ChabLoad)
|
|
; {
|
|
; [OldInt17] = ES:[rPrinter];
|
|
; [OldInt17+2] = ES:[rPrinter+2];
|
|
; ES:[rPrinter] = Int17;
|
|
; ES:[rPrinter+2] = CS;
|
|
; }
|
|
; Restore ES;
|
|
; }
|
|
;
|
|
SetVector:
|
|
cli
|
|
push es
|
|
xor ax,ax
|
|
mov es,ax
|
|
mov ax,word ptr es:[rKbInt]
|
|
mov bx,word ptr es:[rKbInt+2]
|
|
mov word ptr [OldKbInt],ax
|
|
mov word ptr [OldKbInt+2],bx
|
|
mov word ptr es:[rKbInt],offset Int9
|
|
mov word ptr es:[rKbInt+2],cs
|
|
mov ax,word ptr es:[rKbioInt]
|
|
mov bx,word ptr es:[rKbioInt+2]
|
|
mov word ptr [OldKbioInt],ax
|
|
mov word ptr [OldKbioInt+2],bx
|
|
mov word ptr es:[rKbioInt],offset Int16
|
|
mov word ptr es:[rKbioInt+2],cs
|
|
mov ax,word ptr es:[rRtcInt]
|
|
mov bx,word ptr es:[rRtcInt+2]
|
|
mov word ptr [OldRtcInt],ax
|
|
mov word ptr [OldRtcInt+2],bx
|
|
mov word ptr es:[rRtcInt],offset Int8
|
|
mov word ptr es:[rRtcInt+2],cs
|
|
if Hwin31Sw
|
|
mov ax,word ptr es:[rInt2f]
|
|
mov bx,word ptr es:[rInt2f+2]
|
|
mov word ptr [OldInt2f],ax
|
|
mov word ptr [OldInt2f+2],bx
|
|
mov word ptr es:[rInt2f],offset Int2f
|
|
mov word ptr es:[rInt2f+2],cs
|
|
endif ; Hwin31Sw
|
|
mov ax,word ptr es:[rVideoInt]
|
|
mov bx,word ptr es:[rVideoInt+2]
|
|
mov word ptr [OldVideo],ax
|
|
mov word ptr [OldVideo+2],bx
|
|
mov word ptr es:[rVideoInt],offset Int10
|
|
mov word ptr es:[rVideoInt+2],cs
|
|
mov ax,word ptr es:[rVdParm]
|
|
mov bx,word ptr es:[rVdParm+2]
|
|
mov word ptr [OldVdParms],ax
|
|
mov word ptr [OldVdParms+2],bx
|
|
mov word ptr es:[rVdParm],offset VideoParms
|
|
mov word ptr es:[rVdParm+2],cs
|
|
test [CodeStat],ChabLoad
|
|
jz @f
|
|
mov ax,word ptr es:[rPrinter]
|
|
mov bx,word ptr es:[rPrinter+2]
|
|
mov word ptr [OldInt17],ax
|
|
mov word ptr [OldInt17+2],bx
|
|
mov word ptr es:[rPrinter],offset Int17
|
|
mov word ptr es:[rPrinter+2],cs
|
|
@@:
|
|
pop es
|
|
sti
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------
|
|
; << InstallFontFile >>
|
|
; FUNCTION = 巩磊磊屈 拳老阑 EMS/Ext./HIMEM memory肺 汲摹窃
|
|
; INPUT : none
|
|
; OUTPUT : none
|
|
; PROTECT : SS, SP, DS, ES
|
|
;
|
|
; InstallFontFile(-/-)
|
|
; {
|
|
; }
|
|
;
|
|
InstallFontFile:
|
|
test [MemStat],HiMem
|
|
jz @f
|
|
mov ah,9
|
|
mov dx,[MemSize]
|
|
call [OldInt15]
|
|
dec ax
|
|
jnz HimemErr
|
|
mov [EmsHandle],dx
|
|
mov ah,0ch
|
|
call [OldInt15]
|
|
dec ax
|
|
jnz HimemErr
|
|
mov ax,bx
|
|
call InstallFontHi
|
|
jmp short InstallFileEnd
|
|
HimemErr:
|
|
or [ErrStat],FontLoadErr
|
|
and [MemStat],not HiMem
|
|
jmp short InstallFileEnd
|
|
@@:
|
|
test [MemStat],ExtMem
|
|
jz @f
|
|
call InstallFontExt
|
|
jmp short InstallFileEnd
|
|
@@:
|
|
test [MemStat],EmsMem
|
|
jz @f
|
|
call InstallFontEms
|
|
jmp short InstallFileEnd
|
|
@@:
|
|
test [MemStat],RealMem
|
|
jz InstallFileEnd
|
|
call InstallFontReal
|
|
InstallFileEnd:
|
|
ret
|
|
InstallFontExt:
|
|
mov dx,[MaxMemSize]
|
|
sub dx,[MemSize]
|
|
mov [MaxMemSize],dx
|
|
mov ax,1024
|
|
mul dx
|
|
add dl,10h ; 1MByte boundary
|
|
InstallFontHi:
|
|
mov bl,dl
|
|
test [MemStat],ExtMem
|
|
jz @f
|
|
push ds
|
|
push es
|
|
ASSUME DS:DATA
|
|
xor dx,dx
|
|
mov ds,dx
|
|
les di,[rCasetInt]
|
|
mov word ptr cs:[OldInt15],di
|
|
mov word ptr cs:[OldInt15+2],es
|
|
mov word ptr [rCasetInt],offset Int15Srv
|
|
mov word ptr [rCasetInt+2],cs
|
|
pop es
|
|
pop ds
|
|
ASSUME DS:CODE
|
|
@@:
|
|
test [HjStat],HjLoaded
|
|
jnz @f
|
|
mov [HanAddr],ax
|
|
mov [HanAddrH],bl
|
|
mov [GetHan1st],offset GetFontHanExt
|
|
mov [GetHan2nd],offset GetFontHanExt
|
|
mov dx,offset FontFileName
|
|
call SaveFontFile
|
|
or [HjStat],HjLoaded
|
|
add ax,61440 ; 32*94*64 = 192512
|
|
adc bl,2
|
|
@@:
|
|
mov [UdcAddr],ax ; 94*2*32 = 6016
|
|
mov [UdcAddrH],bl
|
|
mov [GetUdc1st],offset GetFontUdcExt
|
|
mov [GetUdc2nd],offset GetFontUdcExt
|
|
mov [PutUdc1st],offset PutFontUdcExt
|
|
mov [PutUdc2nd],offset PutFontUdcExt
|
|
or [HjStat],UdcArea
|
|
ret
|
|
SaveFontFile:
|
|
push ax
|
|
push bx
|
|
push cx
|
|
mov si,offset GdtDataTbl
|
|
mov [si].GdtDL,ax
|
|
mov [si].GdtDH,bl
|
|
mov ax,3d00h
|
|
int 21h
|
|
jc SaveFontFileErr
|
|
mov bx,ax ; copy handle
|
|
mov ax,4200h
|
|
xor cx,cx
|
|
mov dx,30h
|
|
int 21h ; set absolute file pointer
|
|
push ds
|
|
mov ax,cs
|
|
add ah,10h ; next segment
|
|
mov ds,ax
|
|
mov cl,4
|
|
shl ax,cl
|
|
mov cs:[si].GdtSL,ax
|
|
mov ax,ds
|
|
shr ah,cl
|
|
mov cs:[si].GdtSH,ah
|
|
@@:
|
|
xor dx,dx
|
|
mov cx,8000h
|
|
mov ah,3fh
|
|
int 21h
|
|
jc SaveFontFileErr2
|
|
mov cx,ax
|
|
jcxz @f
|
|
inc cx
|
|
shr cx,1 ; word count
|
|
push cx
|
|
mov ah,87h
|
|
int 15h
|
|
pop cx
|
|
shl cx,1
|
|
add cs:[si].GdtDL,cx
|
|
adc cs:[si].GdtDH,0
|
|
jmp short @b
|
|
SaveFontFileErr2:
|
|
or cs:[ErrStat],FontLoadErr
|
|
@@:
|
|
pop ds
|
|
mov ah,3eh
|
|
int 21h ; close handle
|
|
jmp short @f
|
|
SaveFontFileErr:
|
|
or [ErrStat],FontLoadErr
|
|
@@:
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
InstallFontEms:
|
|
mov bx,[MemSize]
|
|
mov cl,4
|
|
shr bx,cl
|
|
inc bx
|
|
mov ah,43h ; allocate page
|
|
int 67h
|
|
or ah,ah
|
|
jz @f
|
|
mov ah,45h ; close handle
|
|
int 67h
|
|
ret
|
|
@@:
|
|
mov [EmsHandle],dx
|
|
xor bl,bl
|
|
xor ax,ax
|
|
test [HjStat],HjLoaded
|
|
jnz @f
|
|
mov [HanAddr],ax
|
|
mov [HanAddrH],bl
|
|
mov [GetHan1st],offset GetFontHanEms
|
|
mov [GetHan2nd],offset GetFontHanEms
|
|
mov si,offset FontFileName
|
|
call SaveEmsFontFile
|
|
or [HjStat],HjLoaded
|
|
add ax,12288 ; 32*94*64 = 192512
|
|
add bl,11
|
|
cmp ax,16384
|
|
jb @f
|
|
sub ax,16384
|
|
inc bl
|
|
@@:
|
|
mov [UdcAddr],ax ; 94*2*32 = 6016
|
|
mov [UdcAddrH],bl
|
|
mov [GetUdc1st],offset GetFontUdcEms
|
|
mov [GetUdc2nd],offset GetFontUdcEms
|
|
mov [PutUdc1st],offset PutFontUdcEms
|
|
mov [PutUdc2nd],offset PutFontUdcEms
|
|
or [HjStat],UdcArea
|
|
ret
|
|
SaveEmsFontFile:
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push es
|
|
mov es,[EmsSeg]
|
|
mov di,ax
|
|
mov ax,4400h ; set page
|
|
xor bh,bh
|
|
mov [CurEmsPage],bx
|
|
mov dx,[EmsHandle]
|
|
int 67h
|
|
or ah,ah
|
|
jnz SaveEmsFontFileErr
|
|
mov dx,si
|
|
mov ax,3d00h
|
|
int 21h
|
|
jc SaveEmsFontFileErr
|
|
mov bx,ax ; BX = file handle
|
|
mov ax,4200h
|
|
xor cx,cx
|
|
mov dx,30h
|
|
int 21h ; set absolute file pointer
|
|
push ds
|
|
mov ax,cs
|
|
add ah,10h ; next segment
|
|
mov ds,ax
|
|
EmsSaveLoop:
|
|
xor dx,dx
|
|
mov cx,8000h
|
|
mov ah,3fh
|
|
int 21h
|
|
jc SaveEmsFontFileErr2
|
|
mov cx,ax
|
|
jcxz SaveEmsFontFileEnd2
|
|
xor si,si
|
|
@@:
|
|
cmp di,16384
|
|
jae IncEmsPage
|
|
movsb
|
|
dec cx
|
|
jz EmsSaveLoop
|
|
jmp short @b
|
|
IncEmsPage:
|
|
push bx
|
|
mov ax,4400h ; set page
|
|
inc cs:[CurEmsPage]
|
|
mov bx,cs:[CurEmsPage]
|
|
mov dx,cs:[EmsHandle]
|
|
int 67h
|
|
pop bx
|
|
or ah,ah
|
|
jnz SaveEmsFontFileErr2
|
|
xor di,di
|
|
jmp short @b
|
|
SaveEmsFontFileErr2:
|
|
or cs:[ErrStat],FontLoadErr
|
|
SaveEmsFontFileEnd2:
|
|
pop ds
|
|
mov ah,3eh
|
|
int 21h ; close handle
|
|
jmp short @f
|
|
SaveEmsFontFileErr:
|
|
or [ErrStat],FontLoadErr
|
|
@@:
|
|
pop es
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
InstallFontReal:
|
|
test [HjStat],HjLoaded
|
|
jnz @f
|
|
mov [GetHan1st],offset GetFontHanReal
|
|
mov [GetHan2nd],offset GetFontHanReal
|
|
@@:
|
|
mov [GetUdc1st],offset GetFontUdcReal
|
|
mov [GetUdc2nd],offset GetFontUdcReal
|
|
mov [PutUdc1st],offset PutFontUdcReal
|
|
mov [PutUdc2nd],offset PutFontUdcReal
|
|
or [HjStat],UdcArea
|
|
ret
|
|
|
|
public EndOfInit ; for .MAP file
|
|
EndOfInit label byte
|
|
|
|
CODE ENDS
|
|
END
|
|
|