818 lines
31 KiB
NASM
818 lines
31 KiB
NASM
;FCRD.COM renew by Tarime Argus 2026-02-06 Ver. 1.0
|
||
;Compile with JWasm v2.20
|
||
;COMMAND: jwasmd -bin -Fo FCRD.COM fcrd.asm
|
||
.286
|
||
.model tiny
|
||
|
||
XMSDRVENTRY euq XMSDRVADDR_BX
|
||
|
||
getParameterandCheckXMS MACRO
|
||
PUSH BP
|
||
MOV BP,SP
|
||
MOV BL,01h
|
||
CMP BYTE PTR CS:[statXMSinstalled],01h
|
||
ENDM
|
||
callXMSReturn MACRO
|
||
MOV CS:[GUEST_statusXMS],BL
|
||
POP BP
|
||
RET
|
||
ENDM
|
||
|
||
.code
|
||
org 100h
|
||
start:
|
||
JMP prepareTSR
|
||
;org 0103h
|
||
originES DW 0x0000
|
||
ExtMemAddr DW 0000h
|
||
;
|
||
XMSDRVVERSION DW 0x0000
|
||
;0119h
|
||
XMSDRVADDR_BX DW 0x0000
|
||
XMSDRVADDR_ES DW 0x0000
|
||
;011Dh
|
||
statXMSinstalled DB 0x00 ;01=INSTALLED, 00=NOINSTALL
|
||
GUEST_statusXMS DB 0x00 ;01=BUSY?, 00=IDLE/Exited Normally, other=XMS Error Code
|
||
data11F DB 0x00
|
||
;------------------------------------
|
||
;org 120h
|
||
res00h DB 80 DUP(0x00)
|
||
res01h DB 80 DUP(0x01)
|
||
res02h DB 80 DUP(0x02)
|
||
res03h DB 80 DUP(0x03)
|
||
res04h DB 80 DUP(0x04)
|
||
res05h DB 80 DUP(0x05)
|
||
res06h DB 80 DUP(0x06)
|
||
res07h DB 80 DUP(0x07)
|
||
res08h DB 80 DUP(0x08)
|
||
res09h DB 80 DUP(0x09)
|
||
res0Ah DB 80 DUP(0x0A)
|
||
res0Bh DB 80 DUP(0x0B)
|
||
res0Ch DB 80 DUP(0x0C)
|
||
res0Dh DB 80 DUP(0x0D)
|
||
res0Eh DB 80 DUP(0x0E)
|
||
res0Fh DB 80 DUP(0x0F)
|
||
res41h DB 80 DUP(0x41)
|
||
resF0h DB 80 DUP(0xF0)
|
||
res00h DB 80 DUP(0x00)
|
||
res41F0h DW 125 DUP(0x41F0)
|
||
;0876:0100: E9C719 JMP 1ACA
|
||
;0876:0103: 0000 ADD [BX+SI],AL
|
||
;0876:0105: 0000 ADD [BX+SI],AL
|
||
;0876:0107: 0000 ADD [BX+SI],AL
|
||
;0876:0109: 0000 ADD [BX+SI],AL
|
||
;0876:010B: 0000 ADD [BX+SI],AL
|
||
;0876:010D: 0000 ADD [BX+SI],AL
|
||
;0876:010F: 0000 ADD [BX+SI],AL
|
||
;org 16B0h
|
||
res200h DB 32 DUP(0x00)
|
||
data00h DB 8 DUP(0x00)
|
||
;-u 16d0 1bcf
|
||
;0876:16D0: 0000 ADD [BX+SI],AL
|
||
;0876:16D2: 0000 ADD [BX+SI],AL
|
||
;0876:16D4: 0000 ADD [BX+SI],AL
|
||
;0876:16D6: 0000 ADD [BX+SI],AL
|
||
;----------------------------------------
|
||
;org 16d8h
|
||
Allocate_Extended_Memory PROC
|
||
PUSH BP
|
||
MOV BP,SP
|
||
MOV BL,01h
|
||
CMP BYTE PTR CS:[statXMSinstalled],01h
|
||
JNZ XMS_RETURN_1700h
|
||
NOP ;
|
||
NOP ;
|
||
MOV AH,09
|
||
MOV DX,[BP+04] ;get request MEM size in KByte.
|
||
CALL FAR16 CS:[XMSDRVADDR_BX]
|
||
OR AX,AX ;if AX=0000h, xms error happend.
|
||
JZ XMS_ERR_PROC_16FEh
|
||
NOP ;
|
||
NOP ;
|
||
MOV AX,DX ;save Allocated Memory Block Address
|
||
XOR BL,BL ;clean BL
|
||
JMP XMS_RETURN_1700h
|
||
NOP ;
|
||
XMS_ERR_PROC_16FEh:
|
||
XOR AX,AX ;clean AX
|
||
XMS_RETURN_1700h:
|
||
MOV CS:[GUEST_statusXMS],BL
|
||
POP BP
|
||
RET
|
||
Allocate_Extended_Memory ENDP
|
||
;0876:16D8: 55 PUSH BP
|
||
;0876:16D9: 8BEC MOV BP,SP
|
||
;0876:16DB: B301 MOV BL,01
|
||
;0876:16DD: 2E803E1D0101 CMP BYTE PTR CS:[011D],01
|
||
;0876:16E3: 751B JNZ 1700
|
||
;0876:16E5: 90 NOP
|
||
;0876:16E6: 90 NOP
|
||
;0876:16E7: B409 MOV AH,09
|
||
;0876:16E9: 8B5604 MOV DX,[BP+04]
|
||
;0876:16EC: 2EFF1E1901 CALL FAR16 CS:[0119]
|
||
;0876:16F1: 0BC0 OR AX,AX
|
||
;0876:16F3: 7409 JZ 16FE
|
||
;0876:16F5: 90 NOP
|
||
;0876:16F6: 90 NOP
|
||
;0876:16F7: 8BC2 MOV AX,DX
|
||
;0876:16F9: 32DB XOR BL,BL
|
||
;0876:16FB: EB03 JMP 1700
|
||
;0876:16FD: 90 NOP
|
||
;0876:16FE: 33C0 XOR AX,AX
|
||
;0876:1700: 2E881E1E01 MOV CS:[011E],BL
|
||
;0876:1705: 5D POP BP
|
||
;0876:1706: C3 RET
|
||
;--------------------------------------------------------
|
||
XMS_Free_Extended_Memory PROC
|
||
getParameterandCheckXMS
|
||
JNZ XMS_RETURN_1728h
|
||
NOP ;
|
||
NOP ;
|
||
MOV AH,0Ah
|
||
MOV DX,[BP+04] ;Handle to the allocated block which should be freed
|
||
CALL FAR16 CS:[XMSDRVENTRY]
|
||
OR AX,AX
|
||
JZ XMS_RETURN_1728h
|
||
NOP ;
|
||
NOP ;
|
||
XOR BL,BL
|
||
;0876:1707: 55 PUSH BP
|
||
;0876:1708: 8BEC MOV BP,SP
|
||
;0876:170A: B301 MOV BL,01
|
||
;0876:170C: 2E803E1D0101 CMP BYTE PTR CS:[011D],01
|
||
;0876:1712: 7514 JNZ 1728
|
||
;0876:1714: 90 NOP
|
||
;0876:1715: 90 NOP
|
||
;0876:1716: B40A MOV AH,0A
|
||
;0876:1718: 8B5604 MOV DX,[BP+04]
|
||
;0876:171B: 2EFF1E1901 CALL FAR16 CS:[0119]
|
||
;0876:1720: 0BC0 OR AX,AX
|
||
;0876:1722: 7404 JZ 1728
|
||
;0876:1724: 90 NOP
|
||
;0876:1725: 90 NOP
|
||
;0876:1726: 32DB XOR BL,BL
|
||
XMS_RETURN_1728h:
|
||
MOV AL,BL ;Retrun XMS Error Code
|
||
callXMSReturn
|
||
;0876:1728: 8AC3 MOV AL,BL
|
||
;0876:172A: 2E881E1E01 MOV CS:[011E],BL
|
||
;0876:172F: 5D POP BP
|
||
;0876:1730: C3 RET
|
||
;-------------------------------------
|
||
;0876:1731: 56 PUSH SI
|
||
;0876:1732: 1E PUSH DS
|
||
;0876:1733: 32E4 XOR AH,AH
|
||
;0876:1735: 2EA0AC18 MOV AL,CS:[18AC]
|
||
;0876:1739: 2EA30901 MOV CS:[0109],AX
|
||
;0876:173D: 2EC7060B010000 MOV WORD PTR CS:[010B],0000
|
||
;0876:1744: 2EA10501 MOV AX,CS:[0105]
|
||
;0876:1748: 2EA30D01 MOV CS:[010D],AX
|
||
;0876:174C: 2EA1D416 MOV AX,CS:[16D4]
|
||
;0876:1750: 2EA30F01 MOV CS:[010F],AX
|
||
;0876:1754: 2EA1D616 MOV AX,CS:[16D6]
|
||
;0876:1758: 2EA31101 MOV CS:[0111],AX
|
||
;0876:175C: 2EC70613010000 MOV WORD PTR CS:[0113],0000
|
||
;0876:1763: 2E8B36AA18 MOV SI,CS:[18AA]
|
||
;0876:1768: 2E89361501 MOV CS:[0115],SI
|
||
;0876:176D: 2E8C0E1701 MOV WORD PTR CS:[0117],CS
|
||
;0876:1772: B40B MOV AH,0B
|
||
;0876:1774: 8CCA MOV DX,CS
|
||
;0876:1776: 8EDA MOV DS,DX
|
||
;0876:1778: BE0901 MOV SI,0109
|
||
;0876:177B: 2EFF1E1901 CALL FAR16 CS:[0119]
|
||
;0876:1780: 1F POP DS
|
||
;0876:1781: 5E POP SI
|
||
;0876:1782: C3 RET
|
||
;----------
|
||
GUEST_Free_ExtMEM PROC
|
||
MOV AX,CS:[ExtMemAddr]
|
||
CMP AX,0000h
|
||
JZ RETURN_17A0
|
||
NOP
|
||
NOP
|
||
PUSH AX
|
||
CALL XMS_Free_Extended_Memory
|
||
POP BX
|
||
CMP AL,00h ;if AL=00h, XMS ERROR happend.
|
||
JNZ RETURN_17A0
|
||
NOP
|
||
NOP
|
||
MOV WORD PTR CS:[ExtMemAddr],0000h ;if ERROR happend, force clean addr
|
||
RETURN_17A0:
|
||
RET
|
||
ENDP
|
||
;0876:1783: 2EA10501 MOV AX,CS:[0105]
|
||
;0876:1787: 3D0000 CMP AX,0000
|
||
;0876:178A: 7414 JZ 17A0
|
||
;0876:178C: 90 NOP
|
||
;0876:178D: 90 NOP
|
||
;0876:178E: 50 PUSH AX
|
||
;0876:178F: E875FF CALL 1707
|
||
;0876:1792: 5B POP BX
|
||
;0876:1793: 3C00 CMP AL,00
|
||
;0876:1795: 7509 JNZ 17A0
|
||
;0876:1797: 90 NOP
|
||
;0876:1798: 90 NOP
|
||
;0876:1799: 2EC70605010000 MOV WORD PTR CS:[0105],0000
|
||
;0876:17A0: C3 RET
|
||
;-----------------------------------
|
||
Fn17A1:
|
||
;0876:17A1: B600 MOV DH,00
|
||
;0876:17A3: 2E8A14 MOV DL,CS:[SI]
|
||
;0876:17A6: 2E803EAC1810 CMP BYTE PTR CS:[18AC],10
|
||
;0876:17AC: 7432 JZ 17E0
|
||
;0876:17AE: 90 NOP
|
||
;0876:17AF: 90 NOP
|
||
;0876:17B0: 2E8A4401 MOV AL,CS:[SI+01]
|
||
;0876:17B4: B400 MOV AH,00
|
||
;0876:17B6: 81C25FFF ADD DX,FF5F
|
||
;0876:17BA: 6BD25E IMUL DX,DX,+5E
|
||
;0876:17BD: 03C2 ADD AX,DX
|
||
;0876:17BF: 055FFF ADD AX,FF5F
|
||
;0876:17C2: BB2000 MOV BX,0020
|
||
;0876:17C5: F7E3 MUL BX
|
||
;0876:17C7: 2E8916D616 MOV CS:[16D6],DX
|
||
;0876:17CC: 2EA3D416 MOV CS:[16D4],AX
|
||
;0876:17D0: 2E8106D4160010 ADD WORD PTR CS:[16D4],1000
|
||
;0876:17D7: 2E8316D61600 ADC WORD PTR CS:[16D6],+00
|
||
;0876:17DD: EB10 JMP 17EF
|
||
;0876:17DF: 90 NOP
|
||
;0876:17E0: C1E204 SHL DX,04
|
||
;0876:17E3: 2E8916D416 MOV CS:[16D4],DX
|
||
;0876:17E8: 2EC706D6160000 MOV WORD PTR CS:[16D6],0000
|
||
;0876:17EF: C3 RET
|
||
;0876:17F0: 57 PUSH DI
|
||
;0876:17F1: 56 PUSH SI
|
||
;0876:17F2: 53 PUSH BX
|
||
;0876:17F3: 2E8B3EAA18 MOV DI,CS:[18AA]
|
||
;0876:17F8: BEB016 MOV SI,16B0
|
||
;0876:17FB: BB0000 MOV BX,0000
|
||
;0876:17FE: 53 PUSH BX
|
||
;0876:17FF: D1E3 SHL BX,1
|
||
;0876:1801: 2E8A00 MOV AL,CS:[BX+SI]
|
||
;0876:1804: 2E8A6001 MOV AH,CS:[BX+SI+01]
|
||
;0876:1808: 5B POP BX
|
||
;0876:1809: 2E8801 MOV CS:[BX+DI],AL
|
||
;0876:180C: 2E886110 MOV CS:[BX+DI+10],AH
|
||
;0876:1810: 83FB0F CMP BX,+0F
|
||
;0876:1813: 7305 JAE 181A
|
||
;0876:1815: 90 NOP
|
||
;0876:1816: 90 NOP
|
||
;0876:1817: 43 INC BX
|
||
;0876:1818: EBE4 JMP 17FE
|
||
;0876:181A: 5B POP BX
|
||
;0876:181B: 5E POP SI
|
||
;0876:181C: 5F POP DI
|
||
;0876:181D: C3 RET
|
||
Fn181E:
|
||
MOV BYTE PTR CS:[18A9h],00
|
||
MOV AX,0120h
|
||
MOV CS:[18AAh],AX
|
||
MOV SI,0620h
|
||
MOV AL,CS:[18A9h]
|
||
XOR AH,AH
|
||
ADD SI,AX
|
||
MOV AX,0010h
|
||
CMP BYTE PTR CS:[SI+00A0h],00h
|
||
JNZ Fn1846
|
||
NOP
|
||
NOP
|
||
JMP Fn188F
|
||
|
||
;0876:181E: 2EC606A91800 MOV BYTE PTR CS:[18A9],00
|
||
;0876:1824: B82001 MOV AX,0120
|
||
;0876:1827: 2EA3AA18 MOV CS:[18AA],AX
|
||
Fn182B:
|
||
;0876:182B: BE2006 MOV SI,0620
|
||
;0876:182E: 2EA0A918 MOV AL,CS:[18A9]
|
||
;0876:1832: 32E4 XOR AH,AH
|
||
;0876:1834: 03F0 ADD SI,AX
|
||
;0876:1836: B81000 MOV AX,0010
|
||
;0876:1839: 2E80BCA00000 CMP BYTE PTR CS:[SI+00A0],00
|
||
;0876:183F: 7505 JNZ 1846
|
||
;0876:1841: 90 NOP
|
||
;0876:1842: 90 NOP
|
||
;0876:1843: EB4A JMP 188F
|
||
;0876:1845: 90 NOP
|
||
Fn1846:
|
||
;0876:1846: 2E8A84A000 MOV AL,CS:[SI+00A0]
|
||
;0876:184B: 2E8AA4A100 MOV AH,CS:[SI+00A1]
|
||
;0876:1850: 32E0 XOR AH,AL
|
||
;0876:1852: 7404 JZ 1858
|
||
;0876:1854: 90 NOP
|
||
;0876:1855: 90 NOP
|
||
;0876:1856: B001 MOV AL,01
|
||
;0876:1858: C0E004 SHL AL,04
|
||
;0876:185B: 2EA2AC18 MOV CS:[18AC],AL
|
||
;0876:185F: E83FFF CALL 17A1
|
||
;0876:1862: 2E803EAC1810 CMP BYTE PTR CS:[18AC],10
|
||
;0876:1868: 741C JZ 1886
|
||
;0876:186A: 90 NOP
|
||
;0876:186B: 90 NOP
|
||
;0876:186C: 2EFF36AA18 PUSH WORD PTR CS:[18AA]
|
||
;0876:1871: B8B016 MOV AX,16B0
|
||
;0876:1874: 2EA3AA18 MOV CS:[18AA],AX
|
||
;0876:1878: E8B6FE CALL 1731
|
||
;0876:187B: 2E8F06AA18 POP WORD PTR CS:[18AA]
|
||
;0876:1880: E86DFF CALL 17F0
|
||
;0876:1883: EB04 JMP 1889
|
||
;0876:1885: 90 NOP
|
||
;0876:1886: E8A8FE CALL 1731
|
||
;0876:1889: 2EA0AC18 MOV AL,CS:[18AC]
|
||
;0876:188D: B400 MOV AH,00
|
||
Fn188F:
|
||
;0876:188F: 2E0106AA18 ADD CS:[18AA],AX
|
||
;0876:1894: C0E804 SHR AL,04
|
||
;0876:1897: 2E0006A918 ADD CS:[18A9],AL
|
||
;0876:189C: 2E803EA91850 CMP BYTE PTR CS:[18A9],50
|
||
;0876:18A2: 7304 JAE 18A8
|
||
;0876:18A4: 90 NOP
|
||
;0876:18A5: 90 NOP
|
||
;0876:18A6: EB83 JMP 182B
|
||
RETURN_18A8:
|
||
RET
|
||
;0876:18A8: C3 RET
|
||
;------------------------------------------
|
||
data18A9 DB 00h
|
||
data18AA DW 0000h
|
||
data18AC DB 00h
|
||
;0876:18A9: 0000 ADD [BX+SI],AL
|
||
;0876:18AB: 0000 ADD [BX+SI],AL
|
||
;0876:18AD: 0000 ADD [BX+SI],AL
|
||
ISR81hEntry: ;interrupt service routine
|
||
PUSH DS ;push stack
|
||
PUSH ES
|
||
CMP AH,81h ;if AH!=81h jump to ISR_Return.
|
||
JNZ ISR_Return
|
||
CMP BYTE PTR CS:[statXMSinstalled],01h
|
||
JZ ISR_Return
|
||
CMP AL,03h
|
||
JNZ 18DAh
|
||
NOP ;
|
||
NOP ;
|
||
MOV BYTE PTR CS:[statXMSinstalled],01h
|
||
CALL Fn181E
|
||
|
||
;0876:18AF: 1E PUSH DS
|
||
;0876:18B0: 06 PUSH ES
|
||
;0876:18B1: 80FC81 CMP AH,81
|
||
;0876:18B4: 0F85C600 JNZ 197E
|
||
;0876:18B8: 2E803E1F0101 CMP BYTE PTR CS:[011F],01
|
||
;0876:18BE: 0F84BC00 JZ 197E
|
||
;0876:18C2: 3C03 CMP AL,03
|
||
;0876:18C4: 7514 JNZ 18DA
|
||
;0876:18C6: 90 NOP
|
||
;0876:18C7: 90 NOP
|
||
;0876:18C8: 2EC6061F0101 MOV BYTE PTR CS:[011F],01
|
||
;0876:18CE: E84DFF CALL 181E
|
||
;0876:18D1: 2EC6061F0100 MOV BYTE PTR CS:[011F],00
|
||
;0876:18D7: E9A400 JMP 197E
|
||
Fn18DA:
|
||
;0876:18DA: 3C00 CMP AL,00
|
||
;0876:18DC: 7507 JNZ 18E5
|
||
;0876:18DE: 90 NOP
|
||
;0876:18DF: 90 NOP
|
||
;0876:18E0: B081 MOV AL,81
|
||
;0876:18E2: E99900 JMP 197E
|
||
;0876:18E5: 3C01 CMP AL,01
|
||
;0876:18E7: 7544 JNZ 192D
|
||
;0876:18E9: 90 NOP
|
||
;0876:18EA: 90 NOP
|
||
;0876:18EB: B90A01 MOV CX,010A
|
||
;0876:18EE: E85301 CALL 1A44
|
||
;0876:18F1: 83FB00 CMP BX,+00
|
||
;0876:18F4: 7507 JNZ 18FD
|
||
;0876:18F6: 90 NOP
|
||
;0876:18F7: 90 NOP
|
||
;0876:18F8: B401 MOV AH,01
|
||
;0876:18FA: E98100 JMP 197E
|
||
;0876:18FD: 53 PUSH BX
|
||
;0876:18FE: 2EC606411A00 MOV BYTE PTR CS:[1A41],00
|
||
;0876:1904: E8F300 CALL 19FA
|
||
;0876:1907: 5B POP BX
|
||
;0876:1908: 2E803E411A00 CMP BYTE PTR CS:[1A41],00
|
||
;0876:190E: 7515 JNZ 1925
|
||
;0876:1910: 90 NOP
|
||
;0876:1911: 90 NOP
|
||
;0876:1912: B44A MOV AH,4A
|
||
;0876:1914: 8B1E421A MOV BX,[1A42]
|
||
;0876:1918: 2EFF360301 PUSH WORD PTR CS:[0103]
|
||
;0876:191D: 07 POP ES
|
||
;0876:191E: CD21 INT 21
|
||
;0876:1920: B400 MOV AH,00
|
||
;0876:1922: EB5A JMP 197E
|
||
;0876:1924: 90 NOP
|
||
;0876:1925: E85BFE CALL 1783
|
||
;0876:1928: B402 MOV AH,02
|
||
;0876:192A: EB52 JMP 197E
|
||
;0876:192C: 90 NOP
|
||
;0876:192D: 3C02 CMP AL,02
|
||
;0876:192F: 750F JNZ 1940
|
||
;0876:1931: 90 NOP
|
||
;0876:1932: 90 NOP
|
||
;0876:1933: E84DFE CALL 1783
|
||
;0876:1936: 07 POP ES
|
||
;0876:1937: 2EFF360301 PUSH WORD PTR CS:[0103]
|
||
;0876:193C: 07 POP ES
|
||
;0876:193D: EB40 JMP 197F
|
||
;0876:193F: 90 NOP
|
||
;0876:1940: 3C04 CMP AL,04
|
||
;0876:1942: 7510 JNZ 1954
|
||
;0876:1944: 90 NOP
|
||
;0876:1945: 90 NOP
|
||
;0876:1946: 07 POP ES
|
||
;0876:1947: 8CCB MOV BX,CS
|
||
;0876:1949: 8EC3 MOV ES,BX
|
||
;0876:194B: BB2006 MOV BX,0620
|
||
;0876:194E: B82001 MOV AX,0120
|
||
;0876:1951: EB2C JMP 197F
|
||
;0876:1953: 90 NOP
|
||
;0876:1954: 3C12 CMP AL,12
|
||
;0876:1956: 750A JNZ 1962
|
||
;0876:1958: 90 NOP
|
||
;0876:1959: 90 NOP
|
||
;0876:195A: 662EA11901 MOV EAX,CS:[0119]
|
||
;0876:195F: EB1D JMP 197E
|
||
;0876:1961: 90 NOP
|
||
;0876:1962: 3C10 CMP AL,10
|
||
;0876:1964: 750A JNZ 1970
|
||
;0876:1966: 90 NOP
|
||
;0876:1967: 90 NOP
|
||
;0876:1968: 51 PUSH CX
|
||
;0876:1969: E86CFD CALL 16D8
|
||
;0876:196C: 59 POP CX
|
||
;0876:196D: EB0F JMP 197E
|
||
;0876:196F: 90 NOP
|
||
;0876:1970: 3C11 CMP AL,11
|
||
;0876:1972: 750A JNZ 197E
|
||
;0876:1974: 90 NOP
|
||
;0876:1975: 90 NOP
|
||
;0876:1976: 53 PUSH BX
|
||
;0876:1977: E88DFD CALL 1707
|
||
;0876:197A: 5B POP BX
|
||
;0876:197B: EB01 JMP 197E
|
||
;0876:197D: 90 NOP
|
||
;-----------------------------------------
|
||
ISR_Return:
|
||
POP ES
|
||
POP DS
|
||
IRET
|
||
;0876:197E: 07 POP ES
|
||
;0876:197F: 1F POP DS
|
||
;0876:1980: CF IRET
|
||
;-----------------------------------------
|
||
;0876:1981: 0E PUSH CS
|
||
;0876:1982: 1F POP DS
|
||
;0876:1983: B43D MOV AH,3D
|
||
;0876:1985: B000 MOV AL,00
|
||
;0876:1987: CD21 INT 21
|
||
;0876:1989: 7267 JB 19F2
|
||
;0876:198B: 90 NOP
|
||
;0876:198C: 90 NOP
|
||
;0876:198D: 2EA33F1A MOV CS:[1A3F],AX
|
||
;0876:1991: 1E PUSH DS
|
||
;0876:1992: 06 PUSH ES
|
||
;0876:1993: B43F MOV AH,3F
|
||
;0876:1995: 2E8B1E3F1A MOV BX,CS:[1A3F]
|
||
;0876:199A: B90010 MOV CX,1000
|
||
;0876:199D: 0E PUSH CS
|
||
;0876:199E: 1F POP DS
|
||
;0876:199F: BA2001 MOV DX,0120
|
||
;0876:19A2: CD21 INT 21
|
||
;0876:19A4: 7237 JB 19DD
|
||
;0876:19A6: 90 NOP
|
||
;0876:19A7: 90 NOP
|
||
;0876:19A8: 3D0000 CMP AX,0000
|
||
;0876:19AB: 7437 JZ 19E4
|
||
;0876:19AD: 90 NOP
|
||
;0876:19AE: 90 NOP
|
||
;0876:19AF: 50 PUSH AX
|
||
;0876:19B0: BA0000 MOV DX,0000
|
||
;0876:19B3: 52 PUSH DX
|
||
;0876:19B4: 50 PUSH AX
|
||
;0876:19B5: 0E PUSH CS
|
||
;0876:19B6: BA2001 MOV DX,0120
|
||
;0876:19B9: 52 PUSH DX
|
||
;0876:19BA: 2EFF36D616 PUSH WORD PTR CS:[16D6]
|
||
;0876:19BF: 2EFF36D416 PUSH WORD PTR CS:[16D4]
|
||
;0876:19C4: 2EFF360501 PUSH WORD PTR CS:[0105]
|
||
;0876:19C9: E89000 CALL 1A5C
|
||
;0876:19CC: 83C40E ADD SP,+0E
|
||
;0876:19CF: 58 POP AX
|
||
;0876:19D0: 2E0106D416 ADD CS:[16D4],AX
|
||
;0876:19D5: 2E8316D61600 ADC WORD PTR CS:[16D6],+00
|
||
;0876:19DB: EBB6 JMP 1993
|
||
;0876:19DD: 2EC606411A01 MOV BYTE PTR CS:[1A41],01
|
||
;0876:19E3: 90 NOP
|
||
;0876:19E4: 07 POP ES
|
||
;0876:19E5: 1F POP DS
|
||
;0876:19E6: B43E MOV AH,3E
|
||
;0876:19E8: 2E8B1E3F1A MOV BX,CS:[1A3F]
|
||
;0876:19ED: CD21 INT 21
|
||
;0876:19EF: EB08 JMP 19F9
|
||
;0876:19F1: 90 NOP
|
||
;0876:19F2: 2EC606411A01 MOV BYTE PTR CS:[1A41],01
|
||
;0876:19F8: 90 NOP
|
||
;0876:19F9: C3 RET
|
||
;0876:19FA: 2EC706D4160000 MOV WORD PTR CS:[16D4],0000
|
||
;0876:1A01: 2EC706D6160000 MOV WORD PTR CS:[16D6],0000
|
||
;0876:1A08: BA2C1A MOV DX,1A2C
|
||
;0876:1A0B: E873FF CALL 1981
|
||
;0876:1A0E: 2E803E411A00 CMP BYTE PTR CS:[1A41],00
|
||
;0876:1A14: 7515 JNZ 1A2B
|
||
;0876:1A16: 90 NOP
|
||
;0876:1A17: 90 NOP
|
||
;0876:1A18: BA361A MOV DX,1A36
|
||
;0876:1A1B: E863FF CALL 1981
|
||
;0876:1A1E: 2E803E411A00 CMP BYTE PTR CS:[1A41],00
|
||
;0876:1A24: 7505 JNZ 1A2B
|
||
;0876:1A26: 90 NOP
|
||
;0876:1A27: 90 NOP
|
||
;0876:1A28: EB01 JMP 1A2B
|
||
;0876:1A2A: 90 NOP
|
||
;0876:1A2B: C3 RET
|
||
;---------------------------------------------------
|
||
;string
|
||
;org 1a2ch
|
||
GUEST_filename DB "asc16.fcz.hz16.fcz"
|
||
data1A3E DW 0x0000
|
||
data1A40 DW 0x0000
|
||
data1A42 DW 0x0000
|
||
;0876:1A2C: 61 POPA
|
||
;0876:1A2D: 7363 JAE 1A92
|
||
;0876:1A2F: 31362E66 XOR [662E],SI
|
||
;0876:1A33: 637A00 ARPL [BP+SI+00],DI
|
||
;0876:1A36: 687A31 PUSH 317A
|
||
;0876:1A39: 36 SEG SS (unused)
|
||
;0876:1A3A: 2E SEG CS (unused)
|
||
;0876:1A3B: 66 DB 66
|
||
;0876:1A3C: 637A00 ARPL [BP+SI+00],DI
|
||
;0876:1A3F: 0000 ADD [BX+SI],AL
|
||
;0876:1A41: 0000 ADD [BX+SI],AL
|
||
;=====wasted====================
|
||
;0876:1A43: 002E8B1E ADD [1E8B],CH
|
||
;0876:1A47: 050183 ADD AX,8301
|
||
;0876:1A4A: FB STI
|
||
;0876:1A4B: 00750D ADD [DI+0D],DH
|
||
;=====wasted====================
|
||
;0x1a44: 2E 8B 1E 05 01 mov bx, word ptr cs:[0x105]
|
||
;0x1a49: 83 FB 00 cmp bx, 0
|
||
;0x1a4c: 75 0D jne 0x1a5b
|
||
;0876:1A4E: 90 NOP
|
||
;0876:1A4F: 90 NOP
|
||
;0876:1A50: 51 PUSH CX
|
||
;0876:1A51: E884FC CALL 16D8
|
||
;0876:1A54: 59 POP CX
|
||
;0876:1A55: 8BD8 MOV BX,AX
|
||
;0876:1A57: 2EA30501 MOV CS:[0105],AX
|
||
;0876:1A5B: C3 RET
|
||
;0876:1A5C: 55 PUSH BP
|
||
;0876:1A5D: 8BEC MOV BP,SP
|
||
;0876:1A5F: 56 PUSH SI
|
||
;0876:1A60: 1E PUSH DS
|
||
;0876:1A61: B301 MOV BL,01
|
||
;0876:1A63: 2E803E1D0101 CMP BYTE PTR CS:[011D],01
|
||
;0876:1A69: 7554 JNZ 1ABF
|
||
;0876:1A6B: 90 NOP
|
||
;0876:1A6C: 90 NOP
|
||
;0876:1A6D: 8B4E0E MOV CX,[BP+0E]
|
||
;0876:1A70: 2E890E0901 MOV CS:[0109],CX
|
||
;0876:1A75: 8B4E10 MOV CX,[BP+10]
|
||
;0876:1A78: 2E890E0B01 MOV CS:[010B],CX
|
||
;0876:1A7D: 2EC7060D010000 MOV WORD PTR CS:[010D],0000
|
||
;0876:1A84: C4760A LES SI,[BP+0A]
|
||
;0876:1A87: 2E89360F01 MOV CS:[010F],SI
|
||
;0876:1A8C: 2E8C061101 MOV WORD PTR CS:[0111],ES
|
||
;0876:1A91: 8B4E04 MOV CX,[BP+04]
|
||
;0876:1A94: 2E890E1301 MOV CS:[0113],CX
|
||
;0876:1A99: 8B4E06 MOV CX,[BP+06]
|
||
;0876:1A9C: 2E890E1501 MOV CS:[0115],CX
|
||
;0876:1AA1: 8B4E08 MOV CX,[BP+08]
|
||
;0876:1AA4: 2E890E1701 MOV CS:[0117],CX
|
||
;0876:1AA9: B40B MOV AH,0B
|
||
;0876:1AAB: 8CCA MOV DX,CS
|
||
;0876:1AAD: 8EDA MOV DS,DX
|
||
;0876:1AAF: BE0901 MOV SI,0109
|
||
;0876:1AB2: 2EFF1E1901 CALL FAR16 CS:[0119]
|
||
;0876:1AB7: 0BC0 OR AX,AX
|
||
;0876:1AB9: 7404 JZ 1ABF
|
||
;0876:1ABB: 90 NOP
|
||
;0876:1ABC: 90 NOP
|
||
;0876:1ABD: 32DB XOR BL,BL
|
||
;0876:1ABF: 8AC3 MOV AL,BL
|
||
;0876:1AC1: 2E881E1E01 MOV CS:[011E],BL
|
||
;0876:1AC6: 1F POP DS
|
||
;0876:1AC7: 5E POP SI
|
||
;0876:1AC8: 5D POP BP
|
||
;0876:1AC9: C3 RET
|
||
;-------------------------------------------------
|
||
;abbove is stay residented part.
|
||
;-------------------------------------------------
|
||
prepareTSR:
|
||
MOV WORD PTR CS:[originES], ES
|
||
isINT81hVectorEmpty:
|
||
MOV AX, 0x3581
|
||
INT 0x21
|
||
MOV AX, ES
|
||
AND AX, BX ;check if INT81h is empty, jump to check XMS driver.
|
||
JZ checkXMSDRV
|
||
;0876:1ACA: 2E8C060301 MOV WORD PTR CS:[0103],ES
|
||
;0876:1ACF: B88135 MOV AX,3581
|
||
;0876:1AD2: CD21 INT 21
|
||
;0876:1AD4: 8CC0 MOV AX,ES
|
||
;0876:1AD6: 23C3 AND AX,BX
|
||
;0876:1AD8: 7413 JZ 1AED
|
||
;-------------------------------------------
|
||
;0876:1ADA: 90 NOP
|
||
;0876:1ADB: 90 NOP
|
||
NOP ;
|
||
NOP ;
|
||
MOV AX,0x8100 ;check if fcrd itself running
|
||
INT 0x81
|
||
CMP AL,0x81
|
||
JNZ checkXMSDRV
|
||
NOP ;
|
||
NOP ;
|
||
MOV DX,msgerr_RD_already_run
|
||
JMP printString
|
||
NOP ;
|
||
;0876:1ADC: B80081 MOV AX,8100
|
||
;0876:1ADF: CD81 INT 81
|
||
;0876:1AE1: 3C81 CMP AL,81
|
||
;0876:1AE3: 7508 JNZ 1AED
|
||
;0876:1AE5: 90 NOP
|
||
;0876:1AE6: 90 NOP
|
||
;0876:1AE7: BA931B MOV DX,1B93
|
||
;0876:1AEA: EB46 JMP 1B32
|
||
;0876:1AEC: 90 NOP
|
||
;---------------------------------------------
|
||
checkXMSDRV:
|
||
CALL isXMSDRVInstalled
|
||
OR AL, AL ;check return value, if AL=00h zf=1.
|
||
JNZ checkXMSVERandTSR ;if AL!=00h, XMS is installed.
|
||
;0876:1AED: E84B00
|
||
;0876:1AF0: 0AC0 OR AL,AL
|
||
;0876:1AF2: 7508 JNZ 1AFC
|
||
;---------------------------------------------
|
||
;0876:1AF4: 90 NOP
|
||
;0876:1AF5: 90 NOP
|
||
NOP ;
|
||
NOP ;
|
||
;------------------------------------------------
|
||
MOV DX, msgerr_XMS_not_found
|
||
JMP printString
|
||
;0876:1AF6: BAB21B MOV DX,1BB2
|
||
;0876:1AF9: EB37 JMP 1B32
|
||
;---------------------------------------------
|
||
;0876:1AFB: 90 NOP
|
||
NOP ;
|
||
;------------------------------------------------
|
||
checkXMSVERandTSR:
|
||
MOV AX, 0x0001
|
||
PUSH AX ;传参0001h至get_XMS_version
|
||
CALL GUEST_get_XMS_version
|
||
POP CX
|
||
MOV CS:[XMSDRVVERSION], AX
|
||
CLI ;关中断
|
||
MOV AX, 0x2581 ;设定中断向量地址:DS:DX
|
||
MOV DX, 0x18AF
|
||
INT 0x21
|
||
STI ;开中断
|
||
MOV ES, WORD PTR CS:[0x02C] ;获取环境块地址
|
||
MOV AH, 0x49 ;释放环境块
|
||
INT 0x21
|
||
MOV DX, 0x1981
|
||
SHR DX, 04
|
||
INC DX
|
||
MOV WORD PTR [data1A42], DX
|
||
MOV AX, 0x3100 ;Terminate program and stay resident
|
||
MOV DX, 0x1ACA ;calculate residented RAM size (1paragraph=16byte)
|
||
SHR DX, 04 ;(1ACA/16)+1=01AD
|
||
INC DX
|
||
INT 0x21 ;TSR Finished
|
||
;0876:1AFC: B80100 MOV AX,0001
|
||
;0876:1AFF: 50 PUSH AX
|
||
;0876:1B00: E86500 CALL 1B68
|
||
;0876:1B03: 59 POP CX
|
||
;0876:1B04: 2EA30701 MOV CS:[0107],AX
|
||
;0876:1B08: FA CLI
|
||
;0876:1B09: B88125 MOV AX,2581
|
||
;0876:1B0C: BAAF18 MOV DX,18AF
|
||
;0876:1B0F: CD21 INT 21
|
||
;0876:1B11: FB STI
|
||
;0876:1B12: 2E8E062C00 MOV ES,WORD PTR CS:[002C]
|
||
;0876:1B17: B449 MOV AH,49
|
||
;0876:1B19: CD21 INT 21
|
||
;0876:1B1B: BA8119 MOV DX,1981
|
||
;0876:1B1E: C1EA04 SHR DX,04
|
||
;0876:1B21: 42 INC DX
|
||
;0876:1B22: 8916421A MOV [1A42],DX
|
||
;0876:1B26: B80031 MOV AX,3100
|
||
;0876:1B29: BACA1A MOV DX,1ACA
|
||
;0876:1B2C: C1EA04 SHR DX,04
|
||
;0876:1B2F: 42 INC DX
|
||
;0876:1B30: CD21 INT 21
|
||
;-------------------------------------------
|
||
;输出字符串
|
||
printString:
|
||
MOV AH,09
|
||
INT 21
|
||
;0876:1B32: B409 MOV AH,09
|
||
;0876:1B34: CD21 INT 21
|
||
;-------------------------------------------
|
||
;退出程序
|
||
exitProg:
|
||
MOV AX, 0x4C00
|
||
INT 0x21
|
||
;0876:1B36: B8004C MOV AX,4C00
|
||
;0876:1B39: CD21 INT 21
|
||
;------------------------------------------------
|
||
isXMSDRVInstalled PROC
|
||
MOV BYTE PTR CS:[statXMSinstalled],0x00
|
||
MOV AX,0x4300 ;check Himem XMS driver install status
|
||
INT 0x2F ;DOS Multiplex Interrupt
|
||
CMP AL,0x80 ;if AL=80h, XMS installed
|
||
JZ get_XMSDRV_ADDR ;if XMS driver installed, get address, or exit.
|
||
;0876:1B3B: 2EC6061D0100 MOV BYTE PTR CS:[011D],00
|
||
;0876:1B41: B80043 MOV AX,4300 ;check Himem XMS driver install status
|
||
;0876:1B44: CD2F INT 2F ;DOS Multiplex Interrupt
|
||
;0876:1B46: 3C80 CMP AL,80 ;if AL=80h, XMS installed
|
||
;0876:1B48: 7407 JZ 1B51
|
||
;------------------------------------------------
|
||
;0876:1B4A: 90 NOP
|
||
;0876:1B4B: 90 NOP
|
||
NOP ;
|
||
NOP ;
|
||
;------------------------------------------------
|
||
noXMSDRVInstall:
|
||
MOV AL, 0x00 ;Set return AL=00h, no XMS driver installed.
|
||
JMP RETURN_1B67 ;noXMSDRVInstall
|
||
;0876:1B4C: B000 MOV AL,00
|
||
;0876:1B4E: EB17 JMP 1B67
|
||
;------------------------------------------------
|
||
;0876:1B50: 90 NOP
|
||
NOP ;
|
||
;-----------------------------------------------
|
||
get_XMSDRV_ADDR:
|
||
MOV AX, 0x4310 ;get XMS driver address
|
||
INT 0x2F ;return ES:BX
|
||
MOV CS:[XMSDRVADDR_BX], BX
|
||
MOV WORD PTR CS:[XMSDRVADDR_ES], ES
|
||
INC BYTE PTR CS:[statXMSinstalled]
|
||
MOV AL, 0x01 ;Set return AL=01h, XMS driver is installed.
|
||
RETURN_1B67:
|
||
RET
|
||
isXMSDRVInstalled ENDP
|
||
;0876:1B51: B81043 MOV AX,4310 ;get XMS driver address
|
||
;0876:1B54: CD2F INT 2F ;return ES:BX
|
||
;0876:1B56: 2E891E1901 MOV CS:[0119],BX
|
||
;0876:1B5B: 2E8C061B01 MOV WORD PTR CS:[011B],ES
|
||
;0876:1B60: 2EFE061D01 INC BYTE PTR CS:[011D]
|
||
;0876:1B65: B001 MOV AL,01
|
||
;0876:1B67: C3 RET
|
||
;-----------------------------------------------
|
||
GUEST_get_XMS_version PROC
|
||
PUSH BP
|
||
MOV BP, SP ;建立栈帧
|
||
MOV BYTE PTR CS:[GUEST_statusXMS],01
|
||
CMP BYTE PTR CS:[statXMSinstalled],01
|
||
JNZ RETURN_1B91
|
||
NOP ;
|
||
NOP ;
|
||
MOV AH, 0x00
|
||
CALL FAR16 CS:[XMSDRVADDR_BX]
|
||
MOV BYTE PTR [GUEST_statusXMS],0x00
|
||
CMP WORD PTR [BP+4],0x01 ;比较参数 ;也许!=01h时用于读取xms内部版本号
|
||
JZ RETURN_1B91
|
||
NOP ;
|
||
NOP ;
|
||
MOV AX, BX
|
||
RETURN_1B91:
|
||
POP BP
|
||
RET
|
||
ENDP
|
||
;0876:1B68: 55 PUSH BP
|
||
;0876:1B69: 8BEC MOV BP,SP
|
||
;0876:1B6B: 2EC6061E0101 MOV BYTE PTR CS:[011E],01
|
||
;0876:1B71: 2E803E1D0101 CMP BYTE PTR CS:[011D],01
|
||
;0876:1B77: 7518 JNZ 1B91
|
||
;0876:1B79: 90 NOP
|
||
;0876:1B7A: 90 NOP
|
||
;0876:1B7B: B400 MOV AH,00
|
||
;0876:1B7D: 2EFF1E1901 CALL FAR16 CS:[0119]
|
||
;0876:1B82: C6061E0100 MOV BYTE PTR [011E],00
|
||
;0876:1B87: 837E0401 CMP WORD PTR [BP+04],+01
|
||
;0876:1B8B: 7404 JZ 1B91
|
||
;0876:1B8D: 90 NOP
|
||
;0876:1B8E: 90 NOP
|
||
;0876:1B8F: 8BC3 MOV AX,BX
|
||
;0876:1B91: 5D POP BP
|
||
;0876:1B92: C3 RET
|
||
;----------------------------------------------
|
||
msgerr_RD_already_run DB "[FCRD.COM] has alreay run!", 13, 10, '$'
|
||
msgerr_XMS_not_found DB 13, 10, "XMS driver not found!", 13, 10,'$'
|
||
;0876:1B93: 0D 0A 5B 46 43 52 44 2E 43 4F 4D 5D 20 68 61 73
|
||
;0876:1BA3: 20 61 6C 72 65-61 79 20 72 75 6E 21 0D 0A 24 0D
|
||
;0876:1BB3: 0A 58 4D 53 20-64 72 69 76 65 72 20 6E 6F 74 20
|
||
;0876:1BC3: 66 6F 75 6E 64-21 0D 0A 24
|