OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [rdos/] [rdos.S] - Rev 862

Go to most recent revision | Compare with Previous | Blame | View Log

/*#######################################################################
# 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,%eax

rgtsDone:
        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,%eax

rsfDone:
    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,%eax

rsDone:
        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 RdosFreeMem

RdosFreeMem:
        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 rwfDone

rwfFail:
    xorl %eax,%eax

rwfDone:
    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 rwtDone

rwtFail:
    xorl %eax,%eax

rwtDone:
    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
        popl %ebx
        leave
        ret
                                    
/*##########################################################################
#
#   Name       : RdosCreateSignal
#
#   Purpose....: Create signal object
#
#   Returns....: Signal handle
#
##########################################################################*/

    .global RdosCreateSignal
    
RdosCreateSignal:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        UserGate create_signal_nr
        movzx %bx,%eax

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosResetSignal
#
#   Purpose....: Reset signal
#
#   Parameters.: Signal handle
#
##########################################################################*/

    .global RdosResetSignal
    
RdosResetSignal:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate reset_signal_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosIsSignalled
#
#   Purpose....: Check if signalled
#
#   Parameters.: Signal handle
#
#   Returns....: TRUE if signalled
#
##########################################################################*/

    .global RdosIsSignalled
    
RdosIsSignalled:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate is_signalled_nr
        jc risdFree

    movl $1,%eax
    jmp risdDone        

risdFree:
    xorl %eax,%eax

risdDone:
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetSignal
#
#   Purpose....: Set signal
#
#   Parameters.: Signal handle
#
##########################################################################*/

    .global RdosSetSignal
    
RdosSetSignal:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate set_signal_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosFreeSignal
#
#   Purpose....: Free signal handle
#
#   Parameters.: Signal handle
#
##########################################################################*/

    .global RdosFreeSignal
    
RdosFreeSignal:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate free_signal_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosAddWaitForSignal
#
#   Purpose....: Add signal object to wait handle
#
#   Parameters.: Wait handle
#                Signal handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForSignal
    
RdosAddWaitForSignal:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate add_wait_for_signal_nr

    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosAddWaitForKeyboard
#
#   Purpose....: Add keyboard to wait handle
#
#   Parameters.: Wait handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForKeyboard
    
RdosAddWaitForKeyboard:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movl 12(%ebp),%ecx
        UserGate add_wait_for_keyboard_nr

    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosAddWaitForMouse
#
#   Purpose....: Add mouse to wait handle
#
#   Parameters.: Wait handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForMouse
    
RdosAddWaitForMouse:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movl 12(%ebp),%ecx
        UserGate add_wait_for_mouse_nr

    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosAddWaitForCom
#
#   Purpose....: Add com object to wait handle
#
#   Parameters.: Wait handle
#                Com handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForCom
    
RdosAddWaitForCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate add_wait_for_com_nr

    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosAddWaitForAdc
#
#   Purpose....: Add ADC object to wait handle
#
#   Parameters.: Wait handle
#                Adc handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForAdc
    
RdosAddWaitForAdc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate add_wait_for_adc_nr

    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetTextMode
#
#   Purpose....: Set text mode
#
##########################################################################*/

    .global RdosSetTextMode
    
RdosSetTextMode:
        pushl %ebp
        movl %esp,%ebp

        movw $3,%ax
    UserGate set_video_mode_nr

        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetVideoMode
#
#   Purpose....: Set video mode
#
#   Parameters.: &xres
#                &yres
#                &linesize
#                &LFB
#
#   Returns....: Bitmap handle
#
##########################################################################*/

    .global RdosSetVideoMode
    
RdosSetVideoMode:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%edi
        movw (%edi),%ax

        movl 12(%ebp),%edi
        movw (%edi),%cx

        movl 16(%ebp),%edi
        movw (%edi),%dx

        UserGate get_video_mode_nr
        jc set_video_fail

    UserGate set_video_mode_nr
    jc set_video_fail

        pushl %edi
        movl 8(%ebp),%edi
        movzx %ax,%eax
        movl %eax,(%edi)

        movl 12(%ebp),%edi
        movzx %cx,%ecx
        movl %ecx,(%edi)

        movl 16(%ebp),%edi
        movzx %dx,%edx
        movl %edx,(%edi)

        movl 20(%ebp),%edi
        movzx %si,%esi
        movl %esi,(%edi)
        popl %edi

        movl 24(%ebp),%eax
        movl %edi,(%eax)

        movzx %bx,%eax
        jmp set_video_done

set_video_fail:
        xorl %eax,%eax
        movl 8(%ebp),%edi
        movl %eax,(%edi)
        movl 12(%ebp),%edi
        movl %eax,(%edi)
        movl 16(%ebp),%edi
        movl %eax,(%edi)
        movl 20(%ebp),%edi
        movl %eax,(%edi)
        movl 24(%ebp),%edi
        movl %eax,(%edi)

set_video_done:
        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetClipRect
#
#   Purpose....: Set clip rectangle
#
#   Parameters.: Bitmap handle
#                xmin, xmax, ymin, ymax
#
##########################################################################*/

    .global RdosSetClipRect
    
RdosSetClipRect:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movw 20(%ebp),%si
        movw 24(%ebp),%di
        UserGate set_clip_rect_nr

    popl %edi
    popl %esi
    popl %edx
    popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosClearClipRect
#
#   Purpose....: Clear clip rectangle
#
#   Parameters.: Bitmap handle
#
##########################################################################*/

    .global RdosClearClipRect
    
RdosClearClipRect:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate clear_clip_rect_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetDrawColor
#
#   Purpose....: Set draw color
#
#   Parameters.: Bitmap handle
#                Color
#
##########################################################################*/

    .global RdosSetDrawColor
    
RdosSetDrawColor:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx

        movw 8(%ebp),%bx
        movl 12(%ebp),%eax
        UserGate set_drawcolor_nr

        popl %ebx
        popl %eax
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetLGOP
#
#   Purpose....: Set draw color
#
#   Parameters.: Bitmap handle
#                LGOP
#
##########################################################################*/

    .global RdosSetLGOP
    
RdosSetLGOP:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        UserGate set_lgop_nr

        popl %ebx
        popl %eax
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetHollowStyle
#
#   Purpose....: Set hollow fill style
#
#   Parameters.: Bitmap handle
#
##########################################################################*/

    .global RdosSetHollowStyle
    
RdosSetHollowStyle:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate set_hollow_style_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosSetFilledStyle
#
#   Purpose....: Set filled fill style
#
#   Parameters.: Bitmap handle
#
##########################################################################*/

    .global RdosSetFilledStyle
    
RdosSetFilledStyle:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate set_filled_style_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosOpenFont
#
#   Purpose....: Open a font
#
#   Parameters.: height
#
#   Returns....: Font handle
#
##########################################################################*/

    .global RdosOpenFont
    
RdosOpenFont:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%ax
        UserGate open_font_nr
        movzx %bx,%eax

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosCloseFont
#
#   Purpose....: Close font handle
#
#   Parameters.: Font handle
#
##########################################################################*/

    .global RdosCloseFont
    
RdosCloseFont:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_font_nr

        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosGetStringMetrics
#
#   Purpose....: Get string metrics for text using font
#
#   Parameters.: Font handle
#                String
#                &width
#                &height
#
##########################################################################*/

    .global RdosGetStringMetrics
    
RdosGetStringMetrics:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        UserGate get_string_metrics_nr

        movl 16(%ebp),%edi
        movzx %cx,%ecx
        movl %ecx,(%edi)
        
        movl 20(%ebp),%edi
        movzx %dx,%edx
        movl %edx,(%edi)

        popl %edi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFont
#
#   Purpose....: Set font
#
#   Parameters.: Bitmap handle
#                Font handle
#
##########################################################################*/

    .global RdosSetFont
    
RdosSetFont:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        UserGate set_font_nr

        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetPixel
#
#   Purpose....: Get pixel
#
#   Parameters.: Bitmap handle
#                x, y
#
##########################################################################*/

    .global RdosGetPixel
    
RdosGetPixel:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        UserGate get_pixel_nr

        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetPixel
#
#   Purpose....: Set pixel
#
#   Parameters.: Bitmap handle
#                x, y
#
##########################################################################*/

    .global RdosSetPixel
    
RdosSetPixel:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        UserGate set_pixel_nr

        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosBlit
#
#   Purpose....: Blit
#
#   Parameters.: SrcHandle
#                DestHandle
#                width, height
#                SrcX, SrcY
#                DestX, DestY
#
##########################################################################*/

    .global RdosBlit
    
RdosBlit:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi
;
        movw 8(%ebp),%ax
        movw 12(%ebp),%bx
        movw 16(%ebp),%cx
        movw 20(%ebp),%dx
        movw 28(%ebp),%si
        shll $16,%esi
        movw 24(%ebp),%si
        movw 36(%ebp),%di
        shll $16,%edi
        movw 32(%ebp),%di
        UserGate blit_nr

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDrawMask
#
#   Purpose....: Draw mask
#
#   Parameters.: Bitmap handle
#                mask
#                RowSize
#                width, height
#                SrcX, SrcY
#                DestX, DestY
#
##########################################################################*/

    .global RdosDrawMask
    
RdosDrawMask:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi
;
        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        movw 16(%ebp),%ax
        movw 24(%ebp),%si
        shll $16,%esi
        movw 20(%ebp),%si
        movw 32(%ebp),%cx
        shll $16,%ecx
        movw 28(%ebp),%cx
        movw 40(%ebp),%dx
        shll $16,%edx
        movw 36(%ebp),%dx
        UserGate draw_mask_nr

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDrawLine
#
#   Purpose....: Draw a line
#
#   Parameters.: Bitmap handle
#                x1, y1
#                x2, y2
#
##########################################################################*/

    .global RdosDrawLine
    
RdosDrawLine:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi
;
        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movw 20(%ebp),%si
        movw 24(%ebp),%di
        UserGate draw_line_nr

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDrawString
#
#   Purpose....: Draw a string
#
#   Parameters.: Bitmap handle
#                x, y
#                string
#
##########################################################################*/

    .global RdosDrawString
    
RdosDrawString:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %edi
;
        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movl 20(%ebp),%edi
        UserGate draw_string_nr

        popl %edi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDrawRect
#
#   Purpose....: Draw a rect
#
#   Parameters.: Bitmap handle
#                x, y
#                width, height
#
##########################################################################*/

    .global RdosDrawRect
    
RdosDrawRect:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movw 20(%ebp),%si
        movw 24(%ebp),%di
        UserGate draw_rect_nr

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDrawEllipse
#
#   Purpose....: Draw an ellipse
#
#   Parameters.: Bitmap handle
#                x, y
#                width, height
#
##########################################################################*/

    .global RdosDrawEllipse
    
RdosDrawEllipse:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movw 20(%ebp),%si
        movw 24(%ebp),%di
        UserGate draw_ellipse_nr

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosCreateBitmap
#
#   Purpose....: Create a bitmap
#
#   Parameters.: BitsPerPixel
#                width, height
#
#   Returns....: Bitmap handle
#
##########################################################################*/

    .global RdosCreateBitmap
    
RdosCreateBitmap:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%ax
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        UserGate create_bitmap_nr
        movzx %bx,%eax
;
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDuplicateBitmapHandle
#
#   Purpose....: Duplicate bitmap handle for use in another thread / object
#
#   Parameters.: Bitmap handle
#
#   Returns....: Bitmap handle
#
##########################################################################*/

    .global RdosDuplicateBitmapHandle
    
RdosDuplicateBitmapHandle:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate dup_bitmap_handle_nr
        movzx %bx,%eax

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseBitmap
#
#   Purpose....: Close bitmap handle
#
#   Parameters.: Bitmap handle
#
##########################################################################*/

    .global RdosCloseBitmap
    
RdosCloseBitmap:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_bitmap_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateStringBitmap
#
#   Purpose....: Create bitmap from string & font
#
#   Parameters.: Font
#                string
#
#   Returns....: Bitmap handle
#
##########################################################################*/

    .global RdosCreateStringBitmap
    
RdosCreateStringBitmap:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        UserGate create_string_bitmap_nr
        movzx %bx,%eax
;
        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetBitmapInfo
#
#   Purpose....: Get info about bitmap
#
#   Parameters.: Bitmap handle
#                &BitsPerPixel
#                &width, &height
#                &linesize
#                &LFB
#
##########################################################################*/

    .global RdosGetBitmapInfo
    
RdosGetBitmapInfo:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movw 8(%ebp),%bx
        UserGate get_bitmap_info_nr
        jc gbiFail

        pushl %edi
        movl 12(%ebp),%edi
        movzx %al,%eax
        movl %eax,(%edi)

        movl 16(%ebp),%edi
        movzx %cx,%ecx
        movl %ecx,(%edi)
        
        movl 20(%ebp),%edi
        movzx %dx,%edx
        movl %edx,(%edi)

        movl 24(%ebp),%edi
        movzx %si,%esi
        movl %esi,(%edi)
        popl %edi
        
        movl 28(%ebp),%eax
        movl %edi,(%eax)
        jmp gbiDone

gbiFail:
        xorl %eax,%eax
        movl 12(%ebp),%edi
        movl %eax,(%edi)

        movl 16(%ebp),%edi
        movl %eax,(%edi)

        movl 20(%ebp),%edi
        movl %eax,(%edi)

        movl 24(%ebp),%edi
        movl %eax,(%edi)

        movl 28(%ebp),%edi
        movl %eax,(%edi)

gbiDone:
        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        popl %eax
        leave
        ret
                                            
/*##########################################################################
#
#   Name       : RdosCreateSprite
#
#   Purpose....: Create a sprite
#
#   Parameters.: dest
#                bitmap
#                mask
#                LGOP
#
#   Returns....: Sprite handle
#
##########################################################################*/

    .global RdosCreateSprite
    
RdosCreateSprite:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        movw 20(%ebp),%ax
        UserGate create_sprite_nr
        movzx %bx,%eax

        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseSprite
#
#   Purpose....: Close sprite handle
#
#   Parameters.: Sprite handle
#
##########################################################################*/

    .global RdosCloseSprite
    
RdosCloseSprite:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_sprite_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosShowSprite
#
#   Purpose....: Show sprite
#
#   Parameters.: Sprite handle
#
##########################################################################*/

    .global RdosShowSprite
    
RdosShowSprite:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate show_sprite_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosHideSprite
#
#   Purpose....: Hide sprite
#
#   Parameters.: Sprite handle
#
##########################################################################*/

    .global RdosHideSprite
    
RdosHideSprite:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate hide_sprite_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosMoveSprite
#
#   Purpose....: Move sprite
#
#   Parameters.: Sprite handle
#                x, y
#
##########################################################################*/

    .global RdosMoveSprite
    
RdosMoveSprite:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%bx
        movw 12(%ebp),%cx
        movw 16(%ebp),%dx
        UserGate move_sprite_nr

        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetForeColor
#
#   Purpose....: Set text-mode fore color
#
#   Parameters.: palette index
#
##########################################################################*/

    .global RdosSetForeColor
    
RdosSetForeColor:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax

        movb 8(%ebp),%al
        UserGate set_forecolor_nr

        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetBackColor
#
#   Purpose....: Set text-mode back color
#
#   Parameters.: palette index
#
##########################################################################*/

    .global RdosSetBackColor
    
RdosSetBackColor:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax

        movb 8(%ebp),%al
        UserGate set_backcolor_nr

        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetSysTime
#
#   Purpose....: Get system time
#
#   Parameters.: &year, &month, &day
#                &hour, &min, &sec, &ms
#
##########################################################################*/

    .global RdosGetSysTime
    
RdosGetSysTime:
        pushl %ebp
        movl %esp,%ebp
        pushal

        UserGate get_system_time_nr
        pushl %eax
        UserGate binary_to_time_nr
        pushl %edx

        movl 8(%ebp),%esi
        movzx %dx,%edx
        movl %edx,(%esi)

        movl 12(%ebp),%esi
        movzx %ch,%edx
        movl %edx,(%esi)

        movl 16(%ebp),%esi
        movzx %cl,%edx
        movl %edx,(%esi)

        movl 20(%ebp),%esi
        movzx %bh,%edx
        movl %edx,(%esi)

        movl 24(%ebp),%esi
        movzx %bl,%edx
        movl %edx,(%esi)

        movl 28(%ebp),%esi
        movzx %ah,%edx
        movl %edx,(%esi)

        popl %edx
        UserGate time_to_binary_nr
        movl %eax,%ebx
        popl %eax
        subl %ebx,%eax
        xorl %edx,%edx
        movl $1192,%ebx
        divl %ebx

        movl 32(%ebp),%esi
        movzx %ax,%eax
        movl %eax,(%esi)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetTime
#
#   Purpose....: Get time
#
#   Parameters.: &year, &month, &day
#                &hour, &min, &sec, &ms
#
##########################################################################*/

    .global RdosGetTime
    
RdosGetTime:
        pushl %ebp
        movl %esp,%ebp
        pushal

        UserGate get_time_nr
        pushl %eax
        UserGate binary_to_time_nr
        pushl %edx

        movl 8(%ebp),%esi
        movzx %dx,%edx
        movl %edx,(%esi)

        movl 12(%ebp),%esi
        movzx %ch,%edx
        movl %edx,(%esi)

        movl 16(%ebp),%esi
        movzx %cl,%edx
        movl %edx,(%esi)

        movl 20(%ebp),%esi
        movzx %bh,%edx
        movl %edx,(%esi)

        movl 24(%ebp),%esi
        movzx %bl,%edx
        movl %edx,(%esi)

        movl 28(%ebp),%esi
        movzx %ah,%edx
        movl %edx,(%esi)

        popl %edx
        UserGate time_to_binary_nr
        movl %eax,%ebx
        popl %eax
        subl %ebx,%eax
        xorl %edx,%edx
        movl $1192,%ebx
        divl %ebx

        movl 32(%ebp),%esi
        movzx %ax,%eax
        movl %eax,(%esi)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetTime
#
#   Purpose....: Set time
#
#   Parameters.: year, month, day
#                hour, min, sec, ms
#
##########################################################################*/

    .global RdosSetTime
    
RdosSetTime:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movw 8(%ebp),%dx
        movb 12(%ebp),%ch
        movb 16(%ebp),%cl
        movb 20(%ebp),%bh
        movb 24(%ebp),%bl
        movb 28(%ebp),%ah
        UserGate time_to_binary_nr

    movl %edx,%edi
    movl %eax,%esi

        movl 32(%ebp),%eax
    movl $1192,%edx
    mull %edx
    addl %eax,%esi
    adcl $0,%edi    

        UserGate get_system_time_nr
    subl %eax,%esi
    sbbl %edx,%edi
    movl %esi,%eax
    movl %edi,%edx
    UserGate update_time_nr

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosTicsToRecord
#
#   Purpose....: Convert tics to record format
#
#   Parameters.: MSB, LSB
#                &year, &month, &day
#                &hour, &min, &sec, &ms
#
##########################################################################*/

    .global RdosTicsToRecord
    
RdosTicsToRecord:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movl 8(%ebp),%edx
        movl 12(%ebp),%eax
        addl $596,%eax
        adcl $0,%edx
        UserGate binary_to_time_nr
        pushl %edx

        movl 16(%ebp),%esi
        movzx %dx,%edx
        movl %edx,(%esi)

        movl 20(%ebp),%esi
        movzx %ch,%edx
        movl %edx,(%esi)

        movl 24(%ebp),%esi
        movzx %cl,%edx
        movl %edx,(%esi)

        movl 28(%ebp),%esi
        movzx %bh,%edx
        movl %edx,(%esi)

        movl 32(%ebp),%esi
        movzx %bl,%edx
        movl %edx,(%esi)

        movl 36(%ebp),%esi
        movzx %ah,%edx
        movl %edx,(%esi)

        popl %edx
        UserGate time_to_binary_nr
        movl %eax,%ebx
        movl 12(%ebp),%eax
        subl %edx,%eax
        xorl %edx,%edx
        movl $1192,%ebx
        divl %ebx

        movl 40(%ebp),%esi
        cmpw %ax,1000
        jne rttrSaveMs

        decw %ax

rttrSaveMs:     
        movzx %ax,%eax
        movl %eax,(%esi)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosRecordToTics
#
#   Purpose....: Convert from record format to tics
#
#   Parameters.: &MSB, &LSB
#                year, month, day
#                hour, min, sec, ms
#
##########################################################################*/

    .global RdosRecordToTics
    
RdosRecordToTics:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movl 40(%ebp),%eax
        movl $1192,%edx
        mull %edx
        pushl %eax
        movw 16(%ebp),%dx
        movb 20(%ebp),%ch
        movb 24(%ebp),%cl
        movb 28(%ebp),%bh
        movb 32(%ebp),%bl
        movb 36(%ebp),%ah
        UserGate time_to_binary_nr
        popl %ebx
        addl %ebx,%eax
        adcl $0,%edx

        movl 8(%ebp),%esi
        movl %edx,(%esi)

        movl 12(%ebp),%esi
        movl %eax,(%esi)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDecodeMsbTics
#
#   Purpose....: Decode MSB tics
#
#   Parameters.: MSB
#                &day, &hour
#
##########################################################################*/

    .global RdosDecodeMsbTics
    
RdosDecodeMsbTics:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movl 8(%ebp),%eax
        xorl %edx,%edx
        movl $24,%ecx
        divl %ecx

        movl 12(%ebp),%ebx
        movl %eax,(%ebx)

        movl 16(%ebp),%ebx
        movl %edx,(%ebx)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDecodeLsbTics
#
#   Purpose....: Decode LSB tics
#
#   Parameters.: LSB
#                &min, &sec, &ms, &us
#
##########################################################################*/

    .global RdosDecodeLsbTics
    
RdosDecodeLsbTics:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movl 8(%ebp),%eax
        movl $60,%edx
        mull %edx
        movl 12(%ebp),%ebx
        movl %edx,(%ebx)

        movl $60,%edx
        mull %edx
        movl 16(%ebp),%ebx
        movl %edx,(%ebx)

        movl $1000,%edx
        mull %edx
        movl 20(%ebp),%ebx
        movl %edx,(%ebx)

        movl $1000,%edx
        mull %edx
        movl 24(%ebp),%ebx
        movl %edx,(%ebx)

        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDayOfWeek
#
#   Purpose....: Get day of week
#
#   Parameters.: year, month, day
#
#   Returns....: day of week
#
##########################################################################*/

    .global RdosDayOfWeek
    
RdosDayOfWeek:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movl 8(%ebp),%edx
        movb 12(%ebp),%ch
        movb 16(%ebp),%cl
    xorw %bx,%bx
    xorb %ah,%ah
        UserGate adjust_time_nr
        pushw %dx
        movl $365,%eax
        imulw %dx
        pushw %dx
        pushw %ax
        popl %ebx
        popw %dx
        UserGate passed_days_nr
        decw %dx
        shrw $2,%dx
        incw %dx
        addw %dx,%ax
        addl %ebx,%eax
    xorl %edx,%edx
    addl $5,%eax
    movl $7,%ebx
    divl %ebx
    movzx %dl,%eax

        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetTics
#
#   Purpose....: Get system tics
#
#   Parameters.: &MSB, &LSB
#
##########################################################################*/

    .global RdosGetTics
    
RdosGetTics:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx
        pushl %esi

        UserGate get_time_nr
        movl 8(%ebp),%esi
        movl %edx,(%esi)
        movl 12(%ebp),%esi
        movl %eax,(%esi)

        popl %esi
        popl %edx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddTics
#
#   Purpose....: Add tics to binary time
#
#   Parameters.: &MSB, &LSB
#                tics
#
##########################################################################*/

    .global RdosAddTics
    
RdosAddTics:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl 12(%ebp),%ebx
        addl %eax,(%ebx)
        movl 8(%ebp),%ebx
        adcl $0,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddMilli
#
#   Purpose....: Add milliseconds to binary time
#
#   Parameters.: &MSB, &LSB
#                milli
#
##########################################################################*/

    .global RdosAddMilli
    
RdosAddMilli:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl $1193,%edx
        mull %edx
        movl 12(%ebp),%ebx
        addl %eax,(%ebx)
        movl 8(%ebp),%ebx
        adcl %edx,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddSec
#
#   Purpose....: Add milliseconds to binary time
#
#   Parameters.: &MSB, &LSB
#                sec
#
##########################################################################*/

    .global RdosAddSec
    
RdosAddSec:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl $1193000,%edx
        mull %edx
        movl 12(%ebp),%ebx
        addl %eax,(%ebx)
        movl 8(%ebp),%ebx
        adcl %edx,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddMin
#
#   Purpose....: Add minutes to binary time
#
#   Parameters.: &MSB, &LSB
#                min
#
##########################################################################*/

    .global RdosAddMin
    
RdosAddMin:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl $71582760,%edx
        mull %edx
        movl 12(%ebp),%ebx
        addl %eax,(%ebx)
        movl 8(%ebp),%ebx
        adcl %edx,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddHour
#
#   Purpose....: Add hour to binary time
#
#   Parameters.: &MSB, &LSB
#                hour
#
##########################################################################*/

    .global RdosAddHour
    
RdosAddHour:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl 8(%ebp),%ebx
        adc %eax,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddDay
#
#   Purpose....: Add days to binary time
#
#   Parameters.: &MSB, &LSB
#                days
#
##########################################################################*/

    .global RdosAddDay
    
RdosAddDay:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 16(%ebp),%eax
        movl $24,%edx
        mull %edx
        movl 8(%ebp),%ebx
        adc %eax,(%ebx)

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSyncTime
#
#   Purpose....: Synchronize time with NTP
#
#   Parameters.: IP
#
##########################################################################*/

    .global RdosSyncTime
    
RdosSyncTime:
        pushl %ebp
        movl %esp,%ebp
        pushal

        movl 8(%ebp),%edx
        UserGate sync_time_nr
        jc RdosSyncTimeFail

        movl $1,%eax
        jmp RdosSyncTimeDone

RdosSyncTimeFail:
        xorl %eax,%eax

RdosSyncTimeDone:
        popal
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenCom
#
#   Purpose....: Open com-port
#
#   Parameters.: ID
#                baudrate
#                parity
#                data bits
#                stop bits
#                SendBufferSize
#                RecBufferSize
#
#    Returns...: Com handle
#
##########################################################################*/

    .global RdosOpenCom
    
RdosOpenCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movb 8(%ebp),%al
        movb 20(%ebp),%ah
        movb 24(%ebp),%bl
        movb 16(%ebp),%bh
        movl 12(%ebp),%ecx
        movw 28(%ebp),%si
        movw 32(%ebp),%di
        UserGate open_com_nr
        movzx %bx,%eax

        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseCom
#
#   Purpose....: Close com-port
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosCloseCom
    
RdosCloseCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_com_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosFlushCom
#
#   Purpose....: Flush com-port
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosFlushCom
    
RdosFlushCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate flush_com_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadCom
#
#   Purpose....: Read com-port
#
#   Parameters.: Com handle
#
#   Returns....: Character
#
##########################################################################*/

    .global RdosReadCom
    
RdosReadCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate read_com_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteCom
#
#   Purpose....: Write com-port
#
#   Parameters.: Com handle
#                char
#
#   Returns....: 0 for success
#
##########################################################################*/

    .global RdosWriteCom
    
RdosWriteCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        movb 12(%ebp),%al
        UserGate write_com_nr
        movzx %al,%eax

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWaitForSendCompletedCom
#
#   Purpose....: Wait until send buffer is empty
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosWaitForSendCompletedCom
    
RdosWaitForSendCompletedCom:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate wait_for_send_completed_com_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosEnableCts
#
#   Purpose....: Enable CTS signal
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosEnableCts
    
RdosEnableCts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate enable_cts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDisableCts
#
#   Purpose....: Disable CTS signal
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosDisableCts
    
RdosDisableCts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate disable_cts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosEnableAutoRts
#
#   Purpose....: Enable auto RTS signal generation for RS485
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosEnableAutoRts
    
RdosEnableAutoRts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate enable_auto_rts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDisableAutoRts
#
#   Purpose....: Disable auto RTS signal generation for RS485
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosDisableAutoRts
    
RdosDisableAutoRts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate disable_auto_rts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetDtr
#
#   Purpose....: Set DTR active
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosSetDtr
    
RdosSetDtr:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate set_dtr_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosResetDtr
#
#   Purpose....: Set DTR inactive
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosResetDtr
    
RdosResetDtr:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate reset_dtr_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetRts
#
#   Purpose....: Set RTS active
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosSetRts
    
RdosSetRts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate set_rts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosResetRts
#
#   Purpose....: Set RTS inactive
#
#   Parameters.: Com handle
#
##########################################################################*/

    .global RdosResetRts
    
RdosResetRts:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate reset_rts_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetReceiveBufferSpace
#
#   Purpose....: Get receive buffer free space
#
#   Parameters.: Com handle
#
#   Returns....: Free bytes
#
##########################################################################*/

    .global RdosGetReceiveBufferSpace
    
RdosGetReceiveBufferSpace:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_com_receive_space_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetSendBufferSpace
#
#   Purpose....: Get send buffer free space
#
#   Parameters.: Com handle
#
#   Returns....: Free bytes
#
##########################################################################*/

    .global RdosGetSendBufferSpace
    
RdosGetSendBufferSpace:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_com_send_space_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenFile
#
#   Purpose....: Open file
#
#   Parameters.: Filename
#                Access
#
#    Returns...: File handle
#
##########################################################################*/

    .global RdosOpenFile
    
RdosOpenFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movb 12(%ebp),%cl
        UserGate open_file_nr
        jc OpenFileFailed

        movzx %bx,%eax
        jmp OpenFileDone

OpenFileFailed:
        xorl %eax,%eax

OpenFileDone:
        popl %edi
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateFile
#
#   Purpose....: Create file
#
#   Parameters.: Filename
#                Attribute
#
#    Returns...: File handle
#
##########################################################################*/

    .global RdosCreateFile
    
RdosCreateFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movw 12(%ebp),%cx
        UserGate create_file_nr
        jc CreateFileFailed

        movzx %bx,%eax
        jmp CreateFileDone

CreateFileFailed:
        xorl %eax,%eax

CreateFileDone:
        popl %edi
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseFile
#
#   Purpose....: Close file
#
#   Parameters.: File handle
#
##########################################################################*/

    .global RdosCloseFile
    
RdosCloseFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_file_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosIsDevice
#
#   Purpose....: Check if file is device
#
#   Parameters.: TRUE if device
#
##########################################################################*/

    .global RdosIsDevice
    
RdosIsDevice:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_ioctl_data_nr
        testw $0x8000,%dx
        jz ridFail

        movl $1,%eax
        jmp ridDone

ridFail:
        xorl %eax,%eax

ridDone:
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDuplFile
#
#   Purpose....: Duplicate file handle
#
#   Parameters.: File handle
#
#   Returns....: File handle
#
##########################################################################*/

    .global RdosDuplFile
    
RdosDuplFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate dupl_file_nr
        jc DuplFileFailed
        
        movzx %bx,%eax
        jmp DuplFileDone

DuplFileFailed:
        xorl %eax,%eax

DuplFileDone:
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFileSize
#
#   Purpose....: Get file size
#
#   Parameters.: File handle
#
#   Returns....: Size
#
##########################################################################*/

    .global RdosGetFileSize
    
RdosGetFileSize:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_file_size_nr
        jnc GetFileSizeDone

GetFileSizeFail:
        xorl %eax,%eax

GetFileSizeDone:
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFileSize
#
#   Purpose....: Set file size
#
#   Parameters.: File handle
#                Size
#
##########################################################################*/

    .global RdosSetFileSize
    
RdosSetFileSize:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx

        movw 8(%ebp),%bx
        movl 12(%ebp),%eax
        UserGate set_file_size_nr

        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFilePos
#
#   Purpose....: Get file position
#
#   Parameters.: File handle
#
#   Returns....: Position
#
##########################################################################*/

    .global RdosGetFilePos
    
RdosGetFilePos:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_file_pos_nr
        jnc GetFilePosDone

GetFilePosFail:
        xorl %eax,%eax

GetFilePosDone:
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFilePos
#
#   Purpose....: Set file position
#
#   Parameters.: File handle
#                Position
#
##########################################################################*/

    .global RdosSetFilePos
    
RdosSetFilePos:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx

        movw 8(%ebp),%bx
        movl 12(%ebp),%eax
        UserGate set_file_pos_nr

        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFileTime
#
#   Purpose....: Get file time & date
#
#   Parameters.: File handle
#                &MSB, &LSB
#
##########################################################################*/

    .global RdosGetFileTime
    
RdosGetFileTime:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movw 8(%ebp),%bx
        UserGate get_file_time_nr
        jc GetFileTimeDone

        movl 12(%ebp),%edi
        movl %edx,(%edi)

        movl 16(%ebp),%edi
        movl %eax,(%edi)

GetFileTimeDone:
        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFileTime
#
#   Purpose....: Set file time & date
#
#   Parameters.: File handle
#                MSB, LSB
#
##########################################################################*/

    .global RdosSetFileTime
    
RdosSetFileTime:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx
        pushl %edx

        movw 8(%ebp),%bx
        movl 12(%ebp),%edx
        movl 16(%ebp),%eax
        UserGate set_file_time_nr

        popl %edx
        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadFile
#
#   Purpose....: Read from file
#
#   Parameters.: File handle
#                buffer
#                count
#
#   Returns....: Read count
#
##########################################################################*/

    .global RdosReadFile
    
RdosReadFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        movl 16(%ebp),%ecx
        UserGate read_file_nr

        popl %edi
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteFile
#
#   Purpose....: Write to file
#
#   Parameters.: File handle
#                buffer
#                count
#
#   Returns....: Written count
#
##########################################################################*/

    .global RdosWriteFile
    
RdosWriteFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        movl 16(%ebp),%ecx
        UserGate write_file_nr

        popl %edi
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateMapping
#
#   Purpose....: Create file mapping
#
#   Parameters.: Size
#
#    Returns...: Filemap handle
#
##########################################################################*/

    .global RdosCreateMapping
    
RdosCreateMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%eax
        UserGate create_mapping_nr
        movzx %bx,%eax

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateNamedMapping
#
#   Purpose....: Create named file mapping
#
#   Parameters.: Name
#                Size
#
#    Returns...: Filemap handle
#
##########################################################################*/

    .global RdosCreateNamedMapping
    
RdosCreateNamedMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%eax
        UserGate create_named_mapping_nr
        movzx %bx,%eax

        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateNamedFileMapping
#
#   Purpose....: Create file named file mapping
#
#   Parameters.: Name
#                Size
#                File handle
#
#    Returns...: Filemap handle
#
##########################################################################*/

    .global RdosCreateNamedFileMapping
    
RdosCreateNamedFileMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%eax
        movw 16(%ebp),%bx
        UserGate create_named_file_mapping_nr
        movzx %bx,%eax

        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenNamedMapping
#
#   Purpose....: Open named file mapping
#
#   Parameters.: Name
#
#    Returns...: Filemap handle
#
##########################################################################*/

    .global RdosOpenNamedMapping
    
RdosOpenNamedMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%edi
        UserGate open_named_mapping_nr
        movzx %bx,%eax

        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSyncMapping
#
#   Purpose....: Sync file mapping
#
#   Parameters.: Filemap handle
#
##########################################################################*/

    .global RdosSyncMapping
    
RdosSyncMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate sync_mapping_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseMapping
#
#   Purpose....: Close file mapping
#
#   Parameters.: Filemap handle
#
##########################################################################*/

    .global RdosCloseMapping
    
RdosCloseMapping:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_mapping_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosMapView
#
#   Purpose....: Map view of file into memory
#
#   Parameters.: Filemap handle
#                Offset
#                Address
#                Size
#
##########################################################################*/

    .global RdosMapView
    
RdosMapView:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%eax
        movl 16(%ebp),%edi
        movl 20(%ebp),%ecx
        UserGate map_view_nr

        popl %edi
        popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosUnmapView
#
#   Purpose....: Unmap view of file
#
#   Parameters.: Filemap handle
#
##########################################################################*/

    .global RdosUnmapView
    
RdosUnmapView:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate unmap_view_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetCurDrive
#
#   Purpose....: Set current drive
#
#   Parameters.: Drive
#
##########################################################################*/

    .global RdosSetCurDrive
    
RdosSetCurDrive:
        pushl %ebp
        movl %esp,%ebp

        movb 8(%ebp),%al
        UserGate set_cur_drive_nr
        jc rscdrFail

    movl $1,%eax
    jmp rscdrDone

rscdrFail:
    xorl %eax,%eax

rscdrDone:
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetCurDrive
#
#   Purpose....: Get current drive
#
#   Returns....: Drive
#
##########################################################################*/

    .global RdosGetCurDrive
    
RdosGetCurDrive:
        pushl %ebp
        movl %esp,%ebp

    xorl %eax,%eax
        UserGate get_cur_drive_nr
        movzx %al,%eax

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetCurDir
#
#   Purpose....: Set current directory
#
#   Parameters.: Pathname
#
##########################################################################*/

    .global RdosSetCurDir
    
RdosSetCurDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate set_cur_dir_nr
        jc rscdFail

    movl $1,%eax
    jmp rscdDone

rscdFail:
    xorl %eax,%eax

rscdDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetCurDir
#
#   Purpose....: Get current directory
#
#   Parameters.: Drive
#                Pathname
#
##########################################################################*/

    .global RdosGetCurDir
    
RdosGetCurDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%edi
        UserGate get_cur_dir_nr
        jc rgcdFail

    movl $1,%eax
    jmp rgcdDone

rgcdFail:
    xorl %eax,%eax

rgcdDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosMakeDir
#
#   Purpose....: Create directory
#
#   Parameters.: Pathname
#
##########################################################################*/

    .global RdosMakeDir
    
RdosMakeDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate make_dir_nr
        jc mdFail

    movl $1,%eax
    jmp mdDone

mdFail:
    xorl %eax,%eax

mdDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosRemoveDir
#
#   Purpose....: Remove directory
#
#   Parameters.: Pathname
#
##########################################################################*/

    .global RdosRemoveDir
    
RdosRemoveDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate remove_dir_nr
        jc rdFail

    movl $1,%eax
    jmp rdDone

rdFail:
    xorl %eax,%eax

rdDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosRenameFile
#
#   Purpose....: Rename file
#
#   Parameters.: ToName
#                FromName
#
##########################################################################*/

    .global RdosRenameFile
    
RdosRenameFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %esi
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%esi
        UserGate rename_file_nr
        jc rfFail

    mov $1,%eax
    jmp rfDone

rfFail:
    xorl %eax,%eax

rfDone:
        popl %edi
        popl %esi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDeleteFile
#
#   Purpose....: Delete file
#
#   Parameters.: Pathname
#
##########################################################################*/

    .global RdosDeleteFile
    
RdosDeleteFile:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate delete_file_nr
        jc dfFail

    mov $1,%eax
    jmp dfDone

dfFail:
    xorl %eax,%eax

dfDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFileAttribute
#
#   Purpose....: Get file attribute
#
#   Parameters.: Pathname
#                &Attrib
#
##########################################################################*/

    .global RdosGetFileAttribute
    
RdosGetFileAttribute:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        UserGate get_file_attribute_nr
        jc gfaFail

        movl 12(%ebp),%edi
    movzx %cx,%ecx
        movl %ecx,(%edi)
    movl $1,%eax
    jmp gfaDone

gfaFail:
    xorl %eax,%eax

gfaDone:
        popl %edi
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFileAttribute
#
#   Purpose....: Set file attribute
#
#   Parameters.: Pathname
#                Attrib
#
##########################################################################*/

    .global RdosSetFileAttribute
    
RdosSetFileAttribute:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movw 12(%ebp),%cx
        UserGate set_file_attribute_nr
        jc sfaFail

    movl $1,%eax
    jmp sfaDone

sfaFail:
    xorl %eax,%eax

sfaDone:
        popl %edi
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenDir
#
#   Purpose....: Open directory
#
#   Parameters.: Pathname
#
#   Returns....: Dir handle
#
##########################################################################*/

    .global RdosOpenDir
    
RdosOpenDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%edi
        UserGate open_dir_nr
        jc odFail

    movzx %bx,%eax
    jmp odDone

odFail:
    xorl %eax,%eax

odDone:
        popl %edi
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseDir
#
#   Purpose....: Close directory
#
#   Parameters.: Dir handle
#
##########################################################################*/

    .global RdosCloseDir
    
RdosCloseDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_dir_nr

        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadDir
#
#   Purpose....: Read directory entry
#
#   Parameters.: Dir handle
#                Entry #
#                MaxNameSize
#                Name buffer
#                &FileSize
#                &Attribute
#                &Msb time
#                &Lsb time
#
##########################################################################*/

    .global RdosReadDir
    
RdosReadDir:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movw 12(%ebp),%dx
        movw 16(%ebp),%cx
        movl 20(%ebp),%edi
        UserGate read_dir_nr
        jc rdiFail

        movl 24(%ebp),%edi
        movl %ecx,(%edi)

        movl 28(%ebp),%edi
    movzx %bx,%ebx
        movl %ebx,(%edi)

        movl 32(%ebp),%edi
        movl %edx,(%edi)

        movl 36(%ebp),%edi
        movl %eax,(%edi)

    movl $1,%eax
    jmp rdiDone

