Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

Модуль 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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог