diff options
Diffstat (limited to 'mmc')
| -rw-r--r-- | mmc/.gitignore | 6 | ||||
| -rw-r--r-- | mmc/Makefile | 30 | ||||
| -rw-r--r-- | mmc/assemble.c | 96 | ||||
| -rw-r--r-- | mmc/deinterleave.c | 27 | 
4 files changed, 159 insertions, 0 deletions
| diff --git a/mmc/.gitignore b/mmc/.gitignore new file mode 100644 index 0000000..33091db --- /dev/null +++ b/mmc/.gitignore @@ -0,0 +1,6 @@ +*.ssd +*.dsdi +assemble +deinterleave +BEEB.MMB +disk.img diff --git a/mmc/Makefile b/mmc/Makefile new file mode 100644 index 0000000..049083d --- /dev/null +++ b/mmc/Makefile @@ -0,0 +1,30 @@ +DSDI=$(wildcard *.dsdi)  +DSDI_SSD=${DSDI:%.dsdi=%-1.ssd} ${DSDI:%.dsdi=%-2.ssd} + +SSD=$(wildcard *.ssd) $(wildcard *.SSD) ${DSDI_SSD} + +DISK=/dev/mmcblk0p1 + + + +default: disk.img +	mkdosfs -F 16 ${DISK} +	mcopy -i ${DISK} disk.img ::BEEB.MMB +	sync + +%-1.ssd:%.dsdi deinterleave +	./deinterleave $< $@ ${@:%-1.ssd=%-2.ssd} + +%-2.ssd:%.dsdi deinterleave +	./deinterleave $< ${@:%-2.ssd=%-1.ssd} $@ + +disk.img:assemble ${SSD} +	./assemble ${SSD} > $@  + +assemble:assemble.c +deinterleave:deinterleave.c + +clean: +	/bin/rm -f deinterleave assemble disk.img ${DSDI_SSD} + + diff --git a/mmc/assemble.c b/mmc/assemble.c new file mode 100644 index 0000000..05bf769 --- /dev/null +++ b/mmc/assemble.c @@ -0,0 +1,96 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <strings.h> + + + +char buf[204800]; + +int write_entry(int image,void *ptr) +{ +off_t o=(image+1)*16; +lseek(1,o,SEEK_SET); +write(1,ptr,16); +} + +int write_image(int image,void *ptr) +{ +off_t o=(image*204800)+8192; +lseek(1,o,SEEK_SET); +write(1,ptr,204800); +} + + +int main(int argc,char *argv[]) +{ +int image=0; +int fd,i; +uint8_t entry[16]; +char *ptr; + + +bzero(entry,sizeof(entry)); +entry[0]=0; +entry[1]=1; +entry[2]=2; +entry[3]=3; +lseek(1,0L,SEEK_SET); +write(1,entry,16); + + +for (argc--,argv++; argc;argc--,argv++)  +{ + +bzero(buf,sizeof(buf)); +fd=open(*argv,O_RDONLY); +read(fd,buf,sizeof(buf)); +close(fd); + +ptr=strstr(*argv,".ssd"); +if (ptr) *ptr='\0'; +ptr=strstr(*argv,".SSD"); +if (ptr) *ptr='\0'; + +bzero(entry,sizeof(entry)); +strncpy(entry,*argv,12); + + +entry[12]=0; +entry[13]=0; +entry[14]=0; +entry[15]=0x0f; + +write_image(image,buf); +write_entry(image,entry); + +image++; +} + +bzero(buf,sizeof(buf)); +for (;image<511;++image) { + +bzero(entry,sizeof(entry)); +entry[15]=0xf0; +write_image(image,buf); +} + +} + + + + + + + + + + + + + + + + diff --git a/mmc/deinterleave.c b/mmc/deinterleave.c new file mode 100644 index 0000000..3e33d55 --- /dev/null +++ b/mmc/deinterleave.c @@ -0,0 +1,27 @@ +#include <stdio.h> + +int main(int argc,char *argv[]) +{ +	FILE *in=fopen(argv[1],"r"); +	FILE *o1=fopen(argv[2],"w"); +	FILE *o2=fopen(argv[3],"w"); +	char buf[2560]; +	unsigned track; + +	if (!in) return -1; +	if (!o1) return -1; +	if (!o2) return -1; + +	for (track=0;track<80;++track) { +		fread(buf,sizeof(buf),1,in); +		fwrite(buf,sizeof(buf),1,o1); +		fread(buf,sizeof(buf),1,in); +		fwrite(buf,sizeof(buf),1,o2); +	} + +	fclose(o2); +	fclose(o1); +	fclose(in); + +	return 0; +} | 
