added -g option for LGR mixed gr/text splash screen

This commit is contained in:
Egan Ford 2017-04-24 23:11:51 -06:00
parent 0e25155cf6
commit 7b7ab6627d
11 changed files with 257 additions and 99 deletions

View File

@ -124,7 +124,7 @@ Yes. No input checking. Big Endian untested.
### The Ugly Stuff
c2d, Code to Disk, Version 0.55
c2d, Code to Disk, Version 0.56
(c) 2012,2017 All Rights Reserved, Egan Ford (egan@sense.net)

View File

@ -34,6 +34,15 @@ barptr = $06 ; bar pointer
.org stage1
grcheck:
lda *+(gr-loader)+(moved-grcheck)
beq text
lda #0 ; GR mode
sta $C050
sta $C053
text:
init:
lda #0 ; reset pointer and counter
sta barcnt
@ -114,11 +123,24 @@ secloop:
lda barptr ; get position
;clc
;adc #5 ; indent
sta ch
lda row ; row 19
jsr movecur
lda #invsp
jsr cout
; new version, no rom calls, just poke to screen
clc ; clear carry
adc rowlsb ; add the text page row lsb
sta screen+1 ; store that in self mod code
lda rowmsb ; get text page row msb
sta screen+2 ; store that in self mod code
lda #invsp ; load block char
screen:
sta $400 ; write out char
; old version, rom calls, cout will scroll windows on 40x24
;sta ch
;lda row ; row 19
;jsr movecur
;lda #invsp
;jsr cout
inc barptr ; move pointer to next bar position
nodraw:
;;;end draw code
@ -151,7 +173,13 @@ loadpage:
.org *+1
nextjump:
.org *+2
gr:
.org *+1
row:
.org *+1
rowlsb:
.org *+1
rowmsb:
.org *+1
bar:
.org *+40

View File

@ -32,6 +32,24 @@ trknum = $04 ; loop var
start:
.org stage1
grcheck:
lda *+(gr-loader)+(moved-grcheck)
beq init
lda #0 ; GR mode
sta $C050
sta $C053
init:
lda #1 ; read(1)/write(2) command
ldy #$0C ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #0 ; buffer LSB
ldy #8 ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #2
sta trknum ; start with track 2
ldx #0 ; move code to stage2
move:
lda moved,x
@ -45,17 +63,6 @@ moved:
.org stage2
loader:
lda #1 ; read(1)/write(2) command
ldy #$0C ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #0 ; buffer LSB
ldy #8 ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #2
sta trknum ; start with track 2
lda loadpage ; where to dump the tracks
sta buffer
@ -125,14 +132,5 @@ loadpage:
.org *+1
nextjump:
.org *+2
;;; used for debug
;trkcnt:
; .org *+1
;segcnt:
; .org *+1
;buffer:
; .org *+1
;secnum:
; .org *+1
;trknum:
; .org *+1
gr:
.org *+1

BIN
bin/c2d

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

33
c2d.c
View File

@ -1,6 +1,6 @@
/*
c2d, Code to Disk, Version 0.55
c2d, Code to Disk, Version 0.56
(c) 2012,2017 All Rights Reserved, Egan Ford (egan@sense.net)
@ -43,7 +43,7 @@ Bugs:
#include "c2d.h"
#include "holes.h"
#define VERSION "Version 0.55"
#define VERSION "Version 0.56"
#define INFILE argv[argc-2]
#define OUTFILE argv[argc-1]
#define BINARY 0
@ -57,13 +57,14 @@ int main(int argc, char **argv)
{
FILE *ifp, *ofp;
int c, i, j, k, start = 0, loadaddress, inputtype, warm = 0, filesize = 0, unpatch = 0;
int loaderstart, loader = 0, loadersize = 0, loaderbasesize = 0, textpagesize = 0, bar = 0, row = 19;
int loaderstart, loader = 0, loadersize = 0, loaderbasesize = 0, textpagesize = 0;
int bar = 0, row = 19, gr = 0;
struct stat st;
char *filetypes[] = { "BINARY", "MONITOR" };
char *ext, filename[256], load_address[10], *textpage = NULL;
opterr = 1;
while ((c = getopt(argc, argv, "r:t:vmh?s:ub")) != -1)
while ((c = getopt(argc, argv, "gr:t:vmh?s:ub")) != -1)
switch (c) {
case 't': // load a splash page while loading binary
loader = 1;
@ -82,6 +83,8 @@ int main(int argc, char **argv)
break;
case 'r': // bar row
row = (int) strtol(optarg, (char **) NULL, 10); // todo: input check
if (row > 23)
row = 23;
break;
case 'u':
unpatch = 1;
@ -89,6 +92,9 @@ int main(int argc, char **argv)
case 'b':
bar = 1;
break;
case 'g':
gr = 1;
break;
case 'h': // help
case '?':
usage();
@ -269,18 +275,31 @@ int main(int argc, char **argv)
blank.track[1].sector[4].byte[loadersize + 3] = start & 0xFF;
// program start MSB
blank.track[1].sector[4].byte[loadersize + 4] = start >> 8;
// gr mode
blank.track[1].sector[4].byte[loadersize + 5] = gr;
//bar code, pre compute status bar table
if(bar) {
int num_sectors = (int) ceil((filesize + (loadaddress & 0xFF)) / 256.0);
int bar_length = 40;
int i;
int i, rowaddr;
// bar row
blank.track[1].sector[4].byte[loadersize + 5] = row;
blank.track[1].sector[4].byte[loadersize + 6] = row;
rowaddr = 0x400+(row/8)*0x28+((row%8)*0x80);
// program start LSB
blank.track[1].sector[4].byte[loadersize + 7] = rowaddr & 0xFF;
// program start MSB
blank.track[1].sector[4].byte[loadersize + 8] = rowaddr >> 8;
// temp hack to prevent screen from scrolling
//if(row == 23)
// bar_length = 39;
for(i = 1; i <= bar_length; i++)
blank.track[1].sector[4].byte[loadersize + 5 + i] = i * num_sectors / bar_length;
blank.track[1].sector[4].byte[loadersize + 8 + i] = i * num_sectors / bar_length;
}
loaderstart = 0x400;

154
c2d.h
View File

@ -9045,6 +9045,24 @@ trknum = $04 ; loop var
start:
.org stage1
grcheck:
lda *+(gr-loader)+(moved-grcheck)
beq init
lda #0 ; GR mode
sta $C050
sta $C053
init:
lda #1 ; read(1)/write(2) command
ldy #$0C ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #0 ; buffer LSB
ldy #8 ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #2
sta trknum ; start with track 2
ldx #0 ; move code to stage2
move:
lda moved,x
@ -9058,17 +9076,6 @@ moved:
.org stage2
loader:
lda #1 ; read(1)/write(2) command
ldy #$0C ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #0 ; buffer LSB
ldy #8 ; offset in RWTS
sta rwtsprm,y ; write it to RWTS
lda #2
sta trknum ; start with track 2
lda loadpage ; where to dump the tracks
sta buffer
@ -9138,34 +9145,27 @@ loadpage:
.org *+1
nextjump:
.org *+2
;;; used for debug
;trkcnt:
; .org *+1
;segcnt:
; .org *+1
;buffer:
; .org *+1
;secnum:
; .org *+1
;trknum:
; .org *+1
gr:
.org *+1
*/
unsigned char loadercode[] = {
0xA2,0x00,0xBD,0x0E,0x08,0x9D,0x00,0x03,
0xE8,0x10,0xF7,0x4C,0x00,0x03,0xA9,0x01,
0xA0,0x0C,0x99,0xE8,0xB7,0xA9,0x00,0xA0,
0x08,0x99,0xE8,0xB7,0xA9,0x02,0x85,0x04,
0xAD,0x69,0x03,0x85,0x02,0xAE,0x67,0x03,
0xCA,0xCA,0x86,0x00,0xA5,0x04,0xA0,0x04,
0x99,0xE8,0xB7,0xA5,0x00,0xD0,0x05,0xAD,
0x68,0x03,0x10,0x02,0xA9,0x0F,0x85,0x03,
0xA5,0x03,0xA0,0x05,0x99,0xE8,0xB7,0xA5,
0x02,0x18,0x65,0x03,0xA0,0x09,0x99,0xE8,
0xB7,0xA0,0xE8,0xA9,0xB7,0x20,0xB5,0xB7,
0xB0,0x18,0xA9,0x00,0x85,0x48,0xC6,0x03,
0x10,0xDE,0xA5,0x02,0x18,0x69,0x10,0x85,
0x02,0xE6,0x04,0xC6,0x00,0x10,0xBD,0x6C,
0x6A,0x03,0x4C,0x69,0xFF
0xAD,0x87,0x08,0xF0,0x08,0xA9,0x00,0x8D,
0x50,0xC0,0x8D,0x53,0xC0,0xA9,0x01,0xA0,
0x0C,0x99,0xE8,0xB7,0xA9,0x00,0xA0,0x08,
0x99,0xE8,0xB7,0xA9,0x02,0x85,0x04,0xA2,
0x00,0xBD,0x2D,0x08,0x9D,0x00,0x03,0xE8,
0x10,0xF7,0x4C,0x00,0x03,0xAD,0x57,0x03,
0x85,0x02,0xAE,0x55,0x03,0xCA,0xCA,0x86,
0x00,0xA5,0x04,0xA0,0x04,0x99,0xE8,0xB7,
0xA5,0x00,0xD0,0x05,0xAD,0x56,0x03,0x10,
0x02,0xA9,0x0F,0x85,0x03,0xA5,0x03,0xA0,
0x05,0x99,0xE8,0xB7,0xA5,0x02,0x18,0x65,
0x03,0xA0,0x09,0x99,0xE8,0xB7,0xA0,0xE8,
0xA9,0xB7,0x20,0xB5,0xB7,0xB0,0x18,0xA9,
0x00,0x85,0x48,0xC6,0x03,0x10,0xDE,0xA5,
0x02,0x18,0x69,0x10,0x85,0x02,0xE6,0x04,
0xC6,0x00,0x10,0xBD,0x6C,0x58,0x03,0x4C,
0x69,0xFF
};
/*
;bar.s
@ -9204,6 +9204,15 @@ barptr = $06 ; bar pointer
.org stage1
grcheck:
lda *+(gr-loader)+(moved-grcheck)
beq text
lda #0 ; GR mode
sta $C050
sta $C053
text:
init:
lda #0 ; reset pointer and counter
sta barcnt
@ -9284,11 +9293,24 @@ secloop:
lda barptr ; get position
;clc
;adc #5 ; indent
sta ch
lda row ; row 19
jsr movecur
lda #invsp
jsr cout
; new version, no rom calls, just poke to screen
clc ; clear carry
adc rowlsb ; add the text page row lsb
sta screen+1 ; store that in self mod code
lda rowmsb ; get text page row msb
sta screen+2 ; store that in self mod code
lda #invsp ; load block char
screen:
sta $400 ; write out char
; old version, rom calls, cout will scroll windows on 40x24
;sta ch
;lda row ; row 19
;jsr movecur
;lda #invsp
;jsr cout
inc barptr ; move pointer to next bar position
nodraw:
;;;end draw code
@ -9321,30 +9343,38 @@ loadpage:
.org *+1
nextjump:
.org *+2
gr:
.org *+1
row:
.org *+1
rowlsb:
.org *+1
rowmsb:
.org *+1
bar:
.org *+40
*/
unsigned char barcode[] = {
0xA9,0x00,0x85,0x05,0x85,0x06,0xA9,0x01,
0xA0,0x0C,0x99,0xE8,0xB7,0xA9,0x00,0xA0,
0x08,0x99,0xE8,0xB7,0xA9,0x02,0x85,0x04,
0xA2,0x00,0xBD,0x28,0x08,0x9D,0x00,0x03,
0xE8,0xE0,0xD0,0xD0,0xF5,0x4C,0x00,0x03,
0xAD,0x73,0x03,0x85,0x02,0xAE,0x71,0x03,
0xCA,0xCA,0x86,0x00,0xA5,0x04,0xA0,0x04,
0x99,0xE8,0xB7,0xA5,0x00,0xD0,0x05,0xAD,
0x72,0x03,0x10,0x02,0xA9,0x0F,0x85,0x03,
0xA5,0x03,0xA0,0x05,0x99,0xE8,0xB7,0xA5,
0x02,0x18,0x65,0x03,0xA0,0x09,0x99,0xE8,
0xB7,0xA0,0xE8,0xA9,0xB7,0x20,0xB5,0xB7,
0xB0,0x34,0xA9,0x00,0x85,0x48,0xE6,0x05,
0xA6,0x06,0xBD,0x77,0x03,0xC5,0x05,0xD0,
0x11,0xA5,0x06,0x85,0x24,0xAD,0x76,0x03,
0x20,0x5B,0xFB,0xA9,0x20,0x20,0xED,0xFD,
0xE6,0x06,0xC6,0x03,0x10,0xC2,0xA5,0x02,
0x18,0x69,0x10,0x85,0x02,0xE6,0x04,0xC6,
0x00,0x10,0xA1,0x6C,0x74,0x03,0x4C,0x69,
0xFF
0xAD,0xB0,0x08,0xF0,0x08,0xA9,0x00,0x8D,
0x50,0xC0,0x8D,0x53,0xC0,0xA9,0x00,0x85,
0x05,0x85,0x06,0xA9,0x01,0xA0,0x0C,0x99,
0xE8,0xB7,0xA9,0x00,0xA0,0x08,0x99,0xE8,
0xB7,0xA9,0x02,0x85,0x04,0xA2,0x00,0xBD,
0x35,0x08,0x9D,0x00,0x03,0xE8,0xE0,0xD0,
0xD0,0xF5,0x4C,0x00,0x03,0xAD,0x78,0x03,
0x85,0x02,0xAE,0x76,0x03,0xCA,0xCA,0x86,
0x00,0xA5,0x04,0xA0,0x04,0x99,0xE8,0xB7,
0xA5,0x00,0xD0,0x05,0xAD,0x77,0x03,0x10,
0x02,0xA9,0x0F,0x85,0x03,0xA5,0x03,0xA0,
0x05,0x99,0xE8,0xB7,0xA5,0x02,0x18,0x65,
0x03,0xA0,0x09,0x99,0xE8,0xB7,0xA0,0xE8,
0xA9,0xB7,0x20,0xB5,0xB7,0xB0,0x39,0xA9,
0x00,0x85,0x48,0xE6,0x05,0xA6,0x06,0xBD,
0x7F,0x03,0xC5,0x05,0xD0,0x16,0xA5,0x06,
0x18,0x6D,0x7D,0x03,0x8D,0x5B,0x03,0xAD,
0x7E,0x03,0x8D,0x5C,0x03,0xA9,0x20,0x8D,
0x00,0x04,0xE6,0x06,0xC6,0x03,0x10,0xBD,
0xA5,0x02,0x18,0x69,0x10,0x85,0x02,0xE6,
0x04,0xC6,0x00,0x10,0x9C,0x6C,0x79,0x03,
0x4C,0x69,0xFF
};

