]> git.sur5r.net Git - cc65/blob - src/da65/code.c
2a879459c1a174137a8d069b0cc0f4bee83a7d42
[cc65] / src / da65 / code.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                  code.c                                   */
4 /*                                                                           */
5 /*                          Binary code management                           */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2000      Ullrich von Bassewitz                                       */
10 /*               Wacholderweg 14                                             */
11 /*               D-70597 Stuttgart                                           */
12 /* EMail:        uz@musoftware.de                                            */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #include <stdio.h>
37 #include <string.h>
38 #include <errno.h>
39
40 /* common */
41 #include "check.h"
42
43 /* da65 */
44 #include "error.h"
45 #include "code.h"
46
47
48
49 /*****************************************************************************/
50 /*                                   Data                                    */
51 /*****************************************************************************/
52
53
54
55 unsigned char CodeBuf [0x10000];        /* Code buffer */
56 unsigned long CodeStart;                /* Start address */
57 unsigned long CodeEnd;                  /* End address */
58 unsigned long PC;                       /* Current PC */
59
60
61
62 /*****************************************************************************/
63 /*                                   Code                                    */
64 /*****************************************************************************/
65
66
67
68 void LoadCode (const char* Name, unsigned long StartAddress)
69 /* Load the code from the given file */
70 {
71     unsigned Count, MaxCount;
72     FILE* F;
73
74
75     PRECONDITION (StartAddress < 0x10000);
76
77     /* Calculate the maximum code size */
78     MaxCount = 0x10000 - StartAddress;
79
80     /* Open the file */
81     F = fopen (Name, "rb");
82     if (F == 0) {
83         Error ("Cannot open `%s': %s", Name, strerror (errno));
84     }
85
86     /* Read from the file and remember the number of bytes read */
87     Count = fread (CodeBuf + StartAddress, 1, MaxCount, F);
88     if (ferror (F)) {
89         Error ("Error reading from `%s': %s", Name, strerror (errno));
90     }
91     if (Count == 0) {
92         Error ("File `%s' contains no data", Name);
93     }
94
95     /* Set the buffer variables */
96     CodeStart = PC = StartAddress;
97     CodeEnd = CodeStart + Count - 1;    /* CodeEnd is inclusive */
98 }
99
100
101
102 unsigned char GetCodeByte (unsigned Addr)
103 /* Get a byte from the given address */
104 {
105     PRECONDITION (Addr <= CodeEnd);
106     return CodeBuf [Addr];
107 }
108
109
110
111 unsigned GetCodeWord (unsigned Addr)
112 /* Get a word from the given address */
113 {
114     unsigned Lo = GetCodeByte (Addr);
115     unsigned Hi = GetCodeByte (Addr+1);
116     return Lo | (Hi << 8);
117 }
118
119
120
121 unsigned long GetCodeDWord (unsigned Addr)
122 /* Get a dword from the given address */
123 {
124     unsigned long Lo = GetCodeWord (Addr);
125     unsigned long Hi = GetCodeWord (Addr+2);
126     return Lo | (Hi << 16);
127 }
128
129
130
131 unsigned GetRemainingBytes (void)
132 /* Return the number of remaining code bytes */
133 {
134     if (CodeEnd >= PC) {
135         return (CodeEnd - PC + 1);
136     } else {
137         return 0;
138     }
139 }
140
141
142
143 int CodeLeft (void)
144 /* Return true if there are code bytes left */
145 {
146     return (PC <= CodeEnd);
147 }
148
149
150
151 void ResetCode (void)
152 /* Reset the code input to start over for the next pass */
153 {
154     PC = CodeStart;
155 }
156
157
158