割り込み 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