Add fast loader library flossiec
This commit is contained in:
parent
5993f75c92
commit
3770a05aee
|
@ -119,6 +119,7 @@ The compiler is command line driven, and creates an executable .prg file.
|
||||||
* -d64 : create a d64 disk image
|
* -d64 : create a d64 disk image
|
||||||
* -f : add a binary file to the disk image
|
* -f : add a binary file to the disk image
|
||||||
* -fz : add a compressed binary file to the disk image
|
* -fz : add a compressed binary file to the disk image
|
||||||
|
* -fi : sector skip for data files on disk image
|
||||||
* -xz : extended zero page usage, more zero page space, but no return to basic
|
* -xz : extended zero page usage, more zero page space, but no return to basic
|
||||||
* -cid : cartridge type ID, used by vice emulator
|
* -cid : cartridge type ID, used by vice emulator
|
||||||
* -pp : compile in C++ mode
|
* -pp : compile in C++ mode
|
||||||
|
@ -930,6 +931,10 @@ Renders a hires image into a buffer at 0xe000..0xff40 and saves it to disk. The
|
||||||
|
|
||||||
Reads a hires image from disk into a buffer at 0xe000..0xff40 and displays it. The read can be performed without a secondary buffer, because writes to the ROM end up in the RAM underneath.
|
Reads a hires image from disk into a buffer at 0xe000..0xff40 and displays it. The read can be performed without a secondary buffer, because writes to the ROM end up in the RAM underneath.
|
||||||
|
|
||||||
|
#### Fasload image data "hiresfload.c"
|
||||||
|
|
||||||
|
Use the oscar flossiec fast loader to load a compressed multicolor image to 0xe000..0xff40 and 0xcc00..0xcfff.
|
||||||
|
|
||||||
### Remapping memory "memmap"
|
### Remapping memory "memmap"
|
||||||
|
|
||||||
The C64 memory map is very flexible. These samples show how to manipulate the memory map and use easyflash ROMs to execute larger programs.
|
The C64 memory map is very flexible. These samples show how to manipulate the memory map and use easyflash ROMs to execute larger programs.
|
||||||
|
|
|
@ -0,0 +1,608 @@
|
||||||
|
#include "flossiec.h"
|
||||||
|
#include <c64/iecbus.h>
|
||||||
|
#include <c64/vic.h>
|
||||||
|
#include <c64/cia.h>
|
||||||
|
#include <c64/kernalio.h>
|
||||||
|
|
||||||
|
#ifndef FLOSSIEC_NODISPLAY
|
||||||
|
#define FLOSSIEC_NODISPLAY 0
|
||||||
|
#endif
|
||||||
|
#ifndef FLOSSIEC_NOIRQ
|
||||||
|
#define FLOSSIEC_NOIRQ 0
|
||||||
|
#endif
|
||||||
|
#ifndef FLOSSIEC_BORDER
|
||||||
|
#define FLOSSIEC_BORDER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define VIA_ATNIN 0x80
|
||||||
|
#define VIA_ATNOUT 0x10
|
||||||
|
|
||||||
|
#define VIA_CLKOUT 0x08
|
||||||
|
#define VIA_DATAOUT 0x02
|
||||||
|
|
||||||
|
#define VIA_CLKIN 0x04
|
||||||
|
#define VIA_DATAIN 0x01
|
||||||
|
|
||||||
|
#define PORTB1 0x1800
|
||||||
|
#define PORTB2 0x1c00
|
||||||
|
|
||||||
|
#define WR 0x1d
|
||||||
|
|
||||||
|
#ifdef FLOSSIEC_CODE
|
||||||
|
#pragma code(FLOSSIEC_CODE)
|
||||||
|
#endif
|
||||||
|
#ifdef FLOSSIEC_BSS
|
||||||
|
#pragma bss(FLOSSIEC_BSS)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__asm diskcode
|
||||||
|
{
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
|
||||||
|
lda #VIA_CLKOUT
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
lda 0x0202
|
||||||
|
sta 0x0c
|
||||||
|
lda 0x0203
|
||||||
|
sta 0x0d
|
||||||
|
lda #$80
|
||||||
|
sta 0x03
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
l0:
|
||||||
|
txa
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sta 0x0700,x
|
||||||
|
inx
|
||||||
|
bne l0
|
||||||
|
|
||||||
|
lr:
|
||||||
|
lda 0x03
|
||||||
|
bmi lr
|
||||||
|
|
||||||
|
sei
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
l2:
|
||||||
|
lda #0
|
||||||
|
sta PORTB1
|
||||||
|
lda 0x0600, x
|
||||||
|
tay
|
||||||
|
and #0x0f
|
||||||
|
ora #VIA_DATAIN
|
||||||
|
l1:
|
||||||
|
bit PORTB1
|
||||||
|
bne l1
|
||||||
|
|
||||||
|
l3:
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
tya
|
||||||
|
asl
|
||||||
|
and #0x0a
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
lda 0x0700,y
|
||||||
|
nop
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
asl
|
||||||
|
nop
|
||||||
|
and #0x0a
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
inx
|
||||||
|
bne l2
|
||||||
|
|
||||||
|
lda #VIA_CLKOUT
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
|
||||||
|
lda 0x0600
|
||||||
|
beq w1
|
||||||
|
sta 0x0c
|
||||||
|
lda 0x0601
|
||||||
|
sta 0x0d
|
||||||
|
lda #$80
|
||||||
|
sta 0x03
|
||||||
|
cli
|
||||||
|
bne lr
|
||||||
|
w1:
|
||||||
|
sta PORTB1
|
||||||
|
|
||||||
|
cli
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CIA2B_ATNOUT 0x08
|
||||||
|
#define CIA2B_CLKOUT 0x10
|
||||||
|
#define CIA2B_DATAOUT 0x20
|
||||||
|
|
||||||
|
#define CIA2B_CLKIN 0x40
|
||||||
|
#define CIA2B_DATAIN 0x80
|
||||||
|
|
||||||
|
#define CIA2PRA 0xdd00
|
||||||
|
|
||||||
|
static char remap[256];
|
||||||
|
static char rbuffer[256];
|
||||||
|
static char xbuffer[256];
|
||||||
|
static char flpos;
|
||||||
|
static char xcmd;
|
||||||
|
static char xi, xj;
|
||||||
|
static char fldrive;
|
||||||
|
static char flvxor;
|
||||||
|
|
||||||
|
__noinline void fl_read_buf(void)
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
#if FLOSSIEC_NOIRQ
|
||||||
|
php
|
||||||
|
sei
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lda CIA2PRA
|
||||||
|
and #~CIA2B_CLKOUT
|
||||||
|
sta accu
|
||||||
|
sta CIA2PRA
|
||||||
|
and #~CIA2B_DATAOUT
|
||||||
|
sta accu + 1
|
||||||
|
|
||||||
|
l0:
|
||||||
|
lda CIA2PRA
|
||||||
|
and #CIA2B_CLKIN
|
||||||
|
beq l0
|
||||||
|
#if !FLOSSIEC_NOIRQ
|
||||||
|
php
|
||||||
|
pla
|
||||||
|
and #$04
|
||||||
|
beq iq
|
||||||
|
#endif
|
||||||
|
ldy #0
|
||||||
|
sec
|
||||||
|
l1:
|
||||||
|
ldx accu + 1
|
||||||
|
#if !FLOSSIEC_NODISPLAY
|
||||||
|
l2:
|
||||||
|
lda 0xd012
|
||||||
|
sbc #50
|
||||||
|
bcc w1
|
||||||
|
and #7
|
||||||
|
beq l2
|
||||||
|
#endif
|
||||||
|
w1:
|
||||||
|
stx CIA2PRA
|
||||||
|
|
||||||
|
#if FLOSSIEC_BORDER
|
||||||
|
inc 0xd020
|
||||||
|
#else
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
#endif
|
||||||
|
ldx accu
|
||||||
|
nop
|
||||||
|
|
||||||
|
lda CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
nop
|
||||||
|
eor CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
nop
|
||||||
|
eor CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sec
|
||||||
|
eor CIA2PRA
|
||||||
|
stx CIA2PRA
|
||||||
|
|
||||||
|
sta rbuffer, y
|
||||||
|
iny
|
||||||
|
bne l1
|
||||||
|
jmp done
|
||||||
|
#if !FLOSSIEC_NOIRQ
|
||||||
|
iq:
|
||||||
|
ldy #0
|
||||||
|
sec
|
||||||
|
l1i:
|
||||||
|
ldx accu + 1
|
||||||
|
l2i:
|
||||||
|
cli
|
||||||
|
sei
|
||||||
|
#if !FLOSSIEC_NODISPLAY
|
||||||
|
lda 0xd012
|
||||||
|
sbc #50
|
||||||
|
bcc w1i
|
||||||
|
and #7
|
||||||
|
beq l2i
|
||||||
|
w1i:
|
||||||
|
#endif
|
||||||
|
stx CIA2PRA
|
||||||
|
|
||||||
|
#if FLOSSIEC_BORDER
|
||||||
|
inc 0xd020
|
||||||
|
#else
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
#endif
|
||||||
|
ldx accu
|
||||||
|
nop
|
||||||
|
|
||||||
|
lda CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
nop
|
||||||
|
eor CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
nop
|
||||||
|
eor CIA2PRA
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sec
|
||||||
|
eor CIA2PRA
|
||||||
|
stx CIA2PRA
|
||||||
|
|
||||||
|
sta rbuffer, y
|
||||||
|
iny
|
||||||
|
bne l1i
|
||||||
|
cli
|
||||||
|
#endif
|
||||||
|
done:
|
||||||
|
|
||||||
|
#if FLOSSIEC_NOIRQ
|
||||||
|
plp
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
inline char flossiec_get(void)
|
||||||
|
{
|
||||||
|
if (!flpos)
|
||||||
|
{
|
||||||
|
fl_read_buf();
|
||||||
|
flpos = 2;
|
||||||
|
}
|
||||||
|
return remap[rbuffer[flpos++]];
|
||||||
|
}
|
||||||
|
|
||||||
|
void flossiec_decompress(void)
|
||||||
|
{
|
||||||
|
char i = 0, j = xj, cmd = xcmd;
|
||||||
|
xi = 0;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if (cmd & 0x80)
|
||||||
|
{
|
||||||
|
if (i < cmd)
|
||||||
|
{
|
||||||
|
char t = i - cmd;
|
||||||
|
do {
|
||||||
|
char ch = xbuffer[j++];
|
||||||
|
xbuffer[i++] = ch;
|
||||||
|
} while (i != t);
|
||||||
|
cmd = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd -= i;
|
||||||
|
do {
|
||||||
|
char ch = xbuffer[j++];
|
||||||
|
xbuffer[i++] = ch;
|
||||||
|
} while (i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char ch = flossiec_get();
|
||||||
|
if (cmd)
|
||||||
|
{
|
||||||
|
xbuffer[i++] = ch;
|
||||||
|
cmd--;
|
||||||
|
if (!i)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd = ch;
|
||||||
|
if (!cmd)
|
||||||
|
break;
|
||||||
|
if (cmd & 0x80)
|
||||||
|
{
|
||||||
|
cmd ^= 0x7f;
|
||||||
|
cmd++;
|
||||||
|
j = i - flossiec_get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xj = j;
|
||||||
|
xcmd = cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline char flossiec_get_lzo(void)
|
||||||
|
{
|
||||||
|
if (!xi)
|
||||||
|
flossiec_decompress();
|
||||||
|
return xbuffer[xi++];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool flossiec_eof(void)
|
||||||
|
{
|
||||||
|
return !remap[rbuffer[0]] && flpos >= remap[rbuffer[1]];
|
||||||
|
}
|
||||||
|
|
||||||
|
char * flossiec_read(char * dp, unsigned size)
|
||||||
|
{
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
*dp++ = flossiec_get();
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * flossiec_read_lzo(char * dp, unsigned size)
|
||||||
|
{
|
||||||
|
char i = xi;
|
||||||
|
|
||||||
|
dp -= i;
|
||||||
|
size += i;
|
||||||
|
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
if (!i)
|
||||||
|
flossiec_decompress();
|
||||||
|
|
||||||
|
if (size >= 256)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
dp[i] = xbuffer[i];
|
||||||
|
i++;
|
||||||
|
} while (i);
|
||||||
|
dp += 256;
|
||||||
|
size -= 256;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
dp[i] = xbuffer[i];
|
||||||
|
i++;
|
||||||
|
} while (i != (char)size);
|
||||||
|
dp += i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xi = i;
|
||||||
|
|
||||||
|
return dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vxorcheck(void)
|
||||||
|
{
|
||||||
|
char vxor = cia2.pra & 7;
|
||||||
|
vxor ^= vxor >> 2;
|
||||||
|
vxor ^= 0xff;
|
||||||
|
|
||||||
|
if (vxor != flvxor)
|
||||||
|
{
|
||||||
|
flvxor = vxor;
|
||||||
|
|
||||||
|
for(int i=0; i<256; i++)
|
||||||
|
{
|
||||||
|
char j = i ^ vxor;
|
||||||
|
char d = ((j & 0x11) << 3) |
|
||||||
|
(j & 0x66) |
|
||||||
|
((j & 0x88) >> 3);
|
||||||
|
remap[i] = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool flossiec_init(char drive)
|
||||||
|
{
|
||||||
|
fldrive = drive;
|
||||||
|
flvxor = 0;
|
||||||
|
|
||||||
|
iec_open(drive, 2, "#2");
|
||||||
|
iec_listen(drive, 2);
|
||||||
|
for(char j=0; j<127; j++)
|
||||||
|
iec_write(((char *)diskcode)[j]);
|
||||||
|
iec_unlisten();
|
||||||
|
|
||||||
|
iec_close(drive, 2);
|
||||||
|
|
||||||
|
iec_open(drive, 15, "");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flossiec_shutdown(void)
|
||||||
|
{
|
||||||
|
iec_close(fldrive, 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool flossiec_open(char track, char sector)
|
||||||
|
{
|
||||||
|
iec_listen(fldrive, 15);
|
||||||
|
iec_write(P'U');
|
||||||
|
iec_write(P'4');
|
||||||
|
iec_write(track);
|
||||||
|
iec_write(sector);
|
||||||
|
iec_unlisten();
|
||||||
|
|
||||||
|
cia2.pra |= CIA2B_DATAOUT;
|
||||||
|
|
||||||
|
|
||||||
|
#if FLOSSIEC_NODISPLAY
|
||||||
|
vic.ctrl1 &= ~VIC_CTRL1_DEN;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vic_waitFrame();
|
||||||
|
vxorcheck();
|
||||||
|
vic_waitFrame();
|
||||||
|
|
||||||
|
flpos = 0;
|
||||||
|
xi = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flossiec_close(void)
|
||||||
|
{
|
||||||
|
cia2.pra |= CIA2B_DATAOUT;
|
||||||
|
|
||||||
|
#if FLOSSIEC_NODISPLAY
|
||||||
|
vic.ctrl1 |= VIC_CTRL1_DEN;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool flosskio_init(char drive)
|
||||||
|
{
|
||||||
|
fldrive = drive;
|
||||||
|
flvxor = 0;
|
||||||
|
|
||||||
|
krnio_setnam_n("#2", 2);
|
||||||
|
krnio_open(2, drive, 2);
|
||||||
|
krnio_write(2, (char *)diskcode, 128);
|
||||||
|
krnio_close(2);
|
||||||
|
|
||||||
|
krnio_setnam_n(nullptr, 0);
|
||||||
|
krnio_open(15, drive, 15);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flosskio_shutdown(void)
|
||||||
|
{
|
||||||
|
krnio_close(15);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool flosskio_open(char track, char sector)
|
||||||
|
{
|
||||||
|
krnio_chkout(15);
|
||||||
|
krnio_chrout(P'U');
|
||||||
|
krnio_chrout(P'4');
|
||||||
|
krnio_chrout(track);
|
||||||
|
krnio_chrout(sector);
|
||||||
|
krnio_clrchn();
|
||||||
|
|
||||||
|
cia2.pra |= CIA2B_DATAOUT;
|
||||||
|
|
||||||
|
#if FLOSSIEC_NODISPLAY
|
||||||
|
vic.ctrl1 &= ~VIC_CTRL1_DEN;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vic_waitFrame();
|
||||||
|
vxorcheck();
|
||||||
|
vic_waitFrame();
|
||||||
|
|
||||||
|
flpos = 0;
|
||||||
|
xi = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flosskio_close(void)
|
||||||
|
{
|
||||||
|
cia2.pra |= CIA2B_DATAOUT;
|
||||||
|
|
||||||
|
#if FLOSSIEC_NODISPLAY
|
||||||
|
vic.ctrl1 |= VIC_CTRL1_DEN;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool mapdir(const char * fnames, floss_blk * blks)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
fl_read_buf();
|
||||||
|
|
||||||
|
char si = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (remap[rbuffer[si + 2]] == 0x82)
|
||||||
|
{
|
||||||
|
char fname[17];
|
||||||
|
char j = 0;
|
||||||
|
while (j < 16 && remap[rbuffer[si + j + 5]] != 0xa0)
|
||||||
|
{
|
||||||
|
fname[j] = remap[rbuffer[si + j + 5]];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
fname[j] = 0;
|
||||||
|
|
||||||
|
char sj = 0;
|
||||||
|
char k = 0;
|
||||||
|
while (fnames[sj])
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
while (fname[j] && fname[j] == fnames[sj])
|
||||||
|
{
|
||||||
|
j++;
|
||||||
|
sj++;
|
||||||
|
}
|
||||||
|
if (!fname[j] && (!fnames[sj] || fnames[sj] == ','))
|
||||||
|
{
|
||||||
|
__assume(k < 128);
|
||||||
|
blks[k].track = remap[rbuffer[si + 3]];
|
||||||
|
blks[k].sector = remap[rbuffer[si + 4]];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fnames[sj] && fnames[sj++] != ',')
|
||||||
|
;
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
si += 32;
|
||||||
|
} while (si);
|
||||||
|
|
||||||
|
} while (remap[rbuffer[0]]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool flosskio_mapdir(const char * fnames, floss_blk * blks)
|
||||||
|
{
|
||||||
|
if (flosskio_open(18, 1))
|
||||||
|
{
|
||||||
|
mapdir(fnames, blks);
|
||||||
|
|
||||||
|
flosskio_close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool flossiec_mapdir(const char * fnames, floss_blk * blks)
|
||||||
|
{
|
||||||
|
if (flossiec_open(18, 1))
|
||||||
|
{
|
||||||
|
mapdir(fnames, blks);
|
||||||
|
|
||||||
|
flossiec_close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
#ifndef FLOSSIEC_H
|
||||||
|
#define FLOSSIEC_H
|
||||||
|
|
||||||
|
// When building you can use various defines to change the behaviour
|
||||||
|
|
||||||
|
// FLOSSIEC_BORDER=1 Enable border flashing while loading
|
||||||
|
// FLOSSIEC_NODISPLAY=1 Disable the display while loading
|
||||||
|
// FLOSSIEC_NOIRQ=1 Disable IRQ during load
|
||||||
|
// FLOSSIEC_CODE=cseg Code segment to be used, when defined
|
||||||
|
// FLOSSIEC_BSS=bseg BSS segment to be used, when defined
|
||||||
|
|
||||||
|
// Initialize the fastloader to be used without the kernal
|
||||||
|
bool flossiec_init(char drive);
|
||||||
|
|
||||||
|
// Shutdown the fastloader when used without the kernal
|
||||||
|
void flossiec_shutdown(void);
|
||||||
|
|
||||||
|
// Open a file for read with the fastloader without the kernal.
|
||||||
|
// The file has to be read to completion before you can close
|
||||||
|
// it again,
|
||||||
|
bool flossiec_open(char track, char sector);
|
||||||
|
|
||||||
|
// Close a file after reading
|
||||||
|
void flossiec_close(void);
|
||||||
|
|
||||||
|
|
||||||
|
// Initialize the fastloader to be used with the kernal
|
||||||
|
bool flosskio_init(char drive);
|
||||||
|
|
||||||
|
// Shutdown the fastloader when used with the kernal
|
||||||
|
void flosskio_shutdown(void);
|
||||||
|
|
||||||
|
|
||||||
|
// Open a file for read with the fastloader with the kernal
|
||||||
|
// The file has to be read to completion before you can close
|
||||||
|
// it again,
|
||||||
|
bool flosskio_open(char track, char sector);
|
||||||
|
|
||||||
|
// Close a file after reading
|
||||||
|
void flosskio_close(void);
|
||||||
|
|
||||||
|
|
||||||
|
// Track and sector start of a file
|
||||||
|
struct floss_blk
|
||||||
|
{
|
||||||
|
char track, sector;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map a comma separated list of filenames to an array of
|
||||||
|
// block start positions by reading the directory, using the
|
||||||
|
// kernal.
|
||||||
|
bool flosskio_mapdir(const char * fnames, floss_blk * blks);
|
||||||
|
|
||||||
|
// Map a comma separated list of filenames to an array of
|
||||||
|
// block start positions by reading the directory, without the
|
||||||
|
// kernal.
|
||||||
|
bool flossiec_mapdir(const char * fnames, floss_blk * blks);
|
||||||
|
|
||||||
|
// Check for end of file while reading
|
||||||
|
inline bool flossiec_eof(void);
|
||||||
|
|
||||||
|
// Get one char from uncompressed file
|
||||||
|
inline char flossiec_get(void);
|
||||||
|
|
||||||
|
// Get one char from compressed file
|
||||||
|
inline char flossiec_get_lzo(void);
|
||||||
|
|
||||||
|
// Read a section of a file into memory up to size bytes,
|
||||||
|
// returns the first address after the read
|
||||||
|
char * flossiec_read(char * dp, unsigned size);
|
||||||
|
|
||||||
|
// Read and expand section of a file into memory up to size
|
||||||
|
// bytes, returns the first address after the read
|
||||||
|
char * flossiec_read_lzo(char * dp, unsigned size);
|
||||||
|
|
||||||
|
|
||||||
|
#pragma compile("flossiec.c")
|
||||||
|
|
||||||
|
#endif
|
|
@ -76,7 +76,7 @@ int main2(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.28.246");
|
strcpy(strProductVersion, "1.29.247");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint32_t length = sizeof(basePath);
|
uint32_t length = sizeof(basePath);
|
||||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,28,246,0
|
FILEVERSION 1,29,247,0
|
||||||
PRODUCTVERSION 1,28,246,0
|
PRODUCTVERSION 1,29,247,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -43,12 +43,12 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "oscar64"
|
VALUE "CompanyName", "oscar64"
|
||||||
VALUE "FileDescription", "oscar64 compiler"
|
VALUE "FileDescription", "oscar64 compiler"
|
||||||
VALUE "FileVersion", "1.28.246.0"
|
VALUE "FileVersion", "1.29.247.0"
|
||||||
VALUE "InternalName", "oscar64.exe"
|
VALUE "InternalName", "oscar64.exe"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2021"
|
VALUE "LegalCopyright", "Copyright (C) 2021"
|
||||||
VALUE "OriginalFilename", "oscar64.exe"
|
VALUE "OriginalFilename", "oscar64.exe"
|
||||||
VALUE "ProductName", "oscar64"
|
VALUE "ProductName", "oscar64"
|
||||||
VALUE "ProductVersion", "1.28.246.0"
|
VALUE "ProductVersion", "1.29.247.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -82,6 +82,12 @@
|
||||||
}
|
}
|
||||||
"Entry"
|
"Entry"
|
||||||
{
|
{
|
||||||
|
"MsmKey" = "8:_0CAC2197F4C34B33AFF5A3D0A7C78454"
|
||||||
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
}
|
||||||
|
"Entry"
|
||||||
|
{
|
||||||
"MsmKey" = "8:_0CC2E11595B34DF0A003DF534A5AADF5"
|
"MsmKey" = "8:_0CC2E11595B34DF0A003DF534A5AADF5"
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
@ -250,6 +256,12 @@
|
||||||
}
|
}
|
||||||
"Entry"
|
"Entry"
|
||||||
{
|
{
|
||||||
|
"MsmKey" = "8:_2CE4E742BFAC456C99ECA1DF0BFC5F34"
|
||||||
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
}
|
||||||
|
"Entry"
|
||||||
|
{
|
||||||
"MsmKey" = "8:_2D828D0247F144CDB0112B2AD4004C2C"
|
"MsmKey" = "8:_2D828D0247F144CDB0112B2AD4004C2C"
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
@ -364,6 +376,12 @@
|
||||||
}
|
}
|
||||||
"Entry"
|
"Entry"
|
||||||
{
|
{
|
||||||
|
"MsmKey" = "8:_43B55A11B25F4F13A9AE7E36B1AD2897"
|
||||||
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
}
|
||||||
|
"Entry"
|
||||||
|
{
|
||||||
"MsmKey" = "8:_44A56A2AD0C84900ACDDA218E57165D8"
|
"MsmKey" = "8:_44A56A2AD0C84900ACDDA218E57165D8"
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
@ -970,6 +988,12 @@
|
||||||
}
|
}
|
||||||
"Entry"
|
"Entry"
|
||||||
{
|
{
|
||||||
|
"MsmKey" = "8:_C30DFFA5DE3D4FEC982E5EB08F63C55E"
|
||||||
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
}
|
||||||
|
"Entry"
|
||||||
|
{
|
||||||
"MsmKey" = "8:_C3C6C74DFAB942AA8BFC15885A2D9BD0"
|
"MsmKey" = "8:_C3C6C74DFAB942AA8BFC15885A2D9BD0"
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
"OwnerKey" = "8:_UNDEFINED"
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
"MsmSig" = "8:_UNDEFINED"
|
||||||
|
@ -1647,6 +1671,26 @@
|
||||||
"IsDependency" = "11:FALSE"
|
"IsDependency" = "11:FALSE"
|
||||||
"IsolateTo" = "8:"
|
"IsolateTo" = "8:"
|
||||||
}
|
}
|
||||||
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0CAC2197F4C34B33AFF5A3D0A7C78454"
|
||||||
|
{
|
||||||
|
"SourcePath" = "8:..\\samples\\kernalio\\hiresfload.c"
|
||||||
|
"TargetName" = "8:hiresfload.c"
|
||||||
|
"Tag" = "8:"
|
||||||
|
"Folder" = "8:_35EAA89057B0488590EC66D0D27D657A"
|
||||||
|
"Condition" = "8:"
|
||||||
|
"Transitive" = "11:FALSE"
|
||||||
|
"Vital" = "11:TRUE"
|
||||||
|
"ReadOnly" = "11:FALSE"
|
||||||
|
"Hidden" = "11:FALSE"
|
||||||
|
"System" = "11:FALSE"
|
||||||
|
"Permanent" = "11:FALSE"
|
||||||
|
"SharedLegacy" = "11:FALSE"
|
||||||
|
"PackageAs" = "3:1"
|
||||||
|
"Register" = "3:1"
|
||||||
|
"Exclude" = "11:FALSE"
|
||||||
|
"IsDependency" = "11:FALSE"
|
||||||
|
"IsolateTo" = "8:"
|
||||||
|
}
|
||||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0CC2E11595B34DF0A003DF534A5AADF5"
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0CC2E11595B34DF0A003DF534A5AADF5"
|
||||||
{
|
{
|
||||||
"SourcePath" = "8:..\\include\\audio\\sidfx.h"
|
"SourcePath" = "8:..\\include\\audio\\sidfx.h"
|
||||||
|
@ -2207,6 +2251,26 @@
|
||||||
"IsDependency" = "11:FALSE"
|
"IsDependency" = "11:FALSE"
|
||||||
"IsolateTo" = "8:"
|
"IsolateTo" = "8:"
|
||||||
}
|
}
|
||||||
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2CE4E742BFAC456C99ECA1DF0BFC5F34"
|
||||||
|
{
|
||||||
|
"SourcePath" = "8:..\\include\\c64\\flossiec.c"
|
||||||
|
"TargetName" = "8:flossiec.c"
|
||||||
|
"Tag" = "8:"
|
||||||
|
"Folder" = "8:_247D4CAD3CB843B3A8A4DC2D90F47C28"
|
||||||
|
"Condition" = "8:"
|
||||||
|
"Transitive" = "11:FALSE"
|
||||||
|
"Vital" = "11:TRUE"
|
||||||
|
"ReadOnly" = "11:FALSE"
|
||||||
|
"Hidden" = "11:FALSE"
|
||||||
|
"System" = "11:FALSE"
|
||||||
|
"Permanent" = "11:FALSE"
|
||||||
|
"SharedLegacy" = "11:FALSE"
|
||||||
|
"PackageAs" = "3:1"
|
||||||
|
"Register" = "3:1"
|
||||||
|
"Exclude" = "11:FALSE"
|
||||||
|
"IsDependency" = "11:FALSE"
|
||||||
|
"IsolateTo" = "8:"
|
||||||
|
}
|
||||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2D828D0247F144CDB0112B2AD4004C2C"
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2D828D0247F144CDB0112B2AD4004C2C"
|
||||||
{
|
{
|
||||||
"SourcePath" = "8:..\\samples\\scrolling\\tunnel.c"
|
"SourcePath" = "8:..\\samples\\scrolling\\tunnel.c"
|
||||||
|
@ -2587,6 +2651,26 @@
|
||||||
"IsDependency" = "11:FALSE"
|
"IsDependency" = "11:FALSE"
|
||||||
"IsolateTo" = "8:"
|
"IsolateTo" = "8:"
|
||||||
}
|
}
|
||||||
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_43B55A11B25F4F13A9AE7E36B1AD2897"
|
||||||
|
{
|
||||||
|
"SourcePath" = "8:..\\samples\\resources\\blumba2.bin"
|
||||||
|
"TargetName" = "8:blumba2.bin"
|
||||||
|
"Tag" = "8:"
|
||||||
|
"Folder" = "8:_758C6547998745659548D0656D380FEA"
|
||||||
|
"Condition" = "8:"
|
||||||
|
"Transitive" = "11:FALSE"
|
||||||
|
"Vital" = "11:TRUE"
|
||||||
|
"ReadOnly" = "11:FALSE"
|
||||||
|
"Hidden" = "11:FALSE"
|
||||||
|
"System" = "11:FALSE"
|
||||||
|
"Permanent" = "11:FALSE"
|
||||||
|
"SharedLegacy" = "11:FALSE"
|
||||||
|
"PackageAs" = "3:1"
|
||||||
|
"Register" = "3:1"
|
||||||
|
"Exclude" = "11:FALSE"
|
||||||
|
"IsDependency" = "11:FALSE"
|
||||||
|
"IsolateTo" = "8:"
|
||||||
|
}
|
||||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_44A56A2AD0C84900ACDDA218E57165D8"
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_44A56A2AD0C84900ACDDA218E57165D8"
|
||||||
{
|
{
|
||||||
"SourcePath" = "8:..\\samples\\fractals\\mbmulti.c"
|
"SourcePath" = "8:..\\samples\\fractals\\mbmulti.c"
|
||||||
|
@ -4607,6 +4691,26 @@
|
||||||
"IsDependency" = "11:FALSE"
|
"IsDependency" = "11:FALSE"
|
||||||
"IsolateTo" = "8:"
|
"IsolateTo" = "8:"
|
||||||
}
|
}
|
||||||
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C30DFFA5DE3D4FEC982E5EB08F63C55E"
|
||||||
|
{
|
||||||
|
"SourcePath" = "8:..\\include\\c64\\flossiec.h"
|
||||||
|
"TargetName" = "8:flossiec.h"
|
||||||
|
"Tag" = "8:"
|
||||||
|
"Folder" = "8:_247D4CAD3CB843B3A8A4DC2D90F47C28"
|
||||||
|
"Condition" = "8:"
|
||||||
|
"Transitive" = "11:FALSE"
|
||||||
|
"Vital" = "11:TRUE"
|
||||||
|
"ReadOnly" = "11:FALSE"
|
||||||
|
"Hidden" = "11:FALSE"
|
||||||
|
"System" = "11:FALSE"
|
||||||
|
"Permanent" = "11:FALSE"
|
||||||
|
"SharedLegacy" = "11:FALSE"
|
||||||
|
"PackageAs" = "3:1"
|
||||||
|
"Register" = "3:1"
|
||||||
|
"Exclude" = "11:FALSE"
|
||||||
|
"IsDependency" = "11:FALSE"
|
||||||
|
"IsolateTo" = "8:"
|
||||||
|
}
|
||||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C3C6C74DFAB942AA8BFC15885A2D9BD0"
|
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C3C6C74DFAB942AA8BFC15885A2D9BD0"
|
||||||
{
|
{
|
||||||
"SourcePath" = "8:..\\include\\c64\\asm6502.h"
|
"SourcePath" = "8:..\\include\\c64\\asm6502.h"
|
||||||
|
@ -6180,15 +6284,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{38B34FC3-58A4-4E08-B94D-6212BEA3A690}"
|
"ProductCode" = "8:{5133698F-A751-4705-B7AA-5414727D9B4B}"
|
||||||
"PackageCode" = "8:{F3E7D60F-0382-4607-A1BA-0DE937C730BC}"
|
"PackageCode" = "8:{2BA82A38-8FC6-418B-ABC1-24C5475B58D2}"
|
||||||
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
||||||
"AspNetVersion" = "8:2.0.50727.0"
|
"AspNetVersion" = "8:2.0.50727.0"
|
||||||
"RestartWWWService" = "11:FALSE"
|
"RestartWWWService" = "11:FALSE"
|
||||||
"RemovePreviousVersions" = "11:TRUE"
|
"RemovePreviousVersions" = "11:TRUE"
|
||||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||||
"InstallAllUsers" = "11:FALSE"
|
"InstallAllUsers" = "11:FALSE"
|
||||||
"ProductVersion" = "8:1.28.246"
|
"ProductVersion" = "8:1.29.247"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include <c64/kernalio.h>
|
||||||
|
#include <c64/memmap.h>
|
||||||
|
#include <c64/vic.h>
|
||||||
|
#include <c64/flossiec.h>
|
||||||
|
#include <gfx/bitmap.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
char * const Hires = (char *)0xe000;
|
||||||
|
char * const Color = (char *)0xd800;
|
||||||
|
char * const Screen = (char *)0xcc00;
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Prepare fast loader in floppy memory
|
||||||
|
flosskio_init(8);
|
||||||
|
|
||||||
|
// Map filenames to track/sector addresses
|
||||||
|
floss_blk blks[1];
|
||||||
|
flosskio_mapdir(p"blumba2", blks);
|
||||||
|
|
||||||
|
// Clear screen
|
||||||
|
memset(Hires, 0x00, 8000);
|
||||||
|
memset(Screen, 0xff, 1000);
|
||||||
|
memset(Color, 0x01, 1000);
|
||||||
|
|
||||||
|
// Switch to multicolor hires
|
||||||
|
vic_setmode(VICM_HIRES_MC, Screen, Hires);
|
||||||
|
vic.color_back = VCOL_BLACK;
|
||||||
|
vic.color_border = VCOL_BLACK;
|
||||||
|
|
||||||
|
// Open file
|
||||||
|
flosskio_open(blks[0].track, blks[0].sector);
|
||||||
|
|
||||||
|
// Read compressed image
|
||||||
|
flossiec_read_lzo(Hires, 8000);
|
||||||
|
flossiec_read_lzo(Screen, 1000);
|
||||||
|
flossiec_read_lzo(Color, 1000);
|
||||||
|
|
||||||
|
// Close file
|
||||||
|
flosskio_close();
|
||||||
|
|
||||||
|
// Remove drive code
|
||||||
|
flosskio_shutdown();
|
||||||
|
|
||||||
|
// Wait for a character
|
||||||
|
getchar();
|
||||||
|
|
||||||
|
// Restore VIC
|
||||||
|
vic_setmode(VICM_TEXT, (char *)0x0400, (char *)0x1000);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -5,3 +5,4 @@ call ..\..\bin\oscar64 charwrite.c
|
||||||
call ..\..\bin\oscar64 charread.c
|
call ..\..\bin\oscar64 charread.c
|
||||||
call ..\..\bin\oscar64 hireswrite.c
|
call ..\..\bin\oscar64 hireswrite.c
|
||||||
call ..\..\bin\oscar64 hiresread.c
|
call ..\..\bin\oscar64 hiresread.c
|
||||||
|
call ..\..\bin\oscar64 hiresfload.c -d64=hiresfload.d64 -fz=../resources/blumba2.bin
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue