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
199 /********************************************************************
204 IHAND, DCA INTAC / SAVE AC AND LINK
210 JMP TTIHAN / TELETYPE INPUT
213 JMP TTOHAN / TELETYPE OUTPUT
215 HLT / OH, AN UNKNOWN INTERRUPT!
217 / RESTORE AC AND LINK AND GO BACK TO WORK
224 JMP I INTR / BACK TO NORMAL OPERATION
226 /********************************************************************
227 / TELETYPE INPUT HANDLER
230 KRB / READ AND CLEAR FLAG
231 AND K177 / MASK TO 7 BITS - I HATE PARITY!
232 DCA KBCHAR / SAVE FOR USE
237 JMS I XDUMPS / SOURCE DUMP (DEBUG)
243 JMS I XDUMPT / TARGET DUMP (DEBUG)
249 JMS I XDUMP / NORMAL DUMP
277 /********************************************************************
278 / TELETYPE OUTPUT HANDLER AND MANAGEMENT
282 TAD TTACT / ACTIVITY GOING ON?
284 JMP TRESUM / JUMP INTO ONGOING ACTIVITY
285 HLT / DEBUG HALT - THIS SHOULD NEVER BE HIT!
286 JMP IEND / DO NOTHING, SAY GOODBYE.
288 TSTART, 0 / SCHEDULE TYPING TO BE DONE. NEW "PROCESS"
289 / STARTS ONE WORD AFTER THIS CALL'S REGULAR
291 DCA TAC / SAVE AC FOR NOW
296 / JMP TSWAIT / WAIT UNTIL TYPING SYSTEM IS IDLE!
301 JMP I TSTART / RETURN, WE'RE BUSY!
303 ISZ TTACT / NOW IT IS ACTIVE (AGAIN?)
304 TAD TAC / GET BACK THE TEMPORARY AC
305 DCA SAVTAC / SAVE FOR NEW THREAD
307 DCA SAVTLI / SAME FOR LINK
308 TAD TSTART / POINTER TO MAIN THREAD RETURN CALL
309 IAC / NOW POINTER TO FIRST EXTRA THREAD LOCATION
310 DCA TYPE / INSTALL AS WAKEUP ADDRESS
311 SPF / WE WILL BE INTERRUPTED RIGHT NOW!
312 JMP I TSTART / RETURN TO CALLER
314 TYPE, 0 / TYPE CHARACTER
316 DCA SAVTAC / SAVE AC, JUST POLITE
318 DCA SAVTLI / SAVE LINK, STILL POLITE
319 JMP IEND / END OF INTERRUPT HANDLING
323 JMP I TYPE / WAKE UP INTERRUPTED PROCESS
325 TSTOP, CLA / JUMP HERE TO KILL TYPING THREAD
326 DCA TTACT / CLEAR ACTIVITY FLAG
327 TCF / CLEAR TELEPRINTER FLAG
328 JMP IEND / END OF INTERRUPT HANDLING
330 /********************************************************************
333 CCADDR, 0 / CURRENT CELL ADDRESS
352 / NOW, DO IT, PLEASE!
383 JMS I XSET / NOW, IT'S ALIVE!
406 /********************************************************************
454 TAD DBASE / BUFFER BASE ADDRESS
455 TAD DOFF / CURRENT WORD OFFSET
456 DCA DDPTR / TO INTERNAL POINTER
459 CLOOP, TAD DMSK / BIT MASK, DYNAMIC
460 AND I DDPTR / COMBINE CURRENT WORD
491 JMP I XTSTOP / STOP INTERRUPT MADNESS.
509 /********************************************************************
510 / NEIGHBORHOOD COUNTING
520 TAD KCOLM1 / STEP LEFT
559 CNT, 0 / COUNTER VARIABLE
562 /********************************************************************
563 / DATA HOLDING AND ACCESS
565 PAGE / START ON NEW PAGE
569 CADR, 0 / CURRENT CELL ADDRESS
570 MASK, 0 / BIT MASK TO CURRENT CELL BIT
571 APTR, 0 / ACCESS POINTER TO CURRENT CELL WORD
574 GET, 0 / GET POSITION'S VALUE
575 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
576 JMP I GET / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
578 TAD SPTR / ADD SOURCE DATA BASE
580 TAD I APTR / LOAD DATA
581 AND MASK / MASK OUT DESIRED BIT
583 CLA CLL IAC / MAKE A ONE OUT OF AC CONTENTS
586 SET, 0 / SET POSITION'S VALUE TO 1
587 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
588 JMP I SET / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
590 TAD TPTR / ADD SOURCE DATA BASE
594 AND I APTR / COMBINE WITH DATA
596 DCA I APTR / UPDATE DATA
599 CLEAR, 0 / CLEAR POSITION'S VALUE TO 0
600 JMS ASETUP / CHECK LIMITS, STORE ADDRESS ETC.
601 JMP I CLEAR / ERROR RETURN, RETURN WITH LIMIT VALUE IN AC
603 TAD TPTR / ADD SOURCE DATA BASE
607 AND I APTR / COMBINE WITH DATA
608 DCA I APTR / UPDATE DATA
612 DCA CADR / SAVE ADDRESS FOR LATER USE
616 BSW / NOW ROW ADDRESS IN LOWER BITS
617 AND K77 / MASK OUT UPPER BITS
620 JMP LGD1 / ONE LIMIT GOOD
622 TAD KBORD / BORDER STANDARD RETURN VALUE
623 JMP I ASETUP / ERROR RETURN
632 JMP I ASETUP / ERROR RETURN
635 / SETUP POINTER AND MASK
640 DCA APTR / ACCESS POINTER
648 ISZ ASETUP / PREPARE GOOD RETURN
649 JMP I ASETUP / GOOD RETURN
666 /********************************************************************
667 /********************************************************************
670 0000;0000;0000;0000;0000;0000;0000;0000
671 0000;0000;0000;0000;0000;0000;0000;0000
672 0000;0000;0000;0000;0000;0000;0000;0000
673 0000;0000;0000;0000;0000;0000;0000;0000
674 0000;0000;0000;0000;0000;0000;0000;0000
675 0000;0000;0000;0000;0000;0000;0000;0000
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;0007;0000;0000;0000;0000
682 0000;0000;0000;0005;0000;0000;0000;0000
683 0000;0000;0000;0005;0000;0000;0000;0000
684 0000;0000;0000;0000;0000;0000;0000;0000
685 0000;0000;0000;0005;0000;0000;0000;0000
686 0000;0000;0000;0005;0000;0000;0000;0000
687 0000;0000;0000;0007;0000;0000;0000;0000
688 0000;0000;0000;0000;0000;0000;0000;0000
689 0000;0000;0000;0000;0000;0000;0000;0000
690 0000;0000;0000;0000;0000;0000;0000;0000
691 0000;0000;0000;0000;0000;0000;0000;0000
692 0000;0000;0000;0000;0000;0000;0000;0000
693 0000;0000;0000;0000;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
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
708 0000;0000;0000;0000;0000;0000;0000;0000
709 0000;0000;0000;0000;0000;0000;0000;0000
710 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
739 /********************************************************************
740 /********************************************************************
742 /********************************************************************
743 /********************************************************************