home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug029.ark / DEFLECT.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.7 KB  |  303 lines

  1. ;    THE GAME OF DEFLECTION     BY ANDREW A. RECUPERO
  2. ;    FROM KILOBAUD FEB '78 #14
  3. ;
  4. ;    TO START TYPE 0,1,2,3
  5. ;        0=1 TARGET, CLEAR FIELD
  6. ;        1=1 TARGET, SHIFT DEFLECTORS
  7. ;        2=3 TARGETS, CLEAR FIELD
  8. ;        3=3 TARGETS, SHIFT DEFLECTORS
  9. ;
  10. ;    THE OBJECT OF THE GAME IS TO HIT TARGET(S) BY
  11. ;    DEFLECTING THE RUNNER INTO THE TARGET.
  12. ;
  13. ;    DEFLECT TARGET BY TYPING A "/" OR A "\".
  14. ;
  15. ;    ALL TARGETS MUST BE HIT WITHIN A FIXED TIME.
  16. ;
  17. ;SYSTEM EQUATES:
  18. ;
  19.     ORG    100H
  20. STATUS     EQU    00    ;KEYBOARD STATUS PORT
  21. STROBE    EQU    80H    ;KEYBOARD STROBE BIT
  22. DATA    EQU    1    ;KEYBOARD DATA PORT
  23. VDMRAM    EQU    0CC00H    ;VDM STARTING ADDR.
  24. VDMPAGE    EQU    0CCH    ;VDM RAM PAGE
  25. VDMPORT    EQU    0C8H    ;VDM PORT
  26. TARGET    EQU    05    ;TARGET SYMBOL
  27. RUNNER    EQU    07    ;RUNNER SYMBOL
  28. USLSH    EQU    2FH    ;UP SLASH SYMBOL "/"
  29. DSLSH    EQU    5CH    ;DOWN SLASH SYMBOL "\"
  30. LEFT    EQU    80H    ;RUNNER
  31. DOWN    EQU    40H    ;    DIRECTION
  32. UP    EQU    20H    ;        CONTROL
  33. RIGHT    EQU    10H    ;            EQUATES
  34. ;
  35. ;
  36. ;    PROGRAM START
  37. ;
  38. GSTART    LXI    SP,STACK+8    ;INITIALIZE STACK
  39.     CALL    CLSCRN        ;CLEAR SCREEN
  40. REIDLE    CALL    DRUNER        ;DISPLAY RUNNER
  41. IDLE    CALL    ACTION        ;MOVE RUNNER
  42.     CALL     DELAY        ;TIME DELAY AND CHECK INPUT
  43.     MOV    A,C        ;KEYBOARD INPUT TO ACC.
  44.     ORA    A        ;TEST FOR NON-ZERO
  45.     JZ    IDLE
  46.     MVI    M,20H        ;REMOVE RUNNER
  47.     RRC            ;SHIFT DEFLECTORS?
  48.     PUSH    PSW        ;SAVE GAME OPTION IN 'A' REG
  49.     JC    SHIFT        ;JUMP TO SHIFT IF YES
  50.     CALL    CLSCRN        ;DO NOT SHIFT, CLEAR SCREEN
  51.     JMP    INIT
  52. SHIFT    LXI    B,VDMRAM    ;SHIFT
  53.     MOV    D,B        ;   SCREEN
  54.     MOV    E,C        ;      ONE
  55.     INX    D        ;        POSITION
  56. SMOR    LDAX    D        ;              TO
  57.     STAX    B        ;               THE
  58.     INX    B        ;          LEFT
  59.     INX    D    
  60.     MOV    A,D
  61.     CPI    VDMPAGE+4
  62.     JNZ    SMOR        ;GO SHIFT MORE IF NOT DONE
  63. INIT    POP    PSW        ;RESTORE GAME OPTION TO 'A' REG
  64.     MVI    C,1        ;SET FOR ONE TARGET
  65.     RRC            ;GAME OPTION BIT 0 TO CARRY FLG
  66.     MVI    A,TARGET    ;TARGET SYMBOL TO 'A' REG
  67.     JNC    GAM1        ;JUMP FOR 1 TARGET OPTION
  68.     MVI    C,3        ;INITIALIZE FOR 3 TARGETS
  69.     STA    VDMRAM+34CH    ;PUT TARGET LEFT OF CENTER
  70.     STA    VDMRAM+2F4H    ;TARGET TO THE RIGHT
  71. GAM1    STA    VDMRAM+320H    ;TARGET IN THE MIDDLE
  72.     MOV    A,C
  73.     STA    TARNUM        ;STORE # OF TARGETS
  74.     LXI    H,1C0H        ;INITIALIZE GAME TIMER
  75.     SHLD    TIMER        ;SAVE TIMER VALUE
  76.     CALL    DRUNER        ;START GAME, DISPLAY RUNNER
  77. ;
  78. ;
  79. ;    THIS IS THE MAIN LOOP FOR THE GAME
  80. ;
  81. MAINLP    CALL    DELAY        ;WAIT & CHECK KEYBOARD
  82.     CALL    ACTION    
  83.     PUSH    H        ;SAVE HL
  84.     LHLD    TIMER        ;GET GAME TIMER
  85.     DCX    H        ;DECREMENT TIMER
  86.     MOV    A,H        ;CHECK IF GAME
  87.     ORA    L        ;    TIMER EXPIRED
  88.     SHLD    TIMER        ;STORE UPDATED TIMER
  89.     POP    H        ;RESTORE HL
  90.     JNZ    MAINLP        ;JMP IF TIMER DIDN'T EXPIRE
  91.     LXI    B,LOSE        ;DISPLAY NO
  92.     CALL    SHOW        ;    TIME MESSAGE
  93.     CALL    WAER        ;WAIT & ERASE MESSAGE
  94.     JMP    GSTART        ;TIMER EXPIRED, RESTART GAME
  95. ;
  96. ;
  97. ;    INITIALIZE AND DISPLAY RUNNER
  98. ;        'B' HOLDS MOTION DIRECTION AS:
  99. ;        REG BIT 7 6 5 4
  100. ;            | | | |
  101. ;            | | | RIGHT
  102. ;            | | UP
  103. ;            | DOWN
  104. ;            LEFT
  105. ;
  106. DRUNER    LXI    H,VDMRAM+40H    ;RUNNER STARTING POS.
  107.     LXI    D,100H        ;X,Y RUNNER POS. D=VERT E=HORZ
  108.     MVI    M,RUNNER    ;DISPLAY RUNNER
  109.     MVI    B,RIGHT        ;INITIALIZE RIGHT MOTION
  110.     RET
  111. ;
  112. ;
  113. ;    ALL RUNNER MOVEMENT DONE HERE
  114. ;
  115. ACTION    MOV    A,M        ;CHECK IF
  116.     CPI    RUNNER        ;    RUNNER
  117.     JNZ    DF010        ;        DISPLAYED
  118.     MVI    M,20H        ;REMOVE RUNNER FROM FIELD
  119. ;
  120. ;    CALCULATE NEW RUNNER POSITION
  121. ;
  122. DF010    MOV    A,B
  123.     CPI    RIGHT        ;IS MOTION TO RIGHT?
  124.     JNZ    DF012        ;JUMP IF NO
  125.     INR     E        ;MOVE 1 POS TO THE RIGHT
  126. DF012    CPI    UP        ;IS MOTION UP?
  127.     JNZ    DF014        ;JUMP IF NO
  128.     DCR    D        ;MOVE 1 POS UP
  129. DF014    CPI    DOWN        ;IS MOTION DOWN?
  130.     JNZ    DF016        ;JUMP IF NO
  131.     INR     D        ;MOVE 1 POS DOWN
  132. DF016    CPI    LEFT        ;IS MOTION TO THE LEFT?
  133.     JNZ    DF018        ;JUMP IF NO
  134.     DCR    E        ;MOVE 1 POS TO LEFT
  135. ;
  136. ;    CALCULATE FIELD POSITION FROM HORZ AND VERT VALUES
  137. ;    IN DE WITH RESULT IN HL
  138. ;
  139. DF018    MOV    A,D
  140.     RRC
  141.     RRC
  142.     MOV    L,A
  143.     ANI    03
  144.     ORI    VDMPAGE
  145.     MOV    H,A        ;SAVE HIGH PART OF ADDR.
  146.     MOV    A,L
  147.     ANI    0C0H
  148.     ADD    E
  149.     MOV    L,A        ;SAVE LOW PART OF ADDR.
  150.     MOV    A,M        ;CHECK NEXT FIELD POSITION
  151.     CPI    TARGET        ;IS IT A TARGET?
  152.     JNZ    DF019        ;JUMP IF DIDN'T HIT TARGET
  153. ;
  154. ;    HIT A TARGET
  155. ;
  156.     MVI    M,20H        ;REMOVE TARGET
  157.     LDA    TARNUM        ;GET # OF TARGETS LEFT
  158.     DCR    A        ;REDUCE BY ONE
  159.     STA    TARNUM        ;STORE UPDATED TARGET NUMBER
  160.     RNZ            ;RETURN IF MORE TARGETS
  161.     POP    D        ;ALL TARGETS GONE, FIX STACK
  162.     LXI    B,WIN        ;DISPLAY
  163.     CALL    SHOW        ;    WIN MESSAGE
  164.     CALL    WAER        ;WAIT & ERASE MESSAGE
  165.     JMP    REIDLE        ;GO TO IDLE LOOP
  166. ;
  167. DF019    MOV    A,C        ;PUT KEYBOARD DATA IN 'A' REG
  168.     CPI    USLSH        ;IS IT AN UPSLASH "/" ?
  169.     JZ    DF020        ;JUMP IF YES
  170.     CPI    DSLSH        ;IS IT A DOWNSLASH "\" ?
  171.     JZ    DF020        ;JUMP TO ANALYZE DEFLECTOR
  172. ;
  173. ;    CHECK FOR RUNNER HITTING A DEFLECTOR
  174. ;
  175. DELCK    MOV    A,M
  176.     CPI    20H        ;IS NEXT POSITION A SPACE?
  177.     JNZ    CHGMOT        ;DEFLECTOR IF NO, CHNGE DIR
  178.     CALL    EDGCK        ;REVERSE MOTION IF AT EDGE
  179.     MVI    M,RUNNER    ;DISPLAY RUNNER AT NEW LOCATION
  180.     RET
  181. DF020    MOV    M,A        ;INPUT WAS VALID, DISPLAY IT
  182. ;
  183. ;    CHANGE DIRECTION OF RUNNER MOTION
  184. ;
  185. CHGMOT    CPI    DSLSH        ;IS IT A DOWNSLASH?
  186.     MOV    A,B        ;DIRECTION FLAG TO 'A' REG
  187.     JNZ    UPSLH        ;JUMP IF NOT DOWN SLASH
  188.     ANI    0C0H        ;IS MOTION LEFT OR DOWN?
  189.     MOV    A,B        ;RESTORE DIRECTION FLAG TO 'A'
  190.     JZ    DF030        ;JUMP IF NOT LEFT OR DOWN
  191.     RRC            ;CHANGE DIRECTION TO
  192.     RRC            ;    RIGHT OR UP
  193.     JMP    DF050
  194. DF030    RLC            ;CHANGE DIRECTION TO
  195.     RLC            ;    LEFT OR DOWN
  196.     JMP    DF050
  197. UPSLH    ANI    0A0H        ;IS MOTION TO LEFT OR UP?
  198.     MOV    A,B        ;DIRECTION FLAG TO 'A' REG
  199.     JZ    DF040        ;JUMP IF NOT LEFT OR UP
  200.     RRC            ;CHANGE DIR TO RIGHT OR DOWN
  201.     JMP    DF050
  202. DF040    RLC            ;CHANGE MOTION TO RIGHT OR DOWN
  203. DF050    MOV    B,A        ;SAVE NEW DIRECTION
  204.     CALL    EDGCK        ;IS RUNNER AT EDGE OF FIELD?
  205.     MOV    A,M        ;GET DEFLECTOR IN CASE AT EDGE
  206.     JZ    CHGMOT        ;IF AT EDGE, CHANGE DIRECTION
  207.     RET
  208. ;
  209. ;    THIS ROUTINE CHECKS FOR EDGE OF FIELD, REVERSES MOTION,
  210. ;    SETS ZERO FLAG IF AT EDGE
  211. ;
  212. EDGCK    MOV    A,B        ;LOAD MOTION DETECTOR
  213.     CPI    RIGHT        ;TO RIGHT?
  214.     JNZ    DF060        ;JUMP IF NO
  215.     MVI    A,3FH        ;3FH=RIGHT EDGE
  216.     CMP    E
  217.     RNZ            ;RETURN IF NOT AT RIGHT EDGE
  218.     MVI    B,LEFT        ;REVERSE DIRECTION TO LEFT
  219.     RET
  220. DF060    CPI    UP        ;CHECK FOR UP MOTION
  221.     JNZ    DF070        ;JUMP IF MOTION NOT UP
  222.     XRA    A
  223.     ORA    D        ;CHECK FOR TOP VERT=0
  224.     RNZ            ;RETURN IF NOT AT TOP
  225.     MVI    B,DOWN        ;REVERSE DIRECTION TO DOWN
  226.     RET
  227. DF070    CPI    DOWN        ;CHECK FOR DOWN MOTION
  228.     JNZ    DF080        ;JUMP IF MOTION NOT DOWN
  229.     MVI    A,0FH        ;CHECK FOR BOTTOM VERT=0FH
  230.     CMP    D
  231.     RNZ            ;RETURN IF NOT AT BOTTOM
  232.     MVI    B,UP        ;REVERSE DIRECTION TO UP
  233.     RET
  234. DF080    XRA    A        ;MUST BE MOTION TO LEFT
  235.     ORA    E        ;CHECK FOR LEFT EDGE HORZ=0
  236.     RNZ            ;RETURN IF NOT AT LEFT EDGE
  237.     MVI    B,RIGHT        ;REVERSE DIRECTION TO RIGHT
  238.     RET
  239. ;
  240. ;    THIS ROUTINE PERFORMES TIME DELAY WHILE CONTINUOUSLY
  241. ;    CHECKING FOR KEYBOARD INPUT. INPUT RETURN IN 'C'
  242. ;
  243. DELAY    MVI    C,0        ;INITIALIZE INPUT SAVE REG
  244.     PUSH    D        ;FREE UP DE REG
  245.     LXI    D,700H        ;LOAD DELAY VALUE
  246. DL01    DCX    D        ;DECREMENT DELAY COUNTER
  247.     IN    STATUS        ;GET KEYBOARD STATUS
  248.     ANI    STROBE        ;CHECK STROBE
  249.     JNZ    DL02        ;JUMP IF NO INPUT
  250.     IN    DATA        ;GET KEYBOARD DATA
  251.     ANI    7FH        ;REMOVE BIT 7
  252.     MOV    C,A        ;SAVE INPUT IN 'C' REG
  253. DL02    MOV    A,D        ;CHECK FOR
  254.     ORA    E        ;    TIMER=0
  255.     JNZ    DL01
  256.     POP    D        ;DELAY OVER, RESTORE DE REG
  257.     RET
  258. ;
  259. ;    THIS ROUTINE INITIALIZES THE VDM PORT & CLEARS SCREEN
  260. ;
  261. CLSCRN    XRA    A        ;CLEAR VDM PORT
  262.     OUT    VDMPORT        ;OUTPUT IT
  263.     LXI    H,VDMRAM    ;POINT TO START OF VDM RAM
  264.     MVI    A,VDMPAGE+4    ;'A' REG=END OF VDM RAM
  265. CL01    MVI    M,20H        ;BLANK LOC GIVEN BY HL
  266.     INX    H
  267.     CMP    H        ;DONE?
  268.     JNZ    CL01        ;JUMP IF NOT
  269.     RET
  270. ;
  271. ;    THIS ROUTINE DISPLAYS MESSAGE POINTED TO BY BC REG
  272. ;
  273. SHOW    LXI    D,VDMRAM+31DH    ;POINT TO DISPLAY LOCATION
  274.     MVI    H,7        ;MESSAGE LENGTH=7
  275. SH01    LDAX    B        ;GET BYTE OF MESSAGE
  276.     STAX    D        ;DISPLAY IT
  277.     INX    D        ;BUMP TO
  278.     INX    B        ;    NEXT BYTE
  279.     DCR    H        ;DECREMENT COUNT
  280.     JNZ    SH01        ;DONE?
  281.     RET
  282. ;
  283. ;    THIS ROUTINE WAITS AWHILE AND THEN REMOVES MESSAGE
  284. ;
  285. WAER    MVI    D,32        ;LOAD UNITS OF DELAY
  286. WDLY    CALL    DELAY        ;WAIT ONE UNIT OF DELAY
  287.     DCR    D        ;CHECK IF
  288.     JNZ    WDLY        ;    DONE WAITING
  289.     LXI    B,BLNK        ;POINT TO ALL BLANKS
  290.     JMP    SHOW        ;DISPLAY BLANKS TO ERASE & RET
  291. ;
  292. ;    MESSAGES
  293. ;
  294. WIN    DB    'WINNER '
  295. LOSE    DB    'NO TIME'
  296. BLNK    DB    '       '
  297. ;
  298. ;    SAVE AREAS AND STACK
  299. ;
  300. TIMER    DS    2        ;TIMER SAVE AREA
  301. TARNUM    DS    1        ;NUMBER OF TARGETS
  302. STACK    DS    8        ;STACK AREA (ONLY 4 DEEP)
  303.