マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

ブートセクタプログラミング キーボード入力

ブートセクタプログラミングでは通常BIOS Functionコールを使うはず。それで、BIOS Functionコールで押されたキーを取得するにはahレジスタを0にしてint 0x16を呼び出せばOK。そうすればalレジスタに押されたキーのASCIIコードが入るので、それを使う。以下サンプル、アセンブラはnasmを使っている

cpu  8086
bits 16
org  0x7C00

%macro draw 3
    mov ax, %1
    mov cx, %2
    mov dx, %3
    int 0x10
%endmacro

%define CPOS_DEFAULT_X 320
%define CPOS_DEFAULT_Y 400

%define CMOVE_X 4

%define DRAW_BLACK 0x0C00
%define DRAW_GREEN 0x0C02

    xor ax, ax
    mov ds, ax

    ; si is x
    ; di is y
    mov si, CPOS_DEFAULT_X
    mov di, CPOS_DEFAULT_Y

    ; init display
    mov al, 0x12
    int 0x10
    
    draw DRAW_GREEN, si, di

input_key:
    ; get key
    mov ah, 0x00
    int 0x16
    
    ; if key is a then left move
    cmp al, 'a'
    je left_move
    
    ; if key is b then left move
    cmp al, 'd'
    je right_move
    
    ; wait next key
    jmp input_key

left_move:
    ; erase current character dot
    draw DRAW_BLACK, si, di
    
    ; next position
    sub si, word CMOVE_X
    
    ; draw character dot
    draw DRAW_GREEN, si, di
    
    ; wait next key
    jmp input_key

right_move:
    ; erase current character dot
    draw DRAW_BLACK, si, di

    ; next position
    add si, word CMOVE_X
    
    ; draw character dot
    draw DRAW_GREEN, si, di
    
    ; wait next key
    jmp input_key
    
    times 510 - ($ - $$) db 0x00
    dw 0xAA55