mirror of
https://github.com/gmcn42/mt32-pi-control.git
synced 2026-09-22 18:37:58 +00:00
New binaries, better file handling
This commit is contained in:
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
@@ -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
@@ -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, ®s, ®s);
|
|
||||||
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, ®s, ®s, &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, ®s, ®s, &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, ®s, ®s);
|
|
||||||
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, ®s, ®s);
|
|
||||||
/* */
|
|
||||||
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, ®s, ®s, &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, ®s, ®s);
|
|
||||||
if (regs.x.cflag != 0) return(0 - regs.x.ax);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
+1
-1
@@ -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
@@ -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 |
Executable
BIN
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 194 B |
+2
-2
@@ -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/
|
||||||
|
|
||||||
Reference in new issue
Block a user