Files
FCDOSrenew/source/fcrd.asm
2026-02-11 11:09:14 +08:00

818 lines
31 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;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