1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
; license:LGPL-2.1+
; copyright-holders:Angelo Salese
;*****************************************************************
; Jaleco Mahjong code simulation snippets for 1st MCU games
;
; Games using this:
; Urashima Mahjong
; Mahjong Daireikai
; Mahjong Channel Zoom-In
;
; For details @see jalmah.cpp
;
;
START:
ORG $0 ; palette code snippet (test mode & gameplay)
move.w #$1, $80016.l ; set priority number (for urashima)
move.w #$f, D0 ; set loop 1
FetchNewPalette:
move.l A0, $100400.l ; save address to our local buffer (address currently points to an index of actual palette to transfer)
movea.l (A0), A0 ; read ROM location for the actual palette source
move.w #$f, D1 ; set loop 2 variable
bsr UploadPaletteChunk ; jump to uploading routine
movea.l $100400.l, A0 ; restore address index, increment by next address
adda.w #$4, A0
dbra D0, FetchNewPalette
rts
UploadPaletteChunk:
move.w (A0)+, (A1)+ ; copy palette source in ROM to palette RAM
dbra D1, UploadPaletteChunk
rts
ORG $0800 ; sound code snippet
movem.l D1, -(A7)
move.w D0, D1 ; D0 is raw sound command, low byte is command number, everything else is banking and probably voice channel (unhandled)
ror.w #$8, D1
and.w #$f, D1 ; take D1 as raw banking number
bsr CheckSoundZA
bsr CheckSoundBank
move.w #$8, $80040.l ; clear channel
bsr SoundStatus
andi.w #$3f, D0 ; take command number and write it to OKI port
ori.w #$80, D0
move.w D0, $80040.l
bsr SoundStatus
move.w #$10, $80040.l ; play channel
movem.l (A7)+, D1
rts
SoundStatus:
movem.l D0, -(A7)
ReadStatus:
move.w $80040.l, D0 ; check OKI voice status
andi.w #$1,D0
bne ReadStatus
movem.l (A7)+, D0
rts
; guess: special bits set in register D0 affect banking (oki can play up to 64 samples so bits 6 and 7 cannot be used)
; we simulate "ZA" writing but use the other bank register (jalmah can do both, cfr. ports $80018 and $8001a
CheckSoundZA:
btst #$6, D0 ; urashima BGM at start of game
beq NoZA1
ror.w #$1, D1 ; shift one down
rts
NoZA1:
btst #$07, D0 ; mjzoomin BGM at start of game
beq NoZA2
move.w #$8, D1 ; hardcode to bank 3
NoZA2:
rts
CheckSoundBank:
cmpi.w #$1, D1 ; verify our raw D1 and set base bank accordingly
beq SetBank0
cmpi.w #$2, D1
beq SetBank1
cmpi.w #$4, D1
beq SetBank2
move.w #$3, $80018.l
rts
SetBank0:
move.w #$0, $80018.l
rts
SetBank1:
move.w #$1, $80018.l
rts
SetBank2:
move.w #$2, $80018.l
rts
ORG $1000 ; tile upload snippet
TileUploadStart:
move.w (A2)+, (A1)+ ; just take A2 source (tiles) to A1 destination VRAM
dbra D0, TileUploadStart
rts
ORG $1800 ; (another) palette code snippet
movem.l D0-D7/A1-A6, -(A7) ; save stack (A0 intentionally updated by this snippet)
move.w #$f, D0 ; what's the difference here? Same as above but no hardcoded priority?
bsr FetchNewPalette
movem.l (A7)+, D0-D7/A1-A6
rts
ORG $2000 ; daireikai RNG snippet (guess)
move.w D5, $100400.l
move.w $f000c.l, D5 ; take current RNG number
add.l D6, D5 ; add D6
andi.w #$3f, D5
move.w D5, $f000c.l ; round it
move.w $100400.l, D5
rts
ORG $2800 ; daireikai layer clearances
movem.l D0-D7/A0-A6, -(A7)
lea $90000.l, A6 ; layer 0
move.w #$1fff, D1
move.w #$00ff, D0
bsr ClearLayer
movem.l (A7)+, D0-D7/A0-A6
rts
ClearLayer:
move.w D0, (A6)+
dbra D1, ClearLayer
rts
ORG $2880
movem.l D0-D7/A0-A6, -(A7)
lea $94000.l, A6 ; layer 1
move.w #$1fff, D1
move.w #$00ff, D0
bsr ClearLayer
movem.l (A7)+, D0-D7/A0-A6
rts
ORG $2900
movem.l D0-D7/A0-A6, -(A7)
lea $98000.l, A6 ; layer 2
move.w #$1fff, D1
move.w #$f0ff, D0
bsr ClearLayer
movem.l (A7)+, D0-D7/A0-A6
rts
ORG $fffe ; extend binary ROM to 0x10000 in size
dc.w $ffff
END START
*~Font name~Courier New~
*~Font size~10~
*~Tab type~1~
*~Tab size~4~
|