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