?? v86_seg.asm
字號:
;*************************************************v86
;*************************************************v86
V86CODESEG SEGMENT PARA USE16 ;8086 code
ASSUME CS:V86CODESEG,DS:V86_DATASEG
V86BEGIN PROC FAR
cli
MOV AX,V86_DATASEG
MOV DS,AX
MOV AX,DS:V86_AX
MOV BX,DS:V86_BX
MOV CX,DS:V86_CX
MOV DX,DS:V86_DX
CMP DS:G_INT,10H
JE DOS_10H
CMP DS:G_INT,13H
JE DOS_13H
CMP DS:G_INT,16H
JE DOS_16H
CMP DS:G_INT,1AH
JE DOS_1AH
CMP DS:G_INT,21H
JE DOS_21H
JMP G_TO_COS
DOS_10H:
;G_DIRECT_BIOS_START
mov ax,0
mov ds,ax
mov di,64 ;10h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX
; DO INT 10H
MOV AX,V86_DATASEG
MOV DS,AX
MOV AX,DS:V86_AX
MOV BX,DS:V86_BX
MOV CX,DS:V86_CX
MOV DX,DS:V86_DX
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs
;G_DIRECT_BIOS_END
;save out_information
PUSH AX
MOV AX,V86_DATASEG
MOV DS,AX
MOV DS:V86_BX_O,BX
MOV DS:V86_CX_O,CX
MOV DS:V86_DX_O,DX
POP AX
MOV DS:V86_AX_O,AX
JMP G_TO_COS
DOS_13H:
;G_DIRECT_BIOS_START
mov ax,0
mov ds,ax
mov di,76 ;13h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX
; DO INT 13H
MOV AX,V86_DATASEG
MOV DS,AX
MOV ES,AX
MOV BX,OFFSET V86_BUFFER
MOV AX,DS:V86_AX
MOV CX,DS:V86_CX
MOV DX,DS:V86_DX
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs
;G_DIRECT_BIOS_END
JMP G_TO_COS
DOS_16H:
;G_DIRECT_BIOS_START
mov ax,0
mov ds,ax
mov di,88 ;16h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX
; DO INT 16H
MOV AX,V86_DATASEG
MOV DS,AX
MOV ES,AX
MOV BX,OFFSET V86_BUFFER
MOV AX,DS:V86_AX
MOV CX,DS:V86_CX
MOV DX,DS:V86_DX
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs
;G_DIRECT_BIOS_END
MOV DS:V86_AX_O,AX
JMP G_TO_COS
DOS_1AH:
;G_DIRECT_BIOS_START
mov ax,0
mov ds,ax
mov di,104 ;1Ah 1AH*4=104
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX
; DO INT 1AH
MOV AX,V86_DATASEG
MOV DS,AX
MOV ES,AX
MOV BX,OFFSET V86_BUFFER
MOV AX,DS:V86_AX
MOV CX,DS:V86_CX
MOV DX,DS:V86_DX
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs
;G_DIRECT_BIOS_END
MOV DS:V86_CX_O,CX
MOV DS:V86_DX_O,DX
JMP G_TO_COS
DOS_21H:
CMP AH,09
JE DOS_21H09
CMP AH,0AH
JE DOS_21H0A
JMP DO_DOS_21H
DOS_21H09:
;MOV DX,OFFSET V86_BUFFER
;jmp DO_DOS_21H ; now use follow than using these 2 lines
;G_DIRECT_BIOS_END
;in :ds:dx addr for string ended by '$'
cli
mov ax,0
mov ds,ax
mov di,64 ;10h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX ; bios_ADDRESS FOR INT 10H
;JMP G_TO_COS
MOV AH,3H
MOV BH,0
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs ;READ CURSOR-->DH/DL:row/column
cli
MOV AX,V86_DATASEG
MOV DS,AX
MOV CX,DS:V86_CX
MOV ES,AX
MOV DS:V86_BP,BP
MOV BP,OFFSET V86_BUFFER
MOV AX,1301H
MOV BH,0
MOV BL,7h
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs ;dispay string
cli
MOV BP,DS:V86_BP
JMP G_TO_COS
;G_DIRECT_BIOS_END
DO_DOS_21H:
INT 21H
JMP G_TO_COS
DOS_21H0A: ;NO 21H0A DIRECT CALL BIOS 0A
;G_DIRECT_BIOS_START
mov ax,0
mov ds,ax
mov di,64 ;10h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs2,BX
mov DS:g_ipcs2[2],CX ;ADDRESS FOR INT 10H
mov ax,0
mov ds,ax
mov di,88 ;16h
mov BX,ds:[di]
mov CX,ds:[di+2]
MOV AX,V86_DATASEG
MOV DS,AX
mov DS:g_ipcs,BX
mov DS:g_ipcs[2],CX ;ADDRESS FOR INT 16
; DO INT 16H
MOV AX,V86_DATASEG
MOV DS,AX
MOV SI,OFFSET V86_BUFFER
MOV AX,DS:V86_AX
MOV DL,AL ;READ_COUNT
ADD SI,2
DOS_21H0A_1:
CMP DL,0
JE DOS_21H0A_2 ;buffer is full
XOR DI,DI
PUSH DI
MOV AH,10H
call dword ptr ds:g_ipcs
CMP AL,0DH ;input_string='enter'
JE DOS_21H0A_2
CMP AL,08H
JE DOS_21H0A_08
CMP AL,0E0H
JE DOS_21H0A_08
MOV DS:[SI],AL ;AL->V86_BUFFER
INC SI
MOV AH,9H
MOV BH,0
MOV BL,7 ;41H RED_BACKGROUND
MOV CX,1
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs2 ;DISPLAY CHAR
PUSH DX
MOV AH,3H
MOV BH,0
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs2 ;READ CURSOR
INC DL
MOV AH,2
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs2 ;SET CURSOR
POP DX
DEC DL
JMP DOS_21H0A_1
DOS_21H0A_08:
PUSH DX
MOV AH,3H
MOV BH,0
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs2 ;READ CURSOR
DEC DL
DEC SI
MOV AH,2
XOR DI,DI
PUSH DI
call dword ptr ds:g_ipcs2 ;SET CURSOR
POP DX
JMP DOS_21H0A_1
DOS_21H0A_2_FULL:
MOV AL,0DH
DEC SI
DOS_21H0A_2:
MOV DS:[SI],AL ;AL='enter'->V86_BUFFER
MOV SI,OFFSET V86_BUFFER
INC SI
MOV AL,255
DEC DL
SUB AL,DL
MOV DS:[SI],AL
JMP G_TO_COS
;8086 WIRTE "$"
mov di,130h
qq0: mov cx,0ffffh
qq1: mov ax,0b800h
mov es,ax
mov al,24h ;"$"
mov ah,41H
mov es:1762,ax
dec cx
cmp cx,1
ja qq1
dec di
cmp di,1
ja qq0
G_TO_COS: cli
INT 0FFH
V86BEGIN ENDP
V86CODESEG ENDS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -