EMEDRA_patch.s 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315
  1. *
  2. * EMEDRA_patch.s (c)1996 ずうやん
  3. *
  4. * 公開する時は、下の行を注釈にしてからアセンブルすること
  5. *DEBUG equ 1
  6. .include doscall.mac
  7. .include iocscall.mac
  8. NOP_code equ $4e71 * nop コード
  9. RTS_code equ $4e75 * rts コード
  10. JSR_code equ $4eb9 * jsr コード
  11. .text
  12. .even
  13. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  14. *@
  15. *@ ・パッチ常駐部
  16. *@
  17. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  18. **********************************************************************
  19. * 戦闘高速化パッチ
  20. * a6以外は破壊可能
  21. *
  22. * [ひらがな]または[SHIFT]のみ:高速
  23. * 両方押し:低速
  24. **********************************************************************
  25. battle_patch:
  26. move.w $810.w,d1 * シフト系キーの状態を得る
  27. *
  28. move.l $0018(a6),d0
  29. beq 1f
  30. *戦闘用タイマー
  31. subq.l #1,d0 * タイマーカウンタ-1(従来の処理)
  32. btst.l #$0,d1 * [SHIFT]が押されていたら、
  33. beq @f
  34. bchg.l #$d,d1 * [ひらがな]を逆転
  35. @@:
  36. btst.l #$d,d1 * [ひらがな]が押されていたら、ノーウエイト
  37. beq @f
  38. moveq.l #0,d0 * タイマーカウンタの残りを強制的に0にする
  39. @@:
  40. move.l d0,$0018(a6)
  41. 1:
  42. *ビジュアル用タイマー:ここは、従来通りの処理
  43. move.l $001c(a6),d0
  44. beq @f
  45. subq.l #1,d0
  46. move.l d0,$001c(a6)
  47. @@:
  48. rts
  49. **********************************************************************
  50. * コンフィグファイルをすげかえるパッチ
  51. **********************************************************************
  52. config_patch:
  53. movem.l a0-a5,-(sp)
  54. lea.l sysdata_path_check_mes(pc),a4
  55. lea.l sysdata_path(pc),a5
  56. 1:
  57. lea.l set_path_buf(pc),a1 * パス名を登録するバッファ
  58. @@:
  59. move.b (a4)+,(a1)+
  60. bne @b
  61. *
  62. subq.w #1,a1
  63. move.b #'=',(a1)+
  64. lea.l emedra_all_path(pc),a0
  65. @@:
  66. move.b (a0)+,(a1)+
  67. bne @b
  68. *
  69. subq.w #1,a1
  70. @@:
  71. move.b (a5)+,(a1)+
  72. bne @b
  73. *
  74. pea.l set_path_buf(pc)
  75. movea.l compare_path_name_address(pc),a0
  76. jsr (a0) * パスを登録するサブルーチンを呼ぶ
  77. addq.w #4,sp
  78. *
  79. cmpi.b #$ff,(a4)
  80. bne 1b
  81. *
  82. movea.l start_a0_backup(pc),a0
  83. adda.w #$80,a0 * a0.l=EMEDRA_patch.xの起動パス格納アドレス
  84. lea.l config_file_name(pc),a1
  85. @@:
  86. move.b (a0)+,(a1)+
  87. bne @b
  88. *
  89. subq.w #1,a1
  90. lea.l config_name(pc),a0
  91. @@:
  92. move.b (a0)+,(a1)+
  93. bne @b
  94. *
  95. clr.l -(sp)
  96. pea.l config_file_name(pc)
  97. DOS _OPEN * $ff3d
  98. addq.w #8,sp
  99. *
  100. movem.l (sp)+,a0-a5
  101. rts
  102. compare_path_name_address:
  103. .ds.l 1
  104. **********************************************************************
  105. * スクロール高速化パッチ
  106. * d0は破壊可能
  107. **********************************************************************
  108. scroll_patch:
  109. move.w $810.w,d0 * シフト系キーの状態を得る
  110. btst.l #$0,d0 * [SHIFT]が押されていたら、倍速
  111. beq @f
  112. *
  113. lsr.b #1,d1
  114. @@:
  115. btst.l #$e,d0 * [全角]が押されていたら、倍速
  116. beq @f
  117. *
  118. lsr.b #1,d1
  119. @@:
  120. ori.w #$0700,d1
  121. rts
  122. **********************************************************************
  123. * 高速化のための、[ひらがな][全角]キーLED変更を禁止する
  124. **********************************************************************
  125. led_patch:
  126. cmpi.b #5,d1 * [ひらがな]か?
  127. beq @f
  128. cmpi.b #6,d1 * [全角]か?
  129. beq @f
  130. IOCS _LEDMOD
  131. @@:
  132. rts
  133. **********************************************************************
  134. * 経験値を2倍にする
  135. **********************************************************************
  136. exp_patch:
  137. lsl.l #1,d0 * 2倍にする
  138. move.l a0,-(sp)
  139. movea.l exp_address(pc),a0
  140. move.l d0,(a0)
  141. move.l (sp)+,a0
  142. rts
  143. exp_address:
  144. .ds.l 1 * 足し込む経験値を保存するアドレス
  145. **********************************************************************
  146. * オープニング:パス相対化
  147. **********************************************************************
  148. opening_open_patch:
  149. move.w $000e(a6),-(sp) * オープンモード
  150. move.l $0008(a6),d0 * ファイル名パス
  151. movem.l a0-a1,-(sp) * レジスタ保存
  152. movea.l d0,a0
  153. cmpi.b #'\',2(a0)
  154. bne 1f
  155. *
  156. addq.w #3,a0
  157. move.l a0,d0
  158. movea.l start_a0_backup(pc),a0
  159. adda.w #$80,a0 * a0.l=EMEDRA_patch.xの起動パス格納アドレス
  160. lea.l file_name_buf(pc),a1 * ファイル名を登録するバッファ
  161. @@:
  162. move.b (a0)+,(a1)+
  163. bne @b
  164. *
  165. subq.w #1,a1
  166. movea.l d0,a0
  167. @@:
  168. move.b (a0)+,(a1)+
  169. bne @b
  170. move.l #file_name_buf,d0
  171. 1:
  172. movem.l (sp)+,a0-a1 * レジスタ復帰
  173. move.l d0,-(sp)
  174. DOS _OPEN
  175. addq.w #6,sp
  176. *元々の処理
  177. unlk a6
  178. rts
  179. **********************************************************************
  180. * ミュージックモード:パス相対化
  181. **********************************************************************
  182. music_mode_open_patch:
  183. move.w $000e(a6),-(sp) * オープンモード
  184. move.l $0008(a6),d0 * ファイル名パス
  185. movem.l a0-a1,-(sp) * レジスタ保存
  186. movea.l d0,a0
  187. cmpi.b #'\',(a0)
  188. bne 1f
  189. *
  190. addq.w #1,a0
  191. move.l a0,d0
  192. movea.l start_a0_backup(pc),a0
  193. adda.w #$80,a0 * a0.l=EMEDRA_patch.xの起動パス格納アドレス
  194. lea.l file_name_buf(pc),a1 * ファイル名を登録するバッファ
  195. @@:
  196. move.b (a0)+,(a1)+
  197. bne @b
  198. *
  199. subq.w #1,a1
  200. movea.l d0,a0
  201. @@:
  202. move.b (a0)+,(a1)+
  203. bne @b
  204. move.l #file_name_buf,d0
  205. 1:
  206. movem.l (sp)+,a0-a1 * レジスタ復帰
  207. move.l d0,-(sp)
  208. DOS _OPEN
  209. addq.w #6,sp
  210. *元々の処理
  211. unlk a6
  212. rts
  213. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  214. *@
  215. *@ ・メインプログラム
  216. *@
  217. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  218. **********************************************************************
  219. * 初期処理
  220. **********************************************************************
  221. emedra_patch:
  222. lea.l user_sp(pc),sp
  223. move.l 8(a0),himem_pointer * メモリ上限アドレス退避
  224. move.l a0,start_a0_backup * a0 を保存しておく
  225. lea.l $0010(a0),a0
  226. suba.l a0,a1
  227. move.l a1,-(sp)
  228. move.l a0,-(sp)
  229. DOS _SETBLOCK * $ff4a
  230. addq.w #8,sp
  231. tst.l d0
  232. bmi setblock_error * SETBLOCK失敗
  233. *タイトル表示
  234. pea.l title_mes(pc)
  235. DOS _PRINT
  236. addq.w #4,sp
  237. **********************************************************************
  238. * コマンドライン解析
  239. **********************************************************************
  240. tst.b (a2)+ * ここまで a2 は壊さないように
  241. beq 1f
  242. ifdef DEBUG
  243. pea.l command_line_mes(pc)
  244. DOS _PRINT
  245. addq.w #4,sp
  246. move.l a2,-(sp)
  247. DOS _PRINT
  248. addq.w #4,sp
  249. pea.l cr_mes(pc)
  250. DOS _PRINT
  251. addq.w #4,sp
  252. bra @f
  253. command_line_mes:
  254. .dc.b 'コマンドライン:',0
  255. .even
  256. @@:
  257. endif
  258. bsr switch_check * コマンドラインを解析
  259. 1:
  260. *パス名は指定されていたか
  261. move.b emedra_path_set_flag(pc),d0
  262. bne @f
  263. *起動パスをインストールパスとして登録する
  264. movea.l start_a0_backup(pc),a2
  265. adda.w #$80,a2 * a2.l=EMEDRA_patch.xの起動パス格納アドレス
  266. bsr emedra_path_set
  267. @@:
  268. **********************************************************************
  269. * コンフィグファイルの読み込み
  270. **********************************************************************
  271. bsr config_file
  272. **********************************************************************
  273. * ミュージックドライバを常駐させる
  274. **********************************************************************
  275. bsr mdevice_keep
  276. **********************************************************************
  277. * タイトル表示
  278. **********************************************************************
  279. ifdef DEBUG
  280. bsr title_print
  281. endif
  282. **********************************************************************
  283. * オープニングモードかどうか
  284. **********************************************************************
  285. move.b opening_switch_flag(pc),d0
  286. bne opening_exec
  287. **********************************************************************
  288. * ミュージックモードかどうか
  289. **********************************************************************
  290. move.b music_mode_switch_flag(pc),d0
  291. bne music_mode_exec
  292. **********************************************************************
  293. * プログラムの読み込み
  294. **********************************************************************
  295. *カレントドライブの変更
  296. lea.l emedra_all_path(pc),a0 * 格納パス
  297. moveq.l #0,d0
  298. move.b (a0),d0
  299. andi.b #$1f,d0
  300. subq.b #1,d0 * A=0,B=1…
  301. move.w d0,-(sp)
  302. DOS _CHGDRV * $ff0e
  303. addq.w #2,sp
  304. bmi program_load_error * カレント移動エラー
  305. *パスの変更
  306. lea.l exe_load_path(pc),a1 * ファイル名作成領域
  307. @@:
  308. move.b (a0)+,(a1)+
  309. bne @b
  310. *
  311. subq.w #1,a1
  312. lea.l emedra_path(pc),a0 * 'EMEDRA\'
  313. @@:
  314. move.b (a0)+,(a1)+
  315. bne @b
  316. *
  317. pea.l exe_load_path(pc)
  318. DOS _CHDIR * $ff3b
  319. addq.w #4,sp
  320. bmi program_load_error * カレント移動エラー
  321. *読み込み
  322. clr.l -(sp) * 環境は親と同じ
  323. pea.l emedra_command_line(pc) * コマンドライン
  324. pea.l emedra_exe_name(pc) * ファイル名
  325. move.w #$0001,-(sp) * ロードのみ
  326. DOS _EXEC * $ff4b
  327. lea.l 14(sp),sp
  328. tst.l d0
  329. bmi program_load_error * 読み込みエラー
  330. bsr exec_extract * LZX圧縮チェック&解凍
  331. lea.l $100(a0),a0
  332. move.l a0,program_top_address * 先頭アドレスを保存
  333. move.l a4,program_exec_address * 実行アドレスを保存
  334. **********************************************************************
  335. * パッチを当てる
  336. **********************************************************************
  337. *キーLED状態を保存
  338. IOCS _B_SFTSNS
  339. lsr.w #8,d0
  340. bclr.l #7,d0
  341. move.b d0,key_led_backup
  342. move.b d0,key_led_new
  343. *
  344. * 必ず当てるパッチ
  345. *
  346. lea.l patch_data_table_default(pc),a0
  347. bsr memory_patch * パッチ実行
  348. *
  349. * コンフィグファイルパッチ
  350. *
  351. lea.l patch_data_table_path_1(pc),a0
  352. bsr memory_patch * パッチアドレス決定
  353. movea.l last_patch_address(pc),a0
  354. subq.w #8,a0 * サブルーチンの先頭アドレス
  355. move.l a0,compare_path_name_address
  356. *
  357. lea.l patch_data_table_path_2(pc),a0
  358. bsr memory_patch * パッチアドレス決定
  359. movea.l last_patch_address(pc),a0
  360. move.l #config_patch,(a0)
  361. *
  362. * どこでもマップパッチ
  363. *
  364. move.b ex_map_flag(pc),d0
  365. beq @f
  366. *
  367. lea.l patch_data_table_map(pc),a0
  368. bsr memory_patch * パッチ実行
  369. @@:
  370. *
  371. * 移動高速化パッチ
  372. *
  373. move.b ex_scroll_flag(pc),d0
  374. beq @f
  375. *
  376. lea.l patch_data_table_scroll(pc),a0
  377. bsr memory_patch * パッチ実行
  378. *
  379. move.b ex_scroll_flag(pc),d0
  380. cmpi.b #1,d0
  381. bne @f
  382. *[全角]ロックする
  383. bset.b #6,key_led_new
  384. @@:
  385. *
  386. * 戦闘高速化パッチ
  387. *
  388. move.b ex_battle_flag(pc),d0
  389. beq @f
  390. *
  391. lea.l patch_data_table_battle(pc),a0
  392. bsr memory_patch * パッチ実行
  393. *
  394. move.b ex_battle_flag(pc),d0
  395. cmpi.b #1,d0
  396. bne @f
  397. *[ひらがな]ロックする
  398. bset.b #5,key_led_new
  399. @@:
  400. *
  401. * 経験値2倍パッチ
  402. *
  403. move.b ex_exp_flag(pc),d0
  404. beq @f
  405. *
  406. lea.l patch_data_table_exp(pc),a0
  407. bsr memory_patch * パッチアドレス決定
  408. movea.l last_patch_address(pc),a0
  409. move.l 2(a0),exp_address * 経験値を保存するアドレスを保存
  410. move.w #JSR_code,(a0)+
  411. move.l #exp_patch,(a0)
  412. @@:
  413. *
  414. * ほぼ最強装備パッチ
  415. *
  416. move.b ex_super_flag(pc),d0
  417. beq @f
  418. *
  419. lea.l patch_data_table_super(pc),a0
  420. bsr memory_patch * パッチ実行
  421. @@:
  422. *
  423. * ずうパッチ
  424. *
  425. move.b ex_zoo_flag(pc),d0
  426. beq @f
  427. *
  428. lea.l patch_data_table_zoo(pc),a0
  429. bsr memory_patch * パッチ実行
  430. @@:
  431. * パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  432. bsr patch_print_wait
  433. **********************************************************************
  434. * USERDATAディレクトリ(セーブデータ領域)がなければ作る
  435. **********************************************************************
  436. lea.l emedra_all_path(pc),a0
  437. lea.l set_path_buf(pc),a1 * パス名を登録するバッファ
  438. @@:
  439. move.b (a0)+,(a1)+
  440. bne @b
  441. *
  442. subq.w #1,a1
  443. lea.l userdata_path(pc),a0
  444. @@:
  445. move.b (a0)+,(a1)+
  446. bne @b
  447. *
  448. move.w #$0010,-(sp) * 検索するアトリビュートは、ディレクトリ
  449. pea.l set_path_buf(pc)
  450. pea.l files_buffer(pc)
  451. DOS _FILES * $ff4e
  452. lea.l 10(sp),sp
  453. *
  454. cmpi.l #-2,d0
  455. bne @f
  456. *USERDATAディレクトリを作成
  457. pea.l set_path_buf(pc)
  458. DOS _MKDIR * $ff39
  459. addq.w #4,sp
  460. @@:
  461. **********************************************************************
  462. * プログラム実行
  463. **********************************************************************
  464. *TIMER-Dを使用可能にする
  465. bsr tdpause_keep
  466. *キーLEDの設定
  467. move.b key_led_new(pc),d1
  468. IOCS _KEY_INIT
  469. *実行
  470. move.l program_exec_address(pc),-(sp)
  471. move.w #$0004,-(sp) * 実行のみ
  472. DOS _EXEC * $ff4b
  473. addq.w #6,sp
  474. move.l d0,emedra_exe_exit_code
  475. *キーLED状態を戻す
  476. move.b key_led_backup(pc),d1
  477. IOCS _KEY_INIT
  478. *TIMER-D設定を復活させる
  479. bsr tdpause_free
  480. *カレントディレクトリを戻す
  481. movea.l start_a0_backup(pc),a0
  482. adda.w #$80,a0 * a0.l=EMEDRA_patch.xの起動パス格納アドレス
  483. move.l a0,-(sp)
  484. DOS _CHDIR * $ff3b
  485. addq.w #4,sp
  486. *emedra.xの戻り値をチェック
  487. move.l emedra_exe_exit_code(pc),d0
  488. bmi program_exec_error
  489. **********************************************************************
  490. * 終了処理
  491. **********************************************************************
  492. emedra_exit:
  493. *ミュージックドライバを常駐解除する
  494. bsr mdevice_free
  495. *
  496. DOS _EXIT
  497. **********************************************************************
  498. * オープニング処理
  499. **********************************************************************
  500. opening_exec:
  501. *カレントドライブの変更
  502. lea.l emedra_all_path(pc),a0 * 格納パス
  503. moveq.l #0,d0
  504. move.b (a0),d0
  505. andi.b #$1f,d0
  506. subq.b #1,d0 * A=0,B=1…
  507. move.w d0,-(sp)
  508. DOS _CHGDRV * $ff0e
  509. addq.w #2,sp
  510. bmi program_load_error * カレント移動エラー
  511. *パスの変更
  512. lea.l exe_load_path(pc),a1 * ファイル名作成領域
  513. @@:
  514. move.b (a0)+,(a1)+
  515. bne @b
  516. *
  517. subq.w #1,a1
  518. lea.l bin_path(pc),a0 * 'BIN\'
  519. @@:
  520. move.b (a0)+,(a1)+
  521. bne @b
  522. *
  523. pea.l exe_load_path(pc)
  524. DOS _CHDIR * $ff3b
  525. addq.w #4,sp
  526. bmi program_load_error * カレント移動エラー
  527. *読み込み
  528. clr.l -(sp) * 環境は親と同じ
  529. pea.l emopen_command_line(pc) * コマンドライン
  530. pea.l emopen_exe_name(pc) * ファイル名
  531. move.w #$0001,-(sp) * ロードのみ
  532. DOS _EXEC * $ff4b
  533. lea.l 14(sp),sp
  534. tst.l d0
  535. bmi program_load_error * 読み込みエラー
  536. bsr exec_extract * LZX圧縮チェック&解凍
  537. lea.l $100(a0),a0
  538. move.l a0,program_top_address * 先頭アドレスを保存
  539. move.l a4,program_exec_address * 実行アドレスを保存
  540. *パッチ
  541. lea.l patch_data_table_opening(pc),a0
  542. bsr memory_patch * パッチ実行
  543. *パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  544. bsr patch_print_wait
  545. *TIMER-Dを使用可能にする
  546. bsr tdpause_keep
  547. *実行
  548. move.l program_exec_address(pc),-(sp)
  549. move.w #$0004,-(sp) * 実行のみ
  550. DOS _EXEC * $ff4b
  551. addq.w #6,sp
  552. ** move.l d0,emedra_exe_exit_code
  553. *emedra.xの戻り値をチェック
  554. ** move.l emedra_exe_exit_code(pc),d0
  555. tst.l d0
  556. bmi program_exec_error
  557. *TIMER-D設定を復活させる
  558. bsr tdpause_free
  559. *
  560. bra emedra_exit
  561. **********************************************************************
  562. * ミュージックモード処理
  563. **********************************************************************
  564. music_mode_exec:
  565. *カレントドライブの変更
  566. lea.l emedra_all_path(pc),a0 * 格納パス
  567. moveq.l #0,d0
  568. move.b (a0),d0
  569. andi.b #$1f,d0
  570. subq.b #1,d0 * A=0,B=1…
  571. move.w d0,-(sp)
  572. DOS _CHGDRV * $ff0e
  573. addq.w #2,sp
  574. bmi program_load_error * カレント移動エラー
  575. *パスの変更
  576. lea.l exe_load_path(pc),a1 * ファイル名作成領域
  577. @@:
  578. move.b (a0)+,(a1)+
  579. bne @b
  580. *
  581. subq.w #1,a1
  582. lea.l bin_path(pc),a0 * 'BIN\'
  583. @@:
  584. move.b (a0)+,(a1)+
  585. bne @b
  586. *
  587. pea.l exe_load_path(pc)
  588. DOS _CHDIR * $ff3b
  589. addq.w #4,sp
  590. bmi program_load_error * カレント移動エラー
  591. *読み込み
  592. clr.l -(sp) * 環境は親と同じ
  593. pea.l mode_command_line(pc) * コマンドライン
  594. pea.l mode_exe_name(pc) * ファイル名
  595. move.w #$0001,-(sp) * ロードのみ
  596. DOS _EXEC * $ff4b
  597. lea.l 14(sp),sp
  598. tst.l d0
  599. bmi program_load_error * 読み込みエラー
  600. bsr exec_extract * LZX圧縮チェック&解凍
  601. lea.l $100(a0),a0
  602. move.l a0,program_top_address * 先頭アドレスを保存
  603. move.l a4,program_exec_address * 実行アドレスを保存
  604. *パッチ
  605. lea.l patch_data_table_music_mode(pc),a0
  606. bsr memory_patch * パッチ実行
  607. *パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  608. bsr patch_print_wait
  609. *TIMER-Dを使用可能にする
  610. bsr tdpause_keep
  611. *実行
  612. move.l program_exec_address(pc),-(sp)
  613. move.w #$0004,-(sp) * 実行のみ
  614. DOS _EXEC * $ff4b
  615. addq.w #6,sp
  616. ** move.l d0,emedra_exe_exit_code
  617. *emedra.xの戻り値をチェック
  618. ** move.l emedra_exe_exit_code(pc),d0
  619. tst.l d0
  620. bmi program_exec_error
  621. *TIMER-D設定を復活させる
  622. bsr tdpause_free
  623. *
  624. bra emedra_exit
  625. **********************************************************************
  626. * タイトル表示
  627. **********************************************************************
  628. ifdef DEBUG
  629. title_print:
  630. movem.l d1-d7/a0-a6,-(sp)
  631. *カレントドライブの変更
  632. lea.l emedra_all_path(pc),a0 * 格納パス
  633. moveq.l #0,d0
  634. move.b (a0),d0
  635. andi.b #$1f,d0
  636. subq.b #1,d0 * A=0,B=1…
  637. move.w d0,-(sp)
  638. DOS _CHGDRV * $ff0e
  639. addq.w #2,sp
  640. bmi title_print_error_exit * カレント移動エラー
  641. *パスの変更
  642. lea.l exe_load_path(pc),a1 * ファイル名作成領域
  643. @@:
  644. move.b (a0)+,(a1)+
  645. bne @b
  646. *
  647. subq.w #1,a1
  648. lea.l bin_path(pc),a0 * 'BIN\'
  649. @@:
  650. move.b (a0)+,(a1)+
  651. bne @b
  652. *
  653. pea.l exe_load_path(pc)
  654. DOS _CHDIR * $ff3b
  655. addq.w #4,sp
  656. bmi title_print_error_exit * カレント移動エラー
  657. *読み込み
  658. clr.l -(sp) * 環境は親と同じ
  659. pea.l emopen_command_line(pc) * コマンドライン
  660. pea.l emopen_exe_name(pc) * ファイル名
  661. move.w #$0001,-(sp) * ロードのみ
  662. DOS _EXEC * $ff4b
  663. lea.l 14(sp),sp
  664. tst.l d0
  665. bmi title_print_error_exit * 読み込みエラー
  666. bsr exec_extract * LZX圧縮チェック&解凍
  667. lea.l $100(a0),a0
  668. move.l a0,program_top_address * 先頭アドレスを保存
  669. move.l a4,program_exec_address * 実行アドレスを保存
  670. *パッチ
  671. lea.l patch_data_table_opening(pc),a0
  672. bsr memory_patch * パッチ実行
  673. lea.l patch_data_table_title_print(pc),a0
  674. bsr memory_patch * パッチ実行
  675. *パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  676. bsr patch_print_wait
  677. *TIMER-Dを使用可能にする
  678. bsr tdpause_keep
  679. *実行
  680. move.w #$c,d1
  681. IOCS _CRTMOD
  682. clr.l -(sp)
  683. DOS _SUPER
  684. addq.w #4,sp
  685. move.l d0,-(sp) * SSP保存
  686. *
  687. movea.l last_patch_address(pc),a0
  688. move.l #$4fef000c,30(a0) * (lea.l 12(sp),sp)
  689. move.w #RTS_code,34(a0)
  690. subq.w #4,a0 * サブルーチンの先頭アドレス
  691. jsr (a0)
  692. *
  693. DOS _SUPER
  694. addq.w #4,sp
  695. *TIMER-D設定を復活させる
  696. bsr tdpause_free
  697. *ダミーEXEC
  698. bsr dummy_exec
  699. *
  700. movem.l (sp)+,d1-d7/a0-a6
  701. moveq.l #0,d0
  702. rts
  703. title_print_error_exit:
  704. movem.l (sp)+,d1-d7/a0-a6
  705. moveq.l #-1,d0
  706. rts
  707. endif
  708. ifdef DEBUG
  709. **title_print:
  710. movem.l d1-d7/a0-a6,-(sp)
  711. *カレントドライブの変更
  712. lea.l emedra_all_path(pc),a0 * 格納パス
  713. moveq.l #0,d0
  714. move.b (a0),d0
  715. andi.b #$1f,d0
  716. subq.b #1,d0 * A=0,B=1…
  717. move.w d0,-(sp)
  718. DOS _CHGDRV * $ff0e
  719. addq.w #2,sp
  720. bmi title_print_error_exit * カレント移動エラー
  721. *パスの変更
  722. lea.l exe_load_path(pc),a1 * ファイル名作成領域
  723. @@:
  724. move.b (a0)+,(a1)+
  725. bne @b
  726. *
  727. subq.w #1,a1
  728. lea.l bin_path(pc),a0 * 'BIN\'
  729. @@:
  730. move.b (a0)+,(a1)+
  731. bne @b
  732. *
  733. pea.l exe_load_path(pc)
  734. DOS _CHDIR * $ff3b
  735. addq.w #4,sp
  736. bmi title_print_error_exit * カレント移動エラー
  737. *読み込み
  738. clr.l -(sp) * 環境は親と同じ
  739. pea.l mode_command_line(pc) * コマンドライン
  740. pea.l mode_exe_name(pc) * ファイル名
  741. move.w #$0001,-(sp) * ロードのみ
  742. DOS _EXEC * $ff4b
  743. lea.l 14(sp),sp
  744. tst.l d0
  745. bmi title_print_error_exit * 読み込みエラー
  746. bsr exec_extract * LZX圧縮チェック&解凍
  747. lea.l $100(a0),a0
  748. move.l a0,program_top_address * 先頭アドレスを保存
  749. move.l a4,program_exec_address * 実行アドレスを保存
  750. *パッチ
  751. lea.l patch_data_table_music_mode(pc),a0
  752. bsr memory_patch * パッチ実行
  753. lea.l patch_data_table_title_print(pc),a0
  754. bsr memory_patch * パッチ実行
  755. *パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  756. bsr patch_print_wait
  757. *TIMER-Dを使用可能にする
  758. bsr tdpause_keep
  759. *実行
  760. move.w #$c,d1
  761. IOCS _CRTMOD
  762. clr.l -(sp)
  763. DOS _SUPER
  764. addq.w #4,sp
  765. move.l d0,-(sp) * SSP保存
  766. *
  767. movea.l last_patch_address(pc),a0
  768. subq.w #8,a0 * サブルーチンの先頭アドレス
  769. jsr (a0)
  770. *
  771. DOS _SUPER
  772. addq.w #4,sp
  773. *TIMER-D設定を復活させる
  774. bsr tdpause_free
  775. *ダミーEXEC
  776. bsr dummy_exec
  777. *
  778. movem.l (sp)+,d1-d7/a0-a6
  779. moveq.l #0,d0
  780. rts
  781. **title_print_error_exit:
  782. movem.l (sp)+,d1-d7/a0-a6
  783. moveq.l #-1,d0
  784. rts
  785. endif
  786. **********************************************************************
  787. * スイッチ解析
  788. *
  789. * 入力:a2.l=解析する文字列の先頭アドレス
  790. * 出力:なし
  791. **********************************************************************
  792. switch_check:
  793. switch_check_loop:
  794. move.b (a2)+,d0
  795. beq switch_check_exit
  796. cmpi.b #' ',d0
  797. beq switch_check_loop
  798. cmpi.b #7,d0 * TAB
  799. beq switch_check_loop
  800. cmpi.b #'-',d0
  801. beq @f
  802. cmpi.b #'/',d0
  803. beq @f
  804. cmpi.b #'?',d0
  805. beq manual
  806. subq.w #1,a2
  807. bra emedra_path_set
  808. @@:
  809. move.b (a2)+,d0
  810. cmpi.b #'?',d0
  811. beq manual
  812. and.b #$df,d0 * 大文字化
  813. cmpi.b #'G',d0
  814. beq g_switch
  815. cmpi.b #'M',d0
  816. beq m_switch
  817. cmpi.b #'O',d0
  818. beq o_switch
  819. cmpi.b #'Z',d0
  820. beq z_switch
  821. cmpi.b #'H',d0
  822. beq manual
  823. bra manual
  824. *Gスイッチ指定時(ゲーム)
  825. g_switch:
  826. st.b game_switch_flag
  827. bra switch_check_loop
  828. *Mスイッチ指定時(ミュージックモード)
  829. m_switch:
  830. st.b music_mode_switch_flag
  831. bra switch_check_loop
  832. *Oスイッチ指定時(オープニング)
  833. o_switch:
  834. st.b opening_switch_flag
  835. bra switch_check_loop
  836. *Zスイッチ指定時
  837. z_switch:
  838. st.b zoo_switch_flag
  839. bra switch_check_loop
  840. switch_check_exit:
  841. rts
  842. *パス名読み込み
  843. emedra_path_set:
  844. lea.l emedra_all_path(pc),a0
  845. moveq.l #0,d1 * パス名の長さ
  846. @@:
  847. move.b (a2),d0 * (a2)+ にすると、0チェックでバグる(^^;
  848. beq @f
  849. cmpi.b #' ',d0
  850. beq @f
  851. cmpi.b #7,d0
  852. beq @f
  853. addq.w #1,a2
  854. addq.b #1,d1
  855. move.b d0,(a0)+
  856. bra @b
  857. @@:
  858. *'\'が省略されていたら付ける
  859. cmpi.b #2,d1
  860. bls @f * 2>=d1
  861. cmpi.b #'\',-1(a0)
  862. beq 1f
  863. @@:
  864. move.b #'\',(a0)+
  865. 1:
  866. clr.b (a0)
  867. ifdef DEBUG
  868. pea.l emedra_path_mes(pc)
  869. DOS _PRINT
  870. addq.w #4,sp
  871. pea.l emedra_all_path(pc)
  872. DOS _PRINT
  873. addq.w #4,sp
  874. pea.l cr_mes(pc)
  875. DOS _PRINT
  876. addq.w #4,sp
  877. bra @f
  878. emedra_path_mes:
  879. .dc.b 'パス名:',0
  880. .even
  881. @@:
  882. endif
  883. st.b emedra_path_set_flag
  884. rts
  885. **********************************************************************
  886. * メモリパッチ
  887. *
  888. * 入力:a0.l=パッチテーブルのアドレス
  889. * 出力:なし
  890. **********************************************************************
  891. memory_patch:
  892. movem.l d0-d7/a0-a6,-(sp)
  893. 1:
  894. move.w (a0)+,d0
  895. beq memory_patch_exit * 全パッチ終了
  896. *
  897. lea.l memory_patch(pc),a1 * disしたらパニックになると思う算出方法(^^;
  898. adda.w d0,a1
  899. movea.l (a1)+,a4 * a4.l=検索基準アドレス
  900. move.w (a1)+,d1 * d1.w=チェックデータ長(ワード単位)
  901. movea.l a1,a2 * a1.l=チェック元データアドレス
  902. adda.w d1,a2
  903. adda.w d1,a2 * a2.l=書き換え後データアドレス
  904. adda.l program_top_address(pc),a4
  905. movea.l a4,a5
  906. suba.w #$100,a4 * 検索開始アドレス
  907. adda.w #$100,a5 * 検索終了アドレス
  908. *
  909. tst.b zoo_switch_flag
  910. beq @f
  911. *変更内容を表示する(要Zスイッチ)
  912. movem.l d0/a2,-(sp)
  913. adda.w d1,a2
  914. adda.w d1,a2 * 変更内容メッセージポインタ
  915. move.l a2,-(sp)
  916. DOS _PRINT
  917. pea.l cr_mes(pc)
  918. DOS _PRINT
  919. addq.w #8,sp
  920. movem.l (sp)+,d0/a2
  921. @@:
  922. 2:
  923. movea.l a1,a3 * チェックデータアドレス設定
  924. move.w (a3)+,d0
  925. *1ワード目一致チェックループ
  926. @@:
  927. cmp.w (a4)+,d0
  928. beq @f
  929. cmp.w (a4)+,d0
  930. beq @f
  931. cmp.w (a4)+,d0
  932. beq @f
  933. cmp.w (a4)+,d0
  934. beq @f
  935. cmpa.l a5,a4 * 高速化のため、エンドチェックは8バイトに1回
  936. bcs @b
  937. *
  938. bra 5f * プログラムの終端に達した
  939. @@:
  940. *1ワード目一致
  941. move.l a4,d7 * a4保存
  942. cmpi.w #1,d1
  943. beq 4f * 1ワードデータなので見つかり
  944. move.w d1,d2
  945. subq.w #2,d2
  946. @@:
  947. cmpm.w (a3)+,(a4)+
  948. bne 3f
  949. dbra d2,@b
  950. bra 4f * 見つかった
  951. 3:
  952. *2ワード目以降で不一致
  953. move.l d7,a4 * a4復帰
  954. cmpa.l a5,a4
  955. bcs 2b * 検索続行
  956. bra 5f * 見つからなかった
  957. *見つかった
  958. 4:
  959. movem.l a0-a1,-(sp)
  960. move.l d7,a1
  961. suba.w #2,a1 * 書き換えアドレス
  962. movea.l a2,a0
  963. move.w d1,d2
  964. subq.w #1,d2
  965. *書き換えループ
  966. @@:
  967. move.w (a0)+,(a1)+
  968. dbra d2,@b
  969. move.l a1,last_patch_address * 最後に書き換えた場所+1を保存しておく
  970. movem.l (sp)+,a0-a1
  971. *書き換えアドレス表示(要Zスイッチ)
  972. tst.b zoo_switch_flag
  973. beq @f
  974. movem.l d0/a0-a1,-(sp)
  975. pea.l hexheader_mes(pc)
  976. DOS _PRINT
  977. addq.w #4,sp
  978. move.l program_top_address(pc),a0 * 検索開始アドレス
  979. move.l d7,a1
  980. suba.w #2,a1 * 書き換えアドレス
  981. suba.l a0,a1 * オフセット
  982. move.l a1,d0
  983. bsr lhex_print
  984. movem.l (sp)+,d0/a0-a1
  985. @@:
  986. bra 3b
  987. *見つらなかった(1データ検索終了)
  988. 5:
  989. tst.b zoo_switch_flag
  990. beq @f
  991. move.l d0,-(sp)
  992. pea.l cr_mes(pc)
  993. DOS _PRINT
  994. addq.w #4,sp
  995. move.l (sp)+,d0
  996. @@:
  997. bra 1b * 次のデータ検索へ
  998. memory_patch_exit:
  999. movem.l (sp)+,d0-d7/a0-a6
  1000. rts
  1001. **********************************************************************
  1002. * ダミーEXEC
  1003. * ・プログラムをロードして実行しないままEXITしようとすると、ロードし
  1004. *  た所から再実行されてしまうので、ダミーでEXECしてやる。
  1005. *
  1006. * 入力:なし
  1007. * 出力:なし
  1008. **********************************************************************
  1009. dummy_exec:
  1010. movem.l d1-d7/a0-a6,-(sp)
  1011. movea.l program_exec_address(pc),a0
  1012. move.w #$ff00,(a0) * DOS _EXEC のコード
  1013. move.l a0,-(sp)
  1014. move.w #$0004,-(sp) * 実行のみ
  1015. DOS _EXEC * $ff4b
  1016. addq.w #6,sp
  1017. movem.l (sp)+,d1-d7/a0-a6
  1018. rts
  1019. **********************************************************************
  1020. * 16進数表示
  1021. *
  1022. * 入力:d0.l=表示するデータ
  1023. * 出力:なし
  1024. **********************************************************************
  1025. lhex_print:
  1026. move.w d0,-(sp)
  1027. swap.w d0
  1028. bsr whex_print
  1029. move.w (sp)+,d0
  1030. whex_print:
  1031. move.w d0,-(sp)
  1032. lsr.w #8,d0
  1033. bsr bhex_print
  1034. move.w (sp)+,d0
  1035. bhex_print:
  1036. move.b d0,-(sp)
  1037. andi.b #$f0,d0
  1038. lsr.b #4,d0
  1039. bsr hhex_print
  1040. move.b (sp)+,d0
  1041. andi.b #$0f,d0
  1042. hhex_print:
  1043. addi.b #'0',d0
  1044. cmpi.b #'9'+1,d0
  1045. bmi @f
  1046. addq.b #7,d0
  1047. @@:
  1048. move.w d0,-(sp)
  1049. DOS _INPOUT * 一文字表示
  1050. addq.w #2,sp
  1051. rts
  1052. **********************************************************************
  1053. * LZX圧縮されていたら解凍する(SF2_patch.s を参考にしています)
  1054. *
  1055. * 入力:なし
  1056. * 出力:なし
  1057. **********************************************************************
  1058. exec_extract:
  1059. movem.l d0-d7/a0/a2-a3/a5-a6,-(sp)
  1060. cmpi.l #'LZX ',$04(a4)
  1061. bne 1f * lzx v0.30以降の圧縮がされていなかった
  1062. cmpi.w #$4ed4,-$2e(a1) * 自己解凍ルーチン内 jmp (a4)存在確認
  1063. bne 1f
  1064. movea.l a4,a0 * 転送
  1065. move.l $0e(a0),d0
  1066. add.l a0,d0 * 実行アドレス算出
  1067. movem.l d0,-(sp) * 退避
  1068. move.l $12(a0),d0
  1069. add.l a0,d0 * データサイズ算出
  1070. movem.l d0,-(sp) * 退避
  1071. move.l himem_pointer(pc),d6
  1072. move.l d6,$04(a0) * メモリ使用上限アドレス設定
  1073. movea.l a0,a5
  1074. move.l a0,$08(a0) * 解凍アドレス設定
  1075. lea.l @f(pc),a4 * 戻りアドレス設定
  1076. jmp 2(a0) * lzx自己解凍処理ルーチンへジャンプ
  1077. @@:
  1078. movem.l (sp)+,a1/a4 * データ終端&実行アドレス復帰
  1079. 1:
  1080. movem.l (sp)+,d0-d7/a0/a2-a3/a5-a6
  1081. move.l a1,$38(a0) * プロセス初期スタックアドレス強制設定
  1082. rts
  1083. **********************************************************************
  1084. * コンフィグファイルを読み込み、スイッチを解析する
  1085. *
  1086. * 入力:なし
  1087. * 出力:なし
  1088. **********************************************************************
  1089. config_file:
  1090. movem.l d0-d7/a0-a6,-(sp)
  1091. *
  1092. movea.l start_a0_backup(pc),a0
  1093. adda.w #$80,a0 * a0.l=EMEDRA_patch.xの起動パス格納アドレス
  1094. lea.l config_file_name(pc),a1
  1095. @@:
  1096. move.b (a0)+,(a1)+
  1097. bne @b
  1098. *
  1099. subq.w #1,a1
  1100. lea.l config_name(pc),a0
  1101. @@:
  1102. move.b (a0)+,(a1)+
  1103. bne @b
  1104. *
  1105. clr.l -(sp)
  1106. pea.l config_file_name(pc)
  1107. DOS _OPEN * $ff3d
  1108. addq.w #8,sp
  1109. tst.l d0
  1110. bmi config_load_error
  1111. move.w d0,d7 * d7.w=ファイルハンドル
  1112. *
  1113. move.w #2,-(sp) * ファイル終端へ
  1114. clr.l -(sp) * オフセット0
  1115. move.w d7,-(sp) * ハンドル
  1116. DOS _SEEK * $ff42
  1117. addq.w #8,sp
  1118. move.l d0,d6 * d6.l=ファイルサイズ
  1119. *
  1120. move.l d6,-(sp) * 確保するメモリサイズ
  1121. DOS _MALLOC * $ff48
  1122. addq.w #4,sp
  1123. tst.l d0
  1124. bmi config_file_exit * メモリ確保エラー
  1125. movea.l d0,a6 * a6.l=確保したアドレス
  1126. movea.l a6,a5
  1127. adda.l d6,a5 * a5.l=メモリ終端+1
  1128. *
  1129. clr.w -(sp) * ファイル先頭へ
  1130. clr.l -(sp) * オフセット0
  1131. move.w d7,-(sp) * ハンドル
  1132. DOS _SEEK * $ff42
  1133. addq.w #8,sp
  1134. *
  1135. move.l d6,-(sp) * 読み込むサイズ
  1136. move.l a6,-(sp) * 読み込むアドレス
  1137. move.w d7,-(sp) * ハンドル
  1138. DOS _READ * $ff3f
  1139. lea.l 10(sp),sp
  1140. *
  1141. move.w d7,-(sp)
  1142. DOS _CLOSE
  1143. addq.w #2,sp
  1144. *
  1145. movea.l a6,a0
  1146. config_line_loop:
  1147. cmpa.l a0,a5
  1148. bls config_file_memfree
  1149. move.b (a0)+,d0
  1150. cmpi.b #'*',d0
  1151. beq next_line
  1152. cmpi.b #$0d,d0
  1153. beq next_line
  1154. *'EX_'が一致するか
  1155. cmpi.b #'E',d0
  1156. bne next_line
  1157. move.b (a0)+,d0
  1158. cmpi.b #'X',d0
  1159. bne next_line
  1160. move.b (a0)+,d0
  1161. cmpi.b #'_',d0
  1162. bne next_line
  1163. *
  1164. move.b (a0)+,d0
  1165. cmpi.b #'B',d0
  1166. bne @f
  1167. *'EX_BATTLE'だった
  1168. bsr flagon_check
  1169. move.b d0,ex_battle_flag
  1170. bra next_line
  1171. @@:
  1172. cmpi.b #'E',d0
  1173. bne @f
  1174. *'EX_EXP'だった
  1175. bsr flagon_check
  1176. move.b d0,ex_exp_flag
  1177. bra next_line
  1178. @@:
  1179. cmpi.b #'M',d0
  1180. bne @f
  1181. *'EX_MAP'だった
  1182. bsr flagon_check
  1183. move.b d0,ex_map_flag
  1184. bra next_line
  1185. @@:
  1186. cmpi.b #'Z',d0
  1187. bne @f
  1188. *'EX_ZOO'だった
  1189. bsr flagon_check
  1190. move.b d0,ex_zoo_flag
  1191. bra next_line
  1192. @@:
  1193. cmpi.b #'S',d0
  1194. bne next_line
  1195. move.b (a0)+,d0
  1196. cmpi.b #'U',d0
  1197. bne @f
  1198. *'EX_SUPER'だった
  1199. bsr flagon_check
  1200. move.b d0,ex_super_flag
  1201. bra next_line
  1202. @@:
  1203. cmpi.b #'C',d0
  1204. bne @f
  1205. *'EX_SCROLL'だった
  1206. bsr flagon_check
  1207. move.b d0,ex_scroll_flag
  1208. bra next_line
  1209. @@:
  1210. next_line:
  1211. move.b (a0)+,d0
  1212. cmpa.l a0,a5
  1213. bls config_file_memfree
  1214. cmpi.b #$0a,d0
  1215. bne next_line
  1216. bra config_line_loop
  1217. config_file_memfree:
  1218. move.l a6,-(sp)
  1219. DOS _MFREE * $ff49
  1220. addq.w #4,sp
  1221. config_file_exit:
  1222. movem.l (sp)+,d0-d7/a0-a6
  1223. rts
  1224. flagon_check:
  1225. move.b (a0)+,d0
  1226. cmpa.l a0,a5
  1227. bls @f
  1228. cmpi.b #$0d,d0
  1229. beq @f
  1230. cmpi.b #'*',d0
  1231. beq @f
  1232. cmpi.b #'1',d0
  1233. bmi flagon_check
  1234. cmpi.b #'9',d0
  1235. bhi flagon_check
  1236. *
  1237. subi.b #'0',d0 * d0.b= 1~9
  1238. rts
  1239. @@:
  1240. subq.w #1,a0
  1241. moveq.l #0,d0
  1242. rts
  1243. **********************************************************************
  1244. * TIMER-D を使用可能にする/戻す
  1245. *
  1246. * 入力:なし
  1247. * 出力:なし
  1248. **********************************************************************
  1249. tdpause_keep:
  1250. pea.l get_pr_buffer(pc)
  1251. clr.w -(sp)
  1252. DOS _GET_PR
  1253. addq.w #6,sp
  1254. tst.l d0
  1255. bmi @f * スレッドはなかった(BG未使用)
  1256. *
  1257. clr.l -(sp)
  1258. DOS _SUPER
  1259. addq.w #4,sp
  1260. move.l d0,-(sp) * SSP保存
  1261. move.w sr,-(sp)
  1262. ori.w #$0700,sr
  1263. move.l $0110.w,timerd_vector_backup
  1264. bsr timerd_stop
  1265. lea.l iocs6b_vector_backup(pc),a0
  1266. move.l $05ac.w,(a0)
  1267. lea.l new_iocs6b(pc),a0
  1268. move.l a0,$05ac.w
  1269. move.w (sp)+,sr
  1270. DOS _SUPER
  1271. addq.w #4,sp
  1272. st.b tdpause_flag
  1273. @@:
  1274. move.b zoo_switch_flag(pc),d0 * tst.b
  1275. beq @f
  1276. *
  1277. pea.l bg_stop_mes(pc)
  1278. DOS _PRINT
  1279. addq.w #4,sp
  1280. @@:
  1281. rts
  1282. tdpause_free:
  1283. move.b tdpause_flag(pc),d0
  1284. beq @f
  1285. *
  1286. clr.l -(sp)
  1287. DOS _SUPER
  1288. addq.w #4,sp
  1289. move.l d0,-(sp) * SSP保存
  1290. move.w sr,-(sp)
  1291. ori.w #$0700,sr
  1292. move.l iocs6b_vector_backup(pc),$05ac.w
  1293. move.l timerd_vector_backup(pc),$0110.w
  1294. lea.l $00e88000,a0
  1295. move.b #$77,$1d(a0)
  1296. move.b #$14,$25(a0)
  1297. move.b $09(a0),d0
  1298. ori.b #$10,d0
  1299. move.b d0,$09(a0)
  1300. move.b $15(a0),d0
  1301. ori.b #$10,d0
  1302. move.b d0,$15(a0)
  1303. move.w (sp)+,sr
  1304. DOS _SUPER
  1305. addq.w #4,sp
  1306. @@:
  1307. rts
  1308. * 新しい IOCS _TIMERDST
  1309. new_iocs6b:
  1310. movem.l d1/a0,-(sp)
  1311. move.l a1,d0
  1312. beq timerd_stop_2 * 割り込み禁止設定
  1313. *
  1314. move.l $0110.w,d0
  1315. cmpi.l #$00c00000,d0
  1316. bcs @f * すでに設定されている
  1317. *
  1318. move.l a1,$0110.w
  1319. lea.l $00e88000,a0
  1320. move.w d1,d0
  1321. ror.w #8,d0
  1322. andi.w #$0007,d0
  1323. ori.w #$0070,d0
  1324. move.b d0,$1d(a0)
  1325. move.b d1,$25(a0)
  1326. move.b $09(a0),d0
  1327. ori.b #$10,d0
  1328. move.b d0,$09(a0)
  1329. move.b $15(a0),d0
  1330. ori.b #$10,d0
  1331. move.b d0,$15(a0)
  1332. moveq.l #0,d0
  1333. @@:
  1334. movem.l (sp)+,d1/a0
  1335. rts
  1336. timerd_stop:
  1337. movem.l d1/a0,-(sp)
  1338. timerd_stop_2:
  1339. lea.l $00e88000,a0
  1340. move.b #$70,$1d(a0)
  1341. move.b $09(a0),d0
  1342. andi.b #$ef,d0
  1343. move.b d0,$09(a0)
  1344. move.b $15(a0),d0
  1345. andi.b #$ef,d0
  1346. move.b d0,$15(a0)
  1347. lea.l tdpause_rte(pc),a0
  1348. move.l a0,d0
  1349. ori.l #$44000000,d0
  1350. move.l d0,$0110.w
  1351. moveq.l #0,d0
  1352. movem.l (sp)+,d1/a0
  1353. rts
  1354. tdpause_rte:
  1355. rte
  1356. **********************************************************************
  1357. * ミュージックドライバを常駐させる
  1358. *
  1359. * 入力:なし
  1360. * 出力:なし
  1361. **********************************************************************
  1362. mdevice_keep:
  1363. movem.l d0-d7/a0-a6,-(sp)
  1364. *
  1365. clr.l -(sp)
  1366. pea.l emdrive_name(pc) * 'EMDRIVE'
  1367. DOS _OPEN * $ff3d
  1368. addq.w #8,sp
  1369. tst.l d0
  1370. bmi @f * まだ常駐していない
  1371. *既に常駐していたので、何もしない
  1372. move.w d0,-(sp)
  1373. DOS _CLOSE
  1374. addq.w #2,sp
  1375. bra mdevice_keep_exit
  1376. @@:
  1377. lea.l adddrv_command_line(pc),a6
  1378. *パス検索
  1379. lea.l adddrv_exe_name(pc),a0
  1380. lea.l adddrv_file_name(pc),a1
  1381. @@:
  1382. move.b (a0)+,(a1)+
  1383. bne @b
  1384. *ダミーのコマンドライン
  1385. moveq.l #0,d0
  1386. move.b d0,(a6)
  1387. move.b d0,1(a6)
  1388. *パス検索
  1389. clr.l -(sp) * 環境は親と同じ
  1390. move.l a6,-(sp) * コマンドライン
  1391. pea.l adddrv_file_name(pc) * ファイル名
  1392. move.w #2,-(sp) * 検索
  1393. DOS _EXEC * $ff4b
  1394. lea.l 14(sp),sp
  1395. tst.l d0
  1396. bmi adddrv_load_error * 読み込みエラー
  1397. *コマンドライン作成
  1398. lea.l emedra_all_path(pc),a0 * 格納パス
  1399. lea.l 1(a6),a1
  1400. @@:
  1401. move.b (a0)+,(a1)+
  1402. bne @b
  1403. *
  1404. subq.w #1,a1
  1405. lea.l mdevice_sys_name(pc),a0
  1406. @@:
  1407. move.b (a0)+,(a1)+
  1408. bne @b
  1409. *コマンドラインの長さ
  1410. movea.l a1,a0
  1411. lea.l 1(a6),a2
  1412. suba.l a2,a0
  1413. move.l a0,d0
  1414. move.b d0,(a6)
  1415. *一行改行
  1416. pea.l cr_mes(pc)
  1417. DOS _PRINT
  1418. addq.w #4,sp
  1419. *実行(常駐)
  1420. clr.l -(sp) * 環境は親と同じ
  1421. move.l a6,-(sp) * コマンドライン
  1422. pea.l adddrv_file_name(pc) * ファイル名
  1423. clr.w -(sp) * ロード&実行
  1424. DOS _EXEC * $ff4b
  1425. lea.l 14(sp),sp
  1426. tst.l d0
  1427. bmi adddrv_load_error * 読み込みエラー
  1428. *
  1429. *一行改行
  1430. pea.l cr_mes(pc)
  1431. DOS _PRINT
  1432. addq.w #4,sp
  1433. *ADDDRVしたフラグをオン
  1434. st.b adddrv_use_flag
  1435. *
  1436. mdevice_keep_exit:
  1437. movem.l (sp)+,d0-d7/a0-a6
  1438. rts
  1439. **********************************************************************
  1440. * ミュージックドライバを常駐解除する
  1441. *
  1442. * 入力:なし
  1443. * 出力:なし
  1444. **********************************************************************
  1445. mdevice_free:
  1446. movem.l d0-d7/a0-a6,-(sp)
  1447. *
  1448. move.b adddrv_use_flag(pc),d0
  1449. beq mdevice_free_exit * 常駐していないので、開放しない
  1450. *
  1451. lea.l deldrv_command_line(pc),a6
  1452. *パス検索
  1453. lea.l deldrv_exe_name(pc),a0
  1454. lea.l deldrv_file_name(pc),a1
  1455. @@:
  1456. move.b (a0)+,(a1)+
  1457. bne @b
  1458. *ダミーのコマンドライン
  1459. moveq.l #0,d0
  1460. move.b d0,(a6)
  1461. move.b d0,1(a6)
  1462. *パス検索
  1463. clr.l -(sp) * 環境は親と同じ
  1464. move.l a6,-(sp) * コマンドライン
  1465. pea.l deldrv_file_name(pc) * ファイル名
  1466. move.w #2,-(sp) * 検索
  1467. DOS _EXEC * $ff4b
  1468. lea.l 14(sp),sp
  1469. tst.l d0
  1470. bmi deldrv_load_error * 読み込みエラー
  1471. *実行(常駐解除)
  1472. clr.l -(sp) * 環境は親と同じ
  1473. move.l a6,-(sp) * コマンドライン
  1474. pea.l deldrv_file_name(pc) * ファイル名
  1475. clr.w -(sp) * ロード&実行
  1476. DOS _EXEC * $ff4b
  1477. lea.l 14(sp),sp
  1478. tst.l d0
  1479. bmi deldrv_load_error * 読み込みエラー
  1480. *
  1481. mdevice_free_exit:
  1482. movem.l (sp)+,d0-d7/a0-a6
  1483. rts
  1484. **********************************************************************
  1485. * パッチ結果を表示後の、キー入力待ち(/Zスイッチ時のみ)
  1486. **********************************************************************
  1487. patch_print_wait:
  1488. move.l d0,-(sp)
  1489. move.b zoo_switch_flag(pc),d0 * tst.b
  1490. beq @f
  1491. *キー入力を待つ
  1492. pea.l hit_any_key_mes(pc)
  1493. DOS _PRINT
  1494. addq.w #4,sp
  1495. DOS _INKEY * $ff07
  1496. @@:
  1497. move.l (sp)+,d0
  1498. rts
  1499. **********************************************************************
  1500. * 使用方法表示
  1501. **********************************************************************
  1502. manual:
  1503. pea.l manual_mes(pc)
  1504. DOS _PRINT
  1505. addq.w #4,sp
  1506. bra error_exit
  1507. **********************************************************************
  1508. * エラー処理
  1509. **********************************************************************
  1510. adddrv_load_error:
  1511. pea.l color2n_mes(pc) * 黄色にする
  1512. DOS _PRINT
  1513. addq.w #4,sp
  1514. pea.l adddrv_exe_name(pc)
  1515. DOS _PRINT
  1516. addq.w #4,sp
  1517. pea.l adddrv_load_error_mes(pc)
  1518. bra 1f
  1519. deldrv_load_error:
  1520. pea.l color2n_mes(pc) * 黄色にする
  1521. DOS _PRINT
  1522. addq.w #4,sp
  1523. pea.l deldrv_exe_name(pc)
  1524. DOS _PRINT
  1525. addq.w #4,sp
  1526. pea.l deldrv_load_error_mes(pc)
  1527. bra 1f
  1528. config_load_error:
  1529. pea.l color2n_mes(pc) * 黄色にする
  1530. DOS _PRINT
  1531. addq.w #4,sp
  1532. pea.l exe_load_path(pc) * パス名
  1533. DOS _PRINT
  1534. addq.w #4,sp
  1535. pea.l config_name(pc) * 'emedra.cnf'
  1536. DOS _PRINT
  1537. addq.w #4,sp
  1538. pea.l config_load_error_mes(pc)
  1539. bra 1f
  1540. program_load_error:
  1541. pea.l program_load_error_mes(pc)
  1542. bra @f
  1543. program_exec_error:
  1544. pea.l program_exec_error_mes(pc)
  1545. bra @f
  1546. @@:
  1547. pea.l color2n_mes(pc) * 黄色にする
  1548. DOS _PRINT
  1549. addq.w #4,sp
  1550. pea.l exe_load_path(pc) * パス名
  1551. DOS _PRINT
  1552. addq.w #4,sp
  1553. pea.l emedra_exe_name(pc) * 'emedra.x'
  1554. DOS _PRINT
  1555. addq.w #4,sp
  1556. bra 1f
  1557. setblock_error:
  1558. pea.l setblock_error_mes(pc)
  1559. bra @f
  1560. patch_error:
  1561. bsr dummy_exec * ロードしたプログラムを開放する
  1562. pea.l patch_error_mes(pc)
  1563. bra @f
  1564. @@:
  1565. pea.l color2n_mes(pc) * 黄色にする
  1566. DOS _PRINT
  1567. addq.w #4,sp
  1568. 1:
  1569. DOS _PRINT * エラーメッセージ表示
  1570. addq.w #4,sp
  1571. pea.l color3n_mes(pc) * 白に戻す
  1572. DOS _PRINT
  1573. pea.l hit_any_key_mes(pc)
  1574. DOS _PRINT
  1575. addq.w #8,sp
  1576. DOS _INKEY * $ff07
  1577. error_exit:
  1578. *ミュージックドライバを常駐解除する
  1579. bsr mdevice_free
  1580. *
  1581. move.w #$0001,-(sp)
  1582. DOS _EXIT2 * $ff4c
  1583. .data
  1584. .even
  1585. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  1586. *@
  1587. *@ ・パッチデータテーブル
  1588. *@
  1589. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  1590. **********************************************************************
  1591. * 必ず当てるパッチ達
  1592. **********************************************************************
  1593. patch_data_table_default:
  1594. .dc.w patch_data_data_check_off-memory_patch
  1595. .dc.w patch_data_led-memory_patch
  1596. .dc.w 0 * 終端コード
  1597. * キャラクター改造チェックを無効にするパッチ
  1598. patch_data_data_check_off:
  1599. .dc.l $00e554 * アドレス
  1600. .dc.w 3 * ワード数
  1601. .dc.w $b0ae,$fff8 ** cmp.l -$0008(a6),d0
  1602. .dc.w $6706 ** beq L00e55c
  1603. .dc.w $b0ae,$fff8 ** cmp.l -$0008(a6),d0
  1604. .dc.w $6006 ** bra L00e55c
  1605. .dc.b 'キャラクター改造チェック外し',0
  1606. .even
  1607. * 特定LED変更禁止パッチ
  1608. patch_data_led:
  1609. .dc.l $002cb8 * アドレス
  1610. .dc.w 7 * ワード数
  1611. .dc.w $222f,$0004 ** move.l $0004(a7),d1
  1612. .dc.w $242f,$0008 ** move.l $0008(a7),d2
  1613. .dc.w $700d,$4e4f ** IOCS _LEDMOD
  1614. .dc.w $4e75 ** rts
  1615. .dc.w $222f,$0004 ** move.l $0004(a7),d1
  1616. .dc.w $242f,$0008 ** move.l $0008(a7),d2
  1617. .dc.w $4ef9 ** jmp [led_patch]
  1618. .dc.l led_patch **
  1619. .dc.b '[ひらがな][全角]キーのLED変更禁止',0
  1620. .even
  1621. **********************************************************************
  1622. * 戦闘高速化パッチ
  1623. **********************************************************************
  1624. patch_data_table_battle:
  1625. .dc.w patch_data_battle-memory_patch
  1626. .dc.w 0 * 終端コード
  1627. patch_data_battle:
  1628. .dc.l $000098 * アドレス
  1629. .dc.w 10 * ワード数
  1630. .dc.w $202e,$0018 ** move.l $0018(a6),d0
  1631. .dc.w $6704 ** beq L0000a2
  1632. .dc.w $53ae,$0018 ** subq.l #1,$0018(a6)
  1633. .dc.w $202e,$001c ** move.l $001c(a6),d0
  1634. .dc.w $6704 ** beq L0000ac
  1635. .dc.w $53ae,$001c ** subq.l #1,$001c(a6)
  1636. .dc.w $4eb9 ** jsr [battle_patch]
  1637. .dc.l battle_patch **
  1638. .dc.w $600c ** bra L0000ac
  1639. .dc.w $4e71 ** nop
  1640. .dc.w $4e71,$4e71 ** nop * 2
  1641. .dc.w $4e71 ** nop
  1642. .dc.w $4e71,$4e71 ** nop * 2
  1643. .dc.b '戦闘高速化',0
  1644. .even
  1645. **********************************************************************
  1646. * スクロール高速化パッチ
  1647. **********************************************************************
  1648. patch_data_table_scroll:
  1649. .dc.w patch_data_scroll-memory_patch
  1650. .dc.w 0 * 終端コード
  1651. patch_data_scroll:
  1652. .dc.l $008c14 * アドレス
  1653. .dc.w 7 * ワード数
  1654. .dc.w $122f,$000b ** move.b $000b(a7),d1
  1655. .dc.w $e149 ** lsl.w #8,d1
  1656. .dc.w $122f,$000f ** move.b $000f(a7),d1
  1657. .dc.w $706b,$4e4f ** IOCS _TIMERDST
  1658. .dc.w $122f,$000f ** move.b $000f(a7),d1
  1659. .dc.w $4eb9 ** jsr [scroll_patch]
  1660. .dc.l scroll_patch **
  1661. .dc.w $706b,$4e4f ** IOCS _TIMERDST
  1662. .dc.b '移動高速化',0
  1663. .even
  1664. **********************************************************************
  1665. * ほぼ最強装備パッチ
  1666. **********************************************************************
  1667. patch_data_table_super:
  1668. .dc.w patch_data_super-memory_patch
  1669. .dc.w 0 * 終端コード
  1670. patch_data_super:
  1671. .dc.l $021b70 * アドレス
  1672. .dc.w $22 * ワード数
  1673. .dc.b $01,$00,$00,$02,$00,$19,$00,$0a,$00,$3c,$00,$05,$00,$0c,$01,$01
  1674. .dc.b $01,$01,$00,$00,$01,$29,$3d,$00,$00,$00,$ae,$d4,$f7,$c3,$ef,$ff
  1675. .dc.b $00,$00 ** ここまで、アトルシャン
  1676. .dc.b $02,$00,$00,$05,$00,$08,$00,$06,$00,$28,$00,$02,$00,$08,$01,$01
  1677. .dc.b $01,$01,$00,$01,$15,$34,$00,$00,$00,$01,$cb,$ec,$f6,$ff,$00,$00
  1678. .dc.b $00,$00 ** ここまで、タムリン
  1679. .dc.b $01,$00,$00,$02,$00,$19,$00,$0a,$00,$3c,$00,$05,$00,$0c,$01,$01
  1680. .dc.b $01,$01,$00,$00,$09,$32,$44,$55,$00,$00,$ae,$d4,$f7,$c3,$ef,$ff
  1681. .dc.b $00,$00 ** ^^^^^^^^^^^^^^^ 武器,鎧,盾,メット
  1682. .dc.b $02,$00,$00,$05,$00,$08,$00,$06,$00,$28,$00,$02,$00,$08,$01,$01
  1683. .dc.b $01,$01,$00,$01,$1f,$33,$45,$56,$00,$01,$cb,$ec,$f6,$ff,$00,$00
  1684. .dc.b $00,$00 ** ^^^^^^^^^^^^^^^
  1685. .dc.b 'ほぼ最強装備',0
  1686. .even
  1687. **********************************************************************
  1688. * どこでもマップパッチ
  1689. **********************************************************************
  1690. patch_data_table_map:
  1691. .dc.w patch_data_map-memory_patch
  1692. .dc.w 0 * 終端コード
  1693. patch_data_map:
  1694. .dc.l $0075dc * アドレス
  1695. .dc.w 3 * ワード数
  1696. .dc.w $4e90 ** jsr (a0)
  1697. .dc.w $4a80 ** tst.l d0
  1698. .dc.w $670c ** beq L0075ee
  1699. .dc.w $4e90 ** jsr (a0)
  1700. .dc.w $4a80 ** tst.l d0
  1701. .dc.w $4e71 ** nop
  1702. .dc.b 'どこでもマップを表示',0
  1703. .even
  1704. **********************************************************************
  1705. * 経験値2倍パッチ(探すだけ)
  1706. **********************************************************************
  1707. patch_data_table_exp:
  1708. .dc.w patch_data_exp-memory_patch
  1709. .dc.w 0 * 終端コード
  1710. patch_data_exp:
  1711. .dc.l $00dc80 * アドレス
  1712. .dc.w 4 * ワード数
  1713. .dc.w $4e56,$fffc ** link.w a6,#-4
  1714. .dc.w $202e,$0008 ** move.l $0008(a6),d0
  1715. .dc.w $4e56,$fffc ** link.w a6,#-4
  1716. .dc.w $202e,$0008 ** move.l $0008(a6),d0
  1717. .dc.b '経験値2倍',0
  1718. .even
  1719. **********************************************************************
  1720. * パス名定義(探すだけ)
  1721. **********************************************************************
  1722. patch_data_table_path_1:
  1723. .dc.w patch_data_path_1-memory_patch
  1724. .dc.w 0 * 終端コード
  1725. patch_data_path_1:
  1726. .dc.l $000c98 * アドレス
  1727. .dc.w 9 * ワード数
  1728. .dc.w $0c10,$0009 ** cmpi.b #$09,(a0)
  1729. .dc.w $67ec ** beq L000c8a
  1730. .dc.w $2008 ** move.l a0,d0
  1731. .dc.w $4e75 ** rts
  1732. .dc.w $48e7,$0018 ** movem.l a3-a4,-(a7)
  1733. .dc.w $286f,$000c ** movea.l $000c(a7),a4
  1734. .dc.w $0c10,$0009 ** cmpi.b #$09,(a0)
  1735. .dc.w $67ec ** beq L000c8a
  1736. .dc.w $2008 ** move.l a0,d0
  1737. .dc.w $4e75 ** rts
  1738. .dc.w $48e7,$0018 ** movem.l a3-a4,-(a7)
  1739. .dc.w $286f,$000c ** movea.l $000c(a7),a4
  1740. .dc.b 'パス名登録サブ',0
  1741. .even
  1742. **********************************************************************
  1743. * パス名定義(探すだけ)
  1744. **********************************************************************
  1745. patch_data_table_path_2:
  1746. .dc.w patch_data_path_2-memory_patch
  1747. .dc.w 0 * 終端コード
  1748. patch_data_path_2:
  1749. .dc.l $000d2e * アドレス
  1750. .dc.w 4 * ワード数
  1751. .dc.w $42a7 ** clr.l -(a7)
  1752. .dc.w $487a,$ffc2 ** pea.l emedra_sys_name(pc)
  1753. .dc.w $4eb9 ** jsr open
  1754. .dc.w $42a7 ** clr.l -(a7)
  1755. .dc.w $487a,$ffc2 ** pea.l emedra_sys_name(pc)
  1756. .dc.w $4eb9 ** jsr open
  1757. .dc.b 'パス名登録メイン',0
  1758. .even
  1759. **********************************************************************
  1760. * ディスクチェック外し(隠し:でも、プロテクトは外さないんだな)
  1761. **********************************************************************
  1762. patch_data_table_zoo:
  1763. .dc.w patch_data_zoo_1-memory_patch
  1764. .dc.w patch_data_zoo_2-memory_patch
  1765. .dc.w 0 * 終端コード
  1766. *このパッチは、_B_READ,_B_READDI のふたつ共用
  1767. patch_data_zoo_1:
  1768. .dc.l $008c3c * アドレス
  1769. .dc.w 5 * ワード数
  1770. .dc.w $48e7,$1000 ** movem.l d3,-(a7)
  1771. .dc.w $4cef,$020e,$0008 ** movem.l $0008(a7),d1-d3/a1
  1772. .dc.w $4e75,$4e71 ** rts, nop
  1773. .dc.w $4e71,$4e71,$4e71 ** nop * 3
  1774. .dc.b 'ずう1',0
  1775. .even
  1776. patch_data_zoo_2:
  1777. .dc.l $009736 * アドレス
  1778. .dc.w 5 * ワード数
  1779. .dc.w $4e56,$0000 ** link.w a6,#0
  1780. .dc.w $3f2e,$000a ** move.w $000a(a6),-(a7)
  1781. .dc.w $ff0f ** DOS _DRVCTRL
  1782. .dc.w $7042 ** moveq.l #$42,d0
  1783. .dc.w $4e75 ** rts
  1784. .dc.w $4e71,$4e71,$4e71 ** nop * 3
  1785. .dc.b 'ずう2',0
  1786. .even
  1787. **********************************************************************
  1788. * オープニング用パッチ
  1789. **********************************************************************
  1790. patch_data_table_opening:
  1791. .dc.w patch_data_opening_open-memory_patch
  1792. .dc.w patch_data_opening_drvctrl-memory_patch
  1793. .dc.w 0 * 終端コード
  1794. * オープニングファイル読み込みパス相対化
  1795. patch_data_opening_open:
  1796. .dc.l $002dc4 * アドレス
  1797. .dc.w 6 * ワード数
  1798. .dc.w $3f2e,$000e ** move.w $000e(a6),-(a7)
  1799. .dc.w $2f2e,$0008 ** move.l $0008(a6),-(a7)
  1800. .dc.w $ff3d ** DOS _OPEN
  1801. .dc.w $5c8f ** addq.l #6,a7
  1802. .dc.w $4ef9 ** jmp [opening_open_patch]
  1803. .dc.l opening_open_patch **
  1804. .dc.w $4e71,$4e71,$4e71 ** nop * 3
  1805. .dc.b 'オープニング:パス相対化',0
  1806. .even
  1807. * オープニングフロッピーチェック解除
  1808. patch_data_opening_drvctrl:
  1809. .dc.l $002e54 * アドレス
  1810. .dc.w 3 * ワード数
  1811. .dc.w $3f00 ** move.w d0,-(a7)
  1812. .dc.w $ff0f ** DOS _DRVCTRL
  1813. .dc.w $548f ** addq.l #2,a7
  1814. .dc.w $3f00 ** move.w d0,-(a7)
  1815. .dc.w $7042 ** moveq.l #$42,d0
  1816. .dc.w $548f ** addq.l #2,a7
  1817. .dc.b 'オープニング:フロッピーチェック解除',0
  1818. .even
  1819. ifdef DEBUG
  1820. * オープニングタイトル表示(v0.99 現在、このパッチは無効)
  1821. patch_data_table_title_print:
  1822. .dc.w patch_data_opening_title_print-memory_patch
  1823. .dc.w 0 * 終端コード
  1824. patch_data_opening_title_print:
  1825. .dc.l $001000 * アドレス
  1826. .dc.w 4 * ワード数
  1827. .dc.w $4e93 ** jsr (a3)
  1828. .dc.w $4e95 ** jsr (a5)
  1829. .dc.w $487a,$fe86 ** pea.l optitle_mbt_name(pc)
  1830. .dc.w $4e93 ** jsr (a3)
  1831. .dc.w $4e95 ** jsr (a5)
  1832. .dc.w $487a,$fe86 ** pea.l optitle_mbt_name(pc)
  1833. .dc.b 'オープニング:タイトル表示用',0
  1834. .even
  1835. endif
  1836. **********************************************************************
  1837. * ミュージックモード用パッチ
  1838. **********************************************************************
  1839. patch_data_table_music_mode:
  1840. .dc.w patch_data_music_mode_open-memory_patch
  1841. .dc.w patch_data_music_mode_drvctrl-memory_patch
  1842. .dc.w 0 * 終端コード
  1843. * ミュージックモードファイル読み込みパス相対化
  1844. patch_data_music_mode_open:
  1845. .dc.l $001652 * アドレス
  1846. .dc.w 6 * ワード数
  1847. .dc.w $3f2e,$000e ** move.w $000e(a6),-(a7)
  1848. .dc.w $2f2e,$0008 ** move.l $0008(a6),-(a7)
  1849. .dc.w $ff3d ** DOS _OPEN
  1850. .dc.w $5c8f ** addq.l #6,a7
  1851. .dc.w $4ef9 ** jmp [music_mode_open_patch]
  1852. .dc.l music_mode_open_patch **
  1853. .dc.w $4e71,$4e71,$4e71 ** nop * 3
  1854. .dc.b 'ミュージックモード:パス相対化',0
  1855. .even
  1856. * ミュージックモードフロッピーチェック解除
  1857. patch_data_music_mode_drvctrl:
  1858. .dc.l $0016e4 * アドレス
  1859. .dc.w 3 * ワード数
  1860. .dc.w $3f00 ** move.w d0,-(a7)
  1861. .dc.w $ff0f ** DOS _DRVCTRL
  1862. .dc.w $548f ** addq.l #2,a7
  1863. .dc.w $3f00 ** move.w d0,-(a7)
  1864. .dc.w $7042 ** moveq.l #$42,d0
  1865. .dc.w $548f ** addq.l #2,a7
  1866. .dc.b 'ミュージックモード:フロッピーチェック解除',0
  1867. .even
  1868. ifdef DEBUG
  1869. * オープニングタイトル表示(v0.99 現在、このパッチは無効)
  1870. patch_data_table_title_print_1:
  1871. .dc.w patch_data_music_mode_title_print-memory_patch
  1872. .dc.w 0 * 終端コード
  1873. patch_data_music_mode_title_print:
  1874. .dc.l $00084a * アドレス
  1875. .dc.w 4 * ワード数
  1876. .dc.w $48e7,$0018 ** movem.l a3-a4,-(a7)
  1877. .dc.w $42a7 ** clr.l -(a7)
  1878. .dc.w $47f9 ** lea.l
  1879. .dc.w $48e7,$0018 ** movem.l a3-a4,-(a7)
  1880. .dc.w $42a7 ** clr.l -(a7)
  1881. .dc.w $47f9 ** lea.l
  1882. .dc.b 'ミュージックモード:タイトル表示用',0
  1883. .even
  1884. endif
  1885. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  1886. *@
  1887. *@ ・各種データ/ワーク
  1888. *@
  1889. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  1890. **********************************************************************
  1891. * メッセージデータ
  1892. **********************************************************************
  1893. title_mes:
  1894. .dc.b $1b,'[37m'
  1895. .dc.b '《エメラルド・ドラゴン パッチ》'
  1896. .dc.b $1b,'[0m',13,10
  1897. .dc.b ' EMEDRA_patch.x version 0.99 (C)1996 ずうやん',13,10,0
  1898. manual_mes:
  1899. .dc.b 13,10
  1900. .dc.b ' 機 能 :エメラルド・ドラゴンに、パッチを当てます。',13,10
  1901. .dc.b 13,10
  1902. .dc.b '使用方法:EMEDRA_patch <スイッチ>',13,10
  1903. .dc.b 13,10
  1904. .dc.b 'スイッチ:-G ゲーム起動',13,10
  1905. .dc.b ' -M ミュージックモード起動',13,10
  1906. .dc.b ' -O オープニング起動',13,10
  1907. .dc.b 13,10
  1908. .dc.b 0
  1909. setblock_error_mes:
  1910. .dc.b 'メモリブロックの確保/解除に失敗しました。',13,10,0
  1911. program_load_error_mes:
  1912. .dc.b ' を読み込むことが出来ませんでした。。',13,10
  1913. .dc.b '指定したパス名を確認して下さい。',13,10,0
  1914. patch_error_mes:
  1915. .dc.b 'パッチに失敗しました。',13,10,0
  1916. program_exec_error_mes:
  1917. .dc.b ' の実行で、エラーが発生しました。',13,10,0
  1918. config_load_error_mes:
  1919. .dc.b ' を読み込むことが出来ませんでした。',13,10
  1920. .dc.b 'EMEDRA_patch.x と同じディレクトリに用意して下さい。',13,10,0
  1921. adddrv_load_error_mes:
  1922. .dc.b ' が見つからないので、ミュージックドライバを'
  1923. .dc.b '常駐させることが出来ません。',13,10,0
  1924. deldrv_load_error_mes:
  1925. .dc.b ' が見つからないので、ミュージックドライバを'
  1926. .dc.b '常駐解除することが出来ません。',13,10,0
  1927. bg_stop_mes:
  1928. .dc.b 'バックグラウンドを停止し、TIMER-Dを使用可能にします。',13,10,0
  1929. hit_any_key_mes:
  1930. .dc.b 13,10,'何かキーを押して下さい。',13,10,0
  1931. *16進数を表示する時の先頭に付ける文字列
  1932. hexheader_mes:
  1933. .dc.b ' $',0
  1934. *改行する文字列
  1935. cr_mes:
  1936. .dc.b 13,10,0
  1937. *水色にする
  1938. color1n_mes:
  1939. .dc.b $1b,'[31m',0
  1940. *黄色にする
  1941. color2n_mes:
  1942. .dc.b $1b,'[32m',0
  1943. *白にする
  1944. color3n_mes:
  1945. .dc.b $1b,'[33m',0
  1946. *ゲームプログラムのファイル名
  1947. emedra_exe_name:
  1948. .dc.b 'EMEDRA.X',0
  1949. *オープニングプログラムのファイル名
  1950. emopen_exe_name:
  1951. .dc.b 'EMOPEN.X',0
  1952. *ミュージックモードプログラムのファイル名
  1953. mode_exe_name:
  1954. .dc.b 'MODE.X',0
  1955. adddrv_exe_name:
  1956. .dc.b 'ADDDRV.X',0
  1957. deldrv_exe_name:
  1958. .dc.b 'DELDRV.X',0
  1959. mdevice_sys_name:
  1960. .dc.b 'MDEVICE.SYS #/B9',0
  1961. config_name:
  1962. .dc.b 'EMEDRA.CNF',0
  1963. *ミュージックドライバのデバイス名
  1964. emdrive_name:
  1965. .dc.b 'EMDRIVE',0
  1966. *プログラム実行時のダミーのコマンドライン
  1967. emopen_command_line:
  1968. emedra_command_line:
  1969. mode_command_line:
  1970. .dc.b 0,0
  1971. *emedra.x 格納パス
  1972. emedra_path:
  1973. .dc.b 'EMEDRA\',0
  1974. *emopen.x 格納パス
  1975. bin_path:
  1976. .dc.b 'BIN\',0
  1977. sysdata_path:
  1978. .dc.b 'SYSDATA',0
  1979. .dc.b 'MAPDATA',0
  1980. .dc.b 'MOVER',0
  1981. .dc.b 'MUSIC',0
  1982. .dc.b 'TALKDATA',0
  1983. .dc.b 'FIGHTDATA',0
  1984. .dc.b 'VISDATA',0
  1985. userdata_path:
  1986. .dc.b 'USERDATA',0
  1987. .dc.b $ff * パス名リスト終了コード
  1988. sysdata_path_check_mes:
  1989. .dc.b 'SYS',0
  1990. .dc.b 'MAP',0
  1991. .dc.b 'MOVER',0
  1992. .dc.b 'MUSIC',0
  1993. .dc.b 'TALK',0
  1994. .dc.b 'FIGHT',0
  1995. .dc.b 'VISUAL',0
  1996. .dc.b 'USER',0
  1997. .dc.b $ff * チェック文字リスト終了コード
  1998. **********************************************************************
  1999. * スイッチ保存情報,フラグ
  2000. **********************************************************************
  2001. game_switch_flag:
  2002. .dc.b 0 * -G:ゲームなら0以外
  2003. music_mode_switch_flag:
  2004. .dc.b 0 * -M:ミュージックモードなら0以外
  2005. opening_switch_flag:
  2006. .dc.b 0 * -O:オープニングを実行するなら0以外
  2007. zoo_switch_flag:
  2008. .dc.b 0 * -Z:ずうスイッチ指定なら0以外
  2009. emedra_path_set_flag:
  2010. .dc.b 0 * パス名が指定されたら0以外
  2011. ex_map_flag:
  2012. .dc.b 0 * どこでもマップパッチ有無
  2013. ex_scroll_flag:
  2014. .dc.b 0 * 移動高速化パッチ有無
  2015. ex_battle_flag:
  2016. .dc.b 0 * 戦闘高速化パッチ有無
  2017. ex_exp_flag:
  2018. .dc.b 0 * 経験値2倍パッチ有無
  2019. ex_super_flag:
  2020. .dc.b 0 * ほぼ最強装備パッチ有無
  2021. ex_zoo_flag:
  2022. .dc.b 0 * ずう隠しパッチ有無
  2023. tdpause_flag:
  2024. .dc.b 0 * TIMER-D停止が必要なら0以外
  2025. adddrv_use_flag:
  2026. .dc.b 0 * ADDDRVを使ったなら0以外
  2027. **********************************************************************
  2028. * ワーク領域
  2029. **********************************************************************
  2030. .bss
  2031. .even
  2032. himem_pointer:
  2033. .ds.l 1
  2034. start_a0_backup:
  2035. .ds.l 1 * EMEDRA_patch.x 実行直後のa0(メモリ管理ポインタ)
  2036. program_top_address:
  2037. .ds.l 1
  2038. program_exec_address:
  2039. .ds.l 1
  2040. last_patch_address:
  2041. .ds.l 1 * パッチで最後に書き換えた場所
  2042. emedra_exe_exit_code:
  2043. .ds.l 1 * emedra.x のexit値
  2044. iocs6b_vector_backup:
  2045. .ds.l 1 * IOCS _TIMERDST ($05ac.w) のベクタを保存する
  2046. timerd_vector_backup:
  2047. .ds.l 1 * MFP TIMER-D ($0110.w) のベクタを保存する
  2048. key_led_backup:
  2049. .ds.b 1 * ゲーム開始前のキーLED状態を保存
  2050. key_led_new:
  2051. .ds.b 1 * ゲーム開始時のLED状態
  2052. emedra_all_path:
  2053. .ds.b 64+1 * ハードディスクにインストールしたパス
  2054. files_buffer: * DOS _FILES ($ff4e) で使うバッファ 53バイト
  2055. get_pr_buffer: * DOS _GET_PR ($fffa) で使うバッファ 116バイト
  2056. .ds.b 116
  2057. exe_load_path: * プログラムを読み込むパス名
  2058. set_path_buf: * パス名をemedra.xに登録するバッファ
  2059. .ds.b 64+1
  2060. config_file_name: *
  2061. adddrv_file_name: * adddrv実行ファイル名(パス付き) 90バイト
  2062. deldrv_file_name: * deldrv実行ファイル名(パス付き) 90バイト
  2063. file_name_buf:
  2064. .ds.b 128+1
  2065. adddrv_command_line: * adddrv実行時のコマンドライン
  2066. deldrv_command_line: * deldrv実行時のコマンドライン
  2067. .ds.b 256
  2068. *スタック
  2069. .ds.b 2048
  2070. .even
  2071. user_sp:
  2072. .end emedra_patch