Difference between revisions of "Displaying credits"

From NeoGeo Development Wiki
Jump to: navigation, search
m (Removed BCD conversion)
(Added a revised, checked version of the code)
Line 22: Line 22:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
Other version (checked, works):
 +
 +
<syntaxhighlight>
 +
.creditp1:
 +
    jsr SYS_IO
 +
    move.b $D00034,d0
 +
    move.w d0,d1 ;copy d0 to d1
 +
    move.w #FIXMAP+(2*32)+2,REG_VRAMADDR ;position #FIXMAP+(X*32)+Y,REG_VRAMADDR
 +
    nop
 +
    move.w #$20,REG_VRAMMOD ;auto-inc
 +
 +
    lsr.b #4,d1 ;get tens
 +
   
 +
    andi.w #$000F,d1 ;mask off eventual garbage
 +
    ori.w #$0330,d1 ;tile $30 in fix
 +
    move.w d1,REG_VRAMRW ;write tens
 +
 +
    andi.w #$000F,d0 ;mask off eventual garbage
 +
    ori.w #$0330,d0 ;tile $30 in fix
 +
    move.w d0,REG_VRAMRW ;write units
 +
 +
    rte                            ; Return from interrupt
 +
</syntaxhighlight>
 +
Put this at the end of your vblank interrpt
 
[[Category:Code]]
 
[[Category:Code]]

Revision as of 16:58, 27 January 2018

The system ROM takes care of displaying the credits on the LED displays itself (see MV-LED board).

It's up to the game to display the counts on the screen when needed. SNK recommends using a 8x8 fix layer font.

The credit count for each player is stored in BCD in $D00034 for player 1, and $D00035 for player 2. These locations are in the backup RAM, to keep the credit counts in case of a power failure during play.

Note: SYSTEM_IO must be called each v-blank to update those locations.

moveq.l #0,d0
move.b  $D00034,d0             ; Read P1 credits (hex)
move.w  #$7088,REG_VRAMADDR    ; Set position in fix map, top left
move.w  d0,d1                  ; Make a copy of the BCD value
move.w  #$20,REG_VRAMMOD       ; Auto-inc fix column
lsr.b   #4,d1                  ; Get tens
andi.w  #$000F,d1              ; Mask off eventual garbage
ori.w   #$5030,d1              ; Set palette 5 and tile offset $30 (ASCII "0")
move.w  d1,REG_VRAMRW          ; Write tens to VRAM
andi.w  #$000F,d0              ; Get units
ori.w   #$5030,d1              ; Same
move.w  d1,REG_VRAMRW          ; Write units to VRAM

Other version (checked, works):

.creditp1:
    jsr SYS_IO
    move.b $D00034,d0
    move.w d0,d1 ;copy d0 to d1
    move.w #FIXMAP+(2*32)+2,REG_VRAMADDR ;position #FIXMAP+(X*32)+Y,REG_VRAMADDR
    nop
    move.w #$20,REG_VRAMMOD ;auto-inc

    lsr.b #4,d1 ;get tens
    
    andi.w #$000F,d1 ;mask off eventual garbage
    ori.w #$0330,d1 ;tile $30 in fix
    move.w d1,REG_VRAMRW ;write tens

    andi.w #$000F,d0 ;mask off eventual garbage
    ori.w #$0330,d0 ;tile $30 in fix
    move.w d0,REG_VRAMRW ;write units

    rte                             ; Return from interrupt

Put this at the end of your vblank interrpt