A large commit.
[pdp8.git] / sw / src / life / LIFE10.PA
1 / CONWAY'S GAME OF LIFE - BREED LIFE ON YOUR PDP8
2
3 /********************************************************************
4 /********************************************************************
5 /
6 / PAL-8 IMPLEMENTATION OF CONWAY'S GAME OF LIFE
7 /
8 / PHILIPP HACHTMANN, JULY 2010
9 /
10 / REVISIONS:
11 /
12 / 2010-07-24 - INITIAL RELEASE
13 /
14 /********************************************************************
15 /********************************************************************
16
17
18 /********************************************************************
19 /********************************************************************
20 /
21 / GAME CONFIGURATION PARAMETERS
22 / CHANGE ONLY IF YOU KNOW WHAT YOU'RE DOING!
23
24 / SIZE OF THE PLAYING FIELD
25 / =========================
26
27 / THE PLAYING FIELD HAS A MAXIMUM SIZE OF 32 ROWS BY 64 COLUMNS.
28 /
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
32 / ARE USED!
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!
41 PROWS=37
42 PCOLS=77
43
44 / CELL ADDRESS CODING:
45 /
46 / 0RR RRR CCC CCC <- AS USED THROUGHOUT THE PROGRAM
47 /
48 / WHERE
49 / R - ROW ADDRESS BIT
50 / C - COLUMN ADDRESS BIT
51
52 / COLUMN ADDRESS IS SPLIT INTO
53 /
54 / WWW BBB
55 / WHERE
56 / W - WORD ADDRESS
57 / B - BIT IN WORD ADDRESS
58 /
59 / A CELL ADDRESS CAN BE TRANSLATED INTO A MEMORY OFFSET BY SIMPLY
60 / SHIFTING THREE BITS TO THE RIGHT AND MASKING WITH 0377:
61 /
62 / 000 0RR RRR CCC
63 /
64 / HERE THE LOWER 3 COLUMN ADDRESS BITS WHICH SPECIFY THE BIT ADDRESS
65 / IN A WORD ARE DISCARDED.
66
67 / HAS THE FIELD LIMITS OR IS IT ENDLESS? (CURRENTLY UNSUPPORTED!)
68
69 / ENDLESS=1
70
71
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
75
76 BORDER=0
77
78 / CHARACTER CODES TO USE FOR CELL DISPLAY OUTPUT
79 / 55:-
80 / 52:*
81 / DEAD=55
82 DEAD=40
83 ALIVE=52
84
85
86 /********************************************************************
87 / HELP FOR PALBART - CAN BE OMITTED WITH REAL PAL-8
88
89 KCF=6030
90 SPF=6040
91
92 /********************************************************************
93 /********************************************************************
94 / ZERO PAGE STUFF
95
96 *0
97 INTR, 0 / INTERRUPT TARGET
98 JMP I XIHAND / JUMP TO INTERRUPT HANDLER
99 XIHAND, IHAND
100
101 *10
102 AUTO0, 0
103 AUTO1, 1
104
105 *100
106 / MAJOR POITERS
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
110
111 / INTERRUPT BACKUPS
112 INTAC, 0 / INTERRUPT BACKUP AC
113 INTLNK, 0 / INTERRUPT BACKUP OF LINK
114
115 / TYPING THREAD DATA
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
120
121 / KEYBOARD COMMANDS
122 CMKILL, 0
123 CMDUMP, 0
124
125 /********************************************************************
126 / ZERO PAGE CONSTANTS
127
128 K7, 7
129 K10, 10
130 K77, 77
131 K200, 200
132 K377, 377
133 K7700, 7700
134
135 KROWS, PROWS
136 KCOLS, PCOLS
137
138 KDEAD, DEAD
139 KALIVE, ALIVE
140
141 KNMCO, 1-PCOLS / NEGATIVE OF LAST COLUMN ADDRESS
142 KNMROW, 1-PROWS / NEGATIVE OF LAST ROW ADDRESS
143 KBORD, BORDER
144
145 KCOLM1, -1
146 KCOLP1, 1
147 KROWM1, -100
148 KROWP1, 100
149
150 /********************************************************************
151 / ZERO PAGE POINTERS AND SHORTCUTS
152
153 XDUMPS, DUMPS / START DATA DUMP
154 XDUMPT, DUMPT / START DATA DUMP
155 XDUMP, DUMP
156 XCALC, CALC
157 XTYPE, TYPE
158 XGET, GET / GET A CELL STATE
159 XSET, SET / SET A CELL TO LIVING
160 XCLEAR, CLEAR / SET A CELL TO DEAD
161 XTSTRT, TSTART
162 XTSTOP, TSTOP
163 XEXIT, EXIT
164 XCOUNT, COUNT
165 /********************************************************************
166 /********************************************************************
167 / MAIN PROGRAM
168 *200
169 CLA CLL
170 DCA TTACT
171 TCF
172 ION / WELCOME TO HELL!
173
174 MLOOP, / MAIN EVENT LOOP
175 JMS I XDUMP / START A DUMP, PLEASE
176 JMS I XCALC / CALCULATE NEW DATA
177 CLA CLL
178 TAD TTACT
179 SZA
180 JMP .-2
181 CLA CLL
182 TAD TPTR
183 DCA DPTR
184 TAD SPTR
185 DCA TPTR
186 TAD DPTR
187 DCA SPTR
188 JMP MLOOP
189
190 EXIT, CLA CLL
191 IOF
192 TAD ADR1
193 JMS I XCOUNT
194 HLT
195
196 JMP 200
197
198 ADR1, 0202
199 /********************************************************************
200 / INTERRUPT HANDLER
201
202 PAGE
203
204 IHAND, DCA INTAC / SAVE AC AND LINK
205 RAR
206 DCA INTLNK
207
208 KSF
209 SKP
210 JMP TTIHAN / TELETYPE INPUT
211 TSF
212 SKP
213 JMP TTOHAN / TELETYPE OUTPUT
214
215 HLT / OH, AN UNKNOWN INTERRUPT!
216
217 / RESTORE AC AND LINK AND GO BACK TO WORK
218
219 IEND, CLA CLL
220 TAD INTLNK
221 RAL
222 TAD INTAC
223 ION
224 JMP I INTR / BACK TO NORMAL OPERATION
225
226 /********************************************************************
227 / TELETYPE INPUT HANDLER
228
229 TTIHAN,
230 KRB / READ AND CLEAR FLAG
231 AND K177 / MASK TO 7 BITS - I HATE PARITY!
232 DCA KBCHAR / SAVE FOR USE
233
234 TAD KBCHAR
235 TAD CKDMPS
236 SNA
237 JMS I XDUMPS / SOURCE DUMP (DEBUG)
238
239 CLA CLL
240 TAD KBCHAR
241 TAD CKDMPT
242 SNA
243 JMS I XDUMPT / TARGET DUMP (DEBUG)
244
245 CLA CLL
246 TAD KBCHAR
247 TAD CKDUMP
248 SNA
249 JMS I XDUMP / NORMAL DUMP
250
251 CLA CLL
252 TAD KBCHAR
253 TAD CKKILL
254 SNA
255 JMP I XEXIT
256
257 CLA CLL
258 TAD KBCHAR
259 TAD CKHALT
260 SNA
261 HLT
262
263 JMP IEND
264
265 K177, 177
266 KBCHAR, 0
267
268 / COMMAND KEYS
269
270 CKDUMP, -104 / D
271 CKDMPS, -123 / S
272 CKDMPT, -124 / T
273
274 CKKILL, -3 / CTRL-C
275 CKHALT, -10 / CTRL-H
276
277 /********************************************************************
278 / TELETYPE OUTPUT HANDLER AND MANAGEMENT
279
280 TTOHAN,
281 TCF / CLEAR FLAG
282 TAD TTACT / ACTIVITY GOING ON?
283 SZA
284 JMP TRESUM / JUMP INTO ONGOING ACTIVITY
285 HLT / DEBUG HALT - THIS SHOULD NEVER BE HIT!
286 JMP IEND / DO NOTHING, SAY GOODBYE.
287
288 TSTART, 0 / SCHEDULE TYPING TO BE DONE. NEW "PROCESS"
289 / STARTS ONE WORD AFTER THIS CALL'S REGULAR
290 / RETURN.
291 DCA TAC / SAVE AC FOR NOW
292
293 / TSWAIT, CLA CLL
294 / TAD TTACT
295 / SZA
296 / JMP TSWAIT / WAIT UNTIL TYPING SYSTEM IS IDLE!
297
298 CLA CLL
299 TAD TTACT
300 SZA
301 JMP I TSTART / RETURN, WE'RE BUSY!
302
303 ISZ TTACT / NOW IT IS ACTIVE (AGAIN?)
304 TAD TAC / GET BACK THE TEMPORARY AC
305 DCA SAVTAC / SAVE FOR NEW THREAD
306 RAR
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
313
314 TYPE, 0 / TYPE CHARACTER
315 TLS / GET IT OUT!
316 DCA SAVTAC / SAVE AC, JUST POLITE
317 RAR
318 DCA SAVTLI / SAVE LINK, STILL POLITE
319 JMP IEND / END OF INTERRUPT HANDLING
320 TRESUM, TAD SAVTLI
321 RAL
322 TAD SAVTAC
323 JMP I TYPE / WAKE UP INTERRUPTED PROCESS
324
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
329
330 /********************************************************************
331 / THE CALCULATION
332 PAGE
333 CCADDR, 0 / CURRENT CELL ADDRESS
334 CROW, 0
335 CCOL, 0
336 NBORS, 0
337
338 CALC, 0
339 CLA CLL
340 DCA CCADDR
341
342 TAD KROWS
343 CIA
344 DCA CROW
345
346 CRLOOP, CLA CLL
347 TAD KCOLS
348 CIA
349 DCA CCOL
350
351 CCLOOP,
352 / NOW, DO IT, PLEASE!
353 TAD CCADDR
354 JMS I XCOUNT
355 DCA NBORS
356
357 TAD CCADDR
358 JMS I XGET
359 SNA
360 JMP ISDEAD
361
362 ISALIV, CLA CLL
363 TAD NBORS
364 TAD KN4
365 SMA
366 JMP DIE
367
368 CLA CLL
369 TAD NBORS
370 TAD KN2
371 SMA
372 JMP LIVE
373 JMP DIE
374
375 ISDEAD, TAD NBORS
376 TAD KN3
377 SZA
378 JMP DIE
379 JMP LIVE
380
381 LIVE, CLA CLL
382 TAD CCADDR
383 JMS I XSET / NOW, IT'S ALIVE!
384 JMP CDONE
385 DIE, CLA CLL
386 TAD CCADDR
387 JMS I XCLEAR
388 CDONE, CLA CLL
389
390 ISZ CCADDR
391 ISZ CCOL
392 JMP CCLOOP
393
394 TAD CCADDR
395 TAD K100
396 AND K7700
397 ISZ CROW
398 JMP CRLOOP
399
400 JMP I CALC
401 KN2, -2
402 KN3, -3
403 KN4, -4
404 K100, 100
405
406 /********************************************************************
407 / DATA DUMPING
408 PAGE
409 NLINE=JMS CRLF
410
411 DBASE, 0
412 DDPTR, 0
413 DOFF, 0
414
415 DUMPS, 0
416 JMS I XTSTRT
417 JMP I DUMPS
418 CLA
419 TAD SPTR
420 DCA DBASE
421 JMP DMPINT
422
423 DUMPT, 0
424 JMS I XTSTRT
425 JMP I DUMPT
426 CLA
427 TAD TPTR
428 DCA DBASE
429 JMP DMPINT
430
431 DUMP, 0
432 JMS I XTSTRT
433 JMP I DUMP
434 CLA
435 TAD DPTR
436 DCA DBASE
437
438 DMPINT, DCA DOFF
439
440 TAD KROWS
441 CIA
442 DCA ROWCNT
443
444 NLINE;NLINE
445
446 / START OF ROW
447 RLOOP, CLA CLL
448 TAD KCOLS
449 CIA
450 DCA COLCNT
451 TAD K200
452 DCA DMSK
453
454 TAD DBASE / BUFFER BASE ADDRESS
455 TAD DOFF / CURRENT WORD OFFSET
456 DCA DDPTR / TO INTERNAL POINTER
457
458 / START OF COLUMN
459 CLOOP, TAD DMSK / BIT MASK, DYNAMIC
460 AND I DDPTR / COMBINE CURRENT WORD
461 SZA
462 JMP ONE
463 ZERO, TAD KDEAD
464 JMP TT
465 ONE, CLA
466 TAD KALIVE
467 TT, JMS I XTYPE
468
469 CLA CLL
470 TAD DMSK
471 RAR
472 SZA
473 JMP MASKOK
474 TAD K200
475 ISZ DDPTR
476 MASKOK, DCA DMSK
477
478 ISZ COLCNT
479 JMP CLOOP
480
481 NLINE
482
483 CLA CLL
484 TAD DOFF
485 TAD K10
486 DCA DOFF
487
488 ISZ ROWCNT
489 JMP RLOOP
490
491 JMP I XTSTOP / STOP INTERRUPT MADNESS.
492
493 CRLF, 0
494 CLA CLL
495 TAD CR
496 JMS I XTYPE
497 CLA CLL
498 TAD LF
499 JMS I XTYPE
500 JMP I CRLF
501
502 DMSK, 0
503 CR, 215
504 LF, 212
505
506 ROWCNT, 0
507 COLCNT, 0
508
509 /********************************************************************
510 / NEIGHBORHOOD COUNTING
511 / (ADDRESS IN AC)
512 PAGE
513 POS, 0
514
515 COUNT, 0
516 DCA POS
517 DCA CNT
518
519 TAD POS
520 TAD KCOLM1 / STEP LEFT
521 TAD KROWM1 / STEP UP
522 JMS ACCNT
523
524 TAD KCOLP1
525 JMS ACCNT
526
527 TAD KCOLP1
528 JMS ACCNT
529
530 TAD KROWP1
531 JMS ACCNT
532
533 TAD KROWP1
534 JMS ACCNT
535
536 TAD KCOLM1
537 JMS ACCNT
538
539 TAD KCOLM1
540 JMS ACCNT
541
542 TAD KROWM1
543 JMS ACCNT
544
545 CLA CLL
546 TAD CNT
547 JMP I COUNT
548
549 ACCNT, 0
550 DCA POS
551 TAD POS
552 JMS I XGET
553 SZA
554 ISZ CNT
555 CLA CLL
556 TAD POS
557 JMP I ACCNT
558
559 CNT, 0 / COUNTER VARIABLE
560
561
562 /********************************************************************
563 / DATA HOLDING AND ACCESS
564
565 PAGE / START ON NEW PAGE
566
567 / INTERNAL DATA
568
569 CADR, 0 / CURRENT CELL ADDRESS
570 MASK, 0 / BIT MASK TO CURRENT CELL BIT
571 APTR, 0 / ACCESS POINTER TO CURRENT CELL WORD
572
573 / GET A BIT OF DATA
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
577 TAD APTR
578 TAD SPTR / ADD SOURCE DATA BASE
579 DCA APTR
580 TAD I APTR / LOAD DATA
581 AND MASK / MASK OUT DESIRED BIT
582 SZA
583 CLA CLL IAC / MAKE A ONE OUT OF AC CONTENTS
584 JMP I GET / RETURN
585
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
589 TAD APTR
590 TAD TPTR / ADD SOURCE DATA BASE
591 DCA APTR
592 TAD MASK / GET MASK
593 CMA / INVERT
594 AND I APTR / COMBINE WITH DATA
595 TAD MASK / SET BIT
596 DCA I APTR / UPDATE DATA
597 JMP I SET / RETURN
598
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
602 TAD APTR
603 TAD TPTR / ADD SOURCE DATA BASE
604 DCA APTR
605 TAD MASK / GET MASK
606 CMA / INVERT
607 AND I APTR / COMBINE WITH DATA
608 DCA I APTR / UPDATE DATA
609 JMP I CLEAR / RETURN
610
611 ASETUP, 0
612 DCA CADR / SAVE ADDRESS FOR LATER USE
613
614 / LIMIT CHECK
615 TAD CADR
616 BSW / NOW ROW ADDRESS IN LOWER BITS
617 AND K77 / MASK OUT UPPER BITS
618 TAD KNMROW
619 SPA
620 JMP LGD1 / ONE LIMIT GOOD
621 CLA
622 TAD KBORD / BORDER STANDARD RETURN VALUE
623 JMP I ASETUP / ERROR RETURN
624 LGD1, CLA CLL
625 TAD CADR
626 AND K77
627 TAD KNMCO
628 SPA
629 JMP LGD2
630 CLA CLL
631 TAD KBORD
632 JMP I ASETUP / ERROR RETURN
633 LGD2, CLA CLL
634
635 / SETUP POINTER AND MASK
636 TAD CADR
637 RTR
638 RAR
639 AND K377
640 DCA APTR / ACCESS POINTER
641 TAD CADR
642 AND K7
643 TAD MASKSP
644 DCA MPTR
645 TAD I MPTR
646 DCA MASK
647
648 ISZ ASETUP / PREPARE GOOD RETURN
649 JMP I ASETUP / GOOD RETURN
650
651
652
653 MPTR, 0
654 MASKSP, MASKS
655 MASKS, 200
656 100
657 040
658 020
659 010
660 004
661 002
662 001
663
664
665
666 /********************************************************************
667 /********************************************************************
668 PAGE
669 DATA0,
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
702
703 PAGE
704 DATA1,
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
737
738
739 /********************************************************************
740 /********************************************************************
741 / THIS IS IT, FOLKS!
742 /********************************************************************
743 /********************************************************************
744 $
745
746