home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG121.ARC / CPMUTILS.ARK / LIFE.AQM / LIFE.ASM
Assembly Source File  |  1988-08-07  |  16KB  |  786 lines

  1. ; THIS PROGRAM WILL BE PERFORM THE NECESSARY ANALYSIS
  2. ; TO DO THE GAME OF LIFE.
  3. ; STARTED 4/2/83 LAST UPDATE 5/15/83
  4. ;
  5. ; MODIFIED FOR THE VT/180 STARTED 6/16/83
  6. ; MODIFIED TO MAKE RESPONSE CHARACTER EITH LOWER OR
  7. ; UPPER CASE. 5/10/84
  8. ;
  9. VT    EQU    000H    ;-1=VT/180;0=OSBORNE
  10. GRAPH    EQU    0FFH    ;0=NO GRAPHICS,-1=OSBORNE GRAPHICS
  11. ;
  12. BDOS    EQU    0005H        ;SYSTEM CALL ADDRESS
  13. ESC    EQU    27        ;'ESCAPE' CODE
  14. HOME    EQU    26        ; CLEAR SCREEN CODE
  15. ;
  16.     ORG    0100H        ;START
  17.     LXI    H,0
  18.     DAD    SP
  19.     SHLD    OLDSP        ;SAVE STACK POINTER
  20. INIT    LXI    SP,STACK
  21. IF NOT VT
  22.     MVI    E,HOME        ;GET CHARACTER TO CLEAR SCREEN
  23.     CALL    OUTCH        ;SEND IT
  24. ENDIF
  25. IF VT
  26.     MVI    E,ESC        ;GET CHARACTER TO CLEAR SCREEN
  27.     CALL    OUTCH        ;SEND IT
  28.     MVI    E,'['        
  29.     CALL    OUTCH        
  30.     MVI    E,'2'        
  31.     CALL    OUTCH        
  32.     MVI    E,'J'        
  33.     CALL    OUTCH        
  34. ENDIF
  35. ;
  36. ;CLEAR BUFFER
  37. ;
  38. CLEAR    LXI    D,BUFFER    ;GET BUFFER ADDRESS
  39.     LXI    B,2000H        ;GET BUFFER SIZE
  40. REPEAT    MVI    A,0        ;CLEAR A
  41.     STAX    D        ;STORE AT (DE)
  42.     INX    D        ;INCREMENT (DE)
  43.     DCX    B        ;DECREMENT (BC)
  44.     MOV    A,B        ;A < B
  45.     ORA    A        ;ARE WE DONE?
  46.     JNZ    REPEAT        ;IF NOT, REPEAT
  47. ;
  48.     LXI    B,0        ;CLEAR GENERATION COUNTER
  49.     PUSH    B        ;SAVE IT
  50. IF GRAPH
  51.     MVI    E,ESC        ;GET ESCAPE
  52.     CALL    OUTCH        ;SEND IT
  53.     MVI    E,'G'        ;GET END GRAPHICS
  54.     CALL    OUTCH        ;SEND IT
  55. ENDIF
  56.     CALL    START        ;ENTER PATTERN
  57. IF VT
  58.     MVI    E,ESC        ;GET CHARACTER TO CLEAR SCREEN
  59.     CALL    OUTCH        ;SEND IT
  60.     MVI    E,'['        
  61.     CALL    OUTCH        
  62.     MVI    E,'2'        
  63.     CALL    OUTCH        
  64.     MVI    E,'J'        
  65.     CALL    OUTCH        
  66. ENDIF
  67. IF GRAPH
  68.     MVI    E,ESC        ;GET ESCAPE
  69.     CALL    OUTCH        ;SEND IT
  70.     MVI    E,'g'        ;GET START GRAPHICS
  71.     CALL    OUTCH        ;SEND IT
  72. ENDIF
  73.     CALL     READ        ;PRINT INITIAL PATTERN
  74. DO    CALL     SCAN        ;PROCESS NEXT GENERATION
  75.     CALL    READ        ;PRINT RESULTS
  76.     POP    B        ;GET GEN COUNTER
  77.     INX    B        ;INCREMENT IT
  78.     PUSH    B        ;SAVE IT
  79.     CALL    DECODE        ;DECODE GENERATION
  80.     MOV    A,E        ;STORE ASCII
  81.     STA    GENN+3
  82.     MOV    A,D
  83.     STA    GENN+2
  84.     MOV    A,C
  85.     STA    GENN+1
  86.     MOV    A,B
  87.     STA    GENN
  88. IF NOT VT
  89.     MVI    H,23        ;SET SCREEN POSITION
  90.     MVI    L,0
  91.     CALL    POSCUR        ;MOVE TO BOTTOM OF SCREEN
  92. ENDIF
  93.     MVI    C,9        ;SET PRINT STRING
  94.     LXI    D,STRING    ;GET ADDRESS
  95.     CALL    BDOS        ;DO IT
  96.     MVI    C,0BH        ;TEST CONSOLE
  97.     CALL    BDOS
  98.     CPI    0        ;IF NOT (NOT READY)
  99.     CNZ    CONT        ;CALL CONTINUE
  100.     JMP    DO        ;REPEAT
  101. ;
  102. ;CONTINUE ?
  103. ;
  104. IF NOT VT
  105.  CONT    MVI    H,23        ;SET SCREEN POSITION
  106.     MVI    L,0
  107.     CALL    POSCUR        ;MOVE TO BOTTOM OF SCREEN
  108.     MVI    C,1        ;GET STOP CHARACTER
  109.     CALL    BDOS
  110.     CPI    03H        ;SEE IF ^C
  111.     JZ    STOP        ;IS SO STOP
  112.     MVI    H,23        ;SET SCREEN POSITION
  113.     MVI    L,0
  114.     MVI    E,'?'        ;SET CHARACTER '?'
  115.     CALL    POSCHR        ;MOVE TO BOTTOM OF SCREEN
  116. ENDIF
  117. IF VT
  118. CONT    MVI    C,9        ;SET PRINT STRING
  119.     LXI    D,STRING3    ;GET ADDRESS;
  120.     CALL    BDOS        ;DO IT
  121.     MVI    C,1        ;GET STOP CHARACTER
  122.     CALL    BDOS        
  123.     CPI    03H        ;SEE IF ^C
  124.     JZ    STOP        ;IS SO STOP
  125.     MVI    C,9        ;SET PRINT STRING
  126.     LXI    D,STRING2    ;GET ADDRESS
  127.     CALL    BDOS        ;DO IT
  128. ENDIF
  129.     MVI    H,0BAH        ;LOAD TIMER COUNTER
  130.     PUSH    H        ;STORE IT
  131. CONT3    MVI    C,0BH        ;SEE IF CONSOLE READY
  132.     CALL    BDOS
  133.     CPI    0        ;IF NOT (NOTREADY)
  134.     JNZ    CONT4        ;GET CHARACTER
  135.     POP    H        ;GET TIMER
  136.     INX    H        ;INCREMENT IT
  137.     MOV    A,H        ;TEST TIMER
  138.     CPI    0        ;IF FINISHED
  139.     RZ            ;RETURN
  140.     PUSH    H        ;IF NOT STORE TIMER
  141.     JMP    CONT3        ;REPEAT
  142. CONT4    POP    H        ;CLEAR STACK
  143.     MVI    C,1        ;MODE- CONSOLE READ    
  144.     CALL    BDOS        ;GET CHARACTER
  145.     CPI    03H        ;SEE IF ^C
  146.     JZ    STOP        ;IS SO STOP
  147.     ANI    4FH        ;MAKE UPPER CASE
  148.     CPI    4EH        ;SEE IF 'N'
  149.     JZ    CONT2        ;IF SO CONTINUE
  150.     RET            ;OTHERWISE RETURN
  151. CONT2    POP    H        ;CLEAR STACK RETURN ADD
  152. IF GRAPH
  153.     MVI    E,ESC        ;GET ESCAPE
  154.     CALL    OUTCH        ;SEND IT
  155.     MVI    E,'G'        ;GET END GRAPHICS
  156.     CALL    OUTCH        ;SEND IT
  157. ENDIF
  158.     JMP    INIT        ;GOTO START
  159. ;
  160. ;STOP
  161. ;
  162. STOP
  163. IF GRAPH
  164.     MVI    E,ESC        ;GET ESCAPE
  165.     CALL    OUTCH        ;SEND IT
  166.     MVI    E,'G'        ;GET END GRAPHICS
  167.     CALL    OUTCH        ;SEND IT
  168. ENDIF
  169.     MVI    H,23        ;SET SCREEN POSITION
  170.     MVI    L,0
  171.     CALL    POSCUR        ;MOVE TO BOTTOM OF SCREEN
  172.     LXI    D,NAME
  173.     MVI    C,9
  174.     CALL    BDOS
  175.     LHLD    OLDSP        ;GET OLD STACK ADDRESS
  176.     SPHL
  177.     RET
  178. ;
  179. ; SUBROUTINE TO PROCESS ARRAY
  180. ; 1 = REMAIN FROM PREVIOUS GENERATION
  181. ; 4 = CREATE IN NEXT GENERATION
  182. ; 5 = DIE IN NEXT GENERATION
  183. ;
  184. ;MOVE FIRST LINES TO BUFFER END
  185. ;
  186. SCAN    LXI    B,0100H        ;LOAD COUNTER
  187.     LXI    D,BUFFER+0800H    ;LOAD STORE ADDRESS
  188.     LXI    H,BUFFER    ;LOAD FIND ADDRESS
  189.     DB    0EDH    ;LDIR    ;MOVE BLOCK
  190.     DB    0B0H
  191. ;
  192.     LXI    H,BUFFER    ;GET BUFFER ADDRESS
  193. SCAN1    PUSH    H        ;STORE IT
  194.     LXI    D,03EH        ;GET OFFSET TO NEXT LINE
  195.     MVI    A,0        ;CLEAR COUNTER
  196.     MVI    B,0        ;CLEAR INDICATOR B=1 IF CENTER
  197.     DB    0CBH    ;BIT 0,(HL)
  198.     DB    046H        ;LOCATION -1,-1
  199.     CNZ    ADDA        ;TEST IF OCCUPIED IF SO CALL ADDA
  200.     INX    H        ;INDEX ADDRESS
  201.     DB    0CBH    ;BIT 0,(HL)
  202.     DB    046H        ;LOCATION -1,0
  203.     CNZ    ADDA
  204.     INX    H
  205.     DB    0CBH    ;BIT 0,(HL)
  206.     DB    046H        ;LOCATION -1, 1
  207.     CNZ    ADDA
  208.     DAD    D        ;GO TO NEXT LINE
  209.     DB    0CBH    ;BIT 0,(HL)
  210.     DB    046H        ;LOCATION  0,-1
  211.     CNZ    ADDA
  212.     INX    H
  213.     DB    0CBH    ;BIT 0,(HL)
  214.     DB    046H        ;LOCATION  0, 0
  215.     CNZ    ADDB
  216.     INX    H
  217.     DB    0CBH    ;BIT 0,(HL)
  218.     DB    046H        ;LOCATION  0, 1
  219.     CNZ    ADDA
  220.     DAD    D        ;GO TO NEXT LINE
  221.     DB    0CBH    ;BIT 0,(HL)
  222.     DB    046H        ;LOCATION  1,-1
  223.     CNZ    ADDA
  224.     INX    H
  225.     DB    0CBH    ;BIT 0,(HL)
  226.     DB    046H        ;LOCATION  1, 0
  227.     CNZ    ADDA
  228.     INX    H
  229.     DB    0CBH    ;BIT 0,(HL)
  230.     DB    046H        ;LOCATION  1, 1
  231.     CNZ    ADDA
  232.     DB    0CBH    ;BIT 0,B
  233.     DB    040H
  234.     JZ    BIRTH        ;CHECK TO SEE IF CREATE
  235.     SUI    5        ;SEE IF MORE THAN 3 NEIGHBORS
  236.     JP    KILL        ;IF SO KILL
  237.     ADI    2        ;SEE IF LESS THAN 2 NEIGHBORS
  238.     JP    SCAN5        ;IF NOT CONTINUE
  239. KILL    MVI    A,5        ;MARK KILL POSITION
  240.     JMP    CONTI        ;CONTINUE
  241. BIRTH    SUI    3        ;SEE IF EXACTLY 3 NEIGHBORS
  242.     JNZ    SCAN5        ;IF NOT CONTINUE
  243.     MVI    A,4        ;STORE RESULTS
  244. CONTI    POP    H        ;GET CURRENT ADDRESS
  245.     PUSH    H        ;STORE IT AGAIN
  246.     LXI    D,041H        ;OFF SET TO CENTER
  247.     DAD    D        ;ADD TO ADDRESS
  248.     MOV    M,A        ;STORE NEW CONTENTS
  249. SCAN5    POP    H        ;GET ADDRESS AGAIN
  250.     INX    H        ;INCREMENT IT
  251.     MOV    A,H
  252.     SUI    0EH        ;SEE IF GTREATER THAN 1A
  253.     JM    SCAN1        ;IF SO REPEAT
  254. ;
  255. ;MOVE FIRST LINE BACK TO BEGINNING OF BUFFER
  256. ;
  257.     LXI    B,041H        ;LOAD COUNTER
  258.     LXI    D,BUFFER    ;LOAD STORE ADDRESS
  259.     LXI    H,BUFFER+0800H    ;LOAD FIND ADDRESS
  260.     DB    0EDH    ;LDIR    ;MOVE BLOCK
  261.     DB    0B0H
  262.     RET            ;RETURN
  263. ;
  264. ADDB    MVI    B,1        ;MARK IF CENTER OCCUPIED
  265. ADDA    ADI    1        ;ADD IF OCCUPIED
  266.     RET            ;RETURN
  267. ;
  268. ;SUBROUTINE TO DECODE PATTERN AND DISPLAY
  269. ;IT READS BUFFER AND CALLS SETSCR
  270. ;NOTE: SCREEN SIZE IS LIMITED TO 24 IN THE Y DIRECTION
  271. ;AND 50 IN THE X DIRECTION
  272. ;
  273. READ    LXI    H,0        ;CLEAR SCREEN ADDRESS
  274.     LXI    B,0        ;CLEAR GENERATION COUNTER 
  275. READ1    PUSH    H        ;SAVE ADDRESS
  276.     LXI    D,BUFFER    ;GET OFFSET
  277.     DAD    D        ;ADD TO SCREEN ADDRESS
  278.     MOV    A,M        ;GET CONTENTS
  279.     ANI    0FFH        ;SEE IF OTHER THAN 0
  280.     JZ    READ2        ;IF SO DECODE AND PRINT
  281.     SUI    5        ;CHECK IF LOCATION IS TO DIE
  282.     JP    BLANK        ;IF SO, SEND BLANK
  283.     INX    B        ;INCREMENT COUNTER
  284.     ADI    2        ;CHECK IF NEW LOCATION
  285.     JM    READ2        ;IF NOT CONTINUE
  286.     MVI    A,1        ;REPLACE NEW LOCATION
  287.     MOV    M,A        ;STORE IT
  288. IF GRAPH
  289.     MVI    E,0DH        ;SET GRAPHICS DOT
  290. ENDIF
  291. IF NOT GRAPH
  292.     MVI    E,'*'        ;SET DISPLAY CHARACTER
  293. ENDIF
  294.     JMP    PRINT        ;PRINT IT
  295. BLANK    MVI    A,0        ;CLEAR LOCATION
  296.     MOV    M,A        ;STORE IT
  297.     MVI    E,' '        ;CLEAR CHARACTER
  298. PRINT    POP    H        ;GET SCREEN ADDRESS
  299.     PUSH    H        ;SAVE IT
  300.     MOV    A,H        ;FIND Y
  301.     RLC            ;SHIFT Y VALUES
  302.     RLC
  303.     DB    0CBH    ;BIT 6,L
  304.     DB    075H
  305.     JZ    PRINT1        ;IF BIT SET
  306.     ADI    1        ;INCREMENT Y ADDRESS
  307. PRINT1    DB    0CBH    ;BIT 7,L
  308.     DB    07DH
  309.     JZ    PRINT2        ;IF BIT SET
  310.     ADI    2        ;INCREMENT Y ADDRESS
  311. PRINT2    MOV    H,A        ;STORE Y
  312.     MOV    A,L        ;  GET X
  313.     ANI    03FH        ;CANCEL BITS MOVED TO H
  314.     MOV    L,A        ;SAVE X
  315.     SUI    79        ;SEE IF X GREATER THAN SCREEN
  316.     JP    READ2        ;IF SO CONTINUE        
  317.     MOV    A,H        ;SEE IF Y GREATER THEN SCREEN SIZE
  318.     SUI    23        
  319.     JP    READ2        ;IF SO CONTINUE
  320.     PUSH    B        ;SAVE COUNTER
  321.     CALL    POSCHR        ;IF NOT PRINT CHARACTER
  322.     POP    B        ;GET COUNTER BACK
  323. READ2    POP    H        ;RESTORE ADDRESS
  324.     INX    H        ;INDEX ADDRESS
  325.     MOV    A,H        ;SEE IF GREATER THEN 18H
  326.     SUI    0EH
  327.     JM    READ1        ;IF NOT REPEAT
  328.     PUSH    B        ;SAVE POPULATION
  329.     CALL    DECODE        ;DECODE POPULATION
  330.     MOV    A,E        ;MOVE ASCII TO STORAGE
  331.     STA    POPN+3
  332.     MOV    A,D
  333.     STA    POPN+2
  334.     MOV    A,C
  335.     STA    POPN+1
  336.     MOV    A,B
  337.     STA    POPN
  338.     POP    B        ;GET POPULATION
  339.     MOV    A,B        ;TEST UPPER BYTE
  340.     CPI    0        ;IF NOT ZERO RETURN
  341.     RNZ
  342.     MOV    A,C        ;TEST LOWER BYTE
  343.     CPI    0        ;IF NOT ZERO RETURN
  344.     RNZ            
  345.     POP    H        ;CLEAR STACK RETURN ADD
  346.     MVI    H,23        ;SET SCREEN POSITION
  347.     MVI    L,0
  348.     MVI    E,'?'        ;SET CHARACTER '?'
  349.     CALL    POSCHR        ;MOVE TO BOTTOM OF SCREEN
  350.     MVI    C,1        ;MODE- CONSOLE READ    
  351.     CALL    BDOS        ;GET CHARACTER
  352.     CPI    53H        ;SEE IF 'S'
  353.     JZ    STOP        ;IS SO STOP
  354. IF GRAPH
  355.     MVI    E,ESC        ;GET ESCAPE
  356.     CALL    OUTCH        ;SEND IT
  357.     MVI    E,'G'        ;GET END GRAPHICS
  358.     CALL    OUTCH        ;SEND IT
  359. ENDIF
  360.     JMP    INIT
  361. ;
  362. ;SUBROUTINE TO WRITE CHARACTER TO ANY SCREEN POSITION
  363. ;THE CHARATER CODE IS SENT IN REGISTER E
  364. ;THE Y POSITION IS SENT    IN REGISTER H
  365. ;THE X POSITION IS SENT    IN REGISTER L
  366. POSCHR    PUSH    D        ;SAVE CHARATER
  367.     CALL    POSCUR
  368.     POP    D
  369. OUTCH    MVI    C,2        ;SET FUNCTION WRITE
  370.     CALL    BDOS        ;CALL BDOS
  371.     RET
  372. ;
  373. ;SUBROUTINE TO POSITION CURSOR
  374. ;THE Y POSITION IS SENT    IN REGISTER H
  375. ;THE X POSITION IS SENT    IN REGISTER L
  376. IF NOT VT
  377. POSCUR    LXI    D,2020H        ;LOAD OFFSETS
  378.     DAD    D        ;ADD TO LOCATIONS
  379.     PUSH    H        ;SAVE LOCATIONS
  380.     MVI    E,ESC        ;LOAD 'ESCAPE'
  381.     CALL    OUTCH        ;SEND 'ESCAPE'
  382.     MVI    E,'='        ;LOAD  '='
  383.     CALL    OUTCH        ;SEND  '='
  384.     POP    H        ;GET Y LOCATION
  385.     MOV    E,H        ;LOAD Y LOCATION
  386.     PUSH    H        ;SAVE X LOCATION
  387.     CALL    OUTCH        ;SEND Y LOCATION
  388.     POP    D        ;GET  X LOCATION
  389.     CALL    OUTCH        ;SEND X LOCATION
  390.     RET            ;RETURN
  391. ENDIF
  392. ;
  393. ; A NOTE THE VT/180 HAS TO HAVE THE ADDRESS CODE SENT AS THE 
  394. ; ESC,[,A1,A2,;,A1,A2,H  WHERE A1 AND A2 ARE THE ASCII CODES 
  395. ; FOR THE SCREEN POSITION 
  396. ;
  397. IF VT
  398. POSCUR    INR    H
  399.     INR    H
  400.     INR    L
  401.     MOV    B,H
  402.     CALL    DEC        ;DECODE VERTICAL POSITION
  403.     MOV    A,E        ;STORE ASCII
  404.     STA    VP+1
  405.     MOV    A,D
  406.     STA    VP
  407.     MOV    B,L
  408.     CALL    DEC        ;DECODE VERTICAL POSITION
  409.     MOV    A,E        ;STORE ASCII
  410.     STA    HP+1
  411.     MOV    A,D
  412.     STA    HP
  413.     MVI    C,9
  414.     LXI    D,PSTRING
  415.     CALL    BDOS
  416.     RET            ;RETURN
  417. PSTRING    DB    1BH,'['
  418. VP    DB    '  '
  419.     DB    ';'
  420. HP    DB    '  '
  421.     DB    'H'
  422.     DB    '$'
  423. ;
  424. ;SUBROUTINE TO DECODE NUMBERS INTO DECIMAL ASCII
  425. ;NUMBER SENT IN REGISTER B
  426. ;ASCII RETURNED IN C,D,E
  427. ;
  428. DEC    MOV    A,B        ;GET NUMBER
  429.     LXI    B,0        ;CLEAR STORAGE
  430.     LXI    D,0        ;CLEAR STOIRAGE
  431. DC1    SBI    100        ;
  432.     JM    DC2        ;IF NOT GO ON
  433.     INR    C
  434.     JMP    DC1
  435. DC2    ADI    100
  436.     MOV    B,A
  437.     MOV    A,C
  438.     ADI    30H
  439.     MOV    C,A
  440.     MOV    A,B
  441. DC3    SBI    10        ;
  442.     JM    DC4        ;IF NOT GO ON
  443.     INR    D
  444.     JMP    DC3
  445. DC4    ADI    10
  446.     MOV    B,A
  447.     MOV    A,D
  448.     ADI    30H
  449.     MOV    D,A
  450.     MOV    A,B
  451. DC5    SBI    1        ;
  452.     JM    DC6        ;IF NOT GO ON
  453.     INR    E
  454.     JMP    DC5
  455. DC6    MOV    A,E
  456.     ADI    30H
  457.     MOV    E,A
  458.     RET
  459. ENDIF
  460. ;
  461. ;WRITE BUFFER - CREATE TEST PATTERN
  462. ;
  463. WRITE    MVI    E,HOME        ;GET CHARACTER TO CLEAR SCREEN
  464.     CALL    OUTCH        ;SEND IT
  465.     POP    H
  466.     MVI    A,4        ;CHARACTER FOR BUFFER
  467.     LXI    H,BUFFER    ;GET ADDRESS
  468.     LXI    D,0218H        ;GET OFFSET
  469.     DAD    D        ;ADD TO ADDRESS
  470.     PUSH    H        ;STORE ADDRESS FOR LATER
  471.     PUSH    H
  472.     MOV    M,A        ;STORE IT
  473.     INX    H        ;INDEX ADDRESS
  474.     MOV    M,A
  475.     INX    H
  476.     MOV    M,A
  477.     INX    H        ;INDEX ADDRESS
  478.     MOV    M,A
  479.     INX    H
  480.     MOV    M,A
  481.     INX    H        ;INDEX ADDRESS
  482.     MOV    M,A
  483.     INX    H
  484.     MOV    M,A
  485.     INX    H        ;INDEX ADDRESS
  486.     MOV    M,A
  487.     INX    H
  488.     MOV    M,A
  489.     LXI    D,0040H        ;INDEX IN Y DIRECTION
  490.     DAD    D        ;INDEX ADDRESS
  491.     MOV    M,A        ;STORE IT
  492.     DAD    D
  493.     MOV    M,A
  494.     DAD    D
  495.     MOV    M,A
  496.     DAD    D
  497.     MOV    M,A
  498.     DAD    D
  499.     MOV    M,A
  500.     DAD    D
  501.     MOV    M,A
  502.     LXI    D,003FH        ;INDEX IN X AND Y DIRECTION
  503.     POP    H        ;GET OLD START ADDRESS
  504.     DAD    D        ;INDEX ADDRESS
  505.     MOV    M,A        ;STORE IT
  506.     DAD    D
  507.     MOV    M,A
  508.     DAD    D
  509.     MOV    M,A
  510.     DAD    D
  511.     MOV    M,A
  512.     DAD    D
  513.     MOV    M,A
  514.     DAD    D
  515.     MOV    M,A
  516.     LXI    D,041H        ;INDEX IN X AND Y DIRECTION
  517.     POP    H        ;GET OLD START ADDRESS
  518.     MOV    A,L
  519.     SUI    7
  520.     MOV    L,A
  521.     MVI    A,4
  522.     DAD    D        ;INDEX ADDRESS
  523.     MOV    M,A        ;STORE IT
  524.     DAD    D
  525.     MOV    M,A
  526.     DAD    D
  527.     MOV    M,A
  528.     DAD    D
  529.     MOV    M,A
  530.     DAD    D
  531.     MOV    M,A
  532.     DAD    D
  533.     MOV    M,A
  534.     RET
  535. ;
  536. WRITE2    MVI    E,HOME        ;GET CHARACTER TO CLEAR SCREEN
  537.     CALL    OUTCH        ;SEND IT
  538.     POP    H
  539.     MVI    A,4        ;CHARACTER FOR BUFFER
  540.     DB    0DDH
  541.     LXI    H,BUFFER    ;GET ADDRESS
  542.     LXI    D,0206H        ;GET OFFSET
  543.     DB    0DDH
  544.     DAD    D        ;ADD TO ADDRESS
  545.     DB    0DDH
  546.     MOV    M,A        ;STORE IT
  547.     DB    0FEH
  548.     DB    0DDH
  549.     MOV    M,A
  550.     DB    0FFH
  551.     DB    0DDH
  552.     MOV    M,A
  553.     DB    0
  554.     DB    0DDH
  555.     MOV    M,A        ;STORE IT
  556.     DB    40H
  557.     DB    0DDH
  558.     MOV    M,A        ;STORE IT
  559.     DB    7FH
  560.     LXI    D,0420H        ;GET OFFSET
  561.     DB    0DDH
  562.     DAD    D        ;ADD TO ADDRESS
  563.     DB    0DDH
  564.     MOV    M,A        ;STORE IT
  565.     DB    0FEH
  566.     DB    0DDH
  567.     MOV    M,A
  568.     DB    0BFH
  569.     DB    0DDH
  570.     MOV    M,A
  571.     DB    0
  572.     DB    0DDH
  573.     MOV    M,A        ;STORE IT
  574.     DB    40H
  575.     DB    0DDH
  576.     MOV    M,A        ;STORE IT
  577.     DB    0C0H
  578.     RET
  579. ;
  580. ;SUBROUTINE TO ACCEPT SCREEN DISPLAY FOR PATTERN
  581. ;
  582. START    MVI    H,12        ;LOAD INITIAL Y
  583.     MVI    L,25        ;LOAD INITIAL X
  584.     MVI    A,4        ;SET INTIAL DIRECTION
  585.     STA    DIR        ;STORE IT
  586.     PUSH    H        ;SAVE IT
  587. IF VT
  588.     JMP    RIGHT
  589. ENDIF
  590. START0    CALL    POSCUR        ;POSITION CURSOR
  591. START1    MVI    C,1        ;MODE- CONSOLE READ    
  592.     CALL    BDOS        ;GET CHARACTER
  593.     CPI    0DH        ;SEE IF CR
  594.     JZ    DONE        ;IS SO RETURN
  595.     CPI    03H        ;SEE IF ^C
  596.     JZ    STOP        ;IS SO STOP
  597.     CPI    04H        ;SEE IF RIGHT
  598.     JZ    RIGHT
  599.     CPI    05H        ;SEE IF UP
  600.     JZ    UP
  601.     CPI    013H        ;SEE IF LEFT
  602.     JZ    LEFT
  603.     CPI    018H        ;SEE IF DOWN
  604.     JZ    DOWN
  605.     CPI    0CH        ;SEE IF RIGHT
  606.     JZ    RIGHT
  607.     CPI    0BH        ;SEE IF UP
  608.     JZ    UP
  609.     CPI    08H        ;SEE IF LEFT
  610.     JZ    LEFT
  611.     CPI    0AH        ;SEE IF DOWN
  612.     JZ    DOWN
  613.     CPI    050H        ;SEE IF P
  614.     JZ    WRITE
  615.     CPI    046H        ;SEE IF F
  616.     JZ    WRITE2
  617.     JMP    START2        ;IF NOT
  618. UP    MVI    A,1        ;SET DIRERCTION MARKER
  619.     STA    DIR        ;STORE IT
  620.     POP    H        ;GET ADDRESS
  621.     MOV    A,H        ;MOVE Y
  622.     SUI    1        ;SUBTRACT 1
  623.     CPI    0FFH        ;SEE IF ZERO
  624.     JNZ    UP1
  625.     MVI    A,22        ;IF SO SET OTHER LIMIT
  626. UP1    MOV    H,A        ;MOVE BACK
  627.     PUSH    H        ;STORE IT
  628.     JMP    START0        ;POSITION CURSOR
  629. LEFT    MVI    A,2        ;SET DIRERCTION MARKER
  630.     STA    DIR        ;STORE IT
  631.     POP    H
  632.     MOV    A,L
  633.     SUI    1
  634.     CPI    0FFH        ;SEE IF ZERO
  635.     JNZ    LEFT1
  636.     MVI    A,78
  637. LEFT1    MOV    L,A
  638.     PUSH    H
  639.     JMP    START0
  640. RIGHT    MVI    A,4        ;SET DIRERCTION MARKER
  641.     STA    DIR        ;STORE IT
  642.     POP    H
  643.     INR    L
  644.     MOV    A,L
  645.     CPI    79        ;SEE IF ZERO
  646.     JNZ    RIGHT1
  647.     MVI    L,0
  648. RIGHT1    PUSH    H
  649.     JMP    START0
  650. DOWN    MVI    A,8        ;SET DIRERCTION MARKER
  651.     STA    DIR        ;STORE IT
  652.     POP    H
  653.     INR    H
  654.     MOV    A,H
  655.     CPI    23        ;SEE IF ZERO
  656.     JNZ    DOWN1
  657.     MVI    H,0
  658. DOWN1    PUSH    H
  659.     JMP    START0
  660. START2    CPI    020H        ;SEE IF SPACE
  661.     JNZ    ST2        ;IF NOT GO ON
  662.     MVI    E,' '        ;SET CHR TO SPACE
  663.     JMP    ST3        ;GO ON
  664. ST2    MVI    E,'*'        ;SET DOT
  665. ST3    POP    H        ;GET ADDRESS
  666.     PUSH    H        ;STORE IT
  667.     PUSH    D        ;SAVE CHR WRITTEN
  668. IF VT
  669.     DCR    H    ;MARK
  670. ENDIF
  671.     CALL    POSCHR        ;PRINT CHARACTER
  672.     POP    D        ;GET CHARACTER
  673.     POP    H        ;GET ADDRESS
  674.     PUSH    H        ;SAVE IT
  675.     MOV    A,H
  676.     RAR            ;SHIFT RIGHT
  677.     JNC    START3        ;IF CLEAR GO ON
  678.     DB    0CBH    ;SET    ;IF NOT SET BIT
  679.     DB    0F5H    ;6,L
  680. START3    RAR            ;SHIFT RIGHT
  681.     JNC    START4        ;IF CLEAR GO ON
  682.     DB    0CBH    ;SET    ;IF NOT SET BIT
  683.     DB    0FDH    ;7,L
  684. START4    ANI    03FH        ;CLEAR UPPER BITS
  685.     MOV    H,A        ;SAVE Y LOCATION
  686.     LXI    B,BUFFER    ;FIND OFFSET
  687.     DAD    B        ;ADD TO ADDRESS
  688.     MOV    A,E        ;GET CHR
  689.     CPI    ' '        ;CAMPARE TO SPACE
  690.     JNZ    ST4        ;IF NOT    GO ON
  691.     MVI    A,0        ;IF SO CLEAR
  692.     JMP    ST5        ;GO ON
  693. ST4    MVI    A,4        ;IF NOT SPACE MARK LOCATION
  694. ST5    MOV    M,A        ;STORE IN BUFFER
  695.     LDA    DIR        ;RECALL DIR
  696.     CPI    1        ;CHECK UP
  697.     JZ    UP
  698.     CPI    2        ;CHECK LEFT
  699.     JZ    LEFT
  700.     CPI    4        ;CHECK RIGHT
  701.     JZ    RIGHT
  702.     CPI    8        ;CHECK DOWN
  703.     JZ    DOWN
  704.     JMP    START1
  705. DONE    POP    H        ;CLEAR STACK
  706.     RET            ;RETURN
  707. ;
  708. DIR    DS    1
  709. ;
  710. ;SUBROUTINE TO DECODE NUMBERS INTO ASCII
  711. ;NUMBER SENT IN REGISTER PAIR B,C
  712. ;ASCII RETURNED IN B,C,D,E
  713. DECODE    MOV    A,C        ;GET LOWEST NIBBLE
  714.     ANI    0FH        ;CLEAR ACCUMULATOR
  715.     ADI    30H        ;MAKE ASCII
  716.     CPI    3AH        ;SEE IF GREATER THEN 9
  717.     JM    D1        ;IF NOT GO ON
  718.     ADI    7        ;INCREMENT TO LETTER
  719. D1    MOV    E,A        ;SAVE LOWEST NIBBLE
  720.     MOV    A,C        ;GET NEXT NIBBLE
  721.     RAR            ;SHIFT OVER
  722.     RAR
  723.     RAR
  724.     RAR
  725.     ANI    0FH
  726.     ADI    30H
  727.     CPI    3AH
  728.     JM    D2
  729.     ADI    7
  730. D2    MOV    D,A
  731.     MOV    A,B        ;GET LOWEST NIBBLE UPPER BYTE
  732.     ANI    0FH
  733.     ADI    30H
  734.     CPI    3AH
  735.     JM    D3
  736.     ADI    7
  737. D3    MOV    C,A
  738.     MOV    A,B        ;GET HIGHEST BYTE
  739.     RAR
  740.     RAR
  741.     RAR
  742.     RAR
  743.     ANI    0FH
  744.     ADI    30H
  745.     CPI    3AH
  746.     JM    D4
  747.     ADI    7
  748. D4    MOV    B,A
  749.     RET
  750. ;
  751. OLDSP    DS    2
  752.     DS    30
  753. STACK    DS    2
  754.  
  755. ;
  756. ;PRINT BUFFER
  757. ;
  758. NAME    DB    0DH,0AH
  759.     DB    'LIFE R.A.R ver 1.61 5/10/84'
  760.     DB    0DH,0AH,'$'
  761. STRING
  762. IF VT
  763.     DB    1BH            
  764.     DB    '[24;0H'        
  765. ENDIF
  766.     DB    '       GENERATION: '
  767. GENN    DB    '    '
  768.     DB    '     POPULATION: '
  769. POPN    DB    '    '
  770. STREND    DB    '$'
  771. IF VT
  772. STRING2    DB    1BH            
  773.     DB    '[24;00H?'        
  774.     DB    '$'            
  775. STRING3    DB    1BH            
  776.     DB    '[24;00H'        
  777.     DB    '$'            
  778. ENDIF
  779. ;
  780. BUFFER    DS    2000H
  781. BUFEND    DS    2
  782. END
  783. END
  784.