Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

98 lignes
2.9KB

  1. ; =============================================================
  2. ; irq-handler.asm — Custom IRQ Handler Skeleton for C64
  3. ; Demonstrates: raster IRQ, custom border color flash
  4. ; Assemble to $C000. Run with SYS 49152 to install, SYS 49166 to remove.
  5. ; =============================================================
  6. * = $C000
  7. ; ---------------------------------------------------------------
  8. ; INSTALL — Patches IRQ vector to our handler
  9. ; ---------------------------------------------------------------
  10. INSTALL SEI ; disable interrupts while patching
  11. ; Save original IRQ vector
  12. LDA $0314
  13. STA OLDIRQ
  14. LDA $0315
  15. STA OLDIRQ+1
  16. ; Install our handler
  17. LDA #<RASTER_IRQ
  18. STA $0314
  19. LDA #>RASTER_IRQ
  20. STA $0315
  21. ; Set up VIC-II raster interrupt at line 100
  22. LDA $D011
  23. AND #$7F ; clear raster bit 8
  24. STA $D011
  25. LDA #100 ; trigger at raster line 100
  26. STA $D012
  27. ; Enable VIC-II raster IRQ, keep CIA #1 timer IRQ enabled too
  28. LDA #$01
  29. STA $D01A ; VIC IRQ mask: raster
  30. CLI ; re-enable interrupts
  31. RTS
  32. ; ---------------------------------------------------------------
  33. ; REMOVE — Restores original IRQ vector
  34. ; ---------------------------------------------------------------
  35. REMOVE SEI
  36. LDA OLDIRQ
  37. STA $0314
  38. LDA OLDIRQ+1
  39. STA $0315
  40. LDA #$00
  41. STA $D01A ; disable VIC IRQs
  42. CLI
  43. RTS
  44. ; ---------------------------------------------------------------
  45. ; RASTER_IRQ — Our custom interrupt handler
  46. ; Called when VIC-II raster reaches line 100
  47. ; ---------------------------------------------------------------
  48. RASTER_IRQ:
  49. ; Acknowledge VIC-II interrupt (write-back clears flags)
  50. LDA $D019 ; read VIC interrupt status
  51. STA $D019 ; acknowledge by writing back
  52. ; Check if this is really a raster interrupt
  53. AND #$01 ; bit 0 = raster IRQ
  54. BEQ NOT_RASTER
  55. ; --- RASTER EFFECT: Flash border color ---
  56. INC COLORIDX
  57. LDA COLORIDX
  58. AND #$0F ; keep in 0-15 range
  59. STA COLORIDX
  60. STA $D020 ; write border color
  61. ; Schedule next IRQ at line 200
  62. LDA $D012
  63. CMP #200
  64. BEQ FLIP_RASTER
  65. LDA #200
  66. STA $D012
  67. JMP DONE_IRQ
  68. FLIP_RASTER:
  69. LDA #100
  70. STA $D012
  71. DONE_IRQ:
  72. NOT_RASTER:
  73. ; Chain to original IRQ for keyboard/timer/jiffy updates
  74. JMP (OLDIRQ)
  75. ; ---------------------------------------------------------------
  76. ; Data
  77. ; ---------------------------------------------------------------
  78. OLDIRQ .WORD $EA31 ; default IRQ handler address
  79. COLORIDX .BYTE 0
  80. ; ---------------------------------------------------------------
  81. ; End of code
  82. ; ---------------------------------------------------------------

Powered by TurnKey Linux.