Skip to content

Instantly share code, notes, and snippets.

@artlung
Last active April 28, 2023 02:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save artlung/f3b5ff27147f7ae0a3ef500749cacecd to your computer and use it in GitHub Desktop.
Save artlung/f3b5ff27147f7ae0a3ef500749cacecd to your computer and use it in GitHub Desktop.
A program to display ARTLUNG logo on a TI-99/4a
1 REM ARTLUNG START
2 REM TI-EXTENDED BASIC TI-99/4A
3 CALL CLEAR
9 REM
10 CALL CHAR(33, "0F1F7F7F7E7C7CFC")
11 CALL VCHAR(1, 1, 33)
12 CALL CHAR(34, "FCFFFFFFFFFFFFFF")
13 CALL VCHAR(2, 1, 34)
14 CALL CHAR(35, "7F7F7F7E7EFCFCFC")
15 CALL VCHAR(3, 1, 35)
17 CALL CHAR(36, "FCFCFCFCFCFCFCFC")
19 CALL VCHAR(4, 1, 36, 2)
27 CALL VCHAR(3, 4, 36, 2)
35 CALL VCHAR(4, 13, 36, 3)
47 CALL VCHAR(2, 23, 36, 4)
61 CALL CHAR(37, "FCFCFCFCFEFFFFFF")
63 CALL VCHAR(6, 1, 37)
65 CALL CHAR(38, "FF7F3F1F0F070301")
67 CALL VCHAR(7, 1, 38)
71 CALL VCHAR(7, 8, 38)
75 CALL VCHAR(7, 19, 38)
79 CALL VCHAR(7, 23, 38)
81 CALL CHAR(39, "FFFFFF0000000000")
83 CALL VCHAR(1, 2, 39)
87 CALL VCHAR(3, 2, 39)
91 CALL VCHAR(1, 3, 39)
95 CALL VCHAR(3, 3, 39)
99 CALL VCHAR(1, 8, 39)
103 CALL VCHAR(1, 11, 39)
107 CALL VCHAR(1, 12, 39)
111 CALL VCHAR(1, 13, 39)
115 CALL VCHAR(1, 24, 39)
119 CALL VCHAR(1, 30, 39)
123 CALL VCHAR(3, 30, 39)
125 CALL CHAR(40, "0000FFFFFFFFFFFF")
127 CALL VCHAR(2, 2, 40)
131 CALL VCHAR(2, 3, 40)
135 CALL VCHAR(4, 3, 40)
139 CALL VCHAR(2, 8, 40)
143 CALL VCHAR(2, 11, 40)
147 CALL VCHAR(2, 12, 40)
151 CALL VCHAR(2, 13, 40)
155 CALL VCHAR(2, 30, 40)
157 CALL CHAR(41, "00000F0F0F0F0F0F")
159 CALL VCHAR(4, 2, 41)
161 CALL CHAR(42, "0F0F0F0F0F0F0703")
163 CALL VCHAR(5, 2, 42)
165 CALL CHAR(43, "00000000000080FF")
167 CALL VCHAR(6, 2, 43)
169 CALL CHAR(44, "FFFFFFFFFFFFFFFF")
171 CALL VCHAR(7, 2, 44)
175 CALL VCHAR(5, 3, 44)
179 CALL VCHAR(7, 3, 44)
183 CALL VCHAR(7, 4, 44)
187 CALL VCHAR(5, 7, 44)
189 CALL VCHAR(6, 8, 44)
191 CALL VCHAR(6, 7, 44, 2)
199 CALL VCHAR(2, 16, 44, 3)
211 CALL VCHAR(7, 16, 44)
215 CALL VCHAR(5, 17, 44)
219 CALL VCHAR(7, 17, 44)
223 CALL VCHAR(5, 18, 44)
227 CALL VCHAR(5, 20, 44)
231 CALL VCHAR(7, 20, 44)
235 CALL VCHAR(5, 21, 44)
239 CALL VCHAR(7, 21, 44)
243 CALL VCHAR(7, 26, 44)
247 CALL VCHAR(7, 28, 44)
251 CALL VCHAR(7, 29, 44)
255 CALL VCHAR(5, 30, 44)
259 CALL VCHAR(7, 30, 44)
263 CALL VCHAR(7, 31, 44)
267 CALL VCHAR(3, 32, 44)
271 CALL VCHAR(4, 32, 44)
275 CALL VCHAR(5, 32, 44)
279 CALL VCHAR(6, 32, 44)
281 CALL CHAR(45, "00000000000000FF")
283 CALL HCHAR(6, 3, 45, 2)
289 CALL CHAR(46, "FFFFFF0F07030301")
291 CALL VCHAR(1, 4, 46)
293 CALL CHAR(47, "0000C0E0E0F0F8FC")
295 CALL VCHAR(2, 4, 47)
297 CALL CHAR(48, "FCFCFCFCFCFCF8F0")
299 CALL VCHAR(5, 4, 48)
301 CALL CHAR(49, "00C0E0F0F8FCFCFE")
303 CALL VCHAR(1, 5, 49)
305 CALL CHAR(50, "FF7F3F1F1F1F1F1F")
307 CALL VCHAR(2, 5, 50)
309 CALL CHAR(51, "1F1F1F1F1F1F1F1F")
311 CALL VCHAR(3, 5, 51, 3)
323 CALL VCHAR(2, 18, 51, 3)
335 CALL VCHAR(6, 18, 51)
339 CALL VCHAR(2, 21, 51, 3)
351 CALL VCHAR(3, 24, 51, 3)
361 CALL CHAR(52, "1F1F1F1F1F3F7FFF")
363 CALL VCHAR(6, 5, 52)
365 CALL CHAR(53, "FFFFFFFFF3E18080")
367 CALL VCHAR(7, 5, 53)
369 CALL CHAR(54, "01070F1F3F7F7FFF")
371 CALL VCHAR(1, 6, 54)
373 CALL CHAR(55, "FEFCF8F0F0E0E0E0")
375 CALL VCHAR(2, 6, 55)
379 CALL VCHAR(2, 28, 55)
381 CALL CHAR(56, "E0E0E0E0E0E0E0E0")
383 CALL VCHAR(3, 6, 56, 4)
399 CALL VCHAR(3, 28, 56, 3)
409 CALL CHAR(57, "FFFFFFFFFFFEFCFC")
411 CALL VCHAR(7, 6, 57)
413 CALL CHAR(58, "FFFFFFE0C0808000")
415 CALL VCHAR(1, 7, 58)
417 CALL CHAR(59, "00000F1F1F3F7FFF")
419 CALL VCHAR(2, 7, 59)
421 CALL CHAR(60, "FFFFFFFEFEFEFEFE")
423 CALL VCHAR(3, 7, 60)
425 CALL CHAR(61, "FEFEFEFEFEFEFFFF")
427 CALL VCHAR(4, 7, 61)
429 CALL CHAR(62, "E0E0C08000000000")
431 CALL VCHAR(7, 7, 62)
433 CALL CHAR(63, "FFFEFE0000000000")
435 CALL VCHAR(3, 8, 63)
437 CALL CHAR(64, "0003070F07030101")
439 CALL VCHAR(4, 8, 64)
441 CALL CHAR(65, "80C0E0F0F8F8FCFE")
443 CALL VCHAR(5, 8, 65)
445 CALL CHAR(66, "FFFFFF0701010100")
447 CALL VCHAR(1, 9, 66)
449 CALL CHAR(67, "0000008080C0C0C0")
451 CALL VCHAR(2, 9, 67)
453 CALL CHAR(68, "8000000000000000")
455 CALL VCHAR(3, 9, 68)
457 CALL CHAR(69, "03FFFFFFFFFFFFFF")
459 CALL VCHAR(4, 9, 69)
461 CALL CHAR(70, "FF7F3F1F0F0F0703")
463 CALL VCHAR(5, 9, 70)
465 CALL CHAR(71, "01008080C0E0E0F9")
467 CALL VCHAR(6, 9, 71)
469 CALL CHAR(72, "FFFFFFFFFFFFFEFC")
471 CALL VCHAR(7, 9, 72)
473 CALL CHAR(73, "FFFFFFFFFEF8F8F8")
475 CALL VCHAR(1, 10, 73)
477 CALL CHAR(74, "F8FEFFFFFFFFFFFF")
479 CALL VCHAR(2, 10, 74)
481 CALL CHAR(75, "FFFFFFFFFFFFFEF8")
483 CALL VCHAR(3, 10, 75)
485 CALL CHAR(76, "F8F8F8E0E0C0C080")
487 CALL VCHAR(4, 10, 76)
489 CALL CHAR(77, "C0E0F0F0F8F8F8FC")
491 CALL VCHAR(5, 10, 77)
493 CALL CHAR(78, "FCFCFCFCFCF8F8F8")
495 CALL VCHAR(6, 10, 78)
497 CALL CHAR(79, "F0F0E0C080000000")
499 CALL VCHAR(7, 10, 79)
501 CALL CHAR(80, "FFFFFFFFFFFF3F3F")
503 CALL VCHAR(3, 11, 80)
505 CALL CHAR(81, "3F3F3F3F3F3F3F3F")
507 CALL VCHAR(4, 11, 81, 3)
519 CALL VCHAR(2, 27, 81, 4)
533 CALL CHAR(82, "3F1F0F0703010000")
535 CALL VCHAR(7, 11, 82)
537 CALL CHAR(83, "FFFFFFE3C1C1C1C1")
539 CALL VCHAR(3, 12, 83)
541 CALL CHAR(84, "C1C1C1C1C1C1C1C1")
543 CALL VCHAR(4, 12, 84, 2)
551 CALL VCHAR(2, 22, 84, 3)
561 CALL CHAR(85, "C1C1C1C1C1E3FFFF")
563 CALL VCHAR(6, 12, 85)
565 CALL CHAR(86, "FFFFFFFFFFFFFF7F")
567 CALL VCHAR(7, 12, 86)
569 CALL CHAR(87, "FFFFFFFFFFFFFCFC")
571 CALL VCHAR(3, 13, 87)
573 CALL CHAR(88, "FCFCF8F0E0C08000")
575 CALL VCHAR(7, 13, 88)
577 CALL CHAR(89, "FFFFFF7F3F1F1F1F")
579 CALL VCHAR(1, 14, 89)
581 CALL CHAR(90, "1F3FFFFFFFFFFFFF")
583 CALL VCHAR(2, 14, 90)
585 CALL CHAR(91, "FFFFFFCF8F8F0F0F")
587 CALL VCHAR(3, 14, 91)
589 CALL CHAR(92, "0F0F0F0F0F0F0F0F")
591 CALL VCHAR(4, 14, 92, 2)
597 CALL CHAR(93, "0F0F0F0F07030100")
599 CALL VCHAR(6, 14, 93)
601 CALL CHAR(94, "FFFFFFF3E1C0C0C0")
603 CALL VCHAR(1, 15, 94)
605 CALL CHAR(95, "C0C0C0C0C0C0C0C0")
607 CALL VCHAR(2, 15, 95, 3)
617 CALL CHAR(96, "C0C0C0C0E0E0E0F0")
619 CALL VCHAR(5, 15, 96)
621 CALL CHAR(97, "F8FCFEFFFFFFFFFF")
623 CALL VCHAR(6, 15, 97)
625 CALL CHAR(98, "7F3F1F0F07030100")
627 CALL VCHAR(7, 15, 98)
629 CALL CHAR(99, "F0F8FCFEFEFEFEFE")
631 CALL VCHAR(1, 16, 99)
633 CALL CHAR(100, "FFFFFF7F3F3F1F0F")
635 CALL VCHAR(5, 16, 100)
637 CALL CHAR(101, "0000000080C0F0F0")
639 CALL VCHAR(6, 16, 101)
641 CALL CHAR(102, "00000103070F0F1F")
643 CALL VCHAR(1, 18, 102)
647 CALL VCHAR(1, 21, 102)
649 CALL CHAR(103, "FEFEFCF8F0E0C080")
651 CALL VCHAR(7, 18, 103)
653 CALL CHAR(104, "7FFFFFFFFFC7C783")
655 CALL VCHAR(1, 19, 104)
657 CALL CHAR(105, "8383838383838383")
659 CALL VCHAR(2, 19, 105, 4)
673 CALL CHAR(106, "C0E0F0F8FCFEFFFF")
675 CALL VCHAR(6, 19, 106)
677 CALL CHAR(107, "00C0E0F0F0F8F8F8")
679 CALL VCHAR(1, 20, 107)
681 CALL CHAR(108, "F8F8F8F8F8F8F8F8")
683 CALL VCHAR(2, 20, 108, 3)
695 CALL VCHAR(2, 26, 108, 4)
709 CALL CHAR(109, "7FFFFFFFFFE7E3C1")
711 CALL VCHAR(1, 22, 109)
713 CALL CHAR(110, "C1C1C1C1C1C1C1C3")
715 CALL VCHAR(5, 22, 110)
717 CALL CHAR(111, "070F1F3F7FFFFFFF")
719 CALL VCHAR(6, 22, 111)
721 CALL CHAR(112, "FCF8F0E0C0800000")
723 CALL VCHAR(7, 22, 112)
725 CALL CHAR(113, "FFFFFFFFFEFCFCFC")
727 CALL VCHAR(1, 23, 113)
729 CALL CHAR(114, "FCFCFCFCFCFEFFFF")
731 CALL VCHAR(6, 23, 114)
733 CALL CHAR(115, "0000070F0F1F1F1F")
735 CALL VCHAR(2, 24, 115)
737 CALL CHAR(116, "1F1F1F1F1F3FFFFF")
739 CALL VCHAR(6, 24, 116)
741 CALL CHAR(117, "FFFFFEFCF8F0E0C0")
743 CALL VCHAR(7, 24, 117)
747 CALL VCHAR(7, 27, 117)
749 CALL CHAR(118, "FFFFFF1F0F070703")
751 CALL VCHAR(1, 25, 118)
753 CALL CHAR(119, "0101018181818181")
755 CALL VCHAR(2, 25, 119)
757 CALL CHAR(120, "8181818181818181")
759 CALL VCHAR(3, 25, 120, 3)
769 CALL CHAR(121, "C0C0E0E0F0F8FCFF")
771 CALL VCHAR(6, 25, 121)
773 CALL CHAR(122, "FFFFFF7F3F1F0F07")
775 CALL VCHAR(7, 25, 122)
777 CALL CHAR(123, "87CFFFFFFCFCFCF8")
779 CALL VCHAR(1, 26, 123)
781 CALL CHAR(124, "FFFFFFFF3F3F3F3F")
783 CALL VCHAR(1, 27, 124)
785 CALL CHAR(125, "3F3F3F3FFFFFFFFF")
787 CALL VCHAR(6, 27, 125)
789 CALL CHAR(126, "0080C1E3E7FFFFFF")
791 CALL VCHAR(1, 28, 126)
793 CALL CHAR(127, "E0E0F0F0F8FCFEFF")
795 CALL VCHAR(6, 28, 127)
797 CALL CHAR(128, "7FFFFFE0C0808000")
799 CALL VCHAR(1, 29, 128)
801 CALL CHAR(129, "0000070F0F3F3F7F")
803 CALL VCHAR(2, 29, 129)
805 CALL CHAR(130, "7F7F7F7F7E7E7E7F")
807 CALL VCHAR(3, 29, 130)
809 CALL CHAR(131, "7F7F7F7F7F7F7F7F")
811 CALL VCHAR(4, 29, 131)
813 CALL CHAR(132, "7F7F7F7F7F7F3F1F")
815 CALL VCHAR(5, 29, 132)
817 CALL CHAR(133, "00FFFFFFFFFFFFFF")
819 CALL VCHAR(4, 30, 133)
821 CALL CHAR(134, "FFFFFF0301000000")
823 CALL VCHAR(1, 31, 134)
825 CALL CHAR(135, "0001FFFFFFFFFFFF")
827 CALL VCHAR(2, 31, 135)
829 CALL CHAR(136, "FFFFFF0100000000")
831 CALL VCHAR(3, 31, 136)
833 CALL CHAR(137, "0080C0E0E0E0E0E0")
835 CALL VCHAR(4, 31, 137)
837 CALL CHAR(138, "E0E0E0E0E0E0C080")
839 CALL VCHAR(5, 31, 138)
841 CALL CHAR(139, "FCFEFFFFFFFFFFFF")
843 CALL VCHAR(1, 32, 139)
845 CALL CHAR(140, "FFFFFFFCFCFCFCFC")
847 CALL VCHAR(2, 32, 140)
849 CALL CHAR(141, "FFFEFCF8F0E0C080")
851 CALL VCHAR(7, 32, 141)
853 FOR DELAY=1 TO 1000
855 NEXT DELAY
857 REM UNIQUE STRINGS 110
859 REM ARTLUNG END
<?php
/**
* Script to read a png file and generate a TI Extended Basic program to draw that program
* The file must be no more than 256 pixels wide (32 character columns * 8)
* The file must be no more than 192 pixels wide (24 character columns * 8)
* @author Joe Crawford <https://artlung.com/> joe@artlung.com
*/
class MyTiBasicUtils {
const MAX_PIXEL_WIDTH = 256;
const MAX_PIXEL_HEIGHT = 192;
/**
* turns int value from php imagecolorat() into whether it's black or not
* @param $rgb
* @return bool
*/
static function isBlack($rgb) {
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return $r === 0 && $g === 0 && $b === 0;
}
/**
* turns an array of 4 digits (0 or 1) into a hex number
* @param $quad
* @return string
*/
static function quadToHex($quad) {
return strtoupper(dechex(($quad[0] * 8) + ($quad[1] * 4) + ($quad[2] * 2) + ($quad[3] * 1)));
}
}
$filename = "ti-99-reference-SIMPLIFIED.png";
$im = imagecreatefrompng($filename);
[$width, $height, $a, $b] = getimagesize($filename);
$y = 0;
$quad = [];
$ti_99_rows = [];
$number_of_chars_wide = $width / 8;
$number_of_chars_high = $height / 8;
if ($width > MyTiBasicUtils::MAX_PIXEL_WIDTH) {
printf("Height can be no wider than %s", MyTiBasicUtils::MAX_PIXEL_WIDTH);
exit;
}
if ($height > MyTiBasicUtils::MAX_PIXEL_HEIGHT) {
printf("Height can be no wider than %s", MyTiBasicUtils::MAX_PIXEL_HEIGHT);
exit;
}
$callCharString = "";
$uniqueStrings = [];
$allHexCharacters = [];
$uniqueCoordinates = [];
for($characterX = 0; $characterX < $number_of_chars_wide; $characterX++) {
for ($characterY = 0; $characterY < $number_of_chars_high; $characterY++) {
for ($y = 0; $y < 8; $y++) {
for ($x = 0; $x < 8; $x++) {
$imageX = $x + ($characterX * 8);
$imageY = $y + ($characterY * 8);
$ti99CharacterX = $characterX + 1;
$ti99CharacterY = $characterY + 1;
$rgb = imagecolorat($im, $imageX, $imageY);
$quad[] = MyTiBasicUtils::isBlack($rgb) ? 1 : 0;
if (count($quad) === 4) {
if (array_key_exists(MyTiBasicUtils::quadToHex($quad), $allHexCharacters)) {
$allHexCharacters[MyTiBasicUtils::quadToHex($quad)] += 1;
} else {
$allHexCharacters[MyTiBasicUtils::quadToHex($quad)] = 1;
}
$callCharString .= MyTiBasicUtils::quadToHex($quad);
if (strlen($callCharString) === 16) {
if (array_key_exists($callCharString, $uniqueStrings)) {
$uniqueStrings[$callCharString] += 1;
$uniqueCoordinates[$callCharString][$ti99CharacterX][] = [$ti99CharacterX, $ti99CharacterY];
} else {
$uniqueStrings[$callCharString] = 1;
$uniqueCoordinates[$callCharString][$ti99CharacterX][] = [$ti99CharacterX, $ti99CharacterY];
}
$callCharString = "";
}
$quad = [];
}
}
}
}
}
print "\n\n";
$pre_lines = [
'REM ARTLUNG START',
'CALL CLEAR',
];
$post_lines = [
'FOR DELAY=1 TO 500',
'NEXT DELAY',
'REM UNIQUE STRINGS ' . count($uniqueStrings),
'REM ARTLUNG END',
];
$line_number = 1;
$line_number_increment = 2;
foreach ($pre_lines as $line) {
printf("%-5s%s\n", $line_number, $line);
$line_number += $line_number_increment;
}
$slotMapping =
$ascii_slot = 33;
$strings_to_slots = [];
foreach ($uniqueCoordinates as $string => $col) {
foreach ($col as $xYSets) {
if ($string !== str_repeat('0', 16)) {
$rem = $ascii_slot > 143 ? 'REM ' : '';
if (!array_key_exists($string, $strings_to_slots)) {
printf("%-5s%sCALL CHAR(%s, \"%s\")\n", $line_number, $rem, $ascii_slot, $string);
$strings_to_slots[$string] = $ascii_slot;
$ascii_slot++;
}
// usort($xYSets, 'cmp');
// usort($xYSets, 'cmp2');
for ($i = 0; $i < count($xYSets); $i++) {
$xYSet = $xYSets[$i];
[$x, $y] = $xYSet;
$line_number += $line_number_increment;
$mapped_ascii_slot = $strings_to_slots[$string];
printf("%-5s%sCALL VCHAR(%s, %s, %s)\n", $line_number, $rem, $y, $x, $mapped_ascii_slot);
$line_number += $line_number_increment;
}
}
}
}
foreach ($post_lines as $line) {
printf("%-5s %s\n", $line_number, $line);
$line_number += $line_number_increment;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment