%TITLE "Ядро GlukOS"
IDEAL
MODEL TINY
DATASEG
BytesPerRowa=80*2
rowa=0
LABEL ScRow Word
REPT 25
DW (rowa*BytesPerRowa)
rowa=rowa+1
ENDM
QuitFLG DB 0
color DB 01Fh
windowx DB 3
windowy DB 2
windowhx DB 15h
windowwx DB 4Ah
mainx DB 0
mainy DB 5
mainwidth DB 80
mainheight DB 25
space DB 20h,0
null DB 0
MemoryTable DB 8 DUP (0)
plots DB ".........",0
entr DB "$ ",0
string0 DB "GlukOS v.01 (C) 2000 Misha Krivij",0
string1 DB "Type 'HELP' for help.",0
error1 DB "Syntax error.",0
string DB "Welcome to GlukOS v.01",0
loading DB "System now loading... please wait...",0
plot DB ".",0
dvoet DB ":",0
LastLine DB 72 DUP (0) ; Последняя строка экрана
LastLineEnd DB 0
LastLineFlag DB 0 ; Номер задачи, которая может
; изменить LastLine
include "data.inc" ; Подключим данные из другого файла
sector DB 512 DUP (?) ; Сюда читается сектор
fat DB 9*512 DUP (?) ; Сюда читается FAT (9 секторов)
AbsSectNum DW ?
AbsHeadNum DW ?
command DB 128 DUP (?) ; Командная строка
CODESEG
ORG 100h ; Данные из boot сектора грузятся по адрессу
Start: ; Вывод строки
push cs
pop ds
mov [Word Ptr cs:firsttask+9],1 ; Задаем приоритет задачи
mov [Word Ptr cs:firsttask+11],1 ; Задаем приоритет задачи
IFNDEF GlukOS ;--- Для DOS'а освободим память
push cs
pop es
mov ah,4Ah
mov bx,4096
int 21h
ENDIF
call InitTasks ; Инициализация дескрипторов задач
call GetVectors ; Сохранаяем вектора прерывания
call SetVectors ; Изменяем вектора прерывания
mov ax,cs
mov ds,ax
lea di,[dos_CurDir]
mov ah,1
int 0FFh
; Повторим, то, что в boot'е
mov cx,00101h
mov dx,0164Dh
call Ramka
; Вывод строки
lea si,[String]
mov dx,011Ah
call print
; Вывод строки
lea si,[loading]
mov dx,0300h
call print
; Вывод строки
lea si,[String0]
call writeln
; Вывод строки
lea si,[String1]
call writeln
opros: lea si,[entr]
call write
opr1: call input
lea di,[command]
call UpperString
mov al,[command] ;¬
or al,al ;¦ Если строка пустая
je opr1 ;-
call doCmd
mov al,[QuitFLG]
or al,al
je opros
IFDEF GlukOS ;--- Для ГлюкОСы
jmp far 0F000h:0FFF0h
ELSE ;--- Для ДОСа
call _di ; вырубим прерывания
lea di,[tasks]
mov cx,8
dosexit2: cmp [Byte Ptr cs:di],0FFh
je dosexit1
mov ax,[di+3]
mov es,ax
mov ah,49h
push di cx
int 21h
pop cx di
dosexit1: add di,515
loop dosexit2
call RestoreVectors
int 20h
ENDIF ;--- GlukOS
; Выполнение команды #########################################################
PROC doCmd
lea di,[ctable]
dCmd3: lea si,[command]
dCmd0: mov al,[si]
cmp al,[di]
jne dCmd1 ; Команда не опознана
or al,al
je dCmd2 ; Конец команды, команда опознана
inc di
inc si
jmp dCmd0
dCmd1: inc di
cmp [Byte Ptr di],0
jne dCmd1
inc di
inc di
inc di
cmp [Byte Ptr di],0
je dCmd4
jmp dCmd3 ; Проверяем следующую команду
dCmd2: inc di
cmp [Byte Ptr di],0
jne dCmd2
inc di
push di
lea si,[null]
call writeln
pop di
mov si,[di]
call si
ret
dCmd4: lea si,[null]
call writeln
lea si,[error1]
call writeln
ret
ENDP doCmd
; Ввод строки с эхом #########################################################
PROC input
mov ax,cs ;¬
mov es,ax ;¦
lea di,[command] ;¦ Обнулим командную строку
mov cx,128 ;¦
xor ax,ax ;¦
rep stosb ;-
lea di,[command]
mov bh,[cs:mainy]
mov bl,[cs:mainx]
xor cx,cx
inp1: push cx
xor ax,ax
int 16h
pop cx
cmp al,13 ; Enter
je ipEnter
cmp al,8 ; BackSpace
je ipBackSpace
or al,al
je inp1
mov [cs:di],al
inc di
inc cx
cmp cx,126
jne inp2
dec di
dec cx
inp2: push di
mov [Byte Ptr cs:di],0
mov [cs:mainy],bh
mov [cs:mainx],bl
lea si,[cs:command]
push cx
call write
pop cx
pop di
jmp inp1
ipEnter: ret
ipBackSpace: push si
lea si,[command]
cmp si,di
pop si
je inp1
dec di
push di bx
mov [Byte Ptr cs:di],0
mov [cs:mainy],bh
mov [cs:mainx],bl
lea si,[cs:command]
call write
lea si,[cs:space]
call write
mov [cs:mainy],bh
mov [cs:mainx],bl
lea si,[cs:command]
call write
pop bx di
dec cx
jmp inp1
ENDP input
include "disk.asm"
include "memory.asm"
include "commands.asm"
include "utils.asm"
include "mtasks.asm"
include "lastline.asm"
include "int_FFh.asm"
END Start
|