rdiFail:
    xorl %eax,%eax
    
rdiDone:
    popl %edi
    popl %ecx
        popl %ebx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetFocus
#
#   Purpose....: Set input focus
#
#   Parameters.: Focus handle
#
##########################################################################*/

    .global RdosSetFocus
    
RdosSetFocus:
        pushl %ebp
        movl %esp,%ebp
        
        movl 8(%ebp),%eax
        UserGate set_focus_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFocus
#
#   Purpose....: Get input focus
#
#   Returns....: Focus handle
#
##########################################################################*/

    .global RdosGetFocus
    
RdosGetFocus:
        pushl %ebp
        movl %esp,%ebp
        
        UserGate get_focus_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosClearKeyboard
#
#   Purpose....: Clear keyboard buffer
#
##########################################################################*/

    .global RdosClearKeyboard
    
RdosClearKeyboard:
        pushl %ebp
        movl %esp,%ebp

        UserGate flush_keyboard_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPollKeyboard
#
#   Purpose....: Poll keyboard buffer
#
#   Returns....: TRUE if non-empty
#
##########################################################################*/

    .global RdosPollKeyboard
    
RdosPollKeyboard:
        pushl %ebp
        movl %esp,%ebp

        UserGate poll_keyboard_nr
        jc rpkEmpty

        mov $1,%eax
        jmp rpkDone

rpkEmpty:
        xorl %eax,%eax

rpkDone:
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadKeyboard
#
#   Purpose....: Read keyboard buffer
#
#   Returns....: Scan code
#
##########################################################################*/

    .global RdosReadKeyboard
    
RdosReadKeyboard:
        pushl %ebp
        movl %esp,%ebp

        UserGate read_keyboard_nr
        movzx %ax,%eax

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetKeyboardState
#
#   Purpose....: Get keyboard buffer
#
#   Returns....: Keyboard state
#
##########################################################################*/

    .global RdosGetKeyboardState
    
RdosGetKeyboardState:
        pushl %ebp
        movl %esp,%ebp

        UserGate get_keyboard_state_nr
        movzx %ax,%eax

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPutKeyboard
#
#   Purpose....: Put scancode in keyboard buffer
#
##########################################################################*/

    .global RdosPutKeyboard
    
RdosPutKeyboard:
        pushl %ebp
        movl %esp,%ebp
    pushl %edx

        movw 8(%ebp),%ax
        movb 12(%ebp),%dl
        movb 16(%ebp),%dh
        UserGate put_keyboard_code_nr

    popl %edx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPeekKeyEvent
#
#   Purpose....: Peek keyboard event
#
##########################################################################*/

    .global RdosPeekKeyEvent
    
RdosPeekKeyEvent:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi

        UserGate peek_key_event_nr
        jc rpeFail

        movl 8(%ebp),%edi
        movzx %ax,%eax
        movl %eax,(%edi)

        movl 12(%ebp),%edi
        movzx %cx,%eax
        movl %eax,(%edi)

        movl 16(%ebp),%edi
        movzx %dl,%eax
        movl %eax,(%edi)

        movl 20(%ebp),%edi
        movzx %dh,%eax
        movl %eax,(%edi)

        movl $1,%eax
        jmp rpeDone

rpeFail:
        xorl %eax,%eax

rpeDone:
        popl %edi
        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadKeyEvent
#
#   Purpose....: Read keyboard event
#
##########################################################################*/

    .global RdosReadKeyEvent
    
RdosReadKeyEvent:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi

        UserGate read_key_event_nr
        jc rkeFail

        movl 8(%ebp),%edi
        movzx %ax,%eax
        movl %eax,(%edi)

        movl 12(%ebp),%edi
        movzx %cx,%eax
        movl %eax,(%edi)

        movl 16(%ebp),%edi
        movzx %dl,%eax
        movl %eax,(%edi)

        movl 20(%ebp),%edi
        movzx %dh,%eax
        movl %eax,(%edi)

        movl $1,%eax
        jmp rkeDone

rkeFail:
        xorl %eax,%eax

rkeDone:
        popl %edi
        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosHideMouse
#
#   Purpose....: Hide mouse cursor
#
##########################################################################*/

    .global RdosHideMouse
    
RdosHideMouse:
        pushl %ebp
        movl %esp,%ebp

        UserGate hide_mouse_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosShowMouse
#
#   Purpose....: Show mouse cursor
#
##########################################################################*/

    .global RdosShowMouse
    
RdosShowMouse:
        pushl %ebp
        movl %esp,%ebp

        UserGate show_mouse_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetMousePosition
#
#   Purpose....: Get mouse position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetMousePosition
    
RdosGetMousePosition:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx

        UserGate get_mouse_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetMousePosition
#
#   Purpose....: Set mouse position
#
#   Parameters.: x, y
#
##########################################################################*/

    .global RdosSetMousePosition
    
RdosSetMousePosition:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%cx
        movw 12(%ebp),%dx
        UserGate set_mouse_position_nr

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetMouseWindow
#
#   Purpose....: Set mouse window
#
#   Parameters.: start x, start y
#                end x, end y
#
##########################################################################*/

    .global RdosSetMouseWindow
    
RdosSetMouseWindow:
        pushl %ebp
        movl %esp,%ebp
        pushl %eax
        pushl %ebx
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%ax
        movw 12(%ebp),%bx
        movw 16(%ebp),%cx
        movw 20(%ebp),%dx
        UserGate set_mouse_window_nr

        popl %edx
        popl %ecx
        popl %ebx
        popl %eax
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetMouseMickey
#
#   Purpose....: Set mouse mickey
#
#   Parameters.: x, y
#
##########################################################################*/

    .global RdosSetMouseMickey
    
RdosSetMouseMickey:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%cx
        movw 12(%ebp),%dx
        UserGate set_mouse_mickey_nr

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetCursorPosition
#
#   Purpose....: Get cursor position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetCursorPosition
    
RdosGetCursorPosition:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx

        UserGate get_cursor_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetCursorPosition
#
#   Purpose....: Set cursor position
#
#   Parameters.: x, y
#
##########################################################################*/

    .global RdosSetCursorPosition
    
RdosSetCursorPosition:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx

        movw 8(%ebp),%cx
        movw 12(%ebp),%dx
        UserGate set_cursor_position_nr

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetLeftButton
#
#   Purpose....: Check if left button is pressed
#
#   Returns....: TRUE if pressed
#
##########################################################################*/

    .global RdosGetLeftButton
    
RdosGetLeftButton:
        pushl %ebp
        movl %esp,%ebp

        UserGate get_left_button_nr
        jc get_left_rel

        mov $1,%eax
        jmp get_left_done

get_left_rel:
        xorl %eax,%eax

get_left_done:
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRightButton
#
#   Purpose....: Check if right button is pressed
#
#   Returns....: TRUE if pressed
#
##########################################################################*/

    .global RdosGetRightButton
    
RdosGetRightButton:
        pushl %ebp
        movl %esp,%ebp

        UserGate get_right_button_nr
        jc get_right_rel

        mov $1,%eax
        jmp get_right_done

get_right_rel:
        xorl %eax,%eax

get_right_done:
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetLeftButtonPressPosition
#
#   Purpose....: Get left button press position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetLeftButtonPressPosition
    
RdosGetLeftButtonPressPosition:
        pushl %ebp
        movl %esp,%ebp

        pushl %ecx
        pushl %edx

        UserGate get_left_button_press_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRightButtonPressPosition
#
#   Purpose....: Get right button press position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetRightButtonPressPosition
    
RdosGetRightButtonPressPosition:
        pushl %ebp
        movl %esp,%ebp

        pushl %ecx
        pushl %edx

        UserGate get_right_button_press_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetLeftButtonReleasePosition
#
#   Purpose....: Get left button release position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetLeftButtonReleasePosition
    
RdosGetLeftButtonReleasePosition:
        pushl %ebp
        movl %esp,%ebp

        pushl %ecx
        pushl %edx

        UserGate get_left_button_release_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRightButtonReleasePosition
#
#   Purpose....: Get right button release position
#
#   Parameters.: &x, &y
#
##########################################################################*/

    .global RdosGetRightButtonReleasePosition
    
RdosGetRightButtonReleasePosition:
        pushl %ebp
        movl %esp,%ebp

        pushl %ecx
        pushl %edx

        UserGate get_right_button_release_position_nr

        movl 8(%ebp),%eax
        movzx %cx,%ecx
        movl %ecx,(%eax)

        movl 12(%ebp),%eax
        movzx %dx,%edx
        movl %edx,(%eax)

        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadLine
#
#   Purpose....: Read a line from keyboard
#
#   Parameters.: Buffer
#                Size
#
#   Returns....: Read count
#
##########################################################################*/

    .global RdosReadLine
    
RdosReadLine:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%ecx
        UserGate read_con_nr

        popl %edi
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteChar
#
#   Purpose....: Write a character to screen
#
#   Parameters.: Char
#
##########################################################################*/

    .global RdosWriteChar
    
RdosWriteChar:
        pushl %ebp
        movl %esp,%ebp

        movb 8(%ebp),%al
        UserGate write_char_nr

        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteSizeString
#
#   Purpose....: Write a fixed number of characters to screen
#
#   Parameters.: String
#                Count
#
##########################################################################*/

    .global RdosWriteSizeString
    
RdosWriteSizeString:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%ecx
        UserGate write_size_string_nr

        popl %edi
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteString
#
#   Purpose....: Write a string to screen
#
#   Parameters.: String
#
##########################################################################*/

    .global RdosWriteString
    
RdosWriteString:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate write_asciiz_nr

        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosNameToIp
#
#   Purpose....: Convert host name to IP address
#
#   Parameters.: Name
#                
#   Returns....: IP
#
##########################################################################*/

    .global RdosNameToIp
    
RdosNameToIp:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movl 8(%ebp),%edi
        UserGate name_to_ip_nr
        jc rntiFail

        movl %edx,%eax
        jmp rntiDone

rntiFail:
        xorl %eax,%eax

rntiDone:
        popl %edi
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetIp
#
#   Purpose....: Get my IP
#                
#   Returns....: IP
#
##########################################################################*/

    .global RdosGetIp
    
RdosGetIp:
        pushl %ebp
        movl %esp,%ebp

        UserGate get_ip_address_nr
        movl %edx,%eax

    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosIpToName
#
#   Purpose....: Convert IP address to host name
#
#   Parameters.: IP
#                Name                
#                Size
#
##########################################################################*/

    .global RdosIpToName
    
RdosIpToName:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi
;
        movl 8(%ebp),%edx
        movl 12(%ebp),%edi
        movl 16(%ebp),%ecx
        UserGate ip_to_name_nr
        jnc ritnDone

ritnFail:
        xorl %eax,%eax

ritnDone:
        popl %edi
        popl %edx
        popl %ecx
        leave
        ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPing
#
#   Purpose....: Ping node
#                
#   Parameters.: IP
#                Timeout
#
##########################################################################*/

    .global RdosPing
    
RdosPing:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx
;
        movl 8(%ebp),%edx
        movl 12(%ebp),%eax
        UserGate ping_nr
        jc ping_failed

        movl $1,%eax
        jmp ping_done

ping_failed:
        xorl %eax,%eax

ping_done:
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenTcpConnection
#
#   Purpose....: Open an active connection over TCP
#                
#   Parameters.: RemoteIp
#                LocalPort
#                RemotePort
#                Timeout in ms
#                BufferSize
#
#   Returns....: Conn handle
#
##########################################################################*/

    .global RdosOpenTcpConnection
    
RdosOpenTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%edx
        movw 12(%ebp),%si
        movw 16(%ebp),%di
        movl 20(%ebp),%eax
        movl 24(%ebp),%ecx
        UserGate open_tcp_connection_nr
        mov $0,%eax
        jc rotcDone

        movl %ebx,%eax

rotcDone:
        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateTcpListen
#
#   Purpose....: Create listen handle
#                
#   Parameters.: Port
#                MaxConnections
#                BufferSize
#
#   Returns....: Listen handle
#
##########################################################################*/

    .global RdosCreateTcpListen
    
RdosCreateTcpListen:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi

        movw 8(%ebp),%si
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate create_tcp_listen_nr
        movzx %bx,%eax
        jnc ctlDone

    xorl %eax,%eax

ctlDone:
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetTcpListen
#
#   Purpose....: Get connection from listen
#                
#   Parameters.: Listen handle
#
#   Returns....: Conn handle
#
##########################################################################*/

    .global RdosGetTcpListen
    
RdosGetTcpListen:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_tcp_listen_nr
        movzx %ax,%eax
        jnc gtlDone

    xorl %eax,%eax

gtlDone:
    popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseTcpListen
#
#   Purpose....: Close TCP listen
#                
#   Parameters.: Listen handle
#
##########################################################################*/

    .global RdosCloseTcpListen
    
RdosCloseTcpListen:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_tcp_listen_nr
        
    popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddWaitForTcpListen
#
#   Purpose....: Add wait object to tcp listen
#                
#   Parameters.: Wait handle
#                Listen handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForTcpListen
    
RdosAddWaitForTcpListen:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate add_wait_for_tcp_listen_nr
        movl $1,%eax
        jnc awftlDone

        xorl %eax,%eax

awftlDone:
    popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWaitForTcpConnection
#
#   Purpose....: Wait for Tcp connection to be established
#                
#   Parameters.: Conn handle
#                Timeout ms
#
##########################################################################*/

    .global RdosWaitForTcpConnection
    
RdosWaitForTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        movl 12(%ebp),%eax
        UserGate wait_for_tcp_connection_nr
        movl $1,%eax
        jnc wftcDone

        xorl %eax,%eax

wftcDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddWaitForTcpConnection
#
#   Purpose....: Add wait object to tcp connection
#                
#   Parameters.: Wait handle
#                Conn handle
#                ID
#
##########################################################################*/

    .global RdosAddWaitForTcpConnection
    
RdosAddWaitForTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx

        movw 8(%ebp),%bx
        movw 12(%ebp),%ax
        movl 16(%ebp),%ecx
        UserGate add_wait_for_tcp_connection_nr
        movl $1,%eax
        jnc awftcDone

        xorl %eax,%eax

awftcDone:
    popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseTcpConnection
#
#   Purpose....: Close Tcp connection
#                
#   Parameters.: Conn handle
#
##########################################################################*/

    .global RdosCloseTcpConnection
    
RdosCloseTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate close_tcp_connection_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDeleteTcpConnection
#
#   Purpose....: Delete Tcp connection
#                
#   Parameters.: Conn handle
#
##########################################################################*/

    .global RdosDeleteTcpConnection
    
RdosDeleteTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate delete_tcp_connection_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAbortTcpConnection
#
#   Purpose....: Abort Tcp connection
#                
#   Parameters.: Conn handle
#
##########################################################################*/

    .global RdosAbortTcpConnection
    
RdosAbortTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate abort_tcp_connection_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPushTcpConnection
#
#   Purpose....: Push Tcp connection
#                
#   Parameters.: Conn handle
#
##########################################################################*/

    .global RdosPushTcpConnection
    
RdosPushTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate push_tcp_connection_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosPollTcpConnection
#
#   Purpose....: Poll Tcp connection
#                
#   Parameters.: Conn handle
#
#   Returns....: Available bytes in receive buffer
#
##########################################################################*/

    .global RdosPollTcpConnection
    
RdosPollTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate poll_tcp_connection_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosIsTcpConnectionClosed
#
#   Purpose....: Check if connection is closed
#                
#   Parameters.: Conn handle
#
#   Returns....: TRUE if closed
#
##########################################################################*/

    .global RdosIsTcpConnectionClosed
    
RdosIsTcpConnectionClosed:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate is_tcp_connection_closed_nr
        jc rptcClosed

        xorl %eax,%eax
        jmp rptcDone

rptcClosed:
        movl $1,%eax
        
rptcDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRemoteTcpConnectionIp
#
#   Purpose....: Get remote IP
#                
#   Parameters.: Conn handle
#
#   Returns....: IP
#
##########################################################################*/

    .global RdosGetRemoteTcpConnectionIp
    
RdosGetRemoteTcpConnectionIp:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_remote_tcp_connection_ip_nr
        jnc grtciDone

        movl $0xFFFFFFFF,%eax
        
grtciDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRemoteTcpConnectionPort
#
#   Purpose....: Get remote port
#                
#   Parameters.: Conn handle
#
#   Returns....: Port
#
##########################################################################*/

    .global RdosGetRemoteTcpConnectionPort
    
RdosGetRemoteTcpConnectionPort:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_remote_tcp_connection_port_nr
        jnc grtcpDone

        movl $0,%eax
        
grtcpDone:
    movzx %ax,%eax
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetLocalTcpConnectionPort
#
#   Purpose....: Get local port
#                
#   Parameters.: Conn handle
#
#   Returns....: Port
#
##########################################################################*/

    .global RdosGetLocalTcpConnectionPort
    
RdosGetLocalTcpConnectionPort:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movw 8(%ebp),%bx
        UserGate get_local_tcp_connection_port_nr
        jnc gltcpDone

        movl $0,%eax
        
gltcpDone:
    movzx %ax,%eax
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadTcpConnection
#
#   Purpose....: Read data from connection
#                
#   Parameters.: Conn handle
#                Buffer
#                Size
#
#   Returns....: Read bytes
#
##########################################################################*/

    .global RdosReadTcpConnection
    
RdosReadTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        movl 16(%ebp),%ecx
        UserGate read_tcp_connection_nr

        popl %edi
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteTcpConnection
#
#   Purpose....: Write data fto connection
#                
#   Parameters.: Conn handle
#                Buffer
#                Size
#
#   Returns....: Written bytes
#
##########################################################################*/

    .global RdosWriteTcpConnection
    
RdosWriteTcpConnection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%edi
        movl 16(%ebp),%ecx
        UserGate write_tcp_connection_nr

        popl %edi
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetLocalMailslot
#
#   Purpose....: Get local mailslot from name
#                
#   Parameters.: Name
#
#   Returns....: Mailslot handle
#
##########################################################################*/

    .global RdosGetLocalMailslot
    
RdosGetLocalMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%edi
        UserGate get_local_mailslot_nr
        jc rglmFail

        movzx %bx,%eax
        jmp rglmDone

rglmFail:
        xorl %eax,%eax

rglmDone:
        popl %edi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRemoteMailslot
#
#   Purpose....: Get remote mailslot from name
#                
#   Parameters.: IP
#                Name
#
#   Returns....: Mailslot handle
#
##########################################################################*/

    .global RdosGetRemoteMailslot
    
RdosGetRemoteMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edx
        pushl %edi

        movl 8(%ebp),%edx
        movl 12(%ebp),%edi
        UserGate get_remote_mailslot_nr
        jc rgrmFail

        movzx %bx,%eax
        jmp rgrmDone

rgrmFail:
        xorl %eax,%eax

rgrmDone:
        popl %edi
        popl %edx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosFreeMailslot
#
#   Purpose....: Free mailslot
#                
#   Parameters.: Mailslot handle
#
##########################################################################*/

    .global RdosFreeMailslot
    
RdosFreeMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate free_mailslot_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSendMailslot
#
#   Purpose....: Send mailslot
#                
#   Parameters.: Mailslot handle
#                                Msg
#                                Size
#                                ReplyBuf
#                                MaxReplySize
#
#   Returns....: Size of reply
#
##########################################################################*/

    .global RdosSendMailslot
    
RdosSendMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movw 8(%ebp),%bx
        movl 12(%ebp),%esi
        movl 16(%ebp),%ecx
        movl 20(%ebp),%edi
        movl 24(%ebp),%eax
        UserGate send_mailslot_nr
        jc smFail

        movl %ecx,%eax
        jmp smDone

smFail:
        movl $0xFFFFFFFF,%eax

smDone:
        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDefineMailslot
#
#   Purpose....: Define mailslot
#                
#   Parameters.: Name
#                Max msg size
#
##########################################################################*/

    .global RdosDefineMailslot
    
RdosDefineMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%ecx
        UserGate define_mailslot_nr

        popl %edi
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReceiveMailslot
#
#   Purpose....: Receive from mailslot
#                
#   Parameters.: Msg buffer
#
#   Returns....: Msg size
#
##########################################################################*/

    .global RdosReceiveMailslot
    
RdosReceiveMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        UserGate receive_mailslot_nr
        movl %ecx,%eax

        popl %edi
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReplyMailslot
#
#   Purpose....: Reply to mailslot
#                
#   Parameters.: Msg buffer
#                Msg size
#
##########################################################################*/

    .global RdosReplyMailslot
    
RdosReplyMailslot:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edi

        movl 8(%ebp),%edi
        movl 12(%ebp),%ecx
        UserGate reply_mailslot_nr

        popl %edi
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetIdeDisc
#
#   Purpose....: Get IDE disc
#                
#   Parameters.: Unit #
#
#   Returns....: Disc #
#
##########################################################################*/

    .global RdosGetIdeDisc
    
RdosGetIdeDisc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movb 8(%ebp),%bl
        UserGate get_ide_disc_nr
        jc get_ide_disc_fail

    movzx %al,%eax
        jmp get_ide_disc_done

get_ide_disc_fail:
        movl $0xFFFFFFFF,%eax

get_ide_disc_done:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetFloppyDisc
#
#   Purpose....: Get floppy disc
#                
#   Parameters.: Unit #
#
#   Returns....: Disc #
#
##########################################################################*/

    .global RdosGetFloppyDisc
    
RdosGetFloppyDisc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movb 8(%ebp),%bl
        UserGate get_floppy_disc_nr
        jc get_floppy_disc_fail

    movzx %al,%eax
        jmp get_floppy_disc_done

get_floppy_disc_fail:
        movl $0xFFFFFFFF,%eax

get_floppy_disc_done:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetDiscInfo
#
#   Purpose....: Get disc info
#                
#   Parameters.: Disc #
#                                Bytes / sector
#                                Total sectors
#                                BIOS sectors / cyl
#                                BIOS heads
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosGetDiscInfo
    
RdosGetDiscInfo:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movb 8(%ebp),%al
        UserGate get_disc_info_nr
        jc get_disc_info_fail

        movl 12(%ebp),%ebx
        movzx %cx,%ecx
        movl %ecx,(%ebx)

        movl 16(%ebp),%ebx
        movl %edx,(%ebx)

        movl 20(%ebp),%ebx
        movzx %si,%esi
        movl %esi,(%ebx)

        movl 24(%ebp),%ebx
        movzx %di,%edi
        movl %edi,(%ebx)

        movl $1,%eax
        jmp get_disc_info_done

get_disc_info_fail:
        xorl %eax,%eax

get_disc_info_done:
        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetDiscInfo
#
#   Purpose....: Set disc info
#                
#   Parameters.: Disc #
#                                Bytes / sector
#                                Total sectors
#                                BIOS sectors / cyl
#                                BIOS heads
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosSetDiscInfo
    
RdosSetDiscInfo:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx
        pushl %esi
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%ecx
        movl 16(%ebp),%edx
        movl 20(%ebp),%esi
        movl 24(%ebp),%edi
        UserGate set_disc_info_nr
        jc set_disc_info_fail

        movl $1,%eax
        jmp set_disc_info_done

set_disc_info_fail:
        xorl %eax,%eax

set_disc_info_done:
        popl %edi
        popl %esi
        popl %edx
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadDisc
#
#   Purpose....: Read from disc
#                
#   Parameters.: Disc #
#                                Sector #
#                                Buffer
#                                Size
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosReadDisc
    
RdosReadDisc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%edx
        movl 16(%ebp),%edi
        movl 20(%ebp),%ecx
        UserGate read_disc_nr
        jc read_disc_fail

        movl $1,%eax
        jmp read_disc_done

read_disc_fail:
        xorl %eax,%eax

read_disc_done:
        popl %edi
        popl %edx
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteDisc
#
#   Purpose....: Write to disc
#                
#   Parameters.: Disc #
#                                Sector #
#                                Buffer
#                                Size
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosWriteDisc
    
RdosWriteDisc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%edx
        movl 16(%ebp),%edi
        movl 20(%ebp),%ecx
        UserGate write_disc_nr
        jc write_disc_fail

        movl $1,%eax
        jmp write_disc_done

write_disc_fail:
        xorl %eax,%eax

write_disc_done:
        popl %edi
        popl %edx
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAllocateFixedDrive
#
#   Purpose....: Allocate fixed drive
#                
#   Parameters.: Drive #
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosAllocateFixedDrive
    
RdosAllocateFixedDrive:
        pushl %ebp
        movl %esp,%ebp

        movb 8(%ebp),%al
        UserGate allocate_fixed_drive_nr
        jc allocate_fixed_drive_fail

        movl $1,%eax
        jmp allocate_fixed_drive_done

allocate_fixed_drive_fail:
        xorl %eax,%eax

allocate_fixed_drive_done:
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAllocateStaticDrive
#
#   Purpose....: Allocate static drive
#                
#   Returns....: Drive #
#
##########################################################################*/

    .global RdosAllocateStaticDrive
    
RdosAllocateStaticDrive:
        pushl %ebp
        movl %esp,%ebp

        UserGate allocate_static_drive_nr
        jc allocate_static_drive_fail

    movzx %al,%eax
        jmp allocate_static_drive_done

allocate_static_drive_fail:
        xorl %eax,%eax

allocate_static_drive_done:
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAllocateDynamicDrive
#
#   Purpose....: Allocate dynamic drive
#                
#   Returns....: Drive #
#
##########################################################################*/

    .global RdosAllocateDynamicDrive
    
RdosAllocateDynamicDrive:
        pushl %ebp
        movl %esp,%ebp

        UserGate allocate_dynamic_drive_nr
        jc allocate_dynamic_drive_fail

    movzx %al,%eax
        jmp allocate_dynamic_drive_done

allocate_dynamic_drive_fail:
        xorl %eax,%eax

allocate_dynamic_drive_done:
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetRdfsInfo
#
#   Purpose....: Get rdfs info
#                
#   Parameters.: Crypt tab
#                Key tab
#                Extent size tab
#
##########################################################################*/

    .global RdosGetRdfsInfo
    
RdosGetRdfsInfo:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%esi
        movl 12(%ebp),%edi
        movl 16(%ebp),%ebx
        UserGate get_rdfs_info_nr

        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetDriveInfo
#
#   Purpose....: Get drive info
#                
#   Parameters.: Drive #
#                Free units
#                Bytes per unit
#                Total units
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosGetDriveInfo
    
RdosGetDriveInfo:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movb 8(%ebp),%al
        UserGate get_drive_info_nr
        jc get_drive_info_fail

        movl 12(%ebp),%ebx
        movl %eax,(%ebx)

        movl 16(%ebp),%ebx
        movzx %cx,%ecx
        movl %ecx,(%ebx)

        movl 20(%ebp),%ebx
        movl %edx,(%ebx)

        movl $1,%eax
        jmp get_drive_info_done

get_drive_info_fail:
        xorl %eax,%eax

get_drive_info_done:
        popl %edx
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDemandLoadDrive
#
#   Purpose....: Demand load drive
#                
#   Parameters.: Drive #
#
##########################################################################*/

    .global RdosDemandLoadDrive
    
RdosDemandLoadDrive:
        pushl %ebp
        movl %esp,%ebp

        movb 8(%ebp),%al
        UserGate demand_load_drive_nr

    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetDriveDiscParam
#
#   Purpose....: Get drive disc parameters
#                
#   Parameters.: Drive #
#                Disc #
#                Start sector
#                Total sectors
#
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosGetDriveDiscParam
    
RdosGetDriveDiscParam:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %edx

        movb 8(%ebp),%al
        UserGate get_drive_disc_param_nr
        jc get_drive_disc_param_fail

        movl 12(%ebp),%ebx
        movzx %al,%eax
        movl %eax,(%ebx)

        movl 16(%ebp),%ebx
        movl %edx,(%ebx)

        movl 20(%ebp),%ebx
        movl %ecx,(%ebx)

        movl $1,%eax
        jmp get_drive_disc_param_done

get_drive_disc_param_fail:
        xorl %eax,%eax

get_drive_disc_param_done:
        popl %edx
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosFormatDrive
#
#   Purpose....: Format drive
#                
#   Parameters.: Disc #
#                Start sector
#                Sectors
#                FS name
#
#   Returns....: Drive #
#
##########################################################################*/

    .global RdosFormatDrive
    
RdosFormatDrive:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %edx
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%edx
        movl 16(%ebp),%ecx
        movl 20(%ebp),%edi
        UserGate format_drive_nr
        jc rfdFail

    movzx %al,%eax
    jmp rfdDone

rfdFail:
    xorl %eax,%eax

rfdDone:
        popl %edi
        popl %edx
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetExeName
#
#   Purpose....: Get name of executable file
#
#   Returns....: Exe pathname
#
##########################################################################*/

    .global RdosGetExeName
    
RdosGetExeName:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        UserGate get_exe_name_nr
        jc rgenFail

    movl %edi,%eax
    jmp rgenDone

rgenFail:
    xorl %eax,%eax

rgenDone:
        popl %edi
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenAdc
#
#   Purpose....: Open handle to ADC channel
#
#   Parameters.: Channel #
#
#   Returns....: Adc handle
#
##########################################################################*/

    .global RdosOpenAdc
    
RdosOpenAdc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%eax
        UserGate open_adc_nr
        movw %bx,%ax

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseAdc
#
#   Purpose....: Close ADC handle
#
#   Parameters.: Adc handle
#
##########################################################################*/

    .global RdosCloseAdc
    
RdosCloseAdc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate close_adc_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDefineAdcTime
#
#   Purpose....: Define time of next conversion
#
#   Parameters.: Adc handle
#                MSB time
#                LSB time
#
##########################################################################*/

    .global RdosDefineAdcTime
    
RdosDefineAdcTime:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edx

        movl 8(%ebp),%ebx
        movl 12(%ebp),%edx
        movl 16(%ebp),%eax
        UserGate define_adc_time_nr

    popl %edx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadAdc
#
#   Purpose....: Read ADC
#
#   Parameters.: Adc handle
#                
#   Returns....: Value
#
##########################################################################*/

    .global RdosReadAdc
    
RdosReadAdc:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate read_adc_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadSerialLines
#
#   Purpose....: Read serial lines
#
#   Parameters.: Device
#                &Value
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosReadSerialLines
    
RdosReadSerialLines:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx
        pushl %esi

        movb 8(%ebp),%dh
        UserGate read_serial_lines_nr
        jc rdsFail

        movzx %al,%eax
        movl 12(%ebp),%esi
        movl %eax,(%esi)
        movl $1,%eax
        jmp rdsDone

rdsFail:
        xorl %eax,%eax

rdsDone:
        popl %esi
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosToggleSerialLine
#
#   Purpose....: Toggle serial line
#
#   Parameters.: Device
#                Line
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosToggleSerialLine
    
RdosToggleSerialLine:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx

        movb 8(%ebp),%dh
        movb 12(%ebp),%dl
        UserGate toggle_serial_line_nr
        jc rtsFail

        movl $1,%eax
        jmp rtsDone

rtsFail:
        xorl %eax,%eax

rtsDone:
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadSerialVal
#
#   Purpose....: Read serial value
#
#   Parameters.: Device
#                Line
#                &Val
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosReadSerialVal
    
RdosReadSerialVal:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx
        pushl %esi

        movb 8(%ebp),%dh
        movb 12(%ebp),%dl
        UserGate read_serial_val_nr

    pushfw
        shll $8,%eax
        movl 16(%ebp),%esi
        movl %eax,(%esi)
    popfw
        jc rdvFail

        movl $1,%eax
        jmp rdvDone

rdvFail:
        xorl %eax,%eax

rdvDone:
        popl %esi
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteSerialVal
#
#   Purpose....: Write serial value
#
#   Parameters.: Device
#                Line
#                Val
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosWriteSerialVal
    
RdosWriteSerialVal:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx

        movb 8(%ebp),%dh
        movb 12(%ebp),%dl
        movl 16(%ebp),%eax
        sarl $8,%eax
        UserGate write_serial_val_nr
        jc rwvFail

        movl $1,%eax
        jmp rwvDone

rwvFail:
        xorl %eax,%eax

rwvDone:
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadSerialRaw
#
#   Purpose....: Read serial raw value
#
#   Parameters.: Device
#                Line
#                &Val
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosReadSerialRaw
    
RdosReadSerialRaw:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx
        pushl %esi

        movb 8(%ebp),%dh
        movb 12(%ebp),%dl
        UserGate read_serial_val_nr

    pushfw
        movl 16(%ebp),%esi
        movl %eax,(%esi)
    popfw
        jc rdrFail

        movl $1,%eax
        jmp rdrDone

rdrFail:
        xorl %eax,%eax

rdrDone:
        popl %esi
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteSerialRaw
#
#   Purpose....: Write serial raw value
#
#   Parameters.: Device
#                Line
#                Val
#                
#   Returns....: TRUE if ok
#
##########################################################################*/

    .global RdosWriteSerialRaw
    
RdosWriteSerialRaw:
        pushl %ebp
        movl %esp,%ebp
        pushl %edx

        movb 8(%ebp),%dh
        movb 12(%ebp),%dl
        movl 16(%ebp),%eax
        UserGate write_serial_val_nr
        jc rwrFail

        movl $1,%eax
        jmp rwrDone

rwrFail:
        xorl %eax,%eax

rwrDone:
        popl %edx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenSysEnv
#
#   Purpose....: Open system environment
#                
#   Returns....: Env handle
#
##########################################################################*/

    .global RdosOpenSysEnv
    
RdosOpenSysEnv:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        UserGate open_sys_env_nr
        jc oseFail

        movzx %bx,%eax
        jmp oseDone

oseFail:
        xorl %eax,%eax

oseDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenProcessEnv
#
#   Purpose....: Open process environment
#                
#   Returns....: Env handle
#
##########################################################################*/

    .global RdosOpenProcessEnv
    
RdosOpenProcessEnv:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        UserGate open_proc_env_nr
        jc opeFail

        movzx %bx,%eax
        jmp opeDone

opeFail:
        xorl %eax,%eax

opeDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseEnv
#
#   Purpose....: Close environment
#
#   Parameters.: Env handle
#
##########################################################################*/

    .global RdosCloseEnv
    
RdosCloseEnv:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate close_env_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosAddEnvVar
#
#   Purpose....: Add environment variable
#
#   Parameters.: Env handle
#                var
#                data
#
##########################################################################*/

    .global RdosAddEnvVar
    
RdosAddEnvVar:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        movl 16(%ebp),%edi
        UserGate add_env_var_nr

        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDeleteEnvVar
#
#   Purpose....: Delete environment variable
#
#   Parameters.: Env handle
#                var
#
##########################################################################*/

    .global RdosDeleteEnvVar
    
RdosDeleteEnvVar:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        UserGate delete_env_var_nr

        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosFindEnvVar
#
#   Purpose....: Find environment variable
#
#   Parameters.: Env handle
#                var
#                data
#
##########################################################################*/

    .global RdosFindEnvVar
    
RdosFindEnvVar:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        movl 16(%ebp),%edi
        UserGate find_env_var_nr
        jc fevFail

        movl $1,%eax
        jmp fevDone

fevFail:
        xorl %eax,%eax

fevDone:
        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGetEnvData
#
#   Purpose....: Get raw environment data
#
#   Parameters.: Env handle
#                data
#
##########################################################################*/

    .global RdosGetEnvData
    
RdosGetEnvData:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%edi
        UserGate get_env_data_nr
        jnc gedDone

        xorw %ax,%ax
        stosw

gedDone:
        popl %edi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosSetEnvData
#
#   Purpose....: Set raw environment data
#
#   Parameters.: Env handle
#                data
#
##########################################################################*/

    .global RdosSetEnvData
    
RdosSetEnvData:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%edi
        UserGate set_env_data_nr

        popl %edi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenSysIni
#
#   Purpose....: Open system ini-file
#
#   Returns....: Ini handle
#
##########################################################################*/

    .global RdosOpenSysIni
    
RdosOpenSysIni:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        UserGate open_sys_ini_nr
        jc osiFail

        movzx %bx,%eax
        jmp osiDone

osiFail:
        xorl %eax,%eax

osiDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCloseIni
#
#   Purpose....: Close ini-file
#
#   Parameters.: Ini handle
#
##########################################################################*/

    .global RdosCloseIni
    
RdosCloseIni:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate close_ini_nr

        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosGotoIniSection
#
#   Purpose....: Goto ini section
#
#   Parameters.: Ini handle
#                SectionName
#
##########################################################################*/

    .global RdosGotoIniSection
    
RdosGotoIniSection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%edi
        UserGate goto_ini_section_nr
        jc gisFail

        movl $1,%eax
        jmp gisDone

gisFail:
        xorl %eax,%eax

gisDone:
        popl %edi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosRemoveIniSection
#
#   Purpose....: Remove current ini section
#
#   Parameters.: Ini handle
#
##########################################################################*/

    .global RdosRemoveIniSection
    
RdosRemoveIniSection:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx

        movl 8(%ebp),%ebx
        UserGate remove_ini_section_nr
        jc risFail

        movl $1,%eax
        jmp risDone

risFail:
        xorl %eax,%eax

risDone:
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosReadIni
#
#   Purpose....: Read ini var in current section
#
#   Parameters.: Ini handle
#                VarName
#                Data
#                MaxSize
#
##########################################################################*/

    .global RdosReadIni
    
RdosReadIni:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %ecx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        movl 16(%ebp),%edi
        movl 20(%ebp),%ecx
        UserGate read_ini_nr
        jc riFail

        movl $1,%eax
        jmp riDone

riFail:
        xorl %eax,%eax

riDone:
        popl %edi
        popl %esi
        popl %ecx
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosWriteIni
#
#   Purpose....: Write ini var in current section
#
#   Parameters.: Ini handle
#                VarName
#                Data
#
##########################################################################*/

    .global RdosWriteIni
    
RdosWriteIni:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi
        pushl %edi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        movl 16(%ebp),%edi
        UserGate write_ini_nr
        jc wiFail

        movl $1,%eax
        jmp wiDone

wiFail:
        xorl %eax,%eax

wiDone:
        popl %edi
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDeleteIni
#
#   Purpose....: Delete ini var in current section
#
#   Parameters.: Ini handle
#                VarName
#
##########################################################################*/

    .global RdosDeleteIni
    
RdosDeleteIni:
        pushl %ebp
        movl %esp,%ebp
        pushl %ebx
        pushl %esi

        movl 8(%ebp),%ebx
        movl 12(%ebp),%esi
        UserGate delete_ini_nr
        jc diFail

        movl $1,%eax
        jmp diDone

diFail:
        xorl %eax,%eax

diDone:
        popl %esi
        popl %ebx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosCreateFileDrive
#
#   Purpose....: Create a new file-drive
#
#   Parameters.: Drive
#                Size
#                FS name
#                Filename
#
##########################################################################*/

    .global RdosCreateFileDrive
    
RdosCreateFileDrive:
        pushl %ebp
        movl %esp,%ebp
        pushl %ecx
        pushl %esi
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%ecx
        movl 16(%ebp),%esi
        movl 20(%ebp),%edi
        UserGate create_file_drive_nr
        jnc cfdOk

    xorl %eax,%eax
    jmp cfdDone

cfdOk:
        movl $1,%eax

cfdDone:
        popl %edi
        popl %esi
        popl %ecx
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosOpenFileDrive
#
#   Purpose....: Open a new file-drive
#
#   Parameters.: Drive
#                Filename
#
##########################################################################*/

    .global RdosOpenFileDrive
    
RdosOpenFileDrive:
        pushl %ebp
        movl %esp,%ebp
        pushl %edi

        movb 8(%ebp),%al
        movl 12(%ebp),%edi
        UserGate open_file_drive_nr
        jnc ofdOk

        xorl %eax,%eax
        jmp ofdDone

ofdOk:
        movl $1,%eax

ofdDone:
        popl %edi
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosEnableStatusLed
#
#   Purpose....: Enable status LED
#
##########################################################################*/

    .global RdosEnableStatusLed
    
RdosEnableStatusLed:
        pushl %ebp
        movl %esp,%ebp
        UserGate enable_status_led_nr
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosDisableStatusLed
#
#   Purpose....: Disable status LED
#
##########################################################################*/

    .global RdosDisableStatusLed
    
RdosDisableStatusLed:
        pushl %ebp
        movl %esp,%ebp
        UserGate disable_status_led_nr
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosStartWatchdog
#
#   Purpose....: Start watchdog
#
#   Parameters.: Timeout, ms
#
##########################################################################*/

    .global RdosStartWatchdog
    
RdosStartWatchdog:
        pushl %ebp
        movl %esp,%ebp
;
        movl 8(%ebp),%eax
        UserGate start_watchdog_nr
;       
    leave
    ret
                                                                                    
/*##########################################################################
#
#   Name       : RdosKickWatchdog
#
#   Purpose....: Kick watchdog
#
##########################################################################*/

    .global RdosKickWatchdog
    
RdosKickWatchdog:
        pushl %ebp
        movl %esp,%ebp
        UserGate kick_watchdog_nr
    leave
    ret
                                            

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.