mirror of
https://github.com/cc65/cc65.git
synced 2024-12-22 12:30:41 +00:00
this is pr #2194 - removed ramfont.o
This commit is contained in:
parent
ce14f0f8ad
commit
934de685bc
41
cfg/kim1-mtu60k.cfg
Normal file
41
cfg/kim1-mtu60k.cfg
Normal file
@ -0,0 +1,41 @@
|
||||
# kim1-mtu60k.cfg (4k)
|
||||
#
|
||||
# for expanded KIM-1 w/ K-1008 Graphics and 60K RAM
|
||||
#
|
||||
# ld65 --config kim1-mtu60k.cfg -o <prog>.bin <prog>.o
|
||||
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $2000;
|
||||
CONDES: segment = STARTUP,
|
||||
type = constructor,
|
||||
label = __CONSTRUCTOR_TABLE__,
|
||||
count = __CONSTRUCTOR_COUNT__;
|
||||
CONDES: segment = STARTUP,
|
||||
type = destructor,
|
||||
label = __DESTRUCTOR_TABLE__,
|
||||
count = __DESTRUCTOR_COUNT__;
|
||||
}
|
||||
|
||||
SYMBOLS {
|
||||
__STACKSIZE__: type = weak, value = $0080; # 128 byte program stack
|
||||
__STARTADDRESS__: type = export, value = %S;
|
||||
}
|
||||
|
||||
MEMORY {
|
||||
ZP: file = %O, define = yes, start = $0000, size = $00EE;
|
||||
CPUSTACK: file = "", define = yes, start = $0100, size = $0100;
|
||||
RAM: file = %O, define = yes, start = %S, size = $E000 - %S - __STACKSIZE__;
|
||||
MAINROM: file = "", define = yes, start = $E000, size = $1000;
|
||||
TOP: file = "", define = yes, start = $F000, size = $1000;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, define = yes;
|
||||
STARTUP: load = RAM, type = ro, define = yes;
|
||||
CODE: load = RAM, type = ro, define = yes;
|
||||
RODATA: load = RAM, type = ro, define = yes;
|
||||
ONCE: load = RAM, type = ro, define = yes;
|
||||
DATA: load = RAM, type = rw, define = yes;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
}
|
||||
|
41
cfg/kim1-mtuE000.cfg
Normal file
41
cfg/kim1-mtuE000.cfg
Normal file
@ -0,0 +1,41 @@
|
||||
# kim1-mtu60k.cfg (4k)
|
||||
#
|
||||
# for expanded KIM-1 w/ K-1008 Graphics and 60K RAM
|
||||
#
|
||||
# ld65 --config kim1-mtu60k.cfg -o <prog>.bin <prog>.o
|
||||
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $E000;
|
||||
CONDES: segment = STARTUP,
|
||||
type = constructor,
|
||||
label = __CONSTRUCTOR_TABLE__,
|
||||
count = __CONSTRUCTOR_COUNT__;
|
||||
CONDES: segment = STARTUP,
|
||||
type = destructor,
|
||||
label = __DESTRUCTOR_TABLE__,
|
||||
count = __DESTRUCTOR_COUNT__;
|
||||
}
|
||||
|
||||
SYMBOLS {
|
||||
__STACKSIZE__: type = weak, value = $0080; # 128 byte program stack
|
||||
__STARTADDRESS__: type = export, value = %S;
|
||||
}
|
||||
|
||||
MEMORY {
|
||||
ZP: file = %O, define = yes, start = $0000, size = $00EE;
|
||||
CPUSTACK: file = "", define = yes, start = $0100, size = $0100;
|
||||
RAM: file = %O, define = yes, start = $2000, size = $E000 - $2000 - __STACKSIZE__;
|
||||
MAINROM: file = "", define = yes, start = $E000, size = $1000;
|
||||
TOP: file = "", define = yes, start = $F000, size = $1000;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, define = yes;
|
||||
STARTUP: load = RAM, type = ro, define = yes;
|
||||
CODE: load = RAM, type = ro, define = yes;
|
||||
RODATA: load = RAM, type = ro, define = yes;
|
||||
ONCE: load = RAM, type = ro, define = yes;
|
||||
DATA: load = RAM, type = rw, define = yes;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
}
|
||||
|
@ -31,9 +31,12 @@ else
|
||||
LD := $(if $(wildcard ../../bin/ld65*),../../bin/ld65,ld65)
|
||||
endif
|
||||
|
||||
EXELIST_kim1 = \
|
||||
kimHello.bin \
|
||||
kimSieve.bin
|
||||
EXELIST_kim1 = \
|
||||
kimHello.bin \
|
||||
kimSieve.bin \
|
||||
kimLife.bin \
|
||||
kimTest.bin \
|
||||
kimGFX.bin
|
||||
|
||||
ifneq ($(EXELIST_$(SYS)),)
|
||||
samples: $(EXELIST_$(SYS))
|
||||
@ -50,13 +53,65 @@ else
|
||||
@echo > $(NULLDEV)
|
||||
endif
|
||||
|
||||
subs.o: subs.asm
|
||||
$(AS) subs.asm -o subs.o
|
||||
|
||||
ramfont.o: ramfont.asm
|
||||
$(AS) ramfont.asm -o ramfont.o
|
||||
|
||||
kimLife.bin: kimLife.c
|
||||
$(CL) -t kim1 -C kim1-60k.cfg -Oi -o kimLife.bin kimLife.c
|
||||
|
||||
kimTest.bin: kimTest.c
|
||||
$(CL) -t kim1 -C kim1-60k.cfg -Oi -o kimTest.bin kimTest.c
|
||||
|
||||
kimGFX.bin: kimGFX.c subs.o ramfont.o
|
||||
$(CL) -t kim1 --listing kimGFX.lst -C kim1-mtuE000.cfg -o kimGFX.bin kimGFX.c subs.o ramfont.o -Ln kimgfx.lbl
|
||||
|
||||
kimSieve.bin: kimSieve.c
|
||||
$(CL) -t kim1 -C kim1-60k.cfg -O -o kimSieve.bin kimSieve.c
|
||||
|
||||
kimHello.bin: kimHello.c
|
||||
$(CL) -t kim1 -O -o kimHello.bin kimHello.c
|
||||
|
||||
# To build an intel-format file for the CORSHAM SD card reader
|
||||
|
||||
kimLife.hex: kimLife.bin
|
||||
srec_cat kimLife.bin -binary -offset 0x2000 -o kimLife.hex -Intel -address-length=2
|
||||
|
||||
kimTest.hex: kimTest.bin
|
||||
srec_cat kimTest.bin -binary -offset 0x2000 -o kimTest.hex -Intel -address-length=2
|
||||
|
||||
kimGFX.hex: kimGFX.bin ramfont.o
|
||||
srec_cat kimGFX.bin -binary -offset 0x2000 -o kimGFX.hex -Intel -address-length=2
|
||||
|
||||
# To build a paper tape file for uploading to the KIM-1 via terminal
|
||||
|
||||
kimLife.ptp: kimLife.bin
|
||||
srec_cat kimLife.bin -binary -offset 0x2000 -o kimLife.ptp -MOS_Technologies
|
||||
|
||||
kimGFX.ptp: kimGFX.bin
|
||||
srec_cat kimGFX.bin -binary -offset 0x2000 -o kimGFX.ptp -MOS_Technologies
|
||||
|
||||
kimTest.ptp: kimTest.bin
|
||||
srec_cat kimTest.bin -binary -offset 0x2000 -o kimTest.ptp -MOS_Technologies
|
||||
|
||||
clean:
|
||||
@$(DEL) kimSieve.bin 2>$(NULLDEV)
|
||||
@$(DEL) kimHello.bin 2>$(NULLDEV)
|
||||
@$(DEL) kimLife.bin 2>$(NULLDEV)
|
||||
@$(DEL) kimLife.ptp 2>$(NULLDEV)
|
||||
@$(DEL) kimLife.hex 2>$(NULLDEV)
|
||||
@$(DEL) kimTest.bin 2>$(NULLDEV)
|
||||
@$(DEL) kimTest.ptp 2>$(NULLDEV)
|
||||
@$(DEL) kimTest.hex 2>$(NULLDEV)
|
||||
@$(DEL) kimGFX.bin 2>$(NULLDEV)
|
||||
@$(DEL) kimGFX.ptp 2>$(NULLDEV)
|
||||
@$(DEL) kimGFX.hex 2>$(NULLDEV)
|
||||
@$(DEL) kimgfx.lbl 2>$(NULLDEV)
|
||||
@$(DEL) kimGFX.lst 2>$(NULLDEV)
|
||||
@$(DEL) subs.o 2>$(NULLDEV)
|
||||
@$(DEL) ramfont.o 2>$(NULLDEV)
|
||||
|
||||
|
||||
|
||||
|
0
samples/kim1/font.rom
Normal file
0
samples/kim1/font.rom
Normal file
290
samples/kim1/kimGFX.c
Normal file
290
samples/kim1/kimGFX.c
Normal file
@ -0,0 +1,290 @@
|
||||
// --------------------------------------------------------------------------
|
||||
// Simple Graphics Test for KIM-1 with MTU Visible Memory Board
|
||||
//
|
||||
// Assumes the MTU Visible Memory Board mapped at 0xA000 for 8K of video RAM
|
||||
//
|
||||
// davepl@davepl.com
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h> // For printf
|
||||
#include <stdlib.h> // For rand, srand
|
||||
#include <string.h> // For memcpy
|
||||
#include <ctype.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
extern void ClearScreen(void); // In subs.asm
|
||||
extern void ScrollScreen(void);
|
||||
extern void DrawCircle(void);
|
||||
extern void SetPixel(void);
|
||||
extern void ClearPixel(void);
|
||||
extern void DrawChar(void);
|
||||
extern void Demo(void);
|
||||
extern void __fastcall__ Delay(byte loops);
|
||||
extern void __fastcall__ DrawLine(byte bSet);
|
||||
extern byte __fastcall__ AscToPet(byte in);
|
||||
extern byte __fastcall__ PetToAsc(byte in);
|
||||
extern byte __fastcall__ ReverseBits(byte in);
|
||||
extern void __fastcall__ CharOut(byte asci_char);
|
||||
extern byte __fastcall__ getch();
|
||||
extern unsigned char font8x8_basic[256][8];
|
||||
|
||||
extern int x1cord;
|
||||
extern int y1cord;
|
||||
extern int x2cord;
|
||||
extern int y2cord;
|
||||
extern int cursorX;
|
||||
extern int cursorY;
|
||||
|
||||
// If in zeropage:
|
||||
//
|
||||
// #pragma zpsym("x1cord")
|
||||
// #pragma zpsym("x2cord")
|
||||
// #pragma zpsym("y1cord")
|
||||
// #pragma zpsym("y2cord")
|
||||
|
||||
// Screen memory is placed at A000-BFFF, 320x200 pixels, mapped right to left within each horizontal byte
|
||||
|
||||
byte * screen = (byte *) 0xA000;
|
||||
|
||||
// Cursor position
|
||||
|
||||
#define SCREEN_WIDTH 320
|
||||
#define SCREEN_HEIGHT 200
|
||||
#define CHARWIDTH 8
|
||||
#define CHARHEIGHT 8
|
||||
#define BYTESPERROW (SCREEN_WIDTH / 8)
|
||||
#define BYTESPERCHARROW (BYTESPERROW * 8)
|
||||
#define CHARSPERROW (SCREEN_WIDTH / CHARWIDTH)
|
||||
#define ROWSPERCOLUMN (SCREEN_HEIGHT / CHARHEIGHT)
|
||||
|
||||
// SETPIXEL
|
||||
//
|
||||
// 0 <= x < 320
|
||||
// 0 <= y < 200
|
||||
//
|
||||
// Draws a pixel on the screen in white or black at pixel pos x, y
|
||||
|
||||
void SETPIXEL(int x, int y, byte b)
|
||||
{
|
||||
x1cord = x;
|
||||
y1cord = y;
|
||||
|
||||
if (b)
|
||||
SetPixel();
|
||||
else
|
||||
ClearPixel();
|
||||
}
|
||||
|
||||
// DRAWPIXEL
|
||||
//
|
||||
// 0 <= x < 320
|
||||
// 0 <= y < 200
|
||||
//
|
||||
// Turns on a screen pixel at pixel pos x,y
|
||||
|
||||
void DRAWPIXEL(int x, int y)
|
||||
{
|
||||
x1cord = x;
|
||||
y1cord = y;
|
||||
SetPixel();
|
||||
}
|
||||
|
||||
int c;
|
||||
|
||||
void DrawText(char * psz)
|
||||
{
|
||||
while (*psz)
|
||||
{
|
||||
while (cursorX >= CHARSPERROW)
|
||||
{
|
||||
cursorX -= CHARSPERROW;
|
||||
cursorY += 1;
|
||||
}
|
||||
|
||||
// If we've gone off the bottom of the screen, we scroll the screen and back up to the last line again
|
||||
|
||||
if (cursorY >= ROWSPERCOLUMN)
|
||||
{
|
||||
cursorY = ROWSPERCOLUMN - 1;
|
||||
ScrollScreen();
|
||||
}
|
||||
|
||||
// If we output a newline we advanced the cursor down one line and reset it to the left
|
||||
|
||||
if (*psz == 0x0A)
|
||||
{
|
||||
cursorX = 0;
|
||||
cursorY++;
|
||||
psz++;
|
||||
}
|
||||
else
|
||||
{
|
||||
c = *psz;
|
||||
|
||||
__asm__ ("ldx %v", cursorX);
|
||||
__asm__ ("ldy %v", cursorY);
|
||||
__asm__ ("lda %v", c);
|
||||
DrawChar();
|
||||
cursorX++;
|
||||
psz++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawTextAt(int x, int y, char * psz)
|
||||
{
|
||||
cursorX = x;
|
||||
cursorY = y;
|
||||
DrawText(psz);
|
||||
}
|
||||
|
||||
// Something like Bresenham's algorithm for drawing a line
|
||||
/*
|
||||
void DrawLine(int x0, int y0, int x1, int y1, byte val)
|
||||
{
|
||||
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
|
||||
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
|
||||
int err = (dx > dy ? dx : -dy) / 2, e2;
|
||||
|
||||
while (1)
|
||||
{
|
||||
SETPIXEL(x0, y0, val);
|
||||
|
||||
if (x0 == x1 && y0 == y1)
|
||||
break;
|
||||
|
||||
e2 = err;
|
||||
|
||||
if (e2 > -dx)
|
||||
{
|
||||
err -= dy;
|
||||
x0 += sx;
|
||||
}
|
||||
if (e2 < dy)
|
||||
{
|
||||
err += dx;
|
||||
y0 += sy;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// DrawCircle
|
||||
//
|
||||
// Draw a circle without sin, cos, or floating point!
|
||||
|
||||
void DrawCircleC(int x0, int y0, int radius, byte)
|
||||
{
|
||||
x1cord = x0;
|
||||
y1cord = y0;
|
||||
y2cord = radius;
|
||||
DrawCircle();
|
||||
}
|
||||
|
||||
void DrawLineC(int x1, int y1, int x2, int y2, byte bSet)
|
||||
{
|
||||
x1cord = x1;
|
||||
y1cord = y1;
|
||||
x2cord = x2;
|
||||
y2cord = y2;
|
||||
DrawLine(bSet);
|
||||
}
|
||||
|
||||
// MirrorFont
|
||||
//
|
||||
// RAM font is backwards left-right relative to the way memory is laid out on the KIM-1, so we swap all the
|
||||
// bytes in place by reversing the order of the bits in every byte
|
||||
|
||||
void MirrorFont()
|
||||
{
|
||||
int c;
|
||||
byte * pb = (byte *) font8x8_basic;
|
||||
|
||||
for (c = 0; c < 128 * 8; c++)
|
||||
pb[c] = ReverseBits(pb[c]);
|
||||
}
|
||||
|
||||
// DrawScreenMoire
|
||||
//
|
||||
// Draws a moire pattern on the screen without clearing it first
|
||||
|
||||
void DrawMoire(int left, int top, int right, int bottom, byte pixel)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
for (x = left; x < right; x += 6)
|
||||
DrawLineC(x, top, right - x + left, bottom, pixel);
|
||||
|
||||
for (y = top; y < bottom; y += 6)
|
||||
DrawLineC(left, y, right, bottom - y + top, pixel);
|
||||
}
|
||||
|
||||
void DrawScreenMoire(int left, int top, int right, int bottom)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
DrawLineC(left, top, right, top, 1);
|
||||
DrawLineC(left, bottom, right, bottom, 1);
|
||||
DrawLineC(left, top, left, bottom, 1);
|
||||
DrawLineC(right, top, right, bottom, 1);
|
||||
|
||||
left++; top++; right--; bottom--;
|
||||
|
||||
for (x = left; x < right; x += 6)
|
||||
DrawLineC(x, top, right - x + left, bottom, 1);
|
||||
for (y = top; y < bottom; y += 6)
|
||||
DrawLineC(left, y, right, bottom - y + top, 1);
|
||||
for (x = left; x < right; x += 6)
|
||||
DrawLineC(x, top, right - x + left, bottom, 0);
|
||||
for (y = top; y < bottom; y += 6)
|
||||
DrawLineC(left, y, right, bottom - y + top, 0);
|
||||
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
||||
int i;
|
||||
int c = 0;
|
||||
|
||||
Demo();
|
||||
|
||||
CharOut('R');
|
||||
CharOut('E');
|
||||
CharOut('A');
|
||||
CharOut('D');
|
||||
CharOut('Y');
|
||||
CharOut('.');
|
||||
CharOut('\n');
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
c = toupper(getch());
|
||||
if (c != EOF)
|
||||
CharOut(c);
|
||||
}
|
||||
|
||||
// Clear the screen memory
|
||||
while(1)
|
||||
{
|
||||
Demo();
|
||||
DrawScreenMoire(0,30, 319, 199);
|
||||
Delay(10);
|
||||
|
||||
Demo();
|
||||
for (i = 5; i < 80; i+=5)
|
||||
{
|
||||
DrawCircleC(SCREEN_WIDTH/2, SCREEN_HEIGHT/2 + 20, i, 1);
|
||||
DrawCircleC(SCREEN_WIDTH/4, SCREEN_HEIGHT/2 + 20, i, 1);
|
||||
DrawCircleC(SCREEN_WIDTH*3/4, SCREEN_HEIGHT/2 + 20, i, 1);
|
||||
}
|
||||
|
||||
Delay(10);
|
||||
|
||||
}
|
||||
|
||||
printf("Done, exiting...\r\n");
|
||||
return 0;
|
||||
}
|
144
samples/kim1/kimLife.c
Normal file
144
samples/kim1/kimLife.c
Normal file
@ -0,0 +1,144 @@
|
||||
// --------------------------------------------------------------------------
|
||||
// Conway's Game of Life for KIM-1
|
||||
//
|
||||
// Assumes the MTU Visible Memory Board mapped at 0x8000 for 8K of video RAM
|
||||
//
|
||||
// Dave Plummer on a rainy Thursday
|
||||
//
|
||||
// davepl@davepl.com
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h> // For printf
|
||||
#include <stdlib.h> // For rand, srand
|
||||
#include <string.h> // For memcpy
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
// World size
|
||||
|
||||
#define WIDTH 320
|
||||
#define HEIGHT 200
|
||||
#define NUMBITS 64000
|
||||
#define NUMBYTES 8000
|
||||
#define DENSITY 50
|
||||
|
||||
// Screen memory is placed at 8000, our world copy at A000, and they use the same layout so
|
||||
// that we can memcpy from one to the other without translating
|
||||
|
||||
byte * world = (byte *) 0x8000;
|
||||
byte * new_world = (byte *) 0xA000;
|
||||
|
||||
// BITARRAY
|
||||
//
|
||||
// Access individual bits in a block of memory
|
||||
|
||||
// Access to the screen bitmap
|
||||
|
||||
byte GETBIT(byte *p, int n)
|
||||
{
|
||||
return (p[n >> 3] & (1 << (n & 7))) ? 1 : 0;
|
||||
}
|
||||
|
||||
void SETBIT(byte *p, int n)
|
||||
{
|
||||
p[n >> 3] |= (1 << (n & 7));
|
||||
}
|
||||
|
||||
void CLRBIT(byte *p, int n)
|
||||
{
|
||||
p[n >> 3] &= ~(1 << (n & 7));
|
||||
}
|
||||
|
||||
void SETPIXEL(byte * p, int x, int y, byte b)
|
||||
{
|
||||
if (b)
|
||||
SETBIT(p, y * WIDTH + x);
|
||||
else
|
||||
CLRBIT(p, y * WIDTH + x);
|
||||
}
|
||||
|
||||
byte GETPIXEL(byte *p, int x, int y)
|
||||
{
|
||||
return GETBIT(p, y * WIDTH + x);
|
||||
}
|
||||
|
||||
// RandomFillWorld
|
||||
//
|
||||
// Populates the initial world with random cells
|
||||
|
||||
void RandomFillWorld()
|
||||
{
|
||||
int x, y;
|
||||
|
||||
// I need a better way to see the RNG or it'll be the same game every time!
|
||||
srand(0);
|
||||
for (x = 0; x < WIDTH; x++)
|
||||
{
|
||||
for (y = 0; y < HEIGHT; y++)
|
||||
{
|
||||
byte b = ((rand() % 100) < DENSITY) ? 1 : 0;
|
||||
SETPIXEL(world, x, y, b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CountNeighbors
|
||||
//
|
||||
// Count the number of live cells around the given spot, excluding the actual spot specified
|
||||
|
||||
int CountNeighbors(int x, int y)
|
||||
{
|
||||
int i, j, nx, ny, count = 0;
|
||||
|
||||
for (j = -1; j <= 1; j++)
|
||||
{
|
||||
for (i = -1; i <= 1; i++)
|
||||
{
|
||||
if (i != 0 || j != 0)
|
||||
{
|
||||
nx = (x + i + WIDTH) % WIDTH;
|
||||
ny = (y + j + HEIGHT) % HEIGHT;
|
||||
count += GETPIXEL(world, nx, ny) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
// UpdateWorld
|
||||
//
|
||||
// Applies the rules of Conway's Game of Life to the cells
|
||||
|
||||
void UpdateWorld()
|
||||
{
|
||||
int x, y;
|
||||
|
||||
for (y = 0; y < HEIGHT; y++)
|
||||
{
|
||||
for (x = 0; x < WIDTH; x++)
|
||||
{
|
||||
int neighbors = CountNeighbors(x, y);
|
||||
if (GETPIXEL(world, x, y))
|
||||
SETPIXEL(new_world, x, y, (neighbors == 2 || neighbors == 3));
|
||||
else
|
||||
SETPIXEL(new_world, x, y, (neighbors == 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
printf("\r\nStarting Conway's Game of Life: Randomizing World...\r\n");
|
||||
RandomFillWorld();
|
||||
printf("World Ready, Running!\r\n");
|
||||
|
||||
for (;;)
|
||||
{
|
||||
UpdateWorld();
|
||||
printf("[");
|
||||
memcpy(world, new_world, NUMBYTES);
|
||||
printf("]");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
262
samples/kim1/kimTest.c
Normal file
262
samples/kim1/kimTest.c
Normal file
@ -0,0 +1,262 @@
|
||||
// --------------------------------------------------------------------------
|
||||
// Diagnostics Test for KIM-1
|
||||
//
|
||||
// Dave Plummer
|
||||
// davepl@davepl.com
|
||||
//
|
||||
// Memory test examples by Michael Barr
|
||||
//
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h> // For printf
|
||||
#include <stdlib.h> // For rand, srand
|
||||
#include <string.h> // For memcpy
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
// RepeatChar
|
||||
//
|
||||
// Outputs a given character N times
|
||||
|
||||
void RepeatChar(char c, size_t count)
|
||||
{
|
||||
while (count--)
|
||||
putc(c, stdout);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
*
|
||||
* Function: memTestDataBus()
|
||||
*
|
||||
* Description: Test the data bus wiring in a memory region by
|
||||
* performing a walking 1's test at a fixed address
|
||||
* within that region. The address (and hence the
|
||||
* memory region) is selected by the caller.
|
||||
*
|
||||
* Returns: 0 if the test succeeds.
|
||||
* A non-zero result is the first pattern that failed.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
byte memTestDataBus(volatile byte * address)
|
||||
{
|
||||
byte pattern;
|
||||
|
||||
// Perform a walking 1's test at the given address.
|
||||
|
||||
for (pattern = 1; pattern != 0; pattern <<= 1)
|
||||
{
|
||||
// Write the test pattern.
|
||||
*address = pattern;
|
||||
|
||||
// Read it back and check it
|
||||
if (*address != pattern)
|
||||
{
|
||||
printf("\r\nmemTestDataBus: FAILED at %04x with pattern %02x\r\n", address, pattern);
|
||||
return (pattern);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
*
|
||||
* Function: memTestAddressBus()
|
||||
*
|
||||
* Description: Test the address bus wiring in a memory region by
|
||||
* performing a walking 1's test on the relevant bits
|
||||
* of the address and checking for aliasing. This test
|
||||
* will find single-bit address failures such as stuck
|
||||
* -high, stuck-low, and shorted pins. The base address
|
||||
* and size of the region are selected by the caller.
|
||||
*
|
||||
* Notes: For best results, the selected base address should
|
||||
* have enough LSB 0's to guarantee single address bit
|
||||
* changes. For example, to test a 64-Kbyte region,
|
||||
* select a base address on a 64-Kbyte boundary. Also,
|
||||
* select the region size as a power-of-two--if at all
|
||||
* possible.
|
||||
*
|
||||
* Returns: NULL if the test succeeds.
|
||||
* A non-zero result is the first address at which an
|
||||
* aliasing problem was uncovered. By examining the
|
||||
* contents of memory, it may be possible to gather
|
||||
* additional information about the problem.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
byte * memTestAddressBus(volatile byte * baseAddress, unsigned long nBytes)
|
||||
{
|
||||
unsigned long addressMask = (nBytes/sizeof(byte) - 1);
|
||||
unsigned long offset;
|
||||
unsigned long testOffset;
|
||||
|
||||
byte pattern = (byte) 0xAAAAAAAA;
|
||||
byte antipattern = (byte) 0x55555555;
|
||||
|
||||
|
||||
//Write the default pattern at each of the power-of-two offsets.
|
||||
|
||||
for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
|
||||
{
|
||||
baseAddress[offset] = pattern;
|
||||
}
|
||||
|
||||
// Check for address bits stuck high.
|
||||
|
||||
testOffset = 0;
|
||||
baseAddress[testOffset] = antipattern;
|
||||
|
||||
for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
|
||||
{
|
||||
if (baseAddress[offset] != pattern)
|
||||
{
|
||||
printf("\r\nmemTestAddressBus: FAILED at %04x with pattern %02x\r\n", baseAddress+offset, pattern);
|
||||
return ((byte *) &baseAddress[offset]);
|
||||
}
|
||||
if (offset % 1024 == 0)
|
||||
printf(".");
|
||||
}
|
||||
|
||||
baseAddress[testOffset] = pattern;
|
||||
|
||||
|
||||
// Check for address bits stuck low or shorted.
|
||||
|
||||
for (testOffset = 1; (testOffset & addressMask) != 0; testOffset <<= 1)
|
||||
{
|
||||
baseAddress[testOffset] = antipattern;
|
||||
|
||||
if (baseAddress[0] != pattern)
|
||||
{
|
||||
return ((byte *) &baseAddress[testOffset]);
|
||||
}
|
||||
|
||||
for (offset = 1; (offset & addressMask) != 0; offset <<= 1)
|
||||
{
|
||||
if ((baseAddress[offset] != pattern) && (offset != testOffset))
|
||||
{
|
||||
printf("\r\nmemTestAddressBus: FAILED at %04x with pattern %02x\r\n", baseAddress+offset, pattern);
|
||||
return ((byte *) &baseAddress[testOffset]);
|
||||
}
|
||||
}
|
||||
baseAddress[testOffset] = pattern;
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
*
|
||||
* Function: memTestDevice()
|
||||
*
|
||||
* Description: Test the integrity of a physical memory device by
|
||||
* performing an increment/decrement test over the
|
||||
* entire region. In the process every storage bit
|
||||
* in the device is tested as a zero and a one. The
|
||||
* base address and the size of the region are
|
||||
* selected by the caller.
|
||||
*
|
||||
* Returns: NULL if the test succeeds.
|
||||
*
|
||||
* A non-zero result is the first address at which an
|
||||
* incorrect value was read back. By examining the
|
||||
* contents of memory, it may be possible to gather
|
||||
* additional information about the problem.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
byte * memTestDevice(volatile byte * baseAddress, unsigned long nBytes)
|
||||
{
|
||||
unsigned long offset;
|
||||
unsigned long nWords = nBytes / sizeof(byte);
|
||||
|
||||
byte pattern;
|
||||
byte antipattern;
|
||||
|
||||
|
||||
// Fill memory with a known pattern.
|
||||
|
||||
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
|
||||
baseAddress[offset] = pattern;
|
||||
|
||||
// Check each location and invert it for the second pass.
|
||||
|
||||
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
|
||||
{
|
||||
if (offset % 1024 == 0)
|
||||
printf("%04X ", (int) &baseAddress[offset]);
|
||||
|
||||
if (baseAddress[offset] != pattern)
|
||||
{
|
||||
printf("\r\nmemTestDevice: FAILED at %04x with pattern %02x\r\n", (int) &baseAddress[offset], pattern);
|
||||
return ((byte *) &baseAddress[offset]);
|
||||
}
|
||||
|
||||
antipattern = ~pattern;
|
||||
baseAddress[offset] = antipattern;
|
||||
|
||||
}
|
||||
|
||||
// Check each location for the inverted pattern and zero it.
|
||||
|
||||
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++)
|
||||
{
|
||||
if (offset % 1024 == 0)
|
||||
printf("%04X ", (int) &baseAddress[offset]);
|
||||
|
||||
antipattern = ~pattern;
|
||||
if (baseAddress[offset] != antipattern)
|
||||
{
|
||||
printf("\r\nmemTestDevice: FAILED at %04x with antipattern %02x\r\n", (int) &baseAddress[offset], pattern);
|
||||
return ((byte *) &baseAddress[offset]);
|
||||
}
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
// TestMemory
|
||||
//
|
||||
// Run all three memory tests
|
||||
|
||||
byte TestMemory(byte * startAddress, unsigned long size)
|
||||
{
|
||||
if ((memTestDataBus(startAddress) != 0) ||
|
||||
(memTestAddressBus(startAddress, size) != NULL) ||
|
||||
(memTestDevice(startAddress, size) != NULL))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
printf("\r\nTesting KIM-1...\r\n");
|
||||
RepeatChar('-', 39);
|
||||
|
||||
printf("\r\nTesting RIOT RAM: 1780-17BF\r\n");
|
||||
if (TestMemory((byte *)0x1780, 0x17BF - 0x1780))
|
||||
return 0;
|
||||
|
||||
printf("\r\nTesting RIOT RAM: 17C0-17E6\r\n");
|
||||
if (TestMemory((byte *)0x17C0, 0x17E6 - 0x17C0))
|
||||
return 0;
|
||||
|
||||
printf("\r\nTesting Memory: 0400-13FF\r\n");
|
||||
if (TestMemory((byte *)0x0400, 0x13FF - 0x0400))
|
||||
return 0;
|
||||
|
||||
printf("\r\nTesting Memory: 4000-DFFF\r\n");
|
||||
if (TestMemory((byte *)0x4000, 0xDFFF - 0x4000))
|
||||
return 0;
|
||||
|
||||
printf("\r\nPASS!\r\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
272
samples/kim1/ramfont.asm
Normal file
272
samples/kim1/ramfont.asm
Normal file
@ -0,0 +1,272 @@
|
||||
;-----------------------------------------------------------------------------------
|
||||
; KIMGFX: Simple pixel graphics for the MOS/Commodore KIM-1
|
||||
;-----------------------------------------------------------------------------------
|
||||
; (c) Plummer's Software Ltd, 04/25/2023 Created
|
||||
; David Plummer
|
||||
;-----------------------------------------------------------------------------------
|
||||
;
|
||||
; File: ramfont.s
|
||||
; Magnetic OCR (check number style) Font data
|
||||
;
|
||||
;-----------------------------------------------------------------------------------
|
||||
|
||||
.segment "CODE"
|
||||
.export _font8x8_basic
|
||||
|
||||
_font8x8_basic:
|
||||
.byte $1c, $22, $4a, $56, $4c, $20, $1e, $00 ; PETSCII code 0
|
||||
.byte $3c, $24, $24, $7e, $62, $62, $62, $00 ; PETSCII code 1
|
||||
.byte $78, $44, $44, $7c, $62, $62, $7e, $00 ; PETSCII code 2
|
||||
.byte $7e, $42, $40, $60, $60, $62, $7e, $00 ; PETSCII code 3
|
||||
.byte $7c, $46, $42, $62, $62, $66, $7c, $00 ; PETSCII code 4
|
||||
.byte $7e, $40, $40, $7c, $60, $60, $7e, $00 ; PETSCII code 5
|
||||
.byte $7e, $40, $40, $7e, $60, $60, $60, $00 ; PETSCII code 6
|
||||
.byte $7e, $42, $40, $6e, $62, $62, $7e, $00 ; PETSCII code 7
|
||||
.byte $42, $42, $42, $7e, $62, $62, $62, $00 ; PETSCII code 8
|
||||
.byte $08, $08, $08, $0c, $0c, $0c, $0c, $00 ; PETSCII code 9
|
||||
.byte $04, $04, $04, $06, $06, $46, $7e, $00 ; PETSCII code 10
|
||||
.byte $42, $44, $48, $7c, $62, $62, $62, $00 ; PETSCII code 11
|
||||
.byte $40, $40, $40, $60, $60, $60, $7e, $00 ; PETSCII code 12
|
||||
.byte $7e, $4a, $4a, $6a, $6a, $6a, $6a, $00 ; PETSCII code 13
|
||||
.byte $7e, $42, $42, $62, $62, $62, $62, $00 ; PETSCII code 14
|
||||
.byte $7e, $46, $42, $42, $42, $42, $7e, $00 ; PETSCII code 15
|
||||
.byte $7e, $42, $42, $7e, $60, $60, $60, $00 ; PETSCII code 16
|
||||
.byte $7e, $42, $42, $42, $4a, $4e, $7e, $00 ; PETSCII code 17
|
||||
.byte $7c, $44, $44, $7c, $62, $62, $62, $00 ; PETSCII code 18
|
||||
.byte $7e, $42, $40, $7e, $06, $46, $7e, $00 ; PETSCII code 19
|
||||
.byte $3e, $10, $10, $18, $18, $18, $18, $00 ; PETSCII code 20
|
||||
.byte $42, $42, $42, $62, $62, $62, $7e, $00 ; PETSCII code 21
|
||||
.byte $62, $62, $62, $66, $24, $24, $3c, $00 ; PETSCII code 22
|
||||
.byte $4a, $4a, $4a, $6a, $6a, $6a, $7e, $00 ; PETSCII code 23
|
||||
.byte $42, $42, $66, $18, $66, $62, $62, $00 ; PETSCII code 24
|
||||
.byte $22, $22, $22, $3e, $18, $18, $18, $00 ; PETSCII code 25
|
||||
.byte $7e, $42, $06, $18, $60, $62, $7e, $00 ; PETSCII code 26
|
||||
.byte $3c, $20, $20, $20, $20, $20, $3c, $00 ; PETSCII code 27
|
||||
.byte $00, $40, $20, $10, $08, $04, $02, $00 ; PETSCII code 28
|
||||
.byte $3c, $04, $04, $04, $04, $04, $3c, $00 ; PETSCII code 29
|
||||
.byte $00, $08, $1c, $2a, $08, $08, $14, $14 ; PETSCII code 30
|
||||
.byte $00, $00, $10, $20, $7f, $20, $10, $00 ; PETSCII code 31
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 32
|
||||
.byte $08, $08, $08, $0c, $0c, $00, $0c, $00 ; PETSCII code 33
|
||||
.byte $6c, $24, $6c, $00, $00, $00, $00, $00 ; PETSCII code 34
|
||||
.byte $24, $24, $7e, $24, $7e, $24, $24, $00 ; PETSCII code 35
|
||||
.byte $08, $3e, $20, $3e, $06, $3e, $08, $00 ; PETSCII code 36
|
||||
.byte $00, $62, $64, $08, $10, $26, $46, $00 ; PETSCII code 37
|
||||
.byte $3c, $20, $24, $7e, $64, $64, $7c, $00 ; PETSCII code 38
|
||||
.byte $1c, $18, $10, $00, $00, $00, $00, $00 ; PETSCII code 39
|
||||
.byte $04, $08, $10, $10, $10, $08, $04, $00 ; PETSCII code 40
|
||||
.byte $20, $10, $08, $08, $08, $10, $20, $00 ; PETSCII code 41
|
||||
.byte $08, $2a, $1c, $3e, $1c, $2a, $08, $00 ; PETSCII code 42
|
||||
.byte $00, $08, $08, $3e, $08, $08, $00, $00 ; PETSCII code 43
|
||||
.byte $00, $00, $00, $00, $00, $18, $18, $08 ; PETSCII code 44
|
||||
.byte $00, $00, $00, $7e, $00, $00, $00, $00 ; PETSCII code 45
|
||||
.byte $00, $00, $00, $00, $00, $18, $18, $00 ; PETSCII code 46
|
||||
.byte $00, $02, $04, $08, $10, $20, $40, $00 ; PETSCII code 47
|
||||
.byte $7e, $62, $52, $4a, $46, $46, $7e, $00 ; PETSCII code 48
|
||||
.byte $18, $08, $08, $18, $18, $1a, $3e, $00 ; PETSCII code 49
|
||||
.byte $7e, $42, $02, $7e, $60, $60, $7e, $00 ; PETSCII code 50
|
||||
.byte $7c, $44, $04, $1e, $06, $46, $7e, $00 ; PETSCII code 51
|
||||
.byte $44, $44, $44, $44, $7e, $0c, $0c, $00 ; PETSCII code 52
|
||||
.byte $7e, $40, $7e, $06, $06, $46, $7e, $00 ; PETSCII code 53
|
||||
.byte $7e, $42, $40, $7e, $46, $46, $7e, $00 ; PETSCII code 54
|
||||
.byte $7e, $02, $02, $06, $06, $06, $06, $00 ; PETSCII code 55
|
||||
.byte $3c, $24, $24, $7e, $46, $46, $7e, $00 ; PETSCII code 56
|
||||
.byte $7e, $42, $42, $7e, $06, $06, $06, $00 ; PETSCII code 57
|
||||
.byte $00, $00, $18, $00, $00, $18, $00, $00 ; PETSCII code 58
|
||||
.byte $00, $00, $18, $00, $00, $18, $18, $08 ; PETSCII code 59
|
||||
.byte $0e, $18, $30, $60, $30, $18, $0e, $00 ; PETSCII code 60
|
||||
.byte $00, $00, $7e, $00, $7e, $00, $00, $00 ; PETSCII code 61
|
||||
.byte $70, $18, $0c, $06, $0c, $18, $70, $00 ; PETSCII code 62
|
||||
.byte $7e, $02, $02, $7e, $60, $00, $60, $00 ; PETSCII code 63
|
||||
.byte $00, $00, $00, $00, $ff, $00, $00, $00 ; PETSCII code 64
|
||||
.byte $08, $1c, $3e, $7f, $7f, $1c, $3e, $00 ; PETSCII code 65
|
||||
.byte $10, $10, $10, $10, $10, $10, $10, $10 ; PETSCII code 66
|
||||
.byte $00, $00, $00, $ff, $00, $00, $00, $00 ; PETSCII code 67
|
||||
.byte $00, $00, $ff, $00, $00, $00, $00, $00 ; PETSCII code 68
|
||||
.byte $00, $ff, $00, $00, $00, $00, $00, $00 ; PETSCII code 69
|
||||
.byte $00, $00, $00, $00, $00, $ff, $00, $00 ; PETSCII code 70
|
||||
.byte $20, $20, $20, $20, $20, $20, $20, $20 ; PETSCII code 71
|
||||
.byte $04, $04, $04, $04, $04, $04, $04, $04 ; PETSCII code 72
|
||||
.byte $00, $00, $00, $00, $e0, $10, $08, $08 ; PETSCII code 73
|
||||
.byte $08, $08, $08, $04, $03, $00, $00, $00 ; PETSCII code 74
|
||||
.byte $08, $08, $08, $10, $e0, $00, $00, $00 ; PETSCII code 75
|
||||
.byte $80, $80, $80, $80, $80, $80, $80, $ff ; PETSCII code 76
|
||||
.byte $80, $40, $20, $10, $08, $04, $02, $01 ; PETSCII code 77
|
||||
.byte $01, $02, $04, $08, $10, $20, $40, $80 ; PETSCII code 78
|
||||
.byte $ff, $80, $80, $80, $80, $80, $80, $80 ; PETSCII code 79
|
||||
.byte $ff, $01, $01, $01, $01, $01, $01, $01 ; PETSCII code 80
|
||||
.byte $00, $3c, $7e, $7e, $7e, $7e, $3c, $00 ; PETSCII code 81
|
||||
.byte $00, $00, $00, $00, $00, $00, $ff, $00 ; PETSCII code 82
|
||||
.byte $36, $7f, $7f, $7f, $3e, $1c, $08, $00 ; PETSCII code 83
|
||||
.byte $40, $40, $40, $40, $40, $40, $40, $40 ; PETSCII code 84
|
||||
.byte $00, $00, $00, $00, $03, $04, $08, $08 ; PETSCII code 85
|
||||
.byte $81, $42, $24, $18, $18, $24, $42, $81 ; PETSCII code 86
|
||||
.byte $00, $3c, $42, $42, $42, $42, $3c, $00 ; PETSCII code 87
|
||||
.byte $08, $1c, $2a, $77, $2a, $08, $08, $00 ; PETSCII code 88
|
||||
.byte $02, $02, $02, $02, $02, $02, $02, $02 ; PETSCII code 89
|
||||
.byte $08, $1c, $3e, $7f, $3e, $1c, $08, $00 ; PETSCII code 90
|
||||
.byte $08, $08, $08, $08, $ff, $08, $08, $08 ; PETSCII code 91
|
||||
.byte $a0, $50, $a0, $50, $a0, $50, $a0, $50 ; PETSCII code 92
|
||||
.byte $08, $08, $08, $08, $08, $08, $08, $08 ; PETSCII code 93
|
||||
.byte $00, $00, $01, $3e, $54, $14, $14, $00 ; PETSCII code 94
|
||||
.byte $ff, $7f, $3f, $1f, $0f, $07, $03, $01 ; PETSCII code 95
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 96
|
||||
.byte $f0, $f0, $f0, $f0, $f0, $f0, $f0, $f0 ; PETSCII code 97
|
||||
.byte $00, $00, $00, $00, $ff, $ff, $ff, $ff ; PETSCII code 98
|
||||
.byte $ff, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 99
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $ff ; PETSCII code 100
|
||||
.byte $80, $80, $80, $80, $80, $80, $80, $80 ; PETSCII code 101
|
||||
.byte $aa, $55, $aa, $55, $aa, $55, $aa, $55 ; PETSCII code 102
|
||||
.byte $01, $01, $01, $01, $01, $01, $01, $01 ; PETSCII code 103
|
||||
.byte $00, $00, $00, $00, $aa, $55, $aa, $55 ; PETSCII code 104
|
||||
.byte $ff, $fe, $fc, $f8, $f0, $e0, $c0, $80 ; PETSCII code 105
|
||||
.byte $03, $03, $03, $03, $03, $03, $03, $03 ; PETSCII code 106
|
||||
.byte $08, $08, $08, $08, $0f, $08, $08, $08 ; PETSCII code 107
|
||||
.byte $00, $00, $00, $00, $0f, $0f, $0f, $0f ; PETSCII code 108
|
||||
.byte $08, $08, $08, $08, $0f, $00, $00, $00 ; PETSCII code 109
|
||||
.byte $00, $00, $00, $00, $f8, $08, $08, $08 ; PETSCII code 110
|
||||
.byte $00, $00, $00, $00, $00, $00, $ff, $ff ; PETSCII code 111
|
||||
.byte $00, $00, $00, $00, $0f, $08, $08, $08 ; PETSCII code 112
|
||||
.byte $08, $08, $08, $08, $ff, $00, $00, $00 ; PETSCII code 113
|
||||
.byte $00, $00, $00, $00, $ff, $08, $08, $08 ; PETSCII code 114
|
||||
.byte $08, $08, $08, $08, $f8, $08, $08, $08 ; PETSCII code 115
|
||||
.byte $c0, $c0, $c0, $c0, $c0, $c0, $c0, $c0 ; PETSCII code 116
|
||||
.byte $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0 ; PETSCII code 117
|
||||
.byte $07, $07, $07, $07, $07, $07, $07, $07 ; PETSCII code 118
|
||||
.byte $ff, $ff, $00, $00, $00, $00, $00, $00 ; PETSCII code 119
|
||||
.byte $ff, $ff, $ff, $00, $00, $00, $00, $00 ; PETSCII code 120
|
||||
.byte $00, $00, $00, $00, $00, $ff, $ff, $ff ; PETSCII code 121
|
||||
.byte $01, $01, $01, $01, $01, $01, $01, $ff ; PETSCII code 122
|
||||
.byte $00, $00, $00, $00, $f0, $f0, $f0, $f0 ; PETSCII code 123
|
||||
.byte $0f, $0f, $0f, $0f, $00, $00, $00, $00 ; PETSCII code 124
|
||||
.byte $08, $08, $08, $08, $f8, $00, $00, $00 ; PETSCII code 125
|
||||
.byte $f0, $f0, $f0, $f0, $00, $00, $00, $00 ; PETSCII code 126
|
||||
.byte $f0, $f0, $f0, $f0, $0f, $0f, $0f, $0f ; PETSCII code 127
|
||||
.byte $1c, $22, $4a, $56, $4c, $20, $1e, $00 ; PETSCII code 128
|
||||
.byte $00, $00, $3c, $04, $7c, $64, $7c, $00 ; PETSCII code 129
|
||||
.byte $40, $40, $7e, $42, $62, $62, $7e, $00 ; PETSCII code 130
|
||||
.byte $00, $00, $7e, $42, $60, $62, $7e, $00 ; PETSCII code 131
|
||||
.byte $02, $02, $7e, $42, $62, $62, $7e, $00 ; PETSCII code 132
|
||||
.byte $00, $00, $7e, $42, $7e, $60, $7e, $00 ; PETSCII code 133
|
||||
.byte $1e, $12, $10, $7c, $18, $18, $18, $00 ; PETSCII code 134
|
||||
.byte $00, $00, $7e, $42, $62, $7e, $02, $7e ; PETSCII code 135
|
||||
.byte $40, $40, $7e, $42, $62, $62, $62, $00 ; PETSCII code 136
|
||||
.byte $18, $00, $10, $10, $18, $18, $18, $00 ; PETSCII code 137
|
||||
.byte $0c, $00, $08, $0c, $0c, $0c, $44, $7c ; PETSCII code 138
|
||||
.byte $40, $40, $44, $48, $78, $64, $64, $00 ; PETSCII code 139
|
||||
.byte $10, $10, $10, $10, $18, $18, $18, $00 ; PETSCII code 140
|
||||
.byte $00, $00, $7f, $49, $6d, $6d, $6d, $00 ; PETSCII code 141
|
||||
.byte $00, $00, $7e, $42, $62, $62, $62, $00 ; PETSCII code 142
|
||||
.byte $00, $00, $7e, $42, $62, $62, $7e, $00 ; PETSCII code 143
|
||||
.byte $00, $00, $7e, $42, $62, $7e, $40, $40 ; PETSCII code 144
|
||||
.byte $00, $00, $7e, $42, $46, $7e, $02, $02 ; PETSCII code 145
|
||||
.byte $00, $00, $7e, $40, $60, $60, $60, $00 ; PETSCII code 146
|
||||
.byte $00, $00, $7e, $40, $7e, $06, $7e, $00 ; PETSCII code 147
|
||||
.byte $10, $10, $7c, $10, $18, $18, $18, $00 ; PETSCII code 148
|
||||
.byte $00, $00, $42, $42, $62, $62, $7e, $00 ; PETSCII code 149
|
||||
.byte $00, $00, $62, $62, $66, $24, $3c, $00 ; PETSCII code 150
|
||||
.byte $00, $00, $49, $49, $6d, $6d, $7f, $00 ; PETSCII code 151
|
||||
.byte $00, $00, $42, $42, $3c, $62, $62, $00 ; PETSCII code 152
|
||||
.byte $00, $00, $62, $62, $42, $7e, $02, $7e ; PETSCII code 153
|
||||
.byte $00, $00, $7e, $06, $18, $60, $7e, $00 ; PETSCII code 154
|
||||
.byte $3c, $20, $20, $20, $20, $20, $3c, $00 ; PETSCII code 155
|
||||
.byte $00, $40, $20, $10, $08, $04, $02, $00 ; PETSCII code 156
|
||||
.byte $3c, $04, $04, $04, $04, $04, $3c, $00 ; PETSCII code 157
|
||||
.byte $00, $08, $1c, $2a, $08, $08, $14, $14 ; PETSCII code 158
|
||||
.byte $00, $00, $10, $20, $7f, $20, $10, $00 ; PETSCII code 159
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 160
|
||||
.byte $08, $08, $08, $0c, $0c, $00, $0c, $00 ; PETSCII code 161
|
||||
.byte $6c, $24, $6c, $00, $00, $00, $00, $00 ; PETSCII code 162
|
||||
.byte $24, $24, $7e, $24, $7e, $24, $24, $00 ; PETSCII code 163
|
||||
.byte $08, $3e, $20, $3e, $06, $3e, $08, $00 ; PETSCII code 164
|
||||
.byte $00, $62, $64, $08, $10, $26, $46, $00 ; PETSCII code 165
|
||||
.byte $3c, $20, $24, $7e, $64, $64, $7c, $00 ; PETSCII code 166
|
||||
.byte $1c, $18, $10, $00, $00, $00, $00, $00 ; PETSCII code 167
|
||||
.byte $04, $08, $10, $10, $10, $08, $04, $00 ; PETSCII code 168
|
||||
.byte $20, $10, $08, $08, $08, $10, $20, $00 ; PETSCII code 169
|
||||
.byte $08, $2a, $1c, $3e, $1c, $2a, $08, $00 ; PETSCII code 170
|
||||
.byte $00, $08, $08, $3e, $08, $08, $00, $00 ; PETSCII code 171
|
||||
.byte $00, $00, $00, $00, $00, $18, $18, $08 ; PETSCII code 172
|
||||
.byte $00, $00, $00, $7e, $00, $00, $00, $00 ; PETSCII code 173
|
||||
.byte $00, $00, $00, $00, $00, $18, $18, $00 ; PETSCII code 174
|
||||
.byte $00, $02, $04, $08, $10, $20, $40, $00 ; PETSCII code 175
|
||||
.byte $7e, $62, $52, $4a, $46, $46, $7e, $00 ; PETSCII code 176
|
||||
.byte $38, $08, $08, $18, $18, $1a, $3e, $00 ; PETSCII code 177
|
||||
.byte $7e, $42, $02, $7e, $60, $60, $7e, $00 ; PETSCII code 178
|
||||
.byte $7c, $44, $04, $1e, $06, $46, $7e, $00 ; PETSCII code 179
|
||||
.byte $44, $44, $44, $44, $7e, $0c, $0c, $00 ; PETSCII code 180
|
||||
.byte $7e, $40, $7e, $06, $06, $46, $7e, $00 ; PETSCII code 181
|
||||
.byte $7e, $42, $40, $7e, $46, $46, $7e, $00 ; PETSCII code 182
|
||||
.byte $7e, $02, $02, $06, $06, $06, $06, $00 ; PETSCII code 183
|
||||
.byte $3c, $24, $24, $7e, $46, $46, $7e, $00 ; PETSCII code 184
|
||||
.byte $7e, $42, $42, $7e, $06, $06, $06, $00 ; PETSCII code 185
|
||||
.byte $00, $00, $18, $00, $00, $18, $00, $00 ; PETSCII code 186
|
||||
.byte $00, $00, $18, $00, $00, $18, $18, $08 ; PETSCII code 187
|
||||
.byte $0e, $18, $30, $60, $30, $18, $0e, $00 ; PETSCII code 188
|
||||
.byte $00, $00, $7e, $00, $7e, $00, $00, $00 ; PETSCII code 189
|
||||
.byte $70, $18, $0c, $06, $0c, $18, $70, $00 ; PETSCII code 190
|
||||
.byte $7e, $02, $02, $7e, $60, $00, $60, $00 ; PETSCII code 191
|
||||
.byte $00, $00, $00, $00, $ff, $00, $00, $00 ; PETSCII code 192
|
||||
.byte $3c, $24, $24, $7e, $62, $62, $62, $00 ; PETSCII code 193
|
||||
.byte $78, $44, $44, $7c, $62, $62, $7e, $00 ; PETSCII code 194
|
||||
.byte $7e, $42, $40, $60, $60, $62, $7e, $00 ; PETSCII code 195
|
||||
.byte $7c, $46, $42, $62, $62, $66, $7c, $00 ; PETSCII code 196
|
||||
.byte $7e, $40, $40, $78, $60, $60, $7e, $00 ; PETSCII code 197
|
||||
.byte $7e, $40, $40, $7e, $60, $60, $60, $00 ; PETSCII code 198
|
||||
.byte $7e, $42, $40, $6e, $62, $62, $7e, $00 ; PETSCII code 199
|
||||
.byte $42, $42, $42, $7e, $62, $62, $62, $00 ; PETSCII code 200
|
||||
.byte $08, $08, $08, $0c, $0c, $0c, $0c, $00 ; PETSCII code 201
|
||||
.byte $04, $04, $04, $06, $06, $46, $7e, $00 ; PETSCII code 202
|
||||
.byte $42, $44, $48, $7c, $62, $62, $62, $00 ; PETSCII code 203
|
||||
.byte $40, $40, $40, $60, $60, $60, $7e, $00 ; PETSCII code 204
|
||||
.byte $7e, $4a, $4a, $6a, $6a, $6a, $6a, $00 ; PETSCII code 205
|
||||
.byte $7e, $42, $42, $62, $62, $62, $62, $00 ; PETSCII code 206
|
||||
.byte $7e, $46, $42, $42, $42, $42, $7e, $00 ; PETSCII code 207
|
||||
.byte $7e, $42, $42, $7e, $60, $60, $60, $00 ; PETSCII code 208
|
||||
.byte $7e, $42, $42, $42, $4a, $4e, $7e, $00 ; PETSCII code 209
|
||||
.byte $7c, $44, $44, $7c, $62, $62, $62, $00 ; PETSCII code 210
|
||||
.byte $7e, $42, $40, $7e, $06, $46, $7e, $00 ; PETSCII code 211
|
||||
.byte $3e, $10, $10, $18, $18, $18, $18, $00 ; PETSCII code 212
|
||||
.byte $42, $42, $42, $62, $62, $62, $7e, $00 ; PETSCII code 213
|
||||
.byte $62, $62, $62, $66, $24, $24, $3c, $00 ; PETSCII code 214
|
||||
.byte $4a, $4a, $4a, $6a, $6a, $6a, $7e, $00 ; PETSCII code 215
|
||||
.byte $42, $42, $66, $3c, $66, $62, $62, $00 ; PETSCII code 216
|
||||
.byte $22, $22, $22, $3e, $18, $18, $18, $00 ; PETSCII code 217
|
||||
.byte $7e, $42, $06, $18, $60, $62, $7e, $00 ; PETSCII code 218
|
||||
.byte $08, $08, $08, $08, $ff, $08, $08, $08 ; PETSCII code 219
|
||||
.byte $a0, $50, $a0, $50, $a0, $50, $a0, $50 ; PETSCII code 220
|
||||
.byte $08, $08, $08, $08, $08, $08, $08, $08 ; PETSCII code 221
|
||||
.byte $cc, $cc, $33, $33, $cc, $cc, $33, $33 ; PETSCII code 222
|
||||
.byte $cc, $66, $33, $99, $cc, $66, $33, $99 ; PETSCII code 223
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 224
|
||||
.byte $f0, $f0, $f0, $f0, $f0, $f0, $f0, $f0 ; PETSCII code 225
|
||||
.byte $00, $00, $00, $00, $ff, $ff, $ff, $ff ; PETSCII code 226
|
||||
.byte $ff, $00, $00, $00, $00, $00, $00, $00 ; PETSCII code 227
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $ff ; PETSCII code 228
|
||||
.byte $80, $80, $80, $80, $80, $80, $80, $80 ; PETSCII code 229
|
||||
.byte $aa, $55, $aa, $55, $aa, $55, $aa, $55 ; PETSCII code 230
|
||||
.byte $01, $01, $01, $01, $01, $01, $01, $01 ; PETSCII code 231
|
||||
.byte $00, $00, $00, $00, $aa, $55, $aa, $55 ; PETSCII code 232
|
||||
.byte $99, $33, $66, $cc, $99, $33, $66, $cc ; PETSCII code 233
|
||||
.byte $03, $03, $03, $03, $03, $03, $03, $03 ; PETSCII code 234
|
||||
.byte $08, $08, $08, $08, $0f, $08, $08, $08 ; PETSCII code 235
|
||||
.byte $00, $00, $00, $00, $0f, $0f, $0f, $0f ; PETSCII code 236
|
||||
.byte $08, $08, $08, $08, $0f, $00, $00, $00 ; PETSCII code 237
|
||||
.byte $00, $00, $00, $00, $f8, $08, $08, $08 ; PETSCII code 238
|
||||
.byte $00, $00, $00, $00, $00, $00, $ff, $ff ; PETSCII code 239
|
||||
.byte $00, $00, $00, $00, $0f, $08, $08, $08 ; PETSCII code 240
|
||||
.byte $08, $08, $08, $08, $ff, $00, $00, $00 ; PETSCII code 241
|
||||
.byte $00, $00, $00, $00, $ff, $08, $08, $08 ; PETSCII code 242
|
||||
.byte $08, $08, $08, $08, $f8, $08, $08, $08 ; PETSCII code 243
|
||||
.byte $c0, $c0, $c0, $c0, $c0, $c0, $c0, $c0 ; PETSCII code 244
|
||||
.byte $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0 ; PETSCII code 245
|
||||
.byte $07, $07, $07, $07, $07, $07, $07, $07 ; PETSCII code 246
|
||||
.byte $ff, $ff, $00, $00, $00, $00, $00, $00 ; PETSCII code 247
|
||||
.byte $ff, $ff, $ff, $00, $00, $00, $00, $00 ; PETSCII code 248
|
||||
.byte $00, $00, $00, $00, $00, $ff, $ff, $ff ; PETSCII code 249
|
||||
.byte $01, $02, $44, $48, $50, $60, $40, $00 ; PETSCII code 250
|
||||
.byte $00, $00, $00, $00, $f0, $f0, $f0, $f0 ; PETSCII code 251
|
||||
.byte $0f, $0f, $0f, $0f, $00, $00, $00, $00 ; PETSCII code 252
|
||||
.byte $08, $08, $08, $08, $f8, $00, $00, $00 ; PETSCII code 253
|
||||
.byte $f0, $f0, $f0, $f0, $00, $00, $00, $00 ; PETSCII code 254
|
||||
.byte $f0, $f0, $f0, $f0, $0f, $0f, $0f, $0f ; PETSCII code 255
|
1140
samples/kim1/subs.asm
Normal file
1140
samples/kim1/subs.asm
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user