|
|
1.1 root 1: ;
2: ; nono
1.1.1.2 root 3: ; Copyright (C) 2020 nono project
1.1 root 4: ;
1.1.1.2 root 5: ; Redistribution and use in source and binary forms, with or without
6: ; modification, are permitted provided that the following conditions
7: ; are met:
8: ; 1. Redistributions of source code must retain the above copyright
9: ; notice, this list of conditions and the following disclaimer.
10: ; 2. Redistributions in binary form must reproduce the above copyright
11: ; notice, this list of conditions and the following disclaimer in the
12: ; documentation and/or other materials provided with the distribution.
13: ;
14: ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15: ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16: ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17: ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18: ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19: ; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20: ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
21: ; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22: ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: ; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: ; SUCH DAMAGE.
1.1 root 25:
26: ; How to compile:
1.1.1.3 ! root 27: ; > has fmovemn.has
! 28: ; > hlk fmovemn.o si_util.o
1.1 root 29:
30: .xref hexstr_long
31: .include doscall.mac
32: .list
33: .cpu 68030
34:
35: PRINT .macro msg
36: pea.l msg(pc)
37: DOS _PRINT
38: addq.l #4,sp
39: .endm
40:
41: SET_FLINE_TRAP .macro
42: move.l (a5),a4
43: lea.l fline_handler(pc),a1
44: move.l a1,(a5)
45: .endm
46:
47: RESTORE_FLINE_TRAP .macro
48: move.l a4,(a5)
49: .endm
50:
51: .text
52: .even
1.1.1.3 ! root 53: start:
! 54: bra start2
! 55:
1.1 root 56: <?php
57: // レジスタ割り当て
58: // d0-d1 work
59: // d6 ダイナミックモードでのレジスタ
60: // d7 1=検査対象命令でFライン例外がおきた
61: // その後は ok を表示するかどうかのカウント
62: // a0-a2 work
63: // a3 検査対象命令の次の位置 (Fライン例外から戻るのに使用)
64: // a4 元のFライン例外ハンドラ置き場
65: // a5 Fライン例外ベクタの位置 $002c
66: ?>
67: <?php
68: // EA が -(An) なら FP-to-EA (fromFP)の方向のみ可能。
69: // EA が (An)+ なら EA-to-FP (toFP) の方向のみ可能。
1.1.1.3 ! root 70: // '.' はこの EA はドキュメントにないので検査しない (easy)。
! 71: // '!' はこの EA は例外が起きることを検査する (hard)。
! 72: $srctable = array(
! 73: // easy hard
! 74: // mode2,1 dam+-rxwpi dam+-rxwpi
! 75: 0/*toFP, pred*/ => ".......... !!m+!rxwp!",
! 76: 1/*toFP, ctrl*/ => "..m+.rxwp. !!m+!rxwp!",
! 77: 2/*fromFP, pred*/ => "....-..... !!m!-rxw!!",
! 78: 3/*fromFP, ctrl*/ => "..m..rxw.. !!m!-rxw!!",
1.1 root 79: );
1.1.1.3 ! root 80: foreach ($srctable as $mode21 => $eastr) {
! 81: list($easy_str, $hard_str) = preg_split('/\s+/', $eastr);
! 82: $easy_ea = preg_split("//", $easy_str, -1, PREG_SPLIT_NO_EMPTY);
! 83: $hard_ea = preg_split("//", $hard_str, -1, PREG_SPLIT_NO_EMPTY);
! 84: for ($mode0 = 0; $mode0 <= 1; $mode0++) {
! 85: $mode = $mode21 * 2 + $mode0;
! 86: // …のはずだが rxwpi の検査は
! 87: // 追加の命令ワード部分を生バイナリで用意しないといけないため
! 88: // ちょっと保留。
! 89: for ($id = 0; $id < 5; $id++) {
! 90: $ee = $easy_ea[$id];
! 91: $eh = $hard_ea[$id];
! 92: $is_easy = ($ee != '.'); // easy でも検査するか?
! 93: if ($eh == "!") {
! 94: // 許されない組み合わせの命令。
! 95: subr_fail($mode, $id, $is_easy);
1.1 root 96: } else {
1.1.1.3 ! root 97: if ($mode < 4) {
! 98: subr_to($mode, $id, $is_easy);
! 99: } else {
! 100: subr_from($mode, $id, $is_easy);
! 101: }
1.1 root 102: }
103: }
104: }
105: }
106: ?>
107: <?php
108: // 1行を出力する。引数は printf のように fmt... で指定可能。
109: // 改行はこちらで付加する。
110: function out()
111: {
112: $args = func_get_args();
113: $fmt = array_shift($args);
114: print vsprintf($fmt, $args);
115: print "\n";
116: }
117:
118: // mode 番号(下2bit)からラベル文字列に。
119: function mode2label($mode)
120: {
1.1.1.3 ! root 121: $rv = "";
1.1 root 122: $rv .= (($mode & 2) == 0) ? "pred" : "ctrl";
123: $rv .= (($mode & 1) == 0) ? "_sta" : "_dyn";
124: return $rv;
125: }
126:
127: // $mode 番号からターゲットレジスタに。
128: // Ctrl/PostInc と PreDec とで転送する順番が違う。
129: // static と dynamic はなんとなく別のマスクを用意しておく。
130: function mode2fplist($mode)
131: {
132: $fplist = array(
133: 0/*pred, static */ => array(6, 5),
134: 1/*pred, dynamic */ => array(5, 4),
135: 2/*ctrl, static */ => array(1, 2),
136: 3/*ctrl, dynamic */ => array(2, 3),
137: );
138: return $fplist[$mode & 3];
139: }
140:
141: // EA 番号から命令ワードに。n はすべて0
142: function eanum2word($id)
143: {
144: switch ($id) {
1.1.1.3 ! root 145: case 0: // d: D0
! 146: return 000;
! 147: case 1: // a: A0
! 148: return 010;
! 149: case 2: // m: (A0)
! 150: return 020;
! 151: case 3: // +: (A0)+
! 152: return 030;
! 153: case 4: // -: -(A0)
! 154: return 040;
! 155: case 5: // r: d16(An)
! 156: return 050;
! 157: case 6: // x: d8(An,IX)
! 158: return 060;
! 159: case 7: // w: Abs
! 160: return 070;
! 161: case 8: // p: (PC,IX)
! 162: return 072;
! 163: case 9: // i: #imm
! 164: return 074;
1.1 root 165: }
166: }
167:
168: // EA 番号をラベル文字列に。
169: function eanum2label($id)
170: {
171: $idstr = array(
172: 0 => "dn",
173: 1 => "an",
174: 2 => "anin",
175: 3 => "anpi",
176: 4 => "anpd",
1.1.1.3 ! root 177: 5 => "anid",
! 178: 6 => "anix",
! 179: 7 => "abs",
! 180: 8 => "pcix",
! 181: 9 => "imm",
1.1 root 182: );
183: return $idstr[$id];
184: }
185:
186: // EA 番号をニーモニックに。
187: function eanum2mnem($id, $n = 0)
188: {
189: switch ($id) {
190: case 0: return "d{$n}";
191: case 1: return "a{$n}";
192: case 2: return "(a{$n})";
193: case 3: return "(a{$n})+";
194: case 4: return "-(a{$n})";
1.1.1.3 ! root 195: case 5: return "d16(a{$n})";
! 196: case 6: return "d8(a{$n},ix)";
! 197: case 7: return "abs";
! 198: case 8: return "(pc,ix)";
! 199: case 9: return "#imm";
1.1 root 200: }
1.1.1.3 ! root 201: return "";
1.1 root 202: }
203:
1.1.1.3 ! root 204: function addfunc($name, $mode, $cpureg, $is_easy)
1.1 root 205: {
206: global $funclist;
1.1.1.3 ! root 207: global $easylist;
! 208:
! 209: $text = "fmovem.l ";
! 210: switch ($mode) {
! 211: case 0:
! 212: case 2:
! 213: $text .= "{$cpureg},fplist";
! 214: break;
! 215: case 1:
! 216: case 3:
! 217: $text .= "{$cpureg},d6";
! 218: break;
! 219: case 4:
! 220: case 6:
! 221: $text .= "fplist,{$cpureg}";
! 222: break;
! 223: case 5:
! 224: case 7:
! 225: $text .= "d6,{$cpureg}";
! 226: break;
! 227: case "nofpn":
! 228: $text .= "nofpn,{$cpureg}";
! 229: break;
! 230: case "illegal":
! 231: // ニーモニックでは伝わらない…
! 232: $text .= "{$cpureg},d6_illegal";
! 233: break;
! 234: }
1.1 root 235:
1.1.1.3 ! root 236: $funclist[$name] = $text;
! 237: if ($is_easy) {
! 238: $easylist[$name] = true;
! 239: }
1.1 root 240: out("test_{$name}:");
241: out(" PRINT msg_{$name}");
242: }
243:
244: // 結果表示のサブルーチンコールを出力
245: function out_result($msg, $exp, $act)
246: {
247: out(" pea.l {$msg}(pc)");
248: out(" move.l {$exp},-(sp)");
249: out(" move.l {$act},-(sp)");
250: out(" bsr result");
251: out(" lea.l 12(sp),sp");
252: }
253:
254: // 許されない組み合わせのテスト。
255: // Fライン例外が起きることをチェックする。
1.1.1.3 ! root 256: function subr_fail($mode, $id, $is_easy)
1.1 root 257: {
258: $modestr = mode2label($mode);
259: $ealabel = eanum2label($id);
1.1.1.3 ! root 260: $cpureg = eanum2mnem($id);
1.1 root 261:
262: $funcname = ($mode & 4) == 0
263: ? "fmovem_{$ealabel}_to_fpn_{$modestr}"
264: : "fmovem_fpn_to_{$ealabel}_{$modestr}";
1.1.1.3 ! root 265: addfunc($funcname, $mode, $cpureg, $is_easy);
1.1 root 266:
267: $w1 = 0xf200 | eanum2word($id);
268: $w2 = 0xc060 | ($mode << 11);
269:
270: out(" SET_FLINE_TRAP");
271: out(" moveq.l #0,d7");
272: out(" lea.l @f,a3");
273: // アセンブルできない可能性があるので命令はバイナリを出力。
274: out(" .dc.w $%04x, $%04x", $w1, $w2);
275: out("@@:");
276: out(" RESTORE_FLINE_TRAP");
277:
278: // 例外が起きるはずなので D7 が非ゼロなら成功(次へ)
279: out(" tst.l d7");
280: out(" bne @f");
281: out(" PRINT msg_fail_notrap");
282: out(" rts");
283: out("@@:");
284: out(" PRINT msg_oktrap");
285: out(" rts");
286: out("");
287: }
288:
289: // 実行できる組み合わせなら動作確認。EA to FPn
1.1.1.3 ! root 290: function subr_to($mode, $id, $is_easy)
1.1 root 291: {
292: $modestr = mode2label($mode);
293: $ealabel = eanum2label($id);
1.1.1.3 ! root 294: $cpureg = eanum2mnem($id);
1.1 root 295:
296: $funcname = "fmovem_{$ealabel}_to_fpn_{$modestr}";
1.1.1.3 ! root 297: addfunc($funcname, $mode, $cpureg, $is_easy);
1.1 root 298:
299: $w1 = 0xf200 | eanum2word($id);
300: $w2 = 0xc060 | ($mode << 11);
301: $predec = ($mode & 2) == 0;
302: $dynamic = $mode & 1;
303:
304: // FPn を初期化
305: out(" lea.l initdata(pc),a0");
306: for ($i = 0; $i < 8; $i++) {
307: out(" fmove.x (a0)+,fp{$i}");
308: }
309:
310: // 読み込み元メモリを用意。EA to FPn 側に -(An) は存在しない。
311: out(" lea.l srcdata(pc),a0");
312: if ($dynamic) {
313: // ダイナミックモードでの転送マスクもあえて違うものにしておく
314: out(" moveq.l #$30,d6");
315: }
316:
317: // 検査
318: out(" SET_FLINE_TRAP");
319: out(" moveq.l #0,d7");
320: out(" lea.l @f,a3");
321: // アセンブルできない可能性があるので命令はバイナリを出力。
322: out(" .dc.w $%04x, $%04x", $w1, $w2);
323: out("@@:");
324: out(" RESTORE_FLINE_TRAP");
325:
326: // 例外は起きないはずなので D7 がゼロなら成功(次へ)
327: out(" tst.l d7");
328: out(" beq @f");
329: out(" PRINT msg_fail_trap");
330: out(" rts");
331: out("@@:");
332:
333: // An を調べる。An はソース
334: out(" lea.l srcdata+%d(pc),a1", ($id == 3)/*(An)+*/ ? 24 : 0);
335: out(" cmp.l a1,a0");
336: out(" beq @f");
337: out(" pea.l msg_fail_addr(pc)");
338: out(" move.l a1,-(sp)");
339: out(" move.l a0,-(sp)");
340: out(" bsr result");
341: out(" lea.l 12(sp),sp");
342: out("@@:");
343:
344: // FPn を取り出してきて比較。
345: // f1 なら srcdata[0] と、f2 なら srcdata[1] と。
346: // それ以外は initdata[n] と比較する。
347: list ($f1, $f2) = mode2fplist($mode);
348:
349: out(" lea.l workarea(pc),a2");
350: for ($i = 0; $i < 8; $i++) {
351: out(" ; compare FP${i}");
352: out(" pea.l msg_fail_fp{$i}(pc)");
353: // 比較先は都度違う
354: if ($i == $f1) {
355: out(" pea.l srcdata+0(pc)");
356: } else if ($i == $f2) {
357: out(" pea.l srcdata+12(pc)");
358: } else {
359: out(" pea.l (initdata+%d*12)(pc)", $i);
360: }
361: out(" fmove.x fp{$i},(a2)");
362: out(" pea.l (a2)");
363: out(" bsr check_ext");
364: out(" lea.l 12(sp),sp");
365: }
366: out(" tst.l d7");
367: out(" bne @f");
368: out(" PRINT msg_ok");
369: out("@@:");
370: out(" rts");
371: out("");
372: }
373:
374: // 実行できる組み合わせなら動作確認。FPn to EA
1.1.1.3 ! root 375: function subr_from($mode, $id, $is_easy)
1.1 root 376: {
377: $modestr = mode2label($mode);
378: $ealabel = eanum2label($id);
1.1.1.3 ! root 379: $cpureg = eanum2mnem($id);
1.1 root 380:
381: $funcname = "fmovem_fpn_to_{$ealabel}_{$modestr}";
1.1.1.3 ! root 382: addfunc($funcname, $mode, $cpureg, $is_easy);
1.1 root 383:
384: $w1 = 0xf200 | eanum2word($id);
385: $w2 = 0xc060 | ($mode << 11);
386: $predec = ($mode & 2) == 0;
387: $dynamic = $mode & 1;
388:
389: // FPn を初期化
390: out(" lea.l initdata(pc),a0");
391: for ($i = 0; $i < 8; $i++) {
392: out(" fmove.x (a0)+,fp{$i}");
393: }
394: list ($f1, $f2) = mode2fplist($mode);
395:
396: // 書き込み先バッファも初期化
397: out(" moveq.l #0,d0");
398: out(" moveq.l #0,d1");
399: out(" moveq.l #0,d7");
400: out(" lea.l workarea(pc),a0");
401: out(" movem.l d0-d1/d7,(a0)");
402: out(" movem.l d0-d1/d7,12(a0)");
403: switch ($id) {
404: case 2: // (An)
405: break;
406: case 4: // -(An)
407: out(" lea.l workarea+24(pc),a0");
408: break;
409: }
410: if ($dynamic) {
411: // ダイナミックモードでの転送マスクもあえて違うものにしておく
412: out(" moveq.l #$30,d6");
413: }
414:
415: // 検査
416: out(" SET_FLINE_TRAP");
417: out(" lea.l @f,a3");
418: // アセンブルできない可能性があるので命令はバイナリを出力。
419: out(" .dc.w $%04x, $%04x", $w1, $w2);
420: out("@@:");
421: out(" RESTORE_FLINE_TRAP");
422:
423: // 例外は起きないはずなので D7 がゼロなら成功(次へ)
424: out(" tst.l d7");
425: out(" beq @f");
426: out(" PRINT msg_fail_trap");
427: out(" rts");
428: out("@@:");
429:
430: // An を調べる。An は dest。FPn to EA 側に (An)+ は存在しない
431: out(" lea.l workarea(pc),a1");
432: out(" cmp.l a1,a0");
433: out(" beq @f");
434: out(" pea.l msg_fail_addr(pc)");
435: out(" move.l a1,-(sp)");
436: out(" move.l a0,-(sp)");
437: out(" bsr result");
438: out(" lea.l 12(sp),sp");
439: out("@@:");
440:
441: // workarea に書き込まれているのを srcdata と比較
442: // workarea の若いアドレスから順に比較するが、
443: // FMOVEM fpnlist,-(An) の時 (predec の時ではなく id==4 の時) は
444: // 転送順にメモリを下っていくので、比較も下りながら行わないといけない。
445: $work = ($id == 4) ? 12 : 0;
446: out(" ; compare first one");
447: out(" pea.l msg_fail_1st(pc)");
448: out(" pea.l (initdata+%d*12)(pc)", $f1);
449: out(" pea.l %d(a1)", $work);
450: out(" bsr check_ext");
451: out(" lea.l 12(sp),sp");
452: if ($id == 4)
453: $work -= 12;
454: else
455: $work += 12;
456: out(" ; compare second one");
457: out(" pea.l msg_fail_2nd(pc)");
458: out(" pea.l (initdata+%d*12)(pc)", $f2);
459: out(" pea.l %d(a1)", $work);
460: out(" bsr check_ext");
461: out(" lea.l 12(sp),sp");
462: out("");
463: out(" tst.l d7");
464: out(" bne @f");
465: out(" PRINT msg_ok");
466: out("@@:");
467: out(" rts");
468: out("");
469: }
470: ?>
471: <?php
472: // 空リストは正しく0個転送という扱いになる。
473: // たぶん dynamic でも同様だろうけどもうテストしない。
1.1.1.3 ! root 474: addfunc("fmovem_nofpn", "nofpn", "(a0)", false); ?>
1.1 root 475: lea.l initdata(pc),a0
476: <?php
477: for ($i = 0; $i < 8; $i++) {
478: out(" fmove.x (a0)+,fp{$i}");
479: }
480: ?>
481: SET_FLINE_TRAP
482: moveq.l #0,d7
483: lea.l workarea(pc),a0
484: move.l d7,(a0)
485: move.l d7,4(a0)
486: move.l d7,8(a0)
487: lea.l @f,a3
488: .dc.w $f210, $f000 ; fmovem nofpn,(a0)
489: @@:
490: RESTORE_FLINE_TRAP
491: tst.l d7
492: beq @f
493: PRINT msg_fail_trap
494: rts
495: @@:
496: pea.l msg_fail_1st(pc)
497: pea.l zerodata(pc)
498: pea.l (a0)
499: bsr check_ext
500: lea.l 12(sp),sp
501:
502: tst.l d7
503: bne @f
504: PRINT msg_ok
505: @@:
506: rts
507:
508: <?php
509: // dynamic のレジスタ指定 0rrr_0000 の %0 のところに何か書かれてても無視。
1.1.1.3 ! root 510: addfunc("fmovem_illegal_dyn", "illegal", "(a0)", false); ?>
1.1 root 511: lea.l initdata(pc),a0
512: <?php
513: for ($i = 0; $i < 8; $i++) {
514: out(" fmove.x (a0)+,fp{$i}");
515: }
516: ?>
517: SET_FLINE_TRAP
518: lea.l srcdata(pc),a0
519: moveq.l #$80,d6
520: moveq.l #0,d7
521: lea.l @f,a3
522: .dc.w $f210, $d86f ; fmovem (a0),d6
523: @@:
524: RESTORE_FLINE_TRAP
525:
526: tst.l d7
527: beq @f
528: PRINT msg_fail_trap
529: rts
530: @@:
531: lea.l workarea(pc),a0
532: fmovem.x fp0,(a0)
533: pea.l msg_fail_fp0(pc)
534: pea.l srcdata(pc)
535: pea.l (a0)
536: bsr check_ext
537: lea.l 12(sp),sp
538:
539: tst.l d7
540: bne @f
541: PRINT msg_ok
542: @@:
543: rts
544:
545: <?php
546: // lea.l $0000002c.l,a5 だと has.x に絶対アドレッシングだと
547: // 怒られてしまうため仕方なく
548: ?>
1.1.1.3 ! root 549: start2:
1.1 root 550: clr.l -(sp)
551: DOS _SUPER
552: movem.l d6-d7/a2-a5,-(sp)
553: moveq.l #$2c,d0 ; alternate of "lea.l $2c,a5"
554: move.l d0,a5 ;
1.1.1.3 ! root 555: moveq.l #0,d0
! 556: fmove.l d0,fpcr ; Init FPCR, especially round mode and round prec.
! 557:
! 558: ; rough argument check
! 559: ;moveq.l #0,d0 ; d0 is already cleared.
! 560: cmpi.b #4,(a2)+ ; strlen(arg)<4 ?
! 561: bcs @f
! 562: cmpi.l #$68617264,(a2) ; "hard"
! 563: seq.b d0
! 564: @@:
! 565: tst.b d0
! 566: bne hardmode
! 567: easymode:
! 568: PRINT msg_easy
! 569: <?php
! 570: foreach ($easylist as $name => $dummy) {
! 571: out(" bsr test_{$name}");
! 572: }
! 573: ?>
! 574: bra done
! 575:
! 576: hardmode:
! 577: PRINT msg_hard
1.1 root 578: <?php
1.1.1.3 ! root 579: foreach ($funclist as $name => $text) {
1.1 root 580: out(" bsr test_{$name}");
581: }
582: ?>
1.1.1.3 ! root 583:
! 584: done:
1.1 root 585: movem.l (sp)+,d6-d7/a2-a5
586: DOS _EXIT
587:
588: ; 結果表示
589: ; スタックには、メッセージ、期待値、実際の値の順で積む。
590: result:
591: link a6,#0
592: movem.l d0/a0,-(sp)
593:
594: move.l 8+8(a6),-(sp)
595: DOS _PRINT
596: addq.l #4,sp
597:
598: move.l 8+4(a6),d0
599: lea.l buf(pc),a0
600: bsr hexstr_long
601: PRINT buf
602: PRINT msg_but
603:
604: move.l 8+0(a6),d0
605: lea.l buf(pc),a0
606: bsr hexstr_long
607: PRINT buf
608: PRINT msg_crlf
609:
610: addq.l #1,d7 ; errcnt
611: movem.l (sp)+,d0/a0
612: unlk a6
613: rts
614:
615: ; 拡張精度の比較と結果表示。
616: ; 一致したら何もせず帰る。一致しなければエラーメッセージを表示。
617: ; スタックには、(エラー時の)メッセージ、期待値、実際の値の順で積む
618: check_ext:
619: link a6,#0
620: movem.l d0/a0-a2,-(sp)
621:
622: move.l 8+4(a6),a1
623: move.l 8+0(a6),a2
624: cmpm.l (a1)+,(a2)+
625: bne @f
626: cmpm.l (a1)+,(a2)+
627: bne @f
628: cmpm.l (a1)+,(a2)+
629: bne @f
630: ; equal
631: bra check_ext_done
632:
633: @@: ; not equal
634: move.l 8+8(a6),-(sp)
635: DOS _PRINT
636: addq.l #4,sp
637:
638: lea.l buf(pc),a0
639: move.l 8+4(a6),a1
640: move.l (a1)+,d0
641: bsr hexstr_long
642: move.b #'_',(a0)+
643: move.l (a1)+,d0
644: bsr hexstr_long
645: move.b #'_',(a0)+
646: move.l (a1),d0
647: bsr hexstr_long
648: PRINT buf
649: PRINT msg_but
650:
651: lea.l buf(pc),a0
652: move.l 8+0(a6),a2
653: move.l (a2)+,d0
654: bsr hexstr_long
655: move.b #'_',(a0)+
656: move.l (a2)+,d0
657: bsr hexstr_long
658: move.b #'_',(a0)+
659: move.l (a2),d0
660: bsr hexstr_long
661: PRINT buf
662: PRINT msg_crlf
663:
664: addq.l #1,d7 ; errcnt
665: check_ext_done:
666: movem.l (sp)+,d0/a0-a2
667: unlk a6
668: rts
669:
670: ; Fライン例外ハンドラ
671: ; a3 に戻りアドレスをセットしてあること
672: ; d7 を 1 にして帰る
673: fline_handler:
674: moveq.l #1,d7
675: move.l a3,2(sp)
676: rte
677:
678: ; FPn を埋める初期値
679: initdata:
680: .dc.l $0, $0, $8
681: .dc.l $0, $0, $1
682: .dc.l $0, $0, $2
683: .dc.l $0, $0, $3
684: .dc.l $0, $0, $4
685: .dc.l $0, $0, $5
686: .dc.l $0, $0, $6
687: .dc.l $0, $0, $7
688:
689: ; ターゲットの FPn に転送するデータ
690: srcdata:
691: .dc.l $3fff0000, $88112233, $44556677
692: .dc.l $dfff0000, $8899aabb, $ccddeeff
693:
694: zerodata:
695: .dc.l $0, $0, $0
696:
1.1.1.3 ! root 697: msg_hard: .dc.b "hard mode",$d,$a,0
! 698: msg_easy: .dc.b "easy mode",$d,$a,0
1.1 root 699: msg_oktrap: .dc.b $9,"ok(trap)",$d,$a,0, 0,0
700: msg_fail_notrap: .dc.b $9,"FAIL: trap expected but not occured",$d,$a,0
701: msg_fail_trap: .dc.b $9,"FAIL: unexpected trap occured",$d,$a,0
702:
703: msg_ok: .dc.b $9,"ok",$d,$a,0
704: msg_fail_fp0: .dc.b $9,"FAIL: fp0 expects ",0
705: msg_fail_fp1: .dc.b $9,"FAIL: fp1 expects ",0
706: msg_fail_fp2: .dc.b $9,"FAIL: fp2 expects ",0
707: msg_fail_fp3: .dc.b $9,"FAIL: fp3 expects ",0
708: msg_fail_fp4: .dc.b $9,"FAIL: fp4 expects ",0
709: msg_fail_fp5: .dc.b $9,"FAIL: fp5 expects ",0
710: msg_fail_fp6: .dc.b $9,"FAIL: fp6 expects ",0
711: msg_fail_fp7: .dc.b $9,"FAIL: fp7 expects ",0
712: msg_fail_1st: .dc.b $9,"FAIL: 1st expects ",0
713: msg_fail_2nd: .dc.b $9,"FAIL: 2nd expects ",0
714: msg_fail_addr: .dc.b $9,"FAIL: an expects ",0
715: msg_but: .dc.b " but ",0
716: msg_crlf: .dc.b $d,$a,0
717:
718: <?php
1.1.1.3 ! root 719: foreach ($funclist as $name => $text) {
! 720: out("msg_{$name}: .dc.b \"{$text}\",0");
1.1 root 721: }
722: ?>
723:
724: .data
725: .even
726: workarea: .ds.b 24
1.1.1.3 ! root 727: buf: .ds.b 64
1.1 root 728:
729: .end start
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.