2 Commits
v1.1 ... v3.0

Author SHA1 Message Date
8c78aab32e Improve ttttt to add block format byte 2024-11-11 19:22:05 +00:00
1c7ab48330 Simplify build by adapting checksum program
This now prepends length bytes as well as adding checksum
2024-11-11 10:17:34 +00:00
8 changed files with 119 additions and 71 deletions

7
.gitignore vendored
View File

@ -1,4 +1,5 @@
*.tap
*bin
*bincs
ac
*.block
body
header
ttttt

View File

@ -1,33 +1,28 @@
program.tap: program.asm headerbincs body.tap
pasmo program.asm program.tap
program.tap: header.block body.block
cat header.block body.block > program.tap
headerbincs: headerbin ac
cp headerbin headerbincs
./ac headerbincs
header.block: header ttttt
./ttttt header header
headerbin: header.tap
dd if=header.tap of=headerbin bs=1 count=18
header: header.asm body.block
pasmo header.asm headerlong
dd if=headerlong of=header bs=17 count=1
rm -f headerlong
header.tap: header.asm body.tap
pasmo header.asm header.tap
body.block: body ttttt
./ttttt body data
body.tap: body.asm bodybincs
pasmo body.asm body.tap
body: remload.asm code.asm
pasmo remload.asm body
bodybincs: bodybin ac
cp bodybin bodybincs
./ac bodybincs
bodybin: remload.asm code.asm
pasmo remload.asm bodybin
ac: append_checksum.c
cc append_checksum.c -o ac
ttttt: ttttt.c
cc ttttt.c -o ttttt
clean:
rm -f *.tap
rm -f *bin
rm -f *bincs
rm -f ac
rm -f *.block
rm -f body
rm -f header
rm -f ttttt
.PHONY: clean

View File

@ -1,26 +0,0 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd;
unsigned char tally = 0;
unsigned char next = 0;
if (argc!=2) return -1;
fd = open(argv[1], O_RDWR|O_APPEND);
if (fd<0) return -2;
while (read(fd, &next, 1)) {
//printf("Tally: %X, next byte: %X\n", tally, next);
tally ^= next;
};
printf("Final tally: %X\n", tally);
write(fd, &tally, 1);
close(fd);
return 0;
}

View File

@ -1,7 +0,0 @@
bodylength:
dw bodyend - bodycontent
bodycontent:
INCBIN bodybincs
bodyend:

View File

@ -1,6 +1,3 @@
headerflag:
db 0
blocktype:
db 0 ;basic program
@ -20,5 +17,5 @@ checksum:
db 0
bodytap:
INCBIN body.tap
INCBIN body.block
endbodytap:

View File

@ -1,5 +0,0 @@
headlength:
dw 19
INCBIN headerbincs
INCBIN body.tap

View File

@ -1,7 +1,5 @@
org #5cca
org #5ccb
bodyformat:
db #ff
linenumber:
db #00 ;MSB
db #00 ;LSB

95
ttttt.c Normal file
View File

@ -0,0 +1,95 @@
/* McPhail's Tip-Top TAP Top-Tailer
* Takes a raw code file as input
* Prepends data length and appends xor checksum
* Outputs to new file with .block suffix */
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/limits.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fdin, fdout;
char outfilename[PATH_MAX];
unsigned int count = 0;
unsigned char flagopt = 0;
unsigned char tally = 0;
unsigned char next = 0;
if ((argc<2) || (argc>3)) {
printf("Please specify file to read.\n");
return -1;
}
if (3==argc) {
if (!strcmp(argv[2], "header")) flagopt = 1;
if (!strcmp(argv[2], "data")) flagopt = 2;
if (!flagopt) {
printf("Optional flags are \"header\" or \"data\"\n");
return -1;
}
}
if (! flagopt) {
printf("*** WARNING ***\n");
printf("*** ttttt is running in RAW mode.\n");
printf("*** Have you manually included the format flag as the first byte of the block?\n");
printf("*** If not, run again passing 'header' or 'data' as the second parameter.\n");
printf("*** WARNING ***\n\n");
}
fdin = open(argv[1], O_RDONLY);
if (fdin<0) {
printf("Couldn't open %s. for reading\n", argv[1]);
return -1;
}
snprintf(outfilename, PATH_MAX, "%s.block", argv[1]);
outfilename[PATH_MAX - 1] = '\0';
if (! strcmp(argv[1], outfilename)) {
printf("Filename too long - would clobber existing.\n");
close(fdin);
return -1;
}
fdout = open(outfilename, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
if (fdout<0) {
printf("Couldn't open %s for writing.\n", outfilename);
close(fdin);
return -1;
}
while (read(fdin, &next, 1)) {
tally ^= next;
count ++;
};
lseek(fdin, 0, SEEK_SET);
if (flagopt) count++;
char lsb = (count+1)&255;
char msb = ((count+1)>>8)&255;
write(fdout, &lsb, 1);
write(fdout, &msb, 1);
next = 0;
if (flagopt == 2) next = 255;
if (flagopt) {
write(fdout, &next, 1);
tally ^= next;
}
while (read(fdin, &next, 1)) {
write(fdout, &next, 1);
}
write(fdout, &tally, 1);
close(fdout);
close(fdin);
printf("File %s written.\n", outfilename);
count--;
printf("Code length is %d (0x%.4X).\n", count, count);
return 0;
}