📄 rdos.s
字号:
/*######################################################################## RDOS operating system# Copyright (C) 1988-2006, Leif Ekblad## This library is free software; you can redistribute it and/or modify# it under the terms of the GNU Lesser General Public License as published# by the Free Software Foundation; either version 2.1 of the License, or# (at your option) any later version.## This library is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU Lesser General Public License for more details.## You should have received a copy of the GNU Lesser General Public# License along with this library; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## The author of this program may be contacted at leif@rdos.net## rdos.S # GCC based interface to RDOS kernel ###########################################################################*/#include "user.def" .macro UserGate nr .byte 0x9A .long \nr .word 2 .endm /*############################################################################ Name : RdosSwapShort## Purpose....: Byte reverse a short int## Returns....: Result###########################################################################*/ .global RdosSwapShort RdosSwapShort: pushl %ebp movl %esp,%ebp movw 8(%ebp),%ax xchgb %ah,%al leave ret/*############################################################################ Name : RdosSwapLong## Purpose....: Byte reverse a long int## Returns....: Result###########################################################################*/ .global RdosSwapLong RdosSwapLong: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax xchgb %ah,%al roll $16,%eax xchgb %ah,%al leave ret/*############################################################################ Name : LocalToNetworkLong## Purpose....: Convert a local long to network format## Returns....: Network format###########################################################################*/ .global LocalToNetworkLong LocalToNetworkLong: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax xchgb %ah,%al roll $16,%eax xchgb %ah,%al leave ret/*############################################################################ Name : NetworkToLocalLong## Purpose....: Convert a network long to local format## Returns....: Local format###########################################################################*/ .global NetworkToLocalLong NetworkToLocalLong: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax xchgb %ah,%al roll $16,%eax xchgb %ah,%al leave ret/*############################################################################ Name : RdosGetThreadHandle## Purpose....: Get current thread handle## Returns....: Thread ID###########################################################################*/ .global RdosGetThreadHandle RdosGetThreadHandle: pushl %ebp movl %esp,%ebp UserGate get_thread_nr movzx %ax,%eax leave ret/*############################################################################ Name : RdosGetThreadState## Purpose....: Get thread state## Parameters.: Thread ## State buffer###########################################################################*/ .global RdosGetThreadState RdosGetThreadState: pushl %ebp movl %esp,%ebp push %edi movl 8(%ebp),%eax movl 12(%ebp),%edx UserGate get_thread_state_nr jc rgtsFail movl $1,%eax jmp rgtsDone rgtsFail: xorl %eax,%eaxrgtsDone: popl %edi leave ret/*############################################################################ Name : RdosSuspendThread## Purpose....: Suspend thread## Parameters.: Thread ############################################################################*/ .global RdosSuspendThread RdosSuspendThread: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax UserGate suspend_thread_nr jc rsfFail movl $1,%eax jmp rsfDone rsfFail: xorl %eax,%eaxrsfDone: leave ret /*############################################################################ Name : RdosExec## Purpose....: Execute a program## Parameters.: Program# Commandline###########################################################################*/ .global RdosExec RdosExec: pushl %ebp movl %esp,%ebp pushl %esi pushl %edi movl 8(%ebp),%esi movl 12(%ebp),%edi UserGate load_exe_nr UserGate get_exit_code_nr popl %edi popl %esi leave ret /*############################################################################ Name : RdosSpawn## Purpose....: Create new process and run a program## Parameters.: Program# Commandline# StartDir###########################################################################*/ .global RdosSpawn RdosSpawn: pushl %ebp movl %esp,%ebp pushl %fs pushl %ebx pushl %edx pushl %esi pushl %edi movw %ds,%dx movw %dx,%fs xorl %edx,%edx movl 8(%ebp),%esi movl 12(%ebp),%edi movl 16(%ebp),%ebx UserGate spawn_exe_nr jc rsFail movzx %dx,%eax jmp rsDone rsFail: xorl %eax,%eaxrsDone: popl %edi popl %esi popl %edx popl %ebx popw %fs leave ret /*############################################################################ Name : RdosCpuReset## Purpose....: Cpu reset###########################################################################*/ .global RdosCpuReset RdosCpuReset: pushl %ebp movl %esp,%ebp UserGate cpu_reset_nr leave ret /*############################################################################ Name : RdosGetVersion## Purpose....: Get RDOS version## Parameters.: &major# &minor# &release###########################################################################*/ .global RdosGetVersion RdosGetVersion: pushl %ebp movl %esp,%ebp pushl %eax pushl %ecx pushl %edx pushl %edi UserGate get_version_nr movzx %dx,%edx movl 8(%ebp),%edi movl %edx,(%edi) movzx %ax,%eax movl 12(%ebp),%edi movl %eax,(%edi) movzx %cx,%eax movl 16(%ebp),%edi movl %eax,(%edi) popl %edi popl %edx popl %ecx popl %eax leave ret /*############################################################################ Name : RdosAllocateMem## Purpose....: Allocate memory## Parameters.: Bytes to allocate## Returns....: Memory pointer###########################################################################*/ .global RdosAllocateMem RdosAllocateMem: pushl %ebp movl %esp,%ebp pushl %edx movl 8(%ebp),%eax UserGate allocate_app_mem_nr movl %edx,%eax popl %edx leave ret /*############################################################################ Name : RdosFreeMem## Purpose....: Free memory## Parameters.: Memory pointer###########################################################################*/ .global RdosFreeMemRdosFreeMem: pushl %ebp movl %esp,%ebp pushl %edx movl 8(%ebp),%edx UserGate free_app_mem_nr popl %edx leave ret /*############################################################################ Name : RdosAppDebug## Purpose....: App debug###########################################################################*/ .global RdosAppDebug RdosAppDebug: pushl %ebp movl %esp,%ebp UserGate app_debug_nr leave ret /*############################################################################ Name : RdosWaitMilli## Purpose....: Wait a number of milliseconds## Parameters.: Milliseconds to wait###########################################################################*/ .global RdosWaitMilli RdosWaitMilli: pushl %ebp movl %esp,%ebp pushl %eax movl 8(%ebp),%eax UserGate wait_milli_nr popl %eax leave ret /*############################################################################ Name : RdosCreateSection## Purpose....: Create section## Returns....: Section handle###########################################################################*/ .global RdosCreateSection RdosCreateSection: pushl %ebp movl %esp,%ebp pushl %ebx UserGate create_user_section_nr movzx %bx,%eax popl %ebx leave ret /*############################################################################ Name : RdosDeleteSection## Purpose....: Delete section## Parameters.: Section handle###########################################################################*/ .global RdosDeleteSection RdosDeleteSection: pushl %ebp movl %esp,%ebp pushl %ebx movw 8(%ebp),%bx UserGate delete_user_section_nr popl %ebx leave ret /*############################################################################ Name : RdosEnterSection## Purpose....: Enter section## Parameters.: Section handle###########################################################################*/ .global RdosEnterSection RdosEnterSection: pushl %ebp movl %esp,%ebp pushl %ebx movw 8(%ebp),%bx UserGate enter_user_section_nr popl %ebx leave ret /*############################################################################ Name : RdosLeaveSection## Purpose....: Leave section## Parameters.: Section handle###########################################################################*/ .global RdosLeaveSection RdosLeaveSection: pushl %ebp movl %esp,%ebp pushl %ebx movw 8(%ebp),%bx UserGate leave_user_section_nr popl %ebx leave ret /*############################################################################ Name : RdosCreateWait## Purpose....: Create wait object## Returns....: Wait handle###########################################################################*/ .global RdosCreateWait RdosCreateWait: pushl %ebp movl %esp,%ebp pushl %ebx UserGate create_wait_nr movzx %bx,%eax popl %ebx leave ret /*############################################################################ Name : RdosCloseWait## Purpose....: Close wait## Parameters.: Wait handle###########################################################################*/ .global RdosCloseWait RdosCloseWait: pushl %ebp movl %esp,%ebp pushl %ebx movw 8(%ebp),%bx UserGate close_wait_nr popl %ebx leave ret /*############################################################################ Name : RdosCheckWait## Purpose....: Check wait state## Parameters.: Wait handle## Returns....: Signalled ID or 0###########################################################################*/ .global RdosCheckWait RdosCheckWait: pushl %ebp movl %esp,%ebp pushl %ebx pushl %ecx movw 8(%ebp),%bx UserGate is_wait_idle_nr movl %ecx,%eax popl %ecx popl %ebx leave ret /*############################################################################ Name : RdosWaitForever## Purpose....: Wait forever## Parameters.: Wait handle## Returns....: Signalled ID or 0###########################################################################*/ .global RdosWaitForever RdosWaitForever: pushl %ebp movl %esp,%ebp pushl %ebx pushl %ecx movw 8(%ebp),%bx UserGate wait_no_timeout_nr jc rwfFail movl %ecx,%eax jmp rwfDonerwfFail: xorl %eax,%eaxrwfDone: popl %ecx popl %ebx leave ret /*############################################################################ Name : RdosWaitTimeout## Purpose....: Wait with timeout## Parameters.: Wait handle# Timeout in ms## Returns....: Signalled ID or 0###########################################################################*/ .global RdosWaitTimeout RdosWaitTimeout: pushl %ebp movl %esp,%ebp pushl %ebx pushl %ecx pushl %edx movl 12(%ebp),%eax movl $1193,%edx mull %edx pushl %edx pushl %eax UserGate get_system_time_nr popl %ebx addl %ebx,%eax popl %ebx adcl %ebx,%edx movw 8(%ebp),%bx UserGate wait_timeout_nr jc rwtFail movl %ecx,%eax jmp rwtDonerwtFail: xorl %eax,%eaxrwtDone: popl %edx popl %ecx popl %ebx leave ret /*############################################################################ Name : RdosStopWait## Purpose....: Stop wait## Parameters.: Wait handle###########################################################################*/ .global RdosStopWait RdosStopWait: pushl %ebp movl %esp,%ebp pushl %ebx movw 8(%ebp),%bx UserGate stop_wait_nr popl %ebx leave ret /*############################################################################ Name : RdosRemoveWait## Purpose....: Remove wait object from wait handle## Parameters.: Wait handle# ID###########################################################################*/ .global RdosRemoveWait RdosRemoveWait: pushl %ebp movl %esp,%ebp pushl %ebx pushl %ecx movw 8(%ebp),%bx movl 12(%ebp),%ecx UserGate remove_wait_nr popl %ecx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -