Search
lxdream.org :: lxdream/src/dcload.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/dcload.c
changeset 183:5938ecc01dc8
prev182:e3b513538548
next209:ff67a7b9aa17
author nkeynes
date Thu Jul 06 22:44:39 2006 +0000 (14 years ago)
permissions -rw-r--r--
last change Use r5 for the exit value, not r4 (that was dumb...)
view annotate diff log raw
     1 /**
     2  * $Id: dcload.c,v 1.5 2006-07-06 22:44:39 nkeynes Exp $
     3  * 
     4  * DC-load syscall implementation.
     5  *
     6  * Copyright (c) 2005 Nathan Keynes.
     7  *
     8  * This program is free software; you can redistribute it and/or modify
     9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    16  * GNU General Public License for more details.
    17  */
    19 #include <stdio.h>
    20 #include "dream.h"
    21 #include "dreamcast.h"
    22 #include "mem.h"
    23 #include "syscall.h"
    24 #include "sh4/sh4core.h"
    26 #define SYS_READ 0
    27 #define SYS_WRITE 1
    28 #define SYS_OPEN 2
    29 #define SYS_CLOSE 3
    30 #define SYS_CREAT 4
    31 #define SYS_LINK 5
    32 #define SYS_UNLINK 6
    33 #define SYS_CHDIR 7
    34 #define SYS_CHMOD 8
    35 #define SYS_LSEEK 9
    36 #define SYS_FSTAT 10
    37 #define SYS_TIME 11
    38 #define SYS_STAT 12
    39 #define SYS_UTIME 13
    40 #define SYS_ASSIGNWRKMEM 14
    41 #define SYS_EXIT 15
    42 #define SYS_OPENDIR 16
    43 #define SYS_CLOSEDIR 17
    44 #define SYS_READDIR 18
    45 #define SYS_GETHOSTINFO 19
    47 #define SYS_MAGIC 0xDEADBEEF
    48 #define SYS_MAGIC_ADDR 0x8c004004
    49 #define SYSCALL_ADDR 0x8c004008
    51 static gboolean dcload_allow_exit = FALSE;
    53 void dcload_set_allow_exit( gboolean allow )
    54 {
    55     dcload_allow_exit = allow;
    56 }
    58 void dcload_syscall( uint32_t syscall_id ) 
    59 {
    60     uint32_t syscall = sh4r.r[4];
    61     switch( sh4r.r[4] ) {
    62     case SYS_READ:
    63 	if( sh4r.r[5] == 0 ) {
    64 	    char *buf = mem_get_region( sh4r.r[6] );
    65 	    int length = sh4r.r[7];
    66 	    sh4r.r[0] = read( 0, buf, length );
    67 	} else {
    68 	    sh4r.r[0] = -1;
    69 	}
    70 	break;
    71     case SYS_WRITE:
    72 	if( sh4r.r[5] == 1 || sh4r.r[5] == 2 ) {
    73 	    char *buf = mem_get_region( sh4r.r[6] );
    74 	    int length = sh4r.r[7];
    75 	    sh4r.r[0] = write( sh4r.r[5], buf, length );
    76 	} else {
    77 	    sh4r.r[0] = -1;
    78 	}
    79 	break;
    80     case SYS_EXIT:
    81 	if( dcload_allow_exit ) 
    82 	    exit( sh4r.r[5] );
    83 	else
    84 	    dreamcast_stop();
    85     default:
    86 	sh4r.r[0] = -1;
    87     }
    89 }
    91 void dcload_install() 
    92 {
    93     syscall_add_hook_vector( 0xF0, SYSCALL_ADDR, dcload_syscall );
    94     sh4_write_long( SYS_MAGIC_ADDR, SYS_MAGIC );
    95 }
.