Timer interrupt: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
m (Structure, added range)
(Neo Turf Masters example)
 
Line 3: Line 3:
=Mode of operation=
=Mode of operation=


The value of this counter is decremented by the [[Clock|pixel clock]] (6MHz, every 166.7ns), and reloaded with the value specified in {{Reg|REG_TIMERHIGH}} and {{Reg|REG_TIMERLOW}} each time one of these 3 selectable events occur:
The value of this counter is decremented by the [[Clock|pixel clock]], which runs at 6MHz (166.7ns period). It is automatically reloaded with the value specified in {{Reg|REG_TIMERHIGH}} and {{Reg|REG_TIMERLOW}} each time one of these 3 selectable events occur:


* Just when {{Reg|REG_TIMERLOW}} register is written to (immediately).
* Immediately when {{Reg|REG_TIMERLOW}} register is written to.
* At the beginning of the frame blanking period (one-shot).
* At the beginning of the frame blanking period (one-shot).
* When the counter reaches 0 (repeat).
* When the counter reaches 0 (repeat).
Line 11: Line 11:
=Range=
=Range=


* Minimum time ($00000000): 166.7ns (1 pixel, useless)
* Minimum time ($00000000): 166.7ns, corresponds to 1 pixel, useless, see below.
* Maximum time ($FFFFFFFF): 715.8s (42366 frames, 11.9 minutes)
* Maximum time ($FFFFFFFF): 715.8s, corresponds to 42366 frames, or 11.9 minutes.


=[[68k vector table|Vector address]]=
=[[68k vector table|Vector address]]=
Line 18: Line 18:
* CD systems: $64 (IRQ1)
* CD systems: $64 (IRQ1)


Like the others, this interrupt needs to be acknowledged with {{Reg|REG_IRQACK}} to trigger again.
Like other interrupts, this one needs to be acknowledged with {{Reg|REG_IRQACK}} to trigger again.


=Configuration=
=Configuration=
Line 24: Line 24:
The {{Reg|REG_LSPCMODE}} register is used to configure the timer's operation:
The {{Reg|REG_LSPCMODE}} register is used to configure the timer's operation:


* Bit 4 = 1: Enable timer interrupt.
* Bit 5 = 1: Reload counter as soon as {{Reg|REG_TIMERLOW}} is written to.
* Bit 6 = 1: Reload counter at the beginning of the hblank of the first vblank line (start of each frame).
* Bit 7 = 1: Reload counter when it reaches 0.
* Bit 7 = 1: Reload counter when it reaches 0.
* Bit 6 = 1: Reload counter at the beginning of the hblank of the first vblank line (start of each frame).
* Bit 5 = 1: Reload counter as soon as {{Reg|REG_TIMERLOW}} is written to.
* Bit 4 = 1: Enable timer interrupt.


Note that if bit 5 is set, either bit 6, 7 or both must also be set to 1.
'''Caution''': When the timer interrupt is enabled, the value of {{Reg|REG_TIMERHIGH}} and {{Reg|REG_TIMERLOW}} should always be set higher than 4, or the [[68k]] will get flooded with interrupts and program execution will lock up.
 
=Example: [[Neo Turf Masters]]=


'''Caution''': When the timer interrupt is enabled, the value of {{Reg|REG_TIMERHIGH}} and {{Reg|REG_TIMERLOW}} should always be set higher than 4, or the CPU will get flooded with interrupts and the program will lock up.
[[File:Timer_turfmast.png]]


=Examples=
* A: First line of the frame. The timer is reloaded with the value set at C: 41016. The next interrupt will trigger at B, in 106 lines and 313 pixels (just before the 107th line). The scroll value for the mountains is set.
* B: Start of the ground area. The timer is immediately reloaded to 767 and the mode is set to "reload when 0 is reached". This will trigger interrupts every 2 lines so that the ground can be shifted to produce the perspective effect. A variable is used to count the number of ground lines.
* C: End of the ground area. When enough ground lines are rendered, the timer is immediately reloaded to 16383 so that the next interrupt won't happen soon. The mode is set to "reload on first line of next frame" and the reload value (not the timer !) is set to 41016.


To trigger interrupts every N pixels, set the reload value to N-1. So 384-1 = $17F for exactly one scanline.


To trigger interrupts when rendering reaches multiple arbitrary display locations, set bits 4, 5 and 7 of REG_LSPCMODE. Then, in the interrupt handler routine, set the new interval between the next interrupt and the following.


[[Category:Base system]]
[[Category:Base system]]
[[Category:Video system]]
[[Category:Video system]]

Latest revision as of 08:24, 24 March 2019

The timer interrupt is a 68k interrupt triggered when the 32-bit down-counter internal to LSPC reaches 0. As it is synchronous with the video output, it is mainly used for scanline effects.

Mode of operation

The value of this counter is decremented by the pixel clock, which runs at 6MHz (166.7ns period). It is automatically reloaded with the value specified in REG_TIMERHIGH and REG_TIMERLOW each time one of these 3 selectable events occur:

  • Immediately when REG_TIMERLOW register is written to.
  • At the beginning of the frame blanking period (one-shot).
  • When the counter reaches 0 (repeat).

Range

  • Minimum time ($00000000): 166.7ns, corresponds to 1 pixel, useless, see below.
  • Maximum time ($FFFFFFFF): 715.8s, corresponds to 42366 frames, or 11.9 minutes.

Vector address

  • Cartridge systems: $68 (IRQ2)
  • CD systems: $64 (IRQ1)

Like other interrupts, this one needs to be acknowledged with REG_IRQACK to trigger again.

Configuration

The REG_LSPCMODE register is used to configure the timer's operation:

  • Bit 4 = 1: Enable timer interrupt.
  • Bit 5 = 1: Reload counter as soon as REG_TIMERLOW is written to.
  • Bit 6 = 1: Reload counter at the beginning of the hblank of the first vblank line (start of each frame).
  • Bit 7 = 1: Reload counter when it reaches 0.

Caution: When the timer interrupt is enabled, the value of REG_TIMERHIGH and REG_TIMERLOW should always be set higher than 4, or the 68k will get flooded with interrupts and program execution will lock up.

Example: Neo Turf Masters

  • A: First line of the frame. The timer is reloaded with the value set at C: 41016. The next interrupt will trigger at B, in 106 lines and 313 pixels (just before the 107th line). The scroll value for the mountains is set.
  • B: Start of the ground area. The timer is immediately reloaded to 767 and the mode is set to "reload when 0 is reached". This will trigger interrupts every 2 lines so that the ground can be shifted to produce the perspective effect. A variable is used to count the number of ground lines.
  • C: End of the ground area. When enough ground lines are rendered, the timer is immediately reloaded to 16383 so that the next interrupt won't happen soon. The mode is set to "reload on first line of next frame" and the reload value (not the timer !) is set to 41016.