190 lines
6.7 KiB
C
190 lines
6.7 KiB
C
/* ------------------------------------------------------------------------
|
|
System : Manx Aztec C65 Version 3.2b
|
|
MS-DOS cross-development environment
|
|
Platform : Apple IIe 128K PRODOS 8
|
|
Program : dlodelo.c
|
|
Description : G2 Library Routine
|
|
|
|
Written by : Bill Buckels
|
|
Revision Date: Dec 29, 2012
|
|
|
|
Licence : You may use this code for whatever you wish as long
|
|
as you agree that Bill Buckels has no warranty or
|
|
liability obligations whatsoever from said use.
|
|
------------------------------------------------------------------------ */
|
|
|
|
#include <fcntl.h>
|
|
|
|
/* the following loads two non-compressed
|
|
graphics image formats associated with
|
|
double lores mode...
|
|
|
|
Single File Raster Format - DLO
|
|
2 Part Bsaved Image Format - DL1 and DL2
|
|
|
|
|
|
for bsaved images the convention of calling
|
|
the second image a .DL2 file is supported in
|
|
this loader when loading a 2 part image...
|
|
|
|
|
|
the load is split in the middle after loading
|
|
the first half into auxilliary memory */
|
|
|
|
|
|
extern char *dhrmain;
|
|
extern char *dhraux;
|
|
|
|
|
|
/* The following buffer is not very elegant but necessary I am afraid... when I tried to do a raw read
|
|
into screen memory some funky conflict was happening between ProDOS and screen memory and nothing would display.
|
|
|
|
So I separated my read operations from my display operations hence the buffer, unlike in the DOS 3.3 version
|
|
which reads directly to the screen.
|
|
|
|
*/
|
|
|
|
char lodebuf[1920];
|
|
|
|
int dlodelo(name)
|
|
char *name;
|
|
{
|
|
int fh, y, status=-2;
|
|
int c, fl = 1016, height, packet, jdx, idx;
|
|
char tempchar[2], name1[20], name2[20], *ptr1, *ptr2;
|
|
unsigned temp;
|
|
|
|
ptr1 = (char *)&lodebuf[0];
|
|
ptr2 = (char *)&lodebuf[40];
|
|
|
|
jdx = 999;
|
|
for (idx = 0; name[idx] != 0; idx++) {
|
|
name1[idx] = name[idx];
|
|
name2[idx] = name[idx];
|
|
if (name[idx] == '.') {
|
|
name1[idx] = 0;
|
|
name2[idx] = 0;
|
|
jdx = idx;
|
|
break;
|
|
|
|
}
|
|
}
|
|
if (jdx == 999) return status;
|
|
|
|
strcat(name2,".DL1");
|
|
|
|
/* start in main memory - page1 */
|
|
*dhrmain = 0;
|
|
fh = open(name2,O_RDONLY,0x3C); /* open a binary DL1 file */
|
|
/* if we can't open a DL1 we must be loading a raster file
|
|
so open a DLO file... and if we can't open that
|
|
just fail... I don't want garbage in here so
|
|
I don't support creative naming... */
|
|
if (fh == -1) {
|
|
strcat(name1,".DLO");
|
|
fl = 1922;
|
|
/* main memory - page1 */
|
|
*dhrmain = 0;
|
|
fh = open(name1,O_RDONLY,0x3C);
|
|
if (fh == -1) {
|
|
/* main memory - page1 */
|
|
*dhrmain = 0;
|
|
return -1;
|
|
}
|
|
}
|
|
else {
|
|
/* if we opened a DL1 then get ready to open a DL2 */
|
|
strcat(name1,".DL2");
|
|
}
|
|
|
|
switch(fl) {
|
|
case 1922:
|
|
/* is it a DLO ? */
|
|
c = read(fh,tempchar,2);
|
|
if (c!=2) {
|
|
close(fh);
|
|
break;
|
|
}
|
|
packet= (int)tempchar[0];
|
|
height= (int)tempchar[1];
|
|
if (height != 24 || packet != 80) {
|
|
close(fh);
|
|
break;
|
|
}
|
|
c = read(fh,lodebuf,1920);
|
|
close(fh);
|
|
if (c!=1920)break;
|
|
status = 0;
|
|
|
|
idx = 0;
|
|
|
|
/* The following is not very elegant I am afraid... but when I tried to do this
|
|
in a loop using an address array like in the DOS 3.3 version I kept hitting some kind of limitation
|
|
so I used constants and an onerous code-block instead which worked... so here it is...
|
|
|
|
*/
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0400,40); /* switch to auxilliary memory - page2 */
|
|
dhrmain[0] = 0; movmem(ptr2+idx,0x0400,40);/* switch back to main memory - page1 */
|
|
idx += 80;
|
|
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0480,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0480,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0500,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0500,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0580,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0580,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0600,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0600,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0680,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0680,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0700,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0700,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0780,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0780,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0428,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0428,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x04A8,40); dhrmain[0] = 0; movmem(ptr2+idx,0x04A8,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0528,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0528,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x05A8,40); dhrmain[0] = 0; movmem(ptr2+idx,0x05A8,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0628,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0628,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x06A8,40); dhrmain[0] = 0; movmem(ptr2+idx,0x06A8,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0728,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0728,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x07A8,40); dhrmain[0] = 0; movmem(ptr2+idx,0x07A8,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0450,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0450,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x04D0,40); dhrmain[0] = 0; movmem(ptr2+idx,0x04D0,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0550,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0550,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x05D0,40); dhrmain[0] = 0; movmem(ptr2+idx,0x05D0,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0650,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0650,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x06D0,40); dhrmain[0] = 0; movmem(ptr2+idx,0x06D0,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x0750,40); dhrmain[0] = 0; movmem(ptr2+idx,0x0750,40); idx += 80;
|
|
dhraux[0] = 0; movmem(ptr1+idx,0x07D0,40); dhrmain[0] = 0; movmem(ptr2+idx,0x07D0,40);
|
|
break;
|
|
|
|
case 1016:
|
|
/* is it a bsaved image */
|
|
c = read(fh,lodebuf,1016);
|
|
close(fh);
|
|
if (c != 1016)break;
|
|
|
|
/* switch to auxilliary memory - page2 */
|
|
*dhraux = 0;
|
|
movmem(ptr1,0x0400,1016);
|
|
|
|
/* switch back to main memory - page1 */
|
|
*dhrmain = 0;
|
|
fh = open(name1,O_RDONLY,0x3C); /* open a binary DL2 file */
|
|
if (fh == -1) {
|
|
status = -1;
|
|
break;
|
|
}
|
|
c = read(fh,lodebuf,1016);
|
|
close(fh);
|
|
if (c != 1016)break;
|
|
|
|
/* switch back to main memory - page1 */
|
|
*dhrmain = 0;
|
|
movmem(ptr1,0x0400,1016);
|
|
|
|
status=0;
|
|
break;
|
|
}
|
|
|
|
/* switch back to main memory - page1 */
|
|
*dhrmain = 0;
|
|
|
|
return status;
|
|
}
|
|
|