绝对初学者的新地Geo装配编程(2016)

2021-03-26 20:18:53

在花费一年时间和与这个美妙的平台合作后,我被要求制作一个"从划痕和#34; Neo-Geo编程指南。这个guidedoes不使用任何文库(例如neobitz套件,datlib或freemlib for neo-geo)。如果在汇编语言中做所有事情的想法吓到了你,那里有很少的替代品用于编码新地球游戏C.(所有这些都是由Fabrice Martinez,Jeff Kurtz等人的原始套件的或要求部分原始套件。)

本指南仍然假设很多信息。这些差距将在未来覆盖(希望)。

如何处理吸引模式,用户模式(例如,演示,游戏)等;这可能更适合以后的教程。

如果您认为应该提及此列表中缺少任何内容,请通过电子邮件(Gmail上的AJK187)或IRC:Chat.Freenode.org #neogeodev

本指南旨在成为初学者'第一个呼叫港口,了解新地球地理的顶峰。某种以前的编程经验会争取,即使它不是汇编语言也是如此。

我可以' t可能会教你一切,悲伤地了解新地理。这个文件的范围有很多原因,不是我不喜欢写Z80声音代码的最少的内容。 :D Plus,此提早介绍太多事情可能会吓到您。

此时,指南假定您知道如何使用计算机以及如何提出各种事物(例如,添加程序到和/或更改路径)。

本指南使用您可能不熟悉的一系列编程术语。 在本指南中,为%前缀(例如为0f(十进制15))的%前缀(例如,0 00001111)的二进制数(0个或1个)。 在本指南中,Hex数字(1美元,代表十进制数字0-15),用$前缀(例如$ 10fd80)播放。 二进制编码十进制涉及使用十六进制值$ 0- $ 9表示十进制数字。例如,十进制数20将被编码为十六进制20美元。 通常,处理器不同意数据如何存储在内部。 那里有竞争格式,大endian(也称为" NetworkByte订单"在其他文档中)和小endian。 在小endian中,最重要的字节是首次写入的,因此AHEX值为12345678美元的价格为78美元$ 56 $ 34 $ 12。 幸运的是,Neo-Geo no no no need need endian; 它使用了大型恩天。 AHEX值为12345678美元将以12美元34美元的价格储存在大endian中。

Neo-Geo是SNK(和ADK' s)解决方案,用于街机操作员可以轻松切换渗出。它最终被1989年被发布了,2004年发布了官方游戏。除了街机机器(叫做" MVS"或"多视频系统"),有一个家庭版本生产。后来,系统的一些CD版本也被释放。

推车和CD系统具有不同的局限集。除非你'重试才能让最详细的游戏,你可能会赢得'

购物车系统aren' t的限制很多,因为几乎所有的东西都是从rom.cartridges加载的,也具有能够使用自定义硬件的优势。 (Someexamples是联盟保龄球和骑乘英雄的链接插孔和额外的处理器,金属块上的CPLD和Neo-CMC等。)

CD系统以多种方式受到限制,因为大多数数据加载到RAM中。

绕过这些限制需要加载Thedisc的不同文件。切换大量数据时,应使用加载屏幕。

Neo-Geo的核心是摩托罗拉68000处理器(也是第三方制造的)。相同的处理器(虽然有时是后来的修订)为Moderore Amiga(非PPC版本)和20世纪80年代和20世纪90年代的许多拱顶等处都是电力。您可能会看到处理器被称为" M68K"或" 680x0"在各种文学中。

虽然68000是16位处理器(由外部总线尺寸定义),但它比能够处理32位值。

在68000上,您使用的数据类型的大小在Program和#​​39的布局中发挥着重要作用。原来的68000无法访问单词和长唱歌和#34;奇数"地址,所以从102061美元的单词读取(两个字节)将导致错误。这是一个非常重要的事情,因为您的代码可以编译精细,但运行将导致重置。

68000个系列使您可以访问8个数据寄存器,7个地址寄存器,堆栈指针和其他一些。所有寄存器都是32位。

68000有两种操作模式:用户模式和主管模式。这两种模式之间的有关是可供使用的指令。对于Neo-Geo开发,您将使用SystemROM使用特权指令,从而使用Supervisor模式。与使用用户模式相比,它更容易设置它并忘记它,并必须记住将返回Sysumbefore调用系统ROM例程等。

68K家族能够维修硬件中断。在Neo-Geo上,这些用于水平和垂直消隐。 (CD系统也似乎使用了文件加载的第三个中断?)

68000' s指令集太大而无法覆盖在这里,所以你建议拿起一些额外的文档。 680x0家庭的主要参考摩托罗拉M68000家庭编程器' S参考手册,可从NXP&#39的网站下载。 (见进一步阅读。)

其他好消息来源是互联网源引擎,可能是您当地的图书馆。' SA很多文献可用于68000家族,但请记住,您' Reonly处理基地68000(而不是任何继承者)没有a FPU。

为了创建Neo-Geo-Geo游戏/实用程序/无论如何,您&#39所需的数据; refoing需要一些工具。

汇编程序处理源代码的作业并以二进制格式向其吐出特定数据。 这里列出了更多的装配商。 VASM是一个跨平台汇编程序,支持许多架构,包括68000和Z80。 本教程使用VASM组装。 GNU汇编程序("和#34 ;,#34; Gas")是另一种选择。 它的默认语法对于M68KEAVES的默认语法是想要的,但有一个选择绕过它。 VLINK是推荐的链接器,用于VASM。 如果这个项目不仅仅是一个简单的"你好世界&#34 ;.它是将使用的链接器。 如果您有支持它的工具链,也可以使用GNU链接器。 存在许多用于图形的工具,包括转换器,查看器和编辑器。很多这些工具都是仅限Windows的。 NGFX是Blastar的工具,用于查看和编辑各种Neo-Geo Graphic格式。尚未发布公共版本。

Datlib包含一些图形工具。这可能是您可以轻松创建新Geo格式图形的最佳赌注(直到NGFX发布,无论如何)。

YY-CHR是一个用于各种游戏格式的图形编辑器。虽然原来的YY-Chrcan在葡萄酒中运行,但后来的YY-CHR.NEX没有。

转换4BPP SEGA主系统/游戏装备/ Wonderswan Color Graphics格式Neo-Geo可以理解(在某些操作之后;见下面的Romwak)。

如果有当前Neo-Geobrew开发场景的弱点,它' ssound。幸运的是,2015年是一些良好的与声音相关工具发布的年份。

Jeff Kurtz' S Neo Sound Builder使您可以为您创建ADPCM-A样本和手柄普及和地址。

还有一些其他工具,对Neo-Geo的Whendeveloping周围有很大的帮助。

GNU制作只是创建系统来构建项目的一种方法。它缺乏算术命令(这对于创建C ROM有用)可能会让您想要选择另一个选项。

Romwak最初由Jeff Kurtz创建,允许您执行许多单简单的操作(例如,Bytesupping,Padding)。

Mkisofs是CDRTools套件的一部分。它创建了一个.iso图像,You an然后在您的Neo-Geo CD上燃烧和使用。

Chdman用于从CD图像创建.chd文件。当您希望在烧毁光盘之前,您希望在MAME上测试NEO-GEO CD程序。

在我们开始创建Hello World项目之前,工具将需要安装和运行。

您可以使用您的任何工具和#39;最熟悉的工具,但本指南将使用VASAM(68K Target,Motorola语法)作为汇编程序。由于HelloWorld程序很小,我们不实际需要一个链接器。图形是alreadysupplied,所以如果你不想,你不会弄乱那些。

还包括最简单的声音驱动程序的源代码和二进制。您不需要安装VASM(Z80目标,OldStyle语法),除非您希望从源重建声音驱动程序。

设置项目工作区是个人偏好的问题。对于主题部分,我认为基于需要将物品保留在目录中分开的项目。

* .fix - 我的修复文件通常在根中生存并根据需要复制。

您可以自由地使用或忽略这一点;修改它以你喜欢,ANDSON。

与大多数(如果不是全部)68K二进制文件一样,前256(100美元)字节为机器使用的定义地址。这通常被称为"矢量"部分。根据您'重新定位卡乐乐乐峰系统,矢量略有不同。标记为"(您的选择)"取决于你。这些典型的define为$ c00426,它将重置系统。

这里的所有值都是longwords(每个4字节)。 (为清楚起见仅显示了三个字节,因为所有情况下最顶层的字节都将是00。)

在vectors之后,有一组值标识二进制作为新Geo兼容的值。

指向用户RAM中的位置,用于保存备份数据的MV。 (前两个字节用于调试Dipswitches。)

确定BIOS播放眼睛序列的方法/如果(0 =由BIOS处理; 1 =通过游戏处理; 2 = DON' T显示)

如果由BIOS处理,则定义眼镜仪的瓦片号的较高8位。

通过操作员和#39; MVS的菜单访问软件Dipswitch。(也可以使用开发BIOS访问它们;更稍后更多。)

定时选项,BCD值。最多是2959美元(29分钟,59秒)。使用$ ffff禁用。

定时选项,BCD值。最多是2959美元(29分钟,59秒)。使用$ ffff禁用。

映射每个选项的默认值和选项数。使用$ 00进行未使用的插槽。

softdips_usa:dc.b"示例softdips" ;游戏名称(16字节)dc.w $ ffff;定时选项1(禁用)DC.W $ FFFF;定时选项2(已禁用)DC.B $ FF;计数器选项1(禁用)DC.B $ FF;计数器选项2(禁用); --Option映射列表 - ; DC.B $ 02;选项1:默认选择= 0,num。选择= 2;用00美元00美元,$ 00,$ 00,$ 00,$ 00,$ 00,$ 00,$ 00,$ 00,$ 00,$ 00; - 选项定义 - ; ; [选项1]:演示声(开/关); " 12强器和#34; dc.b"演示声音" ;选项标题dc.b"" ;选择1 dc.b"关闭" ;选择2

除了检查" neo-geo"字符串,系统ROM检查代码的块。此代码通常指向$ 000182的位置,但已知虽然可以将安全码放在该地址000182 $ 000182。

DC.L $ 76004A6D,$ 0a146600,$ 003c206d,$ 0a043e2d dc.l $ 0a0813c0,$ 00300001, $ 32100c01,$ 00ff671a dc.l $ 30280002,$ b02d0aace,$ 66103028,$ 0004b02d dc.l $ 0acf6606,$ b22d0ad0,$ 67085088,$ 67085088,$ 67085088, $ 51cfffd4 dc.l $ 36074e75, $ 206d0a04, $ 3e2d0a08, $ 0c0100ff,$ 671a3010,$ b02d040 $ 66123028 dc.l $ 0002e048,$ b02d0acf,$ 6606b22d $ 0ad06708 dc.l $ 588851cf,$ FFD83607 DC.W $ 4E75

neo-geo header需要在代码中定义四例例程。在示例代码中进一步解释了例程。

当按下(两者)的一个开始按钮时调用,或者在标题屏幕(MVS)上的时间耗尽。

最简单的四个例程。所有COIN_SOUND Hasto DO播放硬币声音(将声音值发送到Z80)。

为了与Neo-Geo沟通,您' ll需要知道从和写入的读取乐谱。这对于系统ROM使用的硬件寄存器和RAMLOCation来说。

与Neo-Geo-Geo硬件的沟通主要以300000美元3Ffffffrange完成。 CD系统有其他寄存器(从$ FF0000开始?)。这里只记录几个额定者。如果您想了解更多信息,请在Neo-Geo开发Wiki上查看内存映射的寄存器页面。

需要特别注意看门狗。如果没有正确编写〜0.13秒,系统将重置。为了使看门狗踢,写入的字节为300000美元至31美元。通常,REG_DIPSW是写入的。

neo-geo上的系统ROM使用RAM中的许多地址。只有一些内部使用,而其他人则意图由程序员使用。该系统ROM将该地区储量为10f300至10美元以10美元。 CD系统使用不同于购物车系统的RAM位置。

这些地址仅适用于官方SNK系统ROM;第三方系统ROM替换可能会或可能不会使用这些地址.ALSO,这不是一个全面的清单。 Neo-Geo开发Wiki有一个页面,您希望了解更多BIOS RAM位置。

系统呼叫在Neo-Geo开发Wiki上概述。并非所有系统调用都包含在此处。

控制回到系统ROM。 JMP'在用户子程序结束时编辑。

使用Tile $ FF清除FIX层,并在屏幕的每侧绘制一列20个瓷砖。

系统ROM使用很多RAM位置。此列表无可置于齐全,完全了解RAM ISN'在开始时必需。

(todo:在​​这里添加了相当多的位置;确定哪些是可以的)

在调用Credit_check和Credit_down之前,请在此处设置递减的信用数量。 $ 10FDB0- $ 10FDB3为学分1-4。 为了了解如何在屏幕上获取图形,您将需要若要了解图形系统的内部结构。 通过内存映射的寄存器完成对图形硬件的所有访问。这些寄存器位于$ 3c000x部分中。 大多数写入寄存器亚伯生是单词,尽管IRQ确认寄存器是一个例外。 如果位0为1,则在PAL模式下停止计时器计数器32个光栅线。 Neo-Geo中的vram包含了修复数据的地图,以及forsprite控件的部分。 并非所有VRAM地址都在这里提到,因为他们是初学者的范围和#39; S教程。 vram中的所有值都是字长度(两个字节),尽管仅限于1的地址。 控制Y位置,精灵尺寸,以及如果此精灵连接到前一个。

FIX层是出现在所有精灵上的基于图块的映射。因此,它通常对HUDS(而不是其他)有用。瓷砖从顶部到右侧映射到右侧。

精灵用于需要显示的其他一切。填充定义分为四个部分,构成"精灵控制块"

SCB1定义每个精灵的Tilemap。每个Sprite' scb1中的条目都会增加2个单词×32瓦片。

SP33中最复杂的SCB3控制精灵' s y位置,尺寸,以及附在上一个精灵上的y' s' s' s附着在上一个sprite(当&#34时;粘滞位" = 1)。 Thesprite大小值范围从0-33;值为33使精灵32瓦片高跟循环边界(缩小时)。

SCB4控制X位置。与y位置不同,它被正确映射(例如,0将在屏幕的最左侧部分放置精灵)。

随着这一切,我们最终可以在Hello WorldProgram本身上开始工作。因为它更容易创建购物车版本,这将是前目标。

需要在程序ROM中的前两件事是68K Vectorsand,上面都提到的新Geo标题。

上面在Neo-Geo-Geo标题部分中提到了四种程序。为了进行适当的系统操作,这些例程需要执行一些任务。

用户例程需要响应SystemROM发送的命令(存储在bios_user_request中)。用户也是任何Neo-Geo程序的第一个端口,所以还初始化了一些东西。

用户:move.b d0,reg_dipsw; KICK看门狗LEA $ 10F300,SP;将堆栈指针设置为$ 10f300(bios_workram)move.w#0,lspc_mode;禁用自动动画和定时器中断,将自动漫画速度设置为0帧MOVE.W#7,LSPC_IRQ_ACK;承认所有伊拉克斯移动.W#$ 2000,SR;启用Vblank中断,转向主管;处理用户请求MOVEQ#0,D0;清除D0 Move.B Bios_User_Request,D0的所有位;将用户请求值放入D0 LSL.B#2,D0;偏移量留下两次以使TBL_USERREQUESTCOMMANDS LEA TBL_USERREQUESTCOMMANDS,A0;加载用户命令movea.l(a0,d0),a0;从表格和偏移jsr(a0)获取地址;跳转到子程序(通常以JMP System_Return结尾)JMP System_Return;这是在这里只是为了它并没有......?-------------------------------- ----------------------------------------; tbl_usrequestcommands;包含每个bios_user_request命令的地址的表.tbl_userrequestcommands:dc.l user_initialize;命令0(初始化)dc.l system_return;命令1(自定义eyepatch,未使用)dc.l user_main;命令2(演示游戏/游戏)dc.l user_main;命令3(标题显示)

此例程意味着初始化备份RAM区域(定义为$ 10e)。该命令仅在MVS上调用一次,在第一次启动游戏时。 (其他细节仍然是todo ...)

user_initialize:;这将是初始化高分和其他此类数据的地方;备份RAM区域(请参阅购物车/ CD头,"指向备份RAM块")。 ;在这个演示中,我们做任何事情,所以只是跳到system_return。 JMP System_Return.

"自定义眼镜"请求允许您更改标准Neo-GeoToot屏幕,但仅在AES上。 114美元/眼镜标志的值必须是第四个例程要运行。现在,它只是跳回System_Return。

游戏通常使用此作为其共享启动代码。许多新地质系统ROM变量需要在正常游戏中戏曲。为此,我们'重新保持简单,不用担心他们。该命令在代码结构中更详细地描述。

仅在MV上启用强制启动时才会调用。游戏' sitlecreen显示。如果启用了选择计时器,则应在屏幕上打印出几秒($ 10fdda / select_timer,在BCD中的$ 10FDDA / SELECT_TIMER)。

当时间耗尽时,游戏开始了。没有必要以system_return结尾。其他一切都与命令2中的相同,Sowe只是点命令3与命令2相同的例程。

当玩家按下开始或强制计时器在TitleScreen到期时,Player_Start被调用。我们不打扰处理它的情况......

玩家_Start:;在这个演示中,我们不要处理开始按钮或硬币。 rts.

demo_end并不需要做多少(它主要节省MVS备份Ramvalues),但它应该以RTS指令结束。

COIN_Sound需要做的唯一方法是向Playa Coin噪声发送z80命令。在这个例子中,我们甚至不这样做;我们只是退出。

在此演示中不会使用水平空白,但我们需要在&#39运行时回答中断。这是通过写入2(%00000010;确认HBLANK)到LSPC_IRQ_ACK来完成的。此外,踢了看门狗,因为防御计划与将重置系统的设备是一个好主意。

IRQ2:move.w#2,lspc_irq_ack; ACK. ......