Groovemaster and RS232C

This commit is contained in:
Bottersnike 2022-06-27 23:09:04 +01:00
parent 10b0228d6b
commit fca8fef362
7 changed files with 932 additions and 15 deletions

24
docs.py
View File

@ -8,6 +8,7 @@ from livereload import Server
# Importing performs monkeypatching
import xml_lexer # NOQA: F401
import ini_lexer # NOQA: F401
app = Flask(__name__)
@ -52,6 +53,7 @@ SEGA_CONTENTS = {
"dongle.html": "Dongles",
"keychip.html": "Keychips",
}),
"groovemaster.html": "GrooveMaster.ini",
}),
"network": ("Networking", {
"allnet.html": "ALL.Net"
@ -73,14 +75,20 @@ class Part:
PARTS = {
"838-14971": Part("838-14971", "Aime NFC daughter board", "NFC RW BD TN32MSEC003S"),
"838-15221": Part("838-15221", "Serial I/F BD Touchpanel Gunze", "The interface board for the touchscreen on MaiMai versions pre-DX.")
"838-15221": Part("838-15221", "Serial I/F BD Touchpanel Gunze",
"The interface board for the touchscreen on MaiMai versions pre-DX.")
}
def part(id):
if (part := PARTS.get(id)):
return f'<span class="part" tabindex="0">{part.name}<span><span>ASSY ID</span><span>SEGA {part.id}</span><span>Description</span><span>{part.description}</span></span></span>'
return f'<span class="part">{id}</span>'
def part(id_):
if (part := PARTS.get(id_)):
return (
f'<span class="part" tabindex="0">{part.name}<span>'
f'<span>ASSY ID</span><span>SEGA {part.id}</span>'
f'<span>Description</span><span>{part.description}</span>'
'</span></span>'
)
return f'<span class="part">{id_}</span>'
def generate_xrpc_list():
@ -355,7 +363,7 @@ def sitemap():
return response
if __name__ == '__main__':
def run_dev():
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['DEBUG'] = True
@ -364,3 +372,7 @@ if __name__ == '__main__':
server = Server(app.wsgi_app)
server.watch(".")
server.serve(port=3000)
if __name__ == '__main__':
run_dev()

68
ini_lexer.py Normal file
View File

@ -0,0 +1,68 @@
# from pygments.lexer import RegexLexer
# from pygments.token import Text, Comment, Operator, Name, String
# from pygments.lexers import _lexer_cache
# from pygments.lexers._mapping import LEXERS
# def italic_attr(lexer, m):
# yield m.start(), String, '"'
# yield m.start() + 2, Comment, m.group()[3:-1]
# yield m.end() - 1, String, '"'
# def italic_generic(lexer, m):
# yield m.start(), Comment, m.group()
# def italic_tag(lexer, m):
# yield m.start(), Name.Tag, "<"
# name = m.group()[3:]
# if name.endswith(">"):
# yield m.start() + 1, Comment, name[:-1]
# yield m.end() - 1, Name.Tag, ">"
# else:
# yield m.start() + 1, Comment, name
# def italic_tag_close(lexer, m):
# yield m.start(), Name.Tag, "</"
# yield m.start() + 4, Comment, m.group()[4:-1]
# yield m.end() - 1, Name.Tag, ">"
# def repeat_tag_close(lexer, m):
# before, _, after = m.group().partition("[]")
# yield m.start(), Name.Tag, before
# yield m.start() + len(before), Operator, "[]"
# yield m.start() + len(before) + 2, Name.Tag, after
# def italic_attr_name(lexer, m):
# name, _, after = m.group().partition("*")
# yield m.start(), Name.Attribute, name
# yield m.start() + len(name), Operator, "*"
# yield m.start() + len(name) + 1, Name.Attribute, after
from pygments.lexer import RegexLexer, bygroups
from pygments.token import Comment, Name, String, Whitespace
from pygments.lexers import _lexer_cache
from pygments.lexers._mapping import LEXERS
class CustomIniLexer(RegexLexer):
name = 'amINI'
aliases = ['amini']
tokens = {
'root': [
(r'\s+', Whitespace),
(r'[;#].*', Comment.Single),
(r'([a-zA-Z0-9]+?)([ \t]+)([a-zA-Z0-9]+)', bygroups(Name.Attribute, Whitespace, String)),
]
}
_lexer_cache[CustomIniLexer.__name__] = CustomIniLexer
LEXERS["CustomIniLexer"] = ("ini_lexer", "CustomIniLexer", ("amini", ), (), ())
__all__ = ("CustomIniLexer", )

View File

@ -23,7 +23,7 @@
<body>
{% block rootbody %}{% endblock %}
{{ generate_footer()|safe }}
<script src="{{ROOT}}/headers.js"></script>
<script src="{{ROOT}}/headers.js?v=1"></script>
</body>
</html>

View File

@ -52,8 +52,8 @@
<td>JAMMA Video Standard. Unless specified otherwise, this refers to JVS version 2.</td>
</tr>
<tr>
<td>comio</td>
<td>An unofficial name used to refer to the modified JVS standard some devices use</td>
<td>RS232C</td>
<td>A modified JVS-like framing many SEGA-made serial devices uses</td>
</tr>
<tr>
<td>ALL.Net</td>

View File

@ -0,0 +1,837 @@
{% extends "sega.html" %}
{% block title %}GrooveMaster.ini{% endblock %}
{% block body %}
<h1>GrooveMaster.ini</h1>
<p><b>Note: This page is specifically regarding maimai, as this is the game I have been focusing my efforts on.</b>
Other games may use a similar format, or they might use a totally different one; I have no idea. This page exists
because I was going to make it as a personal notes document but figured it worth making public instead.</p>
<p>Despite the name, <code>GrooveMaster.ini</code> is not an ini file. Each line follows the <code>KEY_NAME value</code>
format. Lines may begin with a hash to indicate a comment. The file is split into four sections, as shown below.</p>
<pre>{% highlight "amini" %}#*************************************
# maimai DEBUG SETTING
# デバッグ系コンフィグ設定を記載する
#*************************************
#====================================================
#描画関係
#====================================================
KEYNAMES values
#====================================================
#システム関係
#====================================================
KEYNAMES values
#====================================================
#GAME ASSINMENT上書き
#====================================================
KEYNAMES values
#====================================================
#デバッグ関係
#====================================================
KEYNAMES values
{% endhighlight %}</pre>
<h2 id="values">Config values</h2>
<p>I'll sort these into the categories below later. Maybe.</p>
<table>
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Default</td>
<td>Meaning</td>
</tr>
</thead>
<tbody>
<tr>
<td>VIEW_COURSE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_ICON</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_TITLE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_PLATE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_FRAME</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_CHALLENGE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_OP_SPEED</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_ANSWER</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_SE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_BGINFO</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_STAR_ROT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_MIRROR</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OP_MOVIEBRIGHT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_JUDGE_DISP</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_AIMEID_1P</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_AIMEID_2P</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="drawing">Drawing related</h3>
<table>
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Default</td>
<td>Meaning</td>
</tr>
</thead>
<tbody>
<tr>
<td>ROTATE</td>
<td>int</td>
<td>0</td>
<td>By default two 1920x1080 displays are expected positioned in portrait but set in Windows as landscape,
thus the game renders sideways. This setting tells the game to render upright instead.</td>
</tr>
<tr>
<td>SCREENSHOT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_X0</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_X1</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_Y0</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_Y1</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_W</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>CAPTURE_H</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="system">System related</h3>
<table>
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Default</td>
<td>Meaning</td>
</tr>
</thead>
<tbody>
<tr>
<td>DEV</td>
<td>int</td>
<td>0</td>
<td>Enable dev mode. This adds some utility keybindings, and runs a (terrible) touchscreen emulator.</td>
</tr>
<tr>
<td>NO_RING</td>
<td>int</td>
<td>0</td>
<td>Indicate that we are not running on Ring* hardware. This disables the use of all drivers.</td>
</tr>
<tr>
<td>NO_JVS</td>
<td>int</td>
<td>0</td>
<td>Disable the use of <code>\\.\mxjvs</code>.</td>
</tr>
<tr>
<td>NO_SERIAL</td>
<td>int</td>
<td>0</td>
<td>Disable the use of all COM devices (aime readers, LEDs, touchscreen, and the camera).</td>
</tr>
<tr>
<td>NO_REBOOT</td>
<td>int</td>
<td>0</td>
<td>Disable the daily 7am reboot.</td>
</tr>
<tr>
<td>VIRTUAL_AIME</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>USB_DL_DISABLE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>NO_LINKCHECK</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>NO_DELIVER</td>
<td>int</td>
<td>0</td>
<td>Disable OTA updates (via mxgfetcher and mxdeliver).</td>
</tr>
<tr>
<td>NO_RESTRICT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>1P_ONLY</td>
<td>int</td>
<td>0</td>
<td>Disable the 2P display. This also disables the top banner, rendering only the main play region of 1P.
</td>
</tr>
<tr>
<td>NO_WAIT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_FREEPLAY</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_TOTAL_MACHINE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_LINK_ID</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_TRACKS_1P</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_TRACKS_MULTI</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_TRACKS_EVENT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OFFLINE_MODE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_EVENT_MODE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_ADVERTISE_MODE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_ADVERTISE_SOUND</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_CAMERA_POSITION</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_FRIEND_TEST</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_CLOSE_HOUR</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_CLOSE_MINUTE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_ALL_OPEN</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OPEN_SECRET</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_OPEN_EVENT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_AIME_SELECT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_REGION</td>
<td>str</td>
<td><i>empty string</i></td>
<td></td>
</tr>
<tr>
<td>SET_CLOCK_DATE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_CLOCK_BOOST</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_DRESS_CODE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>GO_CAMERA_UPLOAD</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>GO_COLLECTION</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_AUTO_PLAY</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>SET_ARAYA_SPEED</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>LIVE_COMMENT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SPEAK_SPEAKER</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_AGING</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>QUICK_BOOT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="game">GAME ASSINMENT overwrite</h3>
<table>
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Default</td>
<td>Meaning</td>
</tr>
</thead>
<tbody>
<tr>
<td>GO_RESULT_1_1PACV</td>
<td>float</td>
<td>50.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_1_2PACV</td>
<td>float</td>
<td>50.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_1_SYNC</td>
<td>float</td>
<td>50.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_2_1PACV</td>
<td>float</td>
<td>80.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_2_2PACV</td>
<td>float</td>
<td>80.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_2_SYNC</td>
<td>float</td>
<td>80.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_3_1PACV</td>
<td>float</td>
<td>97.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_3_2PACV</td>
<td>float</td>
<td>97.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_3_SYNC</td>
<td>float</td>
<td>99.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_4_1PACV</td>
<td>float</td>
<td>100.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_4_2PACV</td>
<td>float</td>
<td>100.0</td>
<td></td>
</tr>
<tr>
<td>GO_RESULT_4_SYNC</td>
<td>float</td>
<td>100.0</td>
<td></td>
</tr>
<tr>
<td colspan="4">
<i>The following values are all used to force-unlock tracks in the PANDORA BOXX event. Setting them to
<code>8004444900999999</code> will force-unlock all tracks.</i>
</td>
</tr>
<tr>
<td>PANDORA_GREEN_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MAIMAI_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_PINK_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MURASAKI_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MILK_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_ORANGE_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_FINALE_1P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_GREEN_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MAIMAI_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_PINK_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MURASAKI_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_MILK_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_ORANGE_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
<tr>
<td>PANDORA_FINALE_2P</td>
<td>long</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="debug">Debug related</h3>
<table>
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Default</td>
<td>Meaning</td>
</tr>
</thead>
<tbody>
<tr>
<td>SET_DEBUG_MODE</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>DEBUG_MENU</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>DEBUG_CARD</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>DEV_STRING</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>DISP_NETSTAT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>PERFORMANCE_POS</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>RESOURCE_TEXT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>ITEM_VIEW</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>HOME_RANKER_USERID</td>
<td>str</td>
<td>0:0:0</td>
<td></td>
</tr>
<tr>
<td>HOME_RANKER_3RD_RATEX100</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>CTRACK_DAYS</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SUPERVISION</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>OLD_SERVER_TRANS_DISABLE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>DEBUG_COL_PLAYCOUNT</td>
<td>int</td>
<td>-1</td>
<td></td>
</tr>
<tr>
<td>EVENT_INFO_CHECK</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>STRESS_CHECK</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>PREV_FFA_FLAME</td>
<td>int</td>
<td>10</td>
<td></td>
</tr>
<tr>
<td>PREV_SKIP_FLAME</td>
<td>int</td>
<td>60</td>
<td></td>
</tr>
<tr>
<td>SET_SILENT_MODE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_VIEWER_PLAY</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_SPECIAL_VIEWER_PLAY</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>SET_NO_SDT</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>TIMING_TAP</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>TIMING_HOLDON</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>TIMING_HOLDOFF</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>TIMING_SLIDE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>ACHIEVE_SLIDE</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>DISPLAY_TAP</td>
<td>int</td>
<td>0</td>
<td></td>
</tr>
</tbody>
</table>
{% endblock %}

View File

@ -8,7 +8,7 @@ it is in Japanese. A rather excelent translation can be <a href="http://daifukka
<p>JVS is a communication standard designed for I/O devices in arcade macines. It typically operates over RS485 serial,
however the framing format can and sometimes is used outside of this context.</p>
<p>This page documents the canonical JVS structure. Some devices, notably the {{ part("838-14971")|safe }}, use a slight
variant on the format. <a href="./comio.html">The differences between the two formats are document here</a>.
variant on the format. <a href="./rs232c.html">The differences between the two formats are document here</a>.
</p>
<h2>Escaping</h2>

View File

@ -1,5 +1,5 @@
{% extends "sega.html" %}
{% block title %}JVS{% endblock %}
{% block title %}RS232C{% endblock %}
{% block body %}
<h1>JAMMA Video Standard - Alternative version</h1>
<p><b>Note:</b> This page assumes you have read the documentation regarding <a href="./jvs.html">the JAMMA video
@ -136,9 +136,9 @@
<td></td>
<td></td>
<td><code>51</code></td>
<td></td>
<td>Read back the MIFARE key</td>
<td>1+</td>
<td></td>
<td>6</td>
</tr>
<tr>
<td><mark>M</mark></td>
@ -160,9 +160,9 @@
<td></td>
<td></td>
<td><code>55</code></td>
<td>Read back the Aime key</td>
<td></td>
<td></td>
<td></td>
<td>6</td>
</tr>
<tr>
<td></td>