Skip to content

Instantly share code, notes, and snippets.

@MisterTimur
Last active April 9, 2024 13:27
Show Gist options
  • Save MisterTimur/4910f31a1a60459461b8 to your computer and use it in GitHub Desktop.
Save MisterTimur/4910f31a1a60459461b8 to your computer and use it in GitHub Desktop.
TimOs
;---{ ЗАГРУЗЧИК
;---{ Описание
; В блоке ЗАГРУЗОЧНЫЙ_СЕКТОР устанавлвиаеться видеорежим в котром будет запущена программа
; Через ES достапна вся память [ES:0B8000h] Адрес видеопамяти
; DS и программа сама начинаеться с адреса 0 в блоке ЗАЩИЩЕННЫЙ_РЕЖИМ
; Все что ниже уже пишеться в 32 битном режиме сама программа
; Сама програмам распологаеться кажися по адресу 0x8000
; Количество загружаемых секторов не забывем указывать в разделе ЗАГРУЗОЧНЫЙ_СЕКТОР
; НЕ азбываем конце программы ставить секцию ЗАВЕРШАЮЩАЯ ЧАСТЬ ПРОГРАММЫ
; Между секцией ЗАГРУЗЧИК и ЗАВЕРШАЮЩАЯ ЧАСТЬ ПРОГРАММЫ размещаем свой код
;---}
;---{ Загрузчик
;Помощь при создании 32 битного загрузчика оказал robohacker.ru
;Автор 32 битного загрузчика robohacker.ru а я его немного изменил для своей ОС
ORG 0;{Абдулов Тимур Рифович 2015 год Email hostingurifa@gmail.com .
;INFO Кодировка файла должна быть CP 866
;Site https://sites.google.com/site/timpascallib/
;Youtube https://www.youtube.com/channel/UCUhQNuTAQ933YBTy6awC0Pw
;Google+ https://plus.google.com/u/0/+%D0%A2%D0%B8%D0%BC%D1%83%D1%80%D0%90%D0%B1%D0%B4%D1%83%D0%BB%D0%BE%D0%B2/posts
;GIST https://gist.github.com/MisterTimur/4910f31a1a60459461b8
;------------------------------------------------------------------------------}
ЗАГРУЗОЧНЫЙ_СЕКТОР:;{
;------------------------;
mov ah,00h ; // Функция установки видео режима 80 на 25
mov al,03h ; // Устаналиваем Видео режим
int 10h ; // Вызываем функцию биос
;------------------------;
;------------------------;
mov ah,05h ; // Выбираем видео страницу
mov al,0 ;
int 10h ;
;------------------------;
;------------------------;
mov bx,0 ; // Номер видеостраницы
mov dl,0 ; // Координата по X
mov dh,25 ; // уст. позицию курсора. установка на строку 25 делает курсор невидимым.
mov ah,02h ; // ПОдпрограмма установки курсора
int 10h ;
;------------------------;
cli
cld
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x8000
sti
mov dh,0 ; головка
mov ch,0 ; дорожка
mov cl,2 ; 2-й сектор
;-------------------;
mov ax, 0000h ;
mov es, ax ; Адрес куда загружаем
mov bx, 0x8000 ; Адрес куда загружаем
;-------------------;
mov al, 30 ; кол-во читаемых секторов Не забываем указывать
mov ah, 2h
int 13h
jmp far 0:8000h
times 0x200 - 2 - ($ - ЗАГРУЗОЧНЫЙ_СЕКТОР) db 0x90
db 055h, 0AAh
;==============================================================================}
org 0x8000
РЕАЛЬНЫЙ_РЕЖИМ :; { Реальный режим
Start:
mov bp,Font
mov dx, 128
mov cx, 48
mov bx, 1000h
mov ax, 1100h
int 10h;
mov bp,Font2
mov dx, 224
mov cx, 18
mov bx, 1000h
mov ax, 1100h
int 10h;
call СОЗДАТЬ_GDT
cli
mov eax, cr0
or al, 1
mov cr0, eax
jmp 0x0008:0x0000
Font:
;-------------;А
DB 00000000b ;0
DB 00000000b ;1
DB 00011100b ;2
DB 00010100b ;3
DB 00010100b ;4
DB 00010110b ;5
DB 00100010b ;6
DB 00100010b ;7
DB 00100010b ;8
DB 01111111b ;9
DB 01000001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Б
DB 00000000b ;0
DB 00000000b ;1
DB 01111100b ;2
DB 01000000b ;3
DB 01000000b ;4
DB 01000000b ;5
DB 01111100b ;6
DB 01000110b ;7
DB 01000010b ;8
DB 01000010b ;9
DB 01000110b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;В
DB 00000000b ;0
DB 00000000b ;1
DB 01111100b ;2
DB 01000010b ;3
DB 01000010b ;4
DB 01000110b ;5
DB 01111100b ;6
DB 01000110b ;7
DB 01000010b ;8
DB 01000010b ;9
DB 01000110b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Г
DB 00000000b ;0
DB 00000000b ;1
DB 00111111b ;2
DB 00100000b ;3
DB 00100000b ;4
DB 00100000b ;5
DB 00100000b ;6
DB 00100000b ;7
DB 00100000b ;8
DB 00100000b ;9
DB 00100000b ;10
DB 00100000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Д
DB 00000000b ;0
DB 00000000b ;1
DB 00111111b ;2
DB 00100001b ;3
DB 00100001b ;4
DB 00100001b ;5
DB 00100001b ;6
DB 00100001b ;7
DB 00100001b ;8
DB 00100001b ;9
DB 01000001b ;10
DB 11111111b ;11
DB 10000000b ;12
DB 10000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Е
DB 00000000b ;0
DB 00000000b ;1
DB 00111111b ;2
DB 00100000b ;3
DB 00100000b ;4
DB 00100000b ;5
DB 00111111b ;6
DB 00100000b ;7
DB 00100000b ;8
DB 00100000b ;9
DB 00100000b ;10
DB 00111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ж
DB 00000000b ;0
DB 00000000b ;1
DB 10001000b ;2
DB 01001001b ;3
DB 00101010b ;4
DB 00101010b ;5
DB 00011100b ;6
DB 00011100b ;7
DB 00101010b ;8
DB 01001001b ;9
DB 01001001b ;10
DB 10001000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;З
DB 00000000b ;0
DB 00000000b ;1
DB 00111100b ;2
DB 01000010b ;3
DB 00000010b ;4
DB 00000010b ;5
DB 00111100b ;6
DB 00000110b ;7
DB 00000010b ;8
DB 00000010b ;9
DB 01000110b ;10
DB 00111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;И
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000011b ;3
DB 01000111b ;4
DB 01000101b ;5
DB 01001101b ;6
DB 01011001b ;7
DB 01010001b ;8
DB 01110001b ;9
DB 01100001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Й
DB 00111000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000011b ;3
DB 01000111b ;4
DB 01000101b ;5
DB 01001101b ;6
DB 01011001b ;7
DB 01010001b ;8
DB 01110001b ;9
DB 01100001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;К
DB 00000000b ;0
DB 00000000b ;1
DB 01000010b ;2
DB 01000100b ;3
DB 01001100b ;4
DB 01011000b ;5
DB 01110000b ;6
DB 01110000b ;7
DB 01011000b ;8
DB 01001100b ;9
DB 01000100b ;10
DB 01000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Л
DB 00000000b ;0
DB 00000000b ;1
DB 00111110b ;2
DB 00100010b ;3
DB 00100010b ;4
DB 00100010b ;5
DB 00100010b ;6
DB 00100010b ;7
DB 01100010b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 11000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;М
DB 00000000b ;0
DB 00000000b ;1
DB 11000001b ;2
DB 11100011b ;3
DB 11100011b ;4
DB 11110101b ;5
DB 11010101b ;6
DB 11010101b ;7
DB 11001001b ;8
DB 11000001b ;9
DB 11000001b ;10
DB 11000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Н
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000001b ;3
DB 01000001b ;4
DB 01000001b ;5
DB 01111111b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 01000001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;О
DB 00000000b ;0
DB 00000000b ;1
DB 00111100b ;2
DB 01000010b ;3
DB 11000001b ;4
DB 10000001b ;5
DB 10000001b ;6
DB 10000001b ;7
DB 10000001b ;8
DB 10000011b ;9
DB 01000010b ;10
DB 00111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;П
DB 00000000b ;0
DB 00000000b ;1
DB 01111111b ;2
DB 01000001b ;3
DB 01000001b ;4
DB 01000001b ;5
DB 01000001b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 01000001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Р
DB 00000000b ;0
DB 00000000b ;1
DB 01111100b ;2
DB 01000110b ;3
DB 01000010b ;4
DB 01000010b ;5
DB 01000110b ;6
DB 01111000b ;7
DB 01000000b ;8
DB 01000000b ;9
DB 01000000b ;10
DB 01000000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;С
DB 00000000b ;0
DB 00000000b ;1
DB 00011110b ;2
DB 00110001b ;3
DB 00100000b ;4
DB 01000000b ;5
DB 01000000b ;6
DB 01000000b ;7
DB 01000000b ;8
DB 01100000b ;9
DB 00100001b ;10
DB 00011110b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Т
DB 00000000b ;0
DB 00000000b ;1
DB 01111111b ;2
DB 00001000b ;3
DB 00001000b ;4
DB 00001000b ;5
DB 00001000b ;6
DB 00001000b ;7
DB 00001000b ;8
DB 00001000b ;9
DB 00001000b ;10
DB 00001000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;У
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01100011b ;3
DB 00100010b ;4
DB 00110110b ;5
DB 00010100b ;6
DB 00011100b ;7
DB 00001000b ;8
DB 00001000b ;9
DB 00011000b ;10
DB 01110000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ф
DB 00000000b ;0
DB 00000000b ;1
DB 00001000b ;2
DB 00011110b ;3
DB 00101010b ;4
DB 01001001b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01101010b ;9
DB 00111100b ;10
DB 00001000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Х
DB 00000000b ;0
DB 00000000b ;1
DB 11000011b ;2
DB 01100110b ;3
DB 00110100b ;4
DB 00011100b ;5
DB 00011000b ;6
DB 00011100b ;7
DB 00110100b ;8
DB 00100110b ;9
DB 01100011b ;10
DB 11000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ц
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000001b ;3
DB 01000001b ;4
DB 01000001b ;5
DB 01000001b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 01000001b ;10
DB 01111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ч
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000001b ;3
DB 01000001b ;4
DB 01000001b ;5
DB 01100001b ;6
DB 00111111b ;7
DB 00000001b ;8
DB 00000001b ;9
DB 00000001b ;10
DB 00000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ш
DB 00000000b ;0
DB 00000000b ;1
DB 01001001b ;2
DB 01001001b ;3
DB 01001001b ;4
DB 01001001b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01001001b ;9
DB 01001001b ;10
DB 01111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Щ
DB 00000000b ;0
DB 00000000b ;1
DB 01001001b ;2
DB 01001001b ;3
DB 01001001b ;4
DB 01001001b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01001001b ;9
DB 01001001b ;10
DB 01111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ъ
DB 00000000b ;0
DB 00000000b ;1
DB 11100000b ;2
DB 00100000b ;3
DB 00100000b ;4
DB 00100000b ;5
DB 00111110b ;6
DB 00100011b ;7
DB 00100001b ;8
DB 00100001b ;9
DB 00100011b ;10
DB 00111110b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ы
DB 00000000b ;0
DB 00000000b ;1
DB 01000001b ;2
DB 01000001b ;3
DB 01000001b ;4
DB 01000001b ;5
DB 01111001b ;6
DB 01000101b ;7
DB 01000101b ;8
DB 01000101b ;9
DB 01001101b ;10
DB 01111001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ь
DB 00000000b ;0
DB 00000000b ;1
DB 01000000b ;2
DB 01000000b ;3
DB 01000000b ;4
DB 01000000b ;5
DB 01111100b ;6
DB 01000110b ;7
DB 01000010b ;8
DB 01000010b ;9
DB 01000110b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Э
DB 00000000b ;0
DB 00000000b ;1
DB 00111100b ;2
DB 01000010b ;3
DB 00000001b ;4
DB 00000001b ;5
DB 00111111b ;6
DB 00000001b ;7
DB 00000001b ;8
DB 00000011b ;9
DB 01000010b ;10
DB 00111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Ю
DB 00000000b ;0
DB 00000000b ;1
DB 01001111b ;2
DB 01011001b ;3
DB 01010000b ;4
DB 01010000b ;5
DB 01110000b ;6
DB 01010000b ;7
DB 01010000b ;8
DB 01010000b ;9
DB 01001001b ;10
DB 01001111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;Я
DB 00000000b ;0
DB 00000000b ;1
DB 00011110b ;2
DB 00100010b ;3
DB 00100010b ;4
DB 00100010b ;5
DB 00110010b ;6
DB 00011110b ;7
DB 00110010b ;8
DB 00100010b ;9
DB 01100010b ;10
DB 01100010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;а
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011100b ;5
DB 00100010b ;6
DB 00000010b ;7
DB 00111110b ;8
DB 01000010b ;9
DB 01000110b ;10
DB 00111010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;б
DB 00000000b ;0
DB 00011110b ;1
DB 00100000b ;2
DB 00100000b ;3
DB 01011110b ;4
DB 01100010b ;5
DB 01000001b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 00100010b ;10
DB 00011100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;в
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01111100b ;5
DB 01000010b ;6
DB 01000010b ;7
DB 01111100b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;г
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00111111b ;5
DB 00100000b ;6
DB 00100000b ;7
DB 00100000b ;8
DB 00100000b ;9
DB 00100000b ;10
DB 00100000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;д
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00111110b ;5
DB 00100010b ;6
DB 00100010b ;7
DB 00100010b ;8
DB 01100010b ;9
DB 01000010b ;10
DB 11111111b ;11
DB 10000001b ;12
DB 10000001b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;е
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011110b ;5
DB 00100011b ;6
DB 01000001b ;7
DB 01111111b ;8
DB 01000000b ;9
DB 01100000b ;10
DB 00011111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ж
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 10001000b ;5
DB 01001001b ;6
DB 00101010b ;7
DB 00011100b ;8
DB 00101010b ;9
DB 01101011b ;10
DB 11001001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;з
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01111100b ;5
DB 00000010b ;6
DB 00000010b ;7
DB 00111100b ;8
DB 00000010b ;9
DB 00000010b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;и
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01000110b ;6
DB 01001110b ;7
DB 01011010b ;8
DB 01110010b ;9
DB 01100010b ;10
DB 01000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;й
DB 00000000b ;0
DB 00000000b ;1
DB 00100100b ;2
DB 00111000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01000110b ;6
DB 01001110b ;7
DB 01011010b ;8
DB 01110010b ;9
DB 01100010b ;10
DB 01000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;к
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01001100b ;6
DB 01010000b ;7
DB 01100000b ;8
DB 01011000b ;9
DB 01001100b ;10
DB 01000110b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;л
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00111110b ;5
DB 00100010b ;6
DB 00100010b ;7
DB 00100010b ;8
DB 00100010b ;9
DB 01000010b ;10
DB 11000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;м
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01100011b ;5
DB 01010101b ;6
DB 01010101b ;7
DB 01010101b ;8
DB 01001001b ;9
DB 01000001b ;10
DB 01000001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;н
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01000010b ;6
DB 01000010b ;7
DB 01111110b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 01000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;о
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011110b ;5
DB 00100011b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 01100010b ;10
DB 00111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;п
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01111110b ;5
DB 01000010b ;6
DB 01000010b ;7
DB 01000010b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 01000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
Font2: ;-------------;р
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01011110b ;5
DB 01100011b ;6
DB 01000001b ;7
DB 01000001b ;8
DB 01000001b ;9
DB 01000010b ;10
DB 01111100b ;11
DB 01000000b ;12
DB 01000000b ;13
DB 01000000b ;14
DB 00000000b ;15
;-------------;с
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011110b ;5
DB 00100000b ;6
DB 01000000b ;7
DB 01000000b ;8
DB 01000000b ;9
DB 01100000b ;10
DB 00011110b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;т
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01111111b ;5
DB 00001000b ;6
DB 00001000b ;7
DB 00001000b ;8
DB 00001000b ;9
DB 00001000b ;10
DB 00001000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;у
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000001b ;5
DB 01100011b ;6
DB 00100010b ;7
DB 00100110b ;8
DB 00010100b ;9
DB 00010100b ;10
DB 00011000b ;11
DB 00011000b ;12
DB 00010000b ;13
DB 11100000b ;14
DB 00000000b ;15
;-------------;ф
DB 00000000b ;0
DB 00001000b ;1
DB 00001000b ;2
DB 00001000b ;3
DB 00011110b ;4
DB 00101011b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01001001b ;9
DB 01101010b ;10
DB 00111100b ;11
DB 00001000b ;12
DB 00001000b ;13
DB 00001000b ;14
DB 00000000b ;15
;-------------;х
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01100011b ;5
DB 00110110b ;6
DB 00011100b ;7
DB 00001100b ;8
DB 00010110b ;9
DB 00110011b ;10
DB 01100001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ц
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01000010b ;6
DB 01000010b ;7
DB 01000010b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 01111111b ;11
DB 00000001b ;12
DB 00000001b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ч
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000010b ;5
DB 01000010b ;6
DB 01000010b ;7
DB 00111110b ;8
DB 00000010b ;9
DB 00000010b ;10
DB 00000010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ш
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01001001b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01001001b ;9
DB 01001001b ;10
DB 01111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;щ
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01001001b ;5
DB 01001001b ;6
DB 01001001b ;7
DB 01001001b ;8
DB 01001001b ;9
DB 01001001b ;10
DB 01111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ъ
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 11100000b ;5
DB 00100000b ;6
DB 00100000b ;7
DB 00111100b ;8
DB 00100010b ;9
DB 00100010b ;10
DB 00111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ы
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000001b ;5
DB 01000001b ;6
DB 01000001b ;7
DB 01111001b ;8
DB 01000101b ;9
DB 01000101b ;10
DB 01111001b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ь
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01000000b ;5
DB 01000000b ;6
DB 01000000b ;7
DB 01111100b ;8
DB 01000010b ;9
DB 01000010b ;10
DB 01111100b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;э
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01111100b ;5
DB 00000110b ;6
DB 00000010b ;7
DB 01111110b ;8
DB 00000010b ;9
DB 00000110b ;10
DB 01111000b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ю
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 01001111b ;5
DB 01011001b ;6
DB 01010000b ;7
DB 01110000b ;8
DB 01010000b ;9
DB 01011001b ;10
DB 01001111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;я
DB 00000000b ;0
DB 00000000b ;1
DB 00000000b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011110b ;5
DB 00100010b ;6
DB 00100010b ;7
DB 00011110b ;8
DB 00110010b ;9
DB 00100010b ;10
DB 01100010b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
Font3: ;-------------;Ё
DB 00100100b ;0
DB 00000000b ;1
DB 00111111b ;2
DB 00100000b ;3
DB 00100000b ;4
DB 00100000b ;5
DB 00111111b ;6
DB 00100000b ;7
DB 00100000b ;8
DB 00100000b ;9
DB 00100000b ;10
DB 00111111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
;-------------;ё
DB 00000000b ;0
DB 00110110b ;1
DB 00110110b ;2
DB 00000000b ;3
DB 00000000b ;4
DB 00011110b ;5
DB 00100011b ;6
DB 01000001b ;7
DB 01111111b ;8
DB 01000000b ;9
DB 01100000b ;10
DB 00011111b ;11
DB 00000000b ;12
DB 00000000b ;13
DB 00000000b ;14
DB 00000000b ;15
СОЗДАТЬ_GDT:;{ Создание первичной таблицы GDT
mov ax, 0x0400
mov es, ax
; Очистить GDT (1024 элементов)
xor di, di
mov cx, 0x2000
xor ax, ax
rep stosb
mov di, 8
; ~600 kb кода, который может быть загружен
mov eax, 0x93FFF
mov ebx, ЗАЩИЩЕННЫЙ_РЕЖИМ ; начало
mov cx, 0x90 + 0x8 + 0x4000 ; DPL=0, PRESENT=0x80, BIT_SYSTEM=0x10, CODE_EXEC_ONLY=0x8, BIT_DEFAULT_SIZE_32=0x4000
call СОЗДАТЬ_ДЕСКРИПТОР
; повтор сегмента, но уже для данных
mov eax, 0x93FFF
mov ebx, ЗАЩИЩЕННЫЙ_РЕЖИМ ; начало
mov cx, 0x90 + 0x2 + 0x4000 ; DATA_READ_WRITE=0x2
call СОЗДАТЬ_ДЕСКРИПТОР
; сегмент стека (256 кб)
mov eax, 0x3FFFF
mov ebx, 0x100000 ; Начало в HI-mem
mov cx, 0x90 + 0x2 + 0x4000 ; DATA_READ_WRITE=0x2
call СОЗДАТЬ_ДЕСКРИПТОР
; Память в целом (es)
mov eax, 0xFFFFF
xor ebx, ebx
mov cx, 0x90 + 0x2 + 0x8000 + 0x4000 ; GRANUL=0x8000
call СОЗДАТЬ_ДЕСКРИПТОР
; Загрузка GDT [0x4000]
mov word [0x7C00], 0x1FFF
mov dword [0x7C02], 0x4000
lgdt [0x7C00]
; Загрузка IDT
mov word [0x7C06], 0x7FF
mov dword [0x7C08], 0x6000
lidt [0x7C06]
ret
;==============================================================================}
СОЗДАТЬ_ДЕСКРИПТОР:;{Создание дескриптора в реальном режиме
; --------------------------------------------------------
; EAX - Лимит 24
; EBX - Адрес 32
; CX - Конфигурация
; ES:DI - Указатель на элемент GDT
; --------------------------------------------------------
stosw ; limit
xchg eax, ebx
stosw ; address 0..15
shr eax, 16
stosb ; addr 16..23
xchg eax, ebx
mov al, cl
stosb ; config low
shr eax, 16
or al, ch
stosb ; config + limit
xchg eax, ebx
shr ax, 8
stosb ; addr 24..31
ret
;==============================================================================}
РАЗМЕР_КОДА_РЕАЛЬНОГО_РЕЖИМА = $ - РЕАЛЬНЫЙ_РЕЖИМ
;=============================================================================;}
ЗАЩИЩЕННЫЙ_РЕЖИМ :; { Защищенный режим
org 0
use32
.СТАРТ:
mov ax, 0x10
mov ds, ax
mov ax, 0x18
mov ss, ax
mov esp, 0x40000
mov ax, 0x20
mov es, ax
mov ax, 0
mov fs, ax
mov gs, ax
; [ES:0B8000h] Адрес видеопамяти
;==============================================================================}
;---}
;---}
;===============================================================================
;---{ ОСНОВНОЕ ТЕЛО ПРОГРАММЫ -ПРОГРАМИРОВАНИЕ:
;-ЖШРИФТ:
;-clGreen:
;---{ Описание
;---}
;---{ ПРограмма
Call ЭКРАН_80_25_ОЧИСТКА;
call МЫШ_ИНИЦИАЛИЗАЦИЯ;
.ПОВТОР:
mov ecx,37;
mov edx,10;
call ЭКРАН_80_25_КУРСОР_ECX_EDX;
mov esi,ЭКРАН_80_25_ПРИВЕСТВИЕ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
call МЫШ_ЧТЕНИЕ;
;--------------------------------;{ Вывод Информации кнопки
mov ecx,35 ;
mov edx,11 ;
call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
mov ESI,.TEXTMOUSEI ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
mov EAX,[МЫШКА_I1] ;
call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX ;
mov ESI,.TEXTPROBEL ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
;--------------------------------;}
;--------------------------------;{ Вывод координат по X
mov ecx,35 ;
mov edx,12 ;
call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
mov ESI,.TEXTMOUSEX ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
mov EAX,[МЫШКА_X1] ;
call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX ;
mov ESI,.TEXTPROBEL ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
;--------------------------------;}
;--------------------------------;{ Вывод координат по Y
mov ecx,35 ;
mov edx,13 ;
call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
mov ESI,.TEXTMOUSEY ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
mov EAX,[МЫШКА_Y1] ;
call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX ;
mov ESI,.TEXTPROBEL ;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
;--------------------------------;}
jmp .ПОВТОР;
;---}
;---{ Переменные
.TEXTPROBEL: db ' ',0;
.TEXTMOUSEX: db 'Mouse X=',0;
.TEXTMOUSEY: db 'Mouse Y=',0;
.TEXTMOUSEI: db 'Mouse Info=',0;
;---}
;==============================================================================}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ C ВСТРОЕНЫМ ЯЗКОМ ПРОГРАМИРОВАНИЯ
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ C ЭЛЕМЕНТАМИ
;---{ Описание
; Универсальный элемент для создания окон и различных обьектов
; Базовый класс для разработки OS
;
;---}
;---{ Чтение значения полей элементов
ЭЛЕ_ТИП:;{ Возвращает в EAX Тип элемента EDI
push EDI ;
xor EAX,EAX ;
add EDI,ЭЛ_ТИП;
mov AL,[EDI] ;
pop DI ;
ret ;
;==============================================================================}
ЭЛЕ_ФУН:;{ Возвращает в EAX Являеться ли элемента EDI функцией устанавливает флаг Z если это функция
push EDI ;
xor EAX,EAX ;
add EDI,ЭЛ_ФУН;
mov AL,[EDI] ;
test AL,AL ;
pop DI ;
ret ;
;==============================================================================}
ЭЛЕ_ИМЯ:;{ Возвращает в EAX ИМЯ элемента EDI
push EDI ;
add EDI,ЭЛ_ИМЯ;
mov EAX,[EDI] ;
pop EDI ;
ret ;
;==============================================================================}
ЭЛЕ_БУК:;{ Возвращает в EAX первую букву ИМЯ элемента EDI
push EDI ;
call ЭЛЕ_ИМЯ ;
mov EDI,EAX ;
mov AL,[EDI];
pop EDI ;
ret;
;==============================================================================}
ЭЛЕ_ЗНА:;{ Возвращает в EAX Значение элемента EDI
push EDI ;
add EDI,ЭЛ_ЗНА;
mov EAX,[EDI] ;
test EAX,EAX ;
pop EDI ;
ret ;
;==============================================================================}
ЭЛЕ_ПРЕ:;{ Возвращает в EAX Предыдущий элемент элемента EDI
push EDI ;
add EDI,ЭЛ_ПРЕ;
mov EAX,[EDI] ;
test EAX,EAX ;
pop EDI ;
ret ;
;==============================================================================}
ЭЛЕ_СЛЕ:;{ Возвращает в EAX Следующий элемент элемента EDI
push EDI ;
add EDI,ЭЛ_СЛЕ;
mov EAX,[EDI] ;
test EAX,EAX ;
pop EDI ;
ret ;
;==============================================================================}
ЭЛЕ_РОД:;{ Возвращает в EAX Родительский элемент элемента EDI
push EDI ;
add EDI,ЭЛ_РОД;
mov EAX,[EDI] ;
test EAX,EAX ;
pop EDI ;
ret ;
;==============================================================================}
ЭЛЕ_ВЛО:;{ Возвращает в EAX Первый вложеный элемент элемента EDI
push EDI ;
add EDI,ЭЛ_ВЛО;
mov EAX,[EDI] ;
test EAX,EAX ;
pop Edi ;
ret ;
;==============================================================================}
ЭЛЕ_КОД:;{ Возвращает в EAX Код элемент элемента EDI
push di ;
add DI,ЭЛ_КОД;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
;---}
;---{ Функции для работы с элементами
;---}
;---{ СТРУКТУРА ЭЛЕМЕНТА
ЭЛ_ТИП = 0 ;// ТИп элементы
ЭЛ_ФУН = 1 ;// Если это функция Участвует ли в поиске
ЭЛ_ИМЯ = 4 ;// Название элемента
ЭЛ_ЗНА = 8 ;// Адрес значения
ЭЛ_КОД = 12;// Код имени элемента
ЭЛ_РОД = 16;// Адрес родительского элемента
ЭЛ_ПРЕ = 20;// Адрес предыдущего элемента
ЭЛ_СЛЕ = 24;// Адрес Следующего элемента
ЭЛ_ВЛО = 28;// Адрес первого элемента вложеного списка
;---}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С СТРОКАМИ
ВЕРНУТЬ_КОНЕЦ_СТРОКИ_ESI_В_ESI :;{
push Ecx;
.ЦИКЛ: mov cl,[Esi];
test cl,cl ;// Если конец строки то выход
JZ .КЦИКЛ ;
inc EsI ;// Увеличиывкем указатель на читаемый символ
Jmp .ЦИКЛ ;
.КЦИКЛ:
pop Ecx;
ret ;
;==============================================================================}
ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_ESI :;{
push ESi ;
Call ВЕРНУТЬ_КОНЕЦ_СТРОКИ_ESI_В_ESI;// Перемещаемся в конец строки
mov [ESI],AL ;// Записываем символ вместо 0 конца строки
inc ESI ;// Увеличиваем указатель на читаемый символ
mov byte [ESI],0 ;// Дописываем ноль в конец строки
pop ESi ;
ret ;
;==============================================================================}
ДОБАВИТЬ_ЧИСЛО_EAX_В_КОНЕЦ_СТРОКИ_ESI:;{
pushad
MOV BX,10 ;// 10 система счисления
xor ecx,ecx ;
.ЦИКЛ1: ;------------
xor eDX,eDX;
DIV eBX ;
push edx ;// Сохраняем остаток от деления в стек
inc ecx ;
test eax,eax;
jnz .ЦИКЛ1 ;
;------------
.ЦИКЛ2: ;-----------;
pop edx ;
add dl,'0' ;
mov al,dl ;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_ESI;
dec ecx ;
test ecx,ecx;
jnz .ЦИКЛ2 ;
;-----------;
popad
ret;
;==============================================================================}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С МЫШКОЙ НА НИЗКОМ УРОВНЕ
;---{ Описание
; Мудуль для работы с клавиатурой и мышкой PS2
; Сперва запускаем инициализацию МЫШ_ИНИЦИАЛИЗАЦИЯ
; затем можно использовать МЫШ_ЧТЕНИЕ для чтения данных с мышки и клавиатуры
; Результат чтения записываеться в переменные их 2 копии предыдущие и новое значение для удобства
;---}
;---{ Функции для работы с PS2
МЫШ_ИНИЦИАЛИЗАЦИЯ:;{
pushad;
; Включает мыш
mov al,0A8h;
Call PS2_ЗАПИСЬ_AL_В_ПОРТ_64;
; Установка стандартных настроек
mov al,0xD4
Call PS2_ЗАПИСЬ_AL_В_ПОРТ_64;
mov al,0xF6
Call PS2_ЗАПИСЬ_AL_В_ПОРТ_60;
; Включение отправки отчетов
mov al,0xD4
Call PS2_ЗАПИСЬ_AL_В_ПОРТ_64;
mov al,0xF4
Call PS2_ЗАПИСЬ_AL_В_ПОРТ_60;
popad;
ret;
;==============================================================================}
МЫШ_ЧТЕНИЕ :;{
pushad;
call PS2_ЧТЕНИЕ_64ПОРТА_В_AL;
test al,100000b;
jnz .ЧИТАТЬ_МЫШ;
mov eax,[КНОПКА_1];
mov [КНОПКА_2],eax;
call PS2_ЧТЕНИЕ_60ПОРТА_В_AL
mov [КНОПКА_1],al;
jmp .ВЫХОД;
.ЧИТАТЬ_МЫШ:
;{ Запоминаем предыдущие координаты
mov eax,[МЫШКА_I1];
mov [МЫШКА_I2],eax;
mov eax,[МЫШКА_X1];
mov [МЫШКА_X2],eax;
mov eax,[МЫШКА_Y1];
mov [МЫШКА_Y2],eax;
;-----------------}
call PS2_ЧТЕНИЕ_60ПОРТА_В_AL; // Чтение информационого байта от мышки
mov [МЫШКА_I1],al;
;{Вычисление координаты по X
;--------------;
not al ;
mov cl,al ; // Запоминаем в CL состтояние инфоромационго байта мышки
SHL al,3 ;
SHR al,7 ;
mov ah,al ;
;--------------;
call PS2_ЧТЕНИЕ_60ПОРТА_В_AL;
sub ax,128;
mov dl,3;
div dl;
mov ah,0
mov [МЫШКА_X1],eax;
;---------------------------}
;{Вычисление координаты по Y
;--------------;
mov al,cl ;
SHL al,2 ;
SHR al,7 ;
mov ah,al ;
;--------------;
call PS2_ЧТЕНИЕ_60ПОРТА_В_AL;
sub ax,128;
mov dl,10;
div dl;
mov ah,0
mov edx,0;
mov edx,25
sub dx,ax;
mov eax,edx;
mov [МЫШКА_Y1],eax;
;----------------------------}
;{Вырисовка Мышки
;// Стираем предыдущее положение мышки
mov ecx,[МЫШКА_X2];
mov edx,[МЫШКА_Y2];
mov Ah,[ЭКРАН_80_25_ФОН];
mov Al,0;
call ЭКРАН_80_25_ВЫВОД_AX_ECX_EDX;
;// РИсуем мышку
mov ecx,[МЫШКА_X1];
mov edx,[МЫШКА_Y1];
mov Ah,10110000b;
mov Al,0;
call ЭКРАН_80_25_ВЫВОД_AX_ECX_EDX;
;--------------------------------}
.ВЫХОД:
popad;
ret;
;==============================================================================}
PS2_ЗАПИСЬ_AL_В_ПОРТ_64 :;{
pushad;
mov cl,al;
.ЦИКЛ:
in AL,0x64
test AL,2; // 000 000 10 b
jz .ВЫХОД;
jmp .ЦИКЛ;
.ВЫХОД:
mov al,cl;
out 0x64,al;
popad;
ret;
;==============================================================================}
PS2_ЗАПИСЬ_AL_В_ПОРТ_60 :;{
pushad;
MOV CL,AL;
.ЦИКЛ:
in AL,64h
test AL,2;
jz .ВЫХОД;
jmp .ЦИКЛ;
.ВЫХОД:
mov al,CL;
out 0x60,al;
popad;
ret;
;==============================================================================}
PS2_ЧТЕНИЕ_60ПОРТА_В_AL :;{
;.ЦИКЛ:
; in aL,64h;
; test aL,1;
; jnz .ВЫХОД;
; jmp .ЦИКЛ;
;.ВЫХОД:
in al,60h
ret;
;==============================================================================}
PS2_ЧТЕНИЕ_64ПОРТА_В_AL :;{
.ЦИКЛ:
in aL,64h;
test aL,1;
jnz .ВЫХОД;
jmp .ЦИКЛ;
.ВЫХОД:
ret;
;==============================================================================}
;---}
;---{ Переменные для работы с PS2
;// переменные для работы с мышкой на низком уровне
КНОПКА_1 : DD 0; // Скан код нажатой кнопки клавиатуры
МЫШКА_I1 : DD 0; // Информация о мышке Нажатые кнопки и так далее
МЫШКА_X1 : DD 0;
МЫШКА_Y1 : DD 0;
;// ПРедыдущие значение данных от PS/2
КНОПКА_2 : DD 0; // Скан код нажатой кнопки клавиатуры
МЫШКА_I2 : DD 0; // Информация о мышке Нажатые кнопки и так далее
МЫШКА_X2 : DD 0;
МЫШКА_Y2 : DD 0;
;---}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С ЭКРАНОМ НА НИЗКОМ УРОВНЕ
;---{ Описание
; Модуль для работы с экраном 80 на 25
; процедура ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX использет модуль для работы со строками
; Функция перевода числа в строку ЗАВИСИМОСТИ
; Использет 3 Функции из модуля для работы со строками
; ДОБАВИТЬ_ЧИСЛО_EAX_В_КОНЕЦ_СТРОКИ_ESI
; ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_ESI
; ВЕРНУТЬ_КОНЕЦ_СТРОКИ_ESI_В_ESI
;---}
;---{ Функции для работы с экраном в текстовом режиме 80 на 25
ЭКРАН_80_25_КУРСОР_ECX_EDX :;{ Устанавливает курсор в заданую позицию
pushad;
cmp ecx,79;
jb .ДАЛЕЕ1;
mov ecx,0;
.ДАЛЕЕ1:
cmp edx,24;
jb .ДАЛЕЕ2;
mov edx,0;
.ДАЛЕЕ2:
mov [ЭКРАН_80_25_КУРСОР_X],ecx;
mov [ЭКРАН_80_25_КУРСОР_Y],eDx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ОЧИСТКА :;{ Очистка экрана
pushad
;------------------------;
mov ecx,2000 ; // Для счета заполняемых символов
mov al,' ' ; // Записываем символ
mov ah,[ЭКРАН_80_25_ФОН]; // Атрибуты экрана
;------------------------;
mov EDI,0B8000h ; // Настраиваем регистр ES на начало видеопаямити
;------------------------;
.ЦИКЛ: test ecx,ecx ; // Проверяем на 0 пока CX<>0
jz .КЦИКЛ ; // Если CX=0 ВЫход
MOV [ES:EDI],al ; // Записываем код выводимого символа
inc EDI ; // Увеличиваем адрес
MOV [ES:EDI],ah ; // Записываем атрибуты
inc EDI ; // Увеличиваем адрес
dec ecx ; // Уменьшаем счетчик
jmp .ЦИКЛ ; // Повторить
.КЦИКЛ: ;------------------------;
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_AX_ECX_EDX:;{ Функция Вывод Символ AL с атрибутами AH если AL=0 то выводит тока атрибуты
pushad;
mov ebx,eax ; // Сохраняю выводимый символ и атрибуты в регистр BX
;-------------------;
mov EDI,0B8000h ; Настраиваем регистр ES на началово видеопаямити
;-------------------;
cmp ecx,79;
ja .ВЫХОД;
cmp edx,24;
ja .ВЫХОД;
;-------------------;
mov eax,2 ; (КОД,АТРИБУТ) 2 байта на 1 символ
mul cl ; Умнажем координату по X на 2
mov ecx,eax ; Запоминаем
mov eax,160 ; Помещаем в регистр AX длину 1 строки на экране
mul dl ;
ADD eAX,eCX ;
ADD EDI,Eax ;
test bl,bl ;
jz .ДАЛЕЕ ;
MOV byte[ES:EDI],bl; (Символ)
.ДАЛЕЕ: inc EDI ;
MOV byte[ES:EDI],bh; (Цвет Атрибут)
;-------------------;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_СЛЕД_ПОЗИЦИЯ :;{ Перевод курсора в следующию позицию
pushad;
mov ecx,[ЭКРАН_80_25_КУРСОР_X];
mov eDx,[ЭКРАН_80_25_КУРСОР_Y];
cmp ecx,79 ;
jae .СЛЕД_СТРОКА;
inc ecx ;
jmp .ВЫХОД;
.СЛЕД_СТРОКА: mov ecx,0;
inc edx;
cmp edx,24;
jb .ВЫХОД;
mov ecx,0;
mov edx,0;
.ВЫХОД:
mov [ЭКРАН_80_25_КУРСОР_X],ecx;
mov [ЭКРАН_80_25_КУРСОР_Y],eDx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_СЛЕД_СТРОКА :;{ Перевод курсора НА следующию строку
pushad;
mov ecx,[ЭКРАН_80_25_КУРСОР_X];
mov eDx,[ЭКРАН_80_25_КУРСОР_Y];
.СЛЕД_СТРОКА: mov ecx,0;
inc edx;
cmp edx,24;
jb .ВЫХОД;
mov ecx,0;
mov edx,0;
.ВЫХОД:
mov [ЭКРАН_80_25_КУРСОР_X],ecx;
mov [ЭКРАН_80_25_КУРСОР_X],eDx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL :;{ Выводит символ в консоль
pushad;
cmp al,13;
jnz .ДАЛЕЕ;
call ЭКРАН_80_25_СЛЕД_СТРОКА;
jmp .ВЫХОД;
.ДАЛЕЕ:
cmp al,' ';
jb .ВЫХОД;
mov ecx,[ЭКРАН_80_25_КУРСОР_X];
mov edx,[ЭКРАН_80_25_КУРСОР_Y];
call ЭКРАН_80_25_ВЫВОД_AX_ECX_EDX;
call ЭКРАН_80_25_СЛЕД_ПОЗИЦИЯ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI:;{ Выводит строку в консоль
pushad;
mov ah,[ЭКРАН_80_25_ФОН];
.ЦИКЛ: mov al,[esi];
test al,al;
jz .КЦИКЛ;
call ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL;
inc esi;
jmp .ЦИКЛ;
.КЦИКЛ:
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX :;{ Выводит строку в консоль
pushad;
mov ESI,.БУФФЕР;
mov Byte [ESI],0;
call ДОБАВИТЬ_ЧИСЛО_EAX_В_КОНЕЦ_СТРОКИ_ESI;
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
popad;
ret;
.БУФФЕР: DB ' ',0;
;==============================================================================}
;---}
;---{ Переменные
ЭКРАН_80_25_КУРСОР_X : DD 0;
ЭКРАН_80_25_КУРСОР_Y : DD 0;
ЭКРАН_80_25_ФОН : DB 01011111b;
;---}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С ПАМЯТЬЮ НА НИЗКОМ УРОВНЕ
;---{ Описание
; ДЛя работы с модулем необходимо указать НАЧ_КУЧИ адрес начала кучи
; и КОН_КУЧИ адрес конца кучи
;
;
;---}
;---{ Функции для работы с памятью
ОЧИСТКА_ПАМЯТИ_С_ESI_ДО_EDI :;{ Очистка памяти с адреса ESI до адреса EDI Уже не входит в очистку
push ESI ;// Сохранение содержимого всех регистров
.ЦИКЛ:;-----------------;
CMP ESI,EDI ;// Чтение адрсеа окончания кучи
JAE .КЦИК ;// Если SI>DI то выход
mov Byte [ESI],0;// Запись нуля по адресу SI
INC ESI ;// Увеличиываем SI
JMP .ЦИКЛ ;// Повторить
.КЦИК:;-----------------;
pop ESI ;// Вотсановление всех регистров
ret ;// Выход из подпрограммы
;==============================================================================}
ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_EDI :;{ Освобождение участка памяти EDI Адрес полученый ранее например с помощбю функции ПАМЯТЬ_ВЫДЕЛИТЬ
pushad ;
SUB EDI,5 ;// Переходим к байту занятости
MOV Byte [DI],0 ;// И обнуляем его
inc Edi ;
mov Ecx,[Edi] ; // Читаем размер участка
add Edi,4 ; // Переходим к первому байту участка памяти
mov Esi,Edi ; //устанавливаем начало стираемого участка памяти
add Edi,ECX ; // устанавливаем конец стираемого участка памяти
inc Edi ;
call ОЧИСТКА_ПАМЯТИ_С_ESI_ДО_EDI;
popad ;
RET ;
;==============================================================================}
ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_EDI_РАЗ_EDI:;{ Выделяет участок памяти размером EDI Возвращает адрес выделеного участка в DI
PUSHAD;
MOV ESI,[НАЧ_КУЧИ]; Читаем адрес начала кучи
.ЦИКЛ: ;//----------------
MOV AL,[ESI] ; Читаем флаг занятости
INC ESI ; Увеличиваем указатель
MOV ECX,[ESI] ; Читаем размер участка памяти
TEST AL,AL ; Проверка флага занятости
JNZ .СЛЕ_УЧА ; Если не равно нулю переходим к следующему участку
TEST ECX,ECX ; Размер выделеного участка памяти не может быть равен нулю по этому ноль исполльзуем как признак конца используемой части кучи
JZ .СВОБ ; Участок подходит если это последний участок в куче с нулевым размерм
CMP ECX,EDI ; Сравниваем размер участка CX и размер запрашиваемого участка DI
JZ .СВОБ ; Участок подходит если размер участка соотвествующий и флаг занятости AL равен нулю
.СЛЕ_УЧА:
ADD ECX,4 ; Переход к след участку размер этого участка + 2 байта попадаем на байт занятости следующего участка
ADD ESI,ECX ;
JMP .ЦИКЛ ;
.СВОБ: ;------------------;
DEC ESI ;
MOV byte [ESI],1 ; // Устанавливаем флаг занятости
INC ESI ; // Переходим к указанию размера учатка
MOV [ESI],EDI ; // Записываем размер участка
ADD ESI,4 ; // прибавляем 4 получаем адрес Выделеного участка
;------------------;
POP EDI ;
PUSH ESI ; // EDI на вершие стека всегда
POPAD ;
RET ;
;==============================================================================}
;---}
;---{ Переменные
НАЧ_КУЧИ : DW 0 ;// Адрес начала кучи
КОН_КУЧИ : DW 0 ;// Адрес Окончания Кучи
;---}
;---}
;---{ ЗАВЕРШЕНИЕ ОПИСАНИЯ ПРОЦЕДУР И ФУНКЦИЙ ;-КОНЕЦ:
;---}
;---{ ПЕРЕМЕННЫЕ -ПЕРЕМЕННЫЕ:
;-НШРИФТ:
;-clBlue:
ЭКРАН_80_25_ПРИВЕСТВИЕ: DB 'Tim OS ПРИВЕТ привет',0;
;-КОНЕЦ:
;==============================================================================}
;===============================================================================
;---{ ЗАВЕРШАЮЩАЯ ЧАСТЬ ПРОГРАММЫ
КОНЕЦ_ПРОГРАММЫ :;// Использеться для задания адреса начала кучи
; Размер кода защищенного режима Реального кода Бут-сектора
times 1474560 - ($ - ЗАЩИЩЕННЫЙ_РЕЖИМ.СТАРТ) - РАЗМЕР_КОДА_РЕАЛЬНОГО_РЕЖИМА - 0x200 db 0x90
;---}
;---{ МНЕМОНИКИ -МНЕМОНИКИ:
;-ЖШРИФТ:
;-clBlack:
;MOV:
;ADD:
;SUB:
;CALL:
;JMP:
;JZ:
;JNZ:
;JA:
;JB:
;JAE:
;JBE:
;RET:
;PUSHAD:
;POPAD:
;POP:
;PUSH:
;TEST:
;CMP:
;INC:
;DEC:
;ORG:
;BYTE:
;WORD:
;XOR:
;SHL:
;SHR:
;-КОНЕЦ:
;==============================================================================}
;---{ РЕГИСТРЫ -РЕГИСТРЫ:
;-ЖШРИФТ:
;-clBlue:
;AL:
;AH:
;AX:
;BL:
;BH:
;BX:
;CL:
;CH:
;CX:
;DL:
;DH:
;DX:
;EAX:
;EBX:
;ECX:
;EDX:
;ESI:
;EDI:
;SI:
;DI:
;ES:
;-КОНЕЦ:
;==============================================================================}
@i8van
Copy link

i8van commented Mar 26, 2021

l

@i8van
Copy link

i8van commented Mar 26, 2021

l

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment