Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;---{ ЗАГРУЗЧИК
- ;---{ Описание
- ; В блоке ЗАГРУЗОЧНЫЙ_СЕКТОР устанавлвиаеться видеорежим в котром будет запущена программа
- ; Через ES достапна вся память [ES:0B8000h] Адрес видеопамяти
- ; DS и программа сама начинаеться с адреса 0 в блоке ЗАЩИЩЕННЫЙ_РЕЖИМ
- ; Все что ниже уже пишеться в 32 битном режиме сама программа
- ; Сама програмам распологаеться кажися по адресу 0x8000
- ; Количество загружаемых секторов не забывем указывать в разделе ЗАГРУЗОЧНЫЙ_СЕКТОР
- ; НЕ азбываем конце программы ставить секцию ЗАВЕРШАЮЩАЯ ЧАСТЬ ПРОГРАММЫ
- ; Между секцией ЗАГРУЗЧИК и ЗАВЕРШАЮЩАЯ ЧАСТЬ ПРОГРАММЫ размещаем свой код
- ;---}
- ;---{ Загрузчик
- 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;
- ;------------------------------;}
- ;------------------------------;{ Скан код нажатый
- mov ecx,35 ;
- mov edx,14 ;
- call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
- mov ESI,.TEXTKEY1 ;
- call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
- mov EAX,[КНОПКА_1] ;
- call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX ;
- mov ESI,.TEXTPROBEL ;
- call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
- ;------------------------------;}
- ;------------------------------;{ Скан код предыдущий
- mov ecx,35 ;
- mov edx,15 ;
- call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
- mov ESI,.TEXTKEY2 ;
- call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
- mov EAX,[КНОПКА_2] ;
- call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_EAX ;
- mov ESI,.TEXTPROBEL ;
- call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
- ;------------------------------;}
- ;------------------------------;{ Нажатый символ
- mov ecx,35 ;
- mov edx,16 ;
- call ЭКРАН_80_25_КУРСОР_ECX_EDX ;
- mov ESI,.TEXTKEY2 ;
- call ЭКРАН_80_25_ВЫВОД_СТРОКИ_ESI;
- mov al,[БУКВА_1] ;
- mov ah,[ЭКРАН_80_25_ФОН] ;
- call ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL ;
- 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;
- .TEXTKEY1 : db 'KEY1 Info=',0;
- .TEXTKEY2 : db 'KEY2 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 НА НИЗКОМ УРОВНЕ
- ;---{ Описание
- ; Мудуль для работы с клавиатурой и мышкой 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;
- call СКАНКОД_В_БУКВУ;
- 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
- ;---{ ДЛя работы со скан кодами
- СКАНКОД_В_БУКВУ:;{
- ;{Описание
- ; На входе получаем AL скан код возырвщвем в Al код буквы
- ;}
- push ESI;
- Push ecx;
- mov Cl,al;
- xor eax,eax;
- mov al,cl;
- pop ECX;
- cmp al,130;
- jb .НЕ_ИЗВЕТНЫЙ;
- cmp al,182;
- ja .НЕ_ИЗВЕТНЫЙ;
- mov esi,.SCANCOD;
- sub eax,130
- add ESI,eax;
- Mov al,[ESI];
- jmp .ВЫХОД;
- .НЕ_ИЗВЕТНЫЙ: mov al,0 ;
- .ВЫХОД:
- pop ESI ;
- ret
- .SCANCOD:;{// Скан коды
- db "1234567890-=",12 ;//Скан коды с 130 до 142 включительно 12 это DEL
- db 9,"qwertyuiop[]",13 ;//Скан коды с 143 до 156 включительно Первй это там послдений это Enter
- db 0,"asdfghjkl;'" ;//Скан коды с 157 до 168 Включительно Первый неизвестно
- db "`",1,"\zxcvbnm,./",2;//Скан коды с 169 до 182 включительно 1 это лев сшифт 2 это правй сшифт
- ;}
- ;}
- ;// переменные для работы с мышкой на низком уровне
- БУКВА_1 : DD 0; // Символ нажатой кнопки клавиатуры
- КНОПКА_1 : DD 0; // Скан код нажатой кнопки клавиатуры
- МЫШКА_I1 : DD 0; // Информация о мышке Нажатые кнопки и так далее
- МЫШКА_X1 : DD 0;
- МЫШКА_Y1 : DD 0;
- ;// ПРедыдущие значение данных от PS/2
- БУКВА_2 : DD 0; // Символ Ранее нажатой кнопки клавиатуры
- КНОПКА_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:
- ;-КОНЕЦ:
- ;==============================================================================}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement