📄 v86_used.asm
字号:
COS_INT08 PROC FAR
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
PUSH GS
PUSH FS
PUSH ES
PUSH DS
MOV EAX,ESP
ADD EAX,36
PUSH EAX ;ESP
PUSH SS ;ss
PUSH ESI
PUSH EDI
PUSH EBP
MOV AX,V86_DATA_GDT_SEL
MOV FS,AX
DEC BYTE PTR FS:[TIME_COUNT]
MOV AL,0
CMP BYTE PTR FS:[TIME_COUNT],AL
JNZ INT08_11
; display time
MOV BYTE PTR FS:[TIME_COUNT],18
MOV BX,OFFSET COS_TIME
ADD BX,7
INC BYTE PTR FS:[BX]
CMP BYTE PTR FS:[BX],3AH ;SECOND 1
JNZ INT08_2
MOV BYTE PTR FS:[BX],30H
DEC BX
INC BYTE PTR FS:[BX]
CMP BYTE PTR FS:[BX],36H ;SECOND 10
JNZ INT08_2
MOV BYTE PTR FS:[BX],30H
DEC BX
DEC BX
INC BYTE PTR FS:[BX]
;
CMP BYTE PTR FS:[BX],3AH ;MONUTE 1
JNZ INT08_2
MOV BYTE PTR FS:[BX],30H
DEC BX
INC BYTE PTR FS:[BX]
CMP BYTE PTR FS:[BX],36H ;MINUTE 10
JNZ INT08_2
MOV BYTE PTR FS:[BX],30H
DEC BX
DEC BX
INC BYTE PTR FS:[BX]
;
CMP WORD PTR FS:[BX-1],3234H ;HOUR 24
JNZ INT08_3
MOV WORD PTR FS:[BX-1],3030H
JMP INT08_2
INT08_3: CMP WORD PTR FS:[BX],3AH ;HOUR 1
JNZ INT08_2
MOV BYTE PTR FS:[BX],30H
DEC BX
INC BYTE PTR FS:[BX]
INT08_2:
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AH,41H
MOV BX,OFFSET COS_TIME
MOV AL,BYTE PTR FS:[BX] ;HOUR10
MOV WORD PTR ES:[3982],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;HOUR10
MOV WORD PTR ES:[3984],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;:
MOV WORD PTR ES:[3986],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;MINUTE10
MOV WORD PTR ES:[3988],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;MINUTE1
MOV WORD PTR ES:[3990],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;:
MOV WORD PTR ES:[3992],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;SECOND10
MOV WORD PTR ES:[3994],AX
INC BX
MOV AL,BYTE PTR FS:[BX] ;SECOND1
MOV WORD PTR ES:[3996],AX
; display time
INT08_1:
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
CMP BYTE PTR DS:[NEED_RESCHED],1
JNZ INT08_11
;jmp int08_11
;;;;;;1. save to TSS of PCB
MOV AX,V_PCB_SEL
MOV FS,AX
MOV EBP,DS:[CURRENT]
;mov eax,ebp
;call disp_ax
; next for return to the procedure of before time_interrupt
POP EAX ;EBP
MOV FS:[EBP+138+60],EAX
POP EAX ;EDI
MOV FS:[EBP+138+68],EAX
POP EAX ;ESI
MOV FS:[EBP+138+64],EAX
POP AX ;;;;;;;;;;;;;;;;;;;;;;;;SS
MOV FS:[EBP+138+80],EAX
POP EAX ;;;;;;;;;;;;;;;;;;;;;;;;ESP
MOV FS:[EBP+138+56],EAX
POP AX ;DS
MOV FS:[EBP+138+84],AX
POP AX ;ES
MOV FS:[EBP+138+72],AX
POP AX ;FS
MOV FS:[EBP+138+88],AX
POP AX ;GS
MOV FS:[EBP+138+92],AX
POP EDX
MOV FS:[EBP+138+48],EDX
POP ECX
MOV FS:[EBP+138+44],ECX
POP EBX
MOV FS:[EBP+138+52],EBX
POP EAX
MOV FS:[EBP+138+40],EAX
POP EAX
MOV FS:[EBP+138+32],EAX ;EIP
POP EAX
MOV FS:[EBP+138+76],EAX ;CS
POP EAX
MOV FS:[EBP+138+36],EAX ;EFLAG
;;;;;;1. save to TSS of PCB
MOV AL,20H
OUT 20H,AL
MOV AX,V_TOS_CODE_SEL ;turn to schedule
MOVZX EAX,AX
PUSH EAX
MOV EAX,OFFSET SCHED
PUSH EAX
RETD
INT08_11:
POP EBP
POP EDI
POP ESI
POP SS
POP EAX ;ESP ;pop ss&esp:error
POP AX ;DS
POP ES
POP FS
POP GS
POP EDX
POP ECX
POP EBX
MOV AL,20H
OUT 20H,AL
POP EAX
IRETD
COS_INT08 ENDP
COS_TIME_INIT PROC FAR
PUSH FS
MOV AX,V86_DATA_GDT_SEL
MOV FS,AX
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AH,02H
INT 8AH
MOV BX,OFFSET COS_TIME
MOV AH,41H
MOV AL,DH
AND AL,00001111B
ADD AL,30H
MOV BYTE PTR FS:[BX+7],AL
MOV AL,DH
SHR AL,4
ADD AL,30H
MOV BYTE PTR FS:[BX+6],AL
MOV AL,CL
AND AL,00001111B
ADD AL,30H
MOV BYTE PTR FS:[BX+4],AL
MOV AL,CL
SHR AL,4
ADD AL,30H
MOV BYTE PTR FS:[BX+3],AL
MOV AL,CH
AND AL,00001111B
ADD AL,30H
MOV BYTE PTR FS:[BX+1],AL
MOV AL,CH
SHR AL,4
ADD AL,30H
MOV BYTE PTR FS:[BX],AL
POP FS
RET
COS_TIME_INIT ENDP
COS_DOSINT PROC FAR
; 10H02/03 13H02/03 16H10 21H09 21H0A
COS_DOSINT10:
PUSH EBP
MOV BP,10H ;interrupt number
JMP DO_DOSINTX
COS_DOSINT13:
PUSH EBP
MOV BP,13H ;interrupt number
JMP DO_DOSINTX
COS_DOSINT16:
PUSH EBP
MOV BP,16H ;interrupt number read 1 charater
JMP DO_DOSINTX
COS_DOSINT1A:
PUSH EBP
MOV BP,1AH ;interrupt number REAL TIMER
JMP DO_DOSINTX
COS_DOSINT21:
PUSH EBP
MOV BP,21H
JMP DO_DOSINTX
DO_DOSINTX:
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
PUSH ESI
PUSH EDI
PUSH DS ;ADD
PUSH ES ;ADD
PUSH FS ;ADD
PUSH GS
PUSH AX
MOV AX,V86_DATA_GDT_SEL
MOV GS,AX
POP AX
MOV GS:G_INT,BP
MOV GS:V86_AX,AX
MOV GS:V86_BX,BX
MOV GS:V86_CX,CX
MOV GS:V86_DX,DX
MOV GS:V86_ES,ES
MOV GS:V86_DS,DS
CMP BP,13H
JE BIOS13H
CMP BP,16H
JE BIOS16H
CMP BP,21H
JE DOS21H
JMP COSINT_A ;10H,1AH NOTHING TO DO
BIOS13H: CMP AH,03H ;13H02 NOTHING TO DO
JE BIOS13H03
JMP COSINT_A
BIOS13H03: JMP COSINT_A
BIOS16H: CMP AH,00H ;16H00 NOTHING TO DO
JE BIOS16H00
JMP COSINT_A
BIOS16H00: JMP COSINT_A
DOS21H: CMP AH,09H
JE DOS21H09
CMP AH,4CH
JE DOS21H4C
CMP AH,4EH
JE DOS21H4E
JMP COSINT_A ;21H0A NOTHING TO DO
DOS21H09:
MOV SI,DX
XOR DI,DI
DOS21H09_1: MOV AH,DS:[SI]
MOV GS:V86_BUFFER[DI],AH
CMP AH,24H
JE DOS21H09_END
INC SI
INC DI
CMP DI,4096 ;int 09H one time 4096 bytes
JL DOS21H09_1
DOS21H09_END:
MOV AH,24H
MOV GS:V86_BUFFER[4096],AH
MOV CX,DI
MOV GS:V86_CX,CX ;len of string
JMP COSINT_A
;*******************************enter TO V86 TASK
;*******************************enter TO V86 TASK
COSINT_A:
; FOLLOWS:INITIAL
MOV AX,V86TSS_ASDATA_SEL
MOV DS,AX
MOV DS:[4],V86_STACK0LEN
MOV DS:[32],V86BEGIN
MOV DS:[36],3000H
MOV DS:[38],2
MOV DS:[56],V86_STACK3LEN
MOV DS:[60],0
MOV DS:[76],V86CODESEG
MOV DS:[80],V86_STACK3SEG
MOV DS:[84],V86_DATASEG
MOV AX,V86_DATA_GDT_SEL
MOV DS,AX
SLDT DS:CURRENT_LDT
STR DS:CURRENT_TR
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,SS
MOV DS:CURRENT_SS,AX
LIDT FWORD PTR DS:V86_IDTSIZE
MOV BX,V86LDT_SEL
LLDT BX
PUSH ES
PUSH FS
MOV AX,REAL_SEL
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV DS,AX
MOV SS,AX
jmp COSINT_A_jmp
COSINT_A_jmp:
DB 0EAH ;CALL=9AH ;JMP=0EAH ;
DW 0;V86BEGIN
DW V86TSS_SEL
FROM_V86:
MOV AX,V_TOS_DATA_SEL
MOV DS,AX
MOV AX,DS:CURRENT_SS
MOV SS,AX
LIDT FWORD PTR DS:IDTSIZE
POP FS
POP ES
; push gs
; mov ebx,01fffffh
;df123:
; MOV AX,G_VRAM_SEL
; MOV gS,AX
; MOV AL,'-'
; MOV AH,41H
; MOV WORD PTR gS:[804],AX
; dec ebx
; jnz df123
; pop gs
; test
MOV AX,V86_DATA_GDT_SEL ;END_DEAL
MOV GS,AX
MOV AX,GS:G_INT
CMP AX,10H
JE G10H_END
CMP AX,13H
JE G13H_END
CMP AX,16H
JE G16H_END
CMP AX,1AH
JE G1AH_END
CMP AX,21H
JE G21H_END
JMP COS_DOSINT_END
G10H_END: MOV AX,GS:V86_AX
CMP AH,03H
JE G10H03_END
JMP COS_DOSINT_END
G10H03_END:
MOV BP,SP
MOV AX,GS:V86_DX_O
MOV WORD PTR [BP+16],AX ;OLD=10
JMP COS_DOSINT_END
G13H_END: MOV AX,GS:V86_AX
CMP AH,02H
JE G13H02_END
JMP COS_DOSINT_END
G13H02_END: MOV BX,GS:V86_BX
MOV DX,GS:V86_ES
PUSH DS
MOV DS,DX
MOV CX,512
MOV AX,OFFSET V86_BUFFER
MOV SI,AX
G13H02_LOOP:
MOV AL,GS:[SI] ;V86_BUFFER
MOV DS:[BX],AL ;USER BUFFER
INC BX
INC SI
LOOP G13H02_LOOP
POP DS
JMP COS_DOSINT_END
G16H_END: MOV AX,GS:V86_AX_O
JMP COS_DOSINT_END
G1AH_END:
MOV CX,GS:V86_CX_O
MOV DX,GS:V86_DX_O
;
POP GS
POP FS
POP ES
POP DS
POP EDI
POP ESI
POP EBP ;POP EDX REMAINS DX
POP EBP ;POP ECX REMAINS CX
POP EBX
POP EAX
POP EBP
sti
IRETD
;
G21H_END: MOV AX,GS:V86_AX
CMP AH,0AH
JE G21H0A_END
JMP COS_DOSINT_END
G21H0A_END: MOV BX,GS:V86_DX
MOV DX,GS:V86_DS
PUSH DS
MOV DS,DX ;DS:BX USER_BUF
MOV AX,OFFSET V86_BUFFER ;GS:SI V86_BUFFER
MOV SI,AX
INC SI
MOV CL,GS:[SI]
INC BX ;SECOND FOR USER_BUF
MOV CH,0
MOV DS:[BX],CL
INC SI
INC BX
CMP CL,0
JLE G21H0A_0
G21H0A_LOOP:
MOV AL,GS:[SI] ;V86_BUFFER
MOV DS:[BX],AL ;USER BUFFER
INC BX
INC SI
LOOP G21H0A_LOOP
G21H0A_0:
MOV DS:[BX],0 ;ADDITION 'NULL'
POP DS
JMP COS_DOSINT_END
DOS21H4C:
POP GS
POP FS
POP ES
POP DS
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
POP EBP ;POP EAX REMAINS AX
POP EBP
jmp DOS21H4C1
DOS21H4C1:
DB 0EAH ;CALL=9AH ;JMP=0EAH ;
DW 0;V86BEGIN
DW V_TOS_TSS_SEL
DOS21H4E:
CALL DO_DOS21H4E
COS_DOSINT_END:
;mmmmmmmmmmm
; push gs
; mov ebx,02fffffh
;dff123:
; MOV AX,G_VRAM_SEL
; MOV gS,AX
; MOV AL,'+'
; MOV AH,41H
; MOV WORD PTR gS:[804],AX
; dec ebx
; jnz dff123
; pop gs
;mmmmmmmmmmmm
POP GS
POP FS
POP ES
POP DS
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
POP EBP ;POP EAX REMAINS AX
POP EBP
IRETD
;*******************************enD V86 TASK
;*******************************enD V86 TASK
COS_DOSINT ENDP
;test
;PUSH ES
;PUSH AX
;MOV AX,G_VRAM_SEL
;MOV ES,AX
;MOV AL,'z'
;MOV AH,41H
;MOV WORD PTR ES:[804],AX
;POP AX
;POP ES
; test
;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
COS_INT09 PROC FAR
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
PUSH GS
PUSH FS
PUSH ES
PUSH DS
;PUSH ESP
;PUSH SS
PUSH ESI
PUSH EDI
PUSH EBP
MOV AX,G_VRAM_SEL
MOV ES,AX
MOV AH,41H
MOV AL,'G'
MOV WORD PTR ES:[3996],AX
POP EBP
POP EDI
POP ESI
;POP SS
;POP ESP
POP DS
POP ES
POP FS
POP GS
POP EDX
POP ECX
POP EBX
tt1239:
; MOV AL,20H
; OUT 20H,AL
tt12329:
POP EAX
IRETD
COS_INT09 ENDP
;mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -