📄 gfat16_p.asm
字号:
;////////////////// use by tos task
TURN_TO_REAL PROC FAR
cli
MOV AX,REAL_SEL
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV DS,AX
MOV SS,AX
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
DB 0EAH
DW OFFSET REAL_MODE
DW CODE
RET
TURN_TO_REAL ENDP
DISP_TOS_IN_TOS PROC FAR
; DISP 'COS'
MOV AH,24H;07 for white/black
mov al,43h
mov es:320,ax
mov al,4fh
mov es:322,ax
mov al,53h
mov es:324,ax
RET
; DISP 'COS'
DISP_TOS_IN_TOS ENDP
GINT21H PROC FAR
cli
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH ES
PUSH DS
CMP AH,4CH
JE GINT21H_4C
CMP AH,9
JE GINT21H_9
JNE GINT21H_END
GINT21H_4C:
POP DS
POP ES
POP SI
POP DX
POP CX
POP BX
db 0eah
dw COMEBACK_TO_TOS
dw ps_TO_TOS_SEL
GINT21H_9:
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV SI,DX
MOV DX,CX
MOV DH,0
PUSH DX
MOV CL,CH
MOV CH,0
MOV AX,CX
MOV CX,160
MUL CX
MOV BX,AX
POP DX
ADD BX,DX
ADD BX,DX
MOV AH,24H;07 for white/black
LGINT21H1: MOV AL,DS:[SI]
CMP AL,'$'
JE GINT21H_END
MOV ES:[BX],AX
ADD BX,2
INC SI
LOOP LGINT21H1
GINT21H_END:
POP DS
POP ES
POP SI
POP DX
POP CX
POP BX
IRETD
GINT21H ENDP
DISP2_16 PROC FAR
;in al code 2 using ah
;out ah:al:code 16
mov ah,al
shr ah,4
cmp ah,9
jle disp2_16_1
add ah,7
disp2_16_1: add ah,30h
and al,0fh
cmp al,9
jle disp2_16_2
add al,7
disp2_16_2: add al,30h
RET
DISP2_16 ENDP
;;;;;;;;;;;; file changed
DISP_AX PROC FAR
;in cx:position call inner tos_seg
PUSH DS
PUSH AX
PUSH BX
PUSH DX
MOV DX,V_TOS_DATA_SEL
MOV DS,DX
MOV BX,AX
mov al,BH
CALL DISP2_16
mov DS:V_DISP_AX,ah
mov DS:V_DISP_AX[1],al
MOV AL,BL
CALL DISP2_16
mov DS:V_DISP_AX[2],ah
mov DS:V_DISP_AX[3],al
mov DS:V_DISP_AX[4],'$'
MOV AH,9
MOV DX,OFFSET V_DISP_AX
INT 21H
POP DX
POP BX
POP AX
POP DS
RET
DISP_AX ENDP
DISP_EXT_AX PROC FAR
;in cx:position call out tos_seg
PUSH AX
PUSH BX
PUSH DX
MOV BX,AX
mov al,BH
db 9ah
dw DISP2_16
dw TOS_CODE_SEL
mov DS:t_string,ah
mov DS:t_string[1],al
MOV AL,BL
db 9ah
dw DISP2_16
dw TOS_CODE_SEL
mov DS:t_string[2],ah
mov DS:t_string[3],al
mov DS:t_string[4],'$'
MOV AH,9
MOV DX,OFFSET t_string
;add dx,16
INT 21H
POP DX
POP BX
POP AX
RET
DISP_EXT_AX ENDP
;*******************************FILE
EAX_STR PROC FAR
;in : eax ds:dx string_address
;out: ds:dx string_address use str3
; read cursor
PUSH EBX
PUSH ECX
PUSH EDX
PUSH SI
PUSH DI
PUSH DS
PUSH DX ;dest string_address
;EAX-->ds:dx ASCIIZ STRING
PUSH EAX ;remains
MOV SI,OFFSET STR3
MOV DS:[SI+13],0
MOV EBX,1000000000
PUSH EBX
DISP_EAX1: POP EBX
POP EAX
CMP EBX,10
JL DISP_EAX_END1
XOR EDX,EDX
DIV EBX
PUSH EDX ;next remains
DISP_EAX2: ADD AL,30H
MOV DS:[SI],AL
INC SI
MOV EAX,EBX
XOR EDX,EDX
MOV ECX,10
DIV ECX
PUSH EAX ; next diveder
JMP DISP_EAX1
DISP_EAX_END1:
ADD AL,30H
MOV DS:[SI],AL
;;;;;;; STR3: add ','-->dest address
MOV SI,OFFSET STR3
POP DI ;dest address
PUSH DI
MOV AL,DS:[SI]
MOV DS:[DI],AL
INC SI
INC DI
MOV BL,3
DISP_EAX_END2:
MOV AL,","
MOV DS:[DI],AL
INC DI
CLD
MOV CX,3
DISP_EAX_END3:
MOVSB
LOOP DISP_EAX_END3
DEC BL
CMP BL,0
JA DISP_EAX_END2
MOV DS:[DI],0
;;;;;;; STR3: add ',' -->dest address
;;;;;;; cut first'0' or ','
POP SI ;dest address
MOV CX,12
DISP_EAX_END4:
MOV AL,DS:[SI]
CMP AL,'0'
JE DISP_EAX_END5
CMP AL,','
JE DISP_EAX_END5
JMP DISP_EAX_END6
DISP_EAX_END5:
MOV AL,' '
MOV DS:[SI],AL
INC SI
LOOP DISP_EAX_END4
DISP_EAX_END6:
;;;;;;;STR2 cut first'0' or ','
POP DS
POP DI
POP SI
POP EDX
POP ECX
POP EBX
RET
EAX_STR ENDP
STRIPOS PROC FAR
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
PUSH CX
PUSH BP ;7
MOV BP,SP
MOV DI,WORD PTR [BP+24] ; 4 PARAMETER
MOV ES,WORD PTR [BP+22] ; str2
MOV SI,WORD PTR [BP+20]
MOV DS,WORD PTR [BP+18] ; str1
MOV AX,WORD PTR [BP+16]
MOV WORD PTR [BP+24],AX ;CS
MOV AX,WORD PTR [BP+14]
MOV WORD PTR [BP+22],AX ;IP
MOV AX,WORD PTR [BP]
MOV WORD PTR [BP+18],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PUSH GS
PUSH DI
PUSH DX
MOV DX,SI
CALL STRLEN ;get length of str1
MOV DX,V_TOS_DATA_SEL
MOV GS,DX
MOV GS:TTDW1,AX ;length of str1--->GS:TTDW1 ok
POP DX
;find str1 in str2
MOV WORD PTR GS:TTDW2,DI
; out loop
SICMP0: ; <-----------------------------------------
MOV DI,WORD PTR GS:TTDW2 ;|
MOV AH,ES:[DI]
CMP AH,0
JE SICMP_ERROR ;not found
MOV SI,WORD PTR [BP+20]
MOV CX,WORD PTR GS:TTDW1 ;length of str1
INC CX
; inner loop
SICMP1: ; <-----------------------------------------
MOV AL,DS:[SI]
CMP AL,0
JE SICMP_OK
MOV AH,ES:[DI]
CMP AH,0
JE SICMP_ERROR
; upper/lower
CMP AL,61H
JL SICMP11
CMP AL,7AH
JA SICMP11
SUB AL,20H
SICMP11:
CMP AH,61H
JL SICMP12
CMP AH,7AH
JA SICMP12
SUB AH,20H
; upper/lower
SICMP12: ;
CMP AL,AH ;al=str1 ah=str2
JE SICMP2
JMP SICMP22 ;to next position in str2
SICMP2:
INC SI
INC DI
LOOP SICMP1
SICMP22: INC WORD PTR GS:TTDW2
JMP SICMP0
SICMP_OK: ;end have found
MOV AX,WORD PTR GS:TTDW2
POP DI
SUB AX,DI ;str1'offset in str2
JMP SICMP_END
;;;;;;;;;;;
SICMP_ERROR:
MOV AX,65535
POP DI
SICMP_END:
POP GS
SICMP3: ;MOV WORD PTR [BP+4],AX ;OLD BP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
POP CX ;OLD BP
POP CX
POP DI ;AX = position of return
POP DI
POP SI
POP ES
POP DS
MOV SP,BP
MOV BP,WORD PTR [BP+4] ;OLD BP -7*2 of above
ADD SP,22
RET
STRIPOS ENDP
STRLEN PROC FAR
;in : ds:dx addr of string
PUSH DI
PUSH ES
PUSH CX
MOV DI,DX
MOV CX,DS
MOV ES,CX
MOV AL,0
MOV CX,0FFFFH
REPNE SCASB
MOV AX,DI
SUB AX,DX
DEC AX
POP CX
POP ES
POP DI
RET
STRLEN ENDP
DISP_COS_HEAD PROC FAR
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AH,7H ;COVER OLD "COS"
MOV AL,20H
MOV ES:320,AX
MOV ES:322,AX
MOV ES:324,AX
MOV CX,21
MOV AH,24H
MOV DI,0
MOV AL,20H
DISP_COS_HEAD0:
MOV ES:[DI],AX
INC DI
INC DI
LOOP DISP_COS_HEAD0
MOV SI,OFFSET COS_HEAD
MOV CX,37
DISP_COS_HEAD1:
MOV AL,DS:[SI]
MOV ES:[DI],AX
INC DI
INC DI
INC SI
LOOP DISP_COS_HEAD1
MOV CX,22
MOV AL,20H
DISP_COS_HEAD2:
MOV ES:[DI],AX
INC DI
INC DI
LOOP DISP_COS_HEAD2
; setup cursor
MOV BH,0
MOV DX,0000H
MOV AH,2
INT 80H
;; begin command line mode
;;;;;; display "C:\>"
; read cursor
MOV AH,03H
MOV BH,0
INT 80H
; set cursor
MOV AH,02H
MOV BH,0
INC DH
MOV DL,0
INT 80H
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV DX,OFFSET COS_FLAG
CALL STRDISP ;display "C:\>"
;;;;;;;;;;;;;;;;set "C:\" as current directory
RET
DISP_COS_HEAD ENDP
STRNCPY PROC FAR
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
PUSH CX
PUSH BP ;7
MOV BP,SP
MOV DI,WORD PTR [BP+26] ;5 PARAMETER
MOV ES,WORD PTR [BP+24]
MOV SI,WORD PTR [BP+22]
MOV DS,WORD PTR [BP+20]
MOV CX,WORD PTR [BP+18]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -