summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/libopenbios/forth_load.c
blob: c3a1929f2d69e68cc1978d6e10b540ff59c1c7ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* tag: forth source loader
 *
 * Copyright (C) 2004 Stefan Reinauer
 *
 * See the file "COPYING" for further information about
 * the copyright and warranty status of this work.
 */

#include "config.h"
#include "kernel/kernel.h"
#include "libopenbios/bindings.h"
#include "libopenbios/sys_info.h"
#include "libc/diskio.h"
#include "libopenbios/forth_load.h"
#define printk printk
#define debug printk

static int fd;
static char *forthtext=NULL;

int is_forth(char *forth)
{
	return (forth[0] == '\\' && forth[1] == ' ');
}

int forth_load(ihandle_t dev)
{
    char magic[2];
    unsigned long forthsize;
    int retval = -1;

    /* Mark the saved-program-state as invalid */
    feval("0 state-valid !");

    fd = open_ih(dev);
    if (fd == -1) {
	goto out;
    }

    if (read_io(fd, magic, 2) != 2) {
	debug("Can't read magic header\n");
	retval = LOADER_NOT_SUPPORT;
	goto out;
    }

    if (!is_forth(magic)) {
	debug("No forth source image\n");
	retval = LOADER_NOT_SUPPORT;
	goto out;
    }

    /* Calculate the file size by seeking to the end of the file */
    seek_io(fd, -1);
    forthsize = tell(fd);
    forthtext = malloc(forthsize+1);
    seek_io(fd, 0);

    printk("Loading forth source ...");
    if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) {
	printk("Can't read forth text\n");
	goto out;
    }
    forthtext[forthsize]=0;
    printk("ok\n");

    // Initialise saved-program-state
    PUSH((ucell)forthtext);
    feval("saved-program-state >sps.entry !");
    PUSH((ucell)forthsize);
    feval("saved-program-state >sps.file-size !");
    feval("forth saved-program-state >sps.file-type !");

    feval("-1 state-valid !");

    retval=0;

out:
    //if (forthtext)
    //	free(forthtext);
    return retval;
}

void 
forth_init_program(void)
{
	// Currently not implemented
	feval("0 state-valid !");
}