⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 v86_seg.asm

📁 操作系统完整源代码大机密!
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************************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 + -