home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol075 / oznaki1.asm < prev    next >
Assembly Source File  |  1985-02-09  |  6KB  |  287 lines

  1. ;    ***** LIFE *****
  2. ;
  3. ; A GAME OF LIFE FOR A VDM DISPLAY.
  4. ;
  5. ;Adapted from the 'Oznaki' life program (Dr Dobbs, No. 24)
  6. ;by R. Daniells of the S.A.M.G. Inc.
  7. ;
  8. ;This version of life uses the screen memory of the Processor
  9. ;Technology VDM-1 display to store the current status of the
  10. ;cells.  It should work OK with similar memory mapped VDU's
  11. ;such as the DG-640 with perhaps a few modifications.
  12. ;
  13. ;Caution: Program contains some machine dependant I/O due to
  14. ;the lack of a non-echoing input routine in CP/M.
  15. ;
  16. VDM    EQU    0CC00H    ;START OF VDM MEMORY.
  17. VDMU    EQU    VDM SHR 8  ;HIGH BYTE OF VDM MEMORY.
  18. VDMPT    EQU    0C8H    ;VDM CONTROL PORT (TO INHIBIT SCROLL).
  19. ALIVEC    EQU    0AAH    ;ALIVE CHARACTER.
  20. DEADC    EQU    7FH    ;DEAD CHARACTER.
  21. CR    EQU    0DH    ;CARRIAGE RETURN CHARACTER.
  22. LF    EQU    0AH    ;LINEFEED CHARACTER.
  23. KSTAT    EQU    0    ;KEYBOARD STATUS PORT.
  24. KDATA    EQU    2    ;KEYBOARD DATA PORT.
  25. RDR    EQU    10H    ;KEYBOARD DATA READY MASK.
  26. ENTRY    EQU    5    ;ENTRY TO CP/M.
  27. ;
  28.     ORG    100H
  29. START:    LXI    H,0  ;SAVE CPM'S STACK.
  30.     DAD    SP
  31.     SHLD    OLDSTK
  32. MLOOP:    LXI    SP,NEWSTK ;SET UP NEW LOCAL STACK.
  33.     MVI    A,0
  34.     OUT    0C8H    ;INIT VDM (NO SCROLLING).
  35. CLEAR:    LXI    H,VDM+400H  ;GENERATE DEAD SCREEN.    
  36.     MVI    A,VDMU-1
  37. BLANK:    MVI    M,DEADC
  38.     DCX    H
  39.     CMP    H
  40.     JNZ    BLANK
  41. READY:    PUSH    H
  42.     MVI    A,0    ;CLEAR ONE-GENERATION FLAG.
  43.     STA    ONEFLAG
  44.     LXI    B,0FFC0H  ;NORTH ADDRESS INCREMENT.
  45.               ;B IS ALSO CURSOR CHAR.
  46.     LXI    D,40H    ;SOUTH ADDRESS INCREMENT.
  47. READIN:    MOV    C,M    ;REAL CHAR IN C.
  48.     MOV    M,B
  49. INPUT:    CALL    GETCH    ;WAIT FOR INPUT CHARACTER.
  50.     JZ    INPUT
  51.     MOV    M,C
  52.     MVI    C,0C0H    ;RESTORE C.
  53.     CPI    'C'-40H    ;CONTROL - C?
  54.     JZ    EXIT
  55.     CPI    30H    ;NUMBER?
  56.     JC    NOTNUM
  57.     CPI    3AH    ;NUMBER LESS THAN 9?
  58.     JC    SETSPD
  59. NOTNUM    CPI    'H'    ;REQUEST FOR HELP?
  60.     JZ    HELP
  61.     CPI    'N'    ;MOVEMENT COMMAND?
  62.     CZ    NORTH
  63.     CPI    'S'
  64.     CZ    SOUTH
  65.     CPI    'E'
  66.     CZ    EAST
  67.     CPI    'W'
  68.     CZ    WEST
  69.     CPI    'M'
  70.     CZ    MIDDLE
  71.     CPI    'K'    ;KILL CELL?
  72.     CZ    KILL
  73.     CPI    'L'    ;GRANT LIFE?
  74.     CZ    LIVE
  75.     CPI    'C'    ;CLEAR SCREEN?
  76.     CZ    CLEAR
  77.     CPI    'O'    ;ONE GENERATION ONLY?
  78.     CZ    ONEGEN
  79.     CPI    'G'    ;GO?
  80.     JNZ    READIN
  81.     POP    H    ;SET VDM-1 IN CURRENT GENERATION POINTER.
  82. LIFE    XRA    A    ;INIT CELL COUNTER.
  83.     ADD    M
  84.     DAD    B    ;TO GO NORTH.
  85.     ADD    M
  86.     INX    H    ;TO GO EAST.
  87.     ADD    M
  88.     INX    H    ;TO GO EAST.
  89.     ADD    M
  90.     DAD    D    ;TO GO SOUTH.
  91.     ADD    M
  92.     DAD    D    ;TO GO SOUTH.
  93.     ADD    M
  94.     DCX    H    ;TO GO WEST.
  95.     ADD    M
  96.     DCX    H    ;TO GO WEST.
  97.     ADD    M
  98.     INX    H    ;TO GO EAST.
  99.     DAD    B    ;TO GO NORTH.
  100.     ANI    7    ;WHAT'S IN BOTTOM 3 BITS.
  101.     CPI    6    ;WERE THERE 2 LIVE?
  102.     CNZ    MARK    ;DO NOTHING IF 2 NEIGHBORS.
  103.     MOV    A,H    ;HAVE WE CHECKED ALL OF SCREEN?
  104.     CPI    0D0H
  105.     JNZ    LIFE    ;CONTINUE IF NOT DONE.
  106.     CALL    DELAY    ;DELAY BETWEEN GENERATIONS.
  107. ;BIRTH/DEATH AGONY SEQUENCE.
  108. C1    DCX    H
  109.     MOV    A,M
  110.     ORA    A
  111.     CPE    LIVE
  112.     CPO    KILL
  113.     MOV    A,H
  114.     CPI    VDMU-1
  115.     JNZ    C1
  116. ; DELAY FOR VIEWING MARKED LOCATIONS.
  117.     CALL    DELAY
  118. ; SEE IF ONLY ONE GENERATION REQUESTED.
  119.     LDA    ONEFLAG
  120.     ORA    A
  121.     JNZ    READY    ;STOP IF SO.
  122. ; DISPLAY CAN BE STOPPED AND ALTERED.
  123.     CALL    GETCH    ;SEE IF KEY PRESSED.
  124.     JZ    LIFE    ;CONTINUE IF NOT.
  125.     JMP    READY    ;ELSE, GET NEW COMMAND.
  126. ;
  127. ; ROUTINES THAT MARK CELLS FOR POSSIBLE ALTERATION.
  128. MARK    CPI    1    ;ARE THERE EXACTLY 3 LIVE NEIGHBOURS?
  129.     JZ    LMARK
  130. DMARK    MVI    A,DEADC
  131.     ANA    M
  132.     MOV    M,A    ;CELL NOW MARKED FOR DEATH.
  133.     RET
  134. LIVEMARK    EQU    80H
  135. LMARK    MVI    A,LIVEMARK
  136.     ORA    M
  137.     MOV    M,A    ;CELL NOW MARKED FOR LIFE.
  138.     RET
  139. ; ROUTINES FOR SEEDING THE SCREEN.
  140. NORTH    DAD    B
  141.     RET
  142. SOUTH    DAD    D
  143.     RET
  144. EAST    INX    H
  145.     RET
  146. WEST    DCX    H
  147.     RET
  148. MIDDLE    LXI    H,VDM+220H
  149.     RET
  150. KILL    MVI    M,DEADC
  151.     RET
  152. LIVE    MVI    M,ALIVEC
  153.     RET
  154. ;NON-ECHOING CHARACTER INPUT ROUTINE.
  155. GETCH:    IN    KSTAT    ;GET STATUS
  156.     ANI    RDR    ;SEE IF KEY PRESSED.
  157.     RZ        ;RETURN IF NOT.
  158.     IN    KDATA    ;ELSE, GET CHARACTER.
  159.     ANI    7FH    ;STRIP PARITY.
  160.     RET
  161. ;
  162. ; DELAY ROUTINE.
  163. DELAY    PUSH    D    ;SAVE REGISTERS.
  164.     PUSH    B
  165.     LDA    DMULT    ;GET DELAY MULTIPLIER.
  166.     MOV    B,A    ;PUT IN REG. B.
  167.     ORA    A    ;WANT MAXIMUM SPEED?
  168.     JZ    NODEL    ;SKIP DELAY IF SO.
  169. DELA1    LXI    D,16665    ;LOAD LOOP COUNT.
  170. DELA2    DCX    D    ;DECREMENT COUNT.
  171.     MOV    A,D
  172.     ORA    E    ;ZERO YET?
  173.     JNZ    DELA2    ;CONTINUE IF NOT.
  174.     DCR    B    ;DECREMENT DELAY MULTIPLIER.
  175.     JNZ    DELA1
  176. NODEL    POP    B    ;RESTORE REGISTERS.
  177.     POP    D
  178.     RET
  179. ;
  180. SETSPD    SUI    30H    ;REMOVE ASCII BIAS.
  181.     STA    DMULT    ;UPDATE DELAY MULTIPLIER.
  182.     JMP    READY
  183. ;
  184. ONEGEN    MVI    A,1    ;SET ONEFLAG.
  185.     STA    ONEFLAG
  186.     MVI    A,'G'    ;PUT G IN ACC.
  187.     RET
  188. ;
  189. HELP    CALL    CLS    ;CLEAR SCREEN, INIT CURSOR.
  190.     LXI    D,HMESS    ;POINT TO MESSAGE.
  191.     MVI    C,9    ;PRINT BUFFER FUNCTION FOR CP/M.
  192.     CALL    ENTRY    ;PRINT THE MESSAGE.
  193. WAIT    CALL    GETCH    ;WAIT FOR KEY DEPRESSION.
  194.     JZ    WAIT
  195.     JMP    MLOOP    ;THEN RESTART.
  196. ;
  197. HMESS    DB    'AVAILABLE '
  198.     DB    'COMMANDS '
  199.     DB    'ARE:'
  200.     DB    CR
  201.     DB    LF
  202.     DB    'H =    HELP.'
  203.     DB    CR
  204.     DB    LF
  205.     DB    'C =    CLEAR '
  206.     DB    'SCREEN.'
  207.     DB    CR
  208.     DB    LF
  209.     DB    'M =    GO TO '
  210.     DB    'MIDDLE OF '
  211.     DB    'SCREEN.'
  212.     DB    CR
  213.     DB    LF
  214.     DB    'N =    GO '
  215.     DB    'NORTH.'
  216.     DB    CR
  217.     DB    LF
  218.     DB    'S =    GO SOUTH.'
  219.     DB    CR
  220.     DB    LF
  221.     DB    'E =    GO EAST.'
  222.     DB    CR
  223.     DB    LF
  224.     DB    'W =    GO WEST.'
  225.     DB    CR
  226.     DB    LF
  227.     DB    'G =    GRANT '
  228.     DB    'LIFE.'
  229.     DB    CR
  230.     DB    LF
  231.     DB    'O =    DO ONE '
  232.     DB    'GENERATION '
  233.     DB    'THEN HALT.'
  234.     DB    CR
  235.     DB    LF
  236.     DB    'L =    MAKE '
  237.     DB    'LIVE CELL.'
  238.     DB    CR
  239.     DB    LF
  240.     DB    'K =    KILL CELL.'
  241.     DB    CR
  242.     DB    LF
  243.     DB    'NUMBER '
  244.     DB    '0 - 9 = '
  245.     DB    'SET DELAY '
  246.     DB    '(0 = FASTEST '
  247.     DB    'SPEED).'
  248.     DB    CR
  249.     DB    LF
  250.     DB    'ANY KEY = '
  251.     DB    'HALT, AND '
  252.     DB    'WAIT FOR '
  253.     DB    'NEW COMMAND.'
  254.     DB    CR
  255.     DB    LF
  256.     DB    CR
  257.     DB    LF
  258.     DB    'PRESS '
  259.     DB    'ANY KEY '
  260.     DB    'TO RESTART.'
  261.     DB    '$'    ;DELIMITER.
  262. ;
  263. EXIT    LHLD    OLDSTK  ;RESTORE CP/M'S STACK.
  264.     SPHL
  265.     RET        ;BACK TO CPM.
  266. ;
  267. ;ROUTINE TO CLEAR SCREEN AND INITIALIZE CURSOR.
  268. CLS    LXI    H,VDM    ;POINT TO SCREEN MEMORY.
  269.     MVI    M,80H+' ' ;THIS IS THE CURSOR.
  270.     INX    H    ;BUMP POINTER.
  271. CLS1    MVI    M,' '    ;STORE BLANK.
  272.     INX    H    ;NEXT....
  273.     MOV    A,H    ;SEE IF END OF SCREEN YET.
  274.     CPI    VDMU+10H
  275.     JC    CLS1    ;CONTINUE IF NOT.
  276.     RET
  277. ;
  278. ONEFLAG    DB    0    ;FLAG FOR ONE GENERATION MODE.
  279. DMULT    DB    0    ;DELAY MULTIPLER.
  280. ;
  281.     DS    12    ;SPACE FOR LOCAL STACK.
  282. NEWSTK    EQU    $    ;LOCAL STACK TOP.
  283. OLDSTK    DS    2    ;SAVE CPM'S STACK HERE.
  284. ;
  285.     END
  286. ⌡╒ ≈■≈⌡ ≤s≈ ≈┐î          ä   l ê     ⌠÷≥÷v ÷≥÷⌠÷÷≥⌠÷             H           ≈w≈╙⌡ ≈⌡ ÷ ≈≈≈⌡_L  
  287.   ê   Ç          ² ╛  √ ■■√ ■      @   Ç