Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эмулятор Радио86рк, пробуем написать ) 
:(
    Опции темы
500mhz
  Дата 23.3.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Решил вот побаловаться и заодно мозги размять )))

Собственно появлась идея написать эмулятор с  загрузкой  с FD или USB (без наличия ОС на носителе)
В связи с чем если у кого есть даташит по опкодам KP580 киньте в меня )

радио86
KP580

Значит что я наваял за вчерашний вечер
1) FAT12 boot loader - грузит с корня дискетки файл INIT32.BIN (на адрес 0xd000) ,в качестве бонуса при отсутствии файла выводит красивое зелененкое окошко с предпреждением
2) INIT32.BIN собственно начало эмулятора, переводит проц в FlatRealMode CS=0-4gb все остальные сегменты тоже самое, получает необходимую инфу о VESA и устанавливает режим 640х480х32 и копирует часть змулятора на адрес 0x100000, где он и будет работать.

собственно boot

Код


            org 0x7c00
            jmp short start
            nop

OEM:            db '-500mhz-'
BytePerSector:        dw 512
SectorPerClaster:    db 1
ReservedSectors:    dw 1
NumbersOfFats:        db 2
RootEntres:        dw 224
NumbersOfSectors:    dw 2880
MediaDescriptor:    db 0xf0
SectorsPerFat:        dw 9
SectorsPerHead:    dw 18
HeadsPerCylinder:    dw 2
HiddenSectors:        dd 0
BigNumberOfSectors:    dd 0
DriveNum:        db 0
Reserved:        db 0
BootSig:        db 0x29
ID:            dd 0xffffffff
DiskName:        db '-=500mhz=- '
FyleSystem:        db 'FAT12   '

start:
            cli
            jmp 0:init
init:
            push cs
            pop ax
            mov ds,ax
            mov es,ax
            mov ss,ax
            mov sp,0x7000
            mov [drive],dl
            mov ah, 0
            int 0x13
            mov ah,0x2
            mov al,0x9
            mov ch,0x0
            mov cl,0x2
            mov dh,0x0
            mov dl,byte [drive]
            mov bx,fat_buff
            int 0x13
            mov ah,0x2
            mov al,14
            mov bx,root_buff
            mov ch,0x0
            mov cl,0x2
            mov dh,0x1
            mov dl,byte [drive]
            int 0x13
            mov ax,root_buff
            cld
f_start:
            mov si,ax
            mov di,filename
            mov cx,11
            repe cmpsb
            je found_file
            add ax,32
            cmp ax,root_buff_end
            jne f_start
            mov ah,0
            mov al,3
            int 0x10
            mov dx,0x3d4
            mov al,0xa
            out dx,al
            inc dx
            shl ax,1
            out dx,al
            mov ax,0xb800
            mov es,ax
            xor di,di
            mov cx,80*25
            mov ax,0xff20
            repnz stosw
            mov cx,15
            mov di,80*2*5+40
            mov ax,0x2020
xlp:
            push di
            push cx
            mov cx,40
            repnz stosw
            pop cx
            pop di
            add di,80*2
            loop xlp
            add di,80*2-158
            mov cx,40
            mov ax,0x0fB0
            repnz stosw

            mov di,80*2*5+40+80+80*2
            mov cx,15
xlp1:
            mov [es:di],word 0x0fB0
            add di,80*2
            loop xlp1
            mov di,80*2*5+40+10+80*2*8+10
            mov cx,txt2-txt1
            mov si,txt1
            repnz movsb
            jmp $
txt1:
            db 'I N I T 3 2 . B I N   N o t   f o u n d'
txt2:
found_file:
            mov si,ax
            mov ax,[si+26]
            mov [cluster],ax
            mov cx,512*3
            mov si,fat_buff
            mov di,fat

fat_decode_loop:
            lodsd
            dec si
            mov ebx,eax
            and eax,0xfff
            stosw
            mov eax,ebx
            shr eax,12
            and eax,0xfff
            stosw
            loop fat_decode_loop
            mov ax,0x0
            mov es,ax
            mov bx,0xd000
            mov ax,[cluster]
load_loop:
            mov si,ax
            shl si,1
            mov cx,[fat+si]
            mov [cluster],cx
            add ax,31
            mov dx,0
            mov di,18
            div di
            mov cl,dl
            add cl,1
            mov dx,0
            mov di,2
            div di
            mov ch,al
            mov dh,dl
            mov ah,0x2
            mov al,1
            mov dl,[drive]
            int 0x13
            add bx,512
            mov ax,[cluster]
            cmp ax,0xff8
            jb load_loop
            jmp 0x0:0xd000





filename:        db 'INIT32  BIN'
            times 510 - ($-$$)   db 0
            db 0x55,0xAA
