diff --git a/README.md b/README.md index 646cf90..3e3bca9 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/asm/bar.s b/asm/bar.s index dc33b47..ff12c88 100644 --- a/asm/bar.s +++ b/asm/bar.s @@ -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 diff --git a/asm/loader.s b/asm/loader.s index 67ed0d4..1c9be0d 100644 --- a/asm/loader.s +++ b/asm/loader.s @@ -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 diff --git a/bin/c2d b/bin/c2d index 605d420..e9fe250 100755 Binary files a/bin/c2d and b/bin/c2d differ diff --git a/bin/c2d.exe b/bin/c2d.exe index 1f3da23..9e767be 100755 Binary files a/bin/c2d.exe and b/bin/c2d.exe differ diff --git a/bin/page2text.exe b/bin/page2text.exe index 1ef6cda..0b50ca1 100755 Binary files a/bin/page2text.exe and b/bin/page2text.exe differ diff --git a/bin/text2page.exe b/bin/text2page.exe index e0d2675..c96f433 100755 Binary files a/bin/text2page.exe and b/bin/text2page.exe differ diff --git a/c2d.c b/c2d.c index ade08cb..0a2e618 100644 --- a/c2d.c +++ b/c2d.c @@ -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; diff --git a/c2d.h b/c2d.h index 96f5a4d..4624089 100644 --- a/c2d.h +++ b/c2d.h @@ -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 }; diff --git a/mandelbrotgr.c b/mandelbrotgr.c new file mode 100644 index 0000000..b463db3 --- /dev/null +++ b/mandelbrotgr.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#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; +} diff --git a/test.sh b/test.sh index 6268d05..dbf96ae 100755 --- a/test.sh +++ b/test.sh @@ -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