83
mandelbrotgr.c Normal file
View File

@ -0,0 +1,83 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <strings.h>
#include "holes.h"
#define MAX 15
#define NORMAL 0x80
// chanage order and number of colors for different output
// unsigned char colors[16] = { 0xF, 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };
unsigned char colors[15] = { 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };
const char text[4][41] = {
"EXAMPLE GR SPLASH SCREEN",
"LOADING GAME SERVER CLIENT ...",
"________________________________________",
"________________________________________",
};
int main(int argc, char **argv)
{
int c, r, i, j, k, line = 0;
double xd, yd, x0, y0, x, y, xt, pixelarea, area = 0;
unsigned char screen[24][40];
// clear screen to zeros
for (i = 0; i < 24; i++)
for (j = 0; j < 40; j++)
screen[i][j] = 0x00;
c = 40;
r = 40;
xd = (1.0 - -2.5) / (double) c; // size of x pixel
yd = (1.0 - -1.0) / (double) r; // size of y pixel
pixelarea = xd * yd;
for (i = 0; i < r; i++) {
// gr text page translation
line = 3 * ((i / 2) % 8) + i / 16;
y0 = 1 - i * yd;
for (j = 0; j < c; j++) {
x0 = -2.5 + j * xd;
k = x = y = 0;
while (x * x + y * y <= 4 && k < MAX) {
xt = x * x - y * y + x0;
y = 2 * x * y + y0;
x = xt;
k++;
}
screen[line][j] |= (colors[(k - 1) / (MAX / sizeof(colors))] << 4 * (i % 2));
if (k == MAX)
area += pixelarea;
}
}
// clear text lines with spaces
for (i = 20; i < 24; i++) {
line = 3 * (i % 8) + i / 8;
for (j = 0; j < 40; j++)
screen[line][j] = ' ' | NORMAL;
}
for (i = 0; i < 4; i++) {
line = 3 * ((i+20) % 8) + (i+20) / 8;
for (j = 0; j < 20 - strlen(text[i])/2; j++)
screen[line][j] = ' ' | NORMAL; // text rows
for (k = 0; k < strlen(text[i]); k++)
screen[line][j++] = text[i][k] | NORMAL;
}
// dump to stdout
for (i = 0; i < 24; i++) {
for (j = 0; j < 40; j++)
putchar(screen[i][j]);
if (i % 3 == 2)
for (k = 0; k < 8; k++)
putchar(holes[(i / 3) * 8 + k]);
}
return 0;
}

View File

@ -60,7 +60,7 @@ then
fi
fi
SUM=c027f451edcec4bef8a9edb66e15c78e
SUM=a2e62a1be3ceeed3fd9c09eae8339caa
rm -f ${BIN}.dsk
echo
@ -158,7 +158,7 @@ rm -f ${BIN}.dsk
fi
fi
SUM=c027f451edcec4bef8a9edb66e15c78e
SUM=a2e62a1be3ceeed3fd9c09eae8339caa
rm -f ${BIN}.dsk
echo