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 / SIMTEL / CPMUG / CPMUG041.ARK / PONG.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  551 lines

  1. ;
  2. ;
  3. ; PONG
  4. ;
  5. ; 08/17/76  20:12
  6. ; BY ROBERT A. VAN VALZAH
  7. ; EXTENSIVELY MODIFIED
  8. ; BY WARD CHRISTENSEN
  9. ;
  10. ; REPLY TO 'ENTER OPTION':
  11. ; S TO PLAY SOLO (WALLS REFLECT
  12. ;   NO COMPUTER PADDLE)
  13. ; W TO PLAY WARM UP; WALLS STILL
  14. ;   REFLECT, BUT YOU PLAY AGAINST
  15. ;   THE COMPUTER PADDLE
  16. ; P PLAY AGAINST THE COMPUTER
  17. ;   SERVE CHANGES EVERY 5, MUST
  18. ;   WIN BY 2.
  19. ;
  20. ; HIT RUBOUT AT ANY TIME TO GO BACK
  21. ; TO ENTER OPTION
  22. ;
  23. ; HIT CONTROL-C TO RETURN TO CP/M
  24. ;
  25. VDMST    EQU    0CC00H    ;VDM SCREEN STARTING ADDRESS
  26. VDMEP    EQU    VDMST/256+4    ;VDM ENDING PAGE (PAGE PAST VDM)
  27. VDMSCP    EQU    0C8H    ;VDM SCROLL PORT
  28. LSCOR    EQU    VDMST+8        ;LEFT SCORE PLACE ON VDM
  29. RSCOR    EQU    VDMST+54    ;RIGHT  "    "    "
  30. CURS    EQU    47H        ;VDM CURSOR STORE LOACTION
  31. ;
  32. ;
  33.     ORG    100H
  34. PONG:    LXI    SP,STACK
  35.     LXI    H,VDMST
  36.     SHLD    CURS
  37.     XRA    A
  38.     OUT    VDMSCP
  39.     LXI    H,RECVR
  40.     MVI    M,-4 AND 255    ;RECEIVE LEFT
  41.     LXI    H,OPMSG
  42.     CALL    TYPEN
  43.     CALL    KEYIN
  44.     PUSH    PSW
  45.     CALL    TYPE
  46.     POP    PSW
  47.     STA    OPTN
  48.     CPI    'S'
  49.     JNZ    TRYP
  50.     MVI    A,'I'
  51.     STA    LEFT
  52.     STA    RIGHT
  53.     JMP    OK
  54. SINIT:    LXI    H,LSCOR
  55.     MVI    M,'0'
  56.     INX    H
  57.     MVI    M,'0'
  58.     LXI    H,RSCOR
  59.     MVI    M,'0'
  60.     INX    H
  61.     MVI    M,'0'
  62.     LXI    H,0
  63.     SHLD    SCORE
  64.     RET            ;FROM SINIT
  65. ;
  66. TRYP    CPI    'P'
  67.     JNZ    TRYW
  68. USEP:    MVI    A,']'
  69.     STA    LEFT
  70.     MVI    A,'['
  71.     STA    RIGHT
  72.     JMP    OK
  73. TRYW:    CPI    'W'
  74.     JZ    USEP
  75.     CPI    'A'    ;AUTO
  76.     JZ    OK
  77.     MVI    A,13
  78.     CALL    TYPE
  79.     JMP    PONG
  80. ;
  81. OK:    LXI    H,VDMST
  82.     SHLD    CURS
  83. CLERB:    MVI    A,' '
  84. CLEAR:    MOV    M,A
  85.     INR    L
  86.     JNZ    CLEAR
  87.     INR    H
  88.     MOV    A,H
  89.     CPI    VDMEP
  90.     JNZ    CLERB
  91.     LHLD    CURS
  92.     LXI    D,64
  93.     DAD    D
  94. TOPB:    MVI    M,'-'
  95.     INX    H
  96.     MOV    A,L
  97.     ANI    3FH
  98.     JNZ    TOPB
  99.     MVI    B,VDMEP
  100. LEFT:    EQU    $+1
  101. SIDS:    MVI    M,'I'
  102.     MOV    A,L
  103.     ORI    3FH
  104.     MOV    L,A
  105. RIGHT    EQU    $+1
  106.     MVI    M,'I'
  107.     INX    H
  108.     MOV    A,H
  109.     CMP    B
  110.     JNZ    SIDS
  111.     LXI    D,-64
  112.     DAD    D
  113. BOTB:    MVI    M,'-'
  114.     INX    H
  115.     MOV    A,L
  116.     ANI    3FH
  117.     JNZ    BOTB
  118.     LXI    H,VDMST+450
  119.     SHLD    PADL
  120.     CALL    PDON
  121.     LDA    OPTN
  122.     CPI    'S'
  123.     JZ    REST
  124.     CPI    'W'
  125.     JZ    REST
  126.     CALL    SINIT
  127. REST:    LHLD    PADL
  128.     CALL    POFF
  129.     LXI    H,VDMST+450
  130.     SHLD    PADL
  131.     CALL    PDON
  132.     LXI    H,XPOS
  133.     MVI    M,128
  134.     INX    H
  135.     MVI    M,60
  136.     INX    H
  137. RECVR    EQU    $+1    ;RECIEVE SERVE
  138.     MVI    M,-4 AND 255
  139.     INX    H
  140.     MVI    M,0
  141. MORE:    CALL    CSTS
  142.     ANI    0000$0001B
  143.     CNZ    MVPA
  144.     CALL    AUTO
  145.     CALL    OFF
  146. ADVL    EQU    $    ;ADD VELOCITY
  147.     LXI    H,XPOS
  148.     LXI    D,XVEL
  149.     LDAX    D
  150.     ADD    M
  151.     MOV    M,A
  152.     INX    D
  153.     INX    H
  154.     LDAX    D
  155.     ADD    M
  156.     MOV    M,A
  157. ;        ;PLACE BAALL
  158.     LXI    H,VDMST
  159.     LDA    XPOS
  160.     RAR
  161.     RAR
  162.     ANI    3FH
  163.     ADD    L
  164.     MOV    L,A
  165.     LDA    YPOS
  166.     RAR
  167.     RAR
  168.     RAR
  169.     ANI    1FH
  170.     MOV    E,A
  171.     MVI    D,0
  172.     XCHG
  173.     DAD    H
  174.     DAD    H
  175.     DAD    H
  176.     DAD    H
  177.     DAD    H
  178.     DAD    H
  179.     DAD    D
  180.     MOV    A,M
  181.     CPI    '-'
  182.     JZ    HHIT
  183.     CPI    'I'
  184.     JZ    VHIT
  185.     CPI    '/'
  186.     JZ    HIHT
  187.     CPI    '\'
  188.     JZ    LOHT
  189.     CPI    ']'
  190.     JZ    SCORR
  191.     CPI    '['
  192.     JZ    SCORL
  193.     CPI    ' '
  194.     JNZ    REST
  195.     SHLD    CURS
  196.     MOV    A,M
  197.     ORI    1000$0000B
  198.     MOV    M,A
  199. DELY    LXI    B,801H
  200. WAIT    DCX    B
  201.     MOV    A,B
  202.     ORA    C
  203.     JNZ    WAIT
  204.     JMP    MORE
  205. ;            SCORING ROUTINES
  206. SCORL    EQU    $
  207.     LDA    OPTN
  208.     CPI    'W'
  209.     JZ    VHIT
  210.     LXI    H,SCORE
  211.     INR    M
  212.     LXI    D,LSCOR+2
  213.     CALL    INRSC
  214.     MOV    B,M
  215.     INX    H    ;POINT TO RITHT
  216.     MOV    C,M
  217. ;        ROUINNE TO DETERMINE
  218. ;        WIN, AND CHANGE OF SERVE
  219. ;        ON ENTRY, B= LEFT SCORE,
  220. ;        C=RIGHT SCORE
  221. TEST    EQU    $
  222.     LXI    H,0
  223.     MVI    D,3
  224. HOLD:    DCX    H
  225.     MOV    A,H
  226.     ORA    L
  227.     JNZ    HOLD
  228.     DCR    D
  229.     JNZ    HOLD
  230. ;        DETERMINE SERVER
  231.     MOV    A,B
  232.     ADD    C
  233. SUB10:    SUI    10
  234.     JM    END10
  235.     JMP    SUB10
  236. END10:    ADI    10
  237.     LXI    D,3CFDH        ;'<', -4
  238.     CPI    5
  239.     JC    SETSV
  240.     LXI    D,3E03H        ;'>', 4
  241. SETSV:    LXI    H,RECVR
  242.     MOV    M,E
  243.     MOV    A,D
  244.     STA    VDMST+32
  245. ;        POINT DIFFERENCE >1?
  246.     MOV    A,B
  247.     SUB    C
  248.     JZ    REST
  249.     CPI    1
  250.     JZ    REST
  251.     CPI    -1 AND 255
  252.     JZ    REST
  253. ;        DIFF >1; ANYONE WIN?
  254.     MOV    A,B
  255.     CPI    21
  256.     JNC    TEST2
  257.     MOV    A,C
  258.     CPI    21
  259.     JC    REST
  260. ;        GOT A WINNER
  261. TEST2:    MOV    A,B
  262.     SUB    C
  263.     LXI    H,LSCOR
  264.     JNC    LWIN
  265. ;        RIGHT WIN
  266.     LXI    H,RSCOR
  267. LWIN:    MVI    B,6
  268. SON:    MOV    A,M
  269.     ORI    1000$0000B
  270.     MOV    M,A
  271.     INX    H
  272.     MOV    A,M
  273.     ORI    1000$0000B
  274.     MOV    M,A
  275.     CALL    SWAIT
  276.     MOV    A,M
  277.     ANI    0111$1111B
  278.     MOV    M,A
  279.     DCX    H
  280.     MOV    A,M
  281.     ANI    0111$1111B
  282.     MOV    M,A
  283.     CALL    SWAIT
  284.     DCR    B
  285.     JNZ    SON
  286.     JMP    PONG
  287. ;
  288. INRSC:    DCX    D
  289.     LDAX    D
  290.     INR    A
  291.     STAX    D
  292.     CPI    ':'
  293.     RC
  294.     MVI    A,'0'
  295.     STAX    D
  296.     JMP    INRSC
  297. SCORR    EQU    $
  298.     LDA    OPTN
  299.     CPI    'W'
  300.     JZ    VHIT
  301.     LXI    H,SCORE+1
  302.     INR    M
  303.     LXI    D,RSCOR+2
  304.     CALL    INRSC
  305.     MOV    D,M
  306.     DCX    H
  307.     MOV    B,M
  308.     JMP    TEST
  309. ;        MOVE PADDLE
  310. MVPA:    CALL    KEYIN
  311.     LXI    D,-67
  312.     CPI    'U'
  313.     JZ    PDLMV
  314.     INX    D
  315.     INX    D
  316.     INX    D
  317.     CPI    'I'
  318.     JZ    PDLMV
  319.     INX    D
  320.     INX    D
  321.     INX    D
  322.     CPI    'O'
  323.     JZ    PDLMV
  324.     LXI    D,-3
  325.     CPI    'J'
  326.     JZ    PDLMV
  327.     LXI    D,3
  328.     CPI    'L'
  329.     JZ    PDLMV
  330.     LXI    D,61
  331.     CPI    'M'
  332.     JZ    PDLMV
  333.     INX    D
  334.     INX    D
  335.     INX    D
  336.     CPI    ','
  337.     JZ    PDLMV
  338.     INX    D
  339.     INX    D
  340.     INX    D
  341.     CPI    '.'
  342.     JZ    PDLMV
  343.     CPI    127
  344.     JNZ    TRY09
  345.     POP    H
  346.     JMP    PONG
  347. TRY09:    EQU    $
  348.     CPI    'C' - 40H
  349.     JZ    BOOT
  350.     SUI    '0'
  351.     RC
  352.     CPI    '9' -'0' +1
  353.     RNC
  354.     RAL
  355.     STA    DELY+2
  356.     RET
  357. ;
  358. PDLMV:    PUSH    D
  359.     LHLD    PADL
  360.     CALL    POFF
  361.     POP    D
  362.     DAD    D
  363. ;        PREVENT BORDER OVERLAY
  364.     MOV    A,M
  365.     CPI    ' '
  366.     JNZ    LPADL
  367.     LXI    D,-64
  368.     DAD    D
  369.     MOV    A,M
  370.     CPI    ' '
  371.     JNZ    LPADL
  372.     LXI    D,128
  373.     DAD    D
  374.     MOV    A,M
  375.     CPI    ' '
  376.     JNZ    LPADL
  377.     LXI    D,-64
  378.     DAD    D
  379.     SHLD    PADL
  380. LPADL    LHLD    PADL
  381. PDON:    MVI    A,'/'
  382.     MVI    B,'I'
  383.     MVI    C,'\'
  384.     JMP    PDTG
  385. POFF:    MVI    A,' '
  386.     MOV    B,A
  387.     MOV    C,A
  388. PDTG:    PUSH    H
  389.     MOV    M,B
  390.     LXI    D,-64
  391.     DAD    D
  392.     MOV    M,A
  393.     LXI    D,128
  394.     DAD    D
  395.     MOV    M,C
  396.     POP    H
  397.     RET
  398. ;
  399. ;        TOP OR BOTTOM HIT
  400. ;
  401. HHIT:    LDA    YVEL
  402.     CMA
  403.     INR    A
  404.     STA    YVEL
  405.     JMP    ADVL
  406. ;
  407. ;        SIDE HIT
  408. ;
  409. VHIT:    LDA    XVEL
  410.     CMA
  411.     INR    A
  412.     STA    XVEL
  413.     JMP    ADVL
  414. ;
  415. ;        HIGH PADDLE HIT
  416. ;
  417. HIHT:    LDA    YVEL
  418.     CMA
  419.     INR    A
  420.     INR    A
  421. HIHT1:    STA    YVEL
  422.     JMP    VHIT    ;BOUNCE
  423. ;
  424. LOHT:    LDA    YVEL
  425.     CMA
  426.     JMP    HIHT1
  427. ;
  428. ;        TURN CURSOR OFF
  429. ;
  430. OFF:    LHLD    CURS
  431.     MOV    A,M
  432.     ANI    0111$1111B
  433.     MOV    M,A
  434.     RET
  435. ;
  436. ;    AUTO PADDLE
  437. ;
  438. AUTO    LDA    OPTN
  439.     CPI    'S'
  440.     RZ
  441.     LDA    XPOS
  442.     CPI    0C0H    ;<-- HOW FAR AWAY COMPUTER SEES
  443.     RC
  444.     LDA    XVEL
  445.     ORA    A
  446.     RM
  447.     LDA    XPOS
  448.     ANI    0000$0100B
  449.     RZ        ;<-- COMPUTER MOVES 1/2 BALL SPEED
  450.     LHLD    APADL
  451.     CALL    POFF
  452. ;
  453. ;        CALCULATE BALL Y POSITION
  454. ;
  455.     DAD    H
  456.     DAD    H
  457.     MOV    A,H
  458.     ANI    0000$1111B    ;LEAVE ONLY LINE NUMBER
  459.     MOV    H,A
  460.     LDA    YPOS
  461.     RAR
  462.     RAR
  463.     RAR
  464.     ANI    0000$1111B    ;LEAVE ONLY LINE NUMBER
  465.     LXI    D,0
  466.     SUB    H
  467.     LHLD    APADL
  468.     JZ    AMOVE
  469.     CPI    1
  470.     JZ    AMOVE
  471.     CPI    -1 AND 255
  472.     JZ    AMOVE
  473.     LXI    D,-64
  474.     ORA    A
  475.     JM    AMOVE
  476.     LXI    D,64
  477. AMOVE:    DAD    D
  478.     SHLD    APADL
  479.     MVI    A,'\'
  480.     MVI    B,'I'
  481.     MVI    C,'/'
  482.     CALL    PDTG
  483.     RET
  484. ;
  485. TYPEN:    MOV    A,M
  486.     CPI    13
  487.     RZ
  488.     CALL    TYPE
  489.     INX    H
  490.     JMP    TYPEN
  491. ;
  492. ;        WAIT SUBROUTINE
  493. ;
  494. SWAIT:    PUSH    H
  495.     LXI    H,0
  496. SLOOP:    DCX    H
  497.     MOV    A,H
  498.     ORA    L
  499.     JNZ    SLOOP
  500.     POP    H
  501.     RET
  502. ;
  503. ;        I/0 ROUTINES
  504. ;
  505. CSTS:    PUSH    H!    PUSH    D!    PUSH    B
  506.     CALL    CSTSCP
  507.     POP    B!    POP    D!    POP    H
  508.     RET
  509. ;
  510. CSTSCP:    LHLD    1
  511.     INX    H!    INX    H!    INX    H
  512.     PCHL
  513. ;
  514. ;
  515. KEYIN:    PUSH    H!    PUSH    D!    PUSH    B
  516.     CALL    CICPM
  517.     POP    B!    POP    D!    POP    H
  518.     RET
  519. ;
  520. CICPM:    LHLD    1
  521.     LXI    D,6
  522.     DAD    D
  523.     PCHL
  524. ;
  525. ;
  526. TYPE:    PUSH    H!    PUSH    D!    PUSH    B
  527.     PUSH    PSW
  528.     MVI    C,2
  529.     MOV    E,A
  530.     CALL    5
  531.     POP    PSW
  532.     POP    B!    POP    D!    POP    H
  533.     RET
  534. ;
  535. ;
  536. ;        CONSTATNTS
  537. ;
  538. APADL    DW    VDMST+509
  539. PADL    DW    0
  540. XPOS    DB    0
  541. YPOS    DB    0
  542. XVEL    DB    0
  543. YVEL    DB    0
  544. SCORE    DW    0    ;LEFT,RIGHT SCORE
  545. OPTN    DB    'W'
  546. OPMSG    DB    'ENTER OPTION (S, W, P)?',13
  547. BOOT    EQU    0    ;ADDRESS OF CPM RE-BOOT ROUTINE
  548.     DS    50
  549. STACK    EQU    $
  550.     END    PONG
  551.