Autor Thema: Simple Konsole  (Gelesen 10946 mal)

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« am: 01. March 2004, 18:19 »
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.
----------------------
Redakteur bei LowLevel

 

Einloggen