From 48d554843cbdc8a67f2d9c266fdccb06f04a9291 Mon Sep 17 00:00:00 2001 From: Tarime Argus <1425772591@qq.com> Date: Sun, 15 Feb 2026 07:18:01 +0800 Subject: [PATCH] add fnuction --- source/fcrd.asm | 166 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 159 insertions(+), 7 deletions(-) diff --git a/source/fcrd.asm b/source/fcrd.asm index 789d87a..b81d012 100644 --- a/source/fcrd.asm +++ b/source/fcrd.asm @@ -12,11 +12,18 @@ getParameterandCheckXMS MACRO MOV BL,01h CMP BYTE PTR CS:[statXMSinstalled],01h ENDM +;PUSH BP +;MOV BP,SP +;MOV BL,01 +;CMP BYTE PTR CS:[011D],01 callXMSReturn MACRO MOV CS:[GUEST_statusXMS],BL POP BP RET ENDM +;MOV CS:[011E],BL +;POP BP +;RET .code org 100h @@ -24,6 +31,7 @@ start: JMP prepareTSR ;org 0103h originES DW 0x0000 +;0105h ExtMemAddr DW 0000h ; XMSDRVVERSION DW 0x0000 @@ -32,10 +40,14 @@ XMSDRVADDR_BX DW 0x0000 XMSDRVADDR_ES DW 0x0000 ;011Dh statXMSinstalled DB 0x00 ;01=INSTALLED, 00=NOINSTALL +;011Eh GUEST_statusXMS DB 0x00 ;01=BUSY?, 00=IDLE/Exited Normally, other=XMS Error Code +;011Fh data11F DB 0x00 ;------------------------------------ ;org 120h +;fcz buffer +;asc16.fcz 120h-220h res00h DB 80 DUP(0x00) res01h DB 80 DUP(0x01) res02h DB 80 DUP(0x02) @@ -68,6 +80,9 @@ res41F0h DW 125 DUP(0x41F0) res200h DB 32 DUP(0x00) data00h DB 8 DUP(0x00) ;-u 16d0 1bcf +;16D4h +data16D4 DW 0000h +data16D6 DW 0000h ;0876:16D0: 0000 ADD [BX+SI],AL ;0876:16D2: 0000 ADD [BX+SI],AL ;0876:16D4: 0000 ADD [BX+SI],AL @@ -344,14 +359,16 @@ ISR81hEntry: ;interrupt service routine PUSH ES CMP AH,81h ;if AH!=81h jump to ISR_Return. JNZ ISR_Return - CMP BYTE PTR CS:[statXMSinstalled],01h + CMP BYTE PTR CS:[data11F],01h JZ ISR_Return CMP AL,03h - JNZ 18DAh + JNZ ISR00hselfCheck NOP ; NOP ; - MOV BYTE PTR CS:[statXMSinstalled],01h + MOV BYTE PTR CS:[data11F],01h CALL Fn181E + MOV BYTE PTR CS:[data11F],00h + JMP ISR_Return ;0876:18AF: 1E PUSH DS ;0876:18B0: 06 PUSH ES @@ -367,13 +384,34 @@ ISR81hEntry: ;interrupt service routine ;0876:18CE: E84DFF CALL 181E ;0876:18D1: 2EC6061F0100 MOV BYTE PTR CS:[011F],00 ;0876:18D7: E9A400 JMP 197E -Fn18DA: +ISR00hselfCheck: + CMP AL,00h ;功能00h,检查是否为fcrd驻留,应返回AL=81h。 + JNZ ISR01h + NOP ; + NOP ; + MOV AL,81h + JMP ISR_Return ;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 +;-------------------- +ISR01h: + CMP AL,01 + JNZ Fn192D + NOP + NOP + MOV CX,010Ah ;Allocated 10A KB ExtMem + CALL CheckandAllocatedExtMem + CMP BX, 00h + JNZ Fn18FD + NOP + NOP + MOV AH,01h ;if ExtAddr == 00h, return + JMP ISR_Return + ;0876:18E5: 3C01 CMP AL,01 ;0876:18E7: 7544 JNZ 192D ;0876:18E9: 90 NOP @@ -386,6 +424,23 @@ Fn18DA: ;0876:18F7: 90 NOP ;0876:18F8: B401 MOV AH,01 ;0876:18FA: E98100 JMP 197E +Fn18FD: + PUSH BX + MOV BYTE PTR CS:[1A41],00 + CALL Fn19FA + POP BX + CMP BYTE PTR CS:[1A41],00 + JNZ Fn1925 + NOP + NOP + MOV AH,4A + MOV BX,[1A42] + PUSH WORD PTR CS:[0103] + POP ES + INT 21 + MOV AH,00h + JMP ISR_Return + ;0876:18FD: 53 PUSH BX ;0876:18FE: 2EC606411A00 MOV BYTE PTR CS:[1A41],00 ;0876:1904: E8F300 CALL 19FA @@ -401,7 +456,9 @@ Fn18DA: ;0876:191E: CD21 INT 21 ;0876:1920: B400 MOV AH,00 ;0876:1922: EB5A JMP 197E + NOP ; ;0876:1924: 90 NOP +Fn1925: ;0876:1925: E85BFE CALL 1783 ;0876:1928: B402 MOV AH,02 ;0876:192A: EB52 JMP 197E @@ -461,6 +518,60 @@ ISR_Return: ;0876:197F: 1F POP DS ;0876:1980: CF IRET ;----------------------------------------- +Fn1981: + PUSH CS ;set cs=ds + POP DS + MOV AH,3Dh ;open file handle + MOV AL,00h ;read only + INT 21 + JB Fn19F2 ;if error happend CF=1, jump to Fn19F2. + NOP + NOP + MOV CS:[GUEST_filehandle],AX ;save file handle + PUSH DS + PUSH ES +Fn1993: + MOV AH,3F ;read file content + MOV BX,CS:[GUEST_filehandle] + MOV CX,1000 ;read 4096 Byte + PUSH CS + POP DS + MOV DX,0120 + INT 21 + JB Fn19DD ;if error happend CF=1, jump to Fn19DD. + NOP + NOP + CMP AX,0000 ;check if read EOF, End reading jump to 19e4 + JZ Fn19E4_EndReading + NOP + NOP + PUSH AX + MOV DX,0000 + PUSH DX + PUSH AX + PUSH CS + MOV DX,0120 + PUSH DX + PUSH WORD PTR CS:[16D6] + PUSH WORD PTR CS:[16D4] + PUSH WORD PTR CS:[0105] + CALL 1A5C + ADD SP,+0E + POP AX + ADD CS:[16D4],AX + ADC WORD PTR CS:[16D6],+00 + JMP Fn1993 +Fn19DD: ;Error Slove + MOV BYTE PTR CS:[data1A41],01 + NOP +Fn19E4_EndReading: + POP ES + POP DS + MOV AH,3E + MOV BX,CS:[GUEST_filehandle] + INT 21 + JMP RETURN_19F9 + NOP ;0876:1981: 0E PUSH CS ;0876:1982: 1F POP DS ;0876:1983: B43D MOV AH,3D @@ -511,9 +622,33 @@ ISR_Return: ;0876:19ED: CD21 INT 21 ;0876:19EF: EB08 JMP 19F9 ;0876:19F1: 90 NOP +Fn19F2: + MOV BYTE PTR CS:[data1A41],01h + NOP +RETURN_19F9: + RET ;0876:19F2: 2EC606411A01 MOV BYTE PTR CS:[1A41],01 ;0876:19F8: 90 NOP ;0876:19F9: C3 RET +Fn19FA: + MOV WORD PTR CS:[data16D4],0000h + MOV WORD PTR CS:[data16D6],0000h + MOV DX, filename_ASCII_FONTS ;file name asc16.fcz + CALL Fn1981 ;read file + CMP BYTE PTR CS:[data1A41],00h ; if !=00h error happend + JNZ RETURN_1A2B + NOP + NOP + MOV DX, filename_HANZI_FONTS ;file name hz16.fcz + CALL Fn1981 + CMP BYTE PTR CS:[data1A41],00h + JNZ RETURN_1A2B + NOP + NOP + JMP RETURN_1A2B + NOP +RETURN_1A2B: + 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 @@ -534,9 +669,12 @@ ISR_Return: ;--------------------------------------------------- ;string ;org 1a2ch -GUEST_filename DB "asc16.fcz.hz16.fcz" -data1A3E DW 0x0000 -data1A40 DW 0x0000 +filename_ASCII_FONTS DB "asc16.fcz", 00h +;1a36 +filename_HANZI_FONTS DB "hz16.fcz", 00h +;1A3F +GUEST_filehandle DW 0000h +data1A41 DB 00h ;fcz load status 01h=ERROR, 00=OK data1A42 DW 0x0000 ;0876:1A2C: 61 POPA ;0876:1A2D: 7363 JAE 1A92 @@ -555,6 +693,17 @@ data1A42 DW 0x0000 ;0876:1A4A: FB STI ;0876:1A4B: 00750D ADD [DI+0D],DH ;=====wasted==================== +CheckandAllcatedExtMem: + MOV BX, WORD PTR CS:[ExtMemAddr] + CMP BX, 0000h ;check XMS External Memory Address, if not empty, return. + JNZ RETURN_1A5B + NOP ; + NOP ; + PUSH CX ;pass the parameter + CALL Allocate_Extended_Memory + POP CX + MOV BX,AX ;save Allocated Memory Block Address + MOV CS:[ExtMemAddr],AX ;0x1a44: 2E 8B 1E 05 01 mov bx, word ptr cs:[0x105] ;0x1a49: 83 FB 00 cmp bx, 0 ;0x1a4c: 75 0D jne 0x1a5b @@ -565,7 +714,10 @@ data1A42 DW 0x0000 ;0876:1A54: 59 POP CX ;0876:1A55: 8BD8 MOV BX,AX ;0876:1A57: 2EA30501 MOV CS:[0105],AX +RETURN_1A5B: + RET ;0876:1A5B: C3 RET +;------------------ ;0876:1A5C: 55 PUSH BP ;0876:1A5D: 8BEC MOV BP,SP ;0876:1A5F: 56 PUSH SI