File: compile_rom.c

package info (click to toggle)
xtrs 4.9-5
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 2,164 kB
  • ctags: 1,433
  • sloc: ansic: 19,840; makefile: 242; csh: 132; sh: 129
file content (140 lines) | stat: -rw-r--r-- 3,067 bytes parent folder | download | duplicates (8)
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * Copyright (C) 1992 Clarendon Hill Software.
 *
 * Permission is granted to any individual or institution to use, copy,
 * or redistribute this software, provided this copyright notice is retained. 
 *
 * This software is provided "as is" without any expressed or implied
 * warranty.  If this software brings on any sort of damage -- physical,
 * monetary, emotional, or brain -- too bad.  You've got no one to blame
 * but yourself. 
 *
 * The software may be modified for your own purposes, but modified versions
 * must retain this notice.
 */

/*
   Modified by Timothy Mann, 1996
   Last modified on Sat Apr 25 00:57:31 PDT 1998 by mann
*/

#include "z80.h"
#include "load_cmd.h"

char *program_name;
static int highest_address = 0;
static Uchar memory[Z80_ADDRESS_LIMIT];
static Uchar loadmap[Z80_ADDRESS_LIMIT];

/* Called by load_hex */
void hex_data(int address, int value)
{
  address &= 0xffff;

  memory[address] = value;
  if(highest_address < address)
    highest_address = address;
}

void hex_transfer_address(int address)
{
  /* Ignore */
}

static void load_rom(char *filename)
{
  FILE *program;
  int c, a;
    
  if((program = fopen(filename, "r")) == NULL)
    {
      char message[100];
      sprintf(message, "could not read %s", filename);
      fatal(message);
    }
  c = getc(program);
  if (c == ':') {
    /* Assume Intel hex format */
    rewind(program);
    load_hex(program);
    fclose(program);
    return;
  } else if (c == 1 || c == 5) {
    /* Assume MODELA/III file */
    int res;
    rewind(program);
    res = load_cmd(program, memory, loadmap, 0, NULL, -1, NULL, NULL, 1);
    if (res == LOAD_CMD_OK) {
      highest_address = Z80_ADDRESS_LIMIT;
      while (highest_address > 0) {
	if (loadmap[--highest_address] != 0) {
	  break;
	}
      }
      fclose(program);
      return;
    } else {
      /* Guess it wasn't one */
      rewind(program);
      c = getc(program);
    } 
  }
  a = 0;
  while (c != EOF) {
    hex_data(a++, c);
    c = getc(program);
  }
}

static void write_output(char *which)
{
  int address = 0;
  int i;
    
  highest_address++;

  printf("int trs_rom%s_size = %d;\n", which, highest_address);
  printf("unsigned char trs_rom%s[%d] = \n{\n", which, highest_address);
    
  while(address < highest_address) 
    {
      printf("    ");
      for(i = 0; i < 8; ++i)
	{
	  printf("0x%.2x,", memory[address++]);

	  if(address == highest_address)
	    break;
	}
      printf("\n");
    }
  printf("};\n");
}

static void write_norom_output(char *which)
{
  printf("int trs_rom%s_size = -1;\n", which);
  printf("unsigned char trs_rom%s[1];\n", which);
}

int main(int argc, char *argv[])
{
  program_name = argv[0];
  if(argc == 2)
    {
      fprintf(stderr,
        "%s: no specified ROM file, ROM %s will not be built into program.\n",
	program_name, argv[1]);
      write_norom_output(argv[1]);
    }
  else if(argc != 3)
    {
      fprintf(stderr, "Usage: %s model hexfile", program_name);
    }
  else
    {
      load_rom(argv[2]);
      write_output(argv[1]);
    }
  return 0;
}