1 / CONWAY'S GAME OF LIFE - BREED LIFE ON YOUR PDP8
3 /********************************************************************
4 /********************************************************************
6 / PAL-8 IMPLEMENTATION OF CONWAY'S GAME OF LIFE
8 / PHILIPP HACHTMANN, JULY 2010
12 / 2010-07-24 - INITIAL RELEASE
14 /********************************************************************
15 /********************************************************************
18 /********************************************************************
19 /********************************************************************
21 / GAME CONFIGURATION PARAMETERS
22 / CHANGE ONLY IF YOU KNOW WHAT YOU'RE DOING!
24 / SIZE OF THE PLAYING FIELD
25 / =========================
27 / THE PLAYING FIELD HAS A MAXIMUM SIZE OF 32 ROWS BY 64 COLUMNS.
29 / THE DATA IS ORGANIZED AS FOLLOWS:
30 / EVERY CELL OCCUPIES ONE BIT. THE CELLS OF EACH ROW ARE STORED IN
31 / A CONTIGUOUS PIECE OF MEMORY. BUT ONLY THE LOWER 8 BITS OF A WORD
33 / THE WHOLE GAME BUFFER CONSISTS OF 32 ROWS OF 8 WORDS EACH. THIS
34 / LEADS TO A MEMORY FOOTPRINT OF 256 WORDS.
35 / THERE'S ONE RESTRICTION: THE LAST COLUMN IS NOT USABLE DUE TO
36 / BORDER DETECTION. THAT MEANS THAT THE MAXIMUM SIZE OF THE ACTUAL
37 / CELL ROW IS ONLY 63!!!
38 / THE FOLLOWIN PARAMETERS DEFINE THE DIMENSIONS OF THE ACTUAL
39 / SIZE OF THE CELL ARRAY. KEEP IN MIND THAT THIS WILL NOT CHANGE
40 / THE MEMORY FOOTPRINT!
44 / CELL ADDRESS CODING:
46 / 0RR RRR CCC CCC <- AS USED THROUGHOUT THE PROGRAM
50 / C - COLUMN ADDRESS BIT
52 / COLUMN ADDRESS IS SPLIT INTO
57 / B - BIT IN WORD ADDRESS
59 / A CELL ADDRESS CAN BE TRANSLATED INTO A MEMORY OFFSET BY SIMPLY
60 / SHIFTING THREE BITS TO THE RIGHT AND MASKING WITH 0377:
64 / HERE THE LOWER 3 COLUMN ADDRESS BITS WHICH SPECIFY THE BIT ADDRESS
65 / IN A WORD ARE DISCARDED.
67 / HAS THE FIELD LIMITS OR IS IT ENDLESS? (CURRENTLY UNSUPPORTED!)
72 / BORDER BEHAVIOUR FOR LIMITED FIELD
73 / 0 - OFF FIELD POSITIONS ARE ASSUMED TO BE ALWAYS DEAD
74 / 1 - OFF FIELD POSITIONS ARE ASSUMED TO BE ALWAYS ALIFE
78 / CHARACTER CODES TO USE FOR CELL DISPLAY OUTPUT
86 /********************************************************************
87 / HELP FOR PALBART - CAN BE OMITTED WITH REAL PAL-8
92 /********************************************************************
93 /********************************************************************
97 INTR, 0 / INTERRUPT TARGET
98 JMP I XIHAND / JUMP TO INTERRUPT HANDLER
107 SPTR, DATA0 / POINTER TO SOURCE DATA (GET, COUNT)
108 TPTR, DATA1 / POINTER TO TARGET DATA (SET, RESET)
109 DPTR, DATA0 / POINTER TO DUMP DATA
112 INTAC, 0 / INTERRUPT BACKUP AC
113 INTLNK, 0 / INTERRUPT BACKUP OF LINK
116 SAVTLI, 0 / SAVED LINK FOR TYPING THREAD
117 SAVTAC, 0 / SAVED AC FOR TYPING THREAD
118 TAC, 0 / TEMPORARY AC, USED ON TYPING START
119 TTACT, 0 / TYPING THREAD ACTIVE FLAG
125 /********************************************************************
126 / ZERO PAGE CONSTANTS
141 KNMCO, 1-PCOLS / NEGATIVE OF LAST COLUMN ADDRESS
142 KNMROW, 1-PROWS / NEGATIVE OF LAST ROW ADDRESS
150 /********************************************************************
151 / ZERO PAGE POINTERS AND SHORTCUTS
153 XDUMPS, DUMPS / START DATA DUMP
154 XDUMPT, DUMPT / START DATA DUMP
158 XGET, GET / GET A CELL STATE
159 XSET, SET / SET A CELL TO LIVING
160 XCLEAR, CLEAR / SET A CELL TO DEAD
165 /********************************************************************
166 /********************************************************************
172 ION / WELCOME TO HELL!
174 MLOOP, / MAIN EVENT LOOP
175 JMS I XDUMP / START A DUMP, PLEASE
176 JMS I XCALC / CALCULATE NEW DATA
191 /********************************************************************
196 IHAND, DCA INTAC / SAVE AC AND LINK
202 JMP TTIHAN / TELETYPE INPUT
205 JMP TTOHAN / TELETYPE OUTPUT
207 HLT / OH, AN UNKNOWN INTERRUPT!
209 / RESTORE AC AND LINK AND GO BACK TO WORK
216 JMP I INTR / BACK TO NORMAL OPERATION
218 /********************************************************************
219 / TELETYPE INPUT HANDLER
222 KRB / READ AND CLEAR FLAG
223 AND K177 / MASK TO 7 BITS - I HATE PARITY!
224 DCA KBCHAR / SAVE FOR USE
229 JMS I XDUMPS / SOURCE DUMP (DEBUG)
235 JMS I XDUMPT / TARGET DUMP (DEBUG)
241 JMS I XDUMP / NORMAL DUMP
269 /********************************************************************
270 / TELETYPE OUTPUT HANDLER AND MANAGEMENT
274 TAD TTACT / ACTIVITY GOING ON?
276 JMP TRESUM / JUMP INTO ONGOING ACTIVITY
277 HLT / DEBUG HALT - THIS SHOULD NEVER BE HIT!
278 JMP IEND / DO NOTHING, SAY GOODBYE.
280 TSTART, 0 / SCHEDULE TYPING TO BE DONE. NEW "PROCESS"
281 / STARTS ONE WORD AFTER THIS CALL'S REGULAR
283 DCA TAC / SAVE AC FOR NOW
288 / JMP TSWAIT / WAIT UNTIL TYPING SYSTEM IS IDLE!
293 JMP I TSTART / RETURN, WE'RE BUSY!
295 ISZ TTACT / NOW IT IS ACTIVE (AGAIN?)
296 TAD TAC / GET BACK THE TEMPORARY AC
297 DCA SAVTAC / SAVE FOR NEW THREAD
299 DCA SAVTLI / SAME FOR LINK
300 TAD TSTART / POINTER TO MAIN THREAD RETURN CALL
301 IAC / NOW POINTER TO FIRST EXTRA THREAD LOCATION
302 DCA TYPE / INSTALL AS WAKEUP ADDRESS
303 SPF / WE WILL BE INTERRUPTED RIGHT NOW!
304 JMP I TSTART / RETURN TO CALLER
306 TYPE, 0 / TYPE CHARACTER
308 DCA SAVTAC / SAVE AC, JUST POLITE
310 DCA SAVTLI / SAVE LINK, STILL POLITE
311 JMP IEND / END OF INTERRUPT HANDLING
315 JMP I TYPE / WAKE UP INTERRUPTED PROCESS
317 TSTOP, CLA / JUMP HERE TO KILL TYPING THREAD
318 DCA TTACT / CLEAR ACTIVITY FLAG
319 TCF / CLEAR TELEPRINTER FLAG
320 JMP IEND / END OF INTERRUPT HANDLING
322 /********************************************************************
325 CCADDR, 0 / CURRENT CELL ADDRESS
344 / NOW, DO IT, PLEASE!
375 JMS I XSET / NOW, IT'S ALIVE!
398 /********************************************************************
448 TAD DBASE / BUFFER BASE ADDRESS
449 TAD DOFF / CURRENT WORD OFFSET
450 DCA DDPTR / TO INTERNAL POINTER
453 CLOOP, TAD DMSK / BIT MASK, DYNAMIC
454 AND I DDPTR / COMBINE CURRENT WORD
485 JMP I XTSTOP / STOP INTERRUPT MADNESS.
492 JMS I XTYPE / FILLER CHARACTERS!
515 /********************************************************************
516 / NEIGHBORHOOD COUNTING
526 TAD KCOLM1 / STEP LEFT
565 CNT, 0 / COUNTER VARIABLE
568 /********************************************************************
569 / DATA HOLDING AND ACCESS
571 PAGE / START ON NEW PAGE
575 CADR, 0 / CURRENT CELL ADDRESS
576 MASK, 0 / BIT MASK TO CURRENT CELL BIT
577 APTR, 0 / ACCESS POINTER TO CURRENT CELL WORD
580 GET, 0 / GET POSITION'S VALUE
581 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
582 JMP I GET / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
584 TAD SPTR / ADD SOURCE DATA BASE
586 TAD I APTR / LOAD DATA
587 AND MASK / MASK OUT DESIRED BIT
589 CLA CLL IAC / MAKE A ONE OUT OF AC CONTENTS
592 SET, 0 / SET POSITION'S VALUE TO 1
593 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
594 JMP I SET / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
596 TAD TPTR / ADD SOURCE DATA BASE
600 AND I APTR / COMBINE WITH DATA
602 DCA I APTR / UPDATE DATA
605 CLEAR, 0 / CLEAR POSITION'S VALUE TO 0
606 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
607 JMP I CLEAR / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
609 TAD TPTR / ADD SOURCE DATA BASE
613 AND I APTR / COMBINE WITH DATA
614 DCA I APTR / UPDATE DATA
618 DCA CADR / SAVE ADDRESS FOR LATER USE
622 BSW / NOW ROW ADDRESS IN LOWER BITS
623 AND K77 / MASK OUT UPPER BITS
626 JMP LGD1 / ONE LIMIT GOOD
628 TAD KBORD / BORDER STANDARD RETURN VALUE
629 JMP I ASETUP / ERROR RETURN
638 JMP I ASETUP / ERROR RETURN
641 / SETUP POINTER AND MASK
646 DCA APTR / ACCESS POINTER
654 ISZ ASETUP / PREPARE GOOD RETURN
655 JMP I ASETUP / GOOD RETURN
672 /********************************************************************
673 /********************************************************************
676 0000;0000;0000;0000;0000;0000;0000;0000
677 0000;0000;0000;0000;0000;0000;0000;0000
678 0000;0000;0000;0000;0000;0000;0000;0000
679 0000;0000;0000;0000;0000;0000;0000;0000
680 0000;0000;0000;0000;0000;0000;0000;0000
681 0000;0000;0000;0000;0000;0000;0000;0000
682 0000;0000;0000;0000;0000;0000;0000;0000
683 0000;0000;0000;0000;0000;0000;0000;0000
684 0000;0000;0000;0000;0000;0000;0000;0000
685 0000;0000;0000;0000;0000;0000;0000;0000
686 0000;0000;0000;0000;0000;0000;0000;0000
687 0000;0000;0000;0007;0000;0000;0000;0000
688 0000;0000;0000;0005;0000;0000;0000;0000
689 0000;0000;0000;0005;0000;0000;0000;0000
690 0000;0000;0000;0000;0000;0000;0000;0000
691 0000;0000;0000;0005;0000;0000;0000;0000
692 0000;0000;0000;0005;0000;0000;0000;0000
693 0000;0000;0000;0007;0000;0000;0000;0000
694 0000;0000;0000;0000;0000;0000;0000;0000
695 0000;0000;0000;0000;0000;0000;0000;0000
696 0000;0000;0000;0000;0000;0000;0000;0000
697 0000;0000;0000;0000;0000;0000;0000;0000
698 0000;0000;0000;0000;0000;0000;0000;0000
699 0000;0000;0000;0000;0000;0000;0000;0000
700 0000;0000;0000;0000;0000;0000;0000;0000
701 0000;0000;0000;0000;0000;0000;0000;0000
702 0000;0000;0000;0000;0000;0000;0000;0000
703 0000;0000;0000;0000;0000;0000;0000;0000
704 0000;0000;0000;0000;0000;0000;0000;0000
705 0000;0000;0000;0000;0000;0000;0000;0000
706 0000;0000;0000;0000;0000;0000;0000;0000
707 0000;0000;0000;0000;0000;0000;0000;0000
711 0000;0000;0000;0000;0000;0000;0000;0000
712 0000;0000;0000;0000;0000;0000;0000;0000
713 0000;0000;0000;0000;0000;0000;0000;0000
714 0000;0000;0000;0000;0000;0000;0000;0000
715 0000;0000;0000;0000;0000;0000;0000;0000
716 0000;0000;0000;0000;0000;0000;0000;0000
717 0000;0000;0000;0000;0000;0000;0000;0000
718 0000;0000;0000;0000;0000;0000;0000;0000
719 0000;0000;0000;0000;0000;0000;0000;0000
720 0000;0000;0000;0000;0000;0000;0000;0000
721 0000;0000;0000;0000;0000;0000;0000;0000
722 0000;0000;0000;0000;0000;0000;0000;0000
723 0000;0000;0000;0000;0000;0000;0000;0000
724 0000;0000;0000;0000;0000;0000;0000;0000
725 0000;0000;0000;0000;0000;0000;0000;0000
726 0000;0000;0000;0000;0000;0000;0000;0000
727 0000;0000;0000;0000;0000;0000;0000;0000
728 0000;0000;0000;0000;0000;0000;0000;0000
729 0000;0000;0000;0000;0000;0000;0000;0000
730 0000;0000;0000;0000;0000;0000;0000;0000
731 0000;0000;0000;0000;0000;0000;0000;0000
732 0000;0000;0000;0000;0000;0000;0000;0000
733 0000;0000;0000;0000;0000;0000;0000;0000
734 0000;0000;0000;0000;0000;0000;0000;0000
735 0000;0000;0000;0000;0000;0000;0000;0000
736 0000;0000;0000;0000;0000;0000;0000;0000
737 0000;0000;0000;0000;0000;0000;0000;0000
738 0000;0000;0000;0000;0000;0000;0000;0000
739 0000;0000;0000;0000;0000;0000;0000;0000
740 0000;0000;0000;0000;0000;0000;0000;0000
741 0000;0000;0000;0000;0000;0000;0000;0000
742 0000;0000;0000;0000;0000;0000;0000;0000
744 /********************************************************************
745 / PROGRAM TERMINATION - IGNORED BY OS/8!
753 /********************************************************************
755 /********************************************************************
756 /********************************************************************