Hier der andere Teil des Codes.
GetAndSet :
Tastatureingaben des Benutzers in Array CHARS speichern
InitializeKeyboardBuffer :
Array CHARS löschen
WriteString :
Ausgeben eines in SI stehenden Strings (entspricht dem PutStr von StupidOS)
COMMANDLIST :
Beinhaltet die verschiedenen Befehle und ruft diese bei Gleichheit auf
PRUEFEN :
Ruft CmpStringLength (vergleichen der Stringlänge) und CmpCommandKeyboard (vergleichen der einzelnen Zeichen) auf
CmpStringLength :
Vergleicht die Länge des in SI stehenden Befehls mit der Anzahl der Tastatureingaben (Array CHARS). Diese Funktion verwendet die Funktion GetStringLength
CmpCommandKeyboard :
Vergleicht die einzelnen Zeichen des Befehls mit den Zeichen im Array CHARS (Tastatureingaben)
;Hauptquellcode:
Anzeige:
call InitializeKeyboardBuffer
mov si,msg_Eingabe
call WriteString
call GetAndSet
call COMMANDLIST
jmp Anzeige
:Hauptquellcodeende
;----------------------------------------------------
;Funktionen
;----------------------------------------------------
;Übersicht über die zur Verfügung stehenden Befehle
COMMANDLIST:
Command1:
mov si,Msg_Info ;Befehl "Info" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne Command2
call COMMAND_Info ;Befehl "Info" ausf?hren
ret
Command2:
mov si,Msg_List ;Befehl "List" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne Command3
call COMMAND_List ;Befehl "List" ausf?hren
ret
Command3:
mov si,Msg_Exit ;Befehl "Exit" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne NoCommand
call COMMAND_Exit ;Befehl "Exit" ausf?hren
ret
NoCommand: ;Ung?ltiger Befehl
mov si,Msg_NoCommand
call WriteString
ret
;Ende von Funktion "COMMANDLIST"
;-------------------------------------
;Vergleicht Befehle auf Gleichheit hin
;Bei Gleichheit AX=1, sonst AX=0
PRUEFEN:
call CmpStringLength ;Scan 1 -> Länge
cmp ax,1 ;Länge gleich ?
jne false ;nein, Länge nicht gleich
call CmpCommandKeyboard ;Scan 2 -> Zeichenvergleich
cmp ax,1 ;Zeichen gleich ?
jne false ;nein, Zeichen nicht gleich
mov ax,1 ;Zeichen gleich (Länge und Zeichen überprüft)
ret
false: ;Lânge und/oder Zeichenvergleich ohne Erfolg
mov ax,0
ret
;--------------------------------------------
;Funktion Zeichenvergleich Befehl -> Tastatur
;Compare Command Keyboard
;Beim ersten ungleichen Zeichen wird AX=0 zurückgegeben und abgebrochen
CmpCommandKeyboard:
xor ax,ax
xor bx,bx
_CmpCommandKeyboard: ;Vergleich
mov al,[Chars+bx];Tastaturzeichen nach AL
mov ah,[si+bx] ;Zeichen des Befehls nach AH
cmp al,ah ;Vergleich Befehl und Tastatur (AL mit AH)
jne short _CmpCommandFalse
cmp cx,bx ;alle Elemente überprüft ?
je short _CmpCommandTrue ;alle Elemente überprüft => alle Elemente richtig
inc bx
jmp _CmpCommandKeyboard
_CmpCommandTrue:
mov ax,1
ret
_CmpCommandFalse:
mov ax,0
ret
;_CmpCommandKeyboardReturn:
ret
;Ende von Funktion Compare Command Keyboard (CmpCommandKeyboard)
;-----------------------------------------------------------------
;----------------------------------------------------------
;Funktion Compare Stringlength
;Vergleicht die Länge des in SI stehenden Befehls mit der Anzahl der
;Tastatureingaben (Array CHARS)
;Rückgabewert AX-Register = 1 wenn Strings gleich, sonst 0
CmpStringLength:
mov cx,bx ;Länge von CHARS in CX zwischenspeichern
xor bx,bx ;BX auf erstes Element
xor ax,ax
call GetStringLength ;Auswerten der Befehlslänge
cmp cx,bx
je short _CmpStringLengthRichtig ;Wahr, springe zu _GetStringLengthTrue
mov ax,0
ret
_CmpStringLengthRichtig:
mov ax,1
ret
;Ende von Funktion Compare String Length
;----------------------------------------------
;----------------------------------------------------------
;Funktion Stringlänge
;Rückgabewert ist Stringlänge in BX
;Ermittelt die Länge des aktuellen Befehls
GetStringLength:
xor bx,bx
xor ax,ax
_GetStringLength:
mov al,[si+bx]
cmp al,0x00
je short _GetStringLengthReturn
inc bx
jmp short _GetStringLength
_GetStringLengthReturn:
ret
;--------------------------------------------
;Funktion Stringausgabe
;Å¡bergabewert SI
;R?ckgabewert: Gibt String auf Bildschirm aus
WriteString:
lodsb ;Byte laden
or al,al
jz short _WriteStringReturn;0-Byte? -> Ende!
mov ah,0x0E ;Funktion 0x0E
mov bx,0x0007 ;Attribut-Byte
int 0x10 ;schreiben
jmp WriteString ;nâchstes Byte
_WriteStringReturn:
ret
;-----------------------
;Funktion Array löschen
;Diese Funktion löscht alle im Array stehenden Zeichen
InitializeKeyboardBuffer:
xor bx,bx
xor ax,ax
_InitializeKeyboardBuffer:
mov [Chars+bx],al
cmp bx,99
je short _InitializeKeyboardBufferReturn
inc bx
jmp short _InitializeKeyboardBuffer
_InitializeKeyboardBufferReturn:
ret
;-------------------------------------------
;Funktion Tastatur
;Mit dieser Funktion wird es dem Benutzer ermöglicht,
;die Tastatur zu verwenden
;Rückgabewert 1: Ein Array mit den Tastatureingaben
;Rückgabewert 2: Zeichenanzahl in BX
GetAndSet:
xor bx,bx ;Arraypointer auf erstes Element
_GetAndSet:
mov ah,0x00
int 0x16
cmp al,0x0D ;Return-Taste gedrückt ?
je _GetAndSetReturn ;Ja, Return-Funktion ausführen
mov [Chars+bx],al
inc bx
mov ah,0x0E ;Zeichen an akt. Cursorpos. schreiben und Pos. aktualisieren
int 0x10 ;Video-BIOS_Interrupt
jmp _GetAndSet
_GetAndSetReturn:
ret
;--------------------------
;Standard-Variablen
;--------------------------
Chars db 0
times 100 db 0 ;Definieren eines Arrays mit 100 Elementen (0-99)
Msg_Info db 'info',0
Msg_List db 'list',0
Msg_Exit db 'exit',0
Msg_NoCommand db ' Invalid command',13,10,0
msg_os db 'Loading Operating System...',13,10,0
msg_shortname db 'FD-RMOS',13,10,0
msg_longname db 'Floppy Disk Real Mode Operating System',13,10,0
msg_version db 'Version 1.0',13,10,0
msg_programmer db 'Programmed by Matthias Prestel',13,10,0
msg_newline db 13,10,0
msg_Eingabe db 'Command : ',0
cmd_info db 'Befehl Info gewählt',13,10,0
cmd_List db 'Befehl List gewählt',13,10,0
cmd_Exit db 'Befehl Exit gewählt',13,10,0
;----------------------------------------
;Befehle
;----------------------------------------
COMMAND_Info:
mov si,cmd_info
call WriteString
ret
COMMAND_List:
mov si,cmd_List
call WriteString
ret
COMMAND_Exit:
mov si,cmd_Exit
call WriteString
ret
Wie schon gesagt, der Fehler liegt eben darin, dass "list" nicht als Befehl
ausgewertet wird.
Gruss,
bscreator