drive:
            db ?
cluster:
            dw ?
fat_buff:
            times 9*512    db ?  ;4608
root_buff:
            times 224*32    db ?  ;7168
root_buff_end:
fat:
            times (9*512*3)/2    db ?    ;6912




INIT32.BIN
Код


include 'proc32.inc'

    org 0xd000
use16
    push cs
    pop es
    mov ax,0x4f00
    mov di,VESA_INFO
    int 0x10

    mov ax,4f01h
    mov di,VBEModeInfoBlock
    mov cx,4129h
    int 10h

    mov ax,4f02h
    mov bx,4129h
    int  10h


    cli
    in al,0x92
    or al,2
    out 0x92,al
    lgdt [cs:GDT_ADDR]
    mov eax,cr0
    inc eax
    mov cr0,eax
    mov bx,0x10
    mov ds,bx
    mov es,bx
    mov fs,bx
    mov gs,bx
    mov ss,bx
    jmp 8:pmode
pmode:
    dec eax
    mov cr0,eax
rmode:
use32
    mov esi,_kernel_s
    mov edi,0x100000
    mov ecx,_kernel_e-_kernel_s
    repnz movsb
    mov esi,VESA_INFO
    mov ecx,VESA_INFO_E-VESA_INFO
    repnz movsb
    mov eax,[PhysBasePtr]
    jmp 0x100000

GDT32:
    dq    0x0000000000000000 ;
    dq    0x00cf9a000000ffff ;# cs
    dq    0x00cf92000000ffff ;# ds
    dq    0x0000000000000000 ; оставим на потом
    dq    0x0000000000000000 ; оставим на потом

GDT_ADDR:
GDT_SIZE:
    dw    $-1-GDT32
GDT_BASE:
    dd    GDT32

VESA_INFO:
    VESASignature:         db ?,?,?,?
    VESAVersion:         db ?
    OEMStringPtr:         dd ?
    Capabilities:         db ?,?,?,?
    VideoModePtr:         dd ?
    TotalMemory:         dw ?
    OemSoftwareRev:     dw ?
    OemVendorNamePtr:     dd ?
    OemProductNamePtr:     dd ?
    OemProductRevPtr:     dd ?
    Reserved:         times 222 db ?
    OemData:         times 256 db ?
VESA_INFO_E:

VBEModeInfoBlock:
     ModeAttributes     dw ?       ; mode attributes (flags)
     WinAAttributes     db ?       ; window A attributes
     WinBAttributes     db ?       ; window B attributes
     WinGranularity     dw ?       ; window granularity
     WinSize         dw ?       ; window size
     WinASegment     dw ?       ; window A start segment
     WinBSegment     dw ?       ; window B start segment
     WinFuncPtr     dd ?       ; pointer to window function
     BytesPerScanLine     dw ?       ; bytes per scan line

  ; Following is available if bit 1 of ModeAttributes is set
  ; Always true under VBE 1.2+
     XResolution     dw ?       ; horizontal resolution in pixels or chars
     YResolution     dw ?       ; vertical resolution in pixels or chars
     XCharSize         db ?       ; character cell width in pixels
     YCharSize         db ?       ; character cell height in pixels
     NumberOfPlanes     db ?       ; number of memory planes
     BitsPerPixel     db ?       ; bits per pixel
     NumberOfBanks     db ?       ; number of banks
     MemoryModel     db ?       ; memory model type
     BankSize         db ?       ; bank size in KB
     NumberOfImagePages  db ?       ; number of images
     _Reserved         db ?       ; reserved for page function

  ; Direct Colour fields (required for direct/6 and YUV/7 memory models)
     RedMaskSize     db ?       ; size of direct colour red mask in bits
     RedFieldPosition     db ?       ; bit position of lsb of red mask
     GreenMaskSize     db ?       ; size of direct colour green mask in bits
     GreenFieldPosition  db ?       ; bit position of lsb of green mask
     BlueMaskSize     db ?       ; size of direct colour blue mask in bits
     BlueFieldPosition     db ?       ; bit position of lsb of blue mask
     RsvdMaskSize     db ?       ; size of direct colour reserved mask in bits
     RsvdFieldPosition     db ?       ; bit position of lsb of reserved mask
     DirectColorModeInfo db ?       ; direct colour mode attributes

  ; Following is VBE 2.0+ only
     PhysBasePtr     dd ?       ; physical address for flat frame buffer
     OffScreenMemOffset  dd ?       ; pointer to start of off screen memory
     OffScreenMemSize     dw ?       ; amount of off screen memory in 1k units
     __Reserved     db 206 dup (?)  ; remainder of ModeInfoBlock
VBEModeInfoBlock_E:


_kernel_s:
include 'kernel.asm'
_kernel_e:





