CodeNet / Языки программирования / Ассемблер / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
CodeNet / Платформы / Пишем ОС / Пишем "многозадачную" ОС в "Real Mode"
Модуль kernel.asm
%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