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 00000 0000 0 241 00001 0001 1 242 00002 0001 1 243 00003 0002 2 244 00004 0001 1 245 00005 0002 2 246 00006 0002 2 247 00007 0003 3 248 249 *10 250 00010 0000 PRIDX, 0 251 00011 0000 CPTR1, 0 252 00012 0000 CPTR2, 0 253 00013 0000 RLEPTR, 0 254 IFNZRO VC8E&NOSTOR&FASTR < /{ 255 FSTPTR, 0 256 > /} 257 258 *20 259 /CURRENT WORD IN BITMAP 260 00020 0000 ADDR, 0 261 262 /CURRENT BIT IN WORD 263 00021 0000 CURBIT, 0 264 265 /NEIGHBORHOOD TOTAL 266 00022 0000 TOTAL, 0 267 268 /LIFE DETECTED IN CACHE 269 00023 0000 LIFDET, 0 270 271 /CACHE POINTERS 272 00024 0000 TOPPTR, 0 273 00025 0000 MIDPTR, 0 274 00026 0000 BOTPTR, 0 275 276 /STATISTICS 277 IFNZRO STATS < /{ 278 00027 0000 LIFCNT, 0 279 00030 0000 0 280 > /} 281 282 /MISC STUFF 283 00031 0000 CNT, 0 284 00032 0000 TEMP, 0 285 00033 0000 TMPPTR, 0 286 287 /STUFF FOR VC8E 288 IFNZRO VC8E < /{ 289 00034 7200 STARTX, -600 290 00035 1000 STARTY, 1000 291 00036 0000 X, 0 292 00037 0000 Y, 0 293 > /} 294 295 /CACHE 296 *40 297 00040 0000 CACHE1, ZBLOCK WRDCOL 00041 0000 00042 0000 00043 0000 00044 0000 00045 0000 00046 0000 00047 0000 00050 0000 00051 0000 00052 0000 00053 0000 00054 0000 00055 0000 00056 0000 00057 0000 298 00060 0000 CACHE2, ZBLOCK WRDCOL 00061 0000 00062 0000 00063 0000 00064 0000 00065 0000 00066 0000 00067 0000 00070 0000 00071 0000 00072 0000 00073 0000 00074 0000 00075 0000 00076 0000 00077 0000 299 00100 0000 CACHE3, ZBLOCK WRDCOL 00101 0000 00102 0000 00103 0000 00104 0000 00105 0000 00106 0000 00107 0000 00110 0000 00111 0000 00112 0000 00113 0000 00114 0000 00115 0000 00116 0000 00117 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 00120 0000 DOROT, 0 305 00121 3171 DCA ROT 306 TAD (ROTTBL+1 page zero ^ 00122 1177 307 00123 1021 TAD CURBIT 308 00124 3172 DCA JMPLOC 309 00125 1171 TAD ROT 310 00126 5572 JMP I JMPLOC 311 /ROTATE TABLE 312 00127 5143 JMP ERR 313 00130 5146 JMP FOURL 314 00131 5152 JMP FIVEL 315 00132 5145 JMP SIXL 316 00133 5157 JMP SIXR 317 00134 5164 JMP FIVER 318 00135 5160 JMP FOURR 319 00136 5165 JMP THREER 320 00137 5161 JMP TWOR 321 00140 5166 JMP ONER 322 00141 5167 JMP DOAND 323 00142 5143 ROTTBL, JMP ERR 324 325 00143 7402 ERR, HLT 326 00144 5520 JMP I DOROT 327 328 00145 7006 SIXL, RTL 329 00146 7006 FOURL, RTL 330 00147 7006 TWOL, RTL 331 AND (7 page zero ^ 00150 0176 332 00151 5520 JMP I DOROT 333 334 00152 7006 FIVEL, RTL 335 00153 7006 THREEL, RTL 336 00154 7004 ONEL, RAL 337 AND (7 page zero ^ 00155 0176 338 00156 5520 JMP I DOROT 339 340 00157 7012 SIXR, RTR 341 00160 7012 FOURR, RTR 342 00161 7012 TWOR, RTR 343 AND (7 page zero ^ 00162 0176 344 00163 5520 JMP I DOROT 345 346 00164 7012 FIVER, RTR 347 00165 7012 THREER, RTR 348 00166 7010 ONER, RAR 349 DOAND, AND (7 page zero ^ 00167 0176 350 00170 5520 JMP I DOROT 351 352 00171 0000 ROT, 0 353 00172 0000 JMPLOC, 0 354 355 /GENERATION COUNTER 356 IFNZRO STATS < /{ 357 00173 0000 GENCNT, 0 358 00174 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 00176 0007 *200 00177 0143 381 IFNZRO OS8 < /{ 382 JMS SAVOS8 /SAVE OS/8 off page ^ 00200 4777 383 > /} 384 00201 6040 6040 /CLEAR TTY FLAG 385 START, 386 IFNZRO STATS < /{ 387 00202 4314 JMS RSTLIF /RESET LIFE COUNTER 388 00203 4326 JMS RSTGEN /RESET CYCLE COUNTER 389 > /} 390 JMS INIT /INITIALIZE THE BITMAP off page ^ 00204 4776 391 IFNZRO STATS < /{ 392 JMS PRNTST /PRINT INITIAL STATISTICS off page ^ 00205 4775 393 00206 4314 JMS RSTLIF /RESET LIFE COUNTER 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 00207 7200 CLA /INITIALIZE CURRENT BIT AND ADDRESS 409 00210 1374 TAD (-14 410 00211 3021 DCA CURBIT /CURBIT = -14 (AKA BIT 0) 411 00212 3020 DCA ADDR /ADDR = 0 412 00213 3023 DCA LIFDET 413 00214 3032 DCA TEMP 414 00215 1373 TAD (CACHE1 /SET UP THE CACHE 415 00216 3024 DCA TOPPTR 416 00217 1372 TAD (CACHE2 417 00220 3025 DCA MIDPTR 418 00221 1371 TAD (CACHE3 419 00222 3026 DCA BOTPTR 420 421 00223 1370 TAD (-WRDCOL-1 /COPY INITIAL CACHE 422 00224 3011 DCA CPTR1 423 00225 1367 TAD (CACHE1-1 424 00226 3012 DCA CPTR2 425 00227 1366 TAD (-WRDCOL /COPYING ONE ROW 426 00230 3031 DCA CNT 427 00231 6211 CDF DFIELD 428 00232 1411 TAD I CPTR1 429 00233 6201 CDF 0 430 00234 7440 SZA 431 00235 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 432 00236 3412 DCA I CPTR2 433 00237 2031 ISZ CNT 434 00240 5231 JMP .-7 435 436 00241 1032 TAD TEMP /ANY LIFE? 437 00242 7640 SZA CLA 438 00243 7001 IAC /YES 439 00244 1023 TAD LIFDET 440 00245 7104 CLL RAL 441 00246 3023 DCA LIFDET 442 00247 3032 DCA TEMP 443 444 00250 1366 TAD (-WRDCOL /COPYING ONE ROW TO WHERE WE LEFT OFF 445 00251 3031 DCA CNT 446 00252 6211 CDF DFIELD 447 00253 1411 TAD I CPTR1 448 00254 6201 CDF 0 449 00255 7440 SZA 450 00256 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 451 00257 3412 DCA I CPTR2 452 00260 2031 ISZ CNT 453 00261 5252 JMP .-7 454 455 00262 1032 TAD TEMP /ANY LIFE? 456 00263 7640 SZA CLA 457 00264 7001 IAC /YES 458 00265 1023 TAD LIFDET 459 00266 7104 CLL RAL 460 00267 3023 DCA LIFDET 461 00270 3032 DCA TEMP 462 463 00271 1366 TAD (-WRDCOL /COPYING ONE ROW TO WHERE WE LEFT OFF 464 00272 3031 DCA CNT 465 00273 6211 CDF DFIELD 466 00274 1411 TAD I CPTR1 467 00275 6201 CDF 0 468 00276 7440 SZA 469 00277 2032 ISZ TEMP /INCREMENT IF LIFE DETECTED 470 00300 3412 DCA I CPTR2 471 00301 2031 ISZ CNT 472 00302 5273 JMP .-7 473 474 00303 1032 TAD TEMP /ANY LIFE? 475 00304 7640 SZA CLA 476 00305 2023 ISZ LIFDET /YES 477 JMP CHKLIF /JUMP TO THE MAIN LOOP off page ^ 00306 5765 478 479 IFNZRO STATS < /{ 480 /INCREMENT LIFE COUNTER FOR STATISTICS 481 00307 0000 INCLIF, 0 482 00310 2027 ISZ LIFCNT /INCREMENT BOTTOM 12 483 00311 5707 JMP I INCLIF /NO OVERFLOW 484 00312 2030 ISZ LIFCNT+1 /OVERFLOW 485 00313 5707 JMP I INCLIF /OVERFLOW ON TOP 12 WOULD BE A SERIOUS PROBLEM! 486 487 /RESET LIFE COUNTER FOR STATISTICS 488 00314 0000 RSTLIF, 0 489 00315 7200 CLA 490 00316 3027 DCA LIFCNT 491 00317 3030 DCA LIFCNT+1 492 00320 5714 JMP I RSTLIF 493 494 /INCREMENT CYCLE COUNTER FOR STATISTICS 495 00321 0000 INCGEN, 0 496 00322 2173 ISZ GENCNT /INCREMENT BOTTOM 12 497 00323 5721 JMP I INCGEN /NO OVERFLOW 498 00324 2174 ISZ GENCNT+1 /OVERFLOW 499 00325 5721 JMP I INCGEN /OVERFLOW ON TOP 12 WOULD BE A SERIOUS PROBLEM! 500 501 /RESET CYCLE COUNTER FOR STATISTICS 502 00326 0000 RSTGEN, 0 503 00327 7200 CLA 504 00330 3173 DCA GENCNT 505 00331 3174 DCA GENCNT+1 506 00332 5726 JMP I RSTGEN 507 > /} 508 509 00365 0400 PAGE 00366 7760 00367 0037 00370 7757 00371 0100 00372 0060 00373 0040 00374 7764 00375 2034 00376 2217 00377 6616 510 511 00400 1023 CHKLIF, TAD LIFDET /ANY LIFE IN THE CACHE? 512 00401 7650 SNA CLA 513 JMP NOLIFE /NOPE, SHORTCUT! off page ^ 00402 5777 514 00403 1021 DOLIFE, TAD CURBIT /ARE WE AT A WORD EDGE? 515 00404 1376 TAD (14 /CHECK LEFT WORD EDGE 516 00405 7440 SZA 517 00406 5274 JMP NLBIT /NO, NOT THE LEFT WORD EDGE 518 00407 1424 TAD I TOPPTR /YES, GET TOP WORD 519 00410 7450 SNA 520 00411 5217 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 521 00412 7006 RTL /GET TOP TWO BITS DOWN LOW 522 00413 7004 RAL 523 00414 0375 AND (3 /JUST KEEP THE TWO 524 00415 3032 DCA TEMP 525 00416 1432 TAD I TEMP /AND COUNT THEM 526 00417 3022 DCA TOTAL 527 00420 1425 TAD I MIDPTR /DO THE SAME FOR MIDDLE 528 00421 7450 SNA 529 00422 5232 JMP .+10 /NOTHING TO DO IF WORD IS ZERO 530 00423 7006 RTL 531 00424 7004 RAL 532 00425 0375 AND (3 533 00426 3032 DCA TEMP 534 00427 1432 TAD I TEMP 535 00430 1022 TAD TOTAL 536 00431 3022 DCA TOTAL 537 00432 1426 TAD I BOTPTR /DO THE SAME FOR BOTTOM 538 00433 7450 SNA 539 00434 5244 JMP .+10 /NOTHING TO DO IF WORD IS ZERO 540 00435 7006 RTL 541 00436 7004 RAL 542 00437 0375 AND (3 543 00440 3032 DCA TEMP 544 00441 1432 TAD I TEMP 545 00442 1022 TAD TOTAL 546 00443 3022 DCA TOTAL 547 00444 7040 CMA /STILL MISSING THE LEFT COLUMN 548 00445 1020 TAD ADDR /GET WORD TO OUR LEFT, WRAP AS NECESSARY 549 00446 0374 AND (WRDCOL-1 550 00447 1373 TAD (CACHE1 /DON'T CARE ABOUT ORDER OF BITS ANYWAYS! 551 00450 3033 DCA TMPPTR 552 00451 7001 IAC 553 00452 0433 AND I TMPPTR 554 00453 7640 SZA CLA 555 00454 2022 ISZ TOTAL 556 00455 1372 TAD (WRDCOL /DO NEXT CACHED ROW 557 00456 1033 TAD TMPPTR 558 00457 3033 DCA TMPPTR 559 00460 7001 IAC 560 00461 0433 AND I TMPPTR 561 00462 7640 SZA CLA 562 00463 2022 ISZ TOTAL 563 00464 1372 TAD (WRDCOL /AND THE LAST CACHED ROW 564 00465 1033 TAD TMPPTR 565 00466 3033 DCA TMPPTR 566 00467 7001 IAC 567 00470 0433 AND I TMPPTR 568 00471 7640 SZA CLA 569 00472 2022 ISZ TOTAL 570 JMP DOCALC /ALL DONE FOR NOW off page ^ 00473 5771 571 572 00474 1370 NLBIT, TAD (-13 /HOW ABOUT RIGHT WORD EDGE? 573 00475 7640 SZA CLA 574 JMP NOTEDG /NO, NOT AT EITHER WORD EDGE off page ^ 00476 5767 575 00477 1424 TAD I TOPPTR /YES, GET TOP WORD 576 00500 7450 SNA 577 00501 5305 JMP .+4 /NOTHING TO DO IF WORD IS ZERO 578 00502 0375 AND (3 /JUST KEEP THE TWO BOTTOM BITS 579 00503 3032 DCA TEMP 580 00504 1432 TAD I TEMP /AND COUNT THEM 581 00505 3022 DCA TOTAL 582 00506 1425 TAD I MIDPTR /DO THE SAME FOR MIDDLE 583 00507 7450 SNA 584 00510 5316 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 585 00511 0375 AND (3 586 00512 3032 DCA TEMP 587 00513 1432 TAD I TEMP 588 00514 1022 TAD TOTAL 589 00515 3022 DCA TOTAL 590 00516 1426 TAD I BOTPTR /DO THE SAME FOR BOTTOM 591 00517 7450 SNA 592 00520 5326 JMP .+6 /NOTHING TO DO IF WORD IS ZERO 593 00521 0375 AND (3 594 00522 3032 DCA TEMP 595 00523 1432 TAD I TEMP 596 00524 1022 TAD TOTAL 597 00525 3022 DCA TOTAL 598 00526 7001 IAC /STILL MISSING THE RIGHT COLUMN 599 00527 1020 TAD ADDR /GET WORD TO OUR RIGHT, WRAP AS NECESSARY 600 00530 0374 AND (WRDCOL-1 601 00531 1373 TAD (CACHE1 /DON'T CARE ABOUT ORDER OF BITS ANYWAYS! 602 00532 3033 DCA TMPPTR 603 00533 1433 TAD I TMPPTR 604 00534 7710 SPA CLA 605 00535 2022 ISZ TOTAL 606 00536 1372 TAD (WRDCOL /DO NEXT CACHED ROW 607 00537 1033 TAD TMPPTR 608 00540 3033 DCA TMPPTR 609 00541 1433 TAD I TMPPTR 610 00542 7710 SPA CLA 611 00543 2022 ISZ TOTAL 612 00544 1372 TAD (WRDCOL /AND THE LAST CACHED ROW 613 00545 1033 TAD TMPPTR 614 00546 3033 DCA TMPPTR 615 00547 1433 TAD I TMPPTR 616 00550 7710 SPA CLA 617 00551 2022 ISZ TOTAL 618 JMP DOCALC /ALL DONE FOR NOW off page ^ 00552 5771 619 620 00567 0600 PAGE 00570 7765 00571 0634 00572 0020 00573 0040 00574 0017 00575 0003 00576 0014 00577 0713 621 622 00600 1424 NOTEDG, TAD I TOPPTR /GET TOP WORD 623 00601 7450 SNA 624 00602 1425 TAD I MIDPTR /GET MIDDLE WORD 625 00603 7450 SNA 626 00604 1426 TAD I BOTPTR /GET BOTTOM WORD 627 00605 7650 SNA CLA /ANY LIFE? 628 00606 5231 JMP NWRDLF /NO, NO LIFE IN CURRENT WORD AREA 629 00607 1424 TAD I TOPPTR /GET TOP WORD 630 00610 4120 JMS DOROT /ROTATE AS NECESSARY 631 00611 3032 DCA TEMP /SAVE IT 632 00612 1432 TAD I TEMP /AND COUNT THE BITS 633 00613 3022 DCA TOTAL /SAVE THAT AS TOTAL SO FAR 634 00614 1425 TAD I MIDPTR /GET MIDDLE WORD 635 00615 4120 JMS DOROT 636 00616 3032 DCA TEMP 637 00617 1432 TAD I TEMP 638 00620 1022 TAD TOTAL /ADD TO TOTAL 639 00621 3022 DCA TOTAL 640 00622 1426 TAD I BOTPTR /GET BOTTOM WORD 641 00623 4120 JMS DOROT 642 00624 3032 DCA TEMP 643 00625 1432 TAD I TEMP 644 00626 1022 TAD TOTAL /ADD TO TOTAL 645 00627 3022 DCA TOTAL 646 00630 5234 JMP DOCALC 647 648 00631 7040 NWRDLF, CMA /SKIP TO LAST BIT OF WORD 649 00632 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 JMP DOLIFE off page ^ 00633 5777 667 668 00634 1022 DOCALC, TAD TOTAL 669 00635 1376 TAD (-3 670 00636 7450 SNA 671 00637 5257 JMP BIRTH /EXACTLY 3 672 00640 1375 TAD (-1 673 00641 7650 SNA CLA 674 00642 5244 JMP SAME /EXACTLY 4 675 00643 5250 JMP DEATH /OTHERWISE... :( 676 677 00644 1421 SAME, TAD I CURBIT /GET MASK 678 00645 0425 AND I MIDPTR /AND WITH CURRENT WORD 679 00646 7640 SZA CLA /IS IT ALIVE OR DEAD? 680 00647 5257 JMP BIRTH 681 682 DEATH, 683 IFZERO VC8E+NOPRT+RLYNPR < /{ 684 JMS PRTDTH /PRINT DEATH (AWW...) 685 > /} 686 00650 1421 TAD I CURBIT /CLEAR THE BIT IN THE BITMAP 687 00651 7040 CMA 688 00652 6211 CDF DFIELD 689 00653 0420 AND I ADDR 690 00654 3420 DCA I ADDR 691 00655 6201 CDF 0 692 00656 5271 JMP BITLP 693 694 BIRTH, 695 IFNZRO STATS < /{ 696 JMS INCLIF /INCREMENT LIFE COUNTER off page ^ 00657 4774 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 00660 1421 TAD I CURBIT /GET MASK 708 00661 7040 CMA 709 00662 6211 CDF DFIELD 710 00663 0420 AND I ADDR /COMPLEMENT MASK AND 'AND' IT WITH CURRENT WORD 711 00664 6201 CDF 0 712 00665 1421 TAD I CURBIT /ADD IN LIVE CELL 713 00666 6211 CDF DFIELD 714 00667 3420 DCA I ADDR /SAVE IT 715 00670 6201 CDF 0 716 717 00671 2021 BITLP, ISZ CURBIT /NEXT BIT 718 JMP DOLIFE /NOTHING ELSE TO DO HERE! off page ^ 00672 5777 719 00673 7200 CLA /NEED TO GO TO NEXT WORD AND RESET CURRENT BIT TO -14 720 00674 1373 TAD (-14 721 00675 3021 DCA CURBIT 722 00676 2020 ISZ ADDR /FINAL BITMAP ADDRESS? 723 00677 5301 JMP CHKROW /NO 724 00700 5317 JMP FINAL /YES 725 726 00701 1020 CHKROW, TAD ADDR /END OF ROW? 727 00702 0372 AND (WRDCOL-1 728 00703 7640 SZA CLA 729 00704 5307 JMP NOTDUN /NO 730 IFZERO VC8E+NOPRT+RLYNPR < /{ 731 JMS DOCRLF /YES 732 > /} 733 JMS UCACHE /UPDATE CACHE off page ^ 00705 4771 734 JMP CHKLIF off page ^ 00706 5770 735 736 00707 2024 NOTDUN, ISZ TOPPTR /NEXT WORDS 737 00710 2025 ISZ MIDPTR 738 00711 2026 ISZ BOTPTR 739 JMP DOLIFE off page ^ 00712 5777 740 741 NOLIFE, 742 IFZERO VC8E+NOPRT+RLYNPR < /{ 743 JMS DTHROW /PRINT A ROW OF DEATH... 744 > /} 745 00713 1020 TAD ADDR /END OF BITMAP? 746 00714 1367 TAD (WRDCOL 747 00715 7440 SZA 748 00716 5326 JMP NOTFIN /NO 749 FINAL, 750 00717 6031 KSF /ANY CHARACTER? 751 00720 7410 SKP /NOPE 752 JMS CHKCTL /YES, CHECK FOR A CONTROL CHARACTER off page ^ 00721 4766 753 IFNZRO STATS < /{ 754 JMS INCGEN /YES, INCREMENT CYCLE COUNT off page ^ 00722 4765 755 IFZERO VC8E+NOPRT+RLYNPR < /{ 756 JMS DOCRLF /GO TO NEXT LINE IF NEEDED 757 > /} 758 JMS PRNTST /PRINT STATISTICS off page ^ 00723 4764 759 JMS RSTLIF /AND RESET LIFE COUNTER off page ^ 00724 4763 760 > /} 761 IFZERO VC8E+NOPRT+RLYNPR < /{ 762 JMS PRTHOM /GO BACK HOME 763 > /} 764 IFNZRO VC8E < /{ 765 JMS RASERA /EITHER DISPLAY A RASTER OR ERASE THE SCREEN off page ^ 00725 4762 766 > /} 767 00726 3020 NOTFIN, DCA ADDR 768 JMS UCACHE /UPDATE CACHE off page ^ 00727 4771 769 JMP CHKLIF /AND TRY AGAIN off page ^ 00730 5770 770 771 00762 1263 PAGE 00763 0314 00764 2034 00765 0321 00766 6600 00767 0020 00770 0400 00771 1000 00772 0017 00773 7764 00774 0307 00775 7777 00776 7775 00777 0403 772 773 /UPDATE CACHE 774 01000 0000 UCACHE, 0 775 01001 7200 CLA /MID TO TOP, BOT TO MID, TOP TO BOT 776 01002 1024 TAD TOPPTR 777 01003 0377 AND (-WRDCOL 778 01004 3032 DCA TEMP 779 01005 1025 TAD MIDPTR 780 01006 0377 AND (-WRDCOL 781 01007 3024 DCA TOPPTR 782 01010 1026 TAD BOTPTR 783 01011 0377 AND (-WRDCOL 784 01012 3025 DCA MIDPTR 785 01013 1032 TAD TEMP 786 01014 3026 DCA BOTPTR 787 01015 3032 DCA TEMP 788 01016 1023 TAD LIFDET /UPDATE THE LIFE DETECTION 789 01017 7104 CLL RAL 790 01020 0376 AND (6 791 01021 3023 DCA LIFDET 792 793 /NOW, ONLY REFRESH BOTTOM CACHED ROW 794 01022 7040 CMA 795 01023 1020 TAD ADDR /ADDR IS POINTING TO THE NEXT ROW IN THE BITMAP 796 01024 1375 TAD (WRDCOL /WE NEED THE NEXT ROW DOWN 797 01025 3011 DCA CPTR1 798 01026 7040 CMA 799 01027 1026 TAD BOTPTR 800 01030 3012 DCA CPTR2 801 01031 1377 TAD (-WRDCOL /COPYING ONE ROW 802 01032 3031 DCA CNT 803 01033 6211 CDF DFIELD 804 01034 1411 TAD I CPTR1 805 01035 6201 CDF 0 806 01036 7440 SZA /ANY LIFE DETECTED? 807 01037 2032 ISZ TEMP /YES 808 01040 3412 DCA I CPTR2 809 01041 2031 ISZ CNT 810 01042 5233 JMP .-7 811 812 01043 1032 TAD TEMP /ANY LIFE? 813 01044 7640 SZA CLA 814 01045 2023 ISZ LIFDET /YES 815 816 01046 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 01175 0020 PAGE 01176 0006 01177 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 01200 0000 RASTER, 0 1030 01201 7200 CLA 1031 01202 3020 DCA ADDR 1032 01203 1377 TAD (-14 1033 01204 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 01205 6211 RASLP, CDF DFIELD 1045 01206 1420 TAD I ADDR 1046 01207 6201 CDF 0 1047 01210 7440 SZA 1048 01211 5215 JMP DODRAW 1049 IFNZRO RSTRSC < /{ 1050 DCA SHRTCT /CAN'T DO SHORTCUT 1051 > /} 1052 01212 2020 RSCONT, ISZ ADDR 1053 01213 5205 JMP RASLP 1054 01214 5600 JMP I RASTER /YES, ALL DONE 1055 1056 01215 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 01216 1020 CALCXY, TAD ADDR /X = (4 * 12 * (ADDR & (WRDCOL-1))) + STARTX 1071 01217 0376 AND (WRDCOL-1 1072 01220 3036 DCA X 1073 01221 1036 TAD X 1074 01222 1036 TAD X 1075 01223 1036 TAD X 1076 01224 7106 CLL RTL 1077 01225 7106 CLL RTL 1078 01226 1034 TAD STARTX 1079 01227 6053 DILX 1080 01230 3036 DCA X 1081 1082 01231 1020 CALCY, TAD ADDR /Y = STARTY - (4 * ((ADDR SHR 4) & 0377)) 1083 01232 7012 RTR 1084 01233 0375 AND (1774 1085 01234 7041 CMA IAC 1086 01235 1035 TAD STARTY 1087 01236 6054 DILY 1088 01237 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 01240 1262 WRDLP, TAD DRWWRD 1119 01241 0421 AND I CURBIT 1120 01242 7650 SNA CLA /ARE WE PLOTTING A BIT OR NOT? 1121 01243 5247 JMP NXTBIT /NOPE, SKIP AHEAD 1122 01244 6052 DISD /YES, WAIT FOR DACS TO SETTLE 1123 01245 5244 JMP .-1 1124 01246 6055 DIXY 1125 1126 01247 2021 NXTBIT, ISZ CURBIT 1127 01250 5254 JMP NEXTX 1128 01251 1377 TAD (-14 1129 01252 3021 DCA CURBIT 1130 01253 5212 JMP RSCONT 1131 1132 01254 1036 NEXTX, TAD X /INCREMENT X BY 4 BECAUSE OF OUR SCALE 1133 01255 1374 TAD (4 1134 01256 6053 DILX 1135 01257 3036 DCA X 1136 01260 5240 JMP WRDLP 1137 1138 01261 0000 SHRTCT, 0 1139 > /} 1140 1141 01262 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 01263 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 01264 7200 CLA 1243 01265 1373 TAD (-20 /16 LOOPS 1244 01266 3031 DCA CNT 1245 01267 4200 JMS RASTER /DO THE RASTER 1246 01270 2031 ISZ CNT 1247 01271 5267 JMP .-2 1248 > /} 1249 > /} 1250 01272 5663 JMP I RASERA 1251 > /} 1252 1253 01373 7760 PAGE 01374 0004 01375 1774 01376 0017 01377 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 01400 0000 RLE, 0 1275 01401 7240 NXTRLE, CLA CMA 1276 01402 1600 TAD I RLE /GET POINTER TO RLE 1277 01403 3013 DCA RLEPTR 1278 01404 1013 TAD RLEPTR /WAS IT ZERO? 1279 01405 7040 CMA 1280 01406 7650 SNA CLA 1281 01407 5326 JMP RLEDUN 1282 01410 2200 ISZ RLE 1283 01411 1600 TAD I RLE /GET X VALUE 1284 01412 3333 DCA SBIT 1285 01413 3332 DCA SADDR 1286 01414 1333 TAD SBIT 1287 01415 1377 TAD (-14 /DIVIDE BY 12 1288 01416 7510 SPA 1289 01417 5222 JMP DIVDUN /NO MORE TO DIVIDE 1290 01420 2332 ISZ SADDR 1291 01421 5215 JMP .-4 1292 01422 3333 DIVDUN, DCA SBIT 1293 01423 1333 TAD SBIT 1294 01424 3021 DCA CURBIT 1295 01425 2200 ISZ RLE 1296 01426 1600 TAD I RLE /GET Y VALUE 1297 01427 7106 CLL RTL /MULTIPLY BY 16 1298 01430 7006 RTL 1299 01431 1332 TAD SADDR /ADD TO X OFFSET 1300 01432 3332 DCA SADDR 1301 01433 1332 TAD SADDR 1302 01434 3020 DCA ADDR 1303 01435 2200 ISZ RLE /POINT TO RETURN 1304 1305 01436 3330 RMAIN, DCA CURSTA /RESET CURRENT STATE 1306 01437 1413 TAD I RLEPTR /GET DATA 1307 01440 7450 SNA /END OF SEQUENCE? 1308 01441 5201 JMP NXTRLE /GET NEXT RLE 1309 01442 7104 CLL RAL 1310 01443 7420 SNL /NOPE, WHAT WAS IT? 1311 01444 2330 ISZ CURSTA 1312 01445 7500 SMA 1313 01446 2330 ISZ CURSTA /CURSTA = 0 FOR DEAD, 1 FOR LIFE, 2 FOR EOL 1314 01447 7010 RAR /GO BACK THE OTHER WAY 1315 01450 0376 AND (377 /KEEP JUST THE COUNT 1316 01451 7041 CMA IAC /NEGATE IT 1317 01452 7450 SNA /IF IT IS ZERO 1318 01453 7040 CMA /MAKE IT ONE 1319 01454 3334 DCA RLECNT /STORE IT 1320 1321 01455 1330 RLOOP, TAD CURSTA /LIFE OR DEATH OR EOL? 1322 01456 7450 SNA 1323 01457 5276 JMP RCONT /0 FOR DEATH 1324 01460 7010 RAR 1325 01461 7630 SZL CLA 1326 01462 5264 JMP RLIVE /1 FOR LIFE 1327 01463 5316 JMP NEXTLN /2 FOR NEXT LINE 1328 1329 RLIVE, 1330 IFNZRO STATS < /{ 1331 JMS INCLIF /INCREMENT LIFE COUNTER off page ^ 01464 4775 1332 > /} 1333 01465 1421 TAD I CURBIT /GET MASK 1334 01466 7040 CMA 1335 01467 6211 CDF DFIELD 1336 01470 0420 AND I ADDR /COMPLEMENT MASK AND 'AND' IT WITH CURRENT WORD 1337 01471 6201 CDF 0 1338 01472 1421 TAD I CURBIT /ADD IN LIVE CELL 1339 01473 6211 CDF DFIELD 1340 01474 3420 DCA I ADDR /SAVE IT 1341 01475 6201 CDF 0 1342 1343 01476 2021 RCONT, ISZ CURBIT /NEXT BIT 1344 01477 5313 JMP RCHECK 1345 01500 7200 CLA /NEED TO GO TO NEXT WORD AND RESET CURRENT BIT TO -14 1346 01501 1377 TAD (-14 1347 01502 3021 DCA CURBIT 1348 01503 1020 TAD ADDR 1349 01504 7001 IAC 1350 01505 0374 AND (WRDCOL-1 1351 01506 3032 DCA TEMP 1352 01507 1020 TAD ADDR 1353 01510 0373 AND (-WRDCOL 1354 01511 1032 TAD TEMP 1355 01512 3020 DCA ADDR 1356 01513 2334 RCHECK, ISZ RLECNT /ANY MORE TO DO? 1357 01514 5255 JMP RLOOP /YES 1358 01515 5236 JMP RMAIN /NOPE, GET MORE DATA 1359 1360 01516 1333 NEXTLN, TAD SBIT 1361 01517 3021 DCA CURBIT 1362 01520 1332 TAD SADDR 1363 01521 1372 TAD (WRDCOL 1364 01522 3332 DCA SADDR 1365 01523 1332 TAD SADDR 1366 01524 3020 DCA ADDR 1367 01525 5313 JMP RCHECK 1368 1369 01526 2200 RLEDUN, ISZ RLE 1370 01527 5600 JMP I RLE 1371 1372 01530 0000 CURSTA, 0 1373 01531 0000 CURDAT, 0 1374 01532 0000 SADDR, 0 1375 01533 0000 SBIT, 0 1376 01534 0000 RLECNT, 0 1377 1378 01572 0020 PAGE 01573 7760 01574 0017 01575 0307 01576 0377 01577 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 01600 0000 DUBDAB, 0 1387 01601 3323 DCA DUBPTR /STORE POINTER 1388 01602 1723 TAD I DUBPTR /GET DOUBLE LSW 1389 01603 3324 DCA SCRATC /STORE IT IN SCRATCH 1390 01604 2323 ISZ DUBPTR 1391 01605 1723 TAD I DUBPTR /GET DOUBLE MSW 1392 01606 3325 DCA SCRATC+1 /STORE IT NEXT 1393 01607 3326 DCA SCRATC+2 /CLEAR REST OF SCRATCH 1394 01610 3327 DCA SCRATC+3 1395 01611 3330 DCA SCRATC+4 1396 01612 1377 TAD (-30 /LOOP 24 TIMES 1397 01613 3031 DCA CNT 1398 1399 01614 1326 DABLP, TAD SCRATC+2 /CHECK FOR NECESSARY ADDITIONS 1400 JMS DABADD off page ^ 01615 4776 1401 01616 3326 DCA SCRATC+2 1402 01617 1327 TAD SCRATC+3 1403 JMS DABADD off page ^ 01620 4776 1404 01621 3327 DCA SCRATC+3 1405 01622 1330 TAD SCRATC+4 1406 JMS DABADD off page ^ 01623 4776 1407 01624 3330 DCA SCRATC+4 1408 1409 01625 1324 TAD SCRATC /ROTATE EVERYTHING LEFT 1410 01626 7004 RAL 1411 01627 3324 DCA SCRATC 1412 01630 1325 TAD SCRATC+1 1413 01631 7004 RAL 1414 01632 3325 DCA SCRATC+1 1415 01633 1326 TAD SCRATC+2 1416 01634 7004 RAL 1417 01635 3326 DCA SCRATC+2 1418 01636 1327 TAD SCRATC+3 1419 01637 7004 RAL 1420 01640 3327 DCA SCRATC+3 1421 01641 1330 TAD SCRATC+4 1422 01642 7004 RAL 1423 01643 3330 DCA SCRATC+4 1424 1425 01644 2031 ISZ CNT /KEEP GOING? 1426 01645 5214 JMP DABLP /YES 1427 1428 /TIME TO DISH UP SOME ASCII 1429 1430 01646 1375 TAD (ASCOUT /PUT OUTPUT POINTER 1431 01647 3323 DCA DUBPTR /IN OUR POINTER 1432 1433 01650 1330 TAD SCRATC+4 /ADD DIGITS TO OUTPUT 1434 01651 4274 JMS DABASC 1435 01652 1327 TAD SCRATC+3 1436 01653 4274 JMS DABASC 1437 01654 1326 TAD SCRATC+2 1438 01655 4274 JMS DABASC 1439 01656 3723 DCA I DUBPTR /NULL TERMINATOR 1440 1441 01657 1375 TAD (ASCOUT /DO ZERO SUPPRESSION 1442 01660 3323 DCA DUBPTR 1443 1444 01661 1723 TAD I DUBPTR /IS IT ASCII ZERO? 1445 01662 1374 TAD (-60 1446 01663 7440 SZA 1447 01664 5267 JMP DABDUN /NOT ASCII ZERO 1448 01665 2323 ISZ DUBPTR /YES, TRY AGAIN 1449 01666 5261 JMP .-5 1450 01667 1373 DABDUN, TAD (60 /WAS IT OUR TERMINATION? 1451 01670 7650 SNA CLA 1452 01671 7040 CMA /YES, SUBTRACT ONE FROM POINTER 1453 01672 1323 TAD DUBPTR /RETURN POINTER 1454 01673 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 01674 0000 DABASC, 0 1460 01675 3032 DCA TEMP /STORE THE DIGITS 1461 1462 01676 1032 TAD TEMP /GET TOP BCD DIGIT 1463 01677 7006 RTL 1464 01700 7006 RTL 1465 01701 7004 RAL 1466 01702 0372 AND (17 1467 01703 1373 TAD (60 /ADD ASCII ZERO 1468 01704 3723 DCA I DUBPTR 1469 01705 2323 ISZ DUBPTR 1470 1471 01706 1032 TAD TEMP /GET MIDDLE BCD DIGIT 1472 01707 7012 RTR 1473 01710 7012 RTR 1474 01711 0372 AND (17 1475 01712 1373 TAD (60 /ADD ASCII ZERO 1476 01713 3723 DCA I DUBPTR 1477 01714 2323 ISZ DUBPTR 1478 1479 01715 1032 TAD TEMP /GET BOTTOM BCD DIGIT 1480 01716 0372 AND (17 1481 01717 1373 TAD (60 /ADD ASCII ZERO 1482 01720 3723 DCA I DUBPTR 1483 01721 2323 ISZ DUBPTR 1484 01722 5674 JMP I DABASC 1485 1486 01723 0000 DUBPTR, 0 1487 01724 0000 SCRATC, ZBLOCK 5 01725 0000 01726 0000 01727 0000 01730 0000 1488 01731 0000 ASCOUT, ZBLOCK 12 /9 BCD DIGITS IN 3 WORDS, PLUS NULL TERMINATION 01732 0000 01733 0000 01734 0000 01735 0000 01736 0000 01737 0000 01740 0000 01741 0000 01742 0000 1489 1490 01772 0017 PAGE 01773 0060 01774 7720 01775 1731 01776 2000 01777 7750 1491 1492 /ADDS 3 TO EACH NIBBLE OF WORD IF NIBBLE IS GREATER THAN 4 1493 02000 0000 DABADD, 0 1494 02001 3032 DCA TEMP 1495 02002 1032 TAD TEMP /IS BOTTOM BCD DIGIT GREATER THAN 4? 1496 02003 0377 AND (17 1497 02004 1376 TAD (-5 1498 02005 7700 SMA CLA 1499 02006 1375 TAD (3 /YES, ADD 3 1500 02007 1032 TAD TEMP /TO THE BOTTOM BCD DIGIT 1501 02010 3032 DCA TEMP /AND SAVE IT 1502 1503 02011 1032 TAD TEMP /IS MIDDLE BCD DIGIT GREATER THAN 4? 1504 02012 7012 RTR 1505 02013 7012 RTR 1506 02014 0377 AND (17 1507 02015 1376 TAD (-5 1508 02016 7700 SMA CLA 1509 02017 1374 TAD (60 /YES, ADD 3 1510 02020 1032 TAD TEMP /TO THE MIDDLE BCD DIGIT 1511 02021 3032 DCA TEMP /AND SAVE IT 1512 1513 02022 1032 TAD TEMP /IS TOP BCD DIGIT GREATER THAN 4? 1514 02023 7006 RTL 1515 02024 7006 RTL 1516 02025 7004 RAL 1517 02026 0377 AND (17 1518 02027 1376 TAD (-5 1519 02030 7700 SMA CLA 1520 02031 1373 TAD (1400 /YES, ADD 3 1521 02032 1032 TAD TEMP /TO THE TOP BCD DIGIT 1522 02033 5600 JMP I DABADD /AND RETURN 1523 1524 /PRINT STATISTICS 1525 02034 0000 PRNTST, 0 1526 02035 7200 CLA 1527 02036 1372 TAD (GENTXT 1528 02037 4303 JMS PUTSIX 1529 02040 1371 TAD (GENCNT 1530 JMS DUBDAB off page ^ 02041 4770 1531 02042 4273 JMS PUTS2 1532 02043 1272 TAD TAB 1533 02044 4333 JMS PUTC 1534 02045 1367 TAD (LIFTXT 1535 02046 4303 JMS PUTSIX 1536 02047 1366 TAD (LIFCNT 1537 JMS DUBDAB off page ^ 02050 4770 1538 02051 4273 JMS PUTS2 1539 JMS DOCRLF off page ^ 02052 4765 1540 02053 5634 JMP I PRNTST 1541 1542 02054 0705 GENTXT, TEXT"GENERATION: " 02055 1605 02056 2201 02057 2411 02060 1716 02061 7240 02062 0000 1543 02063 1411 LIFTXT, TEXT"LIVE CELLS: " 02064 2605 02065 4003 02066 0514 02067 1423 02070 7240 02071 0000 1544 02072 0011 TAB, 11 1545 > /} 1546 1547 IFNZRO STATS+PARSER < /{ 1548 /LIKE PUTS, BUT TAKES POINTER, NOT POINTER-1 1549 02073 0000 PUTS2, 0 1550 02074 1364 TAD (-1 1551 02075 3010 DCA PRIDX 1552 02076 1410 TAD I PRIDX 1553 02077 7450 SNA 1554 02100 5673 JMP I PUTS2 1555 02101 4333 JMS PUTC 1556 02102 5276 JMP .-4 1557 1558 /PRINT A SIXBIT STRING 1559 02103 0000 PUTSIX, 0 1560 02104 3033 DCA TMPPTR 1561 02105 1433 TAD I TMPPTR /GET WORD 1562 02106 7012 RTR /GET TOP SIX IN BOTTOM 1563 02107 7012 RTR 1564 02110 7012 RTR 1565 02111 0363 AND (77 1566 02112 7450 SNA /WAS IT ZERO? 1567 02113 5703 JMP I PUTSIX /YES, RETURN 1568 02114 4324 JMS PUTCSX /CONVERT AND PRINT 1569 02115 1433 TAD I TMPPTR /GET WORD 1570 02116 0363 AND (77 /KEEP BOTTOM SIX 1571 02117 7450 SNA /WAS IT ZERO? 1572 02120 5703 JMP I PUTSIX /YES, RETURN 1573 02121 4324 JMS PUTCSX /CONVERT AND PRINT 1574 02122 2033 ISZ TMPPTR /LOOP 1575 02123 5305 JMP PUTSIX+2 1576 1577 /SIXBIT CONVERSION AND PRINT 1578 02124 0000 PUTCSX, 0 1579 02125 1362 TAD (-40 /WAS IT GTE 40? 1580 02126 7500 SMA 1581 02127 1361 TAD (-100 /YES 1582 02130 1360 TAD (140 /MAKE IT ASCII 1583 02131 4333 JMS PUTC /PRINT IT 1584 02132 5724 JMP I PUTCSX 1585 1586 /PRINT A CHARACTER 1587 02133 0000 PUTC, 0 1588 02134 6041 TSF 1589 02135 5334 JMP .-1 1590 02136 6046 TLS 1591 02137 7200 CLA 1592 02140 5733 JMP I PUTC 1593 1594 02160 0140 PAGE 02161 7700 02162 7740 02163 0077 02164 7777 02165 2200 02166 0027 02167 2063 02170 1600 02171 0173 02172 2054 02173 1400 02174 0060 02175 0003 02176 7773 02177 0017 1595 > /} 1596 1597 IFNZRO STATS+USETTY < /{ 1598 02200 0000 DOCRLF, 0 1599 02201 7200 CLA 1600 02202 1377 TAD (CRLF-1 1601 02203 3010 DCA PRIDX 1602 02204 1410 TAD I PRIDX 1603 02205 7450 SNA 1604 02206 5600 JMP I DOCRLF 1605 02207 6041 TSF 1606 02210 5207 JMP .-1 1607 02211 6046 TLS 1608 02212 7200 CLA 1609 02213 5204 JMP .-7 1610 02214 0015 CRLF, 15 1611 02215 0012 12 1612 02216 0000 0 1613 > /} 1614 1615 /INITIALIZATION ROUTINE 1616 02217 0000 INIT, 0 1617 02220 7200 CLA /ZERO PLAYING FIELD 1618 02221 3020 DCA ADDR 1619 02222 6211 CDF DFIELD 1620 02223 3420 DCA I ADDR 1621 02224 6201 CDF 0 1622 02225 2020 ISZ ADDR 1623 02226 5222 JMP .-4 1624 IFNZRO PARSER < /{ 1625 JMS PARSE 1626 > /} 1627 JMS RLE off page ^ 02227 4776 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 02230 2400 RRPENT; 137; 176 02231 0137 02232 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 02233 0000 0 /END OF INITIALIZATION 1678 02234 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 02376 1400 PAGE 02377 2213 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 1884 02400 6000 B;2!O;L;2!O;B;L;B;O;E 02401 4002 02402 1000 02403 4002 02404 6000 02405 1000 02406 6000 02407 4000 02410 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 06600 0000 CHKCTL, 0 2018 06601 6036 KRB /READ IT 2019 06602 0377 AND (177 /KEEP BOTTOM 7 BITS 2020 IFNZRO OS8 < /{ 2021 06603 3032 DCA TEMP /STORE IT 2022 06604 1032 TAD TEMP 2023 06605 1376 TAD (-3 /IS IT A CTRL-C? 2024 06606 7450 SNA 2025 06607 5214 JMP EXIT /YES, EXIT TO OS/8 2026 06610 1375 TAD (-25+3 /IS IT A CTRL-U? 2027 > /} 2028 IFZERO OS8 < /{ 2029 TAD (-25 /IS IT A CTRL-U? 2030 > /} 2031 06611 7650 SNA CLA 2032 JMP START /YES, RESTART THE PROGRAM off page ^ 06612 5774 2033 06613 5600 JMP I CHKCTL /NOT A CTRL-C OR CTRL-U 2034 2035 IFNZRO OS8 < /{ 2036 06614 4247 EXIT, JMS RSTOS8 /PUT THINGS BACK THE WAY WE FOUND IT 2037 06615 5773 JMP I (7600 /AND RETURN TO OS/8 2038 2039 06616 0000 SAVOS8, 0 2040 06617 7200 CLA /HAS THE SYSTEM ALREADY BEEN SAVED? 2041 06620 1322 TAD OS8SAV 2042 06621 7440 SZA 2043 06622 5616 JMP I SAVOS8 /YES, RETURN 2044 06623 4270 JMS COPY /NO, DO THE COPIES 2045 06624 0000 0 /COPY FROM 07600 2046 06625 7577 7600-1 2047 06626 0000 0 /TO 07400 2048 06627 7377 7400-1 2049 06630 4270 JMS COPY 2050 06631 0010 10 /COPY FROM 17600 2051 06632 7577 7600-1 2052 06633 0000 0 /TO 07200 2053 06634 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 06635 2322 ISZ OS8SAV /THE SYSTEM HAS BEEN SAVED 2065 2066 06636 1372 TAD (7764 /PUT THE MASK TABLE AT 7764 2067 06637 3020 DCA ADDR 2068 06640 7330 CLA CLL CML RAR /AC=4000 2069 06641 3420 DCA I ADDR /SAVE IT 2070 06642 1420 TAD I ADDR /GET IT 2071 06643 7110 CLL RAR /ROTATE IT 2072 06644 2020 ISZ ADDR /ANY MORE TO DO? 2073 06645 5241 JMP .-4 /NOPE 2074 2075 06646 5616 JMP I SAVOS8 2076 2077 06647 0000 RSTOS8, 0 2078 06650 7200 CLA /HAS THE SYSTEM ACTUALLY BEEN SAVED? 2079 06651 1322 TAD OS8SAV 2080 06652 7450 SNA 2081 06653 5647 JMP I RSTOS8 /NOPE, RETURN 2082 06654 4270 JMS COPY /YES, COPY BACK 2083 06655 0000 0 /COPY FROM 07400 2084 06656 7377 7400-1 2085 06657 0000 0 /TO 07600 2086 06660 7577 7600-1 2087 06661 4270 JMS COPY 2088 06662 0000 0 /COPY FROM 07200 2089 06663 7177 7200-1 2090 06664 0010 10 /TO 17600 2091 06665 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 06666 3322 DCA OS8SAV /THE SYSTEM HAS BEEN RESTORED 2103 06667 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 06670 0000 COPY, 0 2112 06671 7200 CLA 2113 06672 1373 TAD (-200 2114 06673 3031 DCA CNT /JUST COPY ONE PAGE 2115 06674 1670 TAD I COPY /GET FROM FIELD 2116 06675 1316 TAD CDFI 2117 06676 3312 DCA FRMCDF /SELF MODIFY FOR FIELD CHANGES 2118 06677 2270 ISZ COPY 2119 06700 1670 TAD I COPY /GET FROM ADDR MINUS 1 2120 06701 3011 DCA CPTR1 2121 06702 2270 ISZ COPY 2122 06703 1670 TAD I COPY /GET TO FIELD 2123 06704 1316 TAD CDFI 2124 06705 3314 DCA TOCDF /SELF MODIFY FOR FIELD CHANGES 2125 06706 2270 ISZ COPY 2126 06707 1670 TAD I COPY /GET TO ADDR MINUS 1 2127 06710 3012 DCA CPTR2 2128 06711 2270 ISZ COPY /POINT TO RETURN 2129 2130 06712 7402 FRMCDF, HLT /BETTER BE A CDF! 2131 06713 1411 TAD I CPTR1 /GET DATA 2132 06714 7402 TOCDF, HLT /BETTER BE A CDF! 2133 06715 3412 DCA I CPTR2 /SAVE DATA 2134 06716 6201 CDFI, CDF 0 2135 06717 2031 ISZ CNT 2136 06720 5312 JMP .-6 /DO THE LOOP 2137 06721 5670 JMP I COPY /ALL DONE 2138 2139 06722 0000 OS8SAV, 0 2140 > /} 2141 2142 06772 7764 $ 06773 7600 06774 0202 06775 7756 06776 7775 06777 0177 ACORN 0000 ADDR 0020 ASCOUT 1731 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 CURBIT 0021 CURDAT 1531 unreferenced CURSTA 1530 DABADD 2000 DABASC 1674 DABDUN 1667 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 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 GLDERS 0000 GOSPER 0000 HWSS 0000 INCGEN 0321 INCLIF 0307 INIT 2217 JMPLOC 0172 KAREL 0000 L 1000 LIFCNT 0027 LIFDET 0023 LIFTXT 2063 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 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 TEMP 0032 THREEL 0153 unreferenced THREER 0165 TMPPTR 0033 TOCDF 6714 TOPPTR 0024 TOTAL 0022 TWOL 0147 unreferenced TWOR 0161 UCACHE 1000 USETTY 0000 VC8E 0001 VT100 0000 unreferenced WRDCOL 0020 WRDLP 1240 X 0036 Y 0037