mirror of https://github.com/nmlgc/ReC98.git
324 lines
7.8 KiB
NASM
324 lines
7.8 KiB
NASM
; Hiper library
|
|
;
|
|
; Description:
|
|
; 起動した AT マシンの情報を得る。
|
|
;
|
|
; Procedures/Functions:
|
|
; int get_machine_at( void );
|
|
;
|
|
; Parameters:
|
|
;
|
|
; Returns:
|
|
; bit fedcba9876543210
|
|
; xxxxxxxx0x00xxxx : unknown machine
|
|
; xxxxxxxx0x01xxxx : PC/AT or compatible
|
|
; xxxxxxxx0x10xxxx : PC-9801
|
|
; xxxxxxxx0x11xxxx : unknown machine(ありえない)
|
|
; xxxxxxxx1x00xxxx : FM-R
|
|
; xxxxxxxx1x01xxxx : unknown machine(ありえない)
|
|
; xxxxxxxx1x10xxxx : unknown machine(ありえない)
|
|
; xxxxxxxx1x11xxxx : unknown machine(ありえない)
|
|
;
|
|
; bit fedcba9876543210 / bit 754 = 001 のとき
|
|
; xxxxxxxxxxxxxxx1 : English mode
|
|
; xxxxxxxxxxxx000x : PS/55
|
|
; xxxxxxxxxxxx001x : DOS/V
|
|
; xxxxxxxxxxxx010x : AX
|
|
; xxxxxxxxxxxx011x : J3100
|
|
; xxxxxxxxxxxx100x : DR-DOS
|
|
; xxxxxxxxxxxx101x : MS-DOS/V
|
|
; xxxxxxxxxxxx110x : (reserved)
|
|
; xxxxxxxxxxxx111x : (reserved)
|
|
; xxxxxxx0xxxxxxxx : ansi.sys なし
|
|
; xxxxxxx1xxxxxxxx : ansi.sys あり
|
|
; xxxxxx0xx0xxxxx0 : Japanese mode(no DOS/V EXTENSION /
|
|
; no SUPERDRIVERS(32) )
|
|
; xxxxxx0xx1xxxxx0 : Japanese mode(DOS/V EXTENSION)
|
|
; xxxxxx1xx0xxxxx0 : Japanese mode(SUPERDRIVERS(32))
|
|
; xxxxxx1xx1xxxxx0 : (reserved)(ありえない)
|
|
;
|
|
; Binding Target:
|
|
; Microsoft-C / Turbo-C
|
|
;
|
|
; Running Target:
|
|
; PC/AT
|
|
;
|
|
; Requiring Resources:
|
|
; CPU: 8086
|
|
;
|
|
; Notes:
|
|
;
|
|
; Compiler/Assembler:
|
|
; OPTASM 1.6
|
|
;
|
|
; Author:
|
|
; のろ(H.Maeda)
|
|
;
|
|
; Revision History:
|
|
; 93/12/23 Initial: Hiper.lib(getmachi.asm のソースは忘れよう)
|
|
; 93/12/30 AX、J3100 チェック完璧か。
|
|
; 94/02/13 DOS/V Extention/SuperDrivers の check 追加
|
|
; GET_MACHINE_AT -> GET_MACHINE_AT2 に。(暫定処置)
|
|
; 94/03/25 FM-R の check 追加
|
|
; GET_MACHINE_98 -> GET_MACHINE_982 に。(暫定処置)
|
|
; 94/07/10 ansi.sys install check 追加
|
|
; 94/12/21: [M0.23] getmaca2.asm 94-07-10 23:59:20 を改名して取り込み
|
|
; 95/ 2/24 [M0.22k] SuperDriversがint 15hで割り込み禁止してるのに対処
|
|
; 95/ 3/17 [M0.22k] NTでDR-DOSと認識してしまっていたので判定を変更。
|
|
; 同時にNovell DOSもDR-DOS扱い。
|
|
; 95/ 5/30 PC-DOS/V 6.30 の登場により V-TEXT CHECK が働かなくなって
|
|
; いたので改修。
|
|
; → 今までは DOSVEXTENSION で、DOS/V EXTENSION と
|
|
; SuperDrivers(32) を認識していたが、今回の改修で、
|
|
; 従来の DOSVEXTENTION を VTEXT とし、
|
|
; 両 V-TEXT driver をそれぞれ DOSVEXTENSION と SUPERDRIVES と
|
|
; して認識するように変更した。
|
|
|
|
; PC/AT 関係
|
|
|
|
; fedcba9876543210
|
|
FMR_AT EQU 0000000010000000b
|
|
PCAT EQU 0000000000010000b
|
|
PS55JP EQU 0000000000000000b or PCAT ; PS/55 日本語DOS
|
|
PS55US EQU 0000000000000001b or PCAT ; PS/55 英語DOS
|
|
DOSVJP EQU 0000000000000010b or PCAT ; DOS/V 日本語モード
|
|
DOSVUS EQU 0000000000000011b or PCAT ; DOS/V 英語モード
|
|
AXJP EQU 0000000000000100b or PCAT ; AX 日本語モード
|
|
AXUS EQU 0000000000000101b or PCAT ; AX 英語モード
|
|
J3100JP EQU 0000000000000110b or PCAT ; J3100 日本語モード
|
|
J3100US EQU 0000000000000111b or PCAT ; J3100 英語モード
|
|
DRDOSJP EQU 0000000000001000b or PCAT ; DR-DOS 日本語モード
|
|
DRDOSUS EQU 0000000000001001b or PCAT ; DR-DOS 英語モード
|
|
MSDOSVJ EQU 0000000000001010b or PCAT ; MS-DOS/V 日本語モード
|
|
MSDOSVU EQU 0000000000001011b or PCAT ; MS-DOS/V 英語モード
|
|
|
|
; fedcba9876543210
|
|
JAPAN EQU 0000000000000000b or PCAT ; 日本語
|
|
ENGLISH EQU 0000000000000001b or PCAT ; 英語
|
|
DOSVEX EQU 0000000001000000b ; DOS/V Extention
|
|
SUPERD EQU 0000001000000000b ; SUPERDRIVERS(32)
|
|
|
|
ANSISYS EQU 0000000100000000b or PCAT ; ANSI.SYS
|
|
|
|
func GET_MACHINE_AT ; get_machine_at() {
|
|
_call CHECK_MACHINE_FMR
|
|
jnz short @@NOT_FMR
|
|
mov AX,FMR_AT
|
|
jmp @@GET_AT_MACHINE_EXIT
|
|
@@NOT_FMR:
|
|
xor BX,BX
|
|
mov AX,4F01h
|
|
int 2Fh
|
|
|
|
or BX,BX ; BX が 0 なら
|
|
je short @@DOSV_OR_DRDOS_OR_AX ; DOS/V または DR-DOS または AX
|
|
|
|
; それ以外なら MS-DOS/V か J3100 かも
|
|
; J-3100 の check
|
|
|
|
push ds
|
|
mov ax,0f000h
|
|
mov ds,ax
|
|
mov al,byte ptr ds:[0e010h] ; F000:E010に、'T' が存在するか?
|
|
cmp al,'T' ; F000:E010 = 'TOSHIBA'
|
|
jne short @@MSDOSV
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov al,byte ptr ds:[04D0h]
|
|
not al
|
|
and al,00000001b ; english flag check
|
|
or al,J3100JP
|
|
xor ah,ah
|
|
pop ds
|
|
jmp @@GET_AT_MACHINE_EXIT
|
|
|
|
@@MSDOSV:
|
|
pop ds
|
|
@@MSDOS2:
|
|
mov bx,MSDOSVJ ; MS-DOS/V の日本語/英語 check は分からんが
|
|
jmp short @@CHK_DBCS ; きっと、 DOS/V と同じじゃろう(^_^;
|
|
|
|
@@DOSV_OR_DRDOS_OR_AX:
|
|
; AX mode の check
|
|
xor BX,BX
|
|
mov AX,5001h
|
|
int 10h
|
|
or BL,BL ; BL が 0 なら AX じゃない(DOS/V か DR-DOS)
|
|
je short @@DOSV_OR_DRDOS ; AX なら country code が入っている。
|
|
|
|
; AX の場合
|
|
|
|
mov AX,AXJP ; AX 日本語モード
|
|
cmp bx,0051h ; country code 081 なら skip
|
|
jnz @@ZUN1
|
|
jmp @@GET_AT_MACHINE_EXIT
|
|
|
|
@@ZUN1:
|
|
or ax,bx ; country code 01 なら or して English モード
|
|
jmp @@GET_AT_MACHINE_EXIT
|
|
|
|
@@DOSV_OR_DRDOS:
|
|
; DR-DOS の check
|
|
mov ax,3000h
|
|
int 21h
|
|
cmp bh,0ffh
|
|
je @@MSDOS2 ; 0ffh=Microsoft
|
|
and bh,not 1 ; 0eeh=DR-DOS, 0efh=Novell DOS
|
|
cmp bh,0eeh
|
|
jne short @@DOSV
|
|
mov dl,DRDOSJP ; DR DOS 英語
|
|
jmp short @@CHK_DBCS
|
|
|
|
@@DOSV: ; DOS/V or PS/55
|
|
mov ax,4900h
|
|
pushf
|
|
int 15h ; BIOS タイプの取得
|
|
sbb AX,AX
|
|
popf
|
|
test AX,AX
|
|
jz @@ZUN2
|
|
jmp @@NOT_DOSV
|
|
|
|
@@ZUN2:
|
|
or bl,bl
|
|
jz @@ZUN3
|
|
jmp @@NOT_DOSV
|
|
|
|
@@ZUN3:
|
|
mov bx,DOSVJP ; set DOS/V
|
|
|
|
; DOS/V の check
|
|
@@CHK_DBCS:
|
|
push ds
|
|
push si
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov ax,6300h ; get DBCS vector
|
|
int 21h
|
|
mov ax,ds:[si] ; 日本語なら not 0
|
|
not ax
|
|
and ax,01h
|
|
or bx,ax ; bx = get_video_mode
|
|
pop si
|
|
pop ds
|
|
|
|
|
|
; DOS/V EXTENTION CHECK by のろ @95.05.28 ここから
|
|
|
|
pushf
|
|
push BX
|
|
mov AX,5010h ; DOS/V EXTENTION の存在check
|
|
int 15H
|
|
cmp AH,86h
|
|
jnz @@SUPPORTED
|
|
xor AX,AX ; AX=0000(not support)
|
|
jmp short @@NOT_SUPPORT
|
|
@@SUPPORTED:
|
|
mov AX,ES:[BX+02h] ; AX=0000(no Ext.) =0001(Ext.)
|
|
and AX,01
|
|
@@NOT_SUPPORT:
|
|
pop BX
|
|
popf ; DOSVEX=AX=0000:0000:0100:0000
|
|
jc short @@EXIST_CHK_SD ; C 8 4 0
|
|
; AX=0000:0000:0000:0001
|
|
ror AL,1 ; AX=0000:0000:1000:0000
|
|
ror AL,1 ; AX=0000:0000:0100:0000
|
|
or AX,BX ; AX = get_viodeo_mode
|
|
test AX,DOSVEX ; DOS/V Extention?
|
|
je short @@EXIST_CHK_SD ; go NO DOS/V EXTENSION
|
|
|
|
; DOS BOX CHECK by のろ
|
|
; DOS BOX では、EXTENSION があるように
|
|
; 見えるみたいなので、その対処。
|
|
mov BX,AX
|
|
mov DX,offset IBMADSP ; V-Text device name
|
|
mov AX,3D00h ; '$IBMADSP'
|
|
int 21h ; open device
|
|
jnc short @@EXIST_IBMADSP
|
|
xor BX,DOSVEX ; reset DOX/V EXTENSION
|
|
mov AX,BX
|
|
jmp short @@GET_AT_MACHINE_EXIT
|
|
@@EXIST_IBMADSP:
|
|
push BX
|
|
mov BX,AX
|
|
mov AH,3Eh
|
|
int 21h ;close device
|
|
pop BX
|
|
mov AX,BX
|
|
jmp short @@GET_AT_MACHINE_EXIT
|
|
|
|
; SUPERDRIVERS(32) CHECK
|
|
@@EXIST_CHK_SD:
|
|
|
|
push BX
|
|
mov DX,offset IBMAFNT ; V-Text device name
|
|
mov AX,3D00h ; '$IBMAFNT'
|
|
int 21h ; open device
|
|
jc @@ERR_EXIT_SD ; Error(=SuperDrivers)
|
|
|
|
push AX
|
|
mov DX,offset EXENTRY ; API Entry address
|
|
mov CX,04
|
|
mov BX,AX
|
|
mov AX,4402h
|
|
int 21h ; IOCTL read
|
|
pop AX
|
|
|
|
pushf
|
|
mov BX,AX
|
|
mov AH,3Eh
|
|
int 21h ;close device
|
|
popf
|
|
|
|
jc @@ERR_EXIT_SD
|
|
|
|
mov AX,50f1h
|
|
call EXENTRY
|
|
or AH,AH
|
|
jnz short @@ERR_EXIT_SD
|
|
pop BX
|
|
or BX,SUPERD ; or SUPERDRIVERS(32)
|
|
mov AX,BX
|
|
jmp short @@GET_AT_MACHINE_EXIT
|
|
|
|
@@ERR_EXIT_SD:
|
|
pop BX
|
|
mov AX,BX
|
|
jmp short @@GET_AT_MACHINE_EXIT
|
|
|
|
; @95.05.28 ここまで
|
|
|
|
; PS/55 の check
|
|
@@NOT_DOSV:
|
|
push ds
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov ax,ds:[7Dh*4] ; INT 7Dh の使用のチェック
|
|
or ax,ds:[7Dh*4+2]
|
|
pop ds
|
|
|
|
mov ax,PS55JP ; JDOS 日本語モード
|
|
jnz short @@GET_AT_MACHINE_EXIT
|
|
mov ax,PS55US ; PC-DOS
|
|
|
|
@@GET_AT_MACHINE_EXIT:
|
|
mov DX,AX ; dx に待避
|
|
|
|
; ansi.sys の check
|
|
|
|
mov AX,01a00h ; ansi.sys の ID
|
|
xor BX,BX
|
|
xor CX,CX
|
|
int 2Fh ; AL = 0ffh なら ansi.sys あり
|
|
mov AH,AL ; AX = 0ffffh なら ansi.sys あり
|
|
cmp AX,0ffffh
|
|
jne short @@NOT_ANSI_SYS
|
|
and AX,ANSISYS
|
|
or DX,AX
|
|
@@NOT_ANSI_SYS:
|
|
mov Machine_State,DX
|
|
mov AX,DX
|
|
; Hack (jmp GET_MACHINE_DOSBOX)
|
|
db 0e9h, 001h, 000h
|
|
endfunc ; }
|