1 /GAME OF LIFE 2 /KYLE OWEN - 24 MARCH 2019 3 /UPDATED - 14 APRIL 2019 4 5 /14 APRIL 2019 - ADDED OS/8 SUPPORT 6 /9 APRIL 2019 - ADDED BUGGY FAST RASTER SCAN, STATISTICS, AND NEW RLE PARSER 7 /8 APRIL 2019 - ADDED VC8E SUPPORT FOR BOTH STORAGE AND NON-STORAGE 'SCOPES 8 9 /FOCAL: 11 BY 11 10 /BASIC: 32 BY 32 11 /ASSEMBLY: 192 BY 256 (OR BEYOND?) 12 /THAT WAS THE MAIN REASON FOR WRITING THIS... 13 /PROBABLY WOULD'VE BEEN EASIER TO WRITE IN FORTRAN, THOUGH. 14 /I THINK THERE WAS A DECUS VERSION, BUT I CAN'T FIND IT. 15 16 /DFIELD SELECTS THE FIELD FOR STORING THE BITMAP 17 /BITMAP IS ORGANIZED AS 192 WIDE BY 256 TALL 18 /WORD 0 BIT 0 IS TOP LEFT, WORD 7777 BIT 11 IS BOTTOM RIGHT 19 /INTERNALLY, BIT NUMBER IS STORED AS A NEGATIVE NUMBER, -14 TO -1 (OCTAL!) 20 /HENCE, BIT IN WORD: 21 /... -3 -2 -1 | -14 -13 -12 -11 ... -3 -2 -1 | -14 -13 -12 ... 22 / WORD - 1 | CURRENT WORD | WORD + 1 23 24 /AND, LOOKING JUST AT THE WORDS IN THE BITMAP: 25 /... WORD - WRDCOL - 1 | WORD - WRDCOL | WORD - WRDCOL + 1 ... 26 /... WORD - 1 | CURRENT WORD | WORD + 1 ... 27 /... WORD + WRDCOL - 1 | WORD + WRDCOL | WORD + WRDCOL + 1 ... 28 29 /IN THIS WORLD, THE SCREEN WRAPS FROM LEFT TO RIGHT, TOP TO BOTTOM 30 /IT WOULDN'T BE HARD TO TERMINATE LIFE AT SCREEN BOUNDARIES, THOUGH 31 32 /A LITTLE SUMMARY OF OPERATION: 33 /FIRST, BITMAP IS CLEARED, THEN INITIAL CONDITIONS ARE LOADED. 34 /THEN, THREE ROWS ARE COPIED INTO THREE CACHE ROWS. 35 /FOR EACH ROW COPIED, A BIT IN LIFDET IS SET OR CLEARED TO INDICATE WHETHER 36 /OR NOT THE CACHE ACTUALLY HAS ANY LIFE. IF THERE'S NO LIFE, WE CAN TAKE A 37 /SHORTCUT. 38 39 /SINCE WE START WITH PIXEL (0,0), AKA THE LEFT PIXEL OF THE FIRST ROW, 40 /THE THREE ROWS TO CACHE ARE THE ROW ABOVE US, OUR CURRENT ROW, AND THE 41 /ROW BELOW US. THE ROW ABOVE US IS ACTUALLY THE LAST ROW IN THE BITMAP 42 /BECAUSE OF WRAPPING. 43 44 /NOW, ASSUMING WE HAVE LIFE IN THE CACHE... 45 46 /IF YOU ARE INSIDE A WORD SUCH THAT YOU WON'T WRAP TO SURROUNDING WORDS AND THE 47 /WORD IS ZERO, YOU CAN SKIP RIGHT ON TO THE END OF THAT WORD...JUST ANOTHER 48 /OPTIMIZATION FOR SPEED. 49 50 /OTHERWISE, WE ITERATE THROUGH THE CACHE ROWS, COUNTING EVERY NEIGHBORHOOD OF 51 /9 PIXELS. WHEN WE ARE AT THE EDGE OF A WORD, EITHER BIT 0 (-14) OR 52 /BIT 11 (-1), WE NEED TO COUNT PIXELS IN THE ADJACENT WORDS. OTHERWISE, WE 53 /ONLY CONSIDER OUR CURRENT WORD, PLUS THE WORD ABOVE US AND THE WORD BELOW US, 54 /OF COURSE. 55 56 /ONCE WE HAVE COUNTED THE NEIGHBORHOOD, WE COMPARE THE TOTAL LIVE CELLS TO 3 57 /AND 4. IF THE NUMBER OF LIVE CELLS IS 3, THE MIDDLE CELL WILL BE ALIVE. IF 58 /THE NUMBER IS 4, THE MIDDLE CELL WILL REMAIN UNCHANGED. EVERY OTHER SUM 59 /RESULTS IN...DEATH! 60 61 /ONCE WE ARE TO THE END OF THE CURRENT ROW, THE CACHE MUST BE UPDATED. 62 /FORTUNATELY, THIS IS PRETTY EASY. THE CURRENT (MIDDLE) CACHE ROW BECOMES 63 /THE TOP ROW, THE BOTTOM ROW BECOMES THE CURRENT ROW, AND THE TOP ROW BECOMES 64 /THE BOTTOM ROW. THE BOTTOM ROW OF THE CACHE (FORMERLY THE TOP ROW OF THE 65 /CACHE) IS COPIED OVER WITH THE ROW BELOW THE CURRENT ROW OF THE BITMAP. 66 /INSTEAD OF DOING A BUNCH OF COPYING, WE JUST CHANGE THE POINTERS TO THE CACHE 67 /ROWS, AND ONLY COPY THE ONE NEW ROW. NOT TOO BAD, RIGHT? OH, BE SURE TO UPDATE 68 /LIFDET TO GIVE US A POSSIBLE SHORTCUT IF THERE'S NO MORE LIFE IN THE CACHE FOR 69 /NEXT TIME. 70 71 /IF THERE'S NO LIFE IN THE CACHE, UPDATE THE CACHE AND TRY AGAIN. 72 73 /THE PROGRAM USES WORDS 0 TO 7 AS A BIT COUNT LOOKUP TABLE FOR EXTRA SPEED. 74 /MAYBE THERE'S A FASTER WAY TO COUNT BITS? IF SO, PLEASE FORWARD THIS ON TO ME! 75 76 /THE PROGRAM ALSO USES WORDS 7764 TO 7777 (-14 TO -1, RIGHT?) FOR THE BITMASK. 77 78 /THERE'S ALSO A ROTATE SUBROUTINE WHICH TRIES TO GO FOR SPEED. MAYBE IT CAN BE 79 /OPTIMIZED AS WELL? 80 81 /PARTING THOUGHTS: YOU COULD CRAM THIS INTO ONE FIELD IF YOU WANTED TO REDUCE 82 /THE BITMAP SIZE BY A BIT (HEH); WRAPPING VERTICALLY IS NO LONGER QUITE AS 83 /TRIVIAL, THOUGH...FOR AN 8K MACHINE WITH AN OS, I BELIEVE REDUCING THE BITMAP 84 /SIZE WILL BE REQUIRED. 85 86 /IT TURNS OUT THAT PRINTING TO THE TERMINAL TAKES A...SURPRISINGLY LARGE AMOUNT 87 /OF TIME. 88 89 /WRDCOL, AKA THE NUMBER OF WORD COLUMNS (AKA THE NUMBER OF WORDS IN A ROW) 90 /SHOULD DEFINITELY BE A POWER OF TWO, AS THE PROGRAM ASSUMES IT WILL BE. 91 /SMALLER WOULD PROBABLY BE FINE, BUT WILL INCREASE THE NUMBER OF ROWS. 92 /BIGGER WOULD BE FINE TOO, GIVEN PAGE ZERO IS DECLUTTERED. 93 94 /ANOTHER BIG IMPROVEMENT WOULD BE THE ABILITY TO STORE INITIAL CONDITIONS IN 95 /AN EASY TO USE FILE FORMAT, PERHAPS LOADING FROM OS/8 (OR P?S/8). 96 97 /ADDING THE ABILITY TO NOT PRINT (OR DRAW) TO INCREASE SPEED MAY BE A GOOD 98 /ADDITION. 99 100 /THE CURLY BRACES IN THE SOURCE COMMENTS ARE SOLELY FOR BRACKET MATCHING, SINCE 101 /GT AND LT SIGNS ARE NOT USED AS MODERN BRACKETS. HELPFUL IF YOU'RE USING VIM 102 /OR EMACS. NOT HELPFUL IF YOU'RE USING EDIT, EDLIN, ETC. 103 104 /THE FAST RASTER ROUTINE USES MEMORY FROM 8K UP, AND HAS THE POTENTIAL TO WRAP 105 /BACK TO THE ZERO FIELD. NO CHECK IS MADE THAT YOU ARE ABOUT TO OVERFLOW THE 106 /POINT BUFFER; THIS WAS DONE FOR SPEED, RIGHT? THAT SAID, THE MAXIMUM NUMBER 107 /OF POINTS FOR A FINITE ARRAY IS ABOUT 50 PERCENT, SO... 108 / 256*192/2 = 24,576 = 24K. 109 /WORST CASE, I THINK YOU'D NEED JUST A HAIR OVER 24K TO STORE 24K POINTS, 110 /SOMETHING LIKE 256*97+1, I BELIEVE, ASSUMING EVERY ROW HAS 96 POINTS, WHICH 111 /MEANS WE'D BE REALLY CLOSE. FORTUNATELY, THE WORLD WRAPS, SO THE MAX FILLER 112 /AND SUCH DIE BEFORE YOU GET ANYWHERE CLOSE TO 50 PERCENT. THIS STILL HAS SOME 113 /BUGS TO BE WORKED OUT; IT SEEMS LIKE THE ROUTINE IS SKIPPING TOO MANY LINES 114 /SOMETIMES. IT DOES SEEM TO BE MUCH FASTER, THOUGH! 115 116 /STATISTICS INCLUDE THE GENERATION NUMBER AND THE NUMBER OF LIVE CELLS. BOTH 117 /ARE STORED AS DOUBLE WORDS. IF YOU OVERFLOW EITHER, ALL BETS ARE OFF. I'M NOT 118 /REALLY SURE HOW YOU WOULD GET UP THAT HIGH FOR EITHER, THOUGH. 119 120 /PRINTING THE NUMBERS WAS FUN. THIS USES A 24-BIT IMPLEMENTATION OF THE 121 /DOUBLE-DABBLE ALGORITHM, ALONG WITH A SIMPLE MEANS OF LEADING ZERO 122 /SUPPRESSION. THIS CODE COULD BE USEFUL ALL BY ITSELF FOR OTHER APPLICATIONS. 123 124 /THE NEW RLE PARSER USES INPUT FROM THE TTY AT THE MOMENT. IT DOES VERY LITTLE 125 /ERROR CHECKING, EXCEPT TO CHECK TO SEE IF A NUMBER IS LARGER THAN 255 DECIMAL. 126 /THIS IS A RECOVERABLE ERROR; EITHER GIVE A NEW NUMBER, OR TYPE CTRL-U TO START 127 /THE WHOLE RLE SEQUENCE OVER. MIND YOU, IF YOU TRY TO USE A NUMBER LARGER THAN 128 /192 FOR SOMETHING OTHER THAN THE END OF LINE MARKER ($), RESULTS MAY NOT BE 129 /WHAT YOU EXPECT. 130 131 /A TYPICAL RLE STRING FOR THE NEW TTY PARSER WOULD LOOK SOMETHING LIKE THIS: 132 /70X192Y2BO4BO2B$2B6O2B$2BO4BO2B4$2B6O2B$BO6BOB$O8BO$BO6BOB$2B6O! 133 /(KAREL'S P15, FOR THE CURIOUS.) 134 /WHERE ALL NUMBERS ARE IN DECIMAL. B IS DEATH, O IS LIFE. 135 /END OF LINE IS $, END OF RLE SEQUENCE IS ! 136 /CARRIAGE RETURNS ARE ECHOED AS CRLF; LINEFEEDS ARE IGNORED. 137 /CTRL-U TO START THE SEQUENCE OVER, CTRL-D TO IMMEDIATELY EXIT (USEFUL FOR 138 /REPLAYING THE LAST SEQUENCE) 139 /ALL OTHER CHARACTERS ARE IGNORED AND NOT ECHOED. 140 141 /OS/8 SUPPORT WORKS SOMETHING LIKE THIS...WHEN THE PROGRAM IS FIRST CALLED, THE 142 /LAST PAGES OF THE FIRST TWO FIELDS (FIRST THREE FIELDS IF FAST RASTER MODE IS 143 /ENABLED) ARE COPIED INTO SAFE SPOTS IN THE FIRST FIELD STARTING AT 7000. 144 /HENCE, 7000-7577 WILL CONTAIN THE OS INFORMATION. THE BIT MASK TABLE THAT 145 /NEEDS TO RESIDE AT 7764 IS POPULATED AFTER THE COPIES ARE COMPLETE. WHEN A 146 /CTRL-C IS DETECTED AT THE END OF A GENERATION, THE PAGES ARE RESTORED AND 147 /CONTROL IS RETURNED TO OS/8 AT 7600. YOU COULD MODIFY THE PROGRAM TO RETURN 148 /SOONER IF DESIRED, BUT THIS WILL ADD A FEW CYCLES MULTIPLIED BY THOUSANDS OF 149 /CALCULATIONS, POTENTIALLY, AND WILL SLOW THINGS DOWN. 150 151 /THE PROGRAM ALSO CHECKS FOR A CTRL-U AT THE END OF A GENERATION. IF IT FINDS 152 /ONE, THE PROGRAM WILL RESTART FROM THE TOP. 153 154 /BASIC CONFIGURATION 155 OS8=1 /IF 0, ASSUMES NO OPERATING SYSTEM; IF 1, SHOULD RUN UNDER OS/8 156 MEMORY=7 /TOTAL MEMORY FIELDS MINUS 1; WILL NOT ASSEMBLE IF TOO LITTLE MEMORY 157 PARSER=0 /IF 0, RUNS THE NORMAL INIT ROUTINE; IF 1, TAKES RLE VIA TTY 158 VC8E=1 /IF 0, ASSUMES A (VERY LARGE!) TERMINAL; IF 1, USE A VC8E 159 STORE=0 /IF 0, ASSUMES A NON-STORAGE OSCILLOSCOPE; IF 1, A STORAGE 'SCOPE 160 FASTR=0 /IF 0, SLOW RASTER; IF 1, FAST RASTER (NEEDS 32K); ONLY FOR STORE=0 161 VT100=0 /IF 0, ASSUMES A DUMB TERMINAL; IF 1, A VT100-LIKE TERMINAL 162 STATS=1 /IF 0, NO STATISTICS; IF 1, PRINTS GENERATION AND TOTAL LIFE 163 PRTDOT=0 /IF 0, PRINTS SPACES FOR DEATH; IF 1, DOTS 164 SIMHVC=0 /IF 0, ASSUMES A REAL VC8E; IF 1, ASSUMES VC8 DEVICE IN SIMH 165 166 /FUN INITIAL CONDITIONS; USE COMBINATIONS AS YOU LIKE 167 /DEFINITIONS ARE AT THE END OF THE FILE 168 GLDERS=0 169 GOSPER=0 170 RPENTO=1 171 MWSS=0 172 HWSS=0 173 DIEHARD=0 174 ACORN=0 175 BREED=0 176 FILLER=0 177 MAXFIL=0 178 BAKRAK=0 179 SPCRAK=0 180 KAREL=0 181 182 IFNZRO RLYNPR < /{ 183 TSF=SKP 184 TLS=NOP 185 STATS=0 186 > /} 187 188 /STUFF THAT PROBABLY SHOULDN'T BE MESSED WITH 189 WRDCOL=20 /16 WORDS TIMES 12 BITS IS 192 ACROSS 190 DFIELD=10 /BITMAP FIELD 191 NOPRT=0 /NO PRINT FOR DEBUGGING (EXCEPT STATS, IF NEEDED) 192 RLYNPR=0 /REALLY DON'T PRINT ANYTHING FOR DEBUGGING 193 RSTRSC=0 /RASTER SHORTCUT FOR DEBUGGING 194 195 /DEFINING CONSTANTS FOR CONDITIONAL ASSEMBLY 196 NOSTOR=1-STORE 197 SLOWR=1-FASTR 198 USETTY=1-VC8E 199 200 /FOR DUMB TERMINALS, OR IF WE PRINT DOTS, DEATH IS SLOW 201 SLODTH=0 202 IFZERO VC8E < /{ 203 IFZERO VT100 < /{ 204 SLODTH=1 205 > /} 206 IFNZRO PRTDOT < /{ 207 SLODTH=1 208 > /} 209 > /} 210 211 /4K WON'T WORK (YET) 212 IFZERO MEMORY < /{ 213 ERROR: TOO LITTLE MEMORY; UPGRADE TO 8K AND TRY AGAIN 214 > /} 215 216 /FAST RASTER ONLY WORKS WITH 32K 217 IFNZRO MEMORY-7 < /{ 218 IFNZRO VC8E&NOSTOR&FASTR < /{ 219 ERROR: TOO LITTLE MEMORY; TRY FASTR=0 220 > /} 221 > /} 222 223 /VC8E DEFINITIONS 224 IFNZRO VC8E< /{ 225 IFZERO SIMHVC < /{ 226 DISD= 6052 227 > /} 228 IFNZRO SIMHVC < /{ 229 DISD= SKP 230 > /} 231 DILX= 6053 232 DILY= 6054 233 DIXY= 6055 234 DILE= 6056 235 DIRE= 6057 236 > /} 237 238 /BIT COUNT TABLE 239 *0 240 000000 0000 0 241 000001 0001 1 242 000002 0001 1 243 000003 0002 2 244 000004 0001 1 245 000005 0002 2 246 000006 0002 2 247 000007 0003 3 248 249 *10 250 000010 0000 PRIDX, 0 251 000011 0000 CPTR1, 0 252 000012 0000 CPTR2, 0 253 000013 0000 RLEPTR, 0 254 IFNZRO VC8E&NOSTOR&FASTR < /{ 255 FSTPTR, 0 256 > /} 257 258 *20 259 /CURRENT WORD IN BITMAP 260 000020 0000 ADDR, 0 261 262 /CURRENT BIT IN WORD 263 000021 0000 CURBIT, 0 264 265 /NEIGHBORHOOD TOTAL 266 000022 0000 TOTAL, 0 267 268 /LIFE DETECTED IN CACHE 269 000023 0000 LIFDET, 0 270 271 /CACHE POINTERS 272 000024 0000 TOPPTR, 0 273 000025 0000 MIDPTR, 0 274 000026 0000 BOTPTR, 0 275 276 /STATISTICS 277 IFNZRO STATS < /{ 278 000027 0000 LIFCNT, 0 279 000030 0000 0 280 > /} 281 282 /MISC STUFF 283 CNT, 0 redefined ^ 000031 0000 284 TEMP, 0 redefined ^ 000032 0000 285 TMPPTR, 0 redefined ^ 000033 0000 286 287 /STUFF FOR VC8E 288 IFNZRO VC8E < /{ 289 STARTX, -600 redefined ^ 000034 7200 290 STARTY, 1000 redefined ^ 000035 1000 291 X, 0 redefined ^ 000036 0000 292 Y, 0 redefined ^ 000037 0000 293 > /} 294 295 /CACHE 296 *40 297 000040 0000 CACHE1, ZBLOCK WRDCOL 000041 0000 000042 0000 000043 0000 000044 0000 000045 0000 000046 0000 000047 0000 000050 0000 000051 0000 000052 0000 000053 0000 000054 0000 000055 0000 000056 0000 000057 0000 298 000060 0000 CACHE2, ZBLOCK WRDCOL 000061 0000 000062 0000 000063 0000 000064 0000 000065 0000 000066 0000 000067 0000 000070 0000 000071 0000 000072 0000 000073 0000 000074 0000 000075 0000 000076 0000 000077 0000 299 000100 0000 CACHE3, ZBLOCK WRDCOL 000101 0000 000102 0000 000103 0000 000104 0000 000105 0000 000106 0000 000107 0000 000110 0000 000111 0000 000112 0000 000113 0000 000114 0000 000115 0000 000116 0000 000117 0000 300 301 /ROTATE AC RIGHT BY (2 - BIT) TIMES, WHERE BIT IS -2 TO -11 DECIMAL 302 /THE SUBROUTINE DOES NOT LIKE WHEN YOU CALL IT WITH -1 OR -12, THOUGH... 303 /THEN, AND RESULT WITH 7 AND RETURN 304 000120 0000 DOROT, 0 305 000121 3171 DCA ROT 306 TAD (ROTTBL+1 page zero ^ page zero ^ 000122 1177 307 000123 1021 TAD CURBIT 308 000124 3172 DCA JMPLOC 309 000125 1171 TAD ROT 310 000126 5572 JMP I JMPLOC 311 /ROTATE TABLE 312 000127 5143 JMP ERR 313 000130 5146 JMP FOURL 314 000131 5152 JMP FIVEL 315 000132 5145 JMP SIXL 316 000133 5157 JMP SIXR 317 000134 5164 JMP FIVER 318 000135 5160 JMP FOURR 319 000136 5165 JMP THREER 320 000137 5161 JMP TWOR 321 000140 5166 JMP ONER 322 000141 5167 JMP DOAND 323 000142 5143 ROTTBL, JMP ERR 324 325 000143 7402 ERR, HLT 326 000144 5520 JMP I DOROT 327 328 000145 7006 SIXL, RTL 329 000146 7006 FOURL, RTL 330 000147 7006 TWOL, RTL 331 AND (7 page zero ^ page zero ^ 000150 0176 332 000151 5520 JMP I DOROT 333 334 000152 7006 FIVEL, RTL 335 000153 7006 THREEL, RTL 336 000154 7004 ONEL, RAL 337 AND (7 page zero ^ page zero ^ 000155 0176 338 000156 5520 JMP I DOROT 339 340 000157 7012 SIXR, RTR 341 000160 7012 FOURR, RTR 342 000161 7012 TWOR, RTR 343 AND (7 page zero ^ page zero ^ 000162 0176 344 000163 5520 JMP I DOROT 345 346 000164 7012 FIVER, RTR 347 000165 7012 THREER, RTR 348 000166 7010 ONER, RAR 349 DOAND, AND (7 page zero ^ page zero ^ 000167 0176 350 000170 5520 JMP I DOROT 351 352 000171 0000 ROT, 0 353 000172 0000 JMPLOC, 0 354 355 /GENERATION COUNTER 356 IFNZRO STATS < /{ 357 000173 0000 GENCNT, 0 358 000174 0000 0 359 > /} 360 361 /BIT MASK TABLE 362 /IF RUNNING UNDER OS/8, WE'LL HAVE TO COPY THIS HERE 363 IFZERO OS8 < /{ 364 *7764 365 4000 366 2000 367 1000 368 400 369 200 370 100 371 40 372 20 373 10 374 4 375 2 376 1 377 > /} 378 379 /PROGRAM STARTS HERE 380 *200 381 IFNZRO OS8 < /{ 382 000200 4777 JMS SAVOS8 /SAVE OS/8 383 > /} 384 000201 6040 6040 /CLEAR TTY FLAG 385 START, 386 IFNZRO STATS < /{ 387 JMS RSTLIF /RESET LIFE COUNTER undefined ^ 000202 7777 388 JMS RSTGEN /RESET CYCLE COUNTER undefined ^ 000203 7777 389 > /} 390 000204 4776 JMS INIT /INITIALIZE THE BITMAP 391 IFNZRO STATS < /{ 392 JMS PRNTST /PRINT INITIAL STATISTICS undefined ^ 000205 7777 393 JMS RSTLIF /RESET LIFE COUNTER undefined ^ 000206 7777 394 > /} 395 IFNZRO VC8E&STORE < /{ 396 CLA /SET VC8E FOR STORAGE MODE 397 TAD (20 398 DILE 399 > /} 400 IFNZRO VC8E&NOSTOR&FASTR < /{ 401 CLA CMA /INITIALIZE PREVIOUS Y VALUE FOR FAST RASTER 402 DCA PREVY 403 CLA CMA 404 DCA FSTPTR 405 JMS RSTDF /RESET CDF FOR FAST RASTER 406 > /} 407 408 000207 7200 CLA /INITIALIZE CURRENT BIT AND ADDRESS 409 000210 1375 TAD (-14 410 000211 3021 DCA CURBIT /CURBIT = -14 (AKA BIT 0) 411 000212 3020 DCA ADDR /ADDR = 0 412 000213 3023 DCA LIFDET 413 000214 3032 DCA TEMP 414 000215 1374 TAD (CACHE1 /SET UP THE CACHE 415 000216 3024 DCA TOPPTR 416 000217 1373 TAD (CACHE2 417 000220 3025 DCA MIDPTR 418 000221 1372 TAD (CACHE3 419 000222 3026 DCA BOTPTR 420 421 000223 1371 TAD (-WRDCOL-1 /COPY INITIAL CACHE 422 000224 3011 DCA CPTR1 423 000225 1370 TAD (CACHE1-1 424 000226 3012 DCA CPTR2 425 000227 1367 TAD (-WRDCOL /COPYING ONE ROW 426 000230 3031 DCA CNT 427 000231 6211 CDF DFIELD 428 000232 1411 TAD I CPTR1 429 000233 6201 CDF 0 430 000234 7440 SZA 431 000235 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 432 000236 3412 DCA I CPTR2 433 000237 2031 ISZ CNT 434 000240 5231 JMP .-7 435 436 000241 1032 TAD TEMP /ANY LIFE? 437 000242 7640 SZA CLA 438 000243 7001 IAC /YES 439 000244 1023 TAD LIFDET 440 000245 7104 CLL RAL 441 000246 3023 DCA LIFDET 442 000247 3032 DCA TEMP 443 444 000250 1367 TAD (-WRDCOL /COPYING ONE ROW TO WHERE WE LEFT OFF 445 000251 3031 DCA CNT 446 000252 6211 CDF DFIELD 447 000253 1411 TAD I CPTR1 448 000254 6201 CDF 0 449 000255 7440 SZA 450 000256 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 451 000257 3412 DCA I CPTR2 452 000260 2031 ISZ CNT 453 000261 5252 JMP .-7 454 455 000262 1032 TAD TEMP /ANY LIFE? 456 000263 7640 SZA CLA 457 000264 7001 IAC /YES 458 000265 1023 TAD LIFDET 459 000266 7104 CLL RAL 460 000267 3023 DCA LIFDET 461 000270 3032 DCA TEMP 462 463 000271 1367 TAD (-WRDCOL /COPYING ONE ROW TO WHERE WE LEFT OFF 464 000272 3031 DCA CNT 465 000273 6211 CDF DFIELD 466 000274 1411 TAD I CPTR1 467 000275 6201 CDF 0 468 000276 7440 SZA 469 000277 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 470 000300 3412 DCA I CPTR2 471 000301 2031 ISZ CNT 472 000302 5273 JMP .-7 473 474 000303 1032 TAD TEMP /ANY LIFE? 475 000304 7640 SZA CLA 476 000305 2023 ISZ LIFDET /YES 477 000306 5766 JMP CHKLIF /JUMP TO THE MAIN LOOP 478 479 IFNZRO STATS < /{ 480 /INCREMENT LIFE COUNTER FOR STATISTICS 481 000307 0000 INCLIF, 0 482 000310 2027 ISZ LIFCNT /INCREMENT BOTTOM 12 483 000311 5707 JMP I INCLIF /NO OVERFLOW 484 000312 2030 ISZ LIFCNT+1 /OVERFLOW 485 000313 5707 JMP I INCLIF /OVERFLOW ON TOP 12 WOULD BE A SERIOUS PROBLEM! 486 487 /RESET LIFE COUNTER FOR STATISTICS 488 000314 0000 RSTLIF, 0 489 000315 7200 CLA 490 000316 3027 DCA LIFCNT 491 000317 3030 DCA LIFCNT+1 492 000320 5714 JMP I RSTLIF 493 494 /INCREMENT CYCLE COUNTER FOR STATISTICS 495 000321 0000 INCGEN, 0 496 000322 2173 ISZ GENCNT /INCREMENT BOTTOM 12 497 000323 5721 JMP I INCGEN /NO OVERFLOW 498 000324 2174 ISZ GENCNT+1 /OVERFLOW 499 000325 5721 JMP I INCGEN /OVERFLOW ON TOP 12 WOULD BE A SERIOUS PROBLEM! 500 501 /RESET CYCLE COUNTER FOR STATISTICS 502 000326 0000 RSTGEN, 0 503 000327 7200 CLA 504 000330 3173 DCA GENCNT 505 000331 3174 DCA GENCNT+1 506 000332 5726 JMP I RSTGEN 507 > /} 508 509 000366 0400 PAGE 000367 7760 000370 0037 000371 7757 000372 0100 000373 0060 000374 0040 000375 7764 000376 1600 000377 6616 510 511 000400 1023 CHKLIF, TAD LIFDET /ANY LIFE IN THE CACHE? 512 000401 7650 SNA CLA 513 000402 5777 JMP NOLIFE /NOPE, SHORTCUT! 514 000403 1021 DOLIFE, TAD CURBIT /ARE WE AT A WORD EDGE? 515 000404 1376 TAD (14 /CHECK LEFT WORD EDGE 516 000405 7440 SZA 517 000406 5274 JMP NLBIT /NO, NOT THE LEFT WORD EDGE 518 000407 1424 TAD I TOPPTR /YES, GET TOP WORD 519 000410 7450 SNA 520 000411 5217 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 521 000412 7006 RTL /GET TOP TWO BITS DOWN LOW 522 000413 7004 RAL 523 000414 0375 AND (3 /JUST KEEP THE TWO 524 000415 3032 DCA TEMP 525 000416 1432 TAD I TEMP /AND COUNT THEM 526 000417 3022 DCA TOTAL 527 000420 1425 TAD I MIDPTR /DO THE SAME FOR MIDDLE 528 000421 7450 SNA 529 000422 5232 JMP .+10 /NOTHING TO DO IF WORD IS ZERO 530 000423 7006 RTL 531 000424 7004 RAL 532 000425 0375 AND (3 533 000426 3032 DCA TEMP 534 000427 1432 TAD I TEMP 535 000430 1022 TAD TOTAL 536 000431 3022 DCA TOTAL 537 000432 1426 TAD I BOTPTR /DO THE SAME FOR BOTTOM 538 000433 7450 SNA 539 000434 5244 JMP .+10 /NOTHING TO DO IF WORD IS ZERO 540 000435 7006 RTL 541 000436 7004 RAL 542 000437 0375 AND (3 543 000440 3032 DCA TEMP 544 000441 1432 TAD I TEMP 545 000442 1022 TAD TOTAL 546 000443 3022 DCA TOTAL 547 000444 7040 CMA /STILL MISSING THE LEFT COLUMN 548 000445 1020 TAD ADDR /GET WORD TO OUR LEFT, WRAP AS NECESSARY 549 000446 0374 AND (WRDCOL-1 550 000447 1373 TAD (CACHE1 /DON'T CARE ABOUT ORDER OF BITS ANYWAYS! 551 000450 3033 DCA TMPPTR 552 000451 7001 IAC 553 000452 0433 AND I TMPPTR 554 000453 7640 SZA CLA 555 000454 2022 ISZ TOTAL 556 000455 1372 TAD (WRDCOL /DO NEXT CACHED ROW 557 000456 1033 TAD TMPPTR 558 000457 3033 DCA TMPPTR 559 000460 7001 IAC 560 000461 0433 AND I TMPPTR 561 000462 7640 SZA CLA 562 000463 2022 ISZ TOTAL 563 000464 1372 TAD (WRDCOL /AND THE LAST CACHED ROW 564 000465 1033 TAD TMPPTR 565 000466 3033 DCA TMPPTR 566 000467 7001 IAC 567 000470 0433 AND I TMPPTR 568 000471 7640 SZA CLA 569 000472 2022 ISZ TOTAL 570 000473 5771 JMP DOCALC /ALL DONE FOR NOW 571 572 000474 1370 NLBIT, TAD (-13 /HOW ABOUT RIGHT WORD EDGE? 573 000475 7640 SZA CLA 574 000476 5767 JMP NOTEDG /NO, NOT AT EITHER WORD EDGE 575 000477 1424 TAD I TOPPTR /YES, GET TOP WORD 576 000500 7450 SNA 577 000501 5305 JMP .+4 /NOTHING TO DO IF WORD IS ZERO 578 000502 0375 AND (3 /JUST KEEP THE TWO BOTTOM BITS 579 000503 3032 DCA TEMP 580 000504 1432 TAD I TEMP /AND COUNT THEM 581 000505 3022 DCA TOTAL 582 000506 1425 TAD I MIDPTR /DO THE SAME FOR MIDDLE 583 000507 7450 SNA 584 000510 5316 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 585 000511 0375 AND (3 586 000512 3032 DCA TEMP 587 000513 1432 TAD I TEMP 588 000514 1022 TAD TOTAL 589 000515 3022 DCA TOTAL 590 000516 1426 TAD I BOTPTR /DO THE SAME FOR BOTTOM 591 000517 7450 SNA 592 000520 5326 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 593 000521 0375 AND (3 594 000522 3032 DCA TEMP 595 000523 1432 TAD I TEMP 596 000524 1022 TAD TOTAL 597 000525 3022 DCA TOTAL 598 000526 7001 IAC /STILL MISSING THE RIGHT COLUMN 599 000527 1020 TAD ADDR /GET WORD TO OUR RIGHT, WRAP AS NECESSARY 600 000530 0374 AND (WRDCOL-1 601 000531 1373 TAD (CACHE1 /DON'T CARE ABOUT ORDER OF BITS ANYWAYS! 602 000532 3033 DCA TMPPTR 603 000533 1433 TAD I TMPPTR 604 000534 7710 SPA CLA 605 000535 2022 ISZ TOTAL 606 000536 1372 TAD (WRDCOL /DO NEXT CACHED ROW 607 000537 1033 TAD TMPPTR 608 000540 3033 DCA TMPPTR 609 000541 1433 TAD I TMPPTR 610 000542 7710 SPA CLA 611 000543 2022 ISZ TOTAL 612 000544 1372 TAD (WRDCOL /AND THE LAST CACHED ROW 613 000545 1033 TAD TMPPTR 614 000546 3033 DCA TMPPTR 615 000547 1433 TAD I TMPPTR 616 000550 7710 SPA CLA 617 000551 2022 ISZ TOTAL 618 000552 5771 JMP DOCALC /ALL DONE FOR NOW 619 620 000567 0600 PAGE 000570 7765 000571 0634 000572 0020 000573 0040 000574 0017 000575 0003 000576 0014 000577 0712 621 622 000600 1424 NOTEDG, TAD I TOPPTR /GET TOP WORD 623 000601 7450 SNA 624 000602 1425 TAD I MIDPTR /GET MIDDLE WORD 625 000603 7450 SNA 626 000604 1426 TAD I BOTPTR /GET BOTTOM WORD 627 000605 7650 SNA CLA /ANY LIFE? 628 000606 5231 JMP NWRDLF /NO, NO LIFE IN CURRENT WORD AREA 629 000607 1424 TAD I TOPPTR /GET TOP WORD 630 000610 4120 JMS DOROT /ROTATE AS NECESSARY 631 000611 3032 DCA TEMP /SAVE IT 632 000612 1432 TAD I TEMP /AND COUNT THE BITS 633 000613 3022 DCA TOTAL /SAVE THAT AS TOTAL SO FAR 634 000614 1425 TAD I MIDPTR /GET MIDDLE WORD 635 000615 4120 JMS DOROT 636 000616 3032 DCA TEMP 637 000617 1432 TAD I TEMP 638 000620 1022 TAD TOTAL /ADD TO TOTAL 639 000621 3022 DCA TOTAL 640 000622 1426 TAD I BOTPTR /GET BOTTOM WORD 641 000623 4120 JMS DOROT 642 000624 3032 DCA TEMP 643 000625 1432 TAD I TEMP 644 000626 1022 TAD TOTAL /ADD TO TOTAL 645 000627 3022 DCA TOTAL 646 000630 5234 JMP DOCALC 647 648 000631 7040 NWRDLF, CMA /SKIP TO LAST BIT OF WORD 649 000632 3021 DCA CURBIT 650 IFZERO VC8E+NOPRT+RLYNPR < /{ 651 TAD (-12 /SKIPPING 10 DEAD PIXELS 652 DCA CNT 653 IFNZRO PRTDOT < /{ 654 TAD (56 655 > /} 656 IFZERO PRTDOT < /{ 657 TAD (40 658 > /} 659 TSF 660 JMP .-1 661 TLS 662 ISZ CNT 663 JMP .-4 664 CLA 665 > /} 666 000633 5777 JMP DOLIFE 667 668 000634 1022 DOCALC, TAD TOTAL 669 000635 1376 TAD (-3 670 000636 7450 SNA 671 000637 5257 JMP BIRTH /EXACTLY 3 672 000640 1375 TAD (-1 673 000641 7650 SNA CLA 674 000642 5244 JMP SAME /EXACTLY 4 675 000643 5250 JMP DEATH /OTHERWISE... :( 676 677 000644 1421 SAME, TAD I CURBIT /GET MASK 678 000645 0425 AND I MIDPTR /AND WITH CURRENT WORD 679 000646 7640 SZA CLA /IS IT ALIVE OR DEAD? 680 000647 5257 JMP BIRTH 681 682 DEATH, 683 IFZERO VC8E+NOPRT+RLYNPR < /{ 684 JMS PRTDTH /PRINT DEATH (AWW...) 685 > /} 686 000650 1421 TAD I CURBIT /CLEAR THE BIT IN THE BITMAP 687 000651 7040 CMA 688 000652 6211 CDF DFIELD 689 000653 0420 AND I ADDR 690 000654 3420 DCA I ADDR 691 000655 6201 CDF 0 692 000656 5270 JMP BITLP 693 694 BIRTH, 695 IFNZRO STATS < /{ 696 000657 4774 JMS INCLIF /INCREMENT LIFE COUNTER 697 > /} 698 IFNZRO VC8E&NOSTOR&FASTR < /{ 699 JMS STORPT 700 > /} 701 IFNZRO VC8E&STORE < /{ 702 JMS DISPT /VC8E STORAGE, DISPLAY A POINT 703 > /} 704 IFZERO VC8E+NOPRT+RLYNPR < /{ 705 JMS PRTLIF /PRINT LIFE (YAY) 706 > /} 707 000660 1421 TAD I CURBIT /GET MASK 708 000661 7040 CMA 709 000662 6211 CDF DFIELD 710 000663 0420 AND I ADDR /COMPLEMENT MASK AND 'AND' IT WITH CURRENT WORD 711 000664 6201 CDF 0 712 000665 1421 TAD I CURBIT /ADD IN LIVE CELL 713 000666 6211 CDF DFIELD 714 000667 3420 DCA I ADDR /SAVE IT 715 000670 6201 CDF 0 716 717 BITLP, ISZ CURBIT /NEXT BIT redefined ^ 000671 2021 718 000672 5777 JMP DOLIFE /NOTHING ELSE TO DO HERE! 719 000673 7200 CLA /NEED TO GO TO NEXT WORD AND RESET CURRENT BIT TO -14 720 000674 1373 TAD (-14 721 000675 3021 DCA CURBIT 722 000676 2020 ISZ ADDR /FINAL BITMAP ADDRESS? 723 000677 5300 JMP CHKROW /NO 724 000700 5316 JMP FINAL /YES 725 726 CHKROW, TAD ADDR /END OF ROW? redefined ^ 000701 1020 727 000702 0372 AND (WRDCOL-1 728 000703 7640 SZA CLA 729 000704 5306 JMP NOTDUN /NO 730 IFZERO VC8E+NOPRT+RLYNPR < /{ 731 JMS DOCRLF /YES 732 > /} 733 000705 4771 JMS UCACHE /UPDATE CACHE 734 000706 5770 JMP CHKLIF 735 736 NOTDUN, ISZ TOPPTR /NEXT WORDS redefined ^ 000707 2024 737 000710 2025 ISZ MIDPTR 738 000711 2026 ISZ BOTPTR 739 000712 5777 JMP DOLIFE 740 741 NOLIFE, redefined ^ 742 IFZERO VC8E+NOPRT+RLYNPR < /{ 743 JMS DTHROW /PRINT A ROW OF DEATH... 744 > /} 745 000713 1020 TAD ADDR /END OF BITMAP? 746 000714 1367 TAD (WRDCOL 747 000715 7440 SZA 748 000716 5322 JMP NOTFIN /NO 749 FINAL, redefined ^ 750 000717 6031 KSF /ANY CHARACTER? 751 000720 7410 SKP /NOPE 752 000721 4766 JMS CHKCTL /YES, CHECK FOR A CONTROL CHARACTER 753 IFNZRO STATS < /{ 754 000722 4765 JMS INCGEN /YES, INCREMENT CYCLE COUNT 755 IFZERO VC8E+NOPRT+RLYNPR < /{ 756 JMS DOCRLF /GO TO NEXT LINE IF NEEDED 757 > /} 758 JMS PRNTST /PRINT STATISTICS undefined ^ 000723 7777 759 000724 4764 JMS RSTLIF /AND RESET LIFE COUNTER 760 > /} 761 IFZERO VC8E+NOPRT+RLYNPR < /{ 762 JMS PRTHOM /GO BACK HOME 763 > /} 764 IFNZRO VC8E < /{ 765 000725 4763 JMS RASERA /EITHER DISPLAY A RASTER OR ERASE THE SCREEN 766 > /} 767 NOTFIN, DCA ADDR redefined ^ 000726 3020 768 000727 4771 JMS UCACHE /UPDATE CACHE 769 000730 5770 JMP CHKLIF /AND TRY AGAIN 770 771 000763 1263 PAGE 000764 0314 000765 0321 000766 6600 000767 0020 000770 0400 000771 1000 000772 0017 000773 7764 000774 0307 000775 7777 000776 7775 000777 0403 772 773 /UPDATE CACHE 774 001000 0000 UCACHE, 0 775 001001 7200 CLA /MID TO TOP, BOT TO MID, TOP TO BOT 776 001002 1024 TAD TOPPTR 777 001003 0377 AND (-WRDCOL 778 001004 3032 DCA TEMP 779 001005 1025 TAD MIDPTR 780 001006 0377 AND (-WRDCOL 781 001007 3024 DCA TOPPTR 782 001010 1026 TAD BOTPTR 783 001011 0377 AND (-WRDCOL 784 001012 3025 DCA MIDPTR 785 001013 1032 TAD TEMP 786 001014 3026 DCA BOTPTR 787 001015 3032 DCA TEMP 788 001016 1023 TAD LIFDET /UPDATE THE LIFE DETECTION 789 001017 7104 CLL RAL 790 001020 0376 AND (6 791 001021 3023 DCA LIFDET 792 793 /NOW, ONLY REFRESH BOTTOM CACHED ROW 794 001022 7040 CMA 795 001023 1020 TAD ADDR /ADDR IS POINTING TO THE NEXT ROW IN THE BITMAP 796 001024 1375 TAD (WRDCOL /WE NEED THE NEXT ROW DOWN 797 001025 3011 DCA CPTR1 798 001026 7040 CMA 799 001027 1026 TAD BOTPTR 800 001030 3012 DCA CPTR2 801 001031 1377 TAD (-WRDCOL /COPYING ONE ROW 802 001032 3031 DCA CNT 803 001033 6211 CDF DFIELD 804 001034 1411 TAD I CPTR1 805 001035 6201 CDF 0 806 001036 7440 SZA /ANY LIFE DETECTED? 807 001037 2032 ISZ TEMP /YES 808 001040 3412 DCA I CPTR2 809 001041 2031 ISZ CNT 810 001042 5233 JMP .-7 811 812 001043 1032 TAD TEMP /ANY LIFE? 813 001044 7640 SZA CLA 814 001045 2023 ISZ LIFDET /YES 815 816 001046 5600 JMP I UCACHE 817 818 IFZERO VC8E+NOPRT+RLYNPR < /{ 819 /VT100 HOME SEQUENCE, ESC[H 820 PRTHOM, 0 821 CLA 822 TAD (HOMSEQ-1 823 JMS PUTS 824 JMP I PRTHOM 825 IFNZRO VT100 < /{ 826 HOMSEQ, 33 827 133 828 110 829 > /} 830 IFZERO VT100 < /{ 831 HOMSEQ, 14 832 > /} 833 0 834 835 IFNZRO VT100 < /{ 836 /VT100 ERASE LINE, ESC[2K, PLUS CRLF 837 ERALIN, 0 838 CLA 839 TAD (ERASEQ-1 840 JMS PUTS 841 JMP I ERALIN 842 ERASEQ, 33 843 133 844 62 845 113 846 15 847 12 848 0 849 > /} 850 851 /PRINT NULL-TERMINATED STRING 852 PUTS, 0 853 DCA PRIDX 854 TAD I PRIDX 855 SNA 856 JMP I PUTS 857 TSF 858 JMP .-1 859 TLS 860 CLA 861 JMP .-7 862 863 /PRINT DEATH 864 PRTDTH, 0 865 CLA 866 IFNZRO PRTDOT < /{ 867 TAD (56 868 > /} 869 IFZERO PRTDOT < /{ 870 TAD (40 871 > /} 872 TSF 873 JMP .-1 874 TLS 875 CLA 876 JMP I PRTDTH 877 878 /PRINT A ROW OF DEATH 879 DTHROW, 0 880 IFZERO SLODTH < /{ 881 JMS ERALIN 882 > /} 883 /PRTDOT=1 OR VT100=0 884 IFNZRO SLODTH < /{ 885 CLA 886 TAD (-WRDCOL^14 /12 PIXELS PER WORD 887 DCA CNT 888 IFNZRO PRTDOT < /{ 889 TAD (56 890 > /} 891 IFZERO PRTDOT < /{ 892 TAD (40 893 > /} 894 TSF 895 JMP .-1 896 TLS 897 ISZ CNT 898 JMP .-4 899 JMS DOCRLF 900 > /} 901 JMP I DTHROW 902 903 /PRINT A # FOR LIFE 904 PRTLIF, 0 905 CLA 906 TAD (43 907 TSF 908 JMP .-1 909 TLS 910 CLA 911 JMP I PRTLIF 912 > /} 913 914 IFNZRO VC8E < /{ 915 IFNZRO NOSTOR&FASTR < /{ 916 RSTDF, 0 917 CLA 918 TAD CDFCDF 919 DCA FSTDF1 920 TAD CDFCDF 921 DCA FSTDF2 922 TAD CDFCDF 923 DCA FSTDF4 924 JMP I RSTDF 925 CDFCDF, CDF 10 926 927 INCDF, 0 928 CLA 929 TAD FSTDF1 930 TAD (10 /NEXT FIELD 931 DCA FSTDF1 932 TAD FSTDF1 933 DCA FSTDF2 934 TAD FSTDF1 935 DCA FSTDF4 936 JMP I INCDF 937 938 STORPT, 0 939 CLA 940 TAD FSTPTR 941 CMA 942 SNA 943 JMS INCDF /AT THE LAST POINTER IN THE FIELD; INCREMENT DF 944 CLA CLL 945 TAD ADDR /X = (12 * (ADDR & (WRDCOL-1))) + CURBIT + 12 + STARTX 946 AND (WRDCOL-1 947 DCA X 948 TAD X 949 TAD X 950 TAD X 951 RTL 952 TAD CURBIT 953 TAD (12 954 CLL RTL 955 DCA X 956 957 TAD ADDR /Y = (((ADDR SHR 4) & 0377) + STARTY) 958 RTR 959 RTR 960 AND (377 961 CLL RTL 962 DCA Y 963 964 TAD Y 965 CMA IAC 966 TAD PREVY 967 SNA CLA 968 JMP NOSTRY /DON'T STORE Y 969 970 CLA IAC RAL 971 TAD FSTPTR /NEED TO STORE TWO VALUES; ARE WE AT 7776? 972 SNA CLA 973 JMS INCDF /YES 974 975 TAD Y /SAVE THE NEW Y FOR NEXT TIME 976 DCA PREVY 977 CLA CML RAR /SET SIGN BIT 978 TAD Y 979 FSTDF1, HLT /ACTUALLY A CDF 980 DCA I FSTPTR /SAVE THE Y WITH TAG BIT 981 CDF 0 982 NOSTRY, TAD X 983 FSTDF2, HLT /ACTUALLY A CDF 984 DCA I FSTPTR /SAVE THE X WITH NO TAG BIT 985 CDF 0 986 JMP I STORPT 987 PREVY, 0 988 > /} 989 IFNZRO STORE < /{ 990 DISPT, 0 991 CLA CLL 992 TAD ADDR /X = (12 * (ADDR & (WRDCOL-1))) + CURBIT + 12 + STARTX 993 AND (WRDCOL-1 994 DCA X 995 TAD X 996 TAD X 997 TAD X 998 RTL 999 TAD CURBIT 1000 TAD (12 1001 CLL RTL 1002 TAD STARTX 1003 DILX 1004 DCA X 1005 1006 TAD ADDR /Y = (((ADDR SHR 4) & 0377) + STARTY) 1007 RTR 1008 RTR 1009 AND (377 1010 CLL RTL 1011 CMA IAC 1012 TAD STARTY 1013 DILY 1014 DCA Y 1015 1016 DISD 1017 JMP .-1 1018 DIXY /X,Y 1019 JMP I DISPT 1020 > /} 1021 1022 001175 0020 PAGE 001176 0006 001177 7760 1023 1024 IFZERO FASTR+STORE < /{ 1025 /DO A RASTER SCAN OF THE BITMAP AND DISPLAY IT 1026 /IF THE PREVIOUS WORD HAD ACTIVITY AND WE HAVE NOT YET FINISHED A LINE, THE 1027 /Y DAC IS ALREADY SET UP FOR US. NO NEED TO RECALCULATE IT. THE X DAC IS 1028 /ACTUALLY SET UP AS WELL, SO THAT'S HANDY. 1029 001200 0000 RASTER, 0 1030 001201 7200 CLA 1031 001202 3020 DCA ADDR 1032 001203 1377 TAD (-14 1033 001204 3021 DCA CURBIT 1034 IFNZRO RSTRSC < /{ 1035 TAD STARTX 1036 DILX 1037 CLA 1038 TAD STARTY 1039 DILY 1040 CLA CMA 1041 DCA SHRTCT /SET UP FOR TAKING SHORTCUT 1042 > /} 1043 1044 001205 6211 RASLP, CDF DFIELD 1045 001206 1420 TAD I ADDR 1046 001207 6201 CDF 0 1047 001210 7440 SZA 1048 001211 5215 JMP DODRAW 1049 IFNZRO RSTRSC < /{ 1050 DCA SHRTCT /CAN'T DO SHORTCUT 1051 > /} 1052 001212 2020 RSCONT, ISZ ADDR 1053 001213 5205 JMP RASLP 1054 001214 5600 JMP I RASTER /YES, ALL DONE 1055 1056 001215 3262 DODRAW, DCA DRWWRD /STORE WORD TO PLOT 1057 IFNZRO RSTRSC < /{ 1058 ISZ SHRTCT /CAN WE DO THE SHORTCUT? 1059 JMP CALCXY /NO, WE CAN'T 1060 SKPCAL, TAD ADDR /MAYBE...ARE WE AT A NEW LINE? 1061 AND (WRDCOL-1 1062 SZA CLA 1063 JMP SCTCON /NO, DON'T CALCULATE Y IF WE DON'T HAVE TO 1064 TAD STARTX /YES, BEGINNING OF LINE 1065 DILX /RESET X 1066 DCA X 1067 JMP CALCY /AND JUST CALCULATE Y 1068 > /} 1069 1070 001216 1020 CALCXY, TAD ADDR /X = (4 * 12 * (ADDR & (WRDCOL-1))) + STARTX 1071 001217 0376 AND (WRDCOL-1 1072 001220 3036 DCA X 1073 001221 1036 TAD X 1074 001222 1036 TAD X 1075 001223 1036 TAD X 1076 001224 7106 CLL RTL 1077 001225 7106 CLL RTL 1078 001226 1034 TAD STARTX 1079 001227 6053 DILX 1080 001230 3036 DCA X 1081 1082 001231 1020 CALCY, TAD ADDR /Y = STARTY - (4 * ((ADDR SHR 4) & 0377)) 1083 001232 7012 RTR 1084 001233 0375 AND (1774 1085 001234 7041 CMA IAC 1086 001235 1035 TAD STARTY 1087 001236 6054 DILY 1088 001237 3037 DCA Y 1089 1090 IFNZRO RSTRSC < /{ 1091 SCTCON, CMA /WE CAN TAKE A SHORTCUT NEXT TIME, MAYBE... 1092 DCA SHRTCT 1093 > /} 1094 1095 IFNZRO RSTRSC < /{ 1096 WRDLP, TAD DRWWRD 1097 AND I CURBIT 1098 SNA CLA /ARE WE PLOTTING A BIT OR NOT? 1099 JMP NEXTX /NOPE, SKIP AHEAD 1100 DISD /YES, WAIT FOR DACS TO SETTLE 1101 JMP .-1 1102 DIXY 1103 1104 NEXTX, TAD X /INCREMENT X BY 4 BECAUSE OF OUR SCALE 1105 TAD (4 1106 DILX 1107 DCA X 1108 ISZ CURBIT 1109 JMP WRDLP 1110 TAD (-14 1111 DCA CURBIT 1112 JMP RSCONT 1113 1114 SHRTCT, 0 1115 > /} 1116 1117 IFZERO RSTRSC < /{ 1118 001240 1262 WRDLP, TAD DRWWRD 1119 001241 0421 AND I CURBIT 1120 001242 7650 SNA CLA /ARE WE PLOTTING A BIT OR NOT? 1121 001243 5247 JMP NXTBIT /NOPE, SKIP AHEAD 1122 001244 6052 DISD /YES, WAIT FOR DACS TO SETTLE 1123 001245 5244 JMP .-1 1124 001246 6055 DIXY 1125 1126 001247 2021 NXTBIT, ISZ CURBIT 1127 001250 5254 JMP NEXTX 1128 001251 1377 TAD (-14 1129 001252 3021 DCA CURBIT 1130 001253 5212 JMP RSCONT 1131 1132 001254 1036 NEXTX, TAD X /INCREMENT X BY 4 BECAUSE OF OUR SCALE 1133 001255 1374 TAD (4 1134 001256 6053 DILX 1135 001257 3036 DCA X 1136 001260 5240 JMP WRDLP 1137 1138 001261 0000 SHRTCT, 0 1139 > /} 1140 1141 001262 0000 DRWWRD, 0 1142 > /} 1143 1144 IFZERO SLOWR+STORE < /{ 1145 RSTDF2, 0 1146 CLA 1147 TAD CDFCDF 1148 DCA FSTDF3 1149 JMP I RSTDF2 1150 1151 INCDF2, 0 1152 CLA 1153 TAD FSTDF3 1154 TAD (10 1155 DCA FSTDF3 1156 JMP I INCDF2 1157 1158 /FAST RASTER IMPLEMENTATION 1159 /USES TAGGED Y VALUES AND NON-TAGGED X VALUES IN A WHOLE SEPARATE ARRAY 1160 RASTER, 0 1161 JMS RSTDF2 /RESET CDF INSTRUCTIONS 1162 CLA CMA 1163 DCA FSTPTR /INITIALIZE POINTER 1164 TAD STARTY /INITIALIZE Y DAC 1165 DILY 1166 RSTLP, CLA 1167 TAD FSTPTR 1168 CMA 1169 SNA CLA 1170 JMS INCDF2 /AT THE LAST POINTER IN THE FIELD; INCREMENT DF 1171 FSTDF3, HLT /ACTUALLY A CDF 1172 TAD I FSTPTR /GET DATA 1173 CDF 0 1174 1175 SPA /WAS SIGN SET? 1176 JMP SETY /YES, IT'S A Y VALUE OR THE END 1177 1178 TAD STARTX /NO, ADD THE START X POSITION 1179 DILX 1180 DISD 1181 JMP .-1 1182 DIXY /AND DISPLAY THE POINT 1183 JMP RSTLP 1184 1185 SETY, CLL CMA RAL 1186 SNA /WAS IT END OF LIST? 1187 JMP I RASTER /YES, WE'RE DONE 1188 CLL CML RAR /CLEAR TAG BIT 1189 IAC /FINISH TWO'S COMPLEMENT 1190 TAD STARTY /APPLY THE OFFSET 1191 DILY /UPDATE Y DAC 1192 JMP RSTLP 1193 1194 /SETY, RAL 1195 / SPA /WAS NEXT BIT SET? 1196 / JMP I RASTER /YES, WE'RE DONE 1197 / CLL /NOPE, CLEAR THE TAG BIT 1198 / RAR /ROTATE BACK 1199 / CMA IAC 1200 / TAD STARTY /APPLY THE OFFSET 1201 / DILY /UPDATE Y DAC 1202 / JMP RSTLP 1203 > /} 1204 1205 /DEPENDING ON IF WE HAVE A STORAGE 'SCOPE OR NOT, EITHER 1206 /RASTER THE BITMAP HERE FOR SEVERAL LOOPS, OR ERASE THE 1207 /SCREEN. YOU COULD ADD A DELAY BEFORE THE ERASE TO ADMIRE 1208 /THE COMPLETED CYCLE LONGER. 1209 001263 0000 RASERA, 0 1210 IFNZRO STORE < /{ 1211 CLA 1212 TAD (30 /ERASE VC8E 1213 DILE 1214 DISD /WAIT FOR ERASE TO COMPLETE 1215 JMP .-1 1216 CLA 1217 > /} 1218 IFZERO STORE < /{ 1219 IFNZRO FASTR < /{ 1220 CLA 1221 TAD FSTPTR 1222 CMA 1223 SNA 1224 JMS INCDF /AT THE LAST POINTER IN THE FIELD; INCREMENT DF 1225 CLA CMA 1226 FSTDF4, HLT /ACTUALLY A CDF 1227 DCA I FSTPTR /MARK THE FINISH 1228 CDF 0 1229 /TAD (-20 /16 LOOPS 1230 CMA 1231 DCA CNT 1232 JMS RASTER /DO THE RASTER 1233 ISZ CNT 1234 JMP .-2 1235 JMS RSTDF /RESET CDF INSTRUCTIONS 1236 CLA CMA /INITIALIZE POINTER FOR WRITING 1237 DCA FSTPTR 1238 CLA CMA /INITIALIZE PREVIOUS Y VALUE FOR FAST RASTER 1239 DCA PREVY 1240 > /} 1241 IFZERO FASTR < /{ 1242 001264 7200 CLA 1243 001265 1373 TAD (-20 /16 LOOPS 1244 001266 3031 DCA CNT 1245 001267 4200 JMS RASTER /DO THE RASTER 1246 001270 2031 ISZ CNT 1247 001271 5267 JMP .-2 1248 > /} 1249 > /} 1250 001272 5663 JMP I RASERA 1251 > /} 1252 1253 001373 7760 PAGE 001374 0004 001375 1774 001376 0017 001377 7764 1254 1255 /RUN-LENGTH ENCODING INITIALIZER 1256 1257 /TAKES MULTIPLES OF THREE ARGUMENTS 1258 /1. POINTER TO RLE DATA 1259 /2. X ADDRESS IN BITMAP, 0 TO 191 DECIMAL 1260 /3. Y ADDRESS IN BITMAP, 0 TO 255 DECIMAL 1261 /AND REPEAT 1262 1263 /RLE IS SUPPLIED AS: 1264 /TAG!COUNT; TAG!COUNT; TAG!COUNT; ...ETC. 1265 1266 /WHERE COUNT IS 1 TO 192, AND TAG IS: 1267 /6000 OCTAL - DEAD 1268 /4000 OCTAL - ALIVE 1269 /1000 OCTAL - END OF LINE 1270 /0 TERMINATES THE SEQUENCE 1271 /IF COUNT IS ZERO, IT IS ASSUMED TO BE 1 1272 1273 /KEEPS GOING UNTIL THE POINTER TO RLE DATA IS ZERO 1274 001400 0000 RLE, 0 1275 001401 7240 NXTRLE, CLA CMA 1276 001402 1600 TAD I RLE /GET POINTER TO RLE 1277 001403 3013 DCA RLEPTR 1278 001404 1013 TAD RLEPTR /WAS IT ZERO? 1279 001405 7040 CMA 1280 001406 7650 SNA CLA 1281 001407 5325 JMP RLEDUN 1282 001410 2200 ISZ RLE 1283 001411 1600 TAD I RLE /GET X VALUE 1284 001412 3332 DCA SBIT 1285 001413 3331 DCA SADDR 1286 001414 1332 TAD SBIT 1287 001415 1377 TAD (-14 /DIVIDE BY 12 1288 001416 7510 SPA 1289 001417 5222 JMP DIVDUN /NO MORE TO DIVIDE 1290 001420 2331 ISZ SADDR 1291 001421 5215 JMP .-4 1292 001422 3332 DIVDUN, DCA SBIT 1293 001423 1332 TAD SBIT 1294 001424 3021 DCA CURBIT 1295 001425 2200 ISZ RLE 1296 001426 1600 TAD I RLE /GET Y VALUE 1297 001427 7106 CLL RTL /MULTIPLY BY 16 1298 001430 7006 RTL 1299 001431 1331 TAD SADDR /ADD TO X OFFSET 1300 001432 3331 DCA SADDR 1301 001433 1331 TAD SADDR 1302 001434 3020 DCA ADDR 1303 001435 2200 ISZ RLE /POINT TO RETURN 1304 1305 001436 3327 RMAIN, DCA CURSTA /RESET CURRENT STATE 1306 001437 1413 TAD I RLEPTR /GET DATA 1307 001440 7450 SNA /END OF SEQUENCE? 1308 001441 5201 JMP NXTRLE /GET NEXT RLE 1309 001442 7104 CLL RAL 1310 001443 7420 SNL /NOPE, WHAT WAS IT? 1311 001444 2327 ISZ CURSTA 1312 001445 7500 SMA 1313 001446 2327 ISZ CURSTA /CURSTA = 0 FOR DEAD, 1 FOR LIFE, 2 FOR EOL 1314 001447 7010 RAR /GO BACK THE OTHER WAY 1315 001450 0376 AND (377 /KEEP JUST THE COUNT 1316 001451 7041 CMA IAC /NEGATE IT 1317 001452 7450 SNA /IF IT IS ZERO 1318 001453 7040 CMA /MAKE IT ONE 1319 001454 3333 DCA RLECNT /STORE IT 1320 1321 001455 1327 RLOOP, TAD CURSTA /LIFE OR DEATH OR EOL? 1322 001456 7450 SNA 1323 001457 5275 JMP RCONT /0 FOR DEATH 1324 001460 7010 RAR 1325 001461 7630 SZL CLA 1326 001462 5264 JMP RLIVE /1 FOR LIFE 1327 001463 5315 JMP NEXTLN /2 FOR NEXT LINE 1328 1329 RLIVE, 1330 IFNZRO STATS < /{ 1331 001464 4775 JMS INCLIF /INCREMENT LIFE COUNTER 1332 > /} 1333 001465 1421 TAD I CURBIT /GET MASK 1334 001466 7040 CMA 1335 001467 6211 CDF DFIELD 1336 001470 0420 AND I ADDR /COMPLEMENT MASK AND 'AND' IT WITH CURRENT WORD 1337 001471 6201 CDF 0 1338 001472 1421 TAD I CURBIT /ADD IN LIVE CELL 1339 001473 6211 CDF DFIELD 1340 001474 3420 DCA I ADDR /SAVE IT 1341 001475 6201 CDF 0 1342 1343 RCONT, ISZ CURBIT /NEXT BIT redefined ^ 001476 2021 1344 001477 5312 JMP RCHECK 1345 001500 7200 CLA /NEED TO GO TO NEXT WORD AND RESET CURRENT BIT TO -14 1346 001501 1377 TAD (-14 1347 001502 3021 DCA CURBIT 1348 001503 1020 TAD ADDR 1349 001504 7001 IAC 1350 001505 0374 AND (WRDCOL-1 1351 001506 3032 DCA TEMP 1352 001507 1020 TAD ADDR 1353 001510 0373 AND (-WRDCOL 1354 001511 1032 TAD TEMP 1355 001512 3020 DCA ADDR 1356 RCHECK, ISZ RLECNT /ANY MORE TO DO? redefined ^ 001513 2333 1357 001514 5255 JMP RLOOP /YES 1358 001515 5236 JMP RMAIN /NOPE, GET MORE DATA 1359 1360 NEXTLN, TAD SBIT redefined ^ 001516 1332 1361 001517 3021 DCA CURBIT 1362 001520 1331 TAD SADDR 1363 001521 1372 TAD (WRDCOL 1364 001522 3331 DCA SADDR 1365 001523 1331 TAD SADDR 1366 001524 3020 DCA ADDR 1367 001525 5313 JMP RCHECK 1368 1369 RLEDUN, ISZ RLE redefined ^ 001526 2200 1370 001527 5600 JMP I RLE 1371 1372 CURSTA, 0 redefined ^ 001530 0000 1373 CURDAT, 0 redefined ^ 001531 0000 1374 SADDR, 0 redefined ^ 001532 0000 1375 SBIT, 0 redefined ^ 001533 0000 1376 RLECNT, 0 redefined ^ 001534 0000 1377 1378 001572 0020 PAGE 001573 7760 001574 0017 001575 0307 001576 0377 001577 7764 1379 1380 IFNZRO STATS < /{ 1381 /DOUBLE DABBLE IMPLEMENTATION FOR 24-BIT UNSIGNED INPUT 1382 /BINARY TO BCD CONVERSION 1383 1384 /TAKES POINTER TO DOUBLE WORD IN AC 1385 /RETURNS ASCII STRING POINTER IN AC OF CONVERSION 1386 001600 0000 DUBDAB, 0 1387 DCA DUBPTR /STORE POINTER undefined ^ 001601 7777 1388 TAD I DUBPTR /GET DOUBLE LSW undefined ^ 001602 7777 1389 DCA SCRATC /STORE IT IN SCRATCH undefined ^ 001603 7777 1390 ISZ DUBPTR undefined ^ 001604 7777 1391 TAD I DUBPTR /GET DOUBLE MSW undefined ^ 001605 7777 1392 DCA SCRATC+1 /STORE IT NEXT undefined ^ 001606 7777 1393 DCA SCRATC+2 /CLEAR REST OF SCRATCH undefined ^ 001607 7777 1394 DCA SCRATC+3 undefined ^ 001610 7777 1395 DCA SCRATC+4 undefined ^ 001611 7777 1396 001612 1377 TAD (-30 /LOOP 24 TIMES 1397 001613 3031 DCA CNT 1398 1399 DABLP, TAD SCRATC+2 /CHECK FOR NECESSARY ADDITIONS undefined ^ 001614 7777 1400 JMS DABADD undefined ^ 001615 7777 1401 DCA SCRATC+2 undefined ^ 001616 7777 1402 TAD SCRATC+3 undefined ^ 001617 7777 1403 JMS DABADD undefined ^ 001620 7777 1404 DCA SCRATC+3 undefined ^ 001621 7777 1405 TAD SCRATC+4 undefined ^ 001622 7777 1406 JMS DABADD undefined ^ 001623 7777 1407 DCA SCRATC+4 undefined ^ 001624 7777 1408 1409 TAD SCRATC /ROTATE EVERYTHING LEFT undefined ^ 001625 7777 1410 001626 7004 RAL 1411 DCA SCRATC undefined ^ 001627 7777 1412 TAD SCRATC+1 undefined ^ 001630 7777 1413 001631 7004 RAL 1414 DCA SCRATC+1 undefined ^ 001632 7777 1415 TAD SCRATC+2 undefined ^ 001633 7777 1416 001634 7004 RAL 1417 DCA SCRATC+2 undefined ^ 001635 7777 1418 TAD SCRATC+3 undefined ^ 001636 7777 1419 001637 7004 RAL 1420 DCA SCRATC+3 undefined ^ 001640 7777 1421 TAD SCRATC+4 undefined ^ 001641 7777 1422 001642 7004 RAL 1423 DCA SCRATC+4 undefined ^ 001643 7777 1424 1425 001644 2031 ISZ CNT /KEEP GOING? 1426 001645 5214 JMP DABLP /YES 1427 1428 /TIME TO DISH UP SOME ASCII 1429 1430 TAD (ASCOUT /PUT OUTPUT POINTER undefined ^ 001646 7777 1431 DCA DUBPTR /IN OUR POINTER undefined ^ 001647 7777 1432 1433 TAD SCRATC+4 /ADD DIGITS TO OUTPUT undefined ^ 001650 7777 1434 JMS DABASC undefined ^ 001651 7777 1435 TAD SCRATC+3 undefined ^ 001652 7777 1436 JMS DABASC undefined ^ 001653 7777 1437 TAD SCRATC+2 undefined ^ 001654 7777 1438 JMS DABASC undefined ^ 001655 7777 1439 DCA I DUBPTR /NULL TERMINATOR undefined ^ 001656 7777 1440 1441 TAD (ASCOUT /DO ZERO SUPPRESSION undefined ^ 001657 7777 1442 DCA DUBPTR undefined ^ 001660 7777 1443 1444 TAD I DUBPTR /IS IT ASCII ZERO? undefined ^ 001661 7777 1445 001662 1376 TAD (-60 1446 001663 7440 SZA 1447 JMP DABDUN /NOT ASCII ZERO undefined ^ 001664 7777 1448 ISZ DUBPTR /YES, TRY AGAIN undefined ^ 001665 7777 1449 001666 5261 JMP .-5 1450 001667 1375 DABDUN, TAD (60 /WAS IT OUR TERMINATION? 1451 001670 7650 SNA CLA 1452 001671 7040 CMA /YES, SUBTRACT ONE FROM POINTER 1453 TAD DUBPTR /RETURN POINTER undefined ^ 001672 7777 1454 001673 5600 JMP I DUBDAB 1455 1456 /DECOMPOSES EACH NIBBLE OF WORD INTO THREE ASCII BYTES 1457 /IF LINK IS SET AND ASCII POINTER HASN'T CHANGED, PUT A ZERO 1458 /OTHERWISE, DO LEADING ZERO SUPPRESSION 1459 001674 0000 DABASC, 0 1460 001675 3032 DCA TEMP /STORE THE DIGITS 1461 1462 001676 1032 TAD TEMP /GET TOP BCD DIGIT 1463 001677 7006 RTL 1464 001700 7006 RTL 1465 001701 7004 RAL 1466 001702 0374 AND (17 1467 001703 1375 TAD (60 /ADD ASCII ZERO 1468 DCA I DUBPTR undefined ^ 001704 7777 1469 ISZ DUBPTR undefined ^ 001705 7777 1470 1471 001706 1032 TAD TEMP /GET MIDDLE BCD DIGIT 1472 001707 7012 RTR 1473 001710 7012 RTR 1474 001711 0374 AND (17 1475 001712 1375 TAD (60 /ADD ASCII ZERO 1476 DCA I DUBPTR undefined ^ 001713 7777 1477 ISZ DUBPTR undefined ^ 001714 7777 1478 1479 001715 1032 TAD TEMP /GET BOTTOM BCD DIGIT 1480 001716 0374 AND (17 1481 001717 1375 TAD (60 /ADD ASCII ZERO 1482 DCA I DUBPTR undefined ^ 001720 7777 1483 ISZ DUBPTR undefined ^ 001721 7777 1484 001722 5674 JMP I DABASC 1485 1486 001723 0000 DUBPTR, 0 1487 001724 0000 SCRATC, ZBLOCK 5 001725 0000 001726 0000 001727 0000 001730 0000 1488 001731 0000 ASCOUT, ZBLOCK 12 /9 BCD DIGITS IN 3 WORDS, PLUS NULL TERMINATION 001732 0000 001733 0000 001734 0000 001735 0000 001736 0000 001737 0000 001740 0000 001741 0000 001742 0000 1489 1490 001774 0017 PAGE 001775 0060 001776 7720 001777 7750 1491 1492 /ADDS 3 TO EACH NIBBLE OF WORD IF NIBBLE IS GREATER THAN 4 1493 002000 0000 DABADD, 0 1494 002001 3032 DCA TEMP 1495 002002 1032 TAD TEMP /IS BOTTOM BCD DIGIT GREATER THAN 4? 1496 002003 0377 AND (17 1497 002004 1376 TAD (-5 1498 002005 7700 SMA CLA 1499 002006 1375 TAD (3 /YES, ADD 3 1500 002007 1032 TAD TEMP /TO THE BOTTOM BCD DIGIT 1501 002010 3032 DCA TEMP /AND SAVE IT 1502 1503 002011 1032 TAD TEMP /IS MIDDLE BCD DIGIT GREATER THAN 4? 1504 002012 7012 RTR 1505 002013 7012 RTR 1506 002014 0377 AND (17 1507 002015 1376 TAD (-5 1508 002016 7700 SMA CLA 1509 002017 1374 TAD (60 /YES, ADD 3 1510 002020 1032 TAD TEMP /TO THE MIDDLE BCD DIGIT 1511 002021 3032 DCA TEMP /AND SAVE IT 1512 1513 002022 1032 TAD TEMP /IS TOP BCD DIGIT GREATER THAN 4? 1514 002023 7006 RTL 1515 002024 7006 RTL 1516 002025 7004 RAL 1517 002026 0377 AND (17 1518 002027 1376 TAD (-5 1519 002030 7700 SMA CLA 1520 002031 1373 TAD (1400 /YES, ADD 3 1521 002032 1032 TAD TEMP /TO THE TOP BCD DIGIT 1522 002033 5600 JMP I DABADD /AND RETURN 1523 1524 /PRINT STATISTICS 1525 002034 0000 PRNTST, 0 1526 002035 7200 CLA 1527 TAD (GENTXT undefined ^ 002036 7777 1528 JMS PUTSIX undefined ^ 002037 7777 1529 002040 1372 TAD (GENCNT 1530 002041 4771 JMS DUBDAB 1531 JMS PUTS2 undefined ^ 002042 7777 1532 TAD TAB undefined ^ 002043 7777 1533 JMS PUTC undefined ^ 002044 7777 1534 TAD (LIFTXT undefined ^ 002045 7777 1535 JMS PUTSIX undefined ^ 002046 7777 1536 002047 1370 TAD (LIFCNT 1537 002050 4771 JMS DUBDAB 1538 JMS PUTS2 undefined ^ 002051 7777 1539 JMS DOCRLF undefined ^ 002052 7777 1540 002053 5634 JMP I PRNTST 1541 1542 002054 0705 GENTXT, TEXT"GENERATION: " 002055 1605 002056 2201 002057 2411 002060 1716 002061 7240 002062 0000 1543 002063 1411 LIFTXT, TEXT"LIVE CELLS: " 002064 2605 002065 4003 002066 0514 002067 1423 002070 7240 002071 0000 1544 002072 0011 TAB, 11 1545 > /} 1546 1547 IFNZRO STATS+PARSER < /{ 1548 /LIKE PUTS, BUT TAKES POINTER, NOT POINTER-1 1549 002073 0000 PUTS2, 0 1550 002074 1367 TAD (-1 1551 002075 3010 DCA PRIDX 1552 002076 1410 TAD I PRIDX 1553 002077 7450 SNA 1554 002100 5673 JMP I PUTS2 1555 JMS PUTC undefined ^ 002101 7777 1556 002102 5276 JMP .-4 1557 1558 /PRINT A SIXBIT STRING 1559 002103 0000 PUTSIX, 0 1560 002104 3033 DCA TMPPTR 1561 002105 1433 TAD I TMPPTR /GET WORD 1562 002106 7012 RTR /GET TOP SIX IN BOTTOM 1563 002107 7012 RTR 1564 002110 7012 RTR 1565 002111 0366 AND (77 1566 002112 7450 SNA /WAS IT ZERO? 1567 002113 5703 JMP I PUTSIX /YES, RETURN 1568 JMS PUTCSX /CONVERT AND PRINT undefined ^ 002114 7777 1569 002115 1433 TAD I TMPPTR /GET WORD 1570 002116 0366 AND (77 /KEEP BOTTOM SIX 1571 002117 7450 SNA /WAS IT ZERO? 1572 002120 5703 JMP I PUTSIX /YES, RETURN 1573 JMS PUTCSX /CONVERT AND PRINT undefined ^ 002121 7777 1574 002122 2033 ISZ TMPPTR /LOOP 1575 002123 5305 JMP PUTSIX+2 1576 1577 /SIXBIT CONVERSION AND PRINT 1578 002124 0000 PUTCSX, 0 1579 002125 1365 TAD (-40 /WAS IT GTE 40? 1580 002126 7500 SMA 1581 002127 1364 TAD (-100 /YES 1582 002130 1363 TAD (140 /MAKE IT ASCII 1583 JMS PUTC /PRINT IT undefined ^ 002131 7777 1584 002132 5724 JMP I PUTCSX 1585 1586 /PRINT A CHARACTER 1587 002133 0000 PUTC, 0 1588 002134 7410 TSF 1589 002135 5334 JMP .-1 1590 002136 7000 TLS 1591 002137 7200 CLA 1592 002140 5733 JMP I PUTC 1593 1594 002163 0140 PAGE 002164 7700 002165 7740 002166 0077 002167 7777 002170 0027 002171 1600 002172 0173 002173 1400 002174 0060 002175 0003 002176 7773 002177 0017 1595 > /} 1596 1597 IFNZRO STATS+USETTY < /{ 1598 002200 0000 DOCRLF, 0 1599 002201 7200 CLA 1600 TAD (CRLF-1 undefined ^ 002202 7777 1601 002203 3010 DCA PRIDX 1602 002204 1410 TAD I PRIDX 1603 002205 7450 SNA 1604 002206 5600 JMP I DOCRLF 1605 002207 7410 TSF 1606 002210 5207 JMP .-1 1607 002211 7000 TLS 1608 002212 7200 CLA 1609 002213 5204 JMP .-7 1610 002214 0015 CRLF, 15 1611 002215 0012 12 1612 002216 0000 0 1613 > /} 1614 1615 /INITIALIZATION ROUTINE 1616 INIT, 0 redefined ^ 002217 0000 1617 002220 7200 CLA /ZERO PLAYING FIELD 1618 002221 3020 DCA ADDR 1619 002222 6211 CDF DFIELD 1620 002223 3420 DCA I ADDR 1621 002224 6201 CDF 0 1622 002225 2020 ISZ ADDR 1623 002226 5222 JMP .-4 1624 IFNZRO PARSER < /{ 1625 JMS PARSE 1626 > /} 1627 002227 4777 JMS RLE 1628 IFZERO PARSER < /{ 1629 IFNZRO GLDERS < /{ 1630 RGLIDR; 0; 0 1631 /RGLIDR; 0; 7 1632 > /} 1633 IFNZRO GOSPER < /{ 1634 RGSPER; 10; 10 1635 /RGSPER; 40; 0 1636 /RGSPER; 100; 0 1637 > /} 1638 IFNZRO RPENTO < /{ 1639 002230 2000 RRPENT; 137; 176 002231 0137 002232 0176 1640 > /} 1641 IFNZRO MWSS < /{ 1642 RMWSS; 200; 200 1643 > /} 1644 IFNZRO HWSS < /{ 1645 RHWSS; 200; 220 1646 > /} 1647 IFNZRO DIEHARD < /{ 1648 RDIHRD; 137; 176 1649 > /} 1650 IFNZRO ACORN < /{ 1651 RACORN; 137; 176 1652 > /} 1653 IFNZRO BREED < /{ 1654 RBREED; 0; 0 1655 > /} 1656 IFNZRO FILLER < /{ 1657 RFILL; 110; 163 1658 > /} 1659 IFNZRO MAXFIL < /{ 1660 RMAX; 110; 163 1661 > /} 1662 IFNZRO BAKRAK < /{ 1663 RBAKRK; 137; 176 1664 > /} 1665 IFNZRO SPCRAK < /{ 1666 RSPCRK; 137; 176 1667 > /} 1668 IFNZRO KAREL < /{ 1669 RKAREL; 137; 176 1670 > /} 1671 > /} 1672 IFNZRO PARSER < /{ 1673 RPARSE 1674 XPARSE, 0 1675 YPARSE, 0 1676 > /} 1677 002233 0000 0 /END OF INITIALIZATION 1678 002234 5617 JMP I INIT 1679 1680 /RLE INFORMATION 1681 1682 B=6000 /DEAD 1683 O=4000 /ALIVE 1684 L=1000 /END OF LINE 1685 E=0 /END OF RLE 1686 1687 /PARSES TYPICAL RLE STRINGS 1688 /CTRL-U TO START OVER 1689 /CTRL-D TO END IMMEDIATELY 1690 /B FOR DEATH 1691 /O FOR LIFE 1692 /$ FOR END OF LINE 1693 /! FOR END OF FILE 1694 /X FOR INITIAL X POSITION 1695 /Y FOR INITIAL Y POSITION 1696 IFNZRO PARSER < /{ 1697 PARSE, 0 1698 JMS DOCRLF /PRINT A FRIENDLY PROMPT 1699 TAD (PROMPT 1700 JMS PUTSIX 1701 JMS DOCRLF 1702 TAD (RPARSE-1 /SET UP OUR POINTER 1703 DCA RLEPTR 1704 PARSLP, DCA NUMBUF /CLEAR THE NUMBER BUFFER 1705 GETCH, KSF /AWAIT A CHARACTER 1706 JMP .-1 1707 KRB /READ IT 1708 AND (177 /KEEP BOTTOM 7 BITS 1709 DCA TEMP /STORE IT 1710 TAD TEMP 1711 IFNZRO OS8 < /{ 1712 TAD (-3 /IS IT A CTRL-C? 1713 SNA 1714 JMP EXIT /YES, EXIT TO OS/8 1715 TAD (-4+3 /IS IT A CTRL-D? 1716 > /} 1717 IFZERO OS8 < /{ 1718 TAD (-4 /IS IT A CTRL-D? 1719 > /} 1720 SNA 1721 JMP CTRLD /YES 1722 TAD (-15+4 /IS IT A CR? 1723 SNA 1724 JMP CR /YES 1725 TAD (-25+15 /IS IT A CTRL-U? 1726 SNA 1727 JMP CTRLU /YES 1728 TAD (-41+25 /IS IT AN EXCLAMATION MARK? 1729 SNA 1730 JMP EXCLAM /YES 1731 TAD (-44+41 /IS IT A DOLLAR SIGN? 1732 SNA 1733 JMP DOLLAR /YES 1734 TAD (-100+44 /IS IT GEQ TO THE AT SIGN? 1735 SPA 1736 JMP CHKNUM /NO, MAYBE IT'S A NUMBER 1737 AND (37 /YES, MAYBE A LETTER, MAKE IT UPPERCASE 1738 TAD (-2 /WAS IT A B? 1739 SNA 1740 JMP PARSEB /YES 1741 TAD (-17+2 /HOW ABOUT AN O? 1742 SNA 1743 JMP PARSEO /YES 1744 TAD (-30+17 /HOW ABOUT AN X? 1745 SNA 1746 JMP PARSEX /YES 1747 TAD (-31+30 /HOW ABOUT A Y? 1748 SNA CLA 1749 JMP PARSEY /YES 1750 JMP GETCH /NOPE, IGNORE IT 1751 1752 CR, JMS DOCRLF /DO FULL CRLF 1753 JMP GETCH /AND CONTINUE 1754 1755 EXCLAM, JMS DOECHO /ECHO CHAR 1756 JMS DOCRLF 1757 DCA I RLEPTR /MARK END OF FILE 1758 JMP I PARSE /AND RETURN 1759 1760 CTRLD, CLA 1761 TAD (CTRLDP 1762 JMS PUTSIX 1763 JMS DOCRLF 1764 JMP I PARSE /GET OUTTA HERE NOW! 1765 CTRLDP, TEXT"^D" 1766 1767 CTRLU, CLA 1768 TAD (CTRLUP 1769 JMS PUTSIX 1770 JMS DOCRLF 1771 JMP PARSE+1 /GO BACK TO THE START 1772 CTRLUP, TEXT"^U" 1773 1774 PAGE 1775 1776 DOLLAR, JMS DOECHO /ECHO CHAR 1777 JMS NUMCHK /CHECK NUMBER 1778 TAD (L /GET END OF LINE 1779 DCA I RLEPTR /STORE IT 1780 JMP PARSLP /AND LOOP AGAIN 1781 1782 CHKNUM, CLA 1783 TAD TEMP /IS IT POSSIBLY A NUMBER? 1784 TAD (-60 1785 SPA CLA 1786 JMP GETCH /NOPE, IGNORE IT 1787 TAD TEMP /WELL, MAYBE... 1788 TAD (-72 1789 SMA CLA 1790 JMP GETCH /NOPE, IGNORE IT 1791 JMS DOECHO /YES IT IS, ECHO IT 1792 TAD TEMP 1793 AND (17 /KEEP BOTTOM NIBBLE 1794 DCA TEMP 1795 TAD NUMBUF /MULTIPLY EXISTING NUMBER BUFFER BY 10 DECIMAL 1796 CLL RTL 1797 TAD NUMBUF 1798 CLL RAL 1799 TAD TEMP /ADD OUR NIBBLE TO IT 1800 DCA NUMBUF /AND STORE IT 1801 JMP GETCH /GO GET SOME MORE 1802 1803 PARSEB, JMS DOECHO /ECHO CHAR 1804 JMS NUMCHK /CHECK NUMBER 1805 TAD (B /GET DEATH 1806 DCA I RLEPTR /STORE IT 1807 JMP PARSLP /AND LOOP AGAIN 1808 1809 PARSEO, JMS DOECHO /ECHO CHAR 1810 JMS NUMCHK /CHECK NUMBER 1811 TAD (O /GET LIFE 1812 DCA I RLEPTR /STORE IT 1813 JMP PARSLP /AND LOOP AGAIN 1814 1815 PARSEX, JMS DOECHO /ECHO CHAR 1816 JMS NUMCHK /CHECK NUMBER 1817 DCA XPARSE /STORE IT 1818 JMP PARSLP /AND LOOP AGAIN 1819 1820 PARSEY, JMS DOECHO /ECHO CHAR 1821 JMS NUMCHK /CHECK NUMBER 1822 DCA YPARSE /STORE IT 1823 JMP PARSLP /AND LOOP AGAIN 1824 1825 NUMBUF, 0 1826 1827 /PRINT CHARACTER IN BUFFER 1828 DOECHO, 0 1829 CLA 1830 TAD TEMP 1831 TSF 1832 JMP .-1 1833 TLS 1834 CLA 1835 JMP I DOECHO 1836 1837 /CHECK NUMBER FOR LESS THAN 256 DECIMAL 1838 NUMCHK, 0 1839 CLA CLL 1840 TAD NUMBUF /GET THE NUMBER FROM THE BUFFER 1841 TAD (7400 /OUT OF BOUNDS? 1842 SZL CLA 1843 JMP NUMERR /YES, WE HAVE AN ERROR 1844 TAD NUMBUF /NOPE, RETURN IT 1845 JMP I NUMCHK 1846 NUMERR, JMS DOCRLF 1847 TAD (NUMMSG /PRINT THE ERROR MESSAGE 1848 JMS PUTSIX 1849 JMS DOCRLF 1850 JMP PARSLP /AND TRY TO CONTINUE 1851 NUMMSG, TEXT"NUMBER TOO BIG" 1852 1853 PROMPT, TEXT"ENTER RLE:" 1854 1855 > /} 1856 1857 002377 1400 PAGE 1858 1859 IFZERO PARSER < /{ 1860 IFNZRO GLDERS < /{ 1861 RGLIDR, DECIMAL 1862 1!B;1!O;L 1863 2!B;1!O;L 1864 3!O;E 1865 OCTAL 1866 > /} 1867 1868 IFNZRO GOSPER < /{ 1869 RGSPER, DECIMAL 1870 24!B;O;L 1871 22!B;O;B;O;L 1872 12!B;2!O;6!B;2!O;12!B;2!O;L 1873 11!B;O;3!B;O;4!B;2!O;12!B;2!O;L 1874 2!O;8!B;O;5!B;O;3!B;2!O;L 1875 2!O;8!B;O;3!B;O;B;2!O;4!B;O;B;O;L 1876 10!B;O;5!B;O;7!B;O;L 1877 11!B;O;3!B;O;L 1878 12!B;2!O;E 1879 OCTAL 1880 > /} 1881 1882 IFNZRO RPENTO < /{ 1883 RRPENT, DECIMAL redefined ^ 1884 002400 6000 B;2!O;L;2!O;B;L;B;O;E 002401 4002 002402 1000 002403 4002 002404 6000 002405 1000 002406 6000 002407 4000 002410 0000 1885 OCTAL 1886 > /} 1887 1888 IFNZRO MWSS < /{ 1889 RMWSS, DECIMAL 1890 3!B;O;2!B;L;B;O;3!B;O;L;O;5!B;L;O;4!B;O;L;5!O;E 1891 OCTAL 1892 > /} 1893 1894 IFNZRO HWSS < /{ 1895 RHWSS, DECIMAL 1896 3!B;2!O;2!B;L;B;O;4!B;O;L;O;6!B;L;O;5!B;O;L;6!O;E 1897 OCTAL 1898 > /} 1899 1900 IFNZRO DIEHARD < /{ 1901 RDIHRD, DECIMAL 1902 6!B;O;B;L;2!O;6!B;L;B;O;3!B;3!O;E 1903 OCTAL 1904 > /} 1905 1906 IFNZRO ACORN < /{ 1907 RACORN, DECIMAL 1908 B;O;5!B;L;3!B;O;3!B;L;2!O;2!B;3!O;E 1909 OCTAL 1910 > /} 1911 1912 IFNZRO BREED < /{ 1913 RBREED, DECIMAL 1914 133!B;O;L;134!B;O;L;130!B;O;3!B;O;L;131!B;4!O;3!L;130!B;O;L;131!B;O;L 1915 132!B;O;L;132!B;O;L;131!B;2!O;4!L;133!B;O;L;134!B;O;L;130!B;O;3!B;O;L 1916 131!B;4!O;9!L;96!B;O;L;97!B;O;L;93!B;O;3!B;O;L;94!B;4!O;8!L;3!B;O;L 1917 4!B;O;L;O;3!B;O;L;B;4!O;E 1918 OCTAL 1919 > /} 1920 1921 IFNZRO FILLER < /{ 1922 RFILL, DECIMAL 1923 20!B;3!O;3!B;3!O;L;19!B;O;B;B;O;3!B;O;B;B;O;L;4!O;18!B;O;3!B;O;18!B 1924 4!O;L;O;3!B;O;17!B;O;3!B;O;17!B;O;3!B;O;L;O;8!B;O;12!B;O;3!B;O;12!B;O 1925 8!B;O;L;B;O;B;B;O;B;B;O;O;B;B;O;25!B;O;B;B;O;O;B;B;O;B;B;O;L;6!B;O;5!B 1926 O;7!B;3!O;3!B;3!O;7!B;O;5!B;O;L;6!B;O;5!B;O;8!B;O;5!B;O;8!B;O;5!B;O;L 1927 6!B;O;5!B;O;8!B;7!O;8!B;O;5!B;O;L;B;O;B;B;O;B;B;O;O;B;B;O;B;B;O;O;4!B 1928 O;7!B;O;4!B;O;O;B;B;O;B;B;O;O;B;B;O;B;B;O;L;O;8!B;O;3!B;O;O;4!B;11!O 1929 4!B;O;O;3!B;O;8!B;O;L;O;3!B;O;9!B;O;O;17!B;O;O;9!B;O;3!B;O;L;4!O;11!B 1930 19!O;11!B;4!O;L;16!B;O;B;O;11!B;O;B;O;L;19!B;11!O;L;19!B;O;9!B;O;L 1931 20!B;9!O;L;24!B;O;L;20!B;3!O;3!B;3!O;L;22!B;O;3!B;O;L;L;21!B;3!O;B;3!O 1932 L;21!B;3!O;B;3!O;L;20!B;O;B;O;O;B;O;O;B;O;L;20!B;3!O;3!B;3!O;L;21!B;O 1933 5!B;O;E 1934 OCTAL 1935 > /} 1936 1937 IFNZRO MAXFIL < /{ 1938 RMAX, DECIMAL 1939 18!B;O;8!B;L;17!B;3!O;7!B;L;12!B;3!O;4!B;2!O;6!B;L;11!B;O;2!B;3!O;2!B 1940 O;B;2!O;4!B;L;10!B;O;3!B;O;B;O;2!B;O;B;O;5!B;L;10!B;O;4!B;O;B;O;B;O;B 1941 O;B;2!O;2!B;L;12!B;O;4!B;O;B;O;3!B;2!O;2!B;L;4!O;5!B;O;B;O;4!B;O;3!B;O 1942 B;3!O;2!B;L;O;3!B;2!O;B;O;B;3!O;B;2!O;9!B;2!O;B;L;O;5!B;2!O;5!B;O;13!B 1943 L;B;O;2!B;2!O;B;O;2!B;O;2!B;O;B;2!O;10!B;L;7!B;O;B;O;B;O;B;O;B;O;B;O 1944 5!B;4!O;L;B;O;2!B;2!O;B;O;2!B;O;2!B;O;2!B;2!O;B;O;B;2!O;3!B;O;L;O;5!B 1945 2!O;3!B;O;B;O;B;O;3!B;2!O;5!B;O;L;O;3!B;2!O;B;O;B;2!O;2!B;O;2!B;O;2!B 1946 O;B;2!O;2!B;O;B;L;4!O;5!B;O;B;O;B;O;B;O;B;O;B;O;7!B;L;10!B;2!O;B;O;2!B 1947 O;2!B;O;B;2!O;2!B;O;B;L;13!B;O;5!B;2!O;5!B;O;L;B;2!O;9!B;2!O;B;3!O;B;O 1948 B;2!O;3!B;O;L;2!B;3!O;B;O;3!B;O;4!B;O;B;O;5!B;4!O;L;2!B;2!O;3!B;O;B;O 1949 4!B;O;12!B;L;2!B;2!O;B;O;B;O;B;O;B;O;4!B;O;10!B;L;5!B;O;B;O;2!B;O;B;O 1950 3!B;O;10!B;L;4!B;2!O;B;O;2!B;3!O;2!B;O;11!B;L;6!B;2!O;4!B;3!O;12!B;L 1951 7!B;3!O;17!B;L;8!B;O;E 1952 OCTAL 1953 > /} 1954 1955 IFNZRO SPCRAK < /{ 1956 RSPCRK, DECIMAL 1957 11!B;2!O;5!B;4!O;L;9!B;2!O;B;2!O;3!B;O;3!B;O;L;9!B;4!O;8!B;O;L;10!B 1958 2!O;5!B;O;2!B;O;B;2!L;8!B;O;13!B;L;7!B;2!O;8!B;2!O;3!B;L;6!B;O;9!B;O 1959 2!B;O;2!B;L;7!B;5!O;4!B;O;2!B;O;2!B;L;8!B;4!O;3!B;2!O;B;2!O;2!B;L;11!B 1960 O;4!B;2!O;4!B;4!L;18!B;4!O;L;O;2!B;O;13!B;O;3!B;O;L;4!B;O;16!B;O;L;O 1961 3!B;O;12!B;O;2!B;O;B;L;B;4!O;E 1962 OCTAL 1963 > /} 1964 1965 IFNZRO BAKRAK < /{ 1966 RBAKRK, DECIMAL 1967 3!B;O;15!B;L;2!B;3!O;14!B;L;B;2!O;B;O;5!B;O;8!B;L;B;3!O;5!B;3!O;7!B;L 1968 2!B;2!O;4!B;O;2!B;2!O;3!B;3!O;L;8!B;3!O;4!B;O;2!B;O;L;18!B;O;L;18!B;O 1969 L;18!B;O;L;2!B;3!O;12!B;O;B;L;2!B;O;2!B;O;13!B;L;2!B;O;16!B;L;2!B;O 1970 16!B;L;3!B;O;15!B;7!L;3!O;16!B;L;O;2!B;O;11!B;O;3!B;L;O;13!B;3!O;2!B;L 1971 O;12!B;2!O;B;O;2!B;L;O;12!B;3!O;3!B;L;B;O;12!B;2!O;E 1972 OCTAL 1973 > /} 1974 1975 IFNZRO KAREL < /{ 1976 RKAREL, DECIMAL 1977 53!B;O;113!B;L;53!B;O;B;O;111!B;L;53!B;2!O;112!B;2!L;17!B;O;B;O;147!B 1978 L;18!B;2!O;147!B;L;18!B;O;45!B;O;102!B;L;62!B;2!O;103!B;L;63!B;2!O 1979 102!B;8!L;38!B;O;128!B;L;38!B;O;B;O;42!B;O;51!B;2!O;6!B;2!O;22!B;L 1980 38!B;2!O;41!B;2!O;47!B;2!O;2!B;O;2!B;O;4!B;O;2!B;O;2!B;2!O;17!B;L;82!B 1981 2!O;45!B;O;2!B;2!O;B;2!O;6!B;2!O;B;2!O;2!B;O;16!B;L;127!B;2!O;B;3!O 1982 14!B;3!O;B;2!O;14!B;L;126!B;O;4!B;O;16!B;O;4!B;O;13!B;L;129!B;O;20!B;O 1983 16!B;L;6!B;O;B;O;158!B;L;7!B;2!O;33!B;O;82!B;O;3!B;O;20!B;O;3!B;O;12!B 1984 L;7!B;O;32!B;2!O;84!B;3!O;22!B;3!O;13!B;L;41!B;2!O;124!B;3!L;120!B;O 1985 38!B;O;7!B;L;117!B;O;3!B;O;36!B;O;3!B;O;4!B;L;42!B;O;73!B;O;4!B;O;36!B 1986 O;4!B;O;3!B;L;B;O;40!B;O;B;O;71!B;O;4!B;O;36!B;O;4!B;O;3!B;L;2!B;O 1987 39!B;2!O;71!B;O;2!B;O;B;O;38!B;O;B;O;2!B;O;2!B;L;3!O;111!B;O;B;O;46!B 1988 O;B;O;B;L;114!B;O;B;2!O;44!B;2!O;B;O;B;L;115!B;2!O;46!B;2!O;2!B;L 1989 115!B;O;48!B;O;2!B;L;69!B;3!O;42!B;O;50!B;O;B;L;69!B;O;43!B;O;B;O;48!B 1990 O;B;O;L;62!B;O;7!B;O;42!B;O;B;O;48!B;O;B;O;L;61!B;2!O;51!B;O;50!B;O;B 1991 L;54!B;3!O;4!B;O;B;O;103!B;L;32!B;O;21!B;O;112!B;L;33!B;O;21!B;O;111!B 1992 L;24!B;O;B;O;4!B;3!O;133!B;L;25!B;2!O;87!B;O;50!B;O;B;L;17!B;O;7!B;O 1993 87!B;O;B;O;48!B;O;B;O;L;18!B;O;94!B;O;B;O;48!B;O;B;O;L;16!B;3!O;95!B;O 1994 50!B;O;B;L;115!B;O;48!B;O;2!B;L;115!B;2!O;46!B;2!O;2!B;L;114!B;O;B;2!O 1995 44!B;2!O;B;O;B;L;85!B;3!O;26!B;O;B;O;46!B;O;B;O;B;L;44!B;2!O;39!B;O 1996 29!B;O;2!B;O;B;O;38!B;O;B;O;2!B;O;2!B;L;43!B;O;B;O;40!B;O;29!B;O;4!B;O 1997 36!B;O;4!B;O;3!B;L;45!B;O;70!B;O;4!B;O;36!B;O;4!B;O;3!B;L;117!B;O;3!B 1998 O;36!B;O;3!B;O;4!B;L;120!B;O;38!B;O;7!B;3!L;45!B;2!O;120!B;L;46!B;2!O 1999 32!B;O;45!B;3!O;22!B;3!O;13!B;L;45!B;O;33!B;2!O;44!B;O;3!B;O;20!B;O 2000 3!B;O;12!B;L;79!B;O;B;O;85!B;L;129!B;O;20!B;O;16!B;L;126!B;O;4!B;O 2001 16!B;O;4!B;O;13!B;L;127!B;2!O;B;3!O;14!B;3!O;B;2!O;14!B;L;4!B;2!O 2002 123!B;O;2!B;2!O;B;2!O;6!B;2!O;B;2!O;2!B;O;16!B;L;5!B;2!O;41!B;2!O;80!B 2003 2!O;2!B;O;2!B;O;4!B;O;2!B;O;2!B;2!O;17!B;L;4!B;O;42!B;O;B;O;85!B;2!O 2004 6!B;2!O;22!B;L;49!B;O;117!B;8!L;23!B;2!O;142!B;L;24!B;2!O;141!B;L;23!B 2005 O;45!B;O;97!B;L;68!B;2!O;97!B;L;68!B;O;B;O;96!B;2!L;33!B;2!O;132!B;L 2006 32!B;O;B;O;132!B;L;34!B;O;E 2007 OCTAL 2008 > /} 2009 > /} 2010 2011 IFNZRO PARSER < /{ 2012 RPARSE, 0 2013 > /} 2014 2015 *6600 2016 /CHECK FOR CONTROL CHARACTERS 2017 006600 0000 CHKCTL, 0 2018 006601 6036 KRB /READ IT 2019 006602 0377 AND (177 /KEEP BOTTOM 7 BITS 2020 IFNZRO OS8 < /{ 2021 006603 3032 DCA TEMP /STORE IT 2022 006604 1032 TAD TEMP 2023 006605 1376 TAD (-3 /IS IT A CTRL-C? 2024 006606 7450 SNA 2025 006607 5214 JMP EXIT /YES, EXIT TO OS/8 2026 006610 1375 TAD (-25+3 /IS IT A CTRL-U? 2027 > /} 2028 IFZERO OS8 < /{ 2029 TAD (-25 /IS IT A CTRL-U? 2030 > /} 2031 006611 7650 SNA CLA 2032 006612 5774 JMP START /YES, RESTART THE PROGRAM 2033 006613 5600 JMP I CHKCTL /NOT A CTRL-C OR CTRL-U 2034 2035 IFNZRO OS8 < /{ 2036 006614 4247 EXIT, JMS RSTOS8 /PUT THINGS BACK THE WAY WE FOUND IT 2037 006615 5773 JMP I (7600 /AND RETURN TO OS/8 2038 2039 006616 0000 SAVOS8, 0 2040 006617 7200 CLA /HAS THE SYSTEM ALREADY BEEN SAVED? 2041 006620 1322 TAD OS8SAV 2042 006621 7440 SZA 2043 006622 5616 JMP I SAVOS8 /YES, RETURN 2044 006623 4270 JMS COPY /NO, DO THE COPIES 2045 006624 0000 0 /COPY FROM 07600 2046 006625 7577 7600-1 2047 006626 0000 0 /TO 07400 2048 006627 7377 7400-1 2049 006630 4270 JMS COPY 2050 006631 0010 10 /COPY FROM 17600 2051 006632 7577 7600-1 2052 006633 0000 0 /TO 07200 2053 006634 7177 7200-1 2054 /MORE THAN 8K AND USING FAST RASTER? 2055 IFNZRO MEMORY-1 < /{ 2056 IFNZRO VC8E&NOSTOR&FASTR < /{ 2057 JMS COPY 2058 20 /COPY FROM 27600 2059 7600-1 2060 0 /TO 07000 2061 7000-1 2062 > /} 2063 > /} 2064 006635 2322 ISZ OS8SAV /THE SYSTEM HAS BEEN SAVED 2065 2066 006636 1372 TAD (7764 /PUT THE MASK TABLE AT 7764 2067 006637 3020 DCA ADDR 2068 006640 7330 CLA CLL CML RAR /AC=4000 2069 006641 3420 DCA I ADDR /SAVE IT 2070 006642 1420 TAD I ADDR /GET IT 2071 006643 7110 CLL RAR /ROTATE IT 2072 006644 2020 ISZ ADDR /ANY MORE TO DO? 2073 006645 5241 JMP .-4 /NOPE 2074 2075 006646 5616 JMP I SAVOS8 2076 2077 006647 0000 RSTOS8, 0 2078 006650 7200 CLA /HAS THE SYSTEM ACTUALLY BEEN SAVED? 2079 006651 1322 TAD OS8SAV 2080 006652 7450 SNA 2081 006653 5647 JMP I RSTOS8 /NOPE, RETURN 2082 006654 4270 JMS COPY /YES, COPY BACK 2083 006655 0000 0 /COPY FROM 07400 2084 006656 7377 7400-1 2085 006657 0000 0 /TO 07600 2086 006660 7577 7600-1 2087 006661 4270 JMS COPY 2088 006662 0000 0 /COPY FROM 07200 2089 006663 7177 7200-1 2090 006664 0010 10 /TO 17600 2091 006665 7577 7600-1 2092 /MORE THAN 8K AND USING FAST RASTER? 2093 IFNZRO MEMORY-1 < /{ 2094 IFNZRO VC8E&NOSTOR&FASTR < /{ 2095 JMS COPY 2096 0 /COPY FROM 07000 2097 7000-1 2098 20 /TO 27600 2099 7600-1 2100 > /} 2101 > /} 2102 006666 3322 DCA OS8SAV /THE SYSTEM HAS BEEN RESTORED 2103 006667 5647 JMP I RSTOS8 2104 2105 /BLOCK PAGE COPY BETWEEN FIELDS 2106 /ARGUMENTS FOLLOW JMS: 2107 /FROM FIELD 2108 /FROM ADDR MINUS 1 2109 /TO FIELD 2110 /TO ADDR MINUS 1 2111 006670 0000 COPY, 0 2112 006671 7200 CLA 2113 006672 1373 TAD (-200 2114 006673 3031 DCA CNT /JUST COPY ONE PAGE 2115 006674 1670 TAD I COPY /GET FROM FIELD 2116 006675 1316 TAD CDFI 2117 006676 3312 DCA FRMCDF /SELF MODIFY FOR FIELD CHANGES 2118 006677 2270 ISZ COPY 2119 006700 1670 TAD I COPY /GET FROM ADDR MINUS 1 2120 006701 3011 DCA CPTR1 2121 006702 2270 ISZ COPY 2122 006703 1670 TAD I COPY /GET TO FIELD 2123 006704 1316 TAD CDFI 2124 006705 3314 DCA TOCDF /SELF MODIFY FOR FIELD CHANGES 2125 006706 2270 ISZ COPY 2126 006707 1670 TAD I COPY /GET TO ADDR MINUS 1 2127 006710 3012 DCA CPTR2 2128 006711 2270 ISZ COPY /POINT TO RETURN 2129 2130 006712 7402 FRMCDF, HLT /BETTER BE A CDF! 2131 006713 1411 TAD I CPTR1 /GET DATA 2132 006714 7402 TOCDF, HLT /BETTER BE A CDF! 2133 006715 3412 DCA I CPTR2 /SAVE DATA 2134 006716 6201 CDFI, CDF 0 2135 006717 2031 ISZ CNT 2136 006720 5312 JMP .-6 /DO THE LOOP 2137 006721 5670 JMP I COPY /ALL DONE 2138 2139 006722 0000 OS8SAV, 0 2140 > /} 2141 2142 006772 7764 $ 006773 7600 006774 0202 006775 7756 006776 7775 006777 0177 000176 0007 000177 0143 ACORN 0000 ADDR 0020 ASCOUT 1731 unreferenced B 6000 BAKRAK 0000 BIRTH 0657 BITLP 0671 BOTPTR 0026 BREED 0000 CACHE1 0040 CACHE2 0060 CACHE3 0100 CALCXY 1216 unreferenced CALCY 1231 unreferenced CDFI 6716 CHKCTL 6600 CHKLIF 0400 CHKROW 0701 CNT 0031 COPY 6670 CPTR1 0011 CPTR2 0012 CRLF 2214 unreferenced CURBIT 0021 CURDAT 1531 unreferenced CURSTA 1530 DABADD 2000 DABASC 1674 DABDUN 1667 unreferenced DABLP 1614 DEATH 0650 DFIELD 0010 DIEHAR 0000 DILE 6056 unreferenced DILX 6053 DILY 6054 DIRE 6057 unreferenced DISD 6052 DIVDUN 1422 DIXY 6055 DOAND 0167 DOCALC 0634 DOCRLF 2200 DODRAW 1215 DOLIFE 0403 DOROT 0120 DRWWRD 1262 DUBDAB 1600 DUBPTR 1723 unreferenced E 0000 ERR 0143 EXIT 6614 FASTR 0000 FILLER 0000 FINAL 0717 FIVEL 0152 FIVER 0164 FOURL 0146 FOURR 0160 FRMCDF 6712 GENCNT 0173 GENTXT 2054 unreferenced GLDERS 0000 GOSPER 0000 HWSS 0000 INCGEN 0321 INCLIF 0307 INIT 2217 JMPLOC 0172 KAREL 0000 L 1000 LIFCNT 0027 LIFDET 0023 LIFTXT 2063 unreferenced MAXFIL 0000 MEMORY 0007 MIDPTR 0025 MWSS 0000 NEXTLN 1516 NEXTX 1254 NLBIT 0474 NOLIFE 0713 NOPRT 0000 NOSTOR 0001 NOTDUN 0707 NOTEDG 0600 NOTFIN 0726 NWRDLF 0631 NXTBIT 1247 NXTRLE 1401 O 4000 ONEL 0154 unreferenced ONER 0166 OS8 0001 OS8SAV 6722 PARSER 0000 PRIDX 0010 PRNTST 2034 PRTDOT 0000 unreferenced PUTC 2133 PUTCSX 2124 PUTS2 2073 PUTSIX 2103 RASERA 1263 RASLP 1205 RASTER 1200 RCHECK 1513 RCONT 1476 RLE 1400 RLECNT 1534 RLEDUN 1526 RLEPTR 0013 RLIVE 1464 RLOOP 1455 RLYNPR 0000 RMAIN 1436 ROT 0171 ROTTBL 0142 RPENTO 0001 RRPENT 2400 RSCONT 1212 RSTGEN 0326 RSTLIF 0314 RSTOS8 6647 RSTRSC 0000 SADDR 1532 SAME 0644 SAVOS8 6616 SBIT 1533 SCRATC 1724 unreferenced SHRTCT 1261 unreferenced SIMHVC 0000 SIXL 0145 SIXR 0157 SLODTH 0000 unreferenced SLOWR 0001 SPCRAK 0000 START 0202 STARTX 0034 STARTY 0035 STATS 0001 STORE 0000 TAB 2072 unreferenced TEMP 0032 THREEL 0153 unreferenced THREER 0165 TLS 7000 TMPPTR 0033 TOCDF 6714 TOPPTR 0024 TOTAL 0022 TSF 7410 TWOL 0147 unreferenced TWOR 0161 UCACHE 1000 USETTY 0000 VC8E 0001 VT100 0000 unreferenced WRDCOL 0020 WRDLP 1240 X 0036 Y 0037