New binaries, better file handling

This commit is contained in:
Andreas Zdziarstek committed 2021-02-10 20:13:26 +01:00
1 parent 1eb3258b7f
commit 8ed64e0578
11 files changed
+45 -209

No files matched your search

Binary file not shown.
Binary file not shown.
+40 -27
View File
@@ -34,7 +34,6 @@
#include "midi_dev.h" #include "midi_dev.h"
#include "getopt.h" #include "getopt.h"
#include "delay.h" #include "delay.h"
#include "file_io.h"
#include "miniwift.h" #include "miniwift.h"
#ifndef PROGRAM_NAME #ifndef PROGRAM_NAME
@@ -364,15 +363,13 @@ int main(int argc, char *argv[]) {
// -Y/--syx FILE.SYX // -Y/--syx FILE.SYX
if(syx_fname[0] != '\0') { if(syx_fname[0] != '\0') {
unsigned char fbuf[512]; unsigned char fbuf[512];
struct file_t fh; FILE *fh;
int ret;
if(verbose) if(verbose)
fprintf(stderr, "Sending %s.\n", syx_fname); fprintf(stderr, "Sending %s.\n", syx_fname);
ret = fio_open(&fh, syx_fname, FIO_OPEN_RD); fh = fopen(syx_fname, "rb");
if(ret!=0) { if(fh == NULL) {
fprintf(stderr, "ERROR: Can't open %s.\n", syx_fname); fprintf(stderr, "ERROR: Can't open %s.\n", syx_fname);
mididev_deinit(); mididev_deinit();
return EXIT_FAILURE; return EXIT_FAILURE;
@@ -382,8 +379,8 @@ int main(int argc, char *argv[]) {
while(1) { while(1) {
int i, found_start, found_end, start_index, end_index; int i, found_start, found_end, start_index, end_index;
int n; int n;
long int read_start = fh.curpos; long int read_start = ftell(fh);
n = fio_read(&fh, fbuf, 512); n = fread(fbuf, 1, 512, fh);
found_start = 0; found_start = 0;
found_end = 0; found_end = 0;
@@ -421,11 +418,11 @@ int main(int argc, char *argv[]) {
mididev_send_bytes(fbuf+start_index, end_index - start_index+1); mididev_send_bytes(fbuf+start_index, end_index - start_index+1);
// Wait grace period // Wait grace period
delay_ms(100); delay_ms(100);
if(read_start + end_index+1 == fh.curpos) if(read_start + end_index+1 == ftell(fh))
break; break;
fio_seek(&fh, FIO_SEEK_START, read_start + end_index+1); fseek(fh, read_start + end_index+1, SEEK_SET);
} }
fio_close(&fh); fclose(fh);
} }
mididev_deinit(); mididev_deinit();
@@ -475,38 +472,54 @@ static void bmp_to_sysex_disp_sc55(unsigned char *sysexbuf, const char *fname, i
const unsigned char prefix[7] = { 0xF0, 0x41, 0x10, 0x45, 0x12, 0x10, 0x01 }; const unsigned char prefix[7] = { 0xF0, 0x41, 0x10, 0x45, 0x12, 0x10, 0x01 };
int i; int i;
unsigned char fbuf[64]; unsigned char fbuf[64];
struct file_t fh; FILE *fh;
int ret; int flen;
unsigned char pix_offset; unsigned char pix_offset;
memset(sysexbuf, '\0', 74); memset(sysexbuf, '\0', 74);
/* Copy SysEx start and display cmd into msg */ /* Copy SysEx start and display cmd into msg */
memcpy(sysexbuf, prefix, 7); memcpy(sysexbuf, prefix, 7);
ret = fio_open(&fh, fname, FIO_OPEN_RD); fh = fopen(fname, "rb");
if(ret!=0) { if(fh == NULL) {
fprintf(stderr, "ERROR: Can't open %s.\n", fname); fprintf(stderr, "ERROR: Can't open %s.\n", fname);
abort(); abort();
} }
// check if this is a BMP // check if this is a BMP
fio_read(&fh, fbuf, 2); if(!fread(fbuf, 1, 2, fh)) {
fprintf(stderr, "Error reading %s.\n", sc55_bmp_fname);
fclose(fh);
abort();
}
if(!(fbuf[0]=='B' && fbuf[1]=='M')) { if(!(fbuf[0]=='B' && fbuf[1]=='M')) {
fprintf(stderr, "ERROR: %s is not a valid BMP file.\n", sc55_bmp_fname); fprintf(stderr, "ERROR: %s is not a valid BMP file.\n", sc55_bmp_fname);
fio_close(&fh); fclose(fh);
abort(); abort();
} }
// check offset of pixel array // check offset of pixel array
fio_seek(&fh, FIO_SEEK_START, 0xA); fseek(fh, 0xA, SEEK_SET);
fio_read(&fh, &pix_offset, 1); if(!fread(&pix_offset, 1, 1, fh)) {
fprintf(stderr, "Error reading %s.\n", sc55_bmp_fname);
if(fh.flen - pix_offset < 64) { fclose(fh);
abort();
}
fseek(fh, 0, SEEK_END);
flen = ftell(fh);
if(flen - pix_offset < 64) {
fprintf(stderr, "ERROR: %s seems to be too small in size.\n", sc55_bmp_fname); fprintf(stderr, "ERROR: %s seems to be too small in size.\n", sc55_bmp_fname);
fio_close(&fh); fclose(fh);
abort(); abort();
} }
// read pixel array // read pixel array
fio_seek(&fh, FIO_SEEK_START, pix_offset); fseek(fh, pix_offset, SEEK_SET);
fio_read(&fh, fbuf, 64); if(!fread(fbuf, 1, 64, fh)) {
fio_close(&fh); fprintf(stderr, "Error reading %s.\n", sc55_bmp_fname);
fclose(fh);
abort();
}
fclose(fh);
// Perform bit-manipulation magic to // Perform bit-manipulation magic to
// build the SysEx // build the SysEx
Binary file not shown.
-177
View File
@@ -1,177 +0,0 @@
/*
* File I/O, based on the DOSMID source code
* http://dosmid.sourceforge.net
*
* Copyright (C) 2018 Mateusz Viste
* with modifications
* Copyright (C) 2021 Andreas Zdziarstek
*/
#include <dos.h> /* REGS */
#include <string.h> /* _fmemcpy() */
#include "file_io.h"
#define FIO_FLAG_SEEKSYNC 1
static void fio_seek_sync(struct file_t *f) {
/* DOS 2+ - LSEEK - SET CURRENT FILE POSITION
AH = 42h
AL = origin of move
00h start of file
01h current file position
02h end of file
BX = file handle
CX:DX = (signed) offset from origin of new file position
Return on success:
CF clear
DX:AX = new file position in bytes from start of file
Return on error:
CF set
AX = error code */
union REGS regs;
unsigned short *off;
long offset;
if ((f->flags & FIO_FLAG_SEEKSYNC) == 0) return;
offset = f->curpos;
off = (unsigned short *)(&offset);
regs.x.ax = 0x4200u;
regs.x.bx = f->fh;
regs.x.cx = off[1];
regs.x.dx = off[0];
int86(0x21, &regs, &regs);
f->flags &= ~FIO_FLAG_SEEKSYNC;
/* if (regs.x.cflag != 0) return(0 - regs.x.ax);
return(((long)regs.x.dx << 16) | regs.x.ax); */
}
/* seek to offset position of file pointed at by fhandle. returns current file position on success, a negative error otherwise */
signed long fio_seek(struct file_t *f, unsigned short origin, signed long offset) {
switch (origin) {
case FIO_SEEK_START:
if (offset < 1) {
f->curpos = 0;
} else {
f->curpos = offset;
}
break;
case FIO_SEEK_END:
f->curpos = f->flen;
case FIO_SEEK_CUR:
f->curpos += offset;
break;
}
f->flags |= FIO_FLAG_SEEKSYNC;
return(f->curpos);
}
static void loadcache(struct file_t *f) {
union REGS regs;
struct SREGS sregs;
fio_seek_sync(f);
f->flags |= FIO_FLAG_SEEKSYNC;
f->bufoffs = f->curpos;
regs.h.ah = 0x3f;
regs.x.bx = f->fh;
regs.x.cx = FIO_CACHE;
sregs.ds = FP_SEG(f->buff);
regs.x.dx = FP_OFF(f->buff);
int86x(0x21, &regs, &regs, &sregs);
}
/* open file fname and set fhandle with the associated file handle. returns 0 on success, non-zero otherwise */
int fio_open(struct file_t *f, const char *fname, int mode) {
/* DOS 2+ - OPEN - OPEN EXISTING FILE
AH = 3Dh
AL = access and sharing modes
DS:DX -> ASCIZ filename
CL = attribute mask of files to look for (server call only)
Return:
CF clear if successful
AX = file handle or error code
CF set on error */
union REGS regs;
struct SREGS sregs;
/* */
regs.h.ah = 0x3d;
regs.h.al = mode;
sregs.ds = FP_SEG(fname);
regs.x.dx = FP_OFF(fname);
int86x(0x21, &regs, &regs, &sregs);
f->fh = regs.x.ax;
if (regs.x.cflag != 0) return(-1);
/* */
f->curpos = 0;
loadcache(f);
/* fseek to end so I know the file length */
regs.x.ax = 0x4202u;
regs.x.bx = f->fh;
regs.x.cx = 0;
regs.x.dx = 0;
int86(0x21, &regs, &regs);
f->flen = (((long)regs.x.dx << 16) | regs.x.ax);
/* fseek to start */
regs.x.ax = 0x4200u;
regs.x.bx = f->fh;
regs.x.cx = 0;
regs.x.dx = 0;
int86(0x21, &regs, &regs);
/* */
f->flags = FIO_FLAG_SEEKSYNC;
return(0);
}
/* reads count bytes from file pointed at by fhandle, and writes the data into buff. returns the number of bytes actually read, or a negative number on error */
int fio_read(struct file_t *f, void *buff, int count) {
/* DOS 2+ - READ - READ FROM FILE OR DEVICE
* AH = 3Fh
* BX = file handle
* CX = number of bytes to read
* DS:DX -> buffer for data
* Return:
* CF clear if successful
* AX = number of bytes actually read (0 if at EOF before call)
* CF set on error
* AX = error code (05h,06h) (see #01680 at AH=59h/BX=0000h) */
union REGS regs;
struct SREGS sregs;
if (f->curpos + count > f->flen) count = f->flen - f->curpos;
if (count == 0) return(0);
if (count <= FIO_CACHE) {
if ((f->curpos < f->bufoffs) || (f->curpos + count > f->bufoffs + FIO_CACHE)) {
loadcache(f);
}
_fmemcpy(buff, f->buff + (f->curpos - f->bufoffs), count);
f->curpos += count;
return(count);
}
fio_seek_sync(f);
regs.h.ah = 0x3f;
regs.x.bx = f->fh;
regs.x.cx = count;
sregs.ds = FP_SEG(buff);
regs.x.dx = FP_OFF(buff);
int86x(0x21, &regs, &regs, &sregs);
if (regs.x.cflag != 0) return(0 - regs.x.ax);
f->curpos += regs.x.ax;
return(regs.x.ax);
}
/* close file handle. returns 0 on success, non-zero otherwise */
int fio_close(struct file_t *f) {
/* DOS 2+ - CLOSE - CLOSE FILE
AH = 3Eh
BX = file handle
Return on success:
CF clear
AX destroyed
On error:
CF set
AX = error code */
union REGS regs;
regs.h.ah = 0x3e;
regs.x.bx = f->fh;
int86(0x21, &regs, &regs);
if (regs.x.cflag != 0) return(0 - regs.x.ax);
return(0);
}
+1 -1
View File
@@ -17,7 +17,7 @@ MODE = s
all: mt32-pi.exe all: mt32-pi.exe
mt32-pi.exe: ..\COMMON~1\mt32-pi.c mpu401.c midi_dev.c ..\COMMON~1\getopt.c mt32-pi.exe: ..\COMMON~1\mt32-pi.c mpu401.c midi_dev.c ..\COMMON~1\getopt.c
*wcl -i=..\COMMON~1\ -zp2 -lr -we -d0 -y -0 -s -m$(MODE) -wx -dUSE_CUSTOM_FILE_IO -dUSE_CUSTOM_DELAY -dREPLACE_GETOPT -fe=mt32-pi.exe -fm=mt32-pi.map *.c ..\COMMON~1\*.c *wcl -i=..\COMMON~1\ -zp2 -lr -we -d0 -y -0 -s -m$(MODE) -wx -dUSE_CUSTOM_DELAY -dREPLACE_GETOPT -fe=mt32-pi.exe -fm=mt32-pi.map *.c ..\COMMON~1\*.c
dist: mt32-pi.exe .symbolic dist: mt32-pi.exe .symbolic
UPXCOMP.BAT UPXCOMP.BAT
+2 -2
View File
@@ -35,6 +35,6 @@ clean :
.PHONY: dist .PHONY: dist
dist: $(PROGRAM_NAME) dist: $(PROGRAM_NAME)
cp -v $(PROGRAM_NAME) ../amiga_bin/ cp -v $(PROGRAM_NAME) ../linux_bin/
cp -v *.bmp ../amiga_bin/ cp -v *.bmp ../linux_bin/
Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

+2 -2
View File
@@ -35,6 +35,6 @@ clean :
.PHONY: dist .PHONY: dist
dist: $(PROGRAM_NAME) dist: $(PROGRAM_NAME)
cp -v $(PROGRAM_NAME) ../amiga_bin/ cp -v $(PROGRAM_NAME) ../win32_bin/
cp -v *.bmp ../amiga_bin/ cp -v *.bmp ../win32_bin/