Annotation of frontvm/hardware/loadfe2.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Loads fe2.bin into ST memory and applies all the relocations.
                      3:  * fe2.bin (and any crap as68k generates) is just plain atari
                      4:  * prg format, so we could load anything that understood the
                      5:  * stripped down and weirdified hardware of this VM.
                      6:  */
                      7: 
                      8: #include <SDL.h>
                      9: #include <SDL_types.h>
                     10: 
                     11: #include "main.h"
                     12: #include "decode.h"
                     13: #include "dialog.h"
                     14: #include "file.h"
                     15: #include "m68000.h"
                     16: #include "memAlloc.h"
                     17: #include "stMemory.h"
                     18: #include "loadfe2.h"
                     19: 
                     20: static void *fe2file;
                     21: static long len;
                     22: static long code_end;
                     23: static int buf_pos;
                     24: 
                     25: static int rd_int ()
                     26: {
                     27:        int val = STMemory_Swap68000Long (*(Uint32 *)(fe2file+buf_pos));
                     28:        buf_pos += 4;
                     29:        return val;
                     30: }
                     31: 
                     32: static unsigned char rd_byte ()
                     33: {
                     34:        unsigned char val = *(unsigned char*)(fe2file+buf_pos);
                     35:        buf_pos++;
                     36:        return val;
                     37: }
                     38: 
                     39: static int get_fixup (int reloc)
                     40: {
                     41:        int old_bufpos;
                     42:        int next;
                     43:        static int reloc_pos;
                     44: 
                     45:        old_bufpos = buf_pos;
                     46:        if (reloc == 0) {
                     47:                buf_pos = code_end;
                     48:                reloc = rd_int ();
                     49:                reloc_pos = buf_pos;
                     50:                buf_pos = old_bufpos;
                     51:                if (reloc == 0) return 0;
                     52:                else return reloc + FE2BASE;
                     53:        } else {
                     54:                buf_pos = reloc_pos;
                     55: again:
                     56:                next = rd_byte ();
                     57:                if (next == 0) {
                     58:                        buf_pos = old_bufpos;
                     59:                        return 0;
                     60:                } else if (next == 1) {
                     61:                        reloc += 254;
                     62:                        goto again;
                     63:                }
                     64:                else reloc += next;
                     65:                reloc_pos = buf_pos;
                     66:                buf_pos = old_bufpos;
                     67:                return reloc;
                     68:        }
                     69: }
                     70: 
                     71: void LoadFE2 ()
                     72: {
                     73:        int reloc, next, pos, i = 0;
                     74:        fe2file = File_Read ("fe2.bin", NULL, &len, NULL);
                     75:        
                     76:        if (!len) {
                     77:                printf ("Error loading fe2.bin\n");
                     78:                SDL_Quit ();
                     79:                exit (-2);
                     80:        }
                     81:        buf_pos = 2;
                     82:        code_end = 0x1c + rd_int ();
                     83:        
                     84:        reloc = FE2BASE;
                     85:        for (i=0x1c; i<code_end; i++) {
                     86:                STMemory_WriteByte (reloc, *(char *)(fe2file+i));
                     87:                reloc++;
                     88:        }
                     89: 
                     90:        i=0;
                     91:        reloc = get_fixup (0);
                     92:        while (reloc) {
                     93:                i++;
                     94:                pos = buf_pos;
                     95:                /* address to be modified */
                     96:                buf_pos = reloc;
                     97:                next = STMemory_ReadLong (buf_pos);
                     98:                next += FE2BASE;
                     99:                STMemory_WriteLong (buf_pos, next);
                    100:                if (next > code_end+FE2BASE) {
                    101:                        printf ("Reloc 0x%x (0x%x) out of range..\n", next, reloc+FE2BASE);
                    102:                }
                    103:                buf_pos = pos;
                    104:                reloc = get_fixup (reloc);
                    105:        }
                    106:        printf ("fe2.bin 0x%lx bytes (code end 0x%lx), %d fixups; loaded at 0x%x.\n", len, code_end, i, FE2BASE);
                    107:        
                    108:        Memory_Free (fe2file);
                    109: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.