Während ich das FAT12 Tutorial geschrieben habe, hatte ich mir nebenher auch ein wenig 16 Bit Real-Mode Code geschrieben um das ganze auszuprobieren. Dabei hatte ich auch eine sehr simple Konsole entwickelt.
Da im Forum schon über eine solche Diskutiert wurde, möchte ich diese hier mal veröffentlichen.
Dazu muss ich sagen das sie leider nicht kommentiert ist und wohl auch sehr sehr spärlich ist. Jedoch hiflt es vielleicht dem einen oder anderen auf eine Idee zu kommen.
Hier zuerst die Variablen:
COMMAND_Command resb 256
COMMAND_CMD_Hello db "hello",0
COMMAND_CMD_ReadBootSec db "readbootsec",0
COMMAND_CMD_Reboot db "reboot",0
COMMAND_MSG_Invalid db "INVALID COMMAND!!",13,10,0
COMMAND_MSG_Hello db "Hello there!",13,10,0
Hier nun die Funktion, welche einen String von der Tastatur entgegennimmt und in die Variable COMMAND_Command schreibt.
Sobald Enter gedrückt wird, wird ein NULL-Byte an das Ende des Strings gesetzt und die FUnktion zum auswerten der Befehle aufgerufen:
func_COMMAND_GetCommand:
push bp
mov bp, sp
push ax
push bx
push cx
push dx
push di
push es
mov bx, cs
mov es, bx
label_COMMAND_GetCommand_Start:
mov di, COMMAND_Command
mov bx, 0x0007
mov cx, 10
label_COMMAND_GetCommand_ReadChar:
mov ah, 0
int 0x16
cmp al, 0x0D
je label_COMMAND_GetCommand_LastChar
cmp al, 0x08
je label_COMMAND_GetCommand_Backspace
mov ah, 0x0E
int 0x10
stosb
dec cx
jcxz label_COMMAND_GetCommand_LastChar
jmp label_COMMAND_GetCommand_ReadChar
label_COMMAND_GetCommand_Backspace:
cmp cx, 10
je label_COMMAND_GetCommand_ReadChar
inc cx
dec di
mov ah, 3
mov bh, 0
int 0x10
dec dl
mov ah, 2
int 0x10
mov al, 0x20
mov ah, 0x0E
mov bx, 0x0007
int 0x10
mov ah, 2
int 0x10
jmp label_COMMAND_GetCommand_ReadChar
label_COMMAND_GetCommand_LastChar:
mov al, 0
stosb
mov ah, 0x0E
mov al, 0x0D
int 0x10
mov al, 0x0A
int 0x10
push COMMAND_Command
push ds
call func_STRING_ToLower
add sp, 4
call func_COMMAND_ExecuteCommand
label_COMMAND_GetCommand_End:
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
ret
Hier die Funktion welche die Befehle auswertet.
Es werden einfach der Reihe nach sämtliche Befehle mit dem eingegeben String verglchen und dann eine entsprechende Aktion ausgeführt:
func_COMMAND_ExecuteCommand:
push bp
mov bp, sp
push ax
;--------------------------------------------------
push COMMAND_Command
push cs
push COMMAND_CMD_Hello
push cs
call func_STRING_CompareStrings
add sp, 8
cmp ax, 1
je label_COMMAND_CMD_Hello
push COMMAND_Command
push cs
push COMMAND_CMD_ReadBootSec
push cs
call func_STRING_CompareStrings
add sp, 8
cmp ax, 1
je label_COMMAND_CMD_ReadBootSec
push COMMAND_Command
push cs
push COMMAND_CMD_Reboot
push cs
call func_STRING_CompareStrings
add sp, 8
cmp ax, 1
je label_COMMAND_CMD_Reboot
jmp label_COMMAND_CMD_Invalid
;--------------------------------------------------
label_COMMAND_CMD_Hello:
push COMMAND_MSG_Hello
push cs
call func_STRING_PrintString
add sp, 4
jmp label_COMMAND_ExecuteCommand_End
label_COMMAND_CMD_ReadBootSec:
call func_FAT12_ReadBootSector
jmp label_COMMAND_ExecuteCommand_End
label_COMMAND_CMD_Reboot:
db 0xEA
dw 0x0000
dw 0xFFFF
; jmp label_COMMAND_ExecuteCommand_End
label_COMMAND_CMD_Invalid:
push COMMAND_MSG_Invalid
push cs
call func_STRING_PrintString
add sp, 4
jmp label_COMMAND_ExecuteCommand_End
;--------------------------------------------------
label_COMMAND_ExecuteCommand_End:
pop ax
mov sp, bp
pop bp
ret
Bei Fragen bezüglich zum Code einfach hier posten.