kernel.asm  - тут будет core ))) компилять под 0x100000 при запуске kernel в eax передаеться PhysBasePtr - адрес видеопамяти , там и будем рисовать ), соответственно mov [eax], dword 0xffffffff  поставит нам белую точечку в левом верхнем углу экрана (это для тех кто не знал)


на сим и раскланиваюсь ) ждите продолжения


--------------------

PM MAIL ICQ   Вверх
500mhz
Дата 23.3.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



BUGFIX !

Код

    mov ax,4f01h
    mov di,VBEModeInfoBlock
    mov cx,4129h
    int 10h
    mov ax,4f02h
    mov bx,4129h
    int  10h


на реальном железе с nVidia работает как 640х480х32 на VBOX и BOCHS - не пашет
кароче упростим и заменим на
Код

    mov ax,4f01h
    mov di,VBEModeInfoBlock
    mov cx,4101h
    int 10h
    mov ax,4f02h
    mov bx,4101h
    int  10h


640х480х8  - один черт радио86 чорнобелий )


--------------------

PM MAIL ICQ   Вверх
500mhz
  Дата 23.3.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



вопрос как правильно определить размер доступной памяти? с учетом того что к bios обрашаться нельзя (у нас какбы 32bit режим а bios 16bit)

я ничего умнее не придумал
Код

proc kmemtest
        xor esi,esi
.go:
        mov al,[esi]
        inc al
        mov [esi],al
        dec al
        cmp [esi],al
        je .end
        mov [esi],al
        inc esi
        jmp .go
.end:
        dec esi
        mov eax,esi
        ret
endp 


собственно boot.img
теперь мы умеем печатать ) 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  boot.zip 3,80 Kb


--------------------

PM MAIL ICQ   Вверх
500mhz
Дата 24.3.2011, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



нарыл толковый даташит http://www.pastraiser.com/cpu/i8080/i8080_opcodes.html


--------------------

PM MAIL ICQ   Вверх
500mhz
  Дата 24.3.2011, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



прикрутил "родной" шрифт от 86рк, выглядит прикольно )

user posted image

Uploaded with ImageShack.us


--------------------

PM MAIL ICQ   Вверх
500mhz
Дата 24.3.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



пофиксил определение размера памяти, кароче алгоритм верный, просто я запарился с linear / phys адресацией )))

теперь изменяя в vbox или bochs размер памяти он отображается корректно

пишу core cpu )))

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  boot.zip 5,53 Kb


--------------------

PM MAIL ICQ   Вверх
Игорь1024
Дата 24.3.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



500mhz, театр одного актёра smile
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
500mhz
Дата 24.3.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



))))) HLLшикам этого не понять


--------------------

PM MAIL ICQ   Вверх
Игорь1024
Дата 24.3.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



 smile . Нет, я не HLLшик (и таки никогда к таковым не относился).
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
500mhz
Дата 24.3.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



сам интерес именно в написании на асме да еше на загрузочной дискетке )
в принципе эмулятров радио86рк в инете как грязи вон даже на java script есть http://radio86.googlecode.com/hg/online/radio86.html


--------------------

PM MAIL ICQ   Вверх
Игорь1024
Дата 24.3.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



ASM rocks!
Для закрепления многих вещей само то!
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
iff
Дата 25.3.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Цитата(500mhz @  23.3.2011,  20:58 Найти цитируемый пост)
с учетом того что к bios обрашаться нельзя (у нас какбы 32bit режим а bios 16bit)

Т.е. процессор работает в защищенном режиме?


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
500mhz
Дата 25.3.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



нет, проц я перевожу  в pmode устанавливаю GDT с сегментами base=0 limit 0xffffffff и возврашаюсь в real mode 
при этом получаю 32 адресацию и доступ к 4гб теоретической памяти плюс ко всему имеем linear frame buffer видео памяти
но так как bios сам по себе 16 битен то при вызове любого INT будет кирдык ) тут либо нужно работать напрямую с железом или писать gate для обрашения к bios.
хотя в принципе подумав хорощенько можно остаться и в pmode , наверно так и сделаю.


--------------------

PM MAIL ICQ   Вверх
Dreamuchiy
Дата 13.4.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.12.2006

Репутация: нет
Всего: -1



Я поддерживаю идею автора и давно хочу сделать примерно тоже самое но эмулятор zx-spectrum вообщем z-80 минуя досы и виндовсы тем более (бесят) потом усовершенствовать basic 128 под x86 машину, вобщем работать в давно изведанной среде но с современными возможностями. Как то так. Но пока ни времени ни знаний не хватает. Повзрослел уже, семья, дети, работа и тп
--------------------
Мечтаю написать в карман Биллу Гейтсу... Или как минимум посмотреть крах Майкрософт...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.6649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.