;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; ELANBOOT.ASM ; Bootloader for ELAN processor from PROM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME elanboot ;;;;;;;;; INTERNAL PROCEDURES ;;;;;;;;;;; .model Small GateSize = 16 INCLUDE \rdos\os\system.def INCLUDE \rdos\os\protseg.def INCLUDE \rdos\os\system.inc DRAM_BASE EQU 00000000h FLASH_BASE EQU 02000000h PROM_BASE EQU 03000000h DefaultIdtEntry MACRO dw OFFSET DefaultInt dw device_code_sel dw 8E00h dw 0 ENDM BootIdtEntry MACRO Offs dw OFFSET Offs dw device_code_sel dw 8E00h dw 0 ENDM BootExceptionOnePar MACRO Entry push bp mov bp,sp sti push eax push ebx push ds mov al,Entry ShutDownPreTask ENDM BootExceptionNoPar MACRO Entry push dword ptr 0 push bp mov bp,sp sti push eax push ebx push ds mov al,Entry ShutDownPreTask ENDM FindRam MACRO Local RamLoop Local RamNext Local RamFound mov ax,flat_sel mov ds,ax jmp RamNext RamLoop: mov eax,AllocMemSign mov [esi],eax cmp eax,[esi] je RamFound RamNext: add esi,1000h cmp esi,FLASH_BASE jc RamLoop stc RamFound: ENDM .code .386p ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CalcCrc ; ; DESCRIPTION: Calculate CRC for one byte ; ; PARAMETERS: AX CRC ; DS:ESI Address to data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CalcCrc Proc near push cx mov cl,[esi] inc esi xor ah,cl ; mov cx,1021h shl ax,1 jnc no_xor0 xor ax,cx no_xor0: shl ax,1 jnc no_xor1 xor ax,cx no_xor1: shl ax,1 jnc no_xor2 xor ax,cx no_xor2: shl ax,1 jnc no_xor3 xor ax,cx no_xor3: shl ax,1 jnc no_xor4 xor ax,cx no_xor4: shl ax,1 jnc no_xor5 xor ax,cx no_xor5: shl ax,1 jnc no_xor6 xor ax,cx no_xor6: shl ax,1 jnc no_xor7 xor ax,cx no_xor7: pop cx ret CalcCrc Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetRamSize ; ; DESCRIPTION: Get installed RAM size ; ; RETURNS: EAX Size of installed RAM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetRamSize Proc near mov eax,2000000h ret GetRamSize Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetPromSize ; ; DESCRIPTION: Get installed PROM size ; ; RETURNS: EAX Size of installed PROM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetPromSize Proc near mov eax,20000h ret GetPromSize Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetAdapter ; ; DESCRIPTION: Get adapter ; ; PARAMETERS: ESI Adress to start search at ; ; RETURNS: ESI Adapter base ; ECX Size of adapter ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetAdapter Proc near push ds mov ax,flat_sel mov ds,ax GetAdapterSearch: mov eax,[esi] cmp eax,RdosSign je GetAdapterFound GetAdapterNext: add esi,1000h or esi,esi jne GetAdapterSearch stc jmp GetAdapterDone GetAdapterCorrupt: pop esi jmp GetAdapterNext GetAdapterFound: push esi xor ecx,ecx GetAdapterNextDriver: cmp [esi].sign,RdosSign jne GetAdapterCorrupt ; cmp [esi].typ,RdosEnd je GetAdapterOk mov edx,[esi].len add ecx,edx cmp ecx,1000000h jnc GetAdapterCorrupt ; xor ax,ax push ecx push esi mov ecx,edx add esi,SIZE rdos_header sub ecx,SIZE rdos_header jz GetAdapterCrcDone GetAdapterCrcLoop: call CalcCrc sub ecx,1 jnz GetAdapterCrcLoop GetAdapterCrcDone: pop esi pop ecx cmp ax,[esi].crc jne GetAdapterCorrupt ; add esi,edx jmp GetAdapterNextDriver GetAdapterOk: pop esi clc GetAdapterDone: pop ds ret GetAdapter Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: AdapterCrc ; ; DESCRIPTION: Calculate adapter CRC ; ; PARAMETERS: ESI Adapter base ; ECX Size of adapter ; ; RETURNS: AX Adapter CRC ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AdapterCrc Proc near push ds mov ax,flat_sel mov ds,ax xor ax,ax push ecx push esi AdapterCrcLoop: call CalcCrc sub ecx,1 jnz AdapterCrcLoop pop esi pop ecx pop ds ret AdapterCrc Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: AddAdapter ; ; DESCRIPTION: ; ; PARAMETERS: ESI Adapter base ; ECX Size of adapter ; AX Adapter CRC ; BX Current Adapter record ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AddAdapter Proc near push dx push di mov di,OFFSET rom_adapters mov dx,ds:rom_modules AddAdapterCheck: or dx,dx jz AddAdapterDo cmp ecx,[di].adapter_size jne AddAdapterCheckNext cmp ax,[di].adapter_crc je AddAdapterEnd AddAdapterCheckNext: dec dx add di,SIZE adapter_typ jmp AddAdapterCheck AddAdapterDo: inc ds:rom_modules mov [bx].adapter_base,esi mov [bx].adapter_size,ecx mov [bx].adapter_crc,ax add bx,SIZE adapter_typ AddAdapterEnd: pop di pop dx ret AddAdapter Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetAllAdapters ; ; DESCRIPTION: Get all adapters ; ; PARAMETERS: ESI Adress to start search at ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetAllAdapters Proc near mov ax,system_data_sel mov ds,ax mov ds:rom_modules,0 mov bx,OFFSET rom_adapters mov esi,PROM_BASE get_adapters_loop: call GetAdapter jc get_adapters_done call AdapterCrc call AddAdapter add esi,ecx dec esi and si,0F000h add esi,1000h jmp get_adapters_loop get_adapters_done: ret GetAllAdapters Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StartShutdownDevice ; ; DESCRIPTION: Starts shutdown-device ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; StartShutDownDevice Proc near mov ax,system_data_sel mov ds,ax mov ax,flat_sel mov es,ax mov cx,ds:rom_modules mov bx,OFFSET rom_adapters or cx,cx jz StartShutDeviceEnd StartShutAdapterLoop: push bx push cx mov esi,[bx].adapter_base StartShutDeviceLoop: cmp es:[esi].typ,RdosShutDown je StartShutDeviceDo cmp es:[esi].typ,RdosEnd je StartShutNextAdapter add esi,es:[esi].len jmp StartShutDeviceLoop StartShutNextAdapter: pop cx pop bx add bx,SIZE adapter_typ loop StartShutAdapterLoop jmp StartShutDeviceEnd StartShutDeviceDo: pop cx pop bx ; push ds push es pushad push cs push OFFSET StartShutDeviceInitied mov ax,flat_sel mov ds,ax mov bx,shutdown_code_sel push bx mov ecx,[esi].len add esi,SIZE rdos_header push word ptr [esi].init_ip add esi,SIZE device_header mov ax,gdt_sel mov ds,ax dec cx mov [bx],cx mov [bx+2],esi mov ah,9Ah xchg ah,[bx+5] xor al,al mov [bx+6],ax retf StartShutDeviceInitied: mov ax,gdt_sel mov ds,ax mov bx,idt_sel mov eax,[bx+2] sub eax,OFFSET rom_idt add eax,OFFSET boot_idt mov [bx+2],eax mov al,[bx+7] xchg al,[bx+5] db 66h lidt [bx] xchg al,[bx+5] popad pop es pop ds ; StartShutDeviceEnd: ret StartShutDownDevice Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetBootDevice ; ; DESCRIPTION: Get header of boot-device ; ; RETURNS: NC ; ESI Boot device base ; CY No boot device ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetBootDevice Proc near mov ax,system_data_sel mov ds,ax mov ax,flat_sel mov es,ax mov cx,ds:rom_modules mov bx,OFFSET rom_adapters or cx,cx jz GetBootDeviceFail GetBootAdapterLoop: push bx push cx mov esi,[bx].adapter_base GetBootDeviceLoop: cmp es:[esi].typ,RdosKernel je GetBootDeviceOk cmp es:[esi].typ,RdosEnd je GetBootNextAdapter add esi,es:[esi].len jmp GetBootDeviceLoop GetBootNextAdapter: pop cx pop bx add bx,SIZE adapter_typ loop GetBootAdapterLoop jmp GetBootDeviceFail GetBootDeviceOk: pop cx pop bx clc jmp GetBootDeviceEnd GetBootDeviceFail: stc GetBootDeviceEnd: ret GetBootDevice Endp DefaultInt: hlt rom_gdt: gdt0: dw 0 dd 0 dw 0 gdt8: dw 10h*8-1 dd 92FF0000h + OFFSET rom_idt dw 00300h gdt10: dw 28h-1 dd 92FF0000h + OFFSET rom_gdt dw 00300h gdt18: dw 0FFFFh dd 9AFF0000h dw 00300h gdt20: dw 0FFFFh dd 92000000h dw 8Fh rom_idt: DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry DefaultIdtEntry Boot0: BootExceptionNoPar 0 Boot1: BootExceptionNoPar 1 Boot2: BootExceptionNoPar 2 Boot3: BootExceptionNoPar 3 Boot4: BootExceptionNoPar 4 Boot5: BootExceptionNoPar 5 Boot6: BootExceptionNoPar 6 Boot7: BootExceptionNoPar 7 Boot8: BootExceptionNoPar 8 Boot9: BootExceptionNoPar 9 BootA: BootExceptionNoPar 0Ah BootB: BootExceptionOnePar 0Bh BootC: BootExceptionOnePar 0Ch BootD: BootExceptionOnePar 0Dh BootE: BootExceptionNoPar 0Eh BootF: BootExceptionNoPar 0Fh boot_idt: BootIdtEntry Boot0 BootIdtEntry Boot1 BootIdtEntry Boot2 BootIdtEntry Boot3 BootIdtEntry Boot4 BootIdtEntry Boot5 BootIdtEntry Boot6 BootIdtEntry Boot7 BootIdtEntry Boot8 BootIdtEntry Boot9 BootIdtEntry BootA BootIdtEntry BootB BootIdtEntry BootC BootIdtEntry BootD BootIdtEntry BootE BootIdtEntry BootF idt_reg: dw 10h*8-1 dd 003FF0000h + OFFSET rom_idt gdt_reg: dw 28h-1 dd 003FF0000h + OFFSET rom_gdt ; mask value csc_tab: csc00 DB 0, 0 csc01 DB 0, 0 csc02 DB 0, 0 csc03 DB 0, 0 csc04 DB 0DFh,5Ch csc05 DB 7Fh, 40h csc06 DB 0FFh,00h csc07 DB 0Fh, 00h csc08 DB 0, 0 csc09 DB 0, 0 csc0A DB 0, 0 csc0B DB 0, 0 csc0C DB 0, 0 csc0D DB 0, 0 csc0E DB 0, 0 csc0F DB 0, 0 csc10 DB 0, 0 csc11 DB 7Fh, 00h csc12 DB 0, 0 csc13 DB 1Fh, 00h csc14 DB 0FFh,10h csc15 DB 0, 0 csc16 DB 0, 0 csc17 DB 0, 0 csc18 DB 0, 0 csc19 DB 0, 0 csc1A DB 0, 0 csc1B DB 0, 0 csc1C DB 0, 0 csc1D DB 0, 0 csc1E DB 0, 0 csc1F DB 0, 0 csc20 DB 0, 0 csc21 DB 0FFh,90h csc22 DB 0FFh,0F0h csc23 DB 0, 0 csc24 DB 0, 0 csc25 DB 0, 0 csc26 DB 0, 0 csc27 DB 0, 0 csc28 DB 0, 0 csc29 DB 0, 0 csc2A DB 0, 0 csc2B DB 0, 0 csc2C DB 0, 0 csc2D DB 0, 0 csc2E DB 0, 0 csc2F DB 0, 0 csc30 DB 0, 0 csc31 DB 0, 0 csc32 DB 0, 0 csc33 DB 0, 0 csc34 DB 0, 0 csc35 DB 0, 0 csc36 DB 0, 0 csc37 DB 0, 0 csc38 DB 0DFh,1Fh csc39 DB 7Fh, 00h csc3A DB 03h, 00h csc3B DB 0, 0 csc3C DB 0, 0 csc3D DB 0, 0 csc3E DB 0, 0 csc3F DB 0, 0 csc40 DB 0, 0 csc41 DB 0, 0 csc42 DB 0, 0 csc43 DB 0, 0 csc44 DB 0, 0 csc45 DB 0, 0 csc46 DB 0, 0 csc47 DB 0, 0 csc48 DB 0, 0 csc49 DB 0, 0 csc4A DB 0, 0 csc4B DB 0, 0 csc4C DB 0, 0 csc4D DB 0, 0 csc4E DB 0, 0 csc4F DB 0, 0 csc50 DB 0Fh, 00h csc51 DB 0, 0 csc52 DB 0, 0 csc53 DB 0, 0 csc54 DB 0, 0 csc55 DB 0, 0 csc56 DB 0, 0 csc57 DB 0, 0 csc58 DB 0, 0 csc59 DB 0, 0 csc5A DB 0, 0 csc5B DB 0, 0 csc5C DB 0, 0 csc5D DB 0, 0 csc5E DB 0, 0 csc5F DB 0, 0 csc60 DB 0, 0 csc61 DB 0, 0 csc62 DB 0, 0 csc63 DB 0, 0 csc64 DB 0, 0 csc65 DB 0, 0 csc66 DB 0, 0 csc67 DB 0, 0 csc68 DB 0, 0 csc69 DB 0, 0 csc6A DB 0, 0 csc6B DB 0, 0 csc6C DB 0, 0 csc6D DB 0, 0 csc6E DB 0, 0 csc6F DB 0, 0 csc70 DB 0, 0 csc71 DB 0, 0 csc72 DB 0, 0 csc73 DB 0, 0 csc74 DB 0, 0 csc75 DB 0, 0 csc76 DB 0, 0 csc77 DB 0, 0 csc78 DB 0, 0 csc79 DB 0, 0 csc7A DB 0, 0 csc7B DB 0, 0 csc7C DB 0, 0 csc7D DB 0, 0 csc7E DB 0, 0 csc7F DB 0, 0 csc80 DB 1Fh, 04h csc81 DB 0, 0 csc82 DB 7Fh, 21h csc83 DB 0Fh, 08h csc84 DB 0, 0 csc85 DB 0, 0 csc86 DB 0, 0 csc87 DB 0, 0 csc88 DB 0, 0 csc89 DB 0, 0 csc8A DB 0, 0 csc8B DB 0, 0 csc8C DB 0, 0 csc8D DB 0, 0 csc8E DB 0, 0 csc8F DB 0, 0 csc90 DB 0FFh,00h csc91 DB 0FFh,00h csc92 DB 1Fh, 00h csc93 DB 0FFh,00h csc94 DB 0FFh,00h csc95 DB 0FFh,00h csc96 DB 3Fh, 00h csc97 DB 0FFh,00h csc98 DB 0FFh,00h csc99 DB 1Fh, 00h csc9A DB 7Fh, 00h csc9B DB 1Fh, 00h csc9C DB 7Fh, 00h csc9D DB 03h, 00h csc9E DB 0, 0 csc9F DB 0, 0 cscA0 DB 0FFh,00h cscA1 DB 0FFh,00h cscA2 DB 0FFh,00h cscA3 DB 0FFh,00h cscA4 DB 0FFh,00h cscA5 DB 0FFh,00h cscA6 DB 0, 0 cscA7 DB 0, 0 cscA8 DB 0, 0 cscA9 DB 0, 0 cscAA DB 0, 0 cscAB DB 0, 0 cscAC DB 0, 0 cscAD DB 0, 0 cscAE DB 0FFh,0FFh cscAF DB 0FFh,0FFh cscB0 DB 1Fh, 0Fh cscB1 DB 0FFh,0FFh cscB2 DB 0FFh,0FFh cscB3 DB 0FFh,0FFh cscB4 DB 0, 0 cscB5 DB 0, 0 cscB6 DB 0, 0 cscB7 DB 0, 0 cscB8 DB 0, 0 cscB9 DB 0, 0 cscBA DB 0, 0 cscBB DB 0, 0 cscBC DB 0, 0 cscBD DB 0, 0 cscBE DB 0, 0 cscBF DB 0, 0 cscC0 DB 0FFh,06h cscC1 DB 7Fh, 00h cscC2 DB 0, 0 cscC3 DB 0, 0 cscC4 DB 0, 0 cscC5 DB 0, 0 cscC6 DB 0, 0 cscC7 DB 0FFh,0FFh cscC8 DB 0FFh,0FFh cscC9 DB 0FFh,0FFh cscCA DB 0, 0 cscCB DB 0, 0 cscCC DB 0, 0 cscCD DB 0, 0 cscCE DB 0, 0 cscCF DB 0, 0 cscD0 DB 3Fh, 02h cscD1 DB 0Fh, 01h cscD2 DB 0, 0 cscD3 DB 0C0h,80h cscD4 DB 0FFh,00h cscD5 DB 0FFh,00h cscD6 DB 0FFh,00h cscD7 DB 0FFh,00h cscD8 DB 0F7h,40h cscD9 DB 0, 0 cscDA DB 0, 0 cscDB DB 0FFh,00h cscDC DB 0Fh, 00h cscDD DB 0FFh,00h cscDE DB 0, 0 cscDF DB 0, 0 cscE0 DB 7Fh, 00h cscE1 DB 0, 0 cscE2 DB 0, 0 cscE3 DB 0EFh,00h cscE4 DB 0, 0 cscE5 DB 0, 0 cscE6 DB 0, 0 cscE7 DB 0, 0 cscE8 DB 0, 0 cscE9 DB 0, 0 cscEA DB 0, 0 cscEB DB 0, 0 cscEC DB 0, 0 cscED DB 0, 0 cscEE DB 0, 0 cscEF DB 0, 0 cscF0 DB 0, 0 cscF1 DB 0F3h,00h cscF2 DB 0, 0 cscF3 DB 0, 0 cscF4 DB 0, 0 cscF5 DB 0, 0 cscF6 DB 0, 0 cscF7 DB 0, 0 cscF8 DB 0, 0 cscF9 DB 0, 0 cscFA DB 0, 0 cscFB DB 0, 0 cscFC DB 0, 0 cscFD DB 0, 0 cscFE DB 0, 0 cscFF DB 0, 0 ; mask value pccard_tab: pcc00 DB 0, 0 pcc01 DB 0, 0 pcc02 DB 0FFh,00h pcc03 DB 0FFh,00h pcc04 DB 0, 0 pcc05 DB 0FFh,00h pcc06 DB 0FFh,00h pcc07 DB 0FFh,00h pcc08 DB 0, 0 pcc09 DB 0, 0 pcc0A DB 0, 0 pcc0B DB 0, 0 pcc0C DB 0, 0 pcc0D DB 0, 0 pcc0E DB 0, 0 pcc0F DB 0, 0 pcc10 DB 0, 0 pcc11 DB 0, 0 pcc12 DB 0, 0 pcc13 DB 0, 0 pcc14 DB 0, 0 pcc15 DB 0, 0 pcc16 DB 0, 0 pcc17 DB 0, 0 pcc18 DB 0, 0 pcc19 DB 0, 0 pcc1A DB 0, 0 pcc1B DB 0, 0 pcc1C DB 0, 0 pcc1D DB 0, 0 pcc1E DB 0, 0 pcc1F DB 0, 0 pcc20 DB 0, 0 pcc21 DB 0, 0 pcc22 DB 0, 0 pcc23 DB 0, 0 pcc24 DB 0, 0 pcc25 DB 0, 0 pcc26 DB 0, 0 pcc27 DB 0, 0 pcc28 DB 0, 0 pcc29 DB 0, 0 pcc2A DB 0, 0 pcc2B DB 0, 0 pcc2C DB 0, 0 pcc2D DB 0, 0 pcc2E DB 0, 0 pcc2F DB 0, 0 pcc30 DB 0, 0 pcc31 DB 0, 0 pcc32 DB 0, 0 pcc33 DB 0, 0 pcc34 DB 0, 0 pcc35 DB 0, 0 pcc36 DB 0, 0 pcc37 DB 0, 0 pcc38 DB 0, 0 pcc39 DB 0, 0 pcc3A DB 0, 0 pcc3B DB 0, 0 pcc3C DB 0, 0 pcc3D DB 0, 0 pcc3E DB 0, 0 pcc3F DB 0, 0 pcc40 DB 0, 0 pcc41 DB 0, 0 pcc42 DB 0FFh,00h pcc43 DB 0FFh,00h pcc44 DB 0, 0 pcc45 DB 0FFh,00h pcc46 DB 0FFh,00h pcc47 DB 0FFh,00h pcc48 DB 0, 0 pcc49 DB 0, 0 pcc4A DB 0, 0 pcc4B DB 0, 0 pcc4C DB 0, 0 pcc4D DB 0, 0 pcc4E DB 0, 0 pcc4F DB 0, 0 pcc50 DB 0, 0 pcc51 DB 0, 0 pcc52 DB 0, 0 pcc53 DB 0, 0 pcc54 DB 0, 0 pcc55 DB 0, 0 pcc56 DB 0, 0 pcc57 DB 0, 0 pcc58 DB 0, 0 pcc59 DB 0, 0 pcc5A DB 0, 0 pcc5B DB 0, 0 pcc5C DB 0, 0 pcc5D DB 0, 0 pcc5E DB 0, 0 pcc5F DB 0, 0 pcc60 DB 0, 0 pcc61 DB 0, 0 pcc62 DB 0, 0 pcc63 DB 0, 0 pcc64 DB 0, 0 pcc65 DB 0, 0 pcc66 DB 0, 0 pcc67 DB 0, 0 pcc68 DB 0, 0 pcc69 DB 0, 0 pcc6A DB 0, 0 pcc6B DB 0, 0 pcc6C DB 0, 0 pcc6D DB 0, 0 pcc6E DB 0, 0 pcc6F DB 0, 0 pcc70 DB 0, 0 pcc71 DB 0, 0 pcc72 DB 0, 0 pcc73 DB 0, 0 pcc74 DB 0, 0 pcc75 DB 0, 0 pcc76 DB 0, 0 pcc77 DB 0, 0 pcc78 DB 0, 0 pcc79 DB 0, 0 pcc7A DB 0, 0 pcc7B DB 0, 0 pcc7C DB 0, 0 pcc7D DB 0, 0 pcc7E DB 0, 0 pcc7F DB 0, 0 dram_col_table: DB 8, 0 DB 9, 8 DB 10,9 DB 11,10 DB 12,11 DB 0, 12 dram_row_table: DB 22,0 DB 13,9 DB 24,10 DB 23,11 DB 12,12 DB 0, 13 dram_ctrl_tab: DB 12, 12, 06h DB 11, 13, 16h DB 11, 12, 05h DB 11, 11, 04h DB 10, 13, 15h DB 10, 12, 14h DB 10, 11, 03h DB 10, 10, 02h DB 9, 12, 13h DB 9, 10, 11h DB 9, 9, 00h DB 8, 12, 12h DB -1, -1, 00h init: cli in al,0EEh db 66h lgdt fword ptr gdt_reg db 66h lidt fword ptr idt_reg xor ax,ax lahf mov ebx,cr0 or bl,1 mov cr0,ebx db 0EAh dw OFFSET prot_init dw device_code_sel prot_init: mov ax,flat_sel mov ds,ax mov es,ax mov fs,ax mov gs,ax mov ss,ax ; mov dx,22h xor cl,cl mov bx,OFFSET csc_tab init_csc_loop: mov ah,cs:[bx] or ah,ah jz init_csc_next ; mov al,cl out dx,al inc dx not ah in al,dx and al,ah or al,cs:[bx+1] out dx,al in al,dx dec dx init_csc_next: add bx,2 inc cl or cl,cl jnz init_csc_loop ; mov dx,3E0h xor cl,cl mov bx,OFFSET pccard_tab init_pccard_loop: mov ah,cs:[bx] or ah,ah jz init_pccard_next ; mov al,cl out dx,al not ah inc dx in al,dx and al,ah or al,cs:[bx+1] out dx,al dec dx init_pccard_next: add bx,2 inc cl test cl,80h jz init_pccard_loop ; int 3 ; mov ax,8600h out 23h,ax ; mov ax,1005h out 22h,ax ; xor edi,edi mov dword ptr [edi],55AA55AAh mov eax,[edi] ; mov ax,0DC04h out 22h,ax ; mov ebx,[edi] ; mov ax,05C04h out 22h,ax ; mov ax,4005h out 22h,ax ; xor al,al out 22h,al ; mov eax,[edi] cmp eax,55AA55AAh jnz Failed ; cmp eax,ebx jnz dram_edo_done ; mov al,0A6h out 23h,al dram_edo_done: mov bx,OFFSET dram_col_table mov eax,3ABC3478h mov ebp,45AC65BCh dram_col_loop: mov cx,cs:[bx] inc bx inc bx or cl,cl jz dram_col_exit ; xor esi,esi mov [esi],ebp mov edi,1 shl edi,cl mov [edi],eax cmp ebp,[esi] jnz dram_col_exit ; cmp eax,[edi] jz dram_col_loop dram_col_exit: mov dx,cx ; in al,23h or al,10h out 23h,al ; mov al,3 out 22h,al in al,23h or al,80h out 23h,al ; mov bx,OFFSET dram_row_table mov eax,3ABC3478h mov ebp,45AC65BCh dram_row_loop: mov cx,cs:[bx] inc bx inc bx or cl,cl jz dram_row_exit ; xor esi,esi mov [esi],ebp mov edi,1 shl edi,cl mov [edi],eax cmp ebp,[esi] jnz dram_row_exit ; cmp eax,[edi] jz dram_row_loop dram_row_exit: mov al,3 out 22h,al in al,23h and al,7Fh out 23h,al xor al,al out 22h,al ; mov cl,dh mov bx,OFFSET dram_ctrl_tab dram_size_loop: mov ax,cs:[bx] add bx,3 cmp al,cl jg dram_size_loop ; cmp ah,ch jg dram_size_loop ; cmp ax,cx jnz Failed ; in al,23h and al,0E0h or al,cs:[bx-1] out 23h,al ; xor esi,esi FindRam mov edx,esi mov edi,esi xor esi,esi mov ax,gdt_sel mov ds,ax mov ecx,2*5 rep movs dword ptr es:[edi],[esi] mov ax,flat_sel mov ds,ax mov esi,edx mov ebx,gdt_sel add ebx,esi mov word ptr [ebx],0FFFh mov [ebx+2],esi mov byte ptr [ebx+5],92h mov word ptr [ebx+6],0 lgdt [esi+gdt_sel] ; FindRam mov ax,gdt_sel mov ds,ax mov bx,system_data_sel mov word ptr [bx],0FFFh mov [bx+2],esi mov byte ptr [bx+5],92h mov word ptr [bx+6],0 ; mov ax,system_data_sel mov ds,ax mov ds:alloc_base,esi ; mov ax,gdt_sel mov ss,ax mov sp,1000h ; call GetAllAdapters call StartShutDownDevice call GetBootDevice jnc DoBoot Failed: hlt DoBoot: mov ax,system_data_sel mov ds,ax call GetRamSize mov ds:ram1_size,eax mov ds:ram2_size,0 mov ds:rom_base,PROM_BASE call GetPromSize mov ds:rom_size,eax ; mov ax,flat_sel mov ds,ax push kernel_code mov ecx,[esi].len add esi,SIZE rdos_header push [esi].init_ip add esi,SIZE device_header mov ax,gdt_sel mov ds,ax dec cx mov bx,kernel_code mov [bx],cx mov [bx+2],esi mov ah,9Ah xchg ah,[bx+5] xor al,al mov [bx+6],ax retf END init