summaryrefslogtreecommitdiffstatshomepage
path: root/attic/jalmah.x68
blob: 18ee8be6488d8863478d65cbf77ce57afe330f67 (plain) (blame)
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~