1

割り込み 10h の関数 06h を使用してスクロール ラインアップを実装する必要があります。問題は、スクロールされた行がありますが、シンボルが表示されず、カーソルが消えて何も起こらないことです。多分私は考慮すべきことを忘れましたか?私が使用するコードを書くためにFASM。コードはブートローダーの一部です。スクロールに関連するコードは次のとおりです。

cmp cx, 2001
je ScrollLine

カウンターがあり、2001 (1 からカウント) に達すると、制御が ScrollLine に渡されます。

スクロールライン:

mov ah, 06h
mov al, 1
mov bh, 07      
mov cx, 0000h
mov dx, 184Fh 
int 10h
ret

私の完全なブートローダー コードは次のとおりです。

use16
org 7C00h

start:
    mov ah, 00h  
    mov al, 02h              
    int 10h

    mov ax, NewInt40
    call ChangeIVT

    mov cx, 0

wait_loop:
    xor ax, ax

    inc cx

    cmp cx, 2001
    je ScrollLine

    mov ah, 0
    int 16h

    push ax
    call PrintChar

    jmp wait_loop

NewInt40:   
    sti
    push ax
    mov ax, msg
    cmp bl, 3
    je PrintChar
    cmp bl, 2
    je PrintString
    cmp bl, 1
    je Clear
    cmp bl, 4
    je Scroll
    pop ax
    iret

ChangeIVT:

    push bx
    xor bx, bx

    mov es, bx
    mov bx, 40h
    shl bx, 2

    mov word [es:bx], ax
    mov word [es:bx+2], 0

    pop bx
    ret

PrintString:

    push si
    push bx
    push es
    mov si, ax

    mov ax, 0B800h
    mov es, ax

    xor bx, bx
    xor dx, dx

@@:
    lodsb   

    cmp al, 0
    je @f

    mov byte [es:bx], al
    mov byte [es:bx+1], 1Eh

    mov ah, 0Eh
    add bx, 2
    inc dx
    mov ah,02h
    mov al,02h  
    int 10h
    jmp @b

@@:
    pop es
    pop bx
    pop si
    ret

PrintChar:

    push bp
    mov bp, sp
    push bx
    push es
    push cx

    mov ax, 0B800h
    mov es, ax

    xor bx, bx
    xor dx, dx

    mov ah,3
    int 0x10

    movzx ax, dh
    movzx bx, dl
    mov cx, 80
    push dx
    mul cx
    pop dx
    add bx, ax  ; bx = 80 * dh + dl
    shl bx, 1   ; bx = 2 * (80 * dh + dl)



    mov ax, [bp + 4]
    mov byte [es:bx], al
    mov byte [es:bx+1], 1Eh

    cmp dl, 79
    jl @f

    inc dh
    mov dl, -1
@@:
    inc dl

    pop cx
    mov bh, 0

    mov ah, 2
    int 0x10

    pop es
    pop bx
    mov sp, bp
    pop bp
    ret

Clear:
   mov  AH,0      
   mov  AL,2      
   int  10H       
   ret

Scroll:
    mov ah, 06h
    mov al, 1
    mov bh, 07      
    mov cx, 0000h
    mov dx, 184Fh 
    int 10h
    ret

ScrollLine:
    mov bl, 4
    int 40h
    xor cx, cx
    ret

msg db "Hello, world!", 0Dh, 0Ah, 0

db 510-($-$$) dup (0)

db 55h, 0AAh
4

1 に答える 1