Pinned GoDot Infos (Programierkurs / Handbuch / Quellcode-PDFs)


  • GoDot
  • 14320 Views 193 replies

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Update:

    Endlich hab ich Informationen zum Packalgorithmus von Micro Illustrator gefunden. Die waren zwar in weiten Teilen für C64 nicht ganz zutreffend, haben aber den entscheidenden Schritt gebracht. Hier also der neue Lader MIllustr8or, der jetzt auch gepackte Bilder versteht.

    Bei der Arbeit war nicht das Ergebnis interessant (wer verwendet schon Bilder vom Atari?), sondern die Lösung des Algorithmus (hat mich eine Woche gekostet...)

    Hat übrigens einer ein paar Bilder, mit denen man mal rumprobieren könnte? Ein Link auf Originalbilder?

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • GoDot wrote:

    Update:

    Endlich hab ich Informationen zum Packalgorithmus von Micro Illustrator gefunden. Die waren zwar in weiten Teilen für C64 nicht ganz zutreffend, haben aber den entscheidenden Schritt gebracht. Hier also der neue Lader MIllustr8or, der jetzt auch gepackte Bilder versteht.

    Bei der Arbeit war nicht das Ergebnis interessant (wer verwendet schon Bilder vom Atari?), sondern die Lösung des Algorithmus (hat mich eine Woche gekostet...)

    Hat übrigens einer ein paar Bilder, mit denen man mal rumprobieren könnte? Ein Link auf Originalbilder?

    Arndt
    Könntest Du auch ein Modul anfertigen, womit ich gif Bilder vom C65 zum C64 portieren kann?

    Pusti64
  • GoDot mit Retrofans Font:



    Der hier angezeigte Text dient nur der Veranschaulichung, ist ansonsten 30 Jahre alt. Wer den Font einbinden will: Er befindet sich auf Disk c von GoDot unter seinem Standard-GoDot-Namen ("god.set"), einfach die gleichnamige Datei auf Disk a mit dieser überschreiben und schon hat GoDot einen anderen Look. :)

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • GoDot wrote:

    GoDot mit Retrofans Font:
    Sehr schön. Dann scheint er dir ja zu gefallen – ich fühle mich geehrt. Mir fiel aber gleich auf, dass die Umlaute (und das ß) nicht von mir sind – Im normalen C64-Font sind sie ja auch nicht enthalten. Allerdings in einigen anderen "Geschmacksrichtungen" (Vizawrite, Startexter, C128, Atari ...). ich könnte sie dir also auf Wunsch zukommen lassen oder aber direkt deinen Godot-Font modifizieren, falls du das OK fändest.
  • Retrofan wrote:

    Dann scheint er dir ja zu gefallen – ich fühle mich geehrt.
    Nein, nein! Ganz meinerseits! Der Font ist unbestreitbar gut lesbar, viel besser als der originale. Außerdem sieht er "schnittig" aus (hehe… Wortspiel)! Ich werde ihn auf jeden Fall als Standard-Font in goDos einbauen.

    Retrofan wrote:

    das originale god.set aus deinem Paket genommen und dort den kompletten PXLfont (inkl. Umlaute) reingepackt.
    Super! Hab ich gleich auf die GoDot-c-Disk gepackt und ist nun verfügbar. Hier noch mal ein Screenshot (mit ä, ü und ß):



    Gefällt mir wirklich! :)

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Update

    NetCopy (das ist die GoDot-Version von Paul Gardner-Stephens 64Net File Copy) ist überarbeitet. Jetzt müssten alle Anzeigen (vor allem die Dateilängen links im Directory-Fenster) auch wirklich erscheinen. Außerdem gab's noch einen kleinen Bug bei Input (Freeze bei Abbruch des Input). Sources wie immer auf Github.

    Hat einer das 64Net noch am Laufen? Würd mich interessieren, ob es überhaupt noch funktioniert (damals, v1.68, die tat es). NetCopy befindet sich auf der dritten GoDot-Disk.

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Frage:

    Ich hab hier den Sourcecode eines Laders für ein FLI-Format, das mit 200 Bytes (wahrscheinlich Backgroundfarben) anfängt und dann wie üblich weitergeht (1024 Bytes Colorram, 8x1024 Bytes Videoram und 8192 Bytes Bitmap). Der Name des Codefiles ist vielleicht auch noch ein Hinweis ("Chester's FLI").

    Kennt einer das Format? Hat einer Beispielbilder dafür? Dann bitte mir geben.

    Es ist damit der LETZTE Quellcode von GoDot, den ich nach Github hochladen kann, alle anderen (die ich noch auftreiben oder rekonstruieren konnte) sind bearbeitet. Dann wäre das Kapitel "Veröffentlichung der GoDot-Sources" vorerst abgeschlossen.

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • -trb- wrote:

    Warum muss ich da nur an jemand Bestimmtes denken?
    Hehe.. richtig, ich hatte mit Chester Kontakt, als er an CLiPS gearbeitet hat. :) Aus der Zeit stammt auch der Lader, sehr wahrscheinlich bezieht sich das auf ein Format, das er selbst irgendwo verwendet hat, das aber (jedenfalls für mich) verschollen ist. Ich bräuchte nur ein paar Beispielbilder, um den Lader zu verifizieren. Genauso für das FLIProfi-Format von XBow, das hat am Anfang eine Backgrounds-Liste von 256 Bytes. Da finde ich auch keine Beispielbilder, und ich will keine Bilder faken, weil ich dann ja nicht weiß, ob die echten Bilder tatsächlich so aufgebaut sind.

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Das Programm FLI Graph 2.2 vom der Gruppe Blackmail benutzt den Bereich von $3b00 - $3bc7 für die Hintergrundfarbe. Mit Beispielbilder kann ich leider nicht dienen.

    csdb.dk/release/?id=3773

    codebase64.org/doku.php?id=bas…ix_files_specs_list_v0.03

    ---------------------------------------------------------------------------------------

    Auf der "Tool"-Diskette von Krestology 100% ist ein Bild vom FLI Profi V1 (Crossbow) zu finden.("FLIPROFI DEMOPIC")

    csdb.dk/release/download.php?id=11407

    Ich hoffe das hilft dir ein wenig weiter.
  • TXA wrote:

    benutzt den Bereich von $3b00 - $3bc7
    Ja, das hab ich im Lader FLIGraph schon berücksichtigt (und auch ausprobiert!)

    TXA wrote:

    ist ein Bild vom FLI Profi V1 (Crossbow) zu finden.
    Und inzwischen hab ich gehört, dass es das einzige Bild in diesem Format sein soll! Hehe… kann das sein? Wenn ja: dann lohnt sich kein extra Lader, klar.

    TXA wrote:

    Ich hoffe das hilft dir ein wenig weiter.
    Natürlich! Toll, dass man hier auch so spezielle Informationen schnell erhält! :)

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • So, mit den beiden Modulen SIS und SIRDS (ursprünglich von Peter Steinseifer - gibt's den noch im C64-Land?) sind nunmehr alle nutzbaren Module GoDots auf Github hochgeladen. Wer ACME benutzt, kann sie dort direkt in ein D81 assemblieren und nutzen.

    Die beiden letzten Module musste ich aus dem Objektcode rekonstruieren (und erst mal verstehen...) Dabei hab ich gleich was Neues eingebaut: Aus mir unerfindlichen Gründen hat Peter damals (1994!) nicht alle 16 Graustufen in GoDot zur Anwendung gebracht, sondern es bei den neun Hardware-Graustufen belassen. Das ist jetzt vorbei ;) Hier mal ein GoDot-Stereogramm (mit einem mit dem Modul Plasma hergestellten Alphakanal):



    Wer seinen Augen die richtige Biegung geben kann, sieht oben links und rechts zwei Berge und unten die entsprechenden Täler... :)

    Damit ist die Ver-ACME-isierung von GoDot abgeschlossen!


    Hat ein Jahr gebraucht, zehn dicke Leitz-Ordner...

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Uh...

    Ich mag es ja kaum zugeben, aber ich habe heute zwei Bugs in GoDots Render-Routinen gefixt... :|

    Der eine hat sich ausgewirkt, wenn man die Anzahl der Renderfarben auf fünf gestellt hat und das Bild berechnen ließ: Es kamen immer nur vier Farben raus...

    Der andere führte nicht zu sichtbaren Fehlern (glaube ich). Es geht da eher darum, was beim Rendern zuerst berücksichtigt werden soll: die Quantisierungstabelle oder die Balancing-Tabelle (ist jetzt so eingestellt, dass die Quantisierung als erste in die Berechnung des Bildes einfließt).

    Und wie bin ich drauf gestoßen? Ich hab das Modul HowMany etwas gepimpt. Es zeigt jetzt farbig, in welcher Grafikkachel zu viele Farben fürs clash-freie Rendern drin sind. Na ja, und da fiel mir eben auf, dass bei 5 Farben immer nur die Zahl 4 erschien...

    Gut. Das führte also dazu, dass jetzt die Systemfiles god.main und god.upmem upgedatet wurden. :winke:
    :schande: Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Hi Arndt

    Mal eine Frage.
    Hast du schon einmal versucht ein Modul zu schreiben wo man ein Bild in PetscII konventieren kann?
    Ich frage deshalb, weil durch Zeha´s Idee ein kleines Basicprogramm zu schreiben für Weihnachten 2018, wo ich eigentlich ein Bild mit Petscii gestallten wollte.
    Es git sehr viele Editoren womit man Petscii-Bilder gestalten kann. Aber ich habe sehr lange suchen müssen bis ich ein Browser-Tool gefunden habe wo mir ein Grafikbild in Petscii umwandelt kann.
    Jetzt meine Frage kann man aus html-Datei ein C64-Modul für GoDot schreiben.
    Das Brrowser Programm speichert dann die Daten als pet-Datei ab.
    Und die kann man dan mit eine Lese-Routine im Basic anzeigen lassen.

    Source Code

    1. 10 print chr$(147)
    2. 20 input f$
    3. 30 poke 53280,0:poke 53281,15
    4. 40 open 1,8,2,f$
    5. 50 for i=o to 999
    6. 60 get #1,a$:if a$="" then a$=" "
    7. 70 poke 1024+i,asc(a$)
    8. 80 next i
    9. 90 goto 90
    Und ich habe deswegen noch ein kleines Problem, ich habe zwar das Bild als Petscii, aber deswegen noch keine Basiczeilen dafür. Aber da frage ich mal Endurion, ob ma dafür sein C64-Studion verwenden kann.

    So Arndt weis meist du, kann man da was machen?
    Hier mal die Seite wo ich das gefunden habe.
    c64os.com/post?p=21

    Gruß Drachen
    :D :D Ich liebe den Sound vom C64ér :thumbsup: :thumbsup: :thumbsup:
  • GoDot wrote:

    ich habe heute zwei Bugs in GoDots Render-Routinen gefixt...
    Hach! Der zweite Bug war ein Fehlalarm. So wie's immer war, war's richtig... puh. (Hab ich schon rückgängig gemacht.) Der andere Bugfix bleibt bestehen.

    Drachen wrote:

    meist du, kann man da was machen?
    Bilder nach PETSCII wandeln? Umgekehrt hab ich da schon was (PrintTo4Bit, Bildbeispiele unten auf der Seite). Mal sehen, was man denn so herum machen kann. Irgendwo gibt's im Netz eine ACSII-Art-Seite inklusive Bild-Generator (weiß gerade die Adresse nicht). Das müsste man sich auch mal anschauen. Greg Nacus Programm hab ich jedenfalls schon mal runtergeladen. :)

    Arndt
    GoDot C64 Image Processing
    www.godot64.de
    GoDot on Github
  • Hi Arndt

    Das wär echt klasse wenn das klappen würde. Ich habe mir mal die html-Datei angeschaut. Da sieht man teilweise den Programmcode

    HTML Source Code

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>
    6. C64 PETSCII Art Generator
    7. </title>
    8. <style type='text/css'>
    9. </style>
    10. </head>
    11. <body onload='init();'>
    12. <script type='text/javascript'>
    13. var CHARSET = "upperlower"
    14. var CHARACTERS = 256;
    15. var WIDTH = 320;
    16. var HEIGHT = 200;
    17. var CWIDTH = 8;
    18. var CHEIGHT = 8;
    19. var canvas;
    20. var source;
    21. var context;
    22. var character;
    23. var chardata = [];
    24. var srcdata = [];
    25. var petscii = new Uint8Array( (WIDTH/CWIDTH) * (HEIGHT/CHEIGHT) );
    26. var characterContainer;
    27. var characterCanvas = [];
    28. var saveByteArray = (function () {
    29. var a = document.createElement("a");
    30. document.body.appendChild(a);
    31. a.style = "display: none";
    32. return function (data, name) {
    33. var blob = new Blob([data], {type: "application/octet-stream"});
    34. var url = window.URL.createObjectURL(blob);
    35. a.href = url;
    36. a.download = name;
    37. a.click();
    38. window.URL.revokeObjectURL(url);
    39. };
    40. }());
    41. function init() {
    42. document.getElementById('savebut').onclick = function() {
    43. saveByteArray(petscii,document.getElementById('filename').value);
    44. };
    45. source = document.getElementById('source');
    46. canvas = document.getElementById('canvas');
    47. context = canvas.getContext("2d");
    48. context.drawImage(source,0,0,WIDTH,HEIGHT);
    49. srcdata = greyscale(context,WIDTH,HEIGHT);
    50. character = document.getElementById("character");
    51. characterContainer = document.getElementById("charsetContainer");
    52. for(var i=0;i<CHARACTERS;i++) {
    53. var charCanvas = document.createElement("canvas");
    54. charCanvas.setAttribute("width", CWIDTH);
    55. charCanvas.setAttribute("height",CHEIGHT);
    56. charCanvas.style.width = CWIDTH+ "px";
    57. charCanvas.style.height = CHEIGHT+"px";
    58. charCanvas.style.marginRight = "5px";
    59. characterContainer.appendChild(charCanvas);
    60. characterCanvas.push(charCanvas);
    61. if((i + 1) % 32 == 0)
    62. characterContainer.appendChild(document.createElement("br"));
    63. }
    64. var i = 0;
    65. character.onload = function() {
    66. var charCanvas = characterCanvas[i];
    67. var charContext = charCanvas.getContext("2d");
    68. charContext.drawImage(character,0,0);
    69. pxbuf = greyscale(charContext,CWIDTH,CHEIGHT,true); //Skip Dither
    70. for(var px=0;px<pxbuf.length;px++) {
    71. if(pxbuf[px] < 128)
    72. pxbuf[px] = 0;
    73. else
    74. pxbuf[px] = 255;
    75. }
    76. chardata[i] = pxbuf;
    77. i++;
    78. loadCharacter();
    79. };
    80. var loadCharacter = function() {
    81. if(i >= CHARACTERS) {
    82. render();
    83. return;
    84. }
    85. character.src = CHARSET+"/"+i+".gif";
    86. };
    87. loadCharacter();
    88. }
    89. var greyscale = function(context,w,h,skip) {
    90. var imgd = context.getImageData(0, 0, w,h);
    91. var pix = imgd.data;
    92. var x = 0;
    93. var y = 0;
    94. var id = context.createImageData(1,1);
    95. var d = id.data;
    96. var ebBuf = [];
    97. for(var i=0,il=pix.length;i<il;i+=4) {
    98. var grayscale = pix[i ] * .3 +
    99. pix[i+1] * .59 +
    100. pix[i+2] * .11;
    101. //Weight the alpha channel. --Thanks to Chris Roy!
    102. var aDiff = 256 - pix[i+3];
    103. var gDiff = 256 - grayscale;
    104. grayscale = (gDiff * aDiff / 256) + grayscale;
    105. ebBuf.push(grayscale);
    106. }
    107. if(!skip) {
    108. dither(ebBuf,w,h);
    109. for(var i=0;i<ebBuf.length;i++) {
    110. d[0] = ebBuf[i];
    111. d[1] = ebBuf[i];
    112. d[2] = ebBuf[i];
    113. d[3] = 255;
    114. context.putImageData(id,x,y);
    115. x++;
    116. if(x >= WIDTH) {
    117. x = 0
    118. y++;
    119. }
    120. }
    121. }
    122. return ebBuf;
    123. };
    124. var dither = function(sb, w, h) { // source buffer, width, height
    125. for(var i=0; i<h; i++) {
    126. for(var j=0; j<w; j++) {
    127. var ci = i*w+j; // current buffer index
    128. var cc = sb[ci]; // current color
    129. var rc = (cc<128?0:255); // real (rounded) color
    130. var err = cc-rc; // error amount
    131. sb[ci] = rc; // saving real color
    132. if(j+1 < w)
    133. sb[ci +1] += (err*7)>>4; // if right neighbour exists
    134. if(i+1 == h)
    135. continue; // if we are in the last line
    136. if(j > 0)
    137. sb[ci+w-1] += (err*3)>>4; // bottom left neighbour
    138. sb[ci+w] += (err*5)>>4; // bottom neighbour
    139. if(j+1<w)
    140. sb[ci+w+1] += (err*1)>>4; // bottom right neighbour
    141. }
    142. }
    143. };
    144. var render = function() {
    145. var charsWide = WIDTH / CWIDTH;
    146. var charsHigh = HEIGHT / CHEIGHT;
    147. var charCount = charsWide * charsHigh;
    148. var c = 0;
    149. for(var y=0;y<charsHigh;y++) {
    150. for(var x=0;x<charsWide;x++) {
    151. var charBuf = getSourceChar(c);
    152. var petValue = findMatch(charBuf);
    153. petscii[c] = petValue;
    154. context.drawImage(characterCanvas[petValue],x*CWIDTH,y*CHEIGHT);
    155. c++;
    156. }
    157. }
    158. };
    159. var getSourceChar = function(c) {
    160. var charsWide = (WIDTH / CWIDTH);
    161. var bytesPerRastRow = CWIDTH * charsWide
    162. var bytesPerCharRow = CHEIGHT * bytesPerRastRow;
    163. var startByte = 0;
    164. while(c > charsWide) {
    165. startByte += bytesPerCharRow;
    166. c -= charsWide;
    167. }
    168. while(c) {
    169. startByte += CWIDTH;
    170. c--;
    171. }
    172. var charBuf = [];
    173. for(var y=0;y<CHEIGHT;y++) {
    174. for(var x=0;x<CWIDTH;x++) {
    175. charBuf.push(srcdata[startByte+x]);
    176. }
    177. startByte += bytesPerRastRow;
    178. }
    179. return charBuf;
    180. };
    181. var findMatch = function(buf) {
    182. var smallestDiff = (CWIDTH * CHEIGHT) + 1; //Maximum Difference
    183. var bestMatch = undefined;
    184. for(var i=0;i<CHARACTERS;i++) {
    185. var aDiff = diff(buf,chardata[i]);
    186. if(aDiff == 0)
    187. return i; //Perfect Match.
    188. if(aDiff < smallestDiff) {
    189. smallestDiff = aDiff;
    190. bestMatch = i;
    191. }
    192. }
    193. return bestMatch;
    194. };
    195. var diff = function(bufa,bufb) {
    196. var difference = 0;
    197. //console.log(bufa,bufb);
    198. for(var i=0;i<bufa.length;i++) {
    199. if(bufa[i] != bufb[i])
    200. difference++;
    201. }
    202. return difference;
    203. };
    204. </script>
    205. <img src='Sample Images/s_2018-zeha.png' id='source' style='width:320px;height:200px;'>
    206. <img src='' id='character' style='display:none;'>
    207. <canvas width=320 height=200 style='width:320px;height:200px;' id='canvas'></canvas>
    208. <br>
    209. <div id='charsetContainer'></div>
    210. <input type='text' value='petsciiart.pet' id='filename'>
    211. <input type='button' value='save' id='savebut'>
    212. </body>
    213. </html>
    Display All
    Aber ich vermute das das nicht alles sein kann. :D

    Gruß Drachen
    :D :D Ich liebe den Sound vom C64ér :thumbsup: :thumbsup: :thumbsup: