add code
This commit is contained in:
commit
0dd6e6a828
|
@ -0,0 +1,31 @@
|
||||||
|
# i am using the testing name for this, copcom
|
||||||
|
|
||||||
|
copper compiler i guess. i use this because i am not a respectable amiga programmer. in fact at time of writing i am NOT an amiga programmer AT ALL!
|
||||||
|
|
||||||
|
the syntax is as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
m a8 a16 MOVE / you can put comments here!
|
||||||
|
w a8 a7 a7 a7 WAIT / VP HP VE (BFD in bit 6) HE
|
||||||
|
s a8 a7 a7 a7 SKIP / VP HP VE (BFD in bit 6) HE
|
||||||
|
```
|
||||||
|
|
||||||
|
`aX` is an operand with X bits. it can be any integer, and if prefixed with `x` it will be treated as hex.
|
||||||
|
|
||||||
|
leaving out arguments is undefined behavior, by which i mean i put in exactly zero safeguards for it because i am too lazy to make a proper wordizer!
|
||||||
|
|
||||||
|
example:
|
||||||
|
```
|
||||||
|
m x10 xaa55
|
||||||
|
w x30 x30 xff xff
|
||||||
|
s x30 x30 xff xff ASDKASL
|
||||||
|
s x20 x20 x10 x10 salkalk
|
||||||
|
```
|
||||||
|
|
||||||
|
the command line is as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
copcom in0 out0 in1 out1 in2 out2 # for as many input files as you have
|
||||||
|
```
|
||||||
|
|
||||||
|
public domain because this code sucks!
|
|
@ -0,0 +1,24 @@
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
|
@ -0,0 +1,154 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
const char* cs[3] = {"MOVE", "WAIT", "SKIP"};
|
||||||
|
|
||||||
|
unsigned int nlen(char* s, char c) {
|
||||||
|
unsigned int r = 0;
|
||||||
|
while(s[r] != c) r++;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hexint(char* s) {
|
||||||
|
long r = 0;
|
||||||
|
int n;
|
||||||
|
for(int i = 0; i < strlen(s); i++) {
|
||||||
|
if(s[i] > 47 && s[i] < 58) n = s[i] - 48;
|
||||||
|
else if(s[i] > 64 && s[i] < 71) n = s[i] - 55;
|
||||||
|
else if(s[i] > 96 && s[i] < 103) n = s[i] - 87;
|
||||||
|
else return -1;
|
||||||
|
r <<= 4;
|
||||||
|
r |= n;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int intget(char* s, char c) {
|
||||||
|
int l = nlen(s, c);
|
||||||
|
char* ns = malloc(l + 1);
|
||||||
|
memcpy(ns, s, l);
|
||||||
|
int r;
|
||||||
|
ns[l] = 0;
|
||||||
|
if(*s == 'x') r = hexint(ns + 1);
|
||||||
|
else r = atoi(ns);
|
||||||
|
free(ns);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define wslb(s) (intget(s, ' ') << 8) | ((intget(s + 1 + nlen(s, ' '), ' ') & 0x7F) << 1)
|
||||||
|
|
||||||
|
unsigned int toarr(char* d, unsigned int l, char*** line) {
|
||||||
|
unsigned int r = 0, c = 0;
|
||||||
|
*line = malloc(sizeof(char*));
|
||||||
|
for(; c < l; r++) {
|
||||||
|
unsigned int sl = nlen(d + c, '\n');
|
||||||
|
if(sl == 0) {
|
||||||
|
r--;
|
||||||
|
c++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*line = realloc(*line, sizeof(char*) * r+1);
|
||||||
|
(*line)[r] = malloc(sl + 1);
|
||||||
|
memcpy((*line)[r], d + c, sl);
|
||||||
|
(*line)[r][sl] = 0;
|
||||||
|
c += sl + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if(argc < 2 || !(argc & 1)) exit(!!printf("arg format: [src] [out] [src] [out]\n"));
|
||||||
|
for(int ac = 0; ac < argc / 2; ac++) {
|
||||||
|
char* srcfile = argv[1 + (ac * 2)];
|
||||||
|
char* destfile = argv[2 + (ac * 2)];
|
||||||
|
|
||||||
|
printf("; -- %s > %s --\n", srcfile, destfile);
|
||||||
|
|
||||||
|
struct stat ssi, sdi;
|
||||||
|
|
||||||
|
int si = open(srcfile, O_RDONLY);
|
||||||
|
if(si == -1) {
|
||||||
|
printf("error opening %s: %s\n", srcfile, strerror(errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int di = open(destfile, O_CREAT | O_RDWR, 0666);
|
||||||
|
if(di == -1) {
|
||||||
|
printf("error opening %s: %s\n", destfile, strerror(errno));
|
||||||
|
if(si != -1) close(si);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fstat(si, &ssi);
|
||||||
|
fstat(di, &sdi);
|
||||||
|
|
||||||
|
char* sm = malloc(ssi.st_size);
|
||||||
|
|
||||||
|
read(si, sm, ssi.st_size);
|
||||||
|
|
||||||
|
close(si);
|
||||||
|
|
||||||
|
char** line;
|
||||||
|
unsigned int colnum = toarr(sm, ssi.st_size, &line);
|
||||||
|
uint16_t* o = malloc(4 * colnum);
|
||||||
|
for(unsigned int i = 0; i < colnum; i++) {
|
||||||
|
if(strlen(line[i]) < 3) goto err;
|
||||||
|
int command = 5;
|
||||||
|
for(int c = 0; c < 3; c++) if(*line[i] == "mws"[c]) command = c;
|
||||||
|
if(command == 5) goto err;
|
||||||
|
if(line[i][1] != ' ') goto err;
|
||||||
|
uint16_t l = 0, h = 0;
|
||||||
|
switch(command) {
|
||||||
|
case 0: // m
|
||||||
|
h = (intget(line[i] + 2, ' ') & 0xFF) << 1;
|
||||||
|
l = intget(line[i] + 3 + nlen(line[i] + 2, ' '), 0);
|
||||||
|
break;
|
||||||
|
case 1: // w
|
||||||
|
h = (((intget(line[i] + 2, ' ') & 0xFF) << 8)
|
||||||
|
| (intget(line[i] + 3 + nlen(line[i] + 2, ' '), ' ')
|
||||||
|
& 0x7F) << 1) | 1;
|
||||||
|
int c = nlen(line[i] + 2, ' ') + 3;
|
||||||
|
l = wslb(line[i] + c + nlen(line[i] + c, ' ') + 1);
|
||||||
|
break;
|
||||||
|
case 2: // s
|
||||||
|
h = (((intget(line[i] + 2, ' ') & 0xFF) << 8)
|
||||||
|
| (intget(line[i] + 3 + nlen(line[i] + 2, ' '), ' ')
|
||||||
|
& 0x7F) << 1) | 1;
|
||||||
|
c = nlen(line[i] + 2, ' ') + 3;
|
||||||
|
l = wslb(line[i] + c + nlen(line[i] + c, ' ') + 1) | 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
o[(i<<1)|1] = l;
|
||||||
|
o[(i<<1)] = h;
|
||||||
|
|
||||||
|
printf("dc.w $%04X, $%04X; decode %s (%s)\n", h, l, cs[command], line[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
err:
|
||||||
|
for(unsigned int i = 0; i < colnum; i++) free(line[i]);
|
||||||
|
free(line);
|
||||||
|
close(di);
|
||||||
|
free(sm);
|
||||||
|
exit(!!printf("parse err\n"));
|
||||||
|
|
||||||
|
end:
|
||||||
|
for(unsigned int i = 0; i < colnum; i++) free(line[i]);
|
||||||
|
free(sm);
|
||||||
|
free(line);
|
||||||
|
ftruncate(di, 4 * colnum);
|
||||||
|
write(di, o, 4 * colnum);
|
||||||
|
close(di);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue