/kernel/branches/Kolibri-acpi/blkdev/cd_drv.inc |
---|
239,10 → 239,10 |
in AL,DX |
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY |
jnz @@WaitDevice0 |
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
jnz @@Err6 |
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ |
jz @@WaitDevice0 |
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
jnz @@Err6 |
; Ïîñëàòü ïàêåòíóþ êîìàíäó |
cli |
mov DX,[ATABasePortAddr] |
282,10 → 282,10 |
in AL,DX |
test AL,80h ;ñîñòîÿíèå ñèãíàëà BSY |
jnz @@WaitDevice1 |
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
jnz @@Err6_temp |
test AL,08h ;ñîñòîÿíèå ñèãíàëà DRQ |
jz @@WaitDevice1 |
test AL,1 ;ñîñòîÿíèå ñèãíàëà ERR |
jnz @@Err6_temp |
; Ïðèíÿòü áëîê äàííûõ îò êîíòðîëëåðà |
mov EDI,[CDDataBuf_pointer] ;0x7000 ;CDDataBuf |
; Çàãðóçèòü àäðåñ ðåãèñòðà äàííûõ êîíòðîëëåðà |
/kernel/branches/Kolibri-acpi/blkdev/hd_drv.inc |
---|
49,6 → 49,12 |
; Read through BIOS? |
cmp [hdpos], 0x80 |
jae .bios |
; hd_read_{dma,pio} use old ATA with 28 bit for sector number |
cmp eax, 0x10000000 |
jb @f |
inc [hd_error] |
jmp return_01 |
@@: |
; DMA read is permitted if [allow_dma_access]=1 or 2 |
cmp [allow_dma_access], 2 |
ja .nodma |
235,6 → 241,8 |
align 4 |
cache_write_pio: |
cmp dword[esi],0x10000000 |
jae .bad |
; call disable_ide_int |
call wait_for_hd_idle |
295,6 → 303,9 |
pop esi ecx |
ret |
.bad: |
inc [hd_error] |
ret |
save_hd_wait_timeout: |
686,6 → 697,9 |
write_cache_chain: |
cmp [hdpos], 0x80 |
jae bd_write_cache_chain |
mov eax,[cache_chain_ptr] |
cmp dword[eax],0x10000000 |
jae .bad |
push esi |
mov eax, IDE_descriptor_table |
mov edx,eax |
779,6 → 793,9 |
jnz hd_write_error_dma |
pop esi |
ret |
.bad: |
inc [hd_error] |
ret |
uglobal |
IDEContrRegsBaseAddr dw ? |
916,7 → 933,9 |
mov [ebx+v86_regs.eflags], 20200h |
mov esi, [sys_v86_machine] |
mov ecx, 0x502 |
push fs |
call v86_start |
pop fs |
and [bios_hdpos], 0 |
pop edi esi ecx ebx |
movzx edx, byte [OS_BASE + 512h] |
/kernel/branches/Kolibri-acpi/boot/bootcode.inc |
---|
91,6 → 91,7 |
inc si |
cmp si, 10 |
jb @b |
sayerr_badsect: |
mov si, badsect |
sayerr_plain: |
call printplain |
145,9 → 146,120 |
;========================================================================= |
include 'bootvesa.inc' ;Include source for boot vesa |
if defined extended_primary_loader |
include 'parsers.inc' |
end if |
start_of_code: |
if defined extended_primary_loader |
; save data from primary loader |
mov word [cs:bootcallback], si |
mov word [cs:bootcallback+2], ds |
push cs |
pop ds |
mov [bootdevice], ax |
mov [bootfs], bx |
; set up stack |
mov ax, 3000h |
mov ss, ax |
mov sp, 0EC00h |
; try to load configuration file |
mov ax, 1 |
mov di, config_file_struct |
call [bootcallback] |
cld |
push cs |
pop es |
; bx=0 - ok, bx=1 - part of file loaded, assume this is ok |
cmp bx, 1 |
ja .config_bad |
; configuration file was loaded, parse |
; if length is too big, use first 0FFFFh bytes |
test dx, dx |
jz @f |
mov ax, 0FFFFh |
@@: |
; ds:si will be pointer to current data, dx = limit |
xchg ax, dx |
push 4000h |
pop ds |
xor si, si |
.parse_loop: |
; skip spaces |
cmp si, dx |
jae .parse_done |
lodsb |
cmp al, ' ' |
jbe .parse_loop |
dec si |
; loop over all possible configuration values |
mov bx, config_file_variables |
.find_variant: |
; get length |
mov cx, [es:bx] |
; zero length = end of list |
jecxz .find_newline |
; skip over length |
inc bx |
inc bx |
mov di, bx |
; skip over string |
add bx, cx |
; test whether we have at least cx symbols left |
mov ax, cx |
add ax, si |
jc .next_variant1 |
cmp ax, dx |
jae .next_variant1 |
; save current position |
push si |
; compare strings |
repz cmpsb |
jnz .next_variant2 |
; strings are equal; look for "=" with possible spaces before and after |
@@: |
cmp si, dx |
jae .next_variant2 |
lodsb |
cmp al, ' ' |
jbe @b |
cmp al, '=' |
jnz .next_variant2 |
; ok, we found the true variant |
; ignore saved position on the stack |
pop ax |
; call the parser |
call word [es:bx] |
; line parsed, find next |
.find_newline: |
cmp si, dx |
jae .parse_done |
lodsb |
cmp al, 13 |
jz .parse_loop |
cmp al, 10 |
jz .parse_loop |
jmp .find_newline |
.next_variant2: |
; continue to the next variant, restoring current position |
pop si |
.next_variant1: |
; continue to the next variant |
; skip over the parser |
inc bx |
inc bx |
jmp .find_variant |
.parse_done: |
.config_bad: |
; set up segment registers |
push cs |
pop ds |
else |
cld |
; \begin{diamond}[02.12.2005] |
; if bootloader sets ax = 'KL', then ds:si points to loader block |
cmp ax, 'KL' |
175,6 → 287,7 |
pop ds |
push cs |
pop es |
end if |
; set videomode |
mov ax, 3 |
378,6 → 491,7 |
apm_end: |
_setcursor d80x25_top_num, 0 |
if ~ defined extended_primary_loader |
;CHECK current of code |
cmp [cfgmanager.loader_block], -1 |
jz noloaderblock |
387,6 → 501,7 |
jnz sayerr |
push 0 |
pop es |
end if |
noloaderblock: |
; DISPLAY VESA INFORMATION |
404,7 → 519,9 |
; d) preboot_device = from what boot? |
; determine default settings |
if ~ defined extended_primary_loader |
mov [.bSettingsChanged], 0 |
end if |
;.preboot_gr_end: |
mov di, preboot_device |
412,6 → 529,12 |
; set it to use this preloaded image |
cmp byte [di], 0 |
jnz .preboot_device_inited |
if defined extended_primary_loader |
inc byte [di] |
cmp byte [bootdevice], 'f' ; floppy? |
jz .preboot_device_inited |
inc byte [di] |
else |
cmp [.loader_block], -1 |
jz @f |
les bx, [.loader_block] |
422,6 → 545,7 |
@@: |
; otherwise, set [preboot_device] to 1 (default value - boot from floppy) |
mov byte [di], 1 |
end if |
.preboot_device_inited: |
; following 4 lines set variables to 1 if its current value is 0 |
cmp byte [di+preboot_dma-preboot_device], 1 |
466,7 → 590,11 |
mov si, preboot_device_msg |
call print |
mov al, [preboot_device] |
if defined extended_primary_loader |
and eax, 3 |
else |
and eax, 7 |
end if |
mov si, [preboot_device_msgs+eax*2] |
call printplain |
.show_remarks: |
553,12 → 681,18 |
_setcursor 15,0 |
mov si, bdev |
call print |
if defined extended_primary_loader |
mov bx, '12' |
else |
mov bx, '14' |
end if |
call getkey |
mov [preboot_device], al |
_setcursor 13,0 |
.d: |
if ~ defined extended_primary_loader |
mov [.bSettingsChanged], 1 |
end if |
call clear_vmodes_table ;clear vmodes_table |
jmp .printcfg |
.change_a: |
672,10 → 806,14 |
virtual at novesa |
.oldtimer dd ? |
.starttime dd ? |
if ~ defined extended_primary_loader |
.bSettingsChanged db ? |
end if |
.timer dd ? |
end virtual |
if ~ defined extended_primary_loader |
.loader_block dd -1 |
end if |
.gettime: |
mov ah, 0 |
int 1Ah |
692,7 → 830,11 |
pushad |
call .gettime |
sub eax, [.starttime] |
if defined extended_primary_loader |
sub ax, [preboot_timeout] |
else |
sub ax, 18*5 |
end if |
jae .timergo |
neg ax |
add ax, 18-1 |
748,6 → 890,7 |
mov si, loading_msg |
call print |
_setcursor 15,0 |
if ~ defined extended_primary_loader |
cmp [.bSettingsChanged], 0 |
jz .load |
cmp [.loader_block], -1 |
788,6 → 931,7 |
call printplain |
_setcursor 15,0 |
.load: |
end if |
; \end{diamond}[02.12.2005] |
; ASK GRAPHICS MODE |
816,7 → 960,7 |
mov [boot_dev], al |
; GET MEMORY MAP |
include 'detect/biosmem.inc' |
include '../detect/biosmem.inc' |
; READ DISKETTE TO MEMORY |
967,6 → 1111,7 |
mov dx, 0x3f2 |
mov al, 0 |
out dx, al |
sayerr_memmove: |
mov si, memmovefailed |
jmp sayerr_plain |
@@: |
1145,6 → 1290,40 |
mov al, 0 |
out dx, al |
if defined extended_primary_loader |
cmp [boot_dev], 1 |
jne no_sys_from_primary |
; load kolibri.img using callback from primary loader |
and word [movedesc + 24 + 2], 0 |
mov byte [movedesc + 24 + 4], 10h |
; read in blocks of 64K until file is fully loaded |
mov ax, 1 |
.repeat: |
mov di, image_file_struct |
call [bootcallback] |
push cs |
pop ds |
push cs |
pop es |
cmp bx, 1 |
ja sayerr_badsect |
push bx |
mov si, movedesc |
and word [si + 16 + 2], 0 |
mov byte [si + 16 + 4], 4 |
mov ah, 87h |
mov cx, 8000h |
int 15h |
pop bx |
test ah, ah |
jnz sayerr_memmove |
inc byte [si + 24 + 4] |
test bx, bx |
jz no_sys_from_primary |
mov ax, 2 |
jmp .repeat |
no_sys_from_primary: |
end if |
; SET GRAPHICS |
/kernel/branches/Kolibri-acpi/boot/booteng.inc |
---|
40,11 → 40,15 |
ask_bd db "Add disks visible by BIOS emulated in V86-mode? [1-yes, 2-no]: ",0 |
if defined extended_primary_loader |
bdev db "Load ramdisk from [1-floppy; 2-C:\kolibri.img (FAT32);" |
db 13,10,186," " |
db "3-use preloaded ram-image from kernel restart;" |
db 13,10,186," " |
db "4-create blank image]: ",0 |
else |
bdev db "Load ramdisk from [1-floppy; 2-kolibri.img]: ",0 |
end if |
probetext db 13,10,13,10,186," Use standart graphics mode? [1-yes, " |
db "2-probe bios (Vesa 3.0)]: ",0 |
;memokz256 db 13,10,186," RAM 256 Mb",0 |
88,14 → 92,22 |
;readonly_msg db " only for reading",13,10,0 |
vrrm_msg db " [c] Use VRR:",0 |
preboot_device_msg db " [d] Floppy image: ",0 |
if defined extended_primary_loader |
preboot_device_msgs dw 0,pdm1,pdm2,0 |
pdm1 db "real floppy",13,10,0 |
pdm2 db "C:\kolibri.img (FAT32)",13,10,0 |
else |
preboot_device_msgs dw 0,pdm1,pdm2,pdm3 |
pdm1 db "real floppy",13,10,0 |
pdm2 db "C:\kolibri.img (FAT32)",13,10,0 |
pdm3 db "use already loaded image",13,10,0 |
pdm4 db "create blank image",13,10,0 |
end if |
loading_msg db "Loading KolibriOS...",0 |
if ~ defined extended_primary_loader |
save_quest db "Remember current settings? [y/n]: ",0 |
loader_block_error db "Bootloader data invalid, I cannot continue. Stopped.",0 |
end if |
_st db 186,' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄ¿',13,10,0 |
_r1 db 186,' ³ 320x200 EGA/CGA 256 colors ³ ³',13,10,0 |
/kernel/branches/Kolibri-acpi/boot/bootet.inc |
---|
50,11 → 50,15 |
;mem_model db 13,10,186," Motherboard memory [1-16 Mb / 2-32 Mb / " |
; db "3-64Mb / 4-128 Mb / 5-256 Mb] ? ",0 |
;bootlog db 13,10,186," After bootlog display [1-continue/2-pause] ? ",0 |
if defined extended_primary_loader |
bdev db "Paigalda mäluketas [1-diskett; 2-kolibri.img]: ",0 |
else |
bdev db "Paigalda mäluketas [1-diskett; 2-C:\kolibri.img (FAT32);" |
db 13,10,186," " |
db "3-kasuta eellaaditud mäluketast kerneli restardist;" |
db 13,10,186," " |
db "4-loo tühi pilt]: ",0 |
end if |
probetext db 13,10,13,10,186," Kasuta standartset graafika reziimi? [1-jah, " |
db "2-leia biosist (Vesa 3.0)]: ",0 |
;memokz256 db 13,10,186," RAM 256 Mb",0 |
99,14 → 103,22 |
;readonly_msg db " ainult lugemiseks",13,10,0 |
vrrm_msg db " [c] Kasuta VRR:",0 |
preboot_device_msg db " [d] Disketi kujutis: ",0 |
if defined extended_primary_loader |
preboot_device_msgs dw 0,pdm1,pdm2,0 |
pdm1 db "reaalne diskett",13,10,0 |
pdm2 db "kolibri.img",13,10,0 |
else |
preboot_device_msgs dw 0,pdm1,pdm2,pdm3 |
pdm1 db "reaalne diskett",13,10,0 |
pdm2 db "C:\kolibri.img (FAT32)",13,10,0 |
pdm3 db "kasuta juba laaditud kujutist",13,10,0 |
pdm4 db "loo tühi pilt",13,10,0 |
end if |
loading_msg db "Laadin KolibriOS...",0 |
if ~ defined extended_primary_loader |
save_quest db "Jäta meelde praegused seaded? [y/n]: ",0 |
loader_block_error db "Alglaaduri andmed vigased, ei saa jätkata. Peatatud.",0 |
end if |
remark1 db "Default values were selected to match most of configurations, but not all.",0 |
remark2 db "If you have CRT-monitor, enable VRR in the item [c].",0 |
/kernel/branches/Kolibri-acpi/boot/bootge.inc |
---|
55,11 → 55,15 |
;mem_model db 13,10,186," Hauptspeicher [1-16 Mb / 2-32 Mb / " |
; db "3-64Mb / 4-128 Mb / 5-256 Mb] ? ",0 |
;bootlog db 13,10,186," After bootlog display [1-continue/2-pause] ? ",0 |
if defined extended_primary_loader |
bdev db "Lade die Ramdisk von [1-Diskette; 2-kolibri.img]: ",0 |
else |
bdev db "Lade die Ramdisk von [1-Diskette; 2-C:\kolibri.img (FAT32);" |
db 13,10,186," " |
db "3-benutze ein bereits geladenes Kernel image;" |
db 13,10,186," " |
db "4-create blank image]: ",0 |
end if |
probetext db 13,10,13,10,186," Nutze Standardgrafikmodi? [1-ja, " |
db "2-BIOS Test (Vesa 3.0)]: ",0 |
;memokz256 db 13,10,186," RAM 256 Mb",0 |
104,14 → 108,22 |
;readonly_msg db " fur Lesen",13,10,0 |
vrrm_msg db " [c] Nutze VRR:",0 |
preboot_device_msg db " [d] Diskettenimage: ",0 |
if defined extended_primary_loader |
preboot_device_msgs dw 0,pdm1,pdm2,0 |
pdm1 db "Echte Diskette",13,10,0 |
pdm2 db "kolibri.img",13,10,0 |
else |
preboot_device_msgs dw 0,pdm1,pdm2,pdm3 |
pdm1 db "Echte Diskette",13,10,0 |
pdm2 db "C:\kolibri.img (FAT32)",13,10,0 |
pdm3 db "Nutze bereits geladenes Image",13,10,0 |
pdm4 db "create blank image",13,10,0 |
end if |
loading_msg db "Lade KolibriOS...",0 |
if ~ defined extended_primary_loader |
save_quest db "Aktuelle Einstellungen speichern? [y/n]: ",0 |
loader_block_error db "Bootloader Daten ungueltig, Kann nicht fortfahren. Angehalten.",0 |
end if |
remark1 db "Default values were selected to match most of configurations, but not all.",0 |
remark2 db "If you have CRT-monitor, enable VRR in the item [c].",0 |
/kernel/branches/Kolibri-acpi/boot/bootru.inc |
---|
33,11 → 33,15 |
db 186," 1024*768>800*600 ¨ 800*600>640*480) [1-¤ , 2-¥â]: ",0 |
;ask_dma db "ᯮ«ì§®¢ âì DMA ¤«ï ¤®áâ㯠ª HDD? [1-¤ , 2-⮫쪮 ç⥨¥, 3-¥â]: ",0 |
ask_bd db "®¡ ¢¨âì ¤¨áª¨, ¢¨¤¨¬ë¥ ç¥à¥§ BIOS ¢ ०¨¬¥ V86? [1-¤ , 2-¥â]: ",0 |
if defined extended_primary_loader |
bdev db " £à㧨âì ®¡à § ¨§ [1-¤¨áª¥â ; 2-kolibri.img ¨§ ¯ ¯ª¨ § £à㧪¨]: ",0 |
else |
bdev db " £à㧨âì ®¡à § ¨§ [1-¤¨áª¥â ; 2-C:\kolibri.img (FAT32);" |
db 13,10,186," " |
db "3-¨á¯®«ì§®¢ âì 㦥 § £àã¦¥ë© ®¡à §;" |
db 13,10,186," " |
db "4-ᮧ¤ âì ç¨áâë© ®¡à §]: ",0 |
end if |
prnotfnd db "訡ª - ¨¤¥®à¥¦¨¬ ¥ ©¤¥.",0 |
not386 db "訡ª - ॡã¥âáï ¯à®æ¥áá®à 386+.",0 |
fatalsel db "訡ª - ë¡à ë© ¢¨¤¥®à¥¦¨¬ ¥ ¯®¤¤¥à¦¨¢ ¥âáï.",0 |
67,14 → 71,22 |
readonly_msg db " ⮫쪮 ç⥨¥",13,10,0 |
vrrm_msg db " [c] ᯮ«ì§®¢ ¨¥ VRR:",0 |
preboot_device_msg db " [d] ¡à § ¤¨áª¥âë: ",0 |
if defined extended_primary_loader |
preboot_device_msgs dw 0,pdm1,pdm2,0 |
pdm1 db " áâ®ïé ï ¤¨áª¥â ",13,10,0 |
pdm2 db "kolibri.img ¨§ ¯ ¯ª¨ § £à㧪¨",13,10,0 |
else |
preboot_device_msgs dw 0,pdm1,pdm2,pdm3,pdm4 |
pdm1 db " áâ®ïé ï ¤¨áª¥â ",13,10,0 |
pdm2 db "C:\kolibri.img (FAT32)",13,10,0 |
pdm3 db "¨á¯®«ì§®¢ âì 㦥 § £àã¦¥ë© ®¡à §",13,10,0 |
pdm4 db "ᮧ¤ âì ç¨áâë© ®¡à §",13,10,0 |
end if |
loading_msg db "¤ñâ § £à㧪 KolibriOS...",0 |
if ~ defined extended_primary_loader ; saving not supported in this case |
save_quest db " ¯®¬¨âì ⥪ã騥 áâனª¨? [y/n]: ",0 |
loader_block_error db "訡ª ¢ ¤ ëå ç «ì®£® § £àã§ç¨ª , ¯à®¤®«¦¥¨¥ ¥¢®§¬®¦®.",0 |
end if |
_st db 186,' ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄ¿ ',13,10,0 |
/kernel/branches/Kolibri-acpi/boot/bootvesa.inc |
---|
314,7 → 314,11 |
cmp word [es:si+6],0x13 |
je .no_vesa_0x13 |
if defined extended_primary_loader |
mov di,config_file_variables |
else |
mov di,loader_block_error |
end if |
movzx eax,word[es:si+0] |
mov ecx,10 |
call int2strnz |
327,7 → 331,11 |
movzx eax,word[es:si+8] |
call int2strnz |
mov dword[es:di],0x00000d0a |
if defined extended_primary_loader |
mov si,config_file_variables |
else |
mov si,loader_block_error |
end if |
push ds |
push es |
pop ds |
344,9 → 352,34 |
ret |
;----------------------------------------------------------------------------- |
check_first_parm: |
if defined extended_primary_loader |
mov cx, [number_vm] |
jcxz .novbemode |
mov si, modes_table |
.findvbemode: |
cmp [es:si+6], cx |
jnz @f |
cmp word [es:si+8],32 |
je .ok_found_mode |
cmp word [es:si+8],24 |
je .ok_found_mode |
@@: add si,size_of_step |
cmp word [es:si],-1 |
jnz .findvbemode |
.novbemode: |
mov ax, [x_save] |
test ax, ax |
jz .zerro |
mov bx, [y_save] |
mov si, modes_table |
call .loops |
test ax, ax |
jz .ok_found_mode |
else |
mov si,word [preboot_graph] |
test si,si |
jnz .no_zero ;if no zero |
end if |
.zerro: |
; mov ax,modes_table |
; mov word [cursor_pos],ax |
374,6 → 407,7 |
jz .ok_found_mode |
mov si,modes_table |
if ~ defined extended_primary_loader |
jmp .ok_found_mode |
394,6 → 428,7 |
; jb .zerro ;check on correct if bellow |
; cmp ax,word [end_cursor] |
; ja .zerro ;check on correct if anymore |
end if |
.ok_found_mode: |
mov word [home_cursor],si |
/kernel/branches/Kolibri-acpi/boot/parsers.inc |
---|
0,0 → 1,170 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2011. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 1962 $ |
; All parsers are called with ds:si -> value of the variable, |
; possibly with spaces before, and dx = limit of config file. |
; Three subroutines parse_char, parse_number and parse_bool set CF |
; if something has failed, otherwise return the value in al/ax. |
parse_timeout: |
; timeout is a number not greater than 9 |
call parse_number |
jc .nothing |
cmp ax, 9 |
jbe @f |
mov ax, 9 |
@@: |
imul ax, 18 |
mov [es:preboot_timeout], ax |
.nothing: |
ret |
parse_resolution: |
; resolution is <width>*<height>, 'x' can be used instead of '*' |
; parse width |
call parse_number |
jc .nothing |
; save width |
xchg ax, bx |
; test for 'x' or '*' |
call parse_char |
cmp al, 'x' |
jz @f |
cmp al, '*' |
jnz .nothing |
@@: |
; parse height |
call parse_number |
jc .nothing |
; write width and height |
mov [es:x_save], bx |
mov [es:y_save], ax |
.nothing: |
ret |
parse_vbemode: |
; vbemode is a number |
call parse_number |
jc .nothing |
mov [es:number_vm], ax |
.nothing: |
ret |
parse_vrr: |
; vrr is a boolean setting |
call parse_bool |
jc .nothing |
; convert 0 to 2, 1 to 1 |
inc ax |
xor al, 3 |
mov [es:preboot_vrrm], al |
.nothing: |
ret |
parse_biosdisks: |
; using biosdisks is a boolean setting |
call parse_bool |
jc .nothing |
; convert 0 to 2, 1 to 1 |
inc ax |
xor al, 3 |
mov [es:preboot_biosdisk], al |
.nothing: |
ret |
parse_imgfrom: |
; boot device (1-floppy 2-kolibri.img using primary loader) |
call parse_number |
jc .nothing |
cmp al, 1 |
jb .nothing |
cmp al, 2 |
ja .nothing |
mov [es:preboot_device], al |
.nothing: |
ret |
parse_char: |
; skip spaces and return the next character or CF if EOF. |
cmp si, dx |
jae .eof |
lodsb |
cmp al, ' ' |
jbe parse_char |
ret |
.eof: |
stc |
ret |
parse_number: |
; initialize high part of ax to zero |
xor ax, ax |
; skip spaces |
call parse_char |
jc .bad |
; al should be a digit |
sub al, '0' |
cmp al, 9 |
ja .bad |
; accumulate the value in cx |
xchg cx, ax |
@@: |
cmp si, dx |
jae .eof |
lodsb |
sub al, '0' |
cmp al, 9 |
ja .end |
imul cx, 10 |
add cx, ax |
jmp @b |
; if the end is caused by non-digit, unwind the last character |
.end: |
dec si |
.eof: |
xchg cx, ax |
clc |
ret |
.bad: |
stc |
ret |
parse_bool: |
; skip spaces |
call parse_char |
jc .bad |
; Boolean false can be represented as 0=no=off, |
; boolean true can be represented as 1=yes=on. |
cmp al, '0' |
jz .false |
cmp al, '1' |
jz .true |
mov ah, al |
cmp si, dx |
jae .bad |
lodsb |
cmp ax, 'n'*256 + 'o' |
jz .false |
cmp ax, 'o'*256 + 'f' |
jz .false |
cmp ax, 'y'*256 + 'e' |
jz .true |
cmp ax, 'o'*256 + 'n' |
jz .true |
.bad: |
stc |
ret |
.true: |
xor ax, ax |
inc ax |
ret |
.false: |
xor ax, ax |
ret |
/kernel/branches/Kolibri-acpi/boot/preboot.inc |
---|
30,6 → 30,9 |
;!!!! 0 - autodetect !!!! |
preboot_blogesc = 0 ; start immediately after bootlog |
preboot_biosdisk db 0 ; use V86 to access disks through BIOS (1-yes, 2-no) |
if defined extended_primary_loader |
preboot_timeout dw 5*18 ; timeout in 1/18th of second for config settings screen |
end if |
if $>0x200 |
ERROR: prebooting parameters must fit in first sector!!! |
/kernel/branches/Kolibri-acpi/boot/shutdown.inc |
---|
98,8 → 98,10 |
jmp $ |
no_apm_off: |
if ~ defined extended_primary_loader ; kernel restarting is not supported |
dec ax ; 3 = reboot |
jnz restart_kernel ; 4 = restart kernel |
end if |
push 0x40 |
pop ds |
mov word[0x0072],0x1234 |
150,6 → 152,7 |
;!!!!!!!!!!!!!!!!!!!!!!!! |
ret |
if ~ defined extended_primary_loader |
restart_kernel: |
mov ax,0x0003 ; set text mode for screen |
205,5 → 208,5 |
mov si, kernel_restart_bootblock |
mov ax, 'KL' |
jmp 0x1000:0000 |
end if |
/kernel/branches/Kolibri-acpi/bootloader/boot_fat12.asm |
---|
194,17 → 194,17 |
mov ax,0e2eh ; ah=0eh (teletype), al='.' |
xor bh,bh |
int 10h |
pop bx |
writesec: |
; convert cluster number to sector number |
mov ax,bp ; data cluster to read |
sub ax,2 |
xor bx,bx |
mov bl,byte [BPB_SecPerClus+boot_program] |
mul bx |
xor dx,dx |
mov dl,byte [BPB_SecPerClus+boot_program] |
mul dx |
add ax,word [data_start+boot_program] |
pop bx |
writesec: |
call conv_abs_to_THS ; convert abs sector (AX) to BIOS T:H:S (track:head:sector) |
patchhere: |
mov ah,2 ; ah=2 (read) |
267,7 → 267,7 |
push cs |
pop ds |
mov byte [patchhere+1+boot_program], 3 ; change ah=2 to ah=3 |
mov ax,[cluster1st+boot_program] |
mov bp,[cluster1st+boot_program] |
push 1000h |
pop es |
xor bx,bx |
/kernel/branches/Kolibri-acpi/bus/pci/pci32.inc |
---|
569,9 → 569,9 |
cmp ebp, 1 ; PCI_FUNCTION_ID |
jnz .not_PCI_BIOS_PRESENT |
mov edx, 'PCI ' |
mov al, [OS_BASE+0x2F0000 + 0x9020] |
mov bx, [OS_BASE+0x2F0000 + 0x9022] |
mov cl, [OS_BASE+0x2F0000 + 0x9021] |
mov al, [BOOT_VAR + 0x9020] |
mov bx, [BOOT_VAR + 0x9022] |
mov cl, [BOOT_VAR + 0x9021] |
xor ah, ah |
jmp .return_abcd |
/kernel/branches/Kolibri-acpi/const.inc |
---|
203,6 → 203,9 |
WIN_POS equ (OS_BASE+0x000C400) |
FDD_BUFF equ (OS_BASE+0x000D000) |
;unused ? only one reference |
ENABLE_TASKSWITCH equ (OS_BASE+0x000E000) |
PUTPIXEL equ (OS_BASE+0x000E020) |
GETPIXEL equ (OS_BASE+0x000E024) |
283,6 → 286,7 |
RAMDISK_FAT equ (OS_BASE+0x0280000) |
FLOPPY_FAT equ (OS_BASE+0x0282000) |
CLEAN_ZONE equ 0x284000 |
IDE_DMA equ 0x284000 |
BgrAuxTable equ (OS_BASE+0x0298000) |
308,8 → 312,10 |
BgrDataWidth equ (OS_BASE+0x033BFF8) |
BgrDataHeight equ (OS_BASE+0x033BFFC) |
sys_pgmap equ (OS_BASE+0x033C000) |
BOOT_VAR equ (OS_BASE+0x0340000) |
sys_pgmap equ (OS_BASE+0x0350000) |
UPPER_KERNEL_PAGES equ (OS_BASE+0x0400000) |
virtual at (OS_BASE+0x05FFF80) |
/kernel/branches/Kolibri-acpi/core/apic.inc |
---|
8,7 → 8,7 |
IRQ_RESERVE = 24 ; 16 or 24 |
iglobal |
IRQ_COUNT dd 16 |
IRQ_COUNT dd 24 |
endg |
uglobal |
45,8 → 45,8 |
APIC_init: |
mov dword[APIC], 0 |
; jmp .no_apic ; NO APIC |
bt [cpu_caps], CAPS_APIC |
jnc .no_apic |
; bt [cpu_caps], CAPS_APIC |
; jnc .no_apic |
; Check for MP table |
;..... |
96,6 → 96,12 |
call LAPIC_init |
mov dword[APIC], 0xffffffff |
mov al, 0x70 |
out 0x22, al |
mov al, 1 |
out 0x23, al |
; mov dword[irq_type_to_set], IRQ_TYPE_APIC |
.no_apic: |
ret |
/kernel/branches/Kolibri-acpi/core/dll.inc |
---|
17,6 → 17,9 |
align 4 |
proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword |
pushfd |
cli |
push ebx |
mov ebx, [irq] ;irq num |
46,10 → 49,12 |
stdcall enable_irq, [irq] |
pop ebx |
mov eax, 1 |
popfd |
ret |
.err: |
pop ebx |
xor eax, eax |
popfd |
ret |
endp |
100,7 → 105,7 |
jmp .main |
} |
irq_serv_h 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12 |
irq_serv_h 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15 |
; I don`t known how to use IRQ_RESERVE |
if IRQ_RESERVE > 16 |
118,6 → 123,26 |
cmp [v86_irqhooks+eax*8], 0 |
jnz v86_irq |
cmp al, 6 |
jnz @f |
push eax |
call [fdc_irq_func] |
pop eax |
@@: |
cmp al, 14 |
jnz @f |
push eax |
call [irq14_func] |
pop eax |
@@: |
cmp al, 15 |
jnz @f |
push eax |
call [irq15_func] |
pop eax |
@@: |
mov ebx, [irq_tab+eax*4] |
test ebx, ebx |
jz .exit |
/kernel/branches/Kolibri-acpi/core/exports.inc |
---|
75,6 → 75,9 |
szSleep db 'Sleep',0 |
szGetTimerTicks db 'GetTimerTicks',0 |
szGetDisplay db 'GetDisplay',0 |
szSetScreen db 'SetScreen',0 |
szStrncat db 'strncat',0 |
szStrncpy db 'strncpy',0 |
szstrncmp db 'strncmp',0 |
147,6 → 150,9 |
dd szSleep , delay_ms |
dd szGetTimerTicks , get_timer_ticks |
dd szGetDisplay , get_display |
dd szSetScreen , set_screen |
dd szStrncat , strncat |
dd szStrncpy , strncpy |
dd szstrncmp , strncmp |
/kernel/branches/Kolibri-acpi/core/memory.inc |
---|
1426,7 → 1426,7 |
mov ebx, [size] |
dec ebx |
mov eax, 0xFFFFFFFF |
mov edx, 0x0000000F |
mov edx, 0x00000000 |
sub eax, ebx |
sbb edx, 0 |
or eax, 0x800 |
/kernel/branches/Kolibri-acpi/core/peload.inc |
---|
322,8 → 322,10 |
unmap_pages, 'UnmapPages', \ ; eax, ecx |
sys_msg_board_str, 'SysMsgBoardStr', \ |
get_timer_ticks, 'GetTimerTicks', \ |
get_stack_base, 'GetStackBase', \ |
delay_hs, 'Delay', \ ; ebx |
set_mouse_data, 'SetMouseData' |
set_mouse_data, 'SetMouseData', \ ; |
set_keyboard_data, 'SetKeyboardData' ; gcc fastcall |
/kernel/branches/Kolibri-acpi/core/sys32.inc |
---|
46,11 → 46,9 |
else |
dd p_irq3, p_irq4 ;??? íåñòûêîâêà |
end if |
dd irq_serv.irq_5, p_irq6, irq_serv.irq_7 |
dd irq_serv.irq_5, irq_serv.irq_6, irq_serv.irq_7 |
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10 |
dd irq_serv.irq_11, irq_serv.irq_12 |
dd irq13 |
dd p_irq14,p_irq15 |
dd irq_serv.irq_11, irq_serv.irq_12, irqD, irq_serv.irq_14, irq_serv.irq_15 |
; I don`t known how to use IRQ_RESERVE |
if IRQ_RESERVE > 16 |
dd irq_serv.irq_16 |
208,6 → 206,14 |
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= |
; bl - error vector |
show_error_parameters: |
cmp bl, 0x06 |
jnz .no_ud |
push ebx |
mov ebx, ud_user_message |
mov ebp, notifyapp |
call fs_execute_from_sysdir_param |
pop ebx |
.no_ud: |
mov edx,[TASK_BASE] ;not scratched below |
DEBUGF 1, "K : Process - forced terminate PID: %x\n", [edx+TASKDATA.pid] |
cmp bl, 0x08 |
/kernel/branches/Kolibri-acpi/core/syscall.inc |
---|
193,6 → 193,7 |
dd file_system_lfn ; 70-Common file system interface, version 2 |
dd syscall_window_settings ; 71-Window settings |
dd sys_sendwindowmsg ; 72-Send window message |
dd blit_32 ; blitter; |
times 255 - ( ($-servetable2) /4 ) dd undefined_syscall |
dd sys_end ; -1-end application |
/kernel/branches/Kolibri-acpi/core/taskman.inc |
---|
48,6 → 48,7 |
fs_execute_from_sysdir: |
xor ebx, ebx |
fs_execute_from_sysdir_param: |
xor edx, edx |
mov esi, sysdir_path |
1166,4 → 1167,13 |
ret |
endp |
align 4 |
get_stack_base: |
mov eax,[current_slot] |
mov eax,[eax+APPDATA.pl0_stack] |
ret |
include "debug.inc" |
/kernel/branches/Kolibri-acpi/data16.inc |
---|
22,10 → 22,12 |
dd 0 |
dw 0 |
if ~ defined extended_primary_loader ; restart from memory is not supported in extended primary loader cfg |
kernel_restart_bootblock: |
db 1 ; version |
dw 1 ; floppy image is in memory |
dd 0 ; cannot save parameters |
end if |
; table for move to extended memory (int 15h, ah=87h) |
align 8 |
53,3 → 55,36 |
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0 |
if defined extended_primary_loader |
; look in PrimaryLoader.txt for the description |
bootdevice dw 0 ; ax from primary loader |
bootfs dw 0 ; bx from primary loader |
bootcallback dd 0 ; ds:si from primary loader |
; data for configuration file loading, look in PrimaryLoader.txt |
config_file_struct: |
dw 0, 4000h ; load to 4000:0000 |
dw 16 ; read no more than 16*4K = 64K |
db 'config.ini',0 |
; data for configuration file parsing |
macro config_variable string,parser |
{ |
local len |
len dw 0 |
db string |
store word $ - len - 2 at len |
dw parser |
} |
config_file_variables: |
config_variable 'timeout', parse_timeout |
config_variable 'resolution', parse_resolution |
config_variable 'vbemode', parse_vbemode |
config_variable 'vrr', parse_vrr |
config_variable 'biosdisks', parse_biosdisks |
config_variable 'imgfrom', parse_imgfrom |
dw 0 |
; data for image file loading, look in PrimaryLoader.txt |
image_file_struct: |
dw 0, 4000h ; load to 4000:0000 |
dw 16 ; read no more than 16*4K = 64K |
db 'kolibri.img',0 |
end if |
/kernel/branches/Kolibri-acpi/data32.inc |
---|
98,6 → 98,12 |
read_firstapp db '/sys/' |
firstapp db 'LAUNCHER',0 |
notifyapp db '@notify',0 |
if lang eq ru |
ud_user_message db '訡ª : ¥¯®¤¤¥à¦¨¢ ¥¬ ï ¨áâàãªæ¨ï ¯à®æ¥áá®à ',0 |
else |
ud_user_message db 'Error: unsupported processor instruction',0 |
end if |
char db '/sys/FONTS/CHAR.MT',0 |
char2 db '/sys/FONTS/CHAR2.MT',0 |
/kernel/branches/Kolibri-acpi/docs/sysfuncr.txt |
---|
1,4 → 1,4 |
Kolibri 0.7.5.0+ |
Kolibri 0.7.7.0 |
®¬¥à äãªæ¨¨ ¯®¬¥é ¥âáï ¢ ॣ¨áâà eax. |
맮¢ á¨á⥬®© äãªæ¨¨ ®áãé¥á⢫ï¥âáï ª®¬ ¤®© "int 0x40". |
354,6 → 354,7 |
* ¡¨â 0 (¬ ᪠1): ®ª® ¬ ªá¨¬¨§¨à®¢ ® |
* ¡¨â 1 (¬ ᪠2): ®ª® ¬¨¨¬¨§¨à®¢ ® ¢ ¯ ¥«ì § ¤ ç |
* ¡¨â 2 (¬ ᪠4): ®ª® á¢ñàãâ® ¢ § £®«®¢®ª |
* +71 = +0x47: dword: ¬ ᪠ᮡë⨩ |
¬¥ç ¨ï: |
* «®âë 㬥àãîâáï á 1. |
* ®§¢à é ¥¬®¥ § 票¥ ¥ ¥áâì ®¡é¥¥ ç¨á«® ¯®â®ª®¢, ¯®áª®«ìªã |
383,7 → 384,7 |
ᮡá⢥® à ¡®âã, ¨ ¢à¥¬¥¨ ¯à®áâ®ï ¢ ®¦¨¤ ¨¨ ¯à¥àë¢ ¨ï |
(ª®â®à®¥ ¬®¦® ¯®«ãç¨âì ¢ë§®¢®¬ ¯®¤äãªæ¨¨ 4 äãªæ¨¨ 18). |
* ç¨ ï á® á«®â 2, à §¬¥é îâáï ®¡ëçë¥ ¯à¨«®¦¥¨ï. |
* ¡ëçë¥ ¯à¨«®¦¥¨ï à §¬¥é îâáï ¢ ¯ ¬ï⨠¯® ¤à¥áã 0x0 |
* ¡ëçë¥ ¯à¨«®¦¥¨ï à §¬¥é îâáï ¢ ¯ ¬ï⨠¯® ¤à¥áã 0 |
(ª®áâ â ï¤à std_application_base_address). |
«®¦¥¨ï ¥ ¯à®¨á室¨â, ¯®áª®«ìªã ã ª ¦¤®£® ¯à®æ¥áá ᢮ï |
â ¡«¨æ áâà ¨æ. |
847,12 → 848,12 |
* äãªæ¨ï ¥ ¢®§¢à é ¥â § 票ï |
âàãªâãà ¡ãä¥à : |
db a,b,c,d ¤«ï ¢¥àᨨ a.b.c.d |
db UID_xxx: ®¤® ¨§ UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 |
db 0: § १¥à¢¨à®¢ ® |
dd REV - ®¬¥à svn-ॢ¨§¨¨ ï¤à |
«ï ï¤à Kolibri 0.7.1.0: |
db 0,7,1,0 |
db 2 |
dd 638 |
«ï ï¤à Kolibri 0.7.7.0+: |
db 0,7,7,0 |
db 0 |
dd 1675 |
====================================================================== |
====================== ãªæ¨ï 18, ¯®¤äãªæ¨ï 14 ===================== |
1677,64 → 1678,16 |
* ecx = 㪠§ â¥«ì ¡ãä¥à |
* edx = à §¬¥à ¡ãä¥à |
®§¢à é ¥¬®¥ § 票¥: |
* eax = - 1 ®é¨¡ª , ¯ ¯ª ⥪ã饣® ¯®â®ª ¨¬¥¥â ¤«¨ã ¡®«¥¥ 祬 4096 ᨬ¢®«®¢. |
* eax = ¤«¨ ¨¬¥¨ ⥪ã饩 ¯ ¯ª¨ (¢ª«îç ï § ¢¥àè î騩 0) |
¬¥ç ¨ï: |
* ᫨ à §¬¥à ¡ãä¥à ¥¤®áâ â®ç® ¤«ï ª®¯¨à®¢ ¨ï ¢á¥£® ¨¬¥¨, |
ª®¯¨àãîâáï ⮫쪮 ¯¥à¢ë¥ (edx-1) ¡ ©â |
¨ ¢ ª®æ¥ áâ ¢¨âáï § ¢¥àè î騩 0. |
ª®¯¨àãîâáï ⮫쪮 ¯¥à¢ë¥ (edx-1) ¡ ©â ¨ ¢ ª®æ¥ áâ ¢¨âáï |
§ ¢¥àè î騩 0. |
* ® 㬮«ç ¨î, ⥪ãé ï ¯ ¯ª ¤«ï ¯®â®ª - "/rd/1". |
* ਠᮧ¤ ¨¨ ¯à®æ¥áá /¯®â®ª ⥪ãé ï ¯ ¯ª á«¥¤ã¥âáï ®â |
த¨â¥«ï. |
====================================================================== |
================ ãªæ¨ï 32 - 㤠«¨âì ä ©« á à ¬¤¨áª . =============== |
====================================================================== |
à ¬¥âàë: |
* eax = 32 - ®¬¥à äãªæ¨¨ |
* ebx = 㪠§ â¥«ì ¨¬ï ä ©« |
®§¢à é ¥¬®¥ § 票¥: |
* eax = 0 - ãᯥè®; ¨ ç¥ ª®¤ ®è¨¡ª¨ ä ©«®¢®© á¨á⥬ë |
¬¥ç ¨ï: |
* â äãªæ¨ï ãáâ ५ ; äãªæ¨ï 58 ¯®§¢®«ï¥â ¢ë¯®«ïâì |
⥠¦¥ ¤¥©á⢨ï á à áè¨à¥ë¬¨ ¢®§¬®¦®áâﬨ. |
* ¥ªãé ï ॠ«¨§ æ¨ï ¢®§¢à é ¥â ⮫쪮 § 票ï 0(ãᯥå) ¨ |
5(ä ©« ¥ ©¤¥). |
* ¬ï ä ©« ¤®«¦® ¡ëâì «¨¡® ¢ ä®à¬ ⥠8+3 ᨬ¢®«®¢ (¯¥à¢ë¥ |
8 ᨬ¢®«®¢ - ᮡá⢥® ¨¬ï, ¯®á«¥¤¨¥ 3 - à áè¨à¥¨¥, |
ª®à®âª¨¥ ¨¬¥ ¨ à áè¨à¥¨ï ¤®¯®«ïîâáï ¯à®¡¥« ¬¨), |
«¨¡® ¢ ä®à¬ ⥠8.3 ᨬ¢®«®¢ "FILE.EXT"/"FILE.EX " |
(¨¬ï ¥ ¡®«¥¥ 8 ᨬ¢®«®¢, â®çª , à áè¨à¥¨¥ 3 ᨬ¢®« , |
¤®¯®«¥®¥ ¯à¨ ¥®¡å®¤¨¬®á⨠¯à®¡¥« ¬¨). |
¬ï ä ©« ¤®«¦® ¡ëâì § ¯¨á ® § £« ¢ë¬¨ ¡ãª¢ ¬¨. |
¢¥àè î騩 ᨬ¢®« á ª®¤®¬ 0 ¥ 㦥 (¥ ASCIIZ-áâப ). |
* â äãªæ¨ï ¥ ¯®¤¤¥à¦¨¢ ¥â ¯ ¯®ª à ¬¤¨áª¥. |
====================================================================== |
=============== ãªæ¨ï 33 - § ¯¨á âì ä ©« à ¬¤¨áª. =============== |
====================================================================== |
à ¬¥âàë: |
* eax = 33 - ®¬¥à äãªæ¨¨ |
* ebx = 㪠§ â¥«ì ¨¬ï ä ©« |
* ecx = 㪠§ â¥«ì ¤ ë¥ ¤«ï § ¯¨á¨ |
* edx = ç¨á«® ¡ ©â ¤«ï § ¯¨á¨ |
* á«¥¤ã¥â ãáâ ¢«¨¢ âì esi=0 |
®§¢à é ¥¬®¥ § 票¥: |
* eax = 0 - ãᯥè®, ¨ ç¥ ª®¤ ®è¨¡ª¨ ä ©«®¢®© á¨á⥬ë |
¬¥ç ¨ï: |
* â äãªæ¨ï ãáâ ५ ; äãªæ¨ï 70 ¯®§¢®«ï¥â ¢ë¯®«ïâì |
⥠¦¥ ¤¥©á⢨ï á à áè¨à¥ë¬¨ ¢®§¬®¦®áâﬨ. |
* ᫨ 㪠§ âì ¥ã«¥¢®¥ § 票¥ ¢ esi ¨ à ¬¤¨áª¥ 㦥 ¥áâì |
㪠§ ë© ä ©«, â® ¡ã¤¥â ᮧ¤ ¥éñ ®¤¨ ä ©« á ⥬ ¦¥ ¨¬¥¥¬. |
* ¯à®â¨¢®¬ á«ãç ¥ ä ©« ¯¥à¥§ ¯¨áë¢ ¥âáï. |
* ¬ï ä ©« ¤®«¦® ¡ëâì «¨¡® ¢ ä®à¬ ⥠8+3 ᨬ¢®«®¢ |
(¯¥à¢ë¥ 8 ᨬ¢®«®¢ - ᮡá⢥® ¨¬ï, ¯®á«¥¤¨¥ 3 - à áè¨à¥¨¥, |
ª®à®âª¨¥ ¨¬¥ ¨ à áè¨à¥¨ï ¤®¯®«ïîâáï ¯à®¡¥« ¬¨), |
«¨¡® ¢ ä®à¬ ⥠8.3 ᨬ¢®«®¢ "FILE.EXT"/"FILE.EX " |
(¨¬ï ¥ ¡®«¥¥ 8 ᨬ¢®«®¢, â®çª , à áè¨à¥¨¥ 3 ᨬ¢®« , |
¤®¯®«¥®¥ ¯à¨ ¥®¡å®¤¨¬®á⨠¯à®¡¥« ¬¨). |
¬ï ä ©« ¤®«¦® ¡ëâì § ¯¨á ® § £« ¢ë¬¨ ¡ãª¢ ¬¨. |
¢¥àè î騩 ᨬ¢®« á ª®¤®¬ 0 ¥ 㦥 (¥ ASCIIZ-áâப ). |
* â äãªæ¨ï ¥ ¯®¤¤¥à¦¨¢ ¥â ¯ ¯®ª à ¬¤¨áª¥. |
====================================================================== |
============ ãªæ¨ï 35 - ¯à®ç¨â âì 梥â â®çª¨ íªà ¥. ============ |
====================================================================== |
à ¬¥âàë: |
1858,7 → 1811,7 |
------------------ ®¤äãªæ¨ï 7 - ¤ ë¥ ¯à®ªàã⪨ ------------------- |
à ¬¥âàë: |
* eax = 37 - ®¬¥à äãªæ¨¨ |
* ebx = 6 - ®¬¥à ¯®¤äãªæ¨¨ |
* ebx = 7 - ®¬¥à ¯®¤äãªæ¨¨ |
®§¢à é ¥¬®¥ § 票¥: |
* eax = [horizontal offset]*65536 + [vertical offset] |
¬¥ç ¨ï: |
3290,63 → 3243,6 |
ᯨ᮪ ¢â®àëå ¤®«¦¥ ¡ëâì 㪠§ ¢ ¤®ªã¬¥â 樨 ¯® ãáâனáâ¢ã. |
====================================================================== |
====================== ãªæ¨ï 62, ¯®¤äãªæ¨ï 11 ===================== |
== ¨æ¨ «¨§¨à®¢ âì ¯®«ì§®¢ ⥫ì᪨© / á ®â®¡à ¦¥¨¥¬ ¯ ¬ïâì == |
====================================================================== |
à ¬¥âàë: |
* eax = 62 - ®¬¥à äãªæ¨¨ |
* bl = 11 - ®¬¥à ¯®¤äãªæ¨¨ |
* cx = ¤à¥á PCI-ãáâனá⢠|
®§¢à é ¥¬®¥ § 票¥: |
* eax = -1 - ¤®áâ㯠ª PCI § ¯à¥éñ; |
* eax = -2 - ¤®áâ㯠ª MMIO-¡«®ª ¬ ãáâனá⢠¥ à §à¥èñ; |
* eax = -3 - ®è¨¡ª ««®ª 樨 ¯®«ì§®¢ ⥫ì᪮© ¤¨. ¯ ¬ïâ¨; ¨ ç¥ |
* eax = à §¬¥à ¤®áâ㯮© ¤¨ ¬¨ç¥áª®© ¯ ¬ïâ¨. |
¬¥ç ¨ï: |
* ।¢ à¨â¥«ì® ¤®«¦¥ ¡ëâì à §à¥èñ ¨§ª®ã஢¥¢ë© ¤®áâ㯠ª PCI |
¤«ï ¯à¨«®¦¥¨© ¯®¤äãªæ¨¥© 12 äãªæ¨¨ 21. |
* ¤à¥á PCI-ãáâனá⢠¤®«¦¥ ᮢ¯ ¤ âì á á¨á⥬®© ¯¥à¥¬¥®© |
mmio_pci_addr |
====================================================================== |
====================== ãªæ¨ï 62, ¯®¤äãªæ¨ï 12 ===================== |
== 뤥«¨âì ¤¨ ¯ §® «¨¥©ëå ¤à¥á®¢ ¤«ï ¯®«ì§®¢ ⥫ì᪮£® MMIO == |
====================================================================== |
à ¬¥âàë: |
* eax = 62 - ®¬¥à äãªæ¨¨ |
* bl = 12 - ®¬¥à ¯®¤äãªæ¨¨ |
* bh = ®¬¥à BAR-ॣ¨áâà ¢ ª®ä¨£ãà 樮®© §®¥ PCI |
* ecx = à §¬¥à MMIO-¡«®ª (¢ ¡ ©â å) |
* edx = ᬥ饨¥ ®â®á¨â¥«ì® ç « MMIO-¡«®ª (¢ 4K-áâà ¨æ å!) |
®§¢à é ¥¬®¥ § 票¥: |
* eax = -1 - ¤®áâ㯠ª PCI § ¯à¥éñ; |
* eax = -2 - ¥¢¥àë© ®¬¥à BAR-ॣ¨áâà ; |
* eax = -3 - BAR ¥ ᮤ¥à¦¨â ¤à¥á IO; |
* eax = -4 - BAR ¤à¥áã¥â ¯®àâë IO; |
* eax = -5 - ®è¨¡ª ««®ª 樨; ¨ ç¥ |
* eax = ç «ìë© ¤à¥á MMIO ¢ ¤à¥á®¬ ¯à®áâà á⢥ ¯à¨«®¦¥¨ï. |
¬¥ç ¨ï: |
* ।¢ à¨â¥«ì® ¤®«¦¥ ¡ëâì à §à¥èñ ¨§ª®ã஢¥¢ë© ¤®áâ㯠ª PCI |
¤«ï ¯à¨«®¦¥¨© ¯®¤äãªæ¨¥© 12 äãªæ¨¨ 21. |
* ¤à¥á PCI-ãáâனá⢠§ ¤ ¥âáï á¨á⥬®© ¯¥à¥¬¥®© mmio_pci_addr. |
* ।®áâ ¢«¥ë© ¤¨ ¯ §® «¨¥©ëå ¤à¥á®¢ ¤®«¦¥ ®á¢®¡®¦¤ âìáï |
¯®á।á⢮¬ ¢ë§®¢ äãªæ¨¨ 62:13 |
====================================================================== |
====================== ãªæ¨ï 62, ¯®¤äãªæ¨ï 13 ===================== |
== ᢮¡®¤¨âì ¤¨ ¯ §® «¨¥©ëå ¤à¥á®¢ ¯®«ì§®¢ ⥫ì᪮£® MMIO == |
====================================================================== |
à ¬¥âàë: |
* eax = 62 - ®¬¥à äãªæ¨¨ |
* bl = 12 - ®¬¥à ¯®¤äãªæ¨¨ |
* ecx = ç «ìë© ¤à¥á ®á¢®¡®¦¤ ¥¬®£® MMIO-¡«®ª ¢ ¤à¥á®¬ |
¯à®áâà á⢥ ¯à¨«®¦¥¨ï |
®§¢à é ¥¬®¥ § 票¥: |
* eax = 1 - ¡«®ª ãá¯¥è® ®á¢®¡®¦¤¥; |
¬¥ç ¨ï: |
* ।¢ à¨â¥«ì® ¯à¨«®¦¥¨î ¤®«¦¥ ¡ëâì ¢ë¤¥«¥ uMMIO-¡«®ª (fn62:12) |
====================================================================== |
================ ãªæ¨ï 63 - à ¡®â á ¤®áª®© ®â« ¤ª¨. =============== |
====================================================================== |
®áª ®â« ¤ª¨ ¯à¥¤áâ ¢«ï¥â ᮡ®© á¨áâ¥¬ë© ¡ãä¥à ( 4096 ¡ ©â), |
3459,7 → 3355,6 |
====================================================================== |
¥¦¨¬ ¢¢®¤ ¢«¨ï¥â १ã«ìâ âë çâ¥¨ï ª« ¢¨è äãªæ¨¥© 2. |
ਠ§ £à㧪¥ ¯à®£à ¬¬ë ¤«ï ¥ñ ãáâ ¢«¨¢ ¥âáï ASCII-०¨¬ ¢¢®¤ . |
᫨ ¢ë§ë¢ ¥âáï ¥áãé¥áâ¢ãîé ï ¯®¤äãªæ¨ï ¢®§¢à é ¥âáï ¢ eax=-1. |
-------- ®¤äãªæ¨ï 1 - ãáâ ®¢¨âì ०¨¬ ¢¢®¤ á ª« ¢¨ âãàë. --------- |
à ¬¥âàë: |
3702,8 → 3597,8 |
¨«¨ ¯®¤äãªæ¨¥© 20. |
====================================================================== |
==================== ãªæ¨ï 68, ¯®¤äãªæ¨ï 14 ======================= |
===== ¦¨¤ âì ¯®«ã票ï ᨣ « , ®â ¤àã£¨å ¯à¨«®¦¥¨©/¤à ©¢¥à®¢. ===== |
====================== ãªæ¨ï 68, ¯®¤äãªæ¨ï 14 ===================== |
====== ¦¨¤ âì ¯®«ã票ï ᨣ « ®â ¤àã£¨å ¯à¨«®¦¥¨©/¤à ©¢¥à®¢. ===== |
====================================================================== |
à ¬¥âàë: |
* eax = 68 - ®¬¥à äãªæ¨¨ |
3710,6 → 3605,7 |
* ebx = 14 - ®¬¥à ¯®¤äãªæ¨¨ |
* ecx = 㪠§ â¥«ì ¡ãä¥à ¤«ï ¨ä®à¬ 樨 (24 ¡ ©â ) |
®§¢à é ¥¬®¥ § 票¥: |
* eax à §àãè ¥âáï |
* ¡ãä¥à, ª®â®àë© ãª §ë¢ ¥â ecx, ᮤ¥à¦¨â á«¥¤ãîéãî ¨ä®à¬ æ¨î: |
* +0: dword: ¨¤¥â¨ä¨ª â®à ¯®á«¥¤ãîé¨å ¤ ëå ᨣ « |
* +4: ¤ ë¥ ¯à¨ï⮣® ᨣ « (20 ¡ ©â), ä®à¬ â ª®â®àëå |
3716,12 → 3612,6 |
®¯à¥¤¥«ï¥âáï ¯¥à¢ë¬ dword-®¬ |
====================================================================== |
== ãªæ¨ï 68, ¯®¤äãªæ¨ï 15 - ãáâ ®¢¨âì ®¡à ¡®â稪 ¨áª«î票© FPU. = |
====================================================================== |
¤ «¥ (¢ ⥪ã饩 ॠ«¨§ 樨 ¯à®áâ® ¢®§¢à é ¥â 0) |
ᯮ«ì§®¢ âì ¯®¤äãªæ¨¨ 24, 25 |
====================================================================== |
=========== ãªæ¨ï 68, ¯®¤äãªæ¨ï 16 - § £à㧨âì ¤à ©¢¥à. =========== |
====================================================================== |
à ¬¥âàë: |
3760,12 → 3650,6 |
* ।¢ à¨â¥«ì® ¤®«¦¥ ¡ëâì ¯®«ãç¥ åí¤« ¤à ©¢¥à ¯®¤äãªæ¨¥© 16. |
====================================================================== |
== ãªæ¨ï 68, ¯®¤äãªæ¨ï 18 - ãáâ ®¢¨âì ®¡à ¡®â稪 ¨áª«î票© SSE. = |
====================================================================== |
¤ «¥ (¢ ⥪ã饩 ॠ«¨§ 樨 ¯à®áâ® ¢®§¢à é ¥â 0) |
ᯮ«ì§®¢ âì ¯®¤äãªæ¨¨ 24, 25 |
====================================================================== |
============= ãªæ¨ï 68, ¯®¤äãªæ¨ï 19 - § £à㧨âì DLL. ============= |
====================================================================== |
à ¬¥âàë: |
3860,7 → 3744,7 |
®¡« á⨠¯ ¬ïâ¨. |
====================================================================== |
==== ãªæ¨ï 68, ¯®¤äãªæ¨ï 24 - ãáâ ®¢¨âì ®¡à ¡®â稪 ¨áª«î票© === |
==== ãªæ¨ï 68, ¯®¤äãªæ¨ï 24 - ãáâ ®¢¨âì ®¡à ¡®â稪 ¨áª«î票©. === |
====================================================================== |
à ¬¥âàë: |
* eax = 68 - ®¬¥à äãªæ¨¨ |
3871,26 → 3755,26 |
* eax = ¤à¥á áâ ண® ®¡à ¡®â稪 ¨áª«î票© (0, ¥á«¨ ¥ ãáâ ®¢«¥) |
* ebx = ¬ ᪠áâ ண® ®¡à ¡®â稪 ¨áª«î票© |
¬¥ç ¨ï: |
* ®¬¥à ¡¨â ¢ ¬ ᪥ ¨áª«î票© ᮮ⢥âáâ¢ãîâ ®¬¥à㠨᪫îç¥¨ï ¯® |
ᯥæ¨ä¨ª 樨 ¯à®æ¥áá®à (Intel-PC). ª ¯à¨¬¥à, ¨áª«î票ï FPU |
¨¬¥îâ ®¬¥à 16 (#MF), SSE - 19 (#XF). |
* ®¬¥à ¡¨â ¢ ¬ ᪥ ¨áª«î票© ᮮ⢥âáâ¢ã¥â ®¬¥à㠨᪫îç¥¨ï ¯® |
ᯥæ¨ä¨ª 樨 ¯à®æ¥áá®à (Intel-PC). ª, ¯à¨¬¥à, ¨áª«î票ï |
FPU ¨¬¥îâ ®¬¥à 16 (#MF), SSE - 19 (#XF). |
* ¤ ®© ॠ«¨§ 樨 ¨£®à¨àã¥âáï § ¯à®á ¯¥à¥å¢ ⠨᪫î票ï 7 |
- á¨á⥬ ®¡à ¡ âë¢ ¥â #NM á ¬®áâ®ï⥫ì®. |
* ®«ì§®¢ ⥫ì᪨© ®¡à ¡®â稪 ¯®«ãç ¥â ®¬¥à ¨áª«îç¥¨ï ¯ à ¬¥â஬ |
¢ á⥪¥. ®íâ®¬ã ¯à ¢¨«ìë© ¢ë室 ¨§ ®¡à ¡®â稪 : RET 4. ®§¢à â |
¯à¨ í⮬ ¯à®¨§¢®¤¨âáï ª®¬ ¤ã, ¢ë§¢ ¢èãî ¨áª«î票¥. |
* ਠ¯¥à¥¤ ç¥ ã¯à ¢«¥¨ï ®¡à ¡®â稪㠨᪫î票©, á¡à áë¢ ¥âáï |
* ਠ¯¥à¥¤ ç¥ ã¯à ¢«¥¨ï ®¡à ¡®â稪㠨᪫î票© á¡à áë¢ ¥âáï |
ᮮ⢥âáâ¢ãî騩 ¡¨â ¢ ¬ ᪥ ¨áª«î票©. ®§¨ª®¢¥¨¥ í⮣® ¦¥ |
¨áª«îç¥¨ï ¢ ¯®á«¥¤á⢨¨ - ¯à¨¢¥¤¥â ª default-®¡à ¡®âª¥ â ª®¢®£®. |
¨¬¥®: ª § ¢¥à襨î à ¡®âë ¯à¨«®¦¥¨ï, ¨«¨ ¯à¨®áâ ®¢ª¥ á |
®â¨ä¨ª 樥© ®â« ¦¨¢ î饬㠯ਫ®¦¥¨î. |
* ®á«¥ § ¢¥àè¥¨ï ªà¨â¨ç¥áª¨å ¤¥©á⢨© ¢ ®¡à ¡®â稪¥ ¯®«ì§®¢ ⥫ï, |
¨áª«îç¥¨ï ¢¯®á«¥¤á⢨¨ ¯à¨¢¥¤ñâ ª 㬮«ç «ì®© ®¡à ¡®âª¥ â ª®¢®£®. |
¨¬¥®: ª § ¢¥à襨î à ¡®âë ¯à¨«®¦¥¨ï ¢ ®âáãâá⢨¨ ®â« ¤ç¨ª , |
¯à¨®áâ ®¢ª á 㢥¤®¬«¥¨¥¬ ®â« ¦¨¢ î饣® ¯à¨«®¦¥¨ï ¨ ç¥. |
* ®á«¥ § ¢¥àè¥¨ï ªà¨â¨ç¥áª¨å ¤¥©á⢨© ¢ ®¡à ¡®â稪¥ ¯®«ì§®¢ ⥫ï |
¢®ááâ ®¢«¥¨¥ ¡¨â ¬ ᪨ ¤ ®£® ¨áª«îç¥¨ï ¬®¦® ᤥ« âì |
¯®¤äãªæ¨¥© 25. ¡à®á ä« £®¢ ¨áª«î票© ¢ ¬®¤ã«ïå FPU ¨ XMM - |
â ª¦¥ ¢®§« £ ¥âáï ®¡à ¡®â稪 ¯®«ì§®¢ ⥫ï. |
¯®¤äãªæ¨¥© 25. ¡à®á ä« £®¢ ¨áª«î票© ¢ ¬®¤ã«ïå FPU ¨ XMM â ª¦¥ |
¢®§« £ ¥âáï ®¡à ¡®â稪 ¯®«ì§®¢ ⥫ï. |
====================================================================== |
= ãªæ¨ï 68, ¯®¤äãªæ¨ï 25 - ¨§¬¥¥¨¥ á®áâ®ï¨ï ªâ¨¢®á⨠ᨣ « = |
= ãªæ¨ï 68, ¯®¤äãªæ¨ï 25 - ¨§¬¥¨âì á®áâ®ï¨¥ ªâ¨¢®á⨠ᨣ « . = |
====================================================================== |
à ¬¥âàë: |
* eax = 68 - ®¬¥à äãªæ¨¨ |
3898,10 → 3782,11 |
* ecx = ®¬¥à ᨣ « |
* edx = § 票¥ ãáâ ¢«¨¢ ¥¬®© ªâ¨¢®á⨠(0/1) |
®§¢à é ¥¬®¥ § 票¥: |
* eax = áâ ஥ § 票¥ ªâ¨¢®á⨠ᨣ « (0/1) |
* eax = -1 - § ¤ ¥¢¥àë© ®¬¥à ᨣ « |
* ¨ ç¥ eax = áâ ஥ § 票¥ ªâ¨¢®á⨠ᨣ « (0/1) |
¬¥ç ¨ï: |
* ⥪ã饩 ॠ«¨§ 樨 ¨§¬¥ï¥âáï ⮫쪮 ¬ ᪠¯®«ì§®¢ ⥫ì᪮£® |
®¡à ¡®â稪 ¨áª«î票©, ãáâ ®¢«¥®£® ¯®¤äãªæ¨¥© 24. ਠí⮬, |
®¡à ¡®â稪 ¨áª«î票©, ãáâ ®¢«¥®£® ¯®¤äãªæ¨¥© 24. ਠí⮬ |
®¬¥à ᨣ « ᮮ⢥âáâ¢ã¥â ®¬¥à㠨᪫î票ï. |
====================================================================== |
4204,6 → 4089,10 |
* '/hd0/2/menuet/pics/tanzania.bmp',0 |
* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 |
* '/sys/MySuperApp.ini',0 |
ª¦¥ äãªæ¨ï ¯®¤¤¥à¦¨¢ ¥â ®â®á¨â¥«ìë¥ ¨¬¥ . ᫨ ¯ãâì ç¨ ¥âáï |
¥ á '/', â® ® áç¨â ¥âáï ®â®á¨â¥«ì® ⥪ã饩 ¯ ¯ª¨. ®«ãç¨âì ¨«¨ |
ãáâ ®¢¨âì ⥪ãéãî ¯ ¯ªã ¬®¦® á ¯®¬®éìî á¨áäãªæ¨¨ 30. |
®áâã¯ë¥ ¯®¤äãªæ¨¨: |
* ¯®¤äãªæ¨ï 0 - ç⥨¥ ä ©« |
* ¯®¤äãªæ¨ï 1 - ç⥨¥ ¯ ¯ª¨ |
/kernel/branches/Kolibri-acpi/docs/sysfuncs.txt |
---|
1,4 → 1,4 |
SYSTEM FUNCTIONS of OS Kolibri 0.7.5.0 |
SYSTEM FUNCTIONS of OS Kolibri 0.7.7.0 |
Number of the function is located in the register eax. |
The call of the system function is executed by "int 0x40" command. |
347,6 → 347,7 |
* bit 0 (mask 1): window is maximized |
* bit 1 (mask 2): window is minimized to panel |
* bit 2 (mask 4): window is rolled up |
* +71 = +0x47: dword: event mask |
Remarks: |
* Slots are numbered starting from 1. |
* Returned value is not a total number of threads, because there |
376,8 → 377,8 |
and idle time in waiting for interrupt (which can be got by call |
to subfunction 4 of function 18). |
* Beginning from slot 2, the normal applications are placed. |
* Applications are placed in memory at the address 0x0 |
(kernel constant 'std_application_base_address'). |
* The normal applications are placed in memory at the address |
0 (kernel constant 'std_application_base_address'). |
There is no intersection, as each process has its own page table. |
* At creation of the thread it is assigned the slot |
in the system table and identifier (Process/Thread IDentifier = |
844,12 → 845,12 |
* function does not return value |
Structure of the buffer: |
db a,b,c,d for version a.b.c.d |
db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 |
db 0: reserved |
dd REV - kernel SVN revision number |
For Kolibri 0.7.1.0 kernel: |
db 0,7,0,0 |
db 2 |
dd 638 |
For Kolibri 0.7.7.0+ kernel: |
db 0,7,7,0 |
db 0 |
dd 1675 |
====================================================================== |
======= Function 18, subfunction 14 - wait for screen retrace. ======= |
1658,58 → 1659,11 |
Remarks: |
* If the buffer is too small to hold all data, only first (edx-1) |
bytes are copied and than terminating 0 is inserted. |
* By default, current folder for the thread is "/rd/1". |
* At process/thread creation the current folder will be inherited |
from the parent. |
====================================================================== |
=============== Function 32 - delete file from ramdisk. ============== |
====================================================================== |
Parameters: |
* eax = 32 - function number |
* ebx = pointer to the filename |
Returned value: |
* eax = 0 - success; otherwise file system error code |
Remarks: |
* This function is obsolete; function 58 allows to fulfill |
the same operations with the extended possibilities. |
* The current implementation returns only values 0(success) and |
5(file not found). |
* The filename must be either in the format 8+3 characters |
(first 8 characters - name itself, last 3 - extension, |
the short names and extensions are supplemented with spaces), |
or in the format 8.3 characters "FILE.EXT"/"FILE.EX " |
(name no more than 8 characters, dot, extension 3 characters |
supplemented if necessary by spaces). |
The filename must be written with capital letters. The terminating |
character with code 0 is not necessary (not ASCIIZ-string). |
* This function does not support folders on the ramdisk. |
====================================================================== |
================ Function 33 - write file to ramdisk. ================ |
====================================================================== |
Parameters: |
* eax = 33 - function number |
* ebx = pointer to the filename |
* ecx = pointer to data for writing |
* edx = number of bytes for writing |
* should be set esi=0 |
Returned value: |
* eax = 0 - success, otherwise file system error code |
Remarks: |
* This function is obsolete; function 70 allows to fulfil |
the same operations with extended possibilities. |
* If esi contains non-zero value and selected file already exists, |
one more file with the same name will be created. |
* Otherwise file will be overwritten. |
* The filename must be either in the format 8+3 characters |
(first 8 characters - name itself, last 3 - extension, |
the short names and extensions are supplemented with spaces), |
or in the format 8.3 characters "FILE.EXT"/"FILE.EX " |
(name no more than 8 characters, dot, extension 3 characters |
supplemented if necessary by spaces). |
The filename must be written with capital letters. The terminating |
character with code 0 is not necessary (not ASCIIZ-string). |
* This function does not support folders on the ramdisk. |
====================================================================== |
======= Function 35 - read the color of a pixel on the screen. ======= |
====================================================================== |
Parameters: |
3261,59 → 3215,6 |
in the device documentation. |
====================================================================== |
===================== Function 62, subfunction 11 ==================== |
== Initialize user-accessible MMIO channel == |
====================================================================== |
Parameters: |
* eax = 62 - function |
* bl = 11 - subfunction |
* cx = PCI-address (bbbbbbbb dddddfff) |
Returns: |
* eax = -1 - PCI access not granted; |
* eax = -2 - no user MMIO access to this PCI address; |
* eax = -3 - memory allocation error; otherwise |
* eax = available user heap size. |
Remarks: |
* Low-level PCI access must be allowed (fn21:12) |
* PCI-address should correspond the system var [mmio_pci_addr] |
====================================================================== |
===================== Function 62, subfunction 12 ==================== |
== Request user-accessible MMIO address space == |
====================================================================== |
Parameters: |
* eax = 62 - function |
* bl = 12 - subfunction |
* bh = BAR number in PCI configuration space |
* ecx = MMIO-block size needed (bytes) |
* edx = MMIO-offset (number of whole 4Kb-pages!) |
Returns: |
* eax = -1 - user PCI access denied; |
* eax = -2 - invalid BAR number; |
* eax = -3 - BAR contains no valid IO addres; |
* eax = -4 - BAR addresses IO ports; |
* eax = -5 - dynamic allocation error; otherwise |
* eax = MMIO start address (in application's linear space). |
Remarks: |
* Low-level PCI access must be allowed (fn21:12) |
* The system var [mmio_pci_addr] sets the actual PCI-address |
* The granted MMIO addresses should be released after use (fn62:13) |
====================================================================== |
===================== Function 62, subfunction 13 ==================== |
== Release a block of user MMIO addresses == |
====================================================================== |
à ¬¥âàë: |
* eax = 62 - function |
* bl = 12 - subfunction |
* ecx = MMIO start address (in application's linear space). |
Returns: |
* eax = 1 if the block is successfully released; |
* eax = 0 in case of reallocation error; |
Remarks: |
* A valid uMMIO block should exist at this address (fn62:12) |
====================================================================== |
============== Function 63 - work with the debug board. ============== |
====================================================================== |
The debug board is the global system buffer (with the size |
3421,7 → 3322,6 |
====================================================================== |
The input mode influences results of reading keys by function 2. |
When a program loads, ASCII input mode is set for it. |
If subfunction is not support then eax=-1. |
-------------- Subfunction 1 - set keyboard input mode. -------------- |
Parameters: |
3670,7 → 3570,7 |
====================================================================== |
===================== Function 68, subfunction 14 ==================== |
====== Waiting delivering of signal from another program/driver ====== |
============ Wait for signal from another program/driver. ============ |
====================================================================== |
Parameters: |
* eax = 68 - function number |
3678,17 → 3578,11 |
* ecx = pointer to the buffer for information (24 bytes) |
Returned value: |
* buffer pointed to by ecx contains the following information: |
* +0: dword: identifier for underlying data of signal |
* +4: data of signal (20 bytes), format of which is defining by |
first dword |
* +0: dword: identifier for following data of signal |
* +4: dword: data of signal (20 bytes), format of which is defined |
by the first dword |
====================================================================== |
====== Function 68, subfunction 15 - set FPU exception handler. ====== |
====================================================================== |
Deleted (in current implementation only 0 is returned). |
Using subfunctions 24, 25 is true. |
====================================================================== |
============= Function 68, subfunction 16 - load driver. ============= |
====================================================================== |
Parameters: |
3720,11 → 3614,7 |
* +16 = +0x10: dword: pointer to output data |
* +20 = +0x14: dword: size of output data |
Returned value: |
* eax = error code |
0 - successful call |
-1 - any error. |
-2, -3, -4, etc. reserved for kernel error codes |
1, 2, 3, etc driver specific error codes |
* eax = determined by driver |
Remarks: |
* Function codes and the structure of input/output data |
are defined by driver. |
3731,12 → 3621,6 |
* Previously one must obtain driver handle by subfunction 16. |
====================================================================== |
====== Function 68, subfunction 18 - set SSE exception handler. ====== |
====================================================================== |
Deleted (in current implementation only 0 is returned). |
Using subfunctions 24, 25 is true. |
====================================================================== |
=============== Function 68, subfunction 19 - load DLL. ============== |
====================================================================== |
Parameters: |
3775,36 → 3659,92 |
the new and old sizes. |
====================================================================== |
====== Function 68, subfunction 24 - set new exceptions handler ====== |
======== Function 68, subfunction 22 - open named memory area. ======= |
====================================================================== |
Parameters: |
* eax = 68 - function number |
* ebx = 22 - subfunction number |
* ecx = area name. Maximum of 31 characters with terminating zero |
* edx = area size in bytes for SHM_CREATE and SHM_OPEN_ALWAYS |
* esi = flags for open and access: |
* SHM_OPEN = 0x00 - open existing memory area. If an area |
with such name does not exist, the function |
will return error code 5. |
* SHM_OPEN_ALWAYS = 0x04 - open existing or create new |
memory area. |
* SHM_CREATE = 0x08 - create new memory area. If an area |
with such name already exists, the function |
will return error code 10. |
* SHM_READ = 0x00 - only read access |
* SHM_WRITE = 0x01 - read and write access |
Returned value: |
* eax = pointer to memory area, 0 if error has occured |
* if new area is created (SHM_CREATE or SHM_OPEN_ALWAYS): |
edx = 0 - success, otherwise - error code |
* if existing area is opened (SHM_OPEN or SHM_OPEN_ALWAYS): |
edx = error code (if eax=0) or area size in bytes |
Error codes: |
* E_NOTFOUND = 5 |
* E_ACCESS = 10 |
* E_NOMEM = 30 |
* E_PARAM = 33 |
Remarks: |
* Before this call one must initialize process heap by call to |
subfunction 11. |
* If a new area is created, access flags set maximal rights |
for other processes. An attempt from other process to open |
with denied rights will fail with error code E_ACCESS. |
* The process which has created an area always has write access. |
====================================================================== |
======= Function 68, subfunction 23 - close named memory area. ======= |
====================================================================== |
Parameters: |
* eax = 68 - function number |
* ebx = 23 - subfunction number |
* ecx = area name. Maximum of 31 characters with terminating zero |
Returned value: |
* eax destroyed |
Remarks: |
* A memory area is physically freed (with deleting all data and |
freeing physical memory), when all threads which have opened |
this area will close it. |
* When thread is terminating, all opened by it areas are closed. |
====================================================================== |
======== Function 68, subfunction 24 - set exception handler. ======== |
====================================================================== |
Parameters: |
* eax = 68 - function number |
* ebx = 24 - subfunction number |
* ecx = address of the new exception handler |
* edx = the mask of processing exceptions |
* edx = the mask of handled exceptions |
Returned value: |
* eax = address of the old exception handler (0, if it was not set) |
* ebx = the old mask of exception handler |
* ebx = the old mask of handled exceptions |
Remarks: |
* Bit number in mask of exceptions is correspond to exception number |
by CPU-specification (Intel-PC). For example, FPU-exception have |
number 16 (#MF), and SSE-exception - 19 (#XF) |
* The current implementation ignore the inquiry for hook of 7 |
exception - system process #NM by one's own. |
* User handler get exception number in stack parameter. So, correct |
exit from handler is: RET 4. Return from handler is to the same |
instruction, that was cause the exception |
* When control is transfering to user handler, corresponding bit in |
exception mask is clearing. Rising this exception in consequence |
- reduce to default-handling. Exactly: terminating the application, |
or suspending with debug-notify to owner. |
* After completion of critical operations in user handler, it may be |
rising corresponding bit in exception mask by using subfunction 25 |
Clearing exceptions flags in FPU and/or XMM modules - is |
responsibility of user handler too. |
* Bit number in mask of exceptions corresponds to exception number |
in CPU-specification (Intel-PC). For example, FPU exceptions have |
number 16 (#MF), and SSE exceptions - 19 (#XF). |
* The current implementation ignores the inquiry for hook of 7 |
exception - the system handles #NM by its own. |
* The exception handler is called with exception number as first |
(and only) stack parameter. So, correct exit from the handler is |
RET 4. It returns to the instruction, that caused the exception, |
for faults, and to the next instruction for traps (see |
classification of exceptions in CPU specification). |
* When user handler receives control, the corresponding bit in |
the exception mask is cleared. Raising this exception |
in consequence leads to default handling, that is, |
terminating the application in absence of debugger or |
suspend with notification of debugger otherwise. |
* After user handler completes critical operations, it can set |
the corresponding bit in the exception mask with subfunction 25. |
Also user handler is responsible for clearing exceptions flags in |
FPU and/or SSE. |
====================================================================== |
==== Function 68, subfunction 25 - change state of signal activity === |
====== Function 68, subfunction 25 - set FPU exception handler. ====== |
====================================================================== |
Parameters: |
* eax = 68 - function number |
3812,14 → 3752,15 |
* ecx = signal number |
* edx = value of activity (0/1) |
Returned value: |
* eax = value of old activity for this signal (0/1) |
* eax = -1 - invalid signal number |
* otherwise eax = old value of activity for this signal (0/1) |
Remarks: |
* In current implementation, it is changed only exception mask for |
user exception handler, wich was previously set by subfunction 24. |
At that, number of signal correspond to exception number. |
* In current implementation only mask for user excepton handler, |
which has been previously set by subfunction 24, |
is changed. Signal number corresponds to exception number. |
====================================================================== |
====================== Fucntion 69 - debugging. ====================== |
====================== Function 69 - debugging. ====================== |
====================================================================== |
A process can load other process as debugged by set of corresponding |
bit by call to subfunction 7 of function 70. |
4111,6 → 4052,10 |
* '/hd0/2/menuet/pics/tanzania.bmp',0 |
* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 |
* '/sys/MySuperApp.ini',0 |
Also function supports relative names. If the path begins not |
with '/', it is considered relative to a current folder. To get or |
set a current folder, use the function 30. |
Available subfunctions: |
* subfunction 0 - read file |
* subfunction 1 - read folder |
/kernel/branches/Kolibri-acpi/drivers/imports.inc |
---|
90,4 → 90,6 |
strchr,\ |
strrchr,\ |
\ |
LFBAddress |
LFBAddress,\ |
GetDisplay,\ |
SetScreen |
/kernel/branches/Kolibri-acpi/drivers/infinity.asm |
---|
55,6 → 55,7 |
DEV_PLAY equ 1 |
DEV_STOP equ 2 |
DEV_CALLBACK equ 3 |
DEV_GET_POS equ 9 |
struc IOCTL |
{ .handle dd ? |
159,14 → 160,65 |
output equ IOCTL.output |
out_size equ IOCTL.out_size |
align 4 |
srv_calls dd service_proc.srv_getversion ; 0 |
dd service_proc.snd_create_buff ; 1 |
dd service_proc.snd_destroy_buff ; 2 |
dd service_proc.snd_setformat ; 3 |
dd service_proc.snd_getformat ; 4 |
dd service_proc.snd_reset ; 5 |
dd service_proc.snd_setpos ; 6 |
dd service_proc.snd_getpos ; 7 |
dd service_proc.snd_setbuff ; 8 |
dd service_proc.snd_out ; 9 |
dd service_proc.snd_play ; 10 |
dd service_proc.snd_stop ; 11 |
dd service_proc.snd_setvolume ; 12 |
dd service_proc.snd_getvolume ; 13 |
dd service_proc.snd_setpan ; 14 |
dd service_proc.snd_getpan ; 15 |
dd service_proc.snd_getbuffsize ; 16 |
dd service_proc.snd_getfreespace ; 17 |
dd service_proc.snd_settimebase ; 18 |
dd service_proc.snd_gettimestamp ; 19 |
srv_calls_end: |
proc service_proc stdcall, ioctl:dword |
mov edi, [ioctl] |
mov eax, [edi+io_code] |
cmp eax, SRV_GETVERSION |
jne @F |
cmp eax, (srv_calls_end-srv_calls)/4 |
ja .fail |
cmp eax, SND_DESTROY_BUFF |
jb @F |
; cmp [edi+inp_size], 4 |
; jb .fali |
mov ebx, [edi+input] |
mov edx, [ebx] |
cmp [edx+STREAM.magic], 'WAVE' |
jne .fail |
cmp [edx+STREAM.size], STREAM.sizeof |
jne .fail |
@@: |
jmp [srv_calls+eax*4] |
.fail: |
mov eax, -1 |
ret |
align 4 |
.srv_getversion: |
mov eax, [edi+output] |
cmp [edi+out_size], 4 |
jne .fail |
174,9 → 226,9 |
mov [eax], dword API_VERSION |
xor eax, eax |
ret |
@@: |
cmp eax, SND_CREATE_BUFF |
jne @F |
align 4 |
.snd_create_buff: |
mov ebx, [edi+input] |
stdcall CreateBuffer,[ebx],[ebx+4] |
mov edi, [ioctl] |
184,30 → 236,20 |
mov ecx, [ecx] |
mov [ecx], ebx |
ret |
@@: |
mov ebx, [edi+input] |
mov edx, [ebx] |
cmp [edx+STREAM.magic], 'WAVE' |
jne .fail |
cmp [edx+STREAM.size], STREAM_SIZE |
jne .fail |
cmp eax, SND_DESTROY_BUFF |
jne @F |
align 4 |
.snd_destroy_buff: |
mov eax, edx |
call DestroyBuffer ;edx= stream |
call DestroyBuffer |
ret |
@@: |
cmp eax, SND_SETFORMAT |
jne @F |
align 4 |
.snd_setformat: |
stdcall SetFormat,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETFORMAT |
jne @F |
align 4 |
.snd_getformat: |
movzx eax, word [edx+STREAM.format] |
mov ecx, [edi+output] |
mov ecx, [ecx] |
214,19 → 256,19 |
mov [ecx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_RESET |
jne @F |
align 4 |
.snd_reset: |
stdcall ResetBuffer,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_SETPOS |
jne @F |
align 4 |
.snd_setpos: |
stdcall SetBufferPos,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETPOS |
jne @F |
align 4 |
.snd_getpos: |
stdcall GetBufferPos, edx |
mov edi, [ioctl] |
mov ecx, [edi+output] |
233,34 → 275,48 |
mov ecx, [ecx] |
mov [ecx], ebx |
ret |
@@: |
cmp eax, SND_SETBUFF |
jne @F |
align 4 |
.snd_setbuff: |
mov eax, [ebx+4] |
stdcall set_buffer, edx,eax,[ebx+8],[ebx+12] |
ret |
@@: |
cmp eax, SND_SETVOLUME |
jne @F |
align 4 |
.snd_out: |
mov eax, [ebx+4] |
stdcall wave_out, edx,eax,[ebx+8] |
ret |
align 4 |
.snd_play: |
stdcall play_buffer, edx,[ebx+4] |
ret |
align 4 |
.snd_stop: |
stdcall stop_buffer, edx |
ret |
align 4 |
.snd_setvolume: |
stdcall SetBufferVol,edx,[ebx+4],[ebx+8] |
ret |
@@: |
cmp eax, SND_GETVOLUME |
jne @F |
align 4 |
.snd_getvolume: |
mov eax, [edi+output] |
mov ecx, [eax] |
mov eax, [eax+4] |
stdcall GetBufferVol,edx,ecx,eax |
ret |
@@: |
cmp eax, SND_SETPAN |
jne @F |
align 4 |
.snd_setpan: |
stdcall SetBufferPan,edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_GETPAN |
jne @F |
align 4 |
.snd_getpan: |
mov eax, [edx+STREAM.pan] |
mov ebx, [edi+output] |
mov ebx, [ebx] |
267,28 → 323,9 |
mov [ebx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_OUT |
jne @F |
mov eax, [ebx+4] |
stdcall wave_out, edx,eax,[ebx+8] |
ret |
@@: |
cmp eax, SND_PLAY |
jne @F |
stdcall play_buffer, edx,[ebx+4] |
ret |
@@: |
cmp eax, SND_STOP |
jne @F |
stdcall stop_buffer, edx |
ret |
@@: |
cmp eax, SND_GETBUFFSIZE |
jne @F |
align 4 |
.snd_getbuffsize: |
mov eax, [edx+STREAM.in_size] |
mov ecx, [edi+output] |
mov ecx, [ecx] |
295,10 → 332,9 |
mov [ecx], eax |
xor eax, eax |
ret |
@@: |
cmp eax, SND_GETFREESPACE |
jne @F |
align 4 |
.snd_getfreespace: |
test [edx+STREAM.format], PCM_OUT |
jz .fail |
307,12 → 343,73 |
mov [ecx], ebx |
xor eax, eax |
ret |
align 4 |
.snd_settimebase: |
cmp [edi+inp_size], 12 |
jne .fail |
mov eax, [ebx] |
mov ebx, [ebx+4] |
mov dword [edx+STREAM.time_base], eax |
mov dword [edx+STREAM.time_base+4], ebx |
xor eax, eax |
ret |
.snd_gettimestamp: |
cmp [edi+out_size], 8 |
jne .fail |
pushfd |
cli |
xor ebx, ebx |
push 48 |
push ebx ; local storage |
cmp [edx+STREAM.flags], SND_STOP |
je @F |
mov eax, esp |
push edx |
push edi |
push 4 ;.out_size |
push eax ;.output |
push ebx ;.inp_size |
push ebx ;.input |
push DEV_GET_POS ;.code |
push dword [hSound] ;.handle |
mov eax, esp |
stdcall ServiceHandler, eax |
add esp, 6*4 |
pop edi |
pop edx |
test eax, eax |
jz @F |
mov dword [esp], 0 ; clear offset |
@@: |
.fail: |
or eax, -1 |
mov edi, [edi+output] |
emms |
fild qword [edx+STREAM.time_stamp] |
fiadd dword [esp] ; primary buffer offset |
fidiv dword [esp+4] ; total_samples / frequency |
fadd qword [edx+STREAM.time_base] |
fstp qword [edi] |
add esp, 8 |
popfd |
xor eax, eax |
ret |
endp |
restore handle |
restore io_code |
restore input |
352,7 → 449,7 |
call GetPid |
mov ebx, eax |
mov eax, STREAM_SIZE |
mov eax, STREAM.sizeof |
call CreateObject |
test eax, eax |
412,7 → 509,6 |
mov [edi+STREAM.in_base], eax |
mov [edi+STREAM.in_size], ecx |
add eax, 128 |
; sub ecx, 128 |
mov [edi+STREAM.in_wp], eax |
mov [edi+STREAM.in_rp], eax |
mov [edi+STREAM.in_count], 0 |
443,13 → 539,22 |
stdcall AllocKernelSpace, dword 128*1024 |
mov edi, [str] |
xor ebx, ebx |
mov [edi+STREAM.out_base], eax |
mov [edi+STREAM.out_wp], eax |
mov [edi+STREAM.out_rp], eax |
mov [edi+STREAM.out_count], 0 |
mov [edi+STREAM.out_count], ebx |
add eax, 64*1024 |
mov [edi+STREAM.out_top], eax |
mov dword [edi+STREAM.time_base], ebx |
mov dword [edi+STREAM.time_base+4], ebx |
mov dword [edi+STREAM.time_stamp], ebx |
mov dword [edi+STREAM.time_stamp+4], ebx |
mov dword [edi+STREAM.last_ts], ebx |
stdcall AllocPages, dword 64/4 |
mov edi, [str] |
mov ebx, [edi+STREAM.out_base] |
488,7 → 593,7 |
mov [ebx+STREAM.magic], 'WAVE' |
mov [ebx+STREAM.destroy], DestroyBuffer.destroy |
mov [ebx+STREAM.size], STREAM_SIZE |
mov [ebx+STREAM.size], STREAM.sizeof |
mov [ebx+STREAM.flags], SND_STOP |
pushf |
857,6 → 962,26 |
ret |
endp |
proc minw stdcall, arg1:dword, arg2:dword |
mov ax, word [arg1] |
cmp ax, word [arg2] |
jle @f |
mov eax, [arg2] |
@@: |
ret |
endp |
proc maxw stdcall, arg1:dword, arg2:dword |
mov ax, word [arg1] |
cmp ax, word [arg2] |
jge @f |
mov eax, [arg2] |
@@: |
ret |
endp |
proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword |
locals |
_600 dd ? |
870,31 → 995,34 |
lea ebx, [state] |
fnsave [ebx] |
movq mm0, qword [l_vol] |
pminsw mm0, qword [vol_max] |
pmaxsw mm0, qword [vol_min] |
movq qword [l_vol], mm0 |
movq qword [edx+STREAM.l_vol], mm0 |
stdcall minw, [l_vol], [vol_max] |
stdcall maxw, eax, [vol_min] |
mov [l_vol], eax |
mov [edx+STREAM.l_vol], eax |
stdcall minw, [r_vol], [vol_max+4] |
stdcall maxw, eax, [vol_min+4] |
mov [r_vol], eax |
mov [edx+STREAM.r_vol], eax |
movd mm1,[pan] |
pminsw mm1, qword [pan_max] |
pmaxsw mm1, qword [vol_min] |
movd [edx+STREAM.pan], mm1 |
stdcall minw, [pan], [pan_max] |
stdcall maxw, eax, [vol_min] |
mov [edx+STREAM.pan], eax |
cmp word [edx+STREAM.pan], 0 |
jl @F |
jl @f |
psubsw mm0,mm1 |
pminsw mm0, qword [vol_max] |
pmaxsw mm0, qword [vol_min] |
movd [l_vol],mm0 |
mov ebx, [l_vol] |
sub ebx, eax |
stdcall minw, ebx, [vol_max] |
stdcall maxw, eax, [vol_min] |
mov [l_vol], eax |
jmp .calc_amp |
@@: |
punpckhdq mm0,mm0 |
paddsw mm0,mm1 |
pminsw mm0, qword [vol_max] |
pmaxsw mm0, qword [vol_min] |
movd [r_vol], mm0 |
mov ebx, [r_vol] |
add ebx, [pan] |
stdcall minw, ebx, [vol_max+4] |
stdcall maxw, eax, [vol_min+4] |
mov [r_vol], eax |
.calc_amp: |
emms |
fild word [l_vol] |
935,6 → 1063,7 |
ret 0 |
endp |
align 4 |
proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword |
1039,7 → 1168,7 |
cmp [ebx+STREAM.magic], 'WAVE' |
jne .next |
cmp [ebx+STREAM.size], STREAM_SIZE |
cmp [ebx+STREAM.size], STREAM.sizeof |
jne .next |
cmp [ebx+STREAM.flags], SND_PLAY; |
1108,7 → 1237,7 |
cmp [edi+STREAM.magic], 'WAVE' |
jne .next |
cmp [edi+STREAM.size], STREAM_SIZE |
cmp [edi+STREAM.size], STREAM.sizeof |
jne .next |
cmp [edi+STREAM.flags], SND_PLAY; |
/kernel/branches/Kolibri-acpi/drivers/main.inc |
---|
91,6 → 91,8 |
SND_GETPAN equ 15 |
SND_GETBUFFSIZE equ 16 |
SND_GETFREESPACE equ 17 |
SND_SETTIMEBASE equ 18 |
SND_GETTIMESTAMP equ 19 |
struc STREAM |
{ |
113,6 → 115,23 |
.out_count dd ? |
.out_top dd ? ;16*4 |
.in_base dd ? |
.in_size dd ? |
.in_wp dd ? |
.in_rp dd ? |
.in_count dd ? |
.in_free dd ? |
.in_top dd ? |
align 8 |
.time_base dq ? |
.time_stamp dq ? |
.last_ts dd ? |
.notify_event dd ? |
.notify_id dd ? |
.r_size dd ? |
.r_dt dd ? |
.r_silence dd ? |
125,19 → 144,9 |
.l_amp_f dd ? ;float point left |
.r_amp_f dd ? ;float point right |
.in_base dd ? |
.in_size dd ? |
.in_wp dd ? |
.in_rp dd ? |
.in_count dd ? |
.in_free dd ? |
.in_top dd ? |
.notify_event dd ? |
.notify_id dd ? |
.sizeof: |
} |
STREAM_SIZE equ 36*4 |
FD_OFFSET equ 24 |
virtual at 0 |
/kernel/branches/Kolibri-acpi/drivers/mixer.asm |
---|
29,7 → 29,7 |
and eax, -16 ;must be 16b aligned |
call FpuSave |
call update_stream |
call update_streams |
.mix: |
lea eax, [mix_list] |
call do_mix_list |
87,7 → 87,7 |
endp |
align 4 |
proc update_stream |
proc update_streams |
locals |
stream_index dd ? |
event rd 6 |
98,6 → 98,10 |
mov edx, [stream_index] |
mov esi, [play_list+edx*4] |
add dword [esi+STREAM.time_stamp], 4096 |
adc dword [esi+STREAM.time_stamp+4], 0 |
mov dword [esi+STREAM.last_ts], 0 |
mov eax, [esi+STREAM.out_rp] |
cmp eax, [esi+STREAM.out_top] |
jb @f |
/kernel/branches/Kolibri-acpi/drivers/sb16/sb16.asm |
---|
7,7 → 7,7 |
format MS COFF |
include 'config.inc' |
include 'CONFIG.INC' |
;structs---------------------------------------------------------- |
struc IOCTL |
33,7 → 33,7 |
section '.flat' code readable align 16 |
include 'sb16.inc' |
include 'SB16.INC' |
;------------------------------------------------------------------------------- |
proc START stdcall, state:dword |
/kernel/branches/Kolibri-acpi/drivers/sceletone.asm |
---|
16,10 → 16,6 |
include 'proc32.inc' |
include 'imports.inc' |
OS_BASE equ 0; |
new_app_base equ 0x60400000 |
PROC_BASE equ OS_BASE+0x0080000 |
struc IOCTL |
{ .handle dd ? |
.io_code dd ? |
/kernel/branches/Kolibri-acpi/drivers/sound.asm |
---|
138,6 → 138,7 |
DEV_SET_MASTERVOL equ 6 |
DEV_GET_MASTERVOL equ 7 |
DEV_GET_INFO equ 8 |
DEV_GET_POS equ 9 |
struc AC_CNTRL ;AC controller base class |
{ .bus dd ? |
333,46 → 334,7 |
mov esi, msgDone |
call SysMsgBoardStr |
if IRQ_REMAP |
pushf |
cli |
mov ebx, [ctrl.int_line] |
in al, 0xA1 |
mov ah, al |
in al, 0x21 |
test ebx, ebx |
jz .skip |
bts ax, bx ;mask old line |
.skip |
bts ax, IRQ_LINE ;mask new ine |
out 0x21, al |
mov al, ah |
out 0xA1, al |
;remap IRQ |
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE |
mov dx, 0x4d0 ;8259 ELCR1 |
in al, dx |
bts ax, IRQ_LINE |
out dx, al ;set level-triggered mode |
mov [ctrl.int_line], IRQ_LINE |
popf |
mov esi, msgRemap |
call SysMsgBoardStr |
end if |
mov eax, VALID_IRQ |
mov ebx, [ctrl.int_line] |
mov esi, msgInvIRQ |
bt eax, ebx |
jnc .fail_msg |
mov eax, ATTCH_IRQ |
mov esi, msgAttchIRQ |
bt eax, ebx |
jnc .fail_msg |
stdcall AttachIntHandler, ebx, ac97_irq, dword 0 |
stdcall AttachIntHandler, 17, ac97_irq, dword 0 |
.reg: |
stdcall RegService, sz_sound_srv, service_proc |
ret |
453,6 → 415,21 |
mov ebx, [edi+output] |
stdcall get_master_vol, ebx |
ret |
@@: |
cmp eax, DEV_GET_POS |
jne @F |
mov ebx, 8192 |
mov edx, 0x18 |
xor eax, eax |
call [ctrl.ctrl_read16] |
sub ebx, eax |
shr ebx, 1 |
mov edx, [edi+output] |
mov [edx], ebx |
xor eax, eax |
ret |
;@@: |
; cmp eax, DEV_GET_INFO |
; jne @F |
480,6 → 457,22 |
call SysMsgBoardStr |
end if |
mov edx, CTRL_STAT |
call [ctrl.ctrl_read32] |
push eax |
test eax, 0x40 |
jnz .do_intr |
test eax, eax |
jz .done |
mov edx, CTRL_STAT |
call [ctrl.ctrl_write32] |
jmp .done |
.do_intr: |
mov edx, PCM_OUT_CR_REG |
mov al, 0x10; 0x10 |
call [ctrl.ctrl_write8] |
513,17 → 506,21 |
mov ebx, dword [buff_list+eax*4] |
cmp [ctrl.user_callback], 0 |
je @f |
je .done |
stdcall [ctrl.user_callback], ebx |
@@: |
.done: |
pop eax |
and eax, 0x40 |
mov edx, CTRL_STAT |
call [ctrl.ctrl_write32] |
ret |
.skip: |
mov edx, PCM_OUT_CR_REG |
mov ax, 0x11 ;0x1D |
call [ctrl.ctrl_write8] |
ret |
jmp .done |
endp |
align 4 |
776,6 → 773,8 |
and eax, 0xFF |
mov [ctrl.cfg_reg], eax |
mov [ctrl.user_callback], 0 |
call [ctrl.ctrl_setup] |
xor eax, eax |
inc eax |
/kernel/branches/Kolibri-acpi/fs/iso9660.inc |
---|
67,9 → 67,11 |
jne .IDE_Channel_2 |
.IDE_Channel_1: |
mov [IDE_Channel_1],0 |
sti |
ret |
.IDE_Channel_2: |
mov [IDE_Channel_2],0 |
sti |
ret |
uglobal |
/kernel/branches/Kolibri-acpi/hid/keyboard.inc |
---|
94,12 → 94,34 |
pop eax |
ret |
align 4 |
set_keyboard_data: |
movzx eax,word[TASK_COUNT] ; top window process |
movzx eax,word[WIN_POS+eax*2] |
shl eax,8 |
mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] |
mov [keyboard_mode],al |
mov eax, ecx |
push ebx |
push esi |
push edi |
push ebp |
call send_scancode |
pop ebp |
pop edi |
pop esi |
pop ebx |
ret |
align 4 |
irq1: |
; save_ring3_context |
; mov ax, os_data |
; mov ds, ax |
; mov es, ax |
movzx eax,word[TASK_COUNT] ; top window process |
movzx eax,word[WIN_POS+eax*2] |
108,6 → 130,9 |
mov [keyboard_mode],al |
in al,0x60 |
send_scancode: |
mov [keyboard_data],al |
; ch = scancode |
310,11 → 335,6 |
.exit.irq1: |
mov [check_idle_semaphore],5 |
; mov al,0x20 ; ready for next irq |
; out 0x20,al |
; restore_ring3_context |
; iret |
ret |
set_lights: |
/kernel/branches/Kolibri-acpi/hid/mousedrv.inc |
---|
292,21 → 292,20 |
add ecx,eax |
add ecx, [_WinMapAddress] |
mov eax, [CURRENT_TASK] |
movzx ebx, byte [ecx] |
cmp eax,ebx |
cmp al, [ecx] |
je yes_mouse_disable |
movzx ebx, byte [ecx+16] |
cmp eax,ebx |
cmp al, [ecx+16] |
je yes_mouse_disable |
add ebx, 10 |
cmp ebx, [Screen_Max_Y] |
jae no_mouse_disable |
mov ebx,[Screen_Max_X] |
inc ebx |
imul ebx,10 |
add ecx,ebx |
movzx ebx, byte [ecx] |
cmp eax,ebx |
cmp al, [ecx] |
je yes_mouse_disable |
movzx ebx, byte [ecx+16] |
cmp eax,ebx |
cmp al, [ecx+16] |
je yes_mouse_disable |
jmp no_mouse_disable |
yes_mouse_disable: |
/kernel/branches/Kolibri-acpi/kernel.asm |
---|
1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; |
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. |
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. |
;; PROGRAMMING: |
;; Ivan Poddubny |
;; Marat Zakiyanov (Mario79) |
19,6 → 19,17 |
;; SPraid (simba) |
;; Hidnplayr |
;; Alexey Teplov (<Lrz>) |
;; Rus |
;; Nable |
;; shurf |
;; Alver |
;; Maxis |
;; Galkov |
;; CleverMouse |
;; tsdima |
;; turbanoff |
;; Asper |
;; art_zh |
;; |
;; Data in this file was originally part of MenuetOS project which is |
;; distributed under the terms of GNU GPL. It is modified and redistributed as |
220,8 → 231,8 |
; CLEAR 0x280000 - HEAP_BASE |
xor eax,eax |
mov edi,0x280000 |
mov ecx,(HEAP_BASE-OS_BASE-0x280000) / 4 |
mov edi,CLEAN_ZONE |
mov ecx,(HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4 |
cld |
rep stosd |
237,7 → 248,7 |
; SAVE & CLEAR 0-0xffff |
xor esi, esi |
mov edi,0x2F0000 |
mov edi,(BOOT_VAR-OS_BASE) |
mov ecx,0x10000 / 4 |
rep movsd |
mov edi,0x1000 |
605,6 → 616,8 |
; Enable timer IRQ (IRQ0) and hard drives IRQs (IRQ14, IRQ15) |
; they are used: when partitions are scanned, hd_read relies on timer |
call unmask_timer |
stdcall enable_irq, 12 |
stdcall enable_irq, 1 |
stdcall enable_irq, 14 |
stdcall enable_irq, 15 |
621,11 → 634,14 |
call Parser_params |
if ~ defined extended_primary_loader |
; ramdisk image should be loaded by extended primary loader if it exists |
; READ RAMDISK IMAGE FROM HD |
;!!!!!!!!!!!!!!!!!!!!!!! |
include 'boot/rdload.inc' |
;!!!!!!!!!!!!!!!!!!!!!!! |
end if |
; mov [dma_hdd],1 |
; CALCULATE FAT CHAIN FOR RAMDISK |
780,6 → 796,9 |
mov [CPU_FREQ],eax ; save tsc / sec |
; mov ebx, 1000000 |
; div ebx |
; ¢®®¡é¥-â® ¯à®¨§¢®¤¨â¥«ì®áâì ¢ ¤ ®¬ ª®ªà¥â®¬ ¬¥á⥠|
; ᮢ¥à襮 ¥ªà¨â¨ç , ® çâ®¡ë § âªãâì «î¡¨â¥«¥© |
; ®¯â¨¬¨§¨àãîé¨å ª®¬¯¨«ïâ®à®¢ ... |
mov edx, 2251799814 |
mul edx |
shr edx, 19 |
960,7 → 979,7 |
end if |
;-=-=-=-=-=-=- START MULTITASKING -=-=-=-=-=-=-=-=- |
; START MULTITASKING |
; A 'All set - press ESC to start' messages if need |
if preboot_blogesc |
2775,6 → 2794,10 |
mov al, [ecx+window_data+WDATA.fl_wstate] |
stosb |
; Event mask (+71) |
mov EAX, dword [ECX+CURRENT_TASK+TASKDATA.event_mask] |
stosd |
pop esi |
pop edi |
5051,6 → 5074,7 |
yes_shutdown_param: |
cli |
if ~ defined extended_primary_loader |
mov eax, kernel_file ; load kernel.mnt to 0x7000:0 |
push 12 |
pop esi |
5063,8 → 5087,9 |
mov edi,OS_BASE+0x40000 |
mov ecx,1000 |
rep movsb |
end if |
mov esi,OS_BASE+0x2F0000 ; restore 0x0 - 0xffff |
mov esi, BOOT_VAR ; restore 0x0 - 0xffff |
mov edi, OS_BASE |
mov ecx,0x10000/4 |
cld |
/kernel/branches/Kolibri-acpi/kernel32.inc |
---|
144,7 → 144,7 |
.ev_count_ dd ? ;unused ;+20 |
.exc_handler dd ? ;+24 |
.except_mask dd ? ;+28 |
.pl0_stack dd ? ;unused ;+32 |
.pl0_stack dd ? ;+32 |
.heap_base dd ? ;+36 |
.heap_top dd ? ;+40 |
.cursor dd ? ;+44 |
250,6 → 250,7 |
include "video/vesa12.inc" ; Vesa 1.2 functions |
include "video/vesa20.inc" ; Vesa 2.0 functions |
include "video/blitter.inc" ; |
include "video/vga.inc" ; VGA 16 color functions |
include "video/cursors.inc" ; cursors functions |
/kernel/branches/Kolibri-acpi/network/eth_drv/drivers/r6040.inc |
---|
0,0 → 1,813 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; R6040 driver for KolibriOS ;; |
;; ;; |
;; based on R6040.c from linux ;; |
;; ;; |
;; Written by Asper (asper.85@mail.ru) ;; |
;; and hidnplayr (hidnplayr@gmail.com) ;; |
;; ;; |
;; GNU GENERAL PUBLIC LICENSE ;; |
;; Version 2, June 1991 ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;******************************************************************** |
; Interface |
; r6040_reset |
; r6040_probe |
; r6040_poll |
; r6040_transmit |
; |
; These functions are referenced in ethernet.inc |
; |
;******************************************************************** |
;; A few user-configurable values. |
TX_RING_SIZE equ 4 |
RX_RING_SIZE equ 4 |
; ethernet address length |
ETH_ALEN equ 6 |
ETH_HLEN equ (2 * ETH_ALEN + 2) |
ETH_ZLEN equ 60 ; 60 + 4bytes auto payload for |
; mininmum 64bytes frame length |
; system timer frequency |
HZ equ 1000 |
; max time out delay time |
W_MAX_TIMEOUT equ 0x0FFF |
;; Size of the in-memory receive ring. |
RX_BUF_LEN_IDX equ 3 ;; 0==8K, 1==16K, 2==32K, 3==64K |
RX_BUF_LEN equ (8192 << RX_BUF_LEN_IDX) |
;-; Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). |
;-TX_BUF_SIZE equ 1536 |
;-RX_BUF_SIZE equ 1536 |
;; PCI Tuning Parameters |
; Threshold is bytes transferred to chip before transmission starts. |
TX_FIFO_THRESH equ 256 ;; In bytes, rounded down to 32 byte units. |
;; The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024. |
RX_FIFO_THRESH equ 4 ;; Rx buffer level before first PCI xfer. |
RX_DMA_BURST equ 4 ;; Maximum PCI burst, '4' is 256 bytes |
TX_DMA_BURST equ 4 |
;; Operational parameters that usually are not changed. |
PHY1_ADDR equ 1 ;For MAC1 |
PHY2_ADDR equ 3 ;For MAC2 |
PHY_MODE equ 0x3100 ;PHY CHIP Register 0 |
PHY_CAP equ 0x01E1 ;PHY CHIP Register 4 |
;; Time in jiffies before concluding the transmitter is hung. |
TX_TIMEOUT equ ((6000*HZ)/1000) |
R6040_IO_SIZE equ 256 ; RDC MAC I/O Size |
MAX_MAC equ 2 ; MAX RDC MAC |
;************************************************************************** |
; RDC R6040 Register Definitions |
;************************************************************************** |
MCR0 equ 0x00 ;Control register 0 |
MCR1 equ 0x01 ;Control register 1 |
MAC_RST equ 0x0001 ;Reset the MAC |
MBCR equ 0x08 ;Bus control |
MT_ICR equ 0x0C ;TX interrupt control |
MR_ICR equ 0x10 ;RX interrupt control |
MTPR equ 0x14 ;TX poll command register |
MR_BSR equ 0x18 ;RX buffer size |
MR_DCR equ 0x1A ;RX descriptor control |
MLSR equ 0x1C ;Last status |
MMDIO equ 0x20 ;MDIO control register |
MDIO_WRITE equ 0x4000 ;MDIO write |
MDIO_READ equ 0x2000 ;MDIO read |
MMRD equ 0x24 ;MDIO read data register |
MMWD equ 0x28 ;MDIO write data register |
MTD_SA0 equ 0x2C ;TX descriptor start address 0 |
MTD_SA1 equ 0x30 ;TX descriptor start address 1 |
MRD_SA0 equ 0x34 ;RX descriptor start address 0 |
MRD_SA1 equ 0x38 ;RX descriptor start address 1 |
MISR equ 0x3C ;Status register |
MIER equ 0x40 ;INT enable register |
MSK_INT equ 0x0000 ;Mask off interrupts |
RX_FINISH equ 0x0001 ;RX finished |
RX_NO_DESC equ 0x0002 ;No RX descriptor available |
RX_FIFO_FULL equ 0x0004 ;RX FIFO full |
RX_EARLY equ 0x0008 ;RX early |
TX_FINISH equ 0x0010 ;TX finished |
TX_EARLY equ 0x0080 ;TX early |
EVENT_OVRFL equ 0x0100 ;Event counter overflow |
LINK_CHANGED equ 0x0200 ;PHY link changed |
ME_CISR equ 0x44 ;Event counter INT status |
ME_CIER equ 0x48 ;Event counter INT enable |
MR_CNT equ 0x50 ;Successfully received packet counter |
ME_CNT0 equ 0x52 ;Event counter 0 |
ME_CNT1 equ 0x54 ;Event counter 1 |
ME_CNT2 equ 0x56 ;Event counter 2 |
ME_CNT3 equ 0x58 ;Event counter 3 |
MT_CNT equ 0x5A ;Successfully transmit packet counter |
ME_CNT4 equ 0x5C ;Event counter 4 |
MP_CNT equ 0x5E ;Pause frame counter register |
MAR0 equ 0x60 ;Hash table 0 |
MAR1 equ 0x62 ;Hash table 1 |
MAR2 equ 0x64 ;Hash table 2 |
MAR3 equ 0x66 ;Hash table 3 |
MID_0L equ 0x68 ;Multicast address MID0 Low |
MID_0M equ 0x6A ;Multicast address MID0 Medium |
MID_0H equ 0x6C ;Multicast address MID0 High |
MID_1L equ 0x70 ;MID1 Low |
MID_1M equ 0x72 ;MID1 Medium |
MID_1H equ 0x74 ;MID1 High |
MID_2L equ 0x78 ;MID2 Low |
MID_2M equ 0x7A ;MID2 Medium |
MID_2H equ 0x7C ;MID2 High |
MID_3L equ 0x80 ;MID3 Low |
MID_3M equ 0x82 ;MID3 Medium |
MID_3H equ 0x84 ;MID3 High |
PHY_CC equ 0x88 ;PHY status change configuration register |
PHY_ST equ 0x8A ;PHY status register |
MAC_SM equ 0xAC ;MAC status machine |
MAC_ID equ 0xBE ;Identifier register |
MAX_BUF_SIZE equ 0x600 ;1536 |
MBCR_DEFAULT equ 0x012A ;MAC Bus Control Register |
MCAST_MAX equ 3 ;Max number multicast addresses to filter |
;Descriptor status |
DSC_OWNER_MAC equ 0x8000 ;MAC is the owner of this descriptor |
DSC_RX_OK equ 0x4000 ;RX was successfull |
DSC_RX_ERR equ 0x0800 ;RX PHY error |
DSC_RX_ERR_DRI equ 0x0400 ;RX dribble packet |
DSC_RX_ERR_BUF equ 0x0200 ;RX length exceeds buffer size |
DSC_RX_ERR_LONG equ 0x0100 ;RX length > maximum packet length |
DSC_RX_ERR_RUNT equ 0x0080 ;RX packet length < 64 byte |
DSC_RX_ERR_CRC equ 0x0040 ;RX CRC error |
DSC_RX_BCAST equ 0x0020 ;RX broadcast (no error) |
DSC_RX_MCAST equ 0x0010 ;RX multicast (no error) |
DSC_RX_MCH_HIT equ 0x0008 ;RX multicast hit in hash table (no error) |
DSC_RX_MIDH_HIT equ 0x0004 ;RX MID table hit (no error) |
DSC_RX_IDX_MID_MASK equ 3 ;RX mask for the index of matched MIDx |
;PHY settings |
ICPLUS_PHY_ID equ 0x0243 |
RX_INTS equ RX_FIFO_FULL or RX_NO_DESC or RX_FINISH |
TX_INTS equ TX_FINISH |
INT_MASK equ RX_INTS or TX_INTS |
r6040_txb equ (eth_data_start) |
r6040_rxb equ ((r6040_txb+(MAX_BUF_SIZE*TX_RING_SIZE)+32) and 0xfffffff0) |
r6040_tx_ring equ ((r6040_rxb+(MAX_BUF_SIZE*RX_RING_SIZE)+32) and 0xfffffff0) |
r6040_rx_ring equ ((r6040_tx_ring+(r6040_x_head.sizeof*TX_RING_SIZE)+32) and 0xfffffff0) |
virtual at ((r6040_rx_ring+(r6040_x_head.sizeof*RX_RING_SIZE)+32) and 0xfffffff0) |
r6040_private: |
.rx_ring dd ? |
.tx_ring dd ? |
.cur_rx dw ? |
.cur_tx dw ? |
.phy_addr dw ? |
.phy_mode dw ? |
.mcr0 dw ? |
.mcr1 dw ? |
.switch_sig dw ? |
end virtual |
virtual at 0 |
r6040_x_head: |
.status dw ? ;0-1 |
.len dw ? ;2-3 |
.buf dd ? ;4-7 |
.ndesc dd ? ;8-B |
.rev1 dd ? ;C-F |
.vbufp dd ? ;10-13 |
.vndescp dd ? ;14-17 |
.skb_ptr dd ? ;18-1B |
.rev2 dd ? ;1C-1F |
.sizeof: |
end virtual |
; Read a word data from PHY Chip |
proc r6040_phy_read stdcall, phy_addr:dword, reg:dword |
push ecx edx |
mov eax, [phy_addr] |
shl eax, 8 |
add eax, [reg] |
add eax, MDIO_READ |
mov edx, [io_addr] |
add edx, MMDIO |
out dx, ax |
;Wait for the read bit to be cleared. |
mov ecx, 2048 ;limit |
xor eax, eax |
.read: |
in ax, dx |
test ax, MDIO_READ |
jz @f |
dec ecx |
test ecx, ecx |
jnz .read |
@@: |
mov edx, [io_addr] |
add edx, MMRD |
in ax, dx |
and eax, 0xFFFF |
pop edx ecx |
ret |
endp |
; Write a word data to PHY Chip |
proc r6040_phy_write stdcall, phy_addr:dword, reg:dword, val:dword |
push eax ecx edx |
mov eax, [val] |
mov edx, [io_addr] |
add edx, MMWD |
out dx, ax |
;Write the command to the MDIO bus |
mov eax, [phy_addr] |
shl eax, 8 |
add eax, [reg] |
add eax, MDIO_WRITE |
mov edx, [io_addr] |
add edx, MMDIO |
out dx, ax |
;Wait for the write bit to be cleared. |
mov ecx, 2048 ;limit |
xor eax, eax |
.write: |
in ax, dx |
test ax, MDIO_WRITE |
jz @f |
dec ecx |
test ecx, ecx |
jnz .write |
@@: |
pop edx ecx eax |
ret |
endp |
macro r6040_mdio_write reg, val { |
stdcall r6040_phy_read, [io_addr], [r6040_private.phy_addr], reg |
} |
macro r6040_mdio_write reg, val { |
stdcall r6040_phy_write, [io_addr], [r6040_private.phy_addr], reg, val |
} |
proc r6040_init_ring_desc stdcall, desc_ring:dword, size:dword |
push eax ecx esi |
mov ecx, [size] |
test ecx, ecx |
jz .out |
mov esi, [desc_ring] |
mov eax, esi |
.next_desc: |
add eax, r6040_x_head.sizeof - OS_BASE |
mov [esi+r6040_x_head.ndesc], eax |
add eax, OS_BASE |
mov [esi+r6040_x_head.vndescp], eax |
mov esi, eax |
dec ecx |
jnz .next_desc |
sub esi, r6040_x_head.sizeof |
mov eax, [desc_ring] |
mov [esi+r6040_x_head.vndescp], eax |
sub eax, OS_BASE |
mov [esi+r6040_x_head.ndesc], eax |
.out: |
pop esi ecx eax |
ret |
endp |
r6040_init_rxbufs: |
stdcall r6040_init_ring_desc, r6040_rx_ring, RX_RING_SIZE |
; Allocate skbs for the rx descriptors |
mov esi, r6040_rx_ring |
mov ebx, r6040_rxb |
mov ecx, RX_RING_SIZE |
mov eax, r6040_rx_ring |
.next_desc: |
mov [esi+r6040_x_head.skb_ptr], ebx |
mov [esi+r6040_x_head.buf], ebx |
sub [esi+r6040_x_head.buf], OS_BASE |
mov [esi+r6040_x_head.status], DSC_OWNER_MAC |
mov eax, [esi+r6040_x_head.vndescp] |
mov esi, eax |
add ebx, MAX_BUF_SIZE |
dec ecx |
jnz .next_desc |
xor eax, eax |
.out: |
ret |
r6040_probe: |
DEBUGF 1, "Probing r6040\n" |
call adjust_pci_device |
; If PHY status change register is still set to zero |
; it means the bootloader didn't initialize it |
mov edx, [io_addr] |
add edx, PHY_CC |
in ax, dx |
test ax, ax |
jnz @f |
mov eax, 0x9F07 |
out dx, ax |
@@: |
; Set MAC address |
mov ecx, 3 |
mov edi, node_addr |
mov edx, [io_addr] |
add edx, MID_0L |
.mac: |
in ax, dx |
stosw |
add edx, 2 |
dec ecx |
jnz .mac |
; Some bootloaders/BIOSes do not initialize |
; MAC address, warn about that |
and eax, 0xFF |
or eax, [node_addr] |
test eax, eax |
jnz @f |
DEBUGF 1, "K : MAC address not initialized\n" ;, generating random" |
;Asper: Add here generate function call! |
; Temporary workaround: init by constant adress |
mov dword [node_addr], 0x00006000 |
mov word [node_addr+4], 0x0001 |
@@: |
; Init RDC private data |
mov [r6040_private.mcr0], 0x1002 |
;mov [r6040_private.phy_addr], 1 ; Asper: Only one network card is supported now. |
mov [r6040_private.switch_sig], 0 |
; Check the vendor ID on the PHY, if 0xFFFF assume none attached |
stdcall r6040_phy_read, 1, 2 |
cmp ax, 0xFFFF |
jne @f |
DEBUGF 1, "K : Failed to detect an attached PHY\n" ;, generating random" |
mov eax, -1 |
ret |
@@: |
; Set MAC address |
call r6040_mac_address |
; Initialize and alloc RX/TX buffers |
stdcall r6040_init_ring_desc, r6040_tx_ring, TX_RING_SIZE |
call r6040_init_rxbufs ;r6040_alloc_rxbufs |
test eax, eax |
jnz .out |
; Read the PHY ID |
mov [r6040_private.phy_mode], 0x8000 |
stdcall r6040_phy_read, 0, 2 |
mov [r6040_private.switch_sig], ax |
cmp ax, ICPLUS_PHY_ID |
jne @f |
stdcall r6040_phy_write, 29, 31, 0x175C ; Enable registers |
jmp .phy_readen |
@@: |
; PHY Mode Check |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_write, eax, 4, PHY_CAP |
stdcall r6040_phy_write, eax, 0, PHY_MODE |
; if PHY_MODE = 0x3100 |
call r6040_phy_mode_chk |
mov [r6040_private.phy_mode], ax |
jmp .phy_readen |
; end if |
; if not (PHY_MODE and 0x0100) |
mov [r6040_private.phy_mode], 0 |
; end if |
.phy_readen: |
; Set duplex mode |
mov ax, [r6040_private.phy_mode] |
or [r6040_private.mcr0], ax |
; improve performance (by RDC guys) |
stdcall r6040_phy_read, 30, 17 |
or ax, 0x4000 |
stdcall r6040_phy_write, 30, 17, eax |
stdcall r6040_phy_read, 30, 17 |
xor ax, -1 |
or ax, 0x2000 |
xor ax, -1 |
stdcall r6040_phy_write, 30, 17, eax |
stdcall r6040_phy_write, 0, 19, 0x0000 |
stdcall r6040_phy_write, 0, 30, 0x01F0 |
; Initialize all Mac registers |
call r6040_reset |
xor eax, eax |
.out: |
ret |
align 4 |
r6040_reset: |
DEBUGF 1, "Resetting r6040\n" |
push eax ecx edx |
; Mask off Interrupt |
mov eax, MSK_INT |
mov edx, [io_addr] |
add edx, MIER |
out dx, ax |
;Reset RDC MAC |
mov eax, MAC_RST |
mov edx, [io_addr] |
add edx, MCR1 |
out dx, ax |
mov ecx, 2048 ;limit |
.read: |
in ax, dx |
test ax, 0x1 |
jnz @f |
dec ecx |
test ecx, ecx |
jnz .read |
@@: |
;Reset internal state machine |
mov ax, 2 |
mov edx, [io_addr] |
add edx, MAC_SM |
out dx, ax |
xor ax, ax |
out dx, ax |
mov esi, 5 |
call delay_ms |
;MAC Bus Control Register |
mov ax, MBCR_DEFAULT |
mov edx, [io_addr] |
add edx, MBCR |
out dx, ax |
;Buffer Size Register |
mov ax, MAX_BUF_SIZE |
mov edx, [io_addr] |
add edx, MR_BSR |
out dx, ax |
;Write TX ring start address |
mov eax, r6040_tx_ring - OS_BASE ;Asper: Maybe we can just write dword? Hidnplayr: better use word, as described in datasheet. |
mov edx, [io_addr] |
add edx, MTD_SA0 |
out dx, ax |
shr eax, 16 |
add edx, MTD_SA1 - MTD_SA0 |
out dx, ax |
;Write RX ring start address |
mov eax, r6040_rx_ring - OS_BASE ;Asper: Maybe we can just write dword? |
mov edx, [io_addr] |
add edx, MRD_SA0 |
out dx, ax |
shr eax, 16 |
add edx, MRD_SA1 - MRD_SA0 |
out dx, ax |
;Set interrupt waiting time and packet numbers |
xor ax, ax |
mov edx, [io_addr] |
add edx, MT_ICR |
out dx, ax |
;Asper: ~ Disable ints ;Enable interrupts |
;mov ax, MSK_INT ;INT_MASK ;Asper ~ |
;mov edx, [io_addr] |
;add edx, MIER |
;out dx, ax |
;Enable TX and RX |
mov ax, [r6040_private.mcr0] |
or ax, 0x0002 |
mov edx, [io_addr] |
out dx, ax |
;Let TX poll the descriptors |
;we may got called by r6040_tx_timeout which has left |
;some unset tx buffers |
xor ax, ax |
inc ax |
mov edx, [io_addr] |
add edx, MTPR |
out dx, ax |
pop edx ecx eax |
DEBUGF 1, "reset ok!\n" |
; Indicate that we have successfully reset the card |
mov eax, [pci_data] |
mov [eth_status], eax |
ret |
proc r6040_tx_timeout |
push eax edx |
;... |
inc [stats.tx_errors] |
;Reset MAC and re-init all registers |
call r6040_init_mac_regs |
pop edx eax |
ret |
endp |
proc r6040_get_stats |
push eax edx |
mov edx, [io_addr] |
add edx, ME_CNT1 |
in al, dx |
add [stats.rx_crc_errors], al |
mov edx, [io_addr] |
add edx, ME_CNT0 |
in al, dx |
add [stats.multicast], al |
pop edx eax |
ret |
endp |
;... |
proc r6040_phy_mode_chk |
push ebx |
;PHY Link Status Check |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_read, eax, 1 |
test eax, 0x4 |
jnz @f |
mov eax, 0x8000 ;Link Failed, full duplex |
@@: |
;PHY Chip Auto-Negotiation Status |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_read, eax, 1 |
test eax, 0x0020 |
jz .force_mode |
;Auto Negotuiation Mode |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_read, eax, 5 |
mov ebx, eax |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_read, eax, 4 |
and eax, ebx |
test eax, 0x140 |
jz .ret_0 |
jmp .ret_0x8000 |
.force_mode: |
;Force Mode |
movzx eax, [r6040_private.phy_addr] |
stdcall r6040_phy_read, eax, 0 |
test eax, 0x100 |
jz .ret_0 |
.ret_0x8000: |
mov eax, 0x8000 |
pop ebx |
ret |
.ret_0: |
xor eax, eax |
pop ebx |
ret |
endp |
;*************************************************************************** |
; Function |
; r6040_rx |
; Description |
; polls card to see if there is a packet waiting |
; |
; Currently only supports one descriptor per packet, if packet is fragmented |
; between multiple descriptors you will lose part of the packet |
;*************************************************************************** |
r6040_poll: |
push ebx ecx esi edi |
xor eax, eax |
mov [eth_rx_data_len], ax |
movzx eax, [r6040_private.cur_rx] |
mov ebx, eax |
shl ebx, 5 |
mov cx, [ebx+r6040_rx_ring+r6040_x_head.status] ; Read the descriptor status |
test cx, DSC_OWNER_MAC |
jnz .out |
test cx, DSC_RX_ERR ; Global error status set |
jz .no_dsc_rx_err |
;... |
jmp .out |
.no_dsc_rx_err: |
; Packet successfully received |
movzx ecx, [ebx+r6040_rx_ring+r6040_x_head.len] |
and ecx, 0xFFF |
sub ecx, 4 ; Do not count the CRC |
mov [eth_rx_data_len], cx |
mov esi, [ebx+r6040_rx_ring+r6040_x_head.skb_ptr] |
push ecx |
shr ecx, 2 |
mov edi, Ether_buffer |
cld |
rep movsd |
pop ecx |
and ecx, 3 |
rep movsb |
or [ebx+r6040_rx_ring+r6040_x_head.status], DSC_OWNER_MAC |
inc [r6040_private.cur_rx] |
and [r6040_private.cur_rx], RX_RING_SIZE-1 |
xor eax, eax |
.out: |
pop edi esi ecx ebx |
ret |
;*************************************************************************** |
; Function |
; r6040_transmit |
; Description |
; Transmits a packet of data via the ethernet card |
; Pointer to 48 bit destination address in edi |
; Type of packet in bx |
; size of packet in ecx |
; pointer to packet data in esi |
; |
;*************************************************************************** |
r6040_transmit: |
cmp ecx, MAX_BUF_SIZE |
jg .out ; packet is too long |
push edi esi ebx ecx |
movzx eax, [r6040_private.cur_tx] |
shl eax, 5 |
; DEBUGF 1,"R6040: TX buffer status: 0x%x, eax=%u\n", [eax + r6040_tx_ring + r6040_x_head.status]:4, eax |
test [r6040_tx_ring + eax + r6040_x_head.status], 0x8000 ; check if buffer is available |
jz .l3 |
push ecx esi |
mov ecx, [timer_ticks] |
add ecx, 100 |
.l2: |
test [r6040_tx_ring + eax + r6040_x_head.status], 0x8000 |
jz .l5 |
cmp ecx, [timer_ticks] |
jb .l4 |
mov esi, 10 |
call delay_ms |
jmp .l2 |
.l4: |
pop esi ecx |
DEBUGF 1,"R6040: Send timeout\n" |
jmp .out |
.l5: |
pop esi ecx |
.l3: |
push eax |
mov esi, edi |
; point to the current tx buffer |
movzx edi, [r6040_private.cur_tx] |
imul edi, MAX_BUF_SIZE |
add edi, r6040_txb |
lea eax, [edi - OS_BASE] ; real buffer address in eax |
; copy destination address |
movsd |
movsw |
; copy source address |
mov esi, node_addr |
movsd |
movsw |
; copy packet type |
mov [edi], bx |
add edi, 2 |
mov esi, [esp+8+4] |
mov ecx, [esp+4] |
; copy the packet data |
push ecx |
shr ecx,2 |
rep movsd |
pop ecx |
and ecx,3 |
rep movsb |
pop edi |
mov ecx, [esp] |
add ecx, ETH_HLEN |
cmp cx, ETH_ZLEN |
jae @f |
mov cx, ETH_ZLEN |
@@: |
mov [r6040_tx_ring + edi + r6040_x_head.len], cx |
mov [r6040_tx_ring + edi + r6040_x_head.buf], eax |
mov [r6040_tx_ring + edi + r6040_x_head.status], 0x8000 |
; Trigger the MAC to check the TX descriptor |
mov ax, 0x01 |
mov edx, [io_addr] |
add edx, MTPR |
out dx, ax |
inc [r6040_private.cur_tx] |
and [r6040_private.cur_tx], TX_RING_SIZE-1 |
xor eax, eax |
pop ecx ebx esi edi |
.out: |
ret |
r6040_mac_address: |
push eax ecx edx esi edi |
; MAC operation register |
mov ax, 1 |
mov edx, [io_addr] |
add edx, MCR1 |
out dx, ax |
; Reset MAC |
mov ax, 2 |
mov edx, [io_addr] |
add edx, MAC_SM |
out dx, ax |
; Reset internal state machine |
xor ax, ax |
out dx, ax |
mov esi, 5 |
call delay_ms |
; Restore MAC Address |
mov ecx, 3 |
mov edi, node_addr |
mov edx, [io_addr] |
add edx, MID_0L |
.mac: |
in ax, dx |
stosw |
add edx, 2 |
dec ecx |
jnz .mac |
pop edi esi edx ecx eax |
ret |
/kernel/branches/Kolibri-acpi/network/eth_drv/drivers/rtl8139.inc |
---|
323,14 → 323,14 |
out dx, al |
; 32k Rxbuffer, unlimited dma burst, no wrapping, no rx threshold |
; accept broadcast packets, accept physical match packets |
mov ax, RTL8139_RX_CONFIG |
mov eax, RTL8139_RX_CONFIG |
add edx, RTL8139_REG_RXCONFIG - RTL8139_REG_COMMAND |
out dx, ax |
out dx, eax |
; 1024 bytes DMA burst, total retries = 16 + 8 * 16 = 144 |
mov ax, (RTL8139_TX_MXDMA shl RTL8139_BIT_TX_MXDMA) \ |
mov eax, (RTL8139_TX_MXDMA shl RTL8139_BIT_TX_MXDMA) \ |
or (RTL8139_TXRR shl RTL8139_BIT_TXRR) |
add edx, RTL8139_REG_TXCONFIG - RTL8139_REG_RXCONFIG |
out dx, ax |
out dx, eax |
; enable auto negotiation |
add edx, RTL8139_REG_BMCR - RTL8139_REG_TXCONFIG |
in ax, dx |
/kernel/branches/Kolibri-acpi/network/eth_drv/ethernet.inc |
---|
103,6 → 103,7 |
include "drivers/pcnet32.inc" |
include "drivers/rtl8169.inc" |
include "drivers/forcedeth.inc" |
include "drivers/r6040.inc" |
; PCICards |
; ======== |
128,25 → 129,25 |
dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable ; tested by hidnplayr: works ok |
dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
;dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
dd 0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0 |
188,18 → 189,12 |
dd 0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0 |
dd 0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
dd 0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
dd 0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
dd 0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0 |
;dd 0x08031516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
; following cards are untested |
dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0 |
;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable |
dd 0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; nVidia Corporation nForce2 Ethernet Controller |
dd 0x01c310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
dd 0x00D610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
241,6 → 236,8 |
dd 0x0ab310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
dd 0x0d7d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
dd 0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0 |
rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
endg |
/kernel/branches/Kolibri-acpi/video/blitter.inc |
---|
0,0 → 1,444 |
struc BLITTER |
{ |
.dc.xmin rd 1 ; 0 |
.dc.ymin rd 1 ; 4 |
.dc.xmax rd 1 ; 8 |
.dc.ymax rd 1 ; 12 |
.sc: |
.sc.xmin rd 1 ; 16 |
.sc.ymin rd 1 ; 20 |
.sc.xmax rd 1 ; 24 |
.sc.ymax rd 1 ; 28 |
.dst_x rd 1 ; 32 |
.dst_y rd 1 ; 36 |
.src_x rd 1 ; 40 |
.src_y rd 1 ; 44 |
.w rd 1 ; 48 |
.h rd 1 ; 52 |
.bitmap rd 1 ; 56 |
.stride rd 1 ; 60 |
} |
virtual at 0 |
BLITTER BLITTER |
end virtual |
align 4 |
__L1OutCode: |
push ebx |
mov ebx, 8 |
cmp edx, [eax] |
jl .L2 |
xor ebx, ebx |
cmp edx, [eax+8] |
setg bl |
sal ebx, 2 |
.L2: |
cmp ecx, [eax+4] |
jge .L3 |
or ebx, 1 |
jmp .L4 |
.L3: |
cmp ecx, [eax+12] |
jle .L4 |
or ebx, 2 |
.L4: |
mov eax, ebx |
pop ebx |
ret |
align 4 |
block_clip: |
push ebp |
push edi |
push esi |
push ebx |
sub esp, 4 |
mov ebx, eax |
mov [esp], edx |
mov ebp, ecx |
mov ecx, [ecx] |
mov edx, [edx] |
call __L1OutCode |
mov esi, eax |
mov edx, [esp+28] |
mov ecx, [edx] |
.L21: |
mov eax, [esp+24] |
mov edx, [eax] |
mov eax, ebx |
call __L1OutCode |
mov edi, eax |
.L20: |
mov eax, edi |
and eax, esi |
jne .L9 |
cmp esi, edi |
je .L9 |
test esi, esi |
jne .L10 |
test edi, 1 |
je .L11 |
mov eax, [ebx+4] |
jmp .L25 |
.L11: |
test edi, 2 |
je .L13 |
mov eax, [ebx+12] |
.L25: |
mov edx, [esp+28] |
jmp .L22 |
.L13: |
test edi, 4 |
je .L14 |
mov eax, [ebx+8] |
jmp .L26 |
.L14: |
and edi, 8 |
je .L12 |
mov eax, [ebx] |
.L26: |
mov edx, [esp+24] |
.L22: |
mov [edx], eax |
.L12: |
mov eax, [esp+28] |
mov ecx, [eax] |
jmp .L21 |
.L10: |
test esi, 1 |
je .L16 |
mov eax, [ebx+4] |
jmp .L23 |
.L16: |
test esi, 2 |
je .L18 |
mov eax, [ebx+12] |
.L23: |
mov [ebp+0], eax |
jmp .L17 |
.L18: |
test esi, 4 |
je .L19 |
mov eax, [ebx+8] |
jmp .L24 |
.L19: |
and esi, 8 |
je .L17 |
mov eax, [ebx] |
.L24: |
mov edx, [esp] |
mov [edx], eax |
.L17: |
mov ecx, [ebp+0] |
mov eax, [esp] |
mov edx, [eax] |
mov eax, ebx |
call __L1OutCode |
mov esi, eax |
jmp .L20 |
.L9: |
add esp, 4 |
pop ebx |
pop esi |
pop edi |
pop ebp |
ret |
align 4 |
blit_clip: |
.sx0 equ 36 |
.sy0 equ 32 |
.sx1 equ 28 |
.sy1 equ 24 |
.dx0 equ 20 |
.dy0 equ 16 |
.dx1 equ 12 |
.dy1 equ 8 |
push edi |
push esi |
push ebx |
sub esp, 40 |
mov ebx, ecx |
mov edx, [ecx+BLITTER.src_x] |
mov [esp+.sx0], edx |
mov eax, [ecx+BLITTER.src_y] |
mov [esp+.sy0], eax |
add edx, [ecx+BLITTER.w] |
dec edx |
mov [esp+.sx1], edx |
add eax, [ecx+BLITTER.h] |
dec eax |
mov [esp+.sy1], eax |
lea ecx, [esp+.sy0] |
lea edx, [esp+.sx0] |
lea eax, [ebx+BLITTER.sc] |
lea esi, [esp+.sy1] |
mov [esp+4], esi |
lea esi, [esp+.sx1] |
mov [esp], esi |
call block_clip |
mov esi, 1 |
test eax, eax |
jne .L28 |
mov edi, [esp+.sx0] |
mov edx, [ebx+BLITTER.dst_x] |
add edx, edi |
sub edx, [ebx+BLITTER.src_x] |
mov [esp+.dx0], edx |
mov ecx, [esp+.sy0] |
mov eax, [ebx+BLITTER.dst_y] |
add eax, ecx |
sub eax, [ebx+BLITTER.src_y] |
mov [esp+.dy0], eax |
sub edx, edi |
add edx, [esp+.sx1] |
mov [esp+.dx1], edx |
sub eax, ecx |
add eax, [esp+.sy1] |
mov [esp+.dy1], eax |
lea ecx, [esp+.dy0] |
lea edx, [esp+.dx0] |
lea eax, [esp+.dy1] |
mov [esp+4], eax |
lea eax, [esp+.dx1] |
mov [esp], eax |
mov eax, ebx |
call block_clip |
test eax, eax |
jne .L28 |
mov edx, [esp+.dx0] |
mov eax, [esp+.dx1] |
inc eax |
sub eax, edx |
mov [ebx+BLITTER.w], eax |
mov eax, [esp+.dy0] |
mov ecx, [esp+.dy1] |
inc ecx |
sub ecx, eax |
mov [ebx+BLITTER.h], ecx |
mov ecx, [ebx+BLITTER.src_x] |
add ecx, edx |
sub ecx, [ebx+BLITTER.dst_x] |
mov [ebx+BLITTER.src_x], ecx |
mov ecx, [ebx+BLITTER.src_y] |
add ecx, eax |
sub ecx, [ebx+BLITTER.dst_y] |
mov [ebx+BLITTER.src_y], ecx |
mov [ebx+BLITTER.dst_x], edx |
mov [ebx+BLITTER.dst_y], eax |
xor esi, esi |
.L28: |
mov eax, esi |
add esp, 40 |
pop ebx |
pop esi |
pop edi |
purge .sx0 |
purge .sy0 |
purge .sx1 |
purge .sy1 |
purge .dx0 |
purge .dy0 |
purge .dx1 |
purge .dy1 |
ret |
align 4 |
blit_32: |
push ebp |
push edi |
push esi |
push ebx |
sub esp, 72 |
mov eax, [TASK_BASE] |
mov ebx, [eax-twdw + WDATA.box.width] |
mov edx, [eax-twdw + WDATA.box.height] |
xor eax, eax |
mov [esp+BLITTER.dc.xmin], eax |
mov [esp+BLITTER.dc.ymin], eax |
mov [esp+BLITTER.dc.xmax], ebx |
mov [esp+BLITTER.dc.ymax], edx |
mov [esp+BLITTER.sc.xmin], eax |
mov [esp+BLITTER.sc.ymin], eax |
mov eax, [ecx+24] |
dec eax |
mov [esp+BLITTER.sc.xmax], eax |
mov eax, [ecx+28] |
dec eax |
mov [esp+BLITTER.sc.ymax], eax |
mov eax, [ecx] |
mov [esp+BLITTER.dst_x], eax |
mov eax, [ecx+4] |
mov [esp+BLITTER.dst_y], eax |
mov eax, [ecx+16] |
mov [esp+BLITTER.src_x], eax |
mov eax, [ecx+20] |
mov [esp+BLITTER.src_y], eax |
mov eax, [ecx+8] |
mov [esp+BLITTER.w], eax |
mov eax, [ecx+12] |
mov [esp+BLITTER.h], eax |
mov eax, [ecx+32] |
mov [esp+56], eax |
mov eax, [ecx+36] |
mov [esp+60], eax |
mov ecx, esp |
call blit_clip |
test eax, eax |
jne .L57 |
inc [mouse_pause] |
call [_display.disable_mouse] |
mov eax, [TASK_BASE] |
mov ebx, [esp+BLITTER.dst_x] |
mov ebp, [esp+BLITTER.dst_y] |
add ebx, [eax-twdw + WDATA.box.left] |
add ebp, [eax-twdw + WDATA.box.top] |
mov edi, ebp |
imul edi, [_display.pitch] |
imul ebp, [_display.width] |
add ebp, ebx |
add ebp, [_WinMapAddress] |
mov eax, [esp+BLITTER.src_y] |
imul eax, [esp+BLITTER.stride] |
mov esi, [esp+BLITTER.src_x] |
lea esi, [eax+esi*4] |
add esi, [esp+BLITTER.bitmap] |
mov ecx, [esp+BLITTER.h] |
mov edx, [esp+BLITTER.w] |
test ecx, ecx ;FIXME check clipping |
jz .L57 |
test edx, edx |
jz .L57 |
cmp [_display.bpp], 32 |
jne .core_24 |
lea edi, [edi+ebx*4] |
mov ebx, [CURRENT_TASK] |
align 4 |
.outer32: |
xor ecx, ecx |
align 4 |
.inner32: |
cmp [ebp+ecx], bl |
jne @F |
mov eax, [esi+ecx*4] |
mov [LFB_BASE+edi+ecx*4], eax |
@@: |
inc ecx |
dec edx |
jnz .inner32 |
add esi, [esp+BLITTER.stride] |
add edi, [_display.pitch] |
add ebp, [_display.width] |
mov edx, [esp+BLITTER.w] |
dec [esp+BLITTER.h] |
jnz .outer32 |
.done: |
dec [mouse_pause] |
call [draw_pointer] |
.L57: |
add esp, 72 |
pop ebx |
pop esi |
pop edi |
pop ebp |
ret |
.core_24: |
lea ebx, [ebx+ebx*2] |
lea edi, [LFB_BASE+edi+ebx] |
mov ebx, [CURRENT_TASK] |
align 4 |
.outer24: |
mov [esp+64], edi |
xor ecx, ecx |
align 4 |
.inner24: |
cmp [ebp+ecx], bl |
jne @F |
mov eax, [esi+ecx*4] |
lea edi, [edi+ecx*2] |
mov [edi+ecx], ax |
shr eax, 16 |
mov [edi+ecx+2], al |
@@: |
mov edi, [esp+64] |
inc ecx |
dec edx |
jnz .inner24 |
add esi, [esp+BLITTER.stride] |
add edi, [_display.pitch] |
add ebp, [_display.width] |
mov edx, [esp+BLITTER.w] |
dec [esp+BLITTER.h] |
jnz .outer24 |
jmp .done |