kolibrios-fun/programs/develop/fp/rtl/kos.inc
bw f23fc38433 FreePascal RTL
git-svn-id: svn://kolibrios.org@616 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-08-29 09:16:31 +00:00

709 lines
12 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{cp866}
{ User interface }
procedure kos_definewindow(x, y, w, h: Word; style, header, clframe: DWord); assembler; register;
asm
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi
pushl %edi
movl %eax, %ebx
xchgl %edx, %ecx
movl header, %esi
shll $16, %ebx
shll $16, %ecx
movl clframe, %edi
movw %dx, %bx
movw h, %cx
xorl %eax, %eax
movl style, %edx
decl %ebx {㬥­ìè¨âì è¨à¨­ã ­  1}
decl %ecx {㬥­ìè¨âì ¢ëá®âã ­  1}
int $0x40
popl %edi
popl %esi
popl %edx
popl %ecx
popl %ebx
end;
procedure kos_movewindow(x, y, w, h: DWord); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi
movl %eax, %ebx
xchgl %ecx, %edx
movl $67, %eax
movl h, %esi
decl %edx {㬥­ìè¨âì è¨à¨­ã ­  1}
decl %esi {㬥­ìè¨âì ¢ëá®âã ­  1}
int $0x40
popl %esi
popl %edx
popl %ecx
popl %ebx
popl %eax
end;
function kos_getkey(): DWord; assembler; register;
asm
movl $2, %eax
int $0x40
end;
function kos_getevent(wait: Boolean = True): DWord; assembler; register;
asm
andl $1, %eax
xorb $1, %al
addl $10, %eax
int $0x40
end;
function kos_waitevent(timeout: DWord): DWord; assembler; register;
asm
pushl %ebx
movl $23, %ebx
xchgl %eax, %ebx
int $0x40
popl %ebx
end;
function kos_getbutton(): DWord; assembler; register;
asm
movl $17, %eax
int $0x40
shrl $8, %eax
andl $0xFF, %eax
end;
function kos_getmousepos(): TKosPoint; assembler; register;
{@return: x*65536 + y}
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %eax
movl $37, %eax
xorl %ebx, %ebx
int $0x40
movswl %ax, %ecx
popl %ebx
shrl $16, %eax
movl %ecx, TKosPoint.Y(%ebx)
movl %eax, TKosPoint.X(%ebx)
popl %ecx
popl %ebx
popl %eax
end;
function kos_getmousewinpos(): TKosPoint; assembler; register;
{@return: x*65536 + y}
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %eax
movl $37, %eax
movl $1, %ebx
int $0x40
movswl %ax, %ecx
popl %ebx
shrl $16, %eax
movl %ecx, TKosPoint.Y(%ebx)
movl %eax, TKosPoint.X(%ebx)
popl %ecx
popl %ebx
popl %eax
end;
function kos_getmousebuttons(): DWord; assembler; register;
{@return:
¡¨â 0 ãáâ ­®¢«¥­ = «¥¢ ï ª­®¯ª  ­ ¦ â 
¡¨â 1 ãáâ ­®¢«¥­ = ¯à ¢ ï ª­®¯ª  ­ ¦ â 
¡¨â 2 ãáâ ­®¢«¥­ = á।­ïï ª­®¯ª  ­ ¦ â 
¡¨â 3 ãáâ ­®¢«¥­ = 4-ï ª­®¯ª  ­ ¦ â 
¡¨â 4 ãáâ ­®¢«¥­ = 5-ï ª­®¯ª  ­ ¦ â }
asm
pushl %ebx
movl $37, %eax
movl $2, %ebx
int $0x40
popl %ebx
end;
procedure kos_maskevents(mask: DWord); assembler; register;
asm
pushl %ebx
xchgl %eax, %ebx
movl $40, %eax
int $0x40
xchgl %eax, %ebx
popl %ebx
end;
procedure kos_setcaption(caption: PChar); assembler; register;
asm
pushl %ecx
pushl %ebx
xchgl %eax, %ecx
movl $1, %ebx
movl $71, %eax
int $0x40
xchgl %eax, %ecx
popl %ebx
popl %ecx
end;
{ Graphics }
procedure kos_begindraw(); assembler; register;
asm
pushl %ebx
movl $12, %eax
movl $1, %ebx
int $0x40
popl %ebx
end;
procedure kos_enddraw(); assembler; register;
asm
pushl %ebx
movl $12, %eax
movl $2, %ebx
int $0x40
popl %ebx
end;
procedure kos_putpixel(x, y: Word; color: DWord); assembler; register;
asm
pushl %ebx
movl %eax, %ebx
xchgl %edx, %ecx
movl $1, %eax
int $0x40
xchgl %edx, %ecx
popl %ebx
end;
procedure kos_drawtext(x, y: Word; text: String; flags, bgcolor: DWord); assembler; register;
label nobg;
asm
pusha
shll $16, %eax
pushl %ecx
movl flags, %ecx {ä« £¨, 梥â}
movl bgcolor, %edi
movw %dx, %ax
andl $0x7FFFFFFF, %ecx
btl $31, %edi
jnc nobg
orl $0x40000000, %ecx
nobg:
popl %edx
movl %eax, %ebx {ª®®à¤¨­ âë}
movzbl (%edx), %esi {¤«¨­  áâப¨}
movl $4, %eax {­®¬¥à ä㭪樨}
incl %edx {㪠§ â¥«ì ­  áâபã}
andl $0xFFFFFF, %edi
int $0x40
popa
end;
procedure kos_drawrect(x, y, w, h: Word; color: DWord); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
movl %eax, %ebx
xchgl %edx, %ecx
shll $16, %ebx
shll $16, %ecx
movl $13, %eax
movw %dx, %bx
movw h, %cx
movl color, %edx
int $0x40
popl %edx
popl %ecx
popl %ebx
popl %eax
end;
procedure kos_drawline(x1, y1, x2, y2: Word; color: DWord = $000000); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
xchgl %eax, %ecx
xchgl %ecx, %edx
movl color, %ebx
{eax - x2, ebx - color, ecx - y1, edx - x1}
shll $16, %ecx
shll $16, %edx
movw %ax, %dx
movw y2, %cx
movl $38, %eax
xchgl %ebx, %edx
int $0x40
popl %edx
popl %ecx
popl %ebx
popl %eax
end;
procedure kos_drawimage(x, y, w, h, depth: DWord; image: Pointer; palette: Pointer; xoffset: DWord); assembler; register;
asm
pusha
shll $16, %eax
shll $16, %ecx
orl %eax, %edx
orl h, %ecx
movl depth, %esi
movl image, %ebx
movl palette, %edi
movl xoffset, %ebp
movl $65, %eax
int $0x40
popa
end;
procedure kos_drawimage24(x, y, w, h: DWord; image: Pointer); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
shll $16, %eax
shll $16, %ecx
orl %eax, %edx
orl h, %ecx
movl image, %ebx
movl $7, %eax
int $0x40
popl %edx
popl %ecx
popl %ebx
popl %eax
end;
{ Work with system }
{ Work with system - System services }
function kos_killthread(tid: TThreadID): Boolean; assembler; register;
asm
pushl %ecx
pushl %ebx
movl $18, %ecx
movl $18, %ebx
xchgl %eax, %ecx
int $0x40
andl $1, %eax
popl %ebx
popl %ecx
xorb $1, %al
end;
procedure kos_setactivewindow(slot: TThreadSlot); assembler; register;
asm
pushl %ecx
pushl %ebx
movl $18, %ecx
movl $3, %ebx
xchgl %eax, %ecx
int $0x40
xchgl %eax, %ecx
popl %ebx
popl %ecx
end;
{$ifdef EMULATOR}
function kos_getthreadslot(tid: TThreadID): TThreadSlot;
var
ThreadInfo: TKosThreadInfo;
HighThreadSlot: TThreadSlot;
begin
Result := 0;
repeat
Inc(Result);
HighThreadSlot := kos_threadinfo(@ThreadInfo, Result);
until (Result > HighThreadSlot) or (ThreadInfo.ThreadID = tid);
end;
{$else}
function kos_getthreadslot(tid: TThreadID): TThreadSlot; assembler; register;
asm
pushl %ecx
pushl %ebx
movl $18, %ecx
movl $21, %ebx
xchgl %eax, %ecx
int $0x40
popl %ebx
popl %ecx
end;
{$endif}
{ Work with system - Set system parameters }
procedure kos_enablepci(); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
movl $21, %eax
movl $12, %ebx
movl $1, %ecx
int $0x40
popl %ecx
popl %ebx
popl %eax
end;
{ Work with system - Internal system services }
procedure kos_switchthread(); assembler; register;
asm
pushl %eax
pushl %ebx
movl $68, %eax
movl $1, %ebx
int $0x40
popl %ebx
popl %eax
end;
function kos_initheap(): DWord; assembler; register;
asm
pushl %ebx
movl $68, %eax
movl $11, %ebx
int $0x40
popl %ebx
end;
function kos_alloc(size: DWord): Pointer; assembler; register;
asm
pushl %ebx
pushl %ecx
movl %eax, %ecx
movl $68, %eax
movl $12, %ebx
int $0x40
popl %ecx
popl %ebx
end;
function kos_free(ptr: Pointer): Boolean; assembler; register;
asm
pushl %ebx
pushl %ecx
movl %eax, %ecx
movl $68, %eax
movl $13, %ebx
int $0x40
popl %ecx
popl %ebx
end;
function kos_loaddriver(name: PChar): THandle; assembler; register;
asm
pushl %ebx
pushl %ecx
movl %eax, %ecx
movl $68, %eax
movl $16, %ebx
int $0x40
popl %ecx
popl %ebx
end;
{ Processes and threads }
function kos_threadinfo(info: PKosThreadInfo; slot: TThreadSlot): DWord; assembler; register;
asm
pushl %ebx
movl %eax, %ebx
xchgl %edx, %ecx
movl $9, %eax
int $0x40
xchgl %edx, %ecx
popl %ebx
end;
function kos_newthread(entry, stack: Pointer): TThreadID; assembler; register;
asm
pushl %ebx
pushl %ecx
movl $1, %ebx
movl %eax, %ecx
movl $51, %eax
int $0x40
popl %ecx
popl %ebx
end;
procedure kos_initipc(ipc: PKosIPC; size: DWord); assembler; register;
asm
pushl %ebx
pushl %ecx
movl $60, %ecx
movl $1, %ebx
xchgl %eax, %ecx
int $0x40
popl %ecx
popl %ebx
end;
function kos_sendmsg(tid: TThreadID; msg: Pointer; size: DWord): DWord; assembler; register;
{@return:
0 - ãᯥ譮
1 - ¯à¨ñ¬­¨ª ­¥ ®¯à¥¤¥«¨« ¡ãä¥à ¤«ï IPC-á®®¡é¥­¨©
(¬®¦¥â ¡ëâì, ¥éñ ­¥ ãᯥ«,   ¬®¦¥â ¡ëâì, íâ® ­¥ â®â ¯®â®ª, ª®â®àë© ­ã¦¥­)
2 - ¯à¨ñ¬­¨ª § ¡«®ª¨à®¢ « IPC-¡ãä¥à; ¯®¯à®¡ã©â¥ ­¥¬­®£® ¯®¤®¦¤ âì
3 - ¯¥à¥¯®«­¥­¨¥ IPC-¡ãä¥à  ¯à¨ñ¬­¨ª 
4 - ¯à®æ¥áá /¯®â®ª  á â ª¨¬ PID ­¥ áãé¥áâ¢ã¥â}
asm
pushl %esi
pushl %ebx
movl $60, %esi
movl $2, %ebx
xchgl %ecx, %esi
xchgl %eax, %ecx
int $0x40
xchgl %ecx, %esi
popl %ebx
popl %esi
end;
function kos_resizemem(size: DWord): Boolean; assembler; register;
asm
pushl %ebx
pushl %ecx
movl %eax, %ecx
movl $64, %eax
movl $1, %ebx
int $0x40
xorb $1, %al
popl %ecx
popl %ebx
end;
{ File system }
{ File system - Work with the current folder }
procedure kos_setdir(path: PChar); assembler; register;
asm
pushl %ecx
pushl %ebx
movl $30, %ecx
movl $1, %ebx
xchgl %eax, %ecx
int $0x40
popl %ebx
popl %ecx
end;
function kos_getdir(path: PChar; size: DWord): DWord; assembler; register;
asm
pushl %ecx
pushl %ebx
movl $30, %ecx
movl $2, %ebx
xchgl %eax, %ecx
int $0x40
popl %ebx
popl %ecx
end;
{ File system - Work with file system with long names support }
function kos_readfile(kosfile: PKosFile; var readed: Longint): DWord; assembler; register;
asm
pushl %ebx
movl $70, %ebx
xchgl %eax, %ebx
movl $0, (%ebx)
int $0x40
movl %ebx, (%edx)
popl %ebx
end;
function kos_rewritefile(kosfile: PKosFile; var writed: Longint): DWord; assembler; register;
asm
pushl %ebx
movl $70, %ebx
xchgl %eax, %ebx
movl $2, (%ebx)
int $0x40
movl %ebx, (%edx)
popl %ebx
end;
function kos_writefile(kosfile: PKosFile; var writed: Longint): DWord; assembler; register;
asm
pushl %ebx
movl $70, %ebx
xchgl %eax, %ebx
movl $3, (%ebx)
int $0x40
movl %ebx, (%edx)
popl %ebx
end;
function kos_fileinfo(kosfile: PKosFile): DWord; assembler; register;
asm
pushl %ebx
movl $70, %ebx
xchgl %eax, %ebx
movl $5, (%ebx)
int $0x40
popl %ebx
end;
{ Work with hardware }
function kos_readport(index: DWord): DWord; assembler; register;
label ok, exit;
asm
pushl %ecx
pushl %ebx
xchgl %eax, %ecx {index}
movl $43, %eax
orl $0x80000000, %ecx {index}
int $0x40
orl %eax, %eax
jzl ok
movl $-1, %eax
jmp exit
ok:
movl %ebx, %eax
exit:
popl %ebx
popl %ecx
end;
procedure kos_writeport(index, value: DWord); assembler; register;
asm
pushl %eax
pushl %ebx
pushl %ecx
xchgl %edx, %ebx {value}
xchgl %eax, %ecx {index}
movl $43, %eax
int $0x40
xchgl %edx, %ebx
popl %ecx
popl %ebx
popl %eax
end;
function kos_reserveport(port: DWord): Boolean; assembler; register;
asm
pushl %ebx
pushl %ecx
pushl %edx
movl %eax, %ecx {port}
movl $46, %eax
movl %ecx, %edx {port}
xorl %ebx, %ebx
int $0x40
xorb $1, %al
popl %edx
popl %ecx
popl %ebx
end;
{ Work with hardware - Low-level access to PCI}
function kos_lastpcibus(): Byte; assembler; register;
asm
pushl %ebx
movl $62, %eax
movl $1, %ebx
int $0x40
popl %ebx
end;
function kos_readpcib(bus, dev, func, reg: Byte): Byte; assembler; register;
asm
pushl %ebx
pushl %ecx
pushl %edx
shlb $3, %dl {dev}
movb %al, %bh {bus}
shlw $8, %cx {func}
movb $4, %bl
movb reg, %cl {func}
andb $7, %ch {func}
movl $62, %eax
orb %dl, %ch {dev/func}
int $0x40
popl %edx
popl %ecx
popl %ebx
end;
function kos_readpciw(bus, dev, func, reg: Byte): Word; assembler; register;
asm
pushl %ebx
pushl %ecx
pushl %edx
shlb $3, %dl {dev}
movb %al, %bh {bus}
shlw $8, %cx {func}
movb $5, %bl
movb reg, %cl {reg}
andb $7, %ch {func}
movl $62, %eax
orb %dl, %ch {dev/func}
int $0x40
popl %edx
popl %ecx
popl %ebx
end;
function kos_readpcid(bus, dev, func, reg: Byte): DWord; assembler; register;
asm
pushl %ebx
pushl %ecx
pushl %edx
shlb $3, %dl {dev}
movb %al, %bh {bus}
shlw $8, %cx {func}
movb $6, %bl
movb reg, %cl {reg}
andb $7, %ch {func}
movl $62, %eax
orb %dl, %ch {dev/func}
int $0x40
popl %edx
popl %ecx
popl %ebx
end;
{ Other }
procedure kos_delay(ms: DWord); assembler; register;
asm
pushl %ebx
movl %eax, %ebx
movl $5, %eax
int $0x40
popl %ebx
end;