INPUT.S 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. ; INPUT.S
  2. ; THIS FILE CONTAINS THE INPUT ROUTINES "POLE" AND "REPLAY"
  3. GLBL POLE
  4. GLBL REPLAY
  5. GLBL SWCHA,INPT4
  6. GLBL CDIR,THROWBUT,JOYDIR
  7. GLBL TRUE,FALSE
  8. GLBL TEMP0,TEMP1
  9. GLBL FRAMEIDX,THROWIDX
  10. GLBL IRDIRA,IRDIRB,IRTHROW
  11. GLBL IRDIRC,IRDIRD
  12. RAMDEF ; ZERO PAGE
  13. CODE CSECT
  14. POLE LDA INPT4
  15. BPL SETBUTTN
  16. LDA #FALSE
  17. JMP ZSETOVER
  18. SETBUTTN LDA #TRUE ; BUTTON IS DOWN
  19. ZSETOVER STA THROWBUT
  20. LDA SWCHA
  21. LSR A
  22. LSR A
  23. LSR A
  24. LSR A
  25. TAX
  26. LDA JOYTABLE,X ; USE UPPER NIBBLE AS TABLE INDEX
  27. CMP #8
  28. BEQ ZNOERR
  29. STA CDIR
  30. ZNOERR STA JOYDIR
  31. ; NOW SAVE AWAY VALUES IN THE INSTANT REPLAY TABLES :
  32. ; NOTE: DIRTAB CONTAINS POINTERS TO THE FOUR DIRECTION TABLES.
  33. ; EACH ONE OF THESE HAS 128 LOCATIONS, ACCOUNTING FOR 256
  34. ; VALUES OF FRAMEIDX; THIS REPRESENTS 8 SECONDS OF GAMEPLAY.
  35. LDX FRAMEIDX+1
  36. LDA DIRTABL,X
  37. STA TEMP0
  38. LDA DIRTABH,X
  39. STA TEMP1
  40. LDA FRAMEIDX
  41. LSR A ; GET INDEX AS WELL AS NIBBLE
  42. TAY
  43. BCC ZUPNIB01 ; ODD FRAME == UPPER NIBBLE
  44. LDA (TEMP0),Y
  45. ORA JOYDIR ; UPPER NIBBLE ALREADY IN A
  46. STA (TEMP0),Y
  47. JMP ZINSKIP1
  48. ZUPNIB01 LDA JOYDIR
  49. ASL A
  50. ASL A
  51. ASL A
  52. ASL A ; PUT INTO UPPER NIBBLE
  53. STA (TEMP0),Y
  54. JMP ZINSKIP1
  55. ; JOYSTICK STORAGE IS FINISHED-- DO THE BUTTON STORAGE
  56. ZINSKIP1 LDA THROWBUT ; IF THE BUTTON IS UP, LEAVE A
  57. BEQ ZINPTBYE ; ZERO IN THE BIT FOR THIS CYCLE
  58. LDA FRAMEIDX
  59. AND #$7 ; TELLS WHICH BIT OF IRTHROW
  60. TAY
  61. LDA TRUEBUT,Y ; MASK FOR PROPER BIT
  62. AND #TRUE ; ALL 1'S
  63. LDX THROWIDX ; INC'ED EVERY EIGHTH CYCLE
  64. ORA IRTHROW,X ; ADDS IN THIS NEXT BIT
  65. STA IRTHROW,X
  66. ZINPTBYE RTS
  67. ; THIS ROUTINE IS CALLED INSTEAD OF "POLE" DURING INSTANT REPLAY. IT
  68. ; PRETENDS THAT IT'S LOOKING AT THE CONTROLS, BUT INSTEAD IT'S
  69. ; LOOKING AT TABLES STORED UP FROM THE PREVIOUS RACK
  70. REPLAY LDX FRAMEIDX+1
  71. LDA DIRTABL,X
  72. STA TEMP0
  73. LDA DIRTABH,X
  74. STA TEMP1
  75. LDA FRAMEIDX
  76. LSR A
  77. TAY
  78. BCC ZUPNIB02
  79. LDA (TEMP0),Y ; LOWER NIBBLE
  80. AND #$0F
  81. JMP ZSETD02
  82. ZUPNIB02 LDA (TEMP0),Y
  83. LSR A
  84. LSR A
  85. LSR A
  86. LSR A
  87. ZSETD02 STA JOYDIR
  88. CMP #8
  89. BEQ ZRPSKIP1
  90. STA CDIR
  91. ZRPSKIP1 LDA FRAMEIDX
  92. AND #7
  93. TAY
  94. LDA TRUEBUT,Y
  95. LDX THROWIDX
  96. AND IRTHROW,X ; GET THE BIT FOR THIS FRAME
  97. BEQ ZNOTHROW ; IF 0, BUTTON IS UP
  98. LDA #TRUE
  99. JMP ZRPSETB
  100. ZNOTHROW LDA #FALSE
  101. ZRPSETB STA THROWBUT
  102. RTS
  103. JOYTABLE DB $FF,$FF,$FF,$FF,$FF,$03,$01,$02
  104. DB $FF,$05,$07,$06,$FF,$04,$00,$08
  105. TRUEBUT DB $01,$02,$04,$08,$10,$20,$40,$80
  106. DIRTABL DB L(IRDIRA),L(IRDIRB),L(IRDIRC),L(IRDIRD)
  107. DIRTABH DB H(IRDIRA),H(IRDIRB),H(IRDIRC),H(IRDIRD)
  108. END