From 3770a05aeeabaf18c3df0c0d324cc3f53e632d18 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:16:42 +0200 Subject: [PATCH] Add fast loader library flossiec --- README.md | 5 + include/c64/flossiec.c | 608 +++++++++++++++++++++++++++++++ include/c64/flossiec.h | 79 ++++ oscar64/oscar64.cpp | 2 +- oscar64/oscar64.rc | 8 +- oscar64setup/oscar64setup.vdproj | 110 +++++- samples/kernalio/hiresfload.c | 53 +++ samples/kernalio/make.bat | 1 + samples/resources/blumba2.bin | 11 + 9 files changed, 869 insertions(+), 8 deletions(-) create mode 100644 include/c64/flossiec.c create mode 100644 include/c64/flossiec.h create mode 100644 samples/kernalio/hiresfload.c create mode 100644 samples/resources/blumba2.bin diff --git a/README.md b/README.md index a98b786..da1c2ae 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ The compiler is command line driven, and creates an executable .prg file. * -d64 : create a d64 disk image * -f : add a 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 * -cid : cartridge type ID, used by vice emulator * -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. +#### 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" The C64 memory map is very flexible. These samples show how to manipulate the memory map and use easyflash ROMs to execute larger programs. diff --git a/include/c64/flossiec.c b/include/c64/flossiec.c new file mode 100644 index 0000000..c188941 --- /dev/null +++ b/include/c64/flossiec.c @@ -0,0 +1,608 @@ +#include "flossiec.h" +#include +#include +#include +#include + +#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; +} + diff --git a/include/c64/flossiec.h b/include/c64/flossiec.h new file mode 100644 index 0000000..78796b0 --- /dev/null +++ b/include/c64/flossiec.h @@ -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 diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 46b2120..207c9fb 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -76,7 +76,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.28.246"); + strcpy(strProductVersion, "1.29.247"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 7d02d74..e803786 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,28,246,0 - PRODUCTVERSION 1,28,246,0 + FILEVERSION 1,29,247,0 + PRODUCTVERSION 1,29,247,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.28.246.0" + VALUE "FileVersion", "1.29.247.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.28.246.0" + VALUE "ProductVersion", "1.29.247.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 6a099d8..855b554 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -82,6 +82,12 @@ } "Entry" { + "MsmKey" = "8:_0CAC2197F4C34B33AFF5A3D0A7C78454" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_0CC2E11595B34DF0A003DF534A5AADF5" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -250,6 +256,12 @@ } "Entry" { + "MsmKey" = "8:_2CE4E742BFAC456C99ECA1DF0BFC5F34" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_2D828D0247F144CDB0112B2AD4004C2C" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -364,6 +376,12 @@ } "Entry" { + "MsmKey" = "8:_43B55A11B25F4F13A9AE7E36B1AD2897" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_44A56A2AD0C84900ACDDA218E57165D8" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -970,6 +988,12 @@ } "Entry" { + "MsmKey" = "8:_C30DFFA5DE3D4FEC982E5EB08F63C55E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_C3C6C74DFAB942AA8BFC15885A2D9BD0" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -1647,6 +1671,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\audio\\sidfx.h" @@ -2207,6 +2251,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\samples\\scrolling\\tunnel.c" @@ -2587,6 +2651,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\samples\\fractals\\mbmulti.c" @@ -4607,6 +4691,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\c64\\asm6502.h" @@ -6180,15 +6284,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{38B34FC3-58A4-4E08-B94D-6212BEA3A690}" - "PackageCode" = "8:{F3E7D60F-0382-4607-A1BA-0DE937C730BC}" + "ProductCode" = "8:{5133698F-A751-4705-B7AA-5414727D9B4B}" + "PackageCode" = "8:{2BA82A38-8FC6-418B-ABC1-24C5475B58D2}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.28.246" + "ProductVersion" = "8:1.29.247" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/samples/kernalio/hiresfload.c b/samples/kernalio/hiresfload.c new file mode 100644 index 0000000..b39a32f --- /dev/null +++ b/samples/kernalio/hiresfload.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include + +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; +} diff --git a/samples/kernalio/make.bat b/samples/kernalio/make.bat index 0b840d6..c6d5541 100644 --- a/samples/kernalio/make.bat +++ b/samples/kernalio/make.bat @@ -5,3 +5,4 @@ call ..\..\bin\oscar64 charwrite.c call ..\..\bin\oscar64 charread.c call ..\..\bin\oscar64 hireswrite.c call ..\..\bin\oscar64 hiresread.c +call ..\..\bin\oscar64 hiresfload.c -d64=hiresfload.d64 -fz=../resources/blumba2.bin diff --git a/samples/resources/blumba2.bin b/samples/resources/blumba2.bin new file mode 100644 index 0000000..fcfa6f8 --- /dev/null +++ b/samples/resources/blumba2.bin @@ -0,0 +1,11 @@ +UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUfUUUUUUUVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWUVU®µæUUf_ÕUÕÝ¥_g—–f¥fUUUUUUW›UUUU™©¾îUUUUUUU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVYZYee•¥••UUUUUZWWVUUUU™YfVf••æ~vÙe•¥¥™VYUUUU™™Õ•½µ­­­­UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUY^»ê••¥¥•¦ÚëÿÿÝU™ª™–UUU••¥éö•f™™f•W—«îû©Õ••Uî»î[UUUUVVUU•Õååªêú~vWWWUUUUUU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUY^UUUUUeíºUUW^Zzîªj™f™fU™UVZZZZÖùÕi%TDQÔ…+…+ '¥Vn^^^Z^ZªfVV}}S°UUUUUU••__[ZWZZWfeUVUeeU••••¥ÕÕåUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU®¹µæ•Ö••™¥¥•U•UU•UUUUUUUYVVšV™eVe•UUUUUU_WUUUfZZÖUYf•fY•®ŸŸ“•‘”•áÔ”QA••••U•UUVVV^W^[^fUffUVUVookkZZVUUUUUU•¥¹UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWÕW••µ•¥fªfZYfUV•U•Ue™j›¦©f™YfUÕeUVUUUUUjZfUUUUUe•eUUÖUVZZYUUwUw_~_Vf•fUUUUÙî»îöåf•ffUfVUVUffUfeUeYff™f~_VUUeUfªªjZvwUWUUUU™»ª»UUUUݹª»UUUUUUU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU^^[V[^j{ÿú饕•UUù¹ç­ç••vŸ•f•f™™fUU•¥¹©ª»UUVUVUUÖYYf™fYYfYYf™fYYfYYf™fYYfYff™fYffYff™fYffYff™fYffYff™fYffYff™fZffª™™f™VY™Uff™fYffUee•fUee¯kk[[[[[UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVUUªjV^fUVVUUUUUU••UUUUUWZW•VzzæúÖùVYVfž{ÝûÕvÙÙfÙfUVYVf™j™¦•fYYf•fY•Õµµ­«í»™fYYfYÖÙ™fYYf™fY™fYYf™fY•fYff•fU™fYffUfZ•fYff™f™™fYfeUUU™fYffUVU™fYff•fY™fYff•fU•UUeUUUUöööÖÖÚZZUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥•UUUUUU¥™mYYYYVVZ^Z^^Zz]·U™¥¥™ªUwU—UV™jª¦©fUuÝWYfUæYUíWUYV™Vf™n©«¥—]w}Z[ZEEDYfYfZÕÝýYf™f™YfUffUfYffUffZfYffUff•eWU]UYRj¢ª™UUffUÖÙÖÖUff•fUeUUffUeUVV_««¯½µÕÕU••UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVZ[kUUV^k›Û«¦W[n{åUU•ee™å™åç»eUwU—ee™VVyVYVUfYYf•f™_©­¥õ•õõf™™W•R••"ª¥UU—U¥)‰iQYQZZUUUeUUUUWUUUUUUYUf™™U™e™•U•UUUUUWUUUUUU•VUUUUUUfUUVVZk¯¿éå••UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]e••u]g­ZÚY[Y[i©ßWe©©¥¥eUUEFFUUe©©öùúÝUÕVv⪪QUuÝÝe©jwõvUZZšVšVV•VY&UEEUQRXšVVZV™jZ*YZV™j™U™™U™™f•UUUU•™j™UU•UU™ª™fWW]W©¥•••éùíUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¥•§———••««W[[[›—VV_[oko®‰µéåå奕éé¶å¥••VÙYfUæYYeUUUUWeU•VVR•V––VfVYVUUUu••a¤e¥©¥ZZfZJZ‰©©¥•UUUU™YU•UUUUUUUVUUeUUUUUUUUZffUÖYÖÖ—gg•eUeeUU•••¥ÕéUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU•Ö–•Ö•VViYYUUUWWjªjeWUWUÙåUU]•UUª•UUuU—eYiYYeie•U•UU•VZ[–VVZWZ+oUfY™f©f©VUVVvÖzZ¥¥•—]·]UUUUfUfYUVYff•fYUVUeeUeUUUUUUUUUe—e™™i™ij™V™•••¥~^WWe•e•UUU••åéùUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU•V•VVÙöýUVUVVUV•UVUVUUeUUfUVUUUUUVUVUUUUUYV[jj™ejRj-¹¥•UåÕ••UU•UUYVYUUUU_m•f™™f•YfUfYYf™Yf™fYYf™ff•fYff•ee•UUUUUY™U•U••U™™V™UYYVWWU—¥•™¥ff•fYfVUVWUeYffUÕ•Õµ¥¹«ªUUUUUU•¥UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¯ZVUUUUV«ªêõõõÕUUWUݧꪥ•¦e™f¹çW•¥e•U•ÕÕVZZfZfZZÖUZVYVYYUUUYVYVVf™™f™fYYfYYf•fYYfYYf™fYYfUeeUfUfUUeeUVUeÕUUUUUUeUUUUVUVYš–•¿ŸŸŸ—«ªú__UUUVUVVVVšæfYff™f™fk[gVUfUeUUUUU•Õ•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVZ[_UUUÕÿþªªõÖYYj™f™fUfYYfYfÖÕÖÚÚÖÚÖ_—f••e•e••¥eum^fZVZZVUÖfUVUUUUÕYVYVVYV™f•fUU]•]f™fYYfUff™fYYf™ff•fYff•ffUfUee•eeUUUUUUUYVYUY™V›~~V^V^WVUUUUUUU•{j[^[[VÕf©jZffUVe•f•ff•fjZv^vVUWUUUUUUU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWWVVVùöÙj™™•™VYf™ffZffYf•ff™f¥¥™¥™¥¥™¥¥µåµåíù••¥•e••eZV^WUUUUU••¥©¹úîUU™U™¥¦éVf™V™f¦™UUf•fY™fYYf•fYYfYYf•fYYfYffUVUeeUeeUfUUUUUUVUW[«j™»¥—_wwzæf™îUe^ªffYæÙÕÝ©¦¦™UUÝÿ•µ¹éº­uUYffUVUUUWUe•eUeUªêúz^_UUUUUU•÷»ªUUUU•õ¹©UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUWVUUUUUUU••eÙÕÙùe™™e™Z™™ZYYVYV••VfYYf•fYg›gg™V™¦•eUUfUÖÕUVUUUUUUjZZVvVuUekZZgZfZªªjV]UUUUUUUÕ·îªUUUUUWîºUUUUYê»ïUUUÞîºéªªíõÕæUe•æ™VY[_Ÿo©©¥—WUw]WUUffšjªæé¥™UUUUUf™ff©f™UfYffUVYUUUeeUVUUUUUeUVUUUUUU[n»UUUuUU—•WWWWVVfUUUU•¥¥íùUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUo_[ZVVUUV™V••eÙÖU•e™™¥™j¦™j™ffYVYfUfUUfU•—•—¥¥§¥UYUUUUYUUeUfYYeU¦™æ™ååùåU—U—¥¥™eUUUUUU™UUYU•UUYUUYU•UU™UÖÖYfYee•uyU•V™™V¹¹å•¥••UffYfYffU••U™f™™j¦¦•fUeUUeeUUUUVUVfYfYff©eeUUUUUUVVVZ[^®¿æ••fYf™™•••—Ÿ—••™ªf•åµÿÿ¹ëë©­ýuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU¯¯o[[ZVV™™f™f™™f™VV™V™e¥fUYf•fYY[[[WVVUUUUUYU•U•VUUUUUUU¥µµ¥¥¥½½Ùee™eÙ¥¥•UUYU•ee•UU™U•UU—UUYU™ffYe™™eÙe™í­­­µåµí—U••U•U•fYffUUUUUUUUUUUUUUUVUVVÖ™¥™•VYVYf™ff•eU_UW^^{îºîfYff•fUffYfUUfYf••µå奥¥•Ue¥™¥™UUUUUUU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU••¥¥éùùúfšfZYf•ff•f™™f™fe•fUUf•f]Ÿ¥¥¥©¿o›VV•U•^V^VVîUV»î»®­•UUÿÿçYYf©fUUUUª»î»UUWZ®»ï»UUU•µ»î»VvÖuU¥«ªUUÕµí­©æªªêyÝ]W]YV›î¹™••ÖZÖZffUU÷õuÕZZjª©¥µÝUW]f©f™ffUffUfYff•f™•fYfUUfZZZZvÖÖwUU•U™UUÙUU•¥™¥¥¹UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUZVYVYYUYîî{z[^VWYYf•fYYfYYf™fYYfUUeUeUUe·—­­—UYf™fYšf¥¥™e™ee•ee™U•UUwee™U•UUwee™U•UUwU™™U•UuwVYYU•UUuùÙ™f™eYYZZZzÙzÙÙffUfUffýfeUVUffÚffYfYff©ff•fYffYff•fUffUffUfYffUfUUfYf•Uf••fYf™¥Ù¥¥éåÕ¥¥™¥¥™¥™¥UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVUUUUUUUkšff™U•UÕw••·­¯©•fYYfUfU•eUUeUUU¥©¥¥——ŸUÝUUfšjªª©¥¥•UUUî™uUYUUUê™eu™U•Uv™UUUUUUj™UYUUUUª™f™™UUUVUVzzÖzÖÕÖÕffUVU•fYff™fU•fYff™fY•fYff•fU•fYffUVYUfYffUV[•fUeeYgÿUwUwUúªªª»®»WUUUêéùùù¥•UUÕU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU[ZVUUUUUªªêþWUUª««­ýõUU¥•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUZZVUUUUUÿ¯ª™UUUUªªÿÝUUUUªªªÿw]UUªª¯ýÕUUUîUYUUÝÕUf™f¦ªÝeUfYffª™®¦™¥™UU™UU•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU]ß]]ÕÕü]_QÕ[¿[_ñ]]ÕÕÕ]]]µ¼]_Q]Õ]]]][]]]]]Q§ŠX]]]]]]]]]Õ]]_ñ÷§¨ŠX]]]]]]]]]]]ñ¨¨ŠŠ‰¹µ]]]]][]]]ü¸‰‰‰˜É¼[[][[[[]_ß[]µ…‹µµ[µ[µ[[[[_›[[µ][µ[µµ[[]P]]][[][][µ][[]]]P[Õ]]]]]][[ÕÕ]]]]][[[]]å\[[]ÑÕ]]]]]][ü]]]æn]]\]ÑÕ]]]]]][¡]]QænnæÖ]XXÕÕ]]]]][‰Šññ_]]Qææænæ]]XŠ¥ZZXZ¥¨X]Õ]]]]\V]ææænV[]¨¨¨¨¨§¨[]Õ]]]]\nþÕæænk[]…¨¨¨¨¨º[]P]Õ]^nnöïnnn¶Ë¸ÈϬŒ¬Œ¸Å[][ënnnlüönnnËÏüüüüüüüÆnnnnnnnnüonnüñünnnnnnnoöññ              +  + +    + +                + +     +        + +         \ No newline at end of file