;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Kolibri OS - based on source code Menuet OS, but not 100% compatible. ;; ;; See file COPYING or GNU.TXT for details with these additional details: ;; - All code written in 32 bit x86 assembly language ;; - No external code (eg. bios) at process execution time ;; ;; ;; Compile with last version FASM ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include "KGLOBALS.INC" include "lang.inc" WinMapAddress equ 0x460000 display_data = 0x460000 max_processes equ 255 window_data equ 0x0000 tss_data equ 0xD20000 ;tss_step equ (128+2048) ; tss & i/o - 16384 ports, * 256=557056 tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 draw_data equ 0xC00000 sysint_stack_data equ 0xC03000 twdw equ (0x3000-window_data) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Included files: ;; ;; Kernel16.inc ;; - Booteng.inc English text for bootup ;; - Bootcode.inc Hardware setup ;; - Pci16.inc PCI functions ;; ;; Kernel32.inc ;; - Sys32.inc Process management ;; - Shutdown.inc Shutdown and restart ;; - Fat32.inc Read / write hd ;; - Vesa12.inc Vesa 1.2 driver ;; - Vesa20.inc Vesa 2.0 driver ;; - Vga.inc VGA driver ;; - Stack.inc Network interface ;; - Mouse.inc Mouse pointer ;; - Scincode.inc Window skinning ;; - Pci32.inc PCI functions ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; 16 BIT ENTRY FROM BOOTSECTOR ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; use16 org 0x10000 macro diff16 title,l2 { local s,d,l1 s = l2 display title,': 0x' repeat 8 d = 48 + s shr ((8-%) shl 2) and $0F if d > 57 d = d + 65-57-1 end if display d end repeat display 13,10 } jmp start_of_code ; mike.dld { db 0 dd servetable-0x10000 draw_line dd __sys_draw_line disable_mouse dd __sys_disable_mouse draw_pointer dd __sys_draw_pointer drawbar dd __sys_drawbar putpixel dd __sys_putpixel ; } mike.dld version db 'Kolibri OS version 0.5.0.0 ',13,10,13,10,0 ;dd endofcode-0x10000 ;db 'Boot02' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! include "boot/preboot.inc" ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! preboot_lfb db 0 preboot_bootlog db 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; 16 BIT INCLUDED FILES ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include "KERNEL16.INC" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; SWITCH TO 32 BIT PROTECTED MODE ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; os_data equ os_data_l-gdts ; GDTs os_code equ os_code_l-gdts int_code equ int_code_l-gdts int_data equ int_data_l-gdts tss0sys equ tss0sys_l-gdts graph_data equ 3+graph_data_l-gdts tss0 equ tss0_l-gdts tss0i equ tss0i_l-gdts app_code equ 3+app_code_l-gdts app_data equ 3+app_data_l-gdts ; CR0 Flags - Protected mode and Paging mov ecx,0x00000001 ;and ebx,65535 ;cmp ebx,00100000000000000b ; lfb -> paging ;jb no_paging ;mov ax,0x0000 ;mov es,ax ;mov al,[es:0x901E] ;cmp al,1 ;je no_paging ;or ecx, 0x80000000 ;no_paging: ; Enabling 32 bit protected mode sidt [cs:old_ints_h-0x10000] cli ; disable all irqs cld mov al,255 ; mask all irqs out 0xa1,al out 0x21,al l.5: in al, 0x64 ; Enable A20 test al, 2 jnz l.5 mov al, 0xD1 out 0x64, al l.6: in al, 0x64 test al, 2 jnz l.6 mov al, 0xDF out 0x60, al lgdt [cs:gdts-0x10000] ; Load GDT mov eax, cr0 ; Turn on paging // protected mode or eax, ecx and eax, 10011111b *65536*256 + 0xffffff ; caching enabled mov cr0, eax jmp byte $+2 mov ax,os_data ; Selector for os mov ds,ax mov es,ax mov fs,ax mov gs,ax mov ss,ax mov esp,0x30000 ; Set stack jmp pword os_code:B32 ; jmp to enable 32 bit mode use32 iglobal boot_memdetect db 'Determining amount of memory',0 boot_fonts db 'Fonts loaded',0 boot_tss db 'Setting TSSs',0 boot_cpuid db 'Reading CPUIDs',0 boot_devices db 'Detecting devices',0 boot_timer db 'Setting timer',0 boot_irqs db 'Reprogramming IRQs',0 boot_setmouse db 'Setting mouse',0 boot_windefs db 'Setting window defaults',0 boot_bgr db 'Calculating background',0 boot_resirqports db 'Reserving IRQs & ports',0 boot_setrports db 'Setting addresses for IRQs',0 boot_setostask db 'Setting OS task',0 boot_allirqs db 'Unmasking all IRQs',0 boot_tsc db 'Reading TSC',0 boot_pal_ega db 'Setting EGA/CGA 320x200 palette',0 boot_pal_vga db 'Setting VGA 640x480 palette',0 boot_mtrr db 'Setting MTRR',0 boot_tasking db 'All set - press ESC to start',0 endg iglobal boot_y dd 10 endg boot_log: pushad mov edx,esi .bll3: inc edx cmp [edx],byte 0 jne .bll3 sub edx,esi mov eax,10*65536 mov ax,word [boot_y] add [boot_y],dword 10 mov ebx,0xffffff mov ecx,esi mov edi,1 call dtext mov [novesachecksum],1000 call checkEgaCga cmp [preboot_blogesc],byte 1 je .bll2 cmp esi,boot_tasking jne .bll2 ; begin ealex 04.08.05 ; in al,0x61 ; and al,01111111b ; out 0x61,al ; end ealex 04.08.05 .bll1: in al,0x60 ; wait for ESC key press cmp al,129 jne .bll1 .bll2: popad ret uglobal cpuid_0 dd 0,0,0,0 cpuid_1 dd 0,0,0,0 cpuid_2 dd 0,0,0,0 cpuid_3 dd 0,0,0,0 endg iglobal firstapp db 'LAUNCHER ' char db 'CHAR MT ' char2 db 'CHAR2 MT ' bootpath db '/KOLIBRI ' bootpath2 db 0 vmode db 'VMODE MDR' vrr_m db 'VRR_M ' endg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; 32 BIT ENTRY ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4 B32: ; CLEAR 0x280000-0xF00000 xor eax,eax mov edi,0x280000 mov ecx,(0x100000*0xF-0x280000) / 4 cld rep stosd ; CLEAR 0x80000-0x90000 ; xor eax,eax mov edi,0x80000 mov ecx,(0x90000-0x80000)/4 ; cld rep stosd ; CLEAR KERNEL UNDEFINED GLOBALS mov edi, endofcode mov ecx, (uglobals_size/4)+4 rep stosd ; SAVE & CLEAR 0-0xffff mov esi,0x0000 mov edi,0x2F0000 mov ecx,0x10000 / 4 cld rep movsd xor eax,eax mov edi,0 mov ecx,0x10000 / 4 cld rep stosd ; SAVE REAL MODE VARIABLES ; movzx eax,byte [0x2f0000+0x9010] ; mouse port ; mov [0xF604],byte 1 ;al mov al,[0x2f0000+0x9000] ; bpp mov [0xFBF1],al movzx eax,word [0x2f0000+0x900A] ; X max dec eax mov [0xfe00],eax movzx eax,word [0x2f0000+0x900C] ; Y max dec eax mov [0xfe04],eax movzx eax,word [0x2f0000+0x9008] ; screen mode mov [0xFE0C],eax mov eax,[0x2f0000+0x9014] ; Vesa 1.2 bnk sw add mov [0xE030],eax mov [0xfe08],word 640*4 ; Bytes PerScanLine cmp [0xFE0C],word 0x13 ; 320x200 je @f cmp [0xFE0C],word 0x12 ; VGA 640x480 je @f mov ax,[0x2f0000+0x9001] ; for other modes mov [0xfe08],ax @@: ; GRAPHICS ADDRESSES ;mov eax,0x100000*8 ; LFB address ;cmp [0xfe0c],word 0x13 ;je no_d_lfb ;cmp [0xfe0c],word 0x12 ;je no_d_lfb ;cmp [0x2f0000+0x901e],byte 1 ;jne no_d_lfb mov byte [0x2f0000+0x901e],0x0 mov eax,[0x2f0000+0x9018] ;no_d_lfb: mov [0xfe80],eax cmp [0xfe0c],word 0100000000000000b jge setvesa20 cmp [0xfe0c],word 0x13 je v20ga32 mov [0xe020],dword Vesa12_putpixel24 ; Vesa 1.2 mov [0xe024],dword Vesa12_getpixel24 cmp [0xfbf1],byte 24 jz ga24 mov [0xe020],dword Vesa12_putpixel32 mov [0xe024],dword Vesa12_getpixel32 ga24: jmp v20ga24 setvesa20: mov [0xe020],dword Vesa20_putpixel24 ; Vesa 2.0 mov [0xe024],dword Vesa20_getpixel24 cmp [0xfbf1],byte 24 jz v20ga24 v20ga32: mov [0xe020],dword Vesa20_putpixel32 mov [0xe024],dword Vesa20_getpixel32 v20ga24: cmp [0xfe0c],word 0x12 ; 16 C VGA 640x480 jne no_mode_0x12 mov [0xe020],dword VGA_putpixel mov [0xe024],dword Vesa20_getpixel32 no_mode_0x12: ; MEMORY MODEL ; mov [0xfe84],dword 0x100000*16 ; apps mem base address ; movzx ecx,byte [0x2f0000+0x9030] ; dec ecx ; mov eax,16*0x100000 ; memory-16 ; shl eax,cl ; mov [0xfe8c],eax ; memory for use ; cmp eax,16*0x100000 ; jne no16mb ; mov [0xfe84],dword 0xD80000 ; !!! 10 !!! ; no16mb: ; init: ; 1) 0xFE84 - applications base ; 2) 0xFE8C - total amount of memory xor edi, edi m_GMS_loop: add edi, 0x400000 mov eax, dword [edi] mov dword [edi], 'TEST' wbinvd cmp dword [edi], 'TEST' jne m_GMS_exit cmp dword [0], 'TEST' je m_GMS_exit mov dword [es:edi], eax jmp m_GMS_loop m_GMS_exit: mov [edi], eax ; now edi contains the EXACT amount of memory mov eax, 0x100000*16 cmp edi, eax ;0x100000*16 jb $ ; less than 16 Mb mov dword [0xFE84], eax ;0x100000*16 cmp edi, eax ;0x100000*16 jne @f mov dword [0xFE84], 0xD80000 ; =0x100000*13.5 @@: mov dword [0xFE8C], edi ;!!!!!!!!!!!!!!!!!!!!!!!!!! include 'detect/disks.inc' ;!!!!!!!!!!!!!!!!!!!!!!!!!! ; CHECK EXTRA REGION ; ENABLE PAGING mov eax,cr0 or eax,0x80000000 mov cr0,eax jmp $+2 mov dword [0xfe80],0x800000 ;Set base of graphic segment to linear address of LFB mov eax,[0xfe80] ; set for gs mov [graph_data_l+2],ax shr eax,16 mov [graph_data_l+4],al mov [graph_data_l+7],ah ; READ RAMDISK IMAGE FROM HD ;!!!!!!!!!!!!!!!!!!!!!!! include 'boot/rdload.inc' ;!!!!!!!!!!!!!!!!!!!!!!! ; mov [dma_hdd],1 ; CALCULATE FAT CHAIN FOR RAMDISK call calculatefatchain ; LOAD VMODE DRIVER ;!!!!!!!!!!!!!!!!!!!!!!! include 'vmodeld.inc' ;!!!!!!!!!!!!!!!!!!!!!!! ; LOAD FONTS I and II mov [0x3000],dword 1 mov [0x3004],dword 1 mov [0x3010],dword 0x3020 mov eax,char mov esi,12 xor ebx,ebx mov ecx,26000 mov edx,0x37000 call fileread mov eax,char2 mov esi,12 xor ebx,ebx mov ecx,26000 mov edx,0x30000 call fileread mov esi,boot_fonts call boot_log ; PRINT AMOUNT OF MEMORY mov esi, boot_memdetect call boot_log movzx ecx, word [boot_y] or ecx, (10+29*6) shl 16 ; "Determining amount of memory" sub ecx, 10 mov edx, 0xFFFFFF mov ebx, [0xFE8C] shr ebx, 20 mov edi, 1 mov eax, 0x00040000 call display_number ; CHECK EXTENDED REGION ; mov dword [0x80000000],0x12345678 ; cmp dword [0x80000000],0x12345678 ; jz extended_region_found ; mov esi,boot_ext_region ; call boot_log ; jmp $ ;extended_region_found: call MEM_Init ;add 0x800000-0xc00000 area cmp word [0xfe0c],0x13 jle .less_memory mov eax,0x80000000 ;linear address mov ebx,0x400000 shr 12 ;size in pages (4Mb) mov ecx,0x800000 ;physical address jmp .end_first_block .less_memory: mov eax,0x80180000 ;linear address mov ebx,0x280000 shr 12 ;size in pages (2.5Mb) mov ecx,0x980000 ;physical address .end_first_block: call MEM_Add_Heap ;nobody can lock mutex yet call create_general_page_table ;add 0x1000000(0xd80000)-end_of_memory area mov eax,second_base_address mov ebx,[0xfe8c] mov ecx,[0xfe84] sub ebx,ecx shr ebx,12 add eax,ecx call MEM_Add_Heap ;init physical memory manager. call Init_Physical_Memory_Manager ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f mov esi,boot_irqs call boot_log call rerouteirqs mov esi,boot_tss call boot_log ; BUILD SCHEDULER call build_scheduler ; sys32.inc ; LOAD IDT ; lidt [cs:idtreg] ;[cs:idts] ; ; READ CPUID RESULT mov esi,boot_cpuid call boot_log pushfd ; get current flags pop eax mov ecx,eax xor eax,0x00200000 ; attempt to toggle ID bit push eax popfd pushfd ; get new EFLAGS pop eax push ecx ; restore original flags popfd and eax,0x00200000 ; if we couldn't toggle ID, and ecx,0x00200000 ; then this is i486 cmp eax,ecx jz nopentium ; It's Pentium or later. Use CPUID mov edi,cpuid_0 mov esi,0 cpuid_new_read: mov eax,esi cpuid call cpuid_save add edi,4*4 cmp esi,3 jge cpuid_done cmp esi,[cpuid_0] jge cpuid_done inc esi jmp cpuid_new_read cpuid_save: mov [edi+00],eax mov [edi+04],ebx mov [edi+8],ecx mov [edi+12],edx ret cpuid_done: nopentium: ; CR4 flags - enable fxsave / fxrstore ; ; finit ; mov eax,1 ; cpuid ; test edx,1000000h ; jz fail_fpu ; mov eax,cr4 ; or eax,200h ; Enable fxsave/fxstor ; mov cr4,eax ; fail_fpu: ; DETECT DEVICES mov esi,boot_devices call boot_log call detect_devices ; TIMER SET TO 1/100 S mov esi,boot_timer call boot_log mov al,0x34 ; set to 100Hz out 0x43,al mov al,0x9b ; lsb 1193180 / 1193 out 0x40,al mov al,0x2e ; msb out 0x40,al ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;include 'detect/commouse.inc' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; SET MOUSE mov esi,boot_setmouse call boot_log call setmouse ; SET PRELIMINARY WINDOW STACK AND POSITIONS mov esi,boot_windefs call boot_log call setwindowdefaults ; SET BACKGROUND DEFAULTS mov esi,boot_bgr call boot_log call calculatebackground ; RESERVE SYSTEM IRQ'S JA PORT'S mov esi,boot_resirqports call boot_log call reserve_irqs_ports ; SET PORTS FOR IRQ HANDLERS mov esi,boot_setrports call boot_log call setirqreadports ; SET UP OS TASK mov esi,boot_setostask call boot_log ; name for OS/IDLE process mov [0x80000+256+0],dword 'OS/I' mov [0x80000+256+4],dword 'DLE ' ; task list mov [0x3004],dword 2 ; number of processes mov [0x3000],dword 0 ; process count - start with os task mov [0x3020+0xE],byte 1 ; on screen number mov [0x3020+0x4],dword 1 ; process id number ; set default flags & stacks mov [l.eflags],dword 0x11202 ; sti and resume mov [l.ss0], os_data ;mov [l.ss1], ring1_data ;mov [l.ss2], ring2_data mov [l.esp0], 0x52000 mov [l.esp1], 0x53000 mov [l.esp2], 0x54000 ; osloop - TSS mov eax,cr3 mov [l.cr3],eax mov [l.eip],osloop ; mov [l.esp],0x30000 ;0x2ffff ; mov [l.cs],os_code mov [l.ss],os_data mov [l.ds],os_data mov [l.es],os_data mov [l.fs],os_data mov [l.gs],os_data ; move tss to tss_data+tss_step mov esi,tss_sceleton mov edi,tss_data+tss_step mov ecx,120/4 cld rep movsd mov ax,tss0 ltr ax ; READ TSC / SECOND mov esi,boot_tsc call boot_log call _rdtsc mov ecx,eax mov esi,250 ; wait 1/4 a second call delay_ms call _rdtsc sub eax,ecx shl eax,2 mov [0xf600],eax ; save tsc / sec ; SET VARIABLES call set_variables ; STACK AND FDC call stack_init call fdc_init ; PALETTE FOR 320x200 and 640x480 16 col cmp [0xfe0c],word 0x12 jne no_pal_vga mov esi,boot_pal_vga call boot_log call paletteVGA no_pal_vga: cmp [0xfe0c],word 0x13 jne no_pal_ega mov esi,boot_pal_ega call boot_log call palette320x200 no_pal_ega: ; LOAD DEFAULT SKIN call load_default_skin ; MTRR'S call enable_mtrr ; LOAD FIRST APPLICATION mov [0x3000],dword 1 ;1 mov [0x3004],dword 1 ;1 cli mov al,[0x2f0000+0x9030] cmp al,1 jne no_load_vrr_m mov eax,vrr_m call start_application_fl cmp eax,2 ; if no vrr_m app found je first_app_found no_load_vrr_m: mov eax,firstapp call start_application_fl cmp eax,2 ; if no first app found - halt je first_app_found mov eax, 0xDEADBEEF hlt ;jmp $ first_app_found: cli mov [0x3004],dword 2 mov [0x3000],dword 1 ; START MULTITASKING mov esi,boot_tasking call boot_log mov [0xe000],byte 1 ; multitasking enabled mov al, 0xf6 ; Сброс клавиатуры, разрешить сканирование call kb_write mov ecx,0 wait_loop_1: ; variant 2 ; читаем порт состояния процессора 8042 in al,64h and al,00000010b ; флаг готовности ; ожидаем готовность процессора 8042 loopnz wait_loop_1 ; SET KEYBOARD PARAMETERS ; mov al, 0xED ; svetodiody - only for testing! ; call kb_write ; call kb_read ; mov al, 111b ; call kb_write ; call kb_read mov al, 0xF3 ; set repeat rate & delay call kb_write call kb_read mov al, 00100010b ; 24 500 ;00100100b ; 20 500 call kb_write call kb_read ;// mike.dld [ call set_lights ;// mike.dld ] ; UNMASK ALL IRQ'S mov esi,boot_allirqs call boot_log cli ;guarantee forbidance of interrupts. mov al,0 ; unmask all irq's out 0xA1,al out 0x21,al mov ecx,32 ready_for_irqs: mov al,0x20 ; ready for irqs out 0x20,al out 0xa0,al loop ready_for_irqs ; flush the queue ; mov [dma_hdd],1 sti jmp $ ; wait here for timer to take control ; Fly :) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; MAIN OS LOOP ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 32 osloop: call check_mouse_data call [draw_pointer] call checkbuttons call main_loop_sys_getkey call checkwindows call check_window_move_request call checkmisc call checkEgaCga call stack_handler call checkidle call check_fdd_motor_status jmp osloop ;temp_pointers: ; rd 32 ; seed dd 0x12345678 checkidle: pushad cmp [check_idle_semaphore],0 jne no_idle_state call change_task mov eax,[idlemem] mov ebx,[timer_ticks] ;[0xfdf0] cmp eax,ebx jnz idle_exit call _rdtsc mov ecx,eax idle_loop: hlt cmp [check_idle_semaphore],0 jne idle_loop_exit mov eax,[timer_ticks] ;[0xfdf0] cmp ebx,eax jz idle_loop idle_loop_exit: mov [idlemem],eax call _rdtsc sub eax,ecx mov ebx,[idleuse] add ebx,eax mov [idleuse],ebx popad ret idle_exit: mov ebx,[timer_ticks] ;[0xfdf0] mov [idlemem],ebx call change_task popad ret no_idle_state: dec [check_idle_semaphore] mov ebx,[timer_ticks] ;[0xfdf0] mov [idlemem],ebx call change_task popad ret uglobal idlemem dd 0x0 idleuse dd 0x0 idleusesec dd 0x0 check_idle_semaphore dd 0x0 endg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; INCLUDED SYSTEM FILES ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include "KERNEL32.INC" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; KERNEL FUNCTIONS ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; enable_mtrr: pushad cmp [0x2f0000+0x901c],byte 2 je no_mtrr mov eax,[0xFE0C] ; if no LFB then no MTRR test eax,0100000000000000b jz no_mtrr mov edx,[cpuid_1+3*4] ; edx - MTRR's supported ? test edx,1000000000000b jz no_mtrr call find_empty_mtrr cmp ecx,0 jz no_mtrr mov esi,boot_mtrr ; 'setting mtrr' call boot_log mov edx,0x0 ; LFB , +8 M , write combine mov eax,[0x2f9018] or eax,1 wrmsr inc ecx mov edx,0xf mov eax,0xff800800 wrmsr mov ecx,0x2ff ; enable mtrr's rdmsr or eax,100000000000b ; set wrmsr no_mtrr: popad ret find_empty_mtrr: ; 8 pairs checked mov ecx,0x201-2 mtrr_find: add ecx,2 cmp ecx,0x200+8*2 jge no_free_mtrr rdmsr test eax,0x0800 jnz mtrr_find dec ecx ret no_free_mtrr: mov ecx,0 ret reserve_irqs_ports: pushad mov [irq_owner+4*0],byte 1 ; timer mov [irq_owner+4*1],byte 1 ; keyboard mov [irq_owner+4*5],byte 1 ; sound blaster mov [irq_owner+4*6],byte 1 ; floppy diskette mov [irq_owner+4*13],byte 1 ; math co-pros mov [irq_owner+4*14],byte 1 ; ide I mov [irq_owner+4*15],byte 1 ; ide II movzx eax,byte [0xf604] ; mouse irq dec eax add eax,mouseirqtable movzx eax,byte [eax] shl eax,2 mov [irq_owner+eax],byte 1 ; RESERVE PORTS mov edi,1 ; 0x00-0xff mov [0x2d0000],edi shl edi,4 mov [0x2d0000+edi+0],dword 1 mov [0x2d0000+edi+4],dword 0x0 mov [0x2d0000+edi+8],dword 0xff cmp [0xf604],byte 2 ; com1 mouse -> 0x3f0-0x3ff jne ripl1 inc dword [0x2d0000] mov edi,[0x2d0000] shl edi,4 mov [0x2d0000+edi+0],dword 1 mov [0x2d0000+edi+4],dword 0x3f0 mov [0x2d0000+edi+8],dword 0x3ff ripl1: cmp [0xf604],byte 3 ; com2 mouse -> 0x2f0-0x2ff jne ripl2 inc dword [0x2d0000] mov edi,[0x2d0000] shl edi,4 mov [0x2d0000+edi+0],dword 1 mov [0x2d0000+edi+4],dword 0x2f0 mov [0x2d0000+edi+8],dword 0x2ff ripl2: popad ret iglobal mouseirqtable db 12 ; ps2 db 4 ; com1 db 3 ; com2 endg setirqreadports: mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte mov [irq12read+4],dword 0 ; end of port list mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte mov [irq04read+4],dword 0 ; end of port list mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte mov [irq03read+4],dword 0 ; end of port list ret iglobal process_number dd 0x1 endg uglobal novesachecksum dd 0x0 endg checkEgaCga: cmp [0xfe0c],dword 0x13 je cnvl ret cnvl: pushad mov ecx,[0xfb0a] cmp ecx,[novesachecksum] jne novesal popad ret novesal: mov [novesachecksum],ecx mov ecx,0 movzx eax,word [0xfb0c] cmp eax,100 jge m13l3 mov eax,100 m13l3: cmp eax,480-100 jbe m13l4 mov eax,480-100 m13l4: sub eax,100 imul eax,640*4 add ecx,eax movzx eax,word [0xfb0a] cmp eax,160 jge m13l1 mov eax,160 m13l1: cmp eax,640-160 jbe m13l2 mov eax,640-160 m13l2: sub eax,160 shl eax,2 add ecx,eax mov esi,[0xfe80] add esi,ecx mov edi,0xa0000 mov edx,200 mov ecx,320 cld m13pix: lodsd push eax mov ebx,eax and eax,(128+64+32) ; blue shr eax,5 and ebx,(128+64+32)*256 ; green shr ebx,8+2 add eax,ebx pop ebx and ebx,(128+64)*256*256 ; red shr ebx,8+8 add eax,ebx stosb loop m13pix mov ecx,320 add esi,4*(640-320) dec edx jnz m13pix popad ret palette320x200: mov edx,0x3c8 xor eax, eax out dx,al mov ecx,256 mov edx,0x3c9 xor eax,eax palnew: mov al,0 test ah,64 jz pallbl1 add al,21 pallbl1: test ah,128 jz pallbl2 add al,42 pallbl2: out dx,al mov al,0 test ah,8 jz pallbl3 add al,8 pallbl3: test ah,16 jz pallbl4 add al,15 pallbl4: test ah,32 jz pallbl5 add al,40 pallbl5: out dx,al mov al,0 test ah,1 jz pallbl6 add al,8 pallbl6: test ah,2 jz pallbl7 add al,15 pallbl7: test ah,4 jz pallbl8 add al,40 pallbl8: out dx,al add ah,1 loop palnew ret set_variables: mov ecx,0x100 ; flush port 0x60 .fl60: in al,0x60 loop .fl60 mov [0xfcff],byte 0 ; mouse buffer mov [0xf400],byte 0 ; keyboard buffer mov [0xf500],byte 0 ; button buffer ; mov [0xfb0a],dword 100*65536+100 ; mouse x/y push eax mov ax,[0x2f0000+0x900c] shr ax,1 shl eax,16 mov ax,[0x2f0000+0x900A] shr ax,1 mov [0xfb0a],eax pop eax mov byte [SB16_Status],0 ; Minazzi Paolo mov [display_data-12],dword 1 ; tiled background mov [0xfe88],dword 0x2C0000 ; address of button list ;!! IP 04.02.2005: mov [next_usage_update], 100 mov byte [0xFFFF], 0 ; change task if possible ret ;* mouse centered - start code- Mario79 mouse_centered: push eax mov eax,[0xFE00] shr eax,1 mov [0xFB0A],ax mov eax,[0xFE04] shr eax,1 mov [0xFB0C],ax pop eax ret ;* mouse centered - end code- Mario79 align 4 sys_outport: mov edi,ebx ; separate flag for read / write and ebx,65535 mov ecx,[0x2d0000] test ecx,ecx jne sopl8 mov [esp+36],dword 1 ret sopl8: mov edx,[0x3010] mov edx,[edx+0x4] and ebx,65535 cld sopl1: mov esi,ecx shl esi,4 add esi,0x2d0000 cmp edx,[esi+0] jne sopl2 cmp ebx,[esi+4] jb sopl2 cmp ebx,[esi+8] jg sopl2 jmp sopl3 sopl2: dec ecx jnz sopl1 mov [esp+36],dword 1 ret sopl3: test edi,0x80000000 ; read ? jnz sopl4 mov dx,bx ; write out dx,al mov [esp+36],dword 0 ret sopl4: mov dx,bx ; read in al,dx and eax,0xff mov [esp+36],dword 0 mov [esp+24],eax ret align 4 sys_sb16: cmp word [sb16],word 0 jnz sb16l1 mov [esp+36],dword 1 ret sb16l1: mov [esp+36],dword 0 cmp eax,1 ; set volume - main jnz sb16l2 mov dx,word [sb16] add dx,4 mov al,0x22 out dx,al mov esi,1 call delay_ms mov eax,ebx inc edx out dx,al ret sb16l2: cmp eax,2 ; set volume - cd jnz sb16l3 mov dx,word [sb16] add dx,4 mov al,0x28 out dx,al mov esi,1 call delay_ms mov eax,ebx add edx,1 out dx,al ret sb16l3: mov [esp+36],dword 2 ret align 4 sys_sb16II: cmp word [sb16],word 0 jnz IIsb16l1 mov [esp+36],dword 1 ret IIsb16l1: cmp eax,1 ; set volume - main jnz IIsb16l2 ; L mov dx,word [sb16] add dx,4 mov al,0x30 out dx,al mov eax,ebx inc edx out dx,al ; R mov dx,word [sb16] add dx,4 mov al,0x31 out dx,al mov eax,ebx inc edx out dx,al mov [esp+36],dword 0 ret IIsb16l2: cmp eax,2 ; set volume - cd jnz IIsb16l3 ; L mov dx,word [sb16] add dx,4 mov al,0x36 out dx,al mov eax,ebx inc edx out dx,al ; R mov dx,word [sb16] add dx,4 mov al,0x37 out dx,al mov eax,ebx inc edx out dx,al mov [esp+36],dword 0 ret IIsb16l3: mov [esp+36],dword 2 ret align 4 sys_wss: cmp word [wss],word 0 jnz wssl1 mov [esp+36],dword 1 ret wssl1: cmp eax,1 ; set volume - main jnz wssl2 mov [esp+36],dword 0 ret wssl2: cmp eax,2 ; set volume - cd jnz wssl3 ; L mov dx,word [wss] add dx,4 mov al,0x2 out dx,al mov esi,1 call delay_ms mov eax,ebx inc edx out dx,al ; R mov dx,word [wss] add dx,4 mov al,0x3 out dx,al mov esi,1 call delay_ms mov eax,ebx inc edx out dx,al mov [esp+36],dword 0 ret wssl3: mov [esp+36],dword 2 ret display_number: ; eax = print type, al=0 -> ebx is number ; al=1 -> ebx is pointer ; ah=0 -> display decimal ; ah=1 -> display hexadecimal ; ah=2 -> display binary ; eax bits 16-21 = number of digits to display (0-32) ; eax bits 22-31 = reserved ; ; ebx = number or pointer ; ecx = x shl 16 + y ; edx = color cmp eax,0xffff ; length > 0 ? jge cont_displ ret cont_displ: cmp eax,60*0x10000 ; length <= 60 ? jbe cont_displ2 ret cont_displ2: pushad cmp al,1 ; ecx is a pointer ? jne displnl1 mov edi,[0x3010] mov edi,[edi+0x10] mov ebx,[edi+ebx] displnl1: sub esp,64 cmp ah,0 ; DECIMAL jne no_display_desnum shr eax,16 and eax,0x2f push eax ;mov edi,[0x3010] ;mov edi,[edi+0x10] mov edi,esp add edi,4+64 mov ecx,eax mov eax,ebx mov ebx,10 d_desnum: xor edx,edx div ebx add dl,48 mov [edi],dl dec edi loop d_desnum pop eax call draw_num_text add esp,64 popad ret no_display_desnum: cmp ah,0x01 ; HEXADECIMAL jne no_display_hexnum shr eax,16 and eax,0x2f push eax ;mov edi,[0x3010] ;mov edi,[edi+0x10] mov edi,esp add edi,4+64 mov ecx,eax mov eax,ebx mov ebx,16 d_hexnum: xor edx,edx div ebx add edx,hexletters mov dl,[edx] mov [edi],dl dec edi loop d_hexnum pop eax call draw_num_text add esp,64 popad ret no_display_hexnum: cmp ah,0x02 ; BINARY jne no_display_binnum shr eax,16 and eax,0x2f push eax ;mov edi,[0x3010] ;mov edi,[edi+0x10] mov edi,esp add edi,4+64 mov ecx,eax mov eax,ebx mov ebx,2 d_binnum: xor edx,edx div ebx add dl,48 mov [edi],dl dec edi loop d_binnum pop eax call draw_num_text add esp,64 popad ret no_display_binnum: add esp,64 popad ret draw_num_text: ; dtext ; ; eax x & y ; ebx color ; ecx start of text ; edx length ; edi 1 force mov edx,eax mov ecx,65 sub ecx,eax add ecx,esp add ecx,4 mov eax,[esp+64+32-8+4] mov ebx,[esp+64+32-12+4] push edx ; add window start x & y push ebx mov edx,[0x3010] mov ebx,[edx-twdw] shl ebx,16 add ebx,[edx-twdw+4] add eax,ebx pop ebx pop edx mov edi,0 call dtext ret read_string: ; eax read_area ; ebx color of letter ; ecx color of background ; edx number of letters to read ; esi [x start]*65536 + [y_start] ret align 4 sys_setup: ; 1=roland mpu midi base , base io address ; 2=keyboard 1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus ; 3=cd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave ; 4=sb16 base , base io address ; 5=system language, 1eng 2fi 3ger 4rus ; 6=wss base , base io address ; 7=hd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave ; 8=fat32 partition in hd ; 9 ; 10 = sound dma channel ; 11 = enable lba read ; 12 = enable pci access mov [esp+36],dword 0 cmp eax,1 ; MIDI jnz nsyse1 cmp ebx,0x100 jb nsyse1 mov edx,65535 cmp edx,ebx jb nsyse1 mov [midi_base],bx mov word [mididp],bx inc bx mov word [midisp],bx ret midi_base dw 0 nsyse1: cmp eax,2 ; KEYBOARD jnz nsyse2 cmp ebx,1 jnz kbnobase mov edi,[0x3010] add ecx,[edi+0x10] mov eax,ecx mov ebx,keymap mov ecx,128 call memmove ret kbnobase: cmp ebx,2 jnz kbnoshift mov edi,[0x3010] add ecx,[edi+0x10] mov eax,ecx mov ebx,keymap_shift mov ecx,128 call memmove ret kbnoshift: cmp ebx,3 jne kbnoalt mov edi,[0x3010] add ecx,[edi+0x10] mov eax,ecx mov ebx,keymap_alt mov ecx,128 call memmove ret kbnoalt: cmp ebx,9 jnz kbnocountry mov word [keyboard],cx ret kbnocountry: mov [esp+36],dword 1 ret nsyse2: cmp eax,3 ; CD jnz nsyse3 mov [cd_base],bl cmp ebx,1 jnz noprma mov [cdbase],0x1f0 mov [cdid],0xa0 noprma: cmp ebx,2 jnz noprsl mov [cdbase],0x1f0 mov [cdid],0xb0 noprsl: cmp ebx,3 jnz nosema mov [cdbase],0x170 mov [cdid],0xa0 nosema: cmp ebx,4 jnz nosesl mov [cdbase],0x170 mov [cdid],0xb0 nosesl: ret cd_base db 0 nsyse3: cmp eax,4 ; SB jnz nsyse4 cmp ebx,0x100 jb nsyse4 mov edx,65535 cmp edx,ebx jb nsyse4 mov word [sb16],bx ret nsyse4: cmp eax,5 ; SYSTEM LANGUAGE jnz nsyse5 mov [syslang],ebx ret nsyse5: cmp eax,6 ; WSS jnz nsyse6 cmp ebx,0x100 jb nsyse6 mov [wss],ebx ret wss_temp dd 0 nsyse6: cmp eax,7 ; HD BASE jne nsyse7 mov [hd_base],bl cmp ebx,1 jnz noprmahd mov [hdbase],0x1f0 mov [hdid],0x0 mov [hdpos],1 ; call set_FAT32_variables noprmahd: cmp ebx,2 jnz noprslhd mov [hdbase],0x1f0 mov [hdid],0x10 mov [hdpos],2 ; call set_FAT32_variables noprslhd: cmp ebx,3 jnz nosemahd mov [hdbase],0x170 mov [hdid],0x0 mov [hdpos],3 ; call set_FAT32_variables nosemahd: cmp ebx,4 jnz noseslhd mov [hdbase],0x170 mov [hdid],0x10 mov [hdpos],4 ; call set_FAT32_variables noseslhd: mov [0xfe10],dword 0 call reserve_hd1 call clear_hd_cache mov [hd1_status],0 ; free ret hd_base db 0 nsyse7: cmp eax,8 ; HD PARTITION jne nsyse8 mov [fat32part],ebx ; call set_FAT32_variables call reserve_hd1 call clear_hd_cache pusha call choice_necessity_partition_1 popa mov [hd1_status],0 ; free ret nsyse8: cmp eax,10 ; SOUND DMA CHANNEL jne no_set_sound_dma mov [sound_dma],ebx ret no_set_sound_dma: cmp eax,11 ; ENABLE LBA READ jne no_set_lba_read and ebx,1 mov [lba_read_enabled],ebx ret no_set_lba_read: cmp eax,12 ; ENABLE PCI ACCESS jne no_set_pci_access and ebx,1 mov [pci_access_enabled],ebx ret no_set_pci_access: ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! include 'vmodeint.inc' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! mov [esp+36],dword -1 ret align 4 sys_getsetup: ; 1=roland mpu midi base , base io address ; 2=keyboard 1, base kaybap 2, shift keymap, 9 country 1eng 2fi 3ger 4rus ; 3=cd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave ; 4=sb16 base , base io address ; 5=system language, 1eng 2fi 3ger 4rus ; 6=wss base ; 7=hd base 1, pri.master 2, pri slave 3 sec master, 4 sec slave ; 8=fat32 partition in hd ; 9=get hs timer tic cmp eax,1 jne ngsyse1 movzx eax,[midi_base] mov [esp+36],eax ret ngsyse1: cmp eax,2 jne ngsyse2 cmp ebx,1 jnz kbnobaseret mov edi,[0x3010] add ecx,[edi+0x10] mov ebx,ecx mov eax,keymap mov ecx,128 call memmove ret kbnobaseret: cmp ebx,2 jnz kbnoshiftret mov edi,[0x3010] add ecx,[edi+0x10] mov ebx,ecx mov eax,keymap_shift mov ecx,128 call memmove ret kbnoshiftret: cmp ebx,3 jne kbnoaltret mov edi,[0x3010] add ecx,[edi+0x10] mov ebx,ecx mov eax,keymap_alt mov ecx,128 call memmove ret kbnoaltret: cmp ebx,9 jnz ngsyse2 movzx eax,word [keyboard] mov [esp+36],eax ret ngsyse2: cmp eax,3 jnz ngsyse3 movzx eax,[cd_base] mov [esp+36],eax ret ngsyse3: cmp eax,4 jne ngsyse4 mov eax,[sb16] mov [esp+36],eax ret ngsyse4: cmp eax,5 jnz ngsyse5 mov eax,[syslang] mov [esp+36],eax ret ngsyse5: cmp eax,6 jnz ngsyse6 mov eax,[wss] mov [esp+36],eax ret ngsyse6: cmp eax,7 jnz ngsyse7 movzx eax,[hd_base] mov [esp+36],eax ret ngsyse7: cmp eax,8 jnz ngsyse8 mov eax,[fat32part] mov [esp+36],eax ret ngsyse8: cmp eax,9 jne ngsyse9 mov eax,[timer_ticks] ;[0xfdf0] mov [esp+36],eax ret ngsyse9: cmp eax,10 jnz ngsyse10 mov eax,[sound_dma] mov [esp+36],eax ret ngsyse10: cmp eax,11 jnz ngsyse11 mov eax,[lba_read_enabled] mov [esp+36],eax ret ngsyse11: cmp eax,12 jnz ngsyse12 mov eax,[pci_access_enabled] mov [esp+36],eax ret ngsyse12: mov [esp+36],dword 1 ret align 4 readmousepos: ; eax=0 screen relative ; eax=1 window relative ; eax=2 buttons pressed test eax,eax jnz nosr mov eax,[0xfb0a] shl eax,16 mov ax,[0xfb0c] mov [esp+36],eax ret nosr: cmp eax,1 jnz nowr mov eax,[0xfb0a] shl eax,16 mov ax,[0xfb0c] mov esi,[0x3010] sub esi,twdw mov bx,[esi] shl ebx,16 mov bx,[esi+4] sub eax,ebx mov [esp+36],eax ret nowr: cmp eax,2 jnz nomb movzx eax,byte [0xfb40] nomb: mov [esp+36],eax ret is_input: push edx mov dx,word [midisp] in al,dx and al,0x80 pop edx ret is_output: push edx mov dx,word [midisp] in al,dx and al,0x40 pop edx ret get_mpu_in: push edx mov dx,word [mididp] in al,dx pop edx ret put_mpu_out: push edx mov dx,word [mididp] out dx,al pop edx ret setuart: su1: call is_output cmp al,0 jnz su1 mov dx,word [midisp] mov al,0xff out dx,al su2: mov dx,word [midisp] mov al,0xff out dx,al call is_input cmp al,0 jnz su2 call get_mpu_in cmp al,0xfe jnz su2 su3: call is_output cmp al,0 jnz su3 mov dx,word [midisp] mov al,0x3f out dx,al ret align 4 sys_midi: cmp [mididp],0 jnz sm0 mov [esp+36],dword 1 ret sm0: cmp eax,1 mov [esp+36],dword 0 jnz smn1 call setuart ret smn1: cmp eax,2 jnz smn2 sm10: call get_mpu_in call is_output test al,al jnz sm10 mov al,bl call put_mpu_out ret smn2: ret detect_devices: ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! include 'detect/commouse.inc' ;include 'detect/dev_fd.inc' ;include 'detect/dev_hdcd.inc' ;include 'detect/sear_par.inc' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ret sys_end: mov eax,[0x3010] add eax,0xa mov [eax],byte 3 ; terminate this program waitterm: ; wait here for termination mov eax,5 call delay_hs jmp waitterm sys_system: cmp eax,1 ; BOOT jnz nosystemboot mov [0x2f0000+0x9030],byte 0 for_shutdown_parameter: mov eax,[0x3004] add eax,2 mov [shutdown_processes],eax mov [0xFF00],al xor eax, eax ret uglobal shutdown_processes: dd 0x0 endg nosystemboot: cmp eax,2 ; TERMINATE jnz noprocessterminate cmp ebx,2 jb noprocessterminate mov edx,[0x3004] cmp ebx,edx jg noprocessterminate mov eax,[0x3004] shl ebx,5 mov edx,[ebx+0x3000+4] add ebx,0x3000+0xa ;call MEM_Heap_Lock ;guarantee that process isn't working with heap mov [ebx],byte 3 ; clear possible i40's ;call MEM_Heap_UnLock cmp edx,[application_table_status] ; clear app table stat jne noatsc mov [application_table_status],0 noatsc: ret noprocessterminate: cmp eax,3 ; ACTIVATE WINDOW jnz nowindowactivate cmp ebx,2 jb nowindowactivate cmp ebx,[0x3004] ja nowindowactivate ; edi = position at window_data+ mov edi, ebx ; edi = process number ;shl ebx, 1 ;add ebx, 0xc000 ;mov esi, [ebx] ; esi = window stack value ;and esi, 0xffff ; word movzx esi, word [0xC000 + ebx*2] mov edx, [0x3004] ; edx = number of processes cmp esi, edx jz nowindowactivate ; continue if window_stack_value != number_of_processes ; i.e. if window is not already active ;* start code - get active process (1) - Mario79 mov [window_minimize],2 mov [active_process],edi ;* end code - get active process (1) - Mario79 mov [0xff01],edi ; activate xor eax, eax ret nowindowactivate: cmp eax,4 ; GET IDLETIME jnz nogetidletime mov eax,[idleusesec] ret nogetidletime: cmp eax,5 ; GET TSC/SEC jnz nogettscsec mov eax,[0xf600] ret nogettscsec: ; SAVE ramdisk to /hd/1/menuet.img ;!!!!!!!!!!!!!!!!!!!!!!!! include 'blkdev/rdsave.inc' ;!!!!!!!!!!!!!!!!!!!!!!!! ;* start code - get active process (2) - Mario79 cmp eax,7 jnz nogetactiveprocess mov eax,[active_process] ret nogetactiveprocess: cmp eax,8 jnz nosoundflag cmp ebx,1 jne nogetsoundflag movzx eax,byte [sound_flag] ; get sound_flag ret nogetsoundflag: cmp ebx,2 jnz nosoundflag inc byte [sound_flag] ; set sound_flag and byte [sound_flag],1 ; ret nosoundflag: cmp eax,9 ; system shutdown with param jnz noshutdownsystem cmp ebx,1 jl exit_for_anyone cmp ebx,4 jg exit_for_anyone mov [0x2f0000+0x9030],bl jmp for_shutdown_parameter noshutdownsystem: cmp eax,10 ; minimize window jnz nominimizewindow mov [window_minimize],1 exit_for_anyone: ret nominimizewindow: cmp eax,11 ; get disk info table jnz nogetdiskinfo cmp ebx,1 jnz full_table small_table: call for_all_tables mov cx,10 cld rep movsb ret for_all_tables: mov edi,[3010h] mov edi,[edi+10h] add edi,ecx mov esi,0x40000 xor ecx,ecx ret full_table: cmp ebx,2 jnz exit_for_anyone call for_all_tables mov cx,16384 cld rep movsd ret nogetdiskinfo: cmp eax,12 ; get all key pressed with ALT jnz nogetkey mov eax,[last_key_press] mov al,[keyboard_mode_sys] mov [esp+36],eax mov [last_key_press],0 .finish: ret nogetkey: cmp eax,13 ; get kernel ID and version jnz nogetkernel_id mov edi,[3010h] mov edi,[edi+10h] add edi,ebx mov esi,version_inf mov ecx,version_end-version_inf cld rep movsb ret nogetkernel_id: cmp eax,14 ; sys wait retrace jnz nosys_wait_retrace ;wait retrace functions sys_wait_retrace: mov edx,0x3da WaitRetrace_loop: in al,dx test al,1000b jz WaitRetrace_loop mov [esp+36],dword 0 ret nosys_wait_retrace: cmp eax,15 ; mouse centered jnz no_mouse_centered call mouse_centered mov [esp+36],dword 0 ret no_mouse_centered: ;* end code - get active process (2) - Mario79 ret window_minimize db 0 sound_flag db 0 last_key_press dd 0 keyboard_mode_sys db 0 iglobal version_inf: db 0,5,0,0 ; version 0.5.0.0 db UID_KOLIBRI db 'Kolibri',0 version_end: endg UID_NONE=0 UID_MENUETOS=1 ;official UID_KOLIBRI=2 ;russian main_loop_sys_getkey: cmp [0xf400],byte 0 je .finish movzx eax,byte [0xf401] shl eax,8 mov [last_key_press],eax .finish: ret sys_cachetodiskette: pushad cmp eax,1 jne no_write_all_of_ramdisk call fdc_writeramdisk popad ret no_write_all_of_ramdisk: cmp eax,2 jne no_write_part_of_ramdisk call fdc_commitflush popad ret no_write_part_of_ramdisk: cmp eax,3 jne no_set_fdc call fdc_set popad ret no_set_fdc: cmp eax,4 jne no_get_fdc popad call fdc_get mov [esp+36],ecx ret no_get_fdc: popad ret uglobal ; bgrchanged dd 0x0 endg sys_background: cmp eax,1 ; BACKGROUND SIZE jnz nosb1 cmp ebx,0 je sbgrr cmp ecx,0 je sbgrr mov [display_data-8],ebx mov [display_data-4],ecx ; mov [bgrchanged],1 sbgrr: ret nosb1: cmp eax,2 ; SET PIXEL jnz nosb2 mov edx,0x160000-16 cmp edx,ebx jbe nosb2 mov edx,[ebx] and edx,0xFF000000 ;255*256*256*256 and ecx,0x00FFFFFF ;255*256*256+255*256+255 add edx,ecx mov [ebx+0x300000],edx ; mov [bgrchanged],1 ret nosb2: cmp eax,3 ; DRAW BACKGROUND jnz nosb3 draw_background_temp: ; cmp [bgrchanged],1 ;0 ; je nosb31 ;draw_background_temp: ; mov [bgrchanged],1 ;0 mov [0xfff0],byte 1 nosb31: ret nosb3: cmp eax,4 ; TILED / STRETCHED jnz nosb4 cmp ebx,[display_data-12] je nosb41 mov [display_data-12],ebx ; mov [bgrchanged],1 nosb41: ret nosb4: cmp eax,5 ; BLOCK MOVE TO BGR jnz nosb5 ; bughere mov edi, [0x3010] add ebx, [edi+0x10] ; mov esi, ebx ; mov edi, ecx mov eax, ebx mov ebx, ecx add ecx, edx cmp ecx, 0x160000-16 ja .fin ; add edi, 0x300000 add ebx, 0x300000 mov ecx, edx cmp ecx, 0x160000-16 ja .fin ; mov [bgrchanged],1 ; cld ; rep movsb call memmove .fin: ret nosb5: ret align 4 sys_getbackground: cmp eax,1 ; SIZE jnz nogb1 mov eax,[display_data-8] shl eax,16 mov ax,[display_data-4] mov [esp+36],eax ret nogb1: cmp eax,2 ; PIXEL jnz nogb2 mov edx,0x160000-16 cmp edx,ebx jbe nogb2 mov eax, [ebx+0x300000] and eax, 0xFFFFFF mov [esp+36],eax ret nogb2: cmp eax,4 ; TILED / STRETCHED jnz nogb4 mov eax,[display_data-12] nogb4: mov [esp+36],eax ret align 4 sys_getkey: mov [esp+36],dword 1 mov ebx, [0x3000] ; TOP OF WINDOW STACK movzx ecx,word [0xC000 + ebx * 2] mov edx,[0x3004] cmp ecx,edx jne .finish cmp [0xf400],byte 0 je .finish movzx eax,byte [0xf401] shl eax,8 push eax dec byte [0xf400] and byte [0xf400],127 movzx ecx,byte [0xf400] add ecx,2 ; mov esi,0xf402 ; mov edi,0xf401 ; cld ; rep movsb mov eax, 0xF402 mov ebx, 0xF401 call memmove pop eax mov [last_key_press],eax mov eax,[kb_state] and al,110000b cmp al,100000b je .yes_win_key cmp al,10000b je .yes_win_key mov eax,[last_key_press] jmp .no_win_key ; cmp ah,232 ; je .yes_win_key ; cmp ah,233 ; jne .no_win_key .yes_win_key: mov eax,1 .no_win_key: mov [esp+36],eax .finish: ret align 4 sys_getbutton: mov ebx, [0x3000] ; TOP OF WINDOW STACK mov [esp+36],dword 1 movzx ecx, word [0xC000 + ebx * 2] mov edx, [0x3004] ; less than 256 processes cmp ecx,edx jne .exit movzx eax,byte [0xf500] test eax,eax jz .exit mov eax,[0xf501] shl eax,8 mov [0xf500],byte 0 mov [esp+36],eax .exit: ret align 4 sys_cpuusage: ; RETURN: ; ; +00 dword process cpu usage ; +04 word position in windowing stack ; +06 word windowing stack value at current position (cpu nro) ; +10 12 bytes name ; +22 dword start in mem ; +26 dword used mem ; +30 dword PID , process idenfification number ; mov edi,[0x3010] ; eax = return area add edi,0x10 add eax,[edi] cmp ebx,-1 ; who am I ? jne no_who_am_i mov ebx,[0x3000] no_who_am_i: push eax ; return area push ebx ; process number push ebx push ebx push eax ; return memory usage xor edx,edx mov eax,0x20 mul ebx add eax,0x3000+0x1c mov ebx,eax pop eax mov ecx,[ebx] mov [eax],ecx pop ebx ; mov ebx,[esp] ; shl ebx,1 ; add ebx,0xc000 mov cx, [0xC000 + ebx * 2] mov [eax+4],cx ; mov ebx,[esp] ; shl ebx,1 ; add ebx,0xc400 mov cx, [0xC400 + ebx * 2] mov [eax+6],cx ; pop ebx push eax mov eax,ebx shl eax,8 add eax,0x80000 pop ebx add ebx,10 mov ecx,11 call memmove ; memory usage xor eax,eax mov edx,0x100000*16 pop ecx ; get gdt of tss cmp ecx,1 je os_mem shl ecx,8 mov edx,[0x80000+ecx+0x8c] mov eax,std_application_base_address ;add ecx,0x80000+0x88 ;mov ecx,[ecx] ; shl ecx,3 ; eax run base -> edx used memory ; mov al,[ecx+gdts+ app_code-3 +4] ; base 23:16 ; mov ah,[ecx+gdts+ app_code-3 +7] ; base 31:24 ; shl eax,16 ; mov ax,[ecx+gdts+ app_code-3 +2] ; base 0:15 ; movzx edx,word [ecx+gdts+ app_code-3 +0] ; shl edx,12 os_mem: dec edx mov [ebx+12],eax mov [ebx+16],edx ; PID (+30) mov eax,[esp] shl eax,5 add eax,0x3000+0x4 mov eax,[eax] mov [ebx+20],eax ; window position and size mov esi,[esp] shl esi,5 add esi,window_data mov edi,[esp+4] add edi,34 mov ecx,4*4 cld rep movsb ; Process state (+50) mov eax,[esp] shl eax,5 add eax,0x3000+0xa mov eax,[eax] mov [ebx+40],ax pop ebx pop eax ; return number of processes mov eax,[0x3004] mov [esp+36],eax ret align 4 sys_clock: cli ; Mikhail Lisovin xx Jan 2005 @@: mov al, 10 out 0x70, al in al, 0x71 test al, al jns @f mov esi, 1 call delay_ms jmp @b @@: ; end Lisovin's fix xor al,al ; seconds out 0x70,al in al,0x71 movzx ecx,al mov al,02 ; minutes shl ecx,16 out 0x70,al in al,0x71 movzx edx,al mov al,04 ; hours shl edx,8 out 0x70,al in al,0x71 add ecx,edx movzx edx,al add ecx,edx sti mov [esp+36],ecx ret align 4 sys_date: cli mov al,6 ; day of week out 0x70,al in al,0x71 mov ch,al mov al,7 ; date out 0x70,al in al,0x71 mov cl,al mov al,8 ; month shl ecx,16 out 0x70,al in al,0x71 mov ch,al mov al,9 ; year out 0x70,al in al,0x71 mov cl,al sti mov [esp+36],ecx ret ; redraw status sys_redrawstat: cmp eax,1 jne no_widgets_away ; buttons away mov ecx,[0x3000] sys_newba2: mov edi,[0xfe88] cmp [edi],dword 0 ; empty button list ? je end_of_buttons_away movzx ebx,word [edi] inc ebx mov eax,edi sys_newba: dec ebx jz end_of_buttons_away add eax,0x10 cmp cx,[eax] jnz sys_newba push eax ebx ecx mov ecx,ebx inc ecx shl ecx,4 mov ebx,eax add eax,0x10 call memmove dec dword [edi] pop ecx ebx eax jmp sys_newba2 end_of_buttons_away: ret no_widgets_away: cmp eax,2 jnz srl1 mov edx,[0x3010] ; return whole screen draw area for this app add edx,draw_data-0x3000 mov [edx+0],dword 0 mov [edx+4],dword 0 mov eax,[0xfe00] mov [edx+8],eax mov eax,[0xfe04] mov [edx+12],eax mov edi,[0x3010] sub edi,twdw mov [edi+30],byte 1 ; no new position & buttons from app call sys_window_mouse ret srl1: ret sys_drawwindow: mov edi,ecx shr edi,16+8 and edi,15 cmp edi,0 ; type I - original style jne nosyswI call sys_set_window call drawwindow_I ret nosyswI: cmp edi,1 ; type II - only reserve area, no draw jne nosyswII call sys_set_window call sys_window_mouse ret nosyswII: cmp edi,2 ; type III - new style jne nosyswIII call sys_set_window call drawwindow_III ret nosyswIII: cmp edi,3 ; type IV - skinned window jne nosyswIV call sys_set_window call drawwindow_IV ret nosyswIV: ret sys_set_window: mov edi,[0x3000] shl edi,5 add edi,window_data ; colors mov [edi+16],ecx mov [edi+20],edx mov [edi+24],esi ; check flag (?) cmp [edi+30],byte 1 jz newd push eax mov eax,[timer_ticks] ;[0xfdf0] add eax,100 mov [new_window_starting],eax pop eax mov [edi+8],ax mov [edi+12],bx shr eax,16 shr ebx,16 mov [edi+00],ax mov [edi+04],bx call check_window_position push ecx esi edi ; save for window fullscreen/resize mov esi,edi sub edi,window_data shr edi,5 shl edi,8 add edi,0x80000+0x90 mov ecx,4 cld rep movsd pop edi esi ecx push eax ebx ecx edx ;;; mov eax, 1 ;;; call delay_hs movzx eax, word [edi+00] movzx ebx, word [edi+04] movzx ecx, word [edi+8] movzx edx, word [edi+12] add ecx, eax add edx, ebx call calculatescreen pop edx ecx ebx eax mov [0xf400],byte 0 ; empty keyboard buffer mov [0xf500],byte 0 ; empty button buffer newd: mov [edi+31],byte 0 ; no redraw mov edx,edi ret sys_window_move: cmp [window_move_pr],0 je mwrl1 mov [esp+36],dword 1 ; return queue error ret mwrl1: mov edi,[0x3000] ; requestor process base mov [window_move_pr],edi mov [window_move_eax],eax mov [window_move_ebx],ebx mov [window_move_ecx],ecx mov [window_move_edx],edx mov [esp+36],dword 0 ; return success ret type_background_1: cmp [0xfff0],byte 0 ; background update ? jz temp_nobackgr mov [0xfff0],byte 2 call change_task mov [draw_data+32+0],dword 0 mov [draw_data+32+4],dword 0 mov eax,[0xfe00] mov ebx,[0xfe04] mov [draw_data+32+8],eax mov [draw_data+32+12],ebx call drawbackground mov [0xfff0],byte 0 mov [0xfff4],byte 0 temp_nobackgr: ret uglobal window_move_pr dd 0x0 window_move_eax dd 0x0 window_move_ebx dd 0x0 window_move_ecx dd 0x0 window_move_edx dd 0x0 endg ;ok - 100% work ;nt - not tested ;--------------------------------------------------------------------------------------------- ;eax ;0 - task switch counter. Ret switch counter in eax. Block. ok. ;1 - change task. Ret nothing. Block. ok. ;2 - performance control ; ebx ; 0 - enable or disable (inversion) PCE flag on CR4 for rdmpc in user mode. ; returned new cr4 in eax. Ret cr4 in eax. Block. ok. ; 1 - is cache enabled. Ret cr0 in eax if enabled else zero in eax. Block. ok. ; 2 - enable cache. Ret 1 in eax. Ret nothing. Block. ok. ; 3 - disable cache. Ret 0 in eax. Ret nothing. Block. ok. ;eax ;3 - rdmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok. ;4 - wrmsr. Counter in edx. (edx:eax) [esi:edi, edx] => [edx:esi, ecx]. Ret in ebx:eax. Block. ok. ;--------------------------------------------------------------------------------------------- sys_sheduler: ;noname & halyavin cmp eax,0 je shed_counter cmp eax,2 je perf_control cmp eax,3 je rdmsr_instr cmp eax,4 je wrmsr_instr cmp eax,1 jne not_supported call change_task ;delay,0 ret shed_counter: mov eax,[context_counter] mov [esp+36],eax not_supported: ret perf_control: inc eax ;now eax=3 cmp ebx,eax je cache_disable dec eax cmp ebx,eax je cache_enable dec eax cmp ebx,eax je is_cache_enabled dec eax cmp ebx,eax je modify_pce ret rdmsr_instr: ;now counter in ecx ;(edx:eax) esi:edi => edx:esi mov eax,esi rdmsr mov [esp+36],eax mov [esp+24],edx ;ret in ebx? ret wrmsr_instr: ;now counter in ecx ;(edx:eax) esi:edi => edx:esi mov eax,esi wrmsr mov [esp+36],eax mov [esp+24],edx ;ret in ebx? ret cache_disable: mov eax,cr0 or eax,01100000000000000000000000000000b mov cr0,eax wbinvd ;set MESI ret cache_enable: mov eax,cr0 and eax,10011111111111111111111111111111b mov cr0,eax ret is_cache_enabled: mov eax,cr0 mov ebx,eax and eax,01100000000000000000000000000000b jz cache_disabled mov [esp+36],ebx cache_disabled: mov dword [esp+36],eax ;0 ret modify_pce: mov eax,cr4 ; mov ebx,0 ; or bx,100000000b ;pce ; xor eax,ebx ;invert pce btr eax,8 ;pce=cr4[8] mov cr4,eax mov [esp+36],eax ret ;--------------------------------------------------------------------------------------------- ; check pixel limits ;cplimit: ; push edi ; cmp byte [0xe000], 1 ; Multitasking enabled? ; jnz .ret0 ; mov edi,[0x3010] ; add edi, draw_data-0x3000 ; mov ecx, 1 ; cmp [edi+0], eax ; xs ; ja .ret1 ; cmp [edi+4], ebx ; ys ; ja .ret1 ; cmp eax, [edi+8] ; xe ; ja .ret1 ; cmp ebx, [edi+12] ; ye ; ja .ret1 ;.ret0: ; xor ecx, ecx ;.ret1: ; pop edi ; ret ; check if pixel is allowed to be drawn checkpixel: push eax push ebx push edx ; mov ecx,[0x3000] ; process count ; shl ecx, 6 ; *64 ; add ecx,0xc000 ; +window_stack ; mov dx,word [ecx] ; window_stack_value ; cmp dx, word [0x3004] ; is this window active right now?! ; jz .ret0 ; call cplimit ; test ecx, ecx ; jnz .ret1 mov edx,[0xfe00] ; screen x size inc edx imul edx, ebx mov dl, [eax+edx+display_data] ; lea eax, [...] ;;; mov dl,[eax] mov eax,[0x3000] shl eax,5 add eax,0x3000+0xe mov ecx, 1 cmp byte [eax], dl jnz .ret1 .ret0: xor ecx, ecx .ret1: pop edx pop ebx pop eax ret uglobal mouse_active db 0 endg iglobal cpustring db 'CPU ' endg align 4 ; check misc checkmisc: cmp [ctrl_alt_del], 1 jne nocpustart mov eax, cpustring call start_application_fl mov [ctrl_alt_del], 0 nocpustart: cmp [mouse_active], 1 jne mouse_not_active mov [mouse_active], 0 xor edi, edi mov ecx, [0x3004] set_mouse_event: add edi, 256 or [edi+0x80000+0xA8], dword 00100000b loop set_mouse_event mouse_not_active: cmp [0xfff0],byte 0 ; background update ? jz nobackgr mov [0xfff0],byte 2 call change_task mov [draw_data+32+0],dword 0 mov [draw_data+32+4],dword 0 mov eax,[0xfe00] mov ebx,[0xfe04] mov [draw_data+32+8],eax mov [draw_data+32+12],ebx call drawbackground mov [0xfff0],byte 0 mov [0xfff4],byte 0 nobackgr: ; system shutdown request cmp [0xFF00],byte 0 je noshutdown mov edx,[shutdown_processes] sub dl,2 cmp [0xff00],dl jne no_mark_system_shutdown mov edx,0x3040 movzx ecx,byte [0xff00] add ecx,5 markz: mov [edx+0xa],byte 3 add edx,0x20 loop markz no_mark_system_shutdown: call [disable_mouse] dec byte [0xff00] cmp [0xff00],byte 0 je system_shutdown noshutdown: mov eax,[0x3004] ; termination mov ebx,0x3020+0xa mov esi,1 newct: mov cl,[ebx] cmp cl,byte 3 jz terminate cmp cl,byte 4 jz terminate add ebx,0x20 inc esi dec eax jnz newct ret ; redraw screen redrawscreen: ; eax , if process window_data base is eax, do not set flag/limits pushad push eax ;;; mov eax,2 ;;; call delay_hs ;mov ecx,0 ; redraw flags for apps xor ecx,ecx newdw2: inc ecx push ecx mov eax,ecx shl eax,5 add eax,window_data cmp eax,[esp+4] je not_this_task ; check if window in redraw area mov edi,eax cmp ecx,1 ; limit for background jz bgli mov eax,[edi+0] mov ebx,[edi+4] mov ecx,[edi+8] mov edx,[edi+12] add ecx,eax add edx,ebx mov ecx,[dlye] ; ecx = area y end ebx = window y start cmp ecx,ebx jb ricino mov ecx,[dlxe] ; ecx = area x end eax = window x start cmp ecx,eax jb ricino mov eax,[edi+0] mov ebx,[edi+4] mov ecx,[edi+8] mov edx,[edi+12] add ecx,eax add edx,ebx mov eax,[dly] ; eax = area y start edx = window y end cmp edx,eax jb ricino mov eax,[dlx] ; eax = area x start ecx = window x end cmp ecx,eax jb ricino bgli: cmp edi,esi jz ricino mov eax,edi add eax,draw_data-window_data mov ebx,[dlx] ; set limits mov [eax+0],ebx mov ebx,[dly] mov [eax+4],ebx mov ebx,[dlxe] mov [eax+8],ebx mov ebx,[dlye] mov [eax+12],ebx sub eax,draw_data-window_data cmp ecx,1 jne nobgrd cmp esi,1 je newdw8 call drawbackground newdw8: nobgrd: mov [eax+31],byte 1 ; mark as redraw ricino: not_this_task: pop ecx cmp ecx,[0x3004] jle newdw2 ; jg newdw3 ; jmp newdw2 ; newdw3: pop eax popad ret ; check mouse ; ; ; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y ; FB10 -> FB17 mouse color mem ; FB21 x move ; FB22 y move ; FB30 color temp ; FB28 high bits temp ; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under ; FC00 -> FCFE com1/ps2 buffer ; FCFF com1/ps2 buffer count starting from FC00 uglobal mousecount dd 0x0 mousedata dd 0x0 endg check_mouse_data: pushad cmp [0xF604],byte 1 jne no_ps2_mouse mov [mousecount],dword 0x2e0000+12*4096 mov [mousedata],dword 0x2e0000+12*4096+0x10 jmp uusicheckmouse no_ps2_mouse: cmp [0xF604],byte 2 jne no_com1_mouse mov [mousecount],dword 0x2e0000+4*4096 mov [mousedata],dword 0x2e0000+4*4096+0x10 jmp uusicheckmouse no_com1_mouse: mov [mousecount],dword 0x2e0000+3*4096 mov [mousedata],dword 0x2e0000+3*4096+0x10 uusicheckmouse: mov ebx,[mousecount] ; anything at buffer for mouse cmp dword [ebx], 0 ; !!! jz checkmouseret ; first byte of comX or ps2 ? cmp [0xF604],byte 1 je ps2mousefirst ; ****************************************** ; *********** COMX mouse driver ************ ; ****************************************** com1mousefirst: mov edi,[mousedata] mov dl,byte [edi] ; first com1 ? test dl,64 jz @f mov [0xfb00],byte 0 ; zero mouse block count @@: xor ebx,ebx mov bl,[0xfb00] inc bl mov [0xfb00],bl mov eax,0xfb00 add eax,ebx mov edi,[mousedata] mov dl,byte [edi] mov [eax],byte dl cmp bl,3 ; three ? jnz decm ; buttons ;* change right and left button by places - start code - Mario79 mov al,[0xfb01] mov ah,al shr al,3 and al,2 shr ah,5 and ah,1 add al,ah ;* change right and left button by places - end code - Mario79 mov [0xfb40],al ; com1 mouse ; x mov dl,[0xfb01] ; x high bits movzx eax,dl and al,3 shl al,6 mov dl,byte[0xfb02] ; x low bits add al,dl mov [0xfb21],byte al movzx ebx,word[0xfb0a] mov al,byte [0xfb01] ; + or - ? test al,2 jz x_add x_sub: ; x- sub bx,255 sub bx,255 x_add: ; x+ movzx eax,byte [0xfb21] add bx,ax add bx,ax push ebx mov [0xfb00],byte 0 ; y my_event: mov dl,[0xfb01] ; y high bits movzx eax,dl and al,12 shl al,4 mov dl,byte[0xfb03] ; y low bits add al,dl mov [0xfb22],byte al movzx ebx,word[0xfb0c] mov al,byte [0xfb01] ; + or - ? test al,8 je y_add y_sub: ; y- sub bx,255 sub bx,255 y_add: ; y+ movzx eax,byte [0xfb22] add bx,ax add bx,ax push ebx mov [0xfb00],byte 0 jmp mdraw ; end of com1 mouse ; ****************************************** ; ******** PS2 MOUSE DRIVER ************** ; ****************************************** ps2mousefirst: movzx edx,byte [0x2E0000+4096*12+0x10] ; first ps2 ? cmp edx,40 jne @f mov [0xfb00],byte 0 ; zero mouse block count @@: movzx ebx,byte [0xfb00] add ebx,1 mov [0xfb00],bl mov eax,0xfb00 add eax,ebx mov dl,byte [0x2E0000+4096*12+0x10] mov [eax],byte dl cmp bl,3 ; full packet of three bytes ? jnz decm ; jz ps2mouse ; jmp decm ; ps2mouse: mov [0xfb00],byte 0 ; zero mouse block count ; buttons movzx eax,byte [0xfb01] and eax,3 mov [0xfb40],al ; x movzx eax,word [0xfb0a] movzx edx,byte [0xfb02] cmp edx,128 jb ps2xp shl edx,1 add eax,edx cmp eax,512 jge ps2xsok xor eax, eax jmp ps2xready ps2xsok: sub eax,512 jmp ps2xready ps2xp: shl edx,1 add eax,edx jmp ps2xready ps2xready: push eax ; y movzx eax,word [0xfb0c] movzx edx,byte [0xfb03] cmp edx,128 jb ps2yp add eax,512 shl edx,1 sub eax,edx jmp ps2yready ps2yp: shl edx,1 cmp edx,eax jb ps201 mov edx,eax ps201: sub eax,edx jmp ps2yready ps2yready: push eax ;jmp mdraw ; end of ps2 mouse ; **************************** ; ***** CHECK FOR LIMITS ***** ; **************************** mdraw: cmp [0xfb44],byte 0 jne mousedraw4 cmp [0xfb40],byte 0 je mousedraw4 mov [0xfff5],byte 1 mousedraw4: pop ebx pop eax mov [mouse_active],1 ; mov dx,0 ; smaller than zero xor dx,dx cmp bx,dx jge mnb11 ; mov bx,0 xor bx,bx mnb11: mov [0xfb0c],word bx ; mov dx,0 xor dx,dx cmp ax,dx jge mnb22 ; mov ax,0 xor ax,ax mnb22: mov [0xfb0a],word ax mov edx,[0xfe04] ; bigger than maximum cmp ebx,edx jb mnb1 mov bx,[0xfe04] mnb1: mov [0xfb0c],word bx mov edx,[0xfe00] cmp eax,edx jb mnb2 mov ax,[0xfe00] mnb2: mov [0xfb0a],word ax ; **** NEXT DATA BYTE FROM MOUSE BUFFER **** decm: mov edi,[mousecount] ; decrease counter dec dword [edi] mov esi,[mousedata] mov edi,esi inc esi ; mov ecx,250 mov ecx,[mousecount] mov ecx,[ecx] cld rep movsb jmp uusicheckmouse checkmouseret: cmp [0xfb44],byte 0 jne cmret cmp [0xfb40],byte 0 je cmret mov [0xfff4],byte 0 mov [0xfff5],byte 0 cmret: popad ret draw_mouse_under: ; return old picture ; cli pushad xor ecx,ecx xor edx,edx ;cli ; !!!**** align 4 mres: movzx eax,word [0xfb4a] movzx ebx,word [0xfb4c] add eax,ecx add ebx,edx push ecx push edx push eax push ebx mov eax,edx shl eax,6 shl ecx,2 add eax,ecx add eax,mouseunder mov ecx,[eax] pop ebx pop eax ;;;push edi mov edi,1 ;force call [putpixel] ;;;pop edi pop edx pop ecx inc ecx cmp ecx, 16 jnz mres xor ecx, ecx inc edx cmp edx, 24 jnz mres ;sti ; !!!**** popad ; sti ret save_draw_mouse: ; save & draw ; cli mov [0xfb4a],ax mov [0xfb4c],bx push eax push ebx mov ecx,0 mov edx,0 ;cli ; !!!**** drm: push eax push ebx push ecx push edx ; helloworld push eax ebx ecx add eax,ecx ; save picture under mouse add ebx,edx push ecx call getpixel mov [0xfb30],ecx pop ecx mov eax,edx shl eax,6 shl ecx,2 add eax,ecx add eax,mouseunder mov ebx,[0xfb30] mov [eax],ebx pop ecx ebx eax mov edi,edx ; y cycle shl edi,4 ; *16 bytes per row add edi,ecx ; x cycle mov esi, edi add edi, esi add edi, esi ; *3 add edi,[0xf200] ; we have our str address mov esi, edi add esi, 16*24*3 push ecx mov ecx, [0xfb30] call combine_colors mov [0xfb10], ecx pop ecx pop edx pop ecx pop ebx pop eax add eax,ecx ; we have x coord+cycle add ebx,edx ; and y coord+cycle push ecx edi mov ecx, [0xfb10] mov edi, 1 call [putpixel] pop edi ecx mnext: mov ebx,[esp+0] ; pure y coord again mov eax,[esp+4] ; and x inc ecx ; +1 cycle cmp ecx,16 ; if more than 16 jnz drm xor ecx, ecx inc edx cmp edx,24 jnz drm pop ebx pop eax ; sti ; !!!**** ret combine_colors: ; in ; ecx - color ( 00 RR GG BB ) ; edi - ref to new color byte ; esi - ref to alpha byte ; ; out ; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) ) push eax push ebx push edx push ecx xor ecx, ecx ; byte 2 mov eax, 0xff sub al, [esi+0] mov ebx, [esp] shr ebx, 16 and ebx, 0xff mul ebx shr eax, 8 add ecx, eax ; xor eax, eax ; xor ebx, ebx ; mov al, [edi+0] ; mov bl, [esi+0] movzx eax, byte [edi+0] movzx ebx, byte [esi+0] mul ebx shr eax, 8 add ecx, eax shl ecx, 8 ; byte 1 mov eax, 0xff sub al, [esi+1] mov ebx, [esp] shr ebx, 8 and ebx, 0xff mul ebx shr eax, 8 add ecx, eax ; xor eax, eax ; xor ebx, ebx ; mov al, [edi+1] ; mov bl, [esi+1] movzx eax, byte [edi+1] movzx ebx, byte [esi+1] mul ebx shr eax, 8 add ecx, eax shl ecx, 8 ; byte 2 mov eax, 0xff sub al, [esi+2] mov ebx, [esp] and ebx, 0xff mul ebx shr eax, 8 add ecx, eax ; xor eax, eax ; xor ebx, ebx ; mov al, [edi+2] ; mov bl, [esi+2] movzx eax, byte [edi+2] movzx ebx, byte [esi+2] mul ebx shr eax, 8 add ecx, eax pop eax pop edx pop ebx pop eax ret __sys_disable_mouse: pushad cmp [0x3000],dword 1 je disable_m mov edx,[0x3000] shl edx,5 add edx,window_data movzx eax, word [0xfb0a] movzx ebx, word [0xfb0c] mov ecx,[0xfe00] inc ecx imul ecx,ebx add ecx,eax add ecx, display_data movzx eax, byte [edx+twdw+0xe] movzx ebx, byte [ecx] cmp eax,ebx je yes_mouse_disable movzx ebx, byte [ecx+16] cmp eax,ebx je yes_mouse_disable mov ebx,[0xfe00] inc ebx imul ebx,10 add ecx,ebx movzx ebx, byte [ecx] cmp eax,ebx je yes_mouse_disable mov ebx,[0xfe00] inc ebx imul ebx,10 add ecx,ebx movzx ebx, byte [ecx] cmp eax,ebx je yes_mouse_disable movzx ebx, byte [ecx+16] cmp eax,ebx je yes_mouse_disable jmp no_mouse_disable yes_mouse_disable: mov edx,[0x3000] shl edx,5 add edx,window_data movzx eax, word [0xfb0a] movzx ebx, word [0xfb0c] mov ecx,[edx+0] ; mouse inside the area ? add eax,14 cmp eax,ecx jb no_mouse_disable sub eax,14 add ecx,[edx+8] cmp eax,ecx jg no_mouse_disable mov ecx,[edx+4] add ebx,20 cmp ebx,ecx jb no_mouse_disable sub ebx,20 add ecx,[edx+12] cmp ebx,ecx jg no_mouse_disable disable_m: cmp dword [0xf204],dword 0 jne @f call draw_mouse_under @@: mov [0xf204],dword 1 no_mouse_disable: popad ret __sys_draw_pointer: cli pushad cmp dword [0xf204],dword 0 ; mouse visible ? je chms00 dec dword [0xf204] cmp [0xf204],dword 0 jnz nodmu2 movzx ebx,word [0xfb0c] movzx eax,word [0xfb0a] call save_draw_mouse popad sti ret nodmu2: popad sti ret chms00: ; popad ; pushad ; cmp [0xf204],dword 0 ; jne nodmp movzx ecx,word [0xfb4a] movzx edx,word [0xfb4c] movzx ebx,word [0xfb0c] movzx eax,word [0xfb0a] cmp eax,ecx jne redrawmouse cmp ebx,edx jne redrawmouse jmp nodmp redrawmouse: call draw_mouse_under redrawmouse_1: call save_draw_mouse nodmp: popad sti ret calculatebackground: ; background ; all black mov [display_data-8],dword 4 ; size x mov [display_data-4],dword 2 ; size y mov edi, 0x300000 ; set background to black xor eax, eax mov ecx, 0x0fff00 / 4 cld rep stosd mov edi,display_data ; set os to use all pixels mov eax,0x01010101 mov ecx,0x1fff00 / 4 rep stosd mov byte [0xFFF0], 0 ; do not draw background! ret uglobal imax dd 0x0 endg delay_ms: ; delay in 1/1000 sec push eax push ecx mov ecx,esi ; imul ecx, 33941 shr ecx, 9 ; in al,0x61 and al,0x10 mov ah,al cld cnt1: in al,0x61 and al,0x10 cmp al,ah jz cnt1 mov ah,al loop cnt1 pop ecx pop eax ret set_app_param: push edi mov edi,[0x3010] mov [edi],eax pop edi ret delay_hs: ; delay in 1/100 secs push eax push ecx push edx mov edx,[timer_ticks];[0xfdf0] add edx,eax newtic: mov ecx,[timer_ticks];[0xfdf0] cmp edx,ecx jbe zerodelay call change_task jmp newtic zerodelay: pop edx pop ecx pop eax ret memmove: ; memory move in bytes ; eax = from ; ebx = to ; ecx = no of bytes test ecx, ecx jle .ret push esi edi ecx mov edi, ebx mov esi, eax test ecx, not 11b jz @f push ecx shr ecx, 2 rep movsd pop ecx and ecx, 11b jz .finish @@: rep movsb .finish: pop ecx edi esi .ret: ret ; calculate fat chain calculatefatchain: pushad mov esi,0x100000+512 mov edi,0x280000 fcnew: xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx mov al,[esi+0] ; 1 mov bl,[esi+1] and ebx,15 shl ebx,8 add eax,ebx mov [edi],ax add edi,2 xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx mov bl,[esi+1] ; 2 mov cl,[esi+2] shr ebx,4 shl ecx,4 add ecx,ebx mov [edi],cx add edi,2 add esi,3 cmp edi,0x280000+4100*4 jnz fcnew popad ret restorefatchain: ; restore fat chain pushad mov esi,0x280000 mov edi,0x100000+512 fcnew2: cld xor eax,eax xor ebx,ebx xor ecx,ecx ; esi XXXXxxxxxxxx yyyyyyyyYYYY xor edx,edx mov ax,[esi] ; edi xxxxxxxx YYYYXXXX yyyyyyyy mov bx,ax shr bx,8 and ebx,15 mov [edi+0],al ; 1 -> 1 & 2 mov [edi+1],bl add esi,2 xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx mov bx,[esi] mov cx,bx shr ecx,4 mov [edi+2],cl and ebx,15 shl ebx,4 mov edx,[edi+1] add edx,ebx mov [edi+1],dl ; 2 -> 2 & 3 add esi,2 add edi,3 cmp edi,0x100000+512+0x1200 jb fcnew2 mov esi,0x100000+512 ; duplicate fat chain mov edi,0x100000+512+0x1200 mov ecx,0x1200/4 cld rep movsd popad ret align 4 read_floppy_file: ; as input ; ; eax pointer to file ; ebx file lenght ; ecx start 512 byte block number ; edx number of blocks to read ; esi pointer to return/work area (atleast 20 000 bytes) ; ; ; on return ; ; eax = 0 command succesful ; 1 no fd base and/or partition defined ; 2 yet unsupported FS ; 3 unknown FS ; 4 partition not defined at hd ; 5 file not found ; ebx = size of file mov edi,[0x3010] add edi,0x10 add esi,[edi] add eax,[edi] pushad mov edi,esi add edi,1024 mov esi,0x100000+19*512 sub ecx,1 shl ecx,9 add esi,ecx shl edx,9 mov ecx,edx cld rep movsb popad mov [esp+36],eax mov [esp+24],ebx ret align 4 sys_programirq: mov edi,[0x3010] add edi,0x10 add eax,[edi] mov edx,ebx shl edx,2 add edx,irq_owner mov edx,[edx] mov edi,[0x3010] mov edi,[edi+0x4] cmp edx,edi je spril1 mov [esp+36],dword 1 ret spril1: mov esi,eax shl ebx,6 add ebx,irq00read mov edi,ebx mov ecx,16 cld rep movsd mov [esp+36],dword 0 ret align 4 get_irq_data: mov edx,eax ; check for correct owner shl edx,2 add edx,irq_owner mov edx,[edx] mov edi,[0x3010] mov edi,[edi+0x4] cmp edx,edi je gidril1 mov [esp+36],eax mov [esp+32],dword 2 mov [esp+24],ebx ret gidril1: mov ebx,eax shl ebx,12 add ebx,0x2e0000 mov eax,[ebx] mov ecx,1 test eax,eax jz gid1 dec eax mov esi,ebx mov [ebx],eax movzx ebx,byte [ebx+0x10] add esi,0x10 mov edi,esi inc esi mov ecx,4000 / 4 cld rep movsd xor ecx,ecx gid1: mov [esp+36],eax mov [esp+32],ecx mov [esp+24],ebx ret set_io_access_rights: pushad mov edi,[0x3000] imul edi,tss_step add edi,tss_data+128 ; add edi,128 mov ecx,eax and ecx,7 ; offset in byte shr eax,3 ; number of byte add edi,eax mov ebx,1 shl ebx,cl cmp ebp,0 ; enable access - ebp = 0 jne siar1 not ebx and [edi],byte bl popad ret siar1: or [edi],byte bl ; disable access - ebp = 1 popad ret r_f_port_area: test eax, eax jnz free_port_area ; je r_port_area ; jmp free_port_area ; r_port_area: pushad cmp ebx,ecx ; beginning > end ? jg rpal1 mov esi,[0x2d0000] cmp esi,0 ; no reserved areas ? je rpal2 cmp esi,255 ; max reserved jge rpal1 rpal3: mov edi,esi shl edi,4 add edi,0x2d0000 cmp ebx,[edi+8] jg rpal4 cmp ecx,[edi+4] jae rpal1 ; jb rpal4 ; jmp rpal1 rpal4: dec esi jnz rpal3 jmp rpal2 rpal1: popad mov eax,1 ret rpal2: popad ; enable port access at port IO map cli pushad ; start enable io map cmp ecx,65536 ;16384 jae no_unmask_io ; jge mov eax,ebx new_port_access: pushad mov ebp,0 ; enable - eax = port call set_io_access_rights popad inc eax cmp eax,ecx jbe new_port_access no_unmask_io: popad ; end enable io map sti mov edi,[0x2d0000] add edi,1 mov [0x2d0000],edi shl edi,4 add edi,0x2d0000 mov esi,[0x3010] mov esi,[esi+0x4] mov [edi],esi mov [edi+4],ebx mov [edi+8],ecx xor eax, eax ret free_port_area: pushad mov esi,[0x2d0000] ; no reserved areas ? cmp esi,0 je frpal2 mov edx,[0x3010] mov edx,[edx+4] frpal3: mov edi,esi shl edi,4 add edi,0x2d0000 cmp edx,[edi] jne frpal4 cmp ebx,[edi+4] jne frpal4 cmp ecx,[edi+8] jne frpal4 jmp frpal1 frpal4: dec esi jnz frpal3 frpal2: popad mov eax,1 ret frpal1: mov ecx,256 sub ecx,esi shl ecx,4 mov esi,edi add esi,16 cld rep movsb dec dword [0x2d0000] popad ; disable port access at port IO map pushad ; start disable io map cmp ecx,65536 ;16384 jge no_mask_io mov eax,ebx new_port_access_disable: pushad mov ebp,1 ; disable - eax = port call set_io_access_rights popad inc eax cmp eax,ecx jbe new_port_access_disable no_mask_io: popad ; end disable io map xor eax, eax ret reserve_free_irq: cmp eax,0 jz reserve_irq mov edi,ebx shl edi,2 add edi,irq_owner mov edx,[edi] mov eax,[0x3010] mov eax,[eax+0x4] mov ecx,1 cmp edx,eax jne fril1 mov [edi],dword 0 mov ecx,0 fril1: mov [esp+36],ecx ; return in eax ret reserve_irq: mov edi,ebx shl edi,2 add edi,irq_owner mov edx,[edi] mov ecx,1 cmp edx,0 jne ril1 mov edx,[0x3010] mov edx,[edx+0x4] mov [edi],edx mov ecx,0 ril1: mov [esp+36],ecx ; return in eax ret drawbackground: cmp [0xfe0c],word 0x12 jne dbrv12 cmp [display_data-12],dword 1 jne bgrstr12 call vga_drawbackground_tiled ret bgrstr12: call vga_drawbackground_stretch ret dbrv12: cmp [0xfe0c],word 0100000000000000b jge dbrv20 cmp [0xfe0c],word 0x13 je dbrv20 call vesa12_drawbackground ret dbrv20: cmp [display_data-12],dword 1 jne bgrstr call vesa20_drawbackground_tiled ret bgrstr: call vesa20_drawbackground_stretch ret sys_putimage: cmp [0xfe0c],word 0x12 jne spiv20 call vga_putimage ret spiv20: cmp [0xfe0c],word 0100000000000000b jge piv20 cmp [0xfe0c],word 0x13 je piv20 call vesa12_putimage ret piv20: call vesa20_putimage ret ; eax x beginning ; ebx y beginning ; ecx x end ; edx y end ; edi color __sys_drawbar: cmp [0xfe0c],word 0x12 jne sdbv20 call vga_drawbar ret sdbv20: cmp [0xfe0c],word 0100000000000000b jge dbv20 cmp [0xfe0c],word 0x13 je dbv20 call vesa12_drawbar ret dbv20: call vesa20_drawbar ret kb_read: push ecx edx mov ecx,0xffff kr_loop: in al,0x64 test al,1 jnz kr_ready loop kr_loop mov ah,1 jmp kr_exit kr_ready: push ecx mov ecx,32 kr_delay: loop kr_delay pop ecx in al,0x60 xor ah,ah kr_exit: pop edx ecx ret kb_write: push ecx edx mov dl,al mov ecx,0xffff kw_loop1: in al,0x64 test al,0x20 jz kw_ok1 loop kw_loop1 mov ah,1 jmp kw_exit kw_ok1: in al,0x60 mov ecx,0xffff kw_loop: in al,0x64 test al,2 jz kw_ok loop kw_loop mov ah,1 jmp kw_exit kw_ok: mov al,dl out 0x60,al mov ecx,0xffff kw_loop3: in al,0x64 test al,2 jz kw_ok3 loop kw_loop3 mov ah,1 jmp kw_exit kw_ok3: mov ah,8 kw_loop4: mov ecx,0xffff kw_loop5: in al,0x64 test al,1 jnz kw_ok4 loop kw_loop5 dec ah jnz kw_loop4 kw_ok4: xor ah,ah kw_exit: pop edx ecx ret kb_cmd: mov ecx,0xffff c_wait: in al,0x64 test al,2 jz c_send loop c_wait jmp c_error c_send: mov al,bl out 0x64,al mov ecx,0xffff c_accept: in al,0x64 test al,2 jz c_ok loop c_accept c_error: mov ah,1 jmp c_exit c_ok: xor ah,ah c_exit: ret setmouse: ; set mousepicture -pointer ; ps2 mouse enable mov [0xf200],dword mousepointer cli mov bl,0xa8 ; enable mouse cmd call kb_cmd call kb_read ; read status mov bl,0x20 ; get command byte call kb_cmd call kb_read or al,3 ; enable interrupt mov bl,0x60 ; write command push eax call kb_cmd pop eax call kb_write mov bl,0xd4 ; for mouse call kb_cmd mov al,0xf4 ; enable mouse device call kb_write call kb_read ; read status return ; com1 mouse enable mov bx,0x3f8 ; combase mov dx,bx add dx,3 mov al,0x80 out dx,al mov dx,bx add dx,1 mov al,0 out dx,al mov dx,bx add dx,0 mov al,0x30*2 ; 0x30 / 4 out dx,al mov dx,bx add dx,3 mov al,2 ; 3 out dx,al mov dx,bx add dx,4 mov al,0xb out dx,al mov dx,bx add dx,1 mov al,1 out dx,al ; com2 mouse enable mov bx,0x2f8 ; combase mov dx,bx add dx,3 mov al,0x80 out dx,al mov dx,bx add dx,1 mov al,0 out dx,al mov dx,bx add dx,0 mov al,0x30*2 out dx,al mov dx,bx add dx,3 mov al,2 out dx,al mov dx,bx add dx,4 mov al,0xb out dx,al mov dx,bx add dx,1 mov al,1 out dx,al ret _rdtsc: mov edx,[cpuid_1+3*4] test edx,00010000b jz ret_rdtsc rdtsc ret ret_rdtsc: mov edx,0xffffffff mov eax,0xffffffff ret rerouteirqs: cli mov al,0x11 ; icw4, edge triggered out 0x20,al call pic_delay out 0xA0,al call pic_delay mov al,0x20 ; generate 0x20 + out 0x21,al call pic_delay mov al,0x28 ; generate 0x28 + out 0xA1,al call pic_delay mov al,0x04 ; slave at irq2 out 0x21,al call pic_delay mov al,0x02 ; at irq9 out 0xA1,al call pic_delay mov al,0x01 ; 8086 mode out 0x21,al call pic_delay out 0xA1,al call pic_delay mov al,255 ; mask all irq's out 0xA1,al call pic_delay out 0x21,al call pic_delay mov ecx,0x1000 cld picl1: call pic_delay loop picl1 mov al,255 ; mask all irq's out 0xA1,al call pic_delay out 0x21,al call pic_delay cli ret pic_delay: jmp pdl1 pdl1: ret sys_msg_board_str: pushad @@: cmp [esi],byte 0 je @f mov eax,1 movzx ebx,byte [esi] call sys_msg_board inc esi jmp @b @@: popad ret uglobal msg_board_data: times 512 db 0 msg_board_count dd 0x0 endg sys_msg_board: ; eax=1 : write : bl byte to write ; eax=2 : read : ebx=0 -> no data, ebx=1 -> data in al mov ecx,[msg_board_count] cmp eax, 1 jne smbl1 mov [msg_board_data+ecx],bl inc ecx and ecx, 511 mov [msg_board_count], ecx mov [check_idle_semaphore], 5 ret smbl1: cmp eax, 2 jne smbl2 test ecx, ecx jz smbl21 ; mov edi, msg_board_data ; mov esi, msg_board_data+1 ; movzx eax, byte [edi] mov eax, msg_board_data+1 mov ebx, msg_board_data movzx edx, byte [ebx] call memmove ; push ecx ; shr ecx, 2 ; cld ; rep movsd ; pop ecx ; and ecx, 3 ; rep movsb dec [msg_board_count] mov [esp+36], edx ;eax mov [esp+24], dword 1 ret smbl21: mov [esp+36], ecx mov [esp+24], ecx smbl2: ret sys_trace: test eax, eax ; get event data jnz no_get_sys_events mov esi,save_syscall_data ; data mov edi,[0x3010] mov edi,[edi+0x10] add edi,ebx cld rep movsb mov [esp+24],dword 0 mov eax,[save_syscall_count] ; count mov [esp+36],eax ret no_get_sys_events: ret sys_process_def: cmp eax,1 ; set keyboard mode jne no_set_keyboard_setup mov edi,[0x3000] shl edi,8 add edi,0x80000+0xB4 mov [edi],bl ret no_set_keyboard_setup: cmp eax,2 ; get keyboard mode jne no_get_keyboard_setup mov edi,[0x3000] shl edi,8 add edi,0x80000+0xB4 movzx eax, byte [edi] mov [esp+36],eax ret no_get_keyboard_setup: cmp eax,3 ; get keyboard ctrl, alt, shift jne no_get_keyboard_cas ; xor eax,eax ; movzx eax,byte [shift] ; movzx ebx,byte [ctrl] ; shl ebx,2 ; add eax,ebx ; movzx ebx,byte [alt] ; shl ebx,3 ; add eax,ebx ;// mike.dld [ mov eax, [kb_state] ;// mike.dld ] mov [esp+36],eax ret no_get_keyboard_cas: ret sys_ipc: cmp eax,1 ; DEFINE IPC MEMORY jne no_ipc_def mov edi,[0x3000] shl edi,8 add edi,0x80000 mov [edi+0xA0],ebx mov [edi+0xA4],ecx mov [esp+36],dword 0 ret no_ipc_def: cmp eax,2 ; SEND IPC MESSAGE jne no_ipc_send mov esi,1 mov edi,0x3020 ipcs1: cmp [edi+4],ebx je ipcs2 add edi,0x20 inc esi cmp esi,[0x3004] jbe ipcs1 mov [esp+36],dword 4 ret ipcs2: cli push esi mov eax,esi shl eax,8 mov ebx,[eax+0x80000+0xa0] test ebx,ebx ; ipc area not defined ? je ipc_err1 add ebx,[eax+0x80000+0xa4] mov eax,esi shl eax,5 add ebx,[eax+0x3000+0x10] ; ebx <- max data position mov eax,esi ; to shl esi,8 add esi,0x80000 mov edi,[esi+0xa0] shl eax,5 add eax,0x3000 add edi,[eax+0x10] cmp [edi],byte 0 ; overrun ? jne ipc_err2 mov ebp,edi add edi,[edi+4] add edi,8 mov esi,ecx ; from mov eax,[0x3010] mov eax,[eax+0x10] add esi,eax mov ecx,edx ; size mov eax,edi add eax,ecx cmp eax,ebx jge ipc_err3 ; not enough room ? push ecx mov eax,[0x3010] mov eax,[eax+4] mov [edi-8],eax mov [edi-4],ecx cld rep movsb pop ecx add ecx,8 mov edi,ebp ; increase memory position add dword [edi+4],ecx mov edi,[esp] shl edi,8 or dword [edi+0x80000+0xA8],dword 01000000b ; ipc message cmp [check_idle_semaphore],dword 20 jge ipc_no_cis mov [check_idle_semaphore],5 ipc_no_cis: xor eax, eax ipc_err: add esp,4 mov [esp+36],eax sti ret ipc_err1: add esp,4 mov [esp+36],dword 1 sti ret ipc_err2: add esp,4 mov [esp+36],dword 2 sti ret ipc_err3: add esp,4 mov [esp+36],dword 3 sti ret no_ipc_send: mov [esp+36],dword -1 ret align 4 sys_gs: ; direct screen access cmp eax,1 ; resolution jne no_gs1 mov eax,[0xfe00] shl eax,16 mov ax,[0xfe04] add eax,0x00010001 mov [esp+36],eax ret no_gs1: cmp eax,2 ; bits per pixel jne no_gs2 movzx eax,byte [0xfbf1] mov [esp+36],eax ret no_gs2: cmp eax,3 ; bytes per scanline jne no_gs3 mov eax,[0xfe08] mov [esp+36],eax ret no_gs3: mov [esp+36],dword -1 ret align 4 ; PCI functions sys_pci: call pci_api mov [esp+36],eax ret align 4 ; system functions syscall_setpixel: ; SetPixel mov edx,[0x3010] add eax,[edx-twdw] add ebx,[edx-twdw+4] xor edi,edi ; no force call [disable_mouse] jmp [putpixel] align 4 syscall_writetext: ; WriteText mov edi,[0x3010] mov ebp,[edi-twdw] shl ebp,16 add ebp,[edi-twdw+4] add edi,0x10 add ecx,[edi] add eax,ebp xor edi,edi jmp dtext align 4 syscall_openramdiskfile: ; OpenRamdiskFile mov edi,[0x3010] add edi,0x10 add eax,[edi] add edx,[edi] mov esi,12 call fileread mov [esp+36],ebx ret align 4 syscall_putimage: ; PutImage mov edi,[0x3010] add edi,0x10 add eax,[edi] mov edx,ecx mov ecx,ebx mov ebx,eax call sys_putimage mov [esp+36],eax ret align 4 syscall_drawrect: ; DrawRect mov edi,ecx test ax,ax je drectr test bx,bx je drectr movzx ecx,ax shr eax,16 movzx edx,bx shr ebx,16 add ecx,eax add edx,ebx jmp [drawbar] drectr: ret align 4 syscall_getscreensize: ; GetScreenSize movzx eax,word[0xfe00] shl eax,16 mov ax,[0xfe04] mov [esp+36],eax ret align 4 syscall_system: ; System call sys_system mov [esp+36],eax ret align 4 syscall_startapp: ; StartApp mov edi,[0x3010] add edi,0x10 add eax,[edi] test ebx,ebx jz noapppar add ebx,[edi] noapppar: ; call start_application_fl call new_start_application_fl mov [esp+36],eax ret align 4 syscall_cdaudio: ; CD call sys_cd_audio mov [esp+36],eax ret align 4 syscall_readhd: ; ReadHd mov edi,[0x3010] add edi,0x10 add esi,[edi] add eax,[edi] call read_hd_file mov [esp+36],eax mov [esp+24],ebx ret align 4 syscall_starthdapp: ; StartHdApp mov edi,[0x3010] add edi,0x10 add eax,[edi] add ecx,[edi] mov ebp,0 call start_application_hd mov [esp+36],eax ret align 4 syscall_delramdiskfile: ; DelRamdiskFile mov edi,[0x3010] add edi,0x10 add eax,[edi] call filedelete mov [esp+36],eax ret align 4 syscall_writeramdiskfile: ; WriteRamdiskFile mov edi,[0x3010] add edi,0x10 add eax,[edi] add ebx,[edi] call filesave mov [esp+36],eax ret align 4 syscall_getpixel: ; GetPixel mov ecx,[0xfe00] inc ecx xor edx,edx div ecx mov ebx,edx xchg eax,ebx call dword [0xe024] mov [esp+36],ecx ret align 4 syscall_readstring: ; ReadString mov edi,[0x3010] add edi,0x10 add eax,[edi] call read_string mov [esp+36],eax ret align 4 syscall_drawline: ; DrawLine mov edi,[0x3010] movzx edx,word[edi-twdw] mov ebp,edx shl edx,16 add ebp,edx movzx edx,word[edi-twdw+4] add eax,ebp mov ebp,edx shl edx,16 xor edi,edi add edx,ebp add ebx,edx jmp [draw_line] align 4 syscall_getirqowner: ; GetIrqOwner shl eax,2 add eax,irq_owner mov eax,[eax] mov [esp+36],eax ret align 4 syscall_reserveportarea: ; ReservePortArea and FreePortArea call r_f_port_area mov [esp+36],eax ret align 4 syscall_appints: ; AppInts test eax,eax jnz unknown_app_int_fn mov edi,[0x3010] mov [edi+draw_data-0x3000+0x1c],ebx ret unknown_app_int_fn: mov [esp+36],dword -1 ret align 4 syscall_threads: ; CreateThreads call sys_threads mov [esp+36],eax ret align 4 stack_driver_stat: call app_stack_handler ; Stack status ; mov [check_idle_semaphore],5 ; enable these for zero delay ; call change_task ; between sent packet mov [esp+36],eax ret align 4 socket: ; Socket interface call app_socket_handler ; mov [check_idle_semaphore],5 ; enable these for zero delay ; call change_task ; between sent packet mov [esp+36],eax mov [esp+24],ebx ret align 4 user_events: ; User event times mov eax,0x12345678 mov [esp+36],eax ret align 4 read_from_hd: ; Read from hd - fn not in use mov edi,[0x3010] add edi,0x10 add eax,[edi] add ecx,[edi] add edx,[edi] call file_read mov [esp+36],eax mov [esp+24],ebx ret align 4 write_to_hd: ; Write a file to hd mov edi,[0x3010] add edi,0x10 add eax,[edi] add ecx,[edi] add edx,[edi] call file_write ret align 4 delete_from_hd: ; Delete a file from hd mov edi,[0x3010] add edi,0x10 add eax,[edi] add ecx,[edi] call file_delete ret align 4 undefined_syscall: ; Undefined system call mov [esp+36],dword -1 ret ;clear_busy_flag_at_caller: ; push edi ; mov edi,[0x3000] ; restore processes tss pointer in gdt, busyfl? ; imul edi,8 ; mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b ; pop edi ; ret keymap: db '6',27 db '1234567890-=',8,9 db 'qwertyuiop[]',13 db '~asdfghjkl;',39,96,0,'\zxcvbnm,./',0,'45 ' db '@234567890123',180,178,184,'6',176,'7' db 179,'8',181,177,183,185,182 db 'AB?',0,'45 ' db '@234567890123',180,178,184,'6',176,'7' db 179,'8',181,177,183,185,182 db 'AB>D',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' keymap_alt: db ' ',27 db ' @ $ {[]}\ ',8,9 db ' ',13 db ' ',0,' ',0,'4',0,' ' db ' ',180,178,184,'6',176,'7' db 179,'8',181,177,183,185,182 db 'ABCD',255,'FGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ; device irq owners uglobal irq_owner: ; process id dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 dd 0x0 endg ; on irq read ports uglobal irq00read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq01read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq02read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq03read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq04read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq05read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq06read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq07read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq08read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq09read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq10read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq11read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq12read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq13read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq14read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 irq15read dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 endg ; status uglobal hd1_status dd 0x0 ; 0 - free : other - pid application_table_status dd 0x0 ; 0 - free : other - pid endg ; device addresses uglobal mididp dd 0x0 midisp dd 0x0 cdbase dd 0x0 cdid dd 0x0 hdbase dd 0x0 ; for boot 0x1f0 hdid dd 0x0 hdpos dd 0x0 ; for boot 0x1 fat32part dd 0x0 ; for boot 0x1 ;part2_ld dd 0x0 ;* start code - get process (3) - Mario79 active_process dd 0 ;* end code - get active process (3) - Mario79 wraw_bacground_select db 0 lba_read_enabled dd 0x0 ; 0 = disabled , 1 = enabled pci_access_enabled dd 0x0 ; 0 = disabled , 1 = enabled sb16 dd 0x0 wss dd 0x0 buttontype dd 0x0 windowtypechanged dd 0x0 endg iglobal keyboard dd 0x1 sound_dma dd 0x1 syslang dd 0x1 endg IncludeIGlobals endofcode: IncludeUGlobals uglobals_size = $ - endofcode diff16 "end of kernel code",$