見出し画像

Jonathan カードの解析(2) ROM

ROM の中身を調べます。2764 UV EPROM が二つ載っています。
$000000-$000C5F までが使われているようです。
$000C60-$003FFF は $FF になっています。

$000000-$0003FF は、68000 の例外ベクタです。

000000: 0007FFF0        D000000:DC.L    $0007FFF0       ;stack pointer
000004: 00000400                DC.L    INIT            ;init
000008: 00000924                DC.L    BUSERR          ;BUS error
00000C: 0000092A                DC.L    ADDRERR         ;Address error
000010: 00000930                DC.L    ILLEGAL         ;Illegal instruction
000014: 00000922                DC.L    NONE            ;Zero devied
000018: 00000922                DC.L    NONE            ;CHK instruction
00001C: 00000922                DC.L    NONE            ;TRAPV Instruction
000020: 00000936                DC.L    VIOLATE         ;Privilege violation
000024: 00000922                DC.L    NONE            ;Trace
000028: 00000922                DC.L    NONE            ;Line 1010 Emulator
00002C: 00000922                DC.L    NONE            ;Line 1111 Emulator
000030: 00000922                DC.L    NONE            ;(Unassigned, Reserved)
000034: 00000922                DC.L    NONE
000038: 00000922                DC.L    NONE
00003C: 0000093C                DC.L    UNINIT          ;Uninitalized Interrupt
00003C: 0000093C                DC.L    UNINIT          ;Uninitalized Interrupt
000040: 00000922                DC.L    NONE
000044: 00000922                DC.L    NONE
000048: 00000922                DC.L    NONE
00004C: 00000922                DC.L    NONE
000050: 00000922                DC.L    NONE
000054: 00000922                DC.L    NONE
000058: 00000922                DC.L    NONE
00005C: 00000922                DC.L    NONE
000060: 00000944                DC.L    SPRIOUS         ;Spurious Interrupt
000064: 00000922                DC.L    NONE            ;Level 1 interrupt
000068: 00000922                DC.L    NONE            ;Level 2 interrupt
00006C: 00000922                DC.L    NONE            ;Level 3 interrupt
000070: 00000922                DC.L    NONE            ;Level 4 interrupt
000074: 00000922                DC.L    NONE            ;Level 5 interrupt
000078: 00000922                DC.L    NONE            ;Level 6 interrupt
00007C: 00000922                DC.L    NONE            ;Level 7 interrupt
000080: 00000922                DC.L    NONE            ;Trap 0
000084: 00000922                DC.L    NONE            ;Trap 1
000088: 00000922                DC.L    NONE            ;Trap 2
00008C: 00000922                DC.L    NONE            ;Trap 3
000090: 00000922                DC.L    NONE            ;Trap 4
000094: 00000922                DC.L    NONE            ;Trap 5
000098: 00000922                DC.L    NONE            ;Trap 6
00009C: 00000922                DC.L    NONE            ;Trap 7
0000A0: 00000922                DC.L    NONE            ;Trap 8
0000A4: 00000922                DC.L    NONE            ;Trap 9
0000A8: 00000922                DC.L    NONE            ;Trap 10
0000AC: 00000922                DC.L    NONE            ;Trap 11
0000B0: 00000922                DC.L    NONE            ;Trap 12
0000B4: 00000922                DC.L    NONE            ;Trap 13
0000B8: 00000922                DC.L    NONE            ;Trap 14
0000BC: 00000922                DC.L    NONE            ;Trap 15
0000C0: 00000922                DC.L    NONE
0000C4: 00000922                DC.L    NONE
0000C8: 00000922                DC.L    NONE
0000CC: 00000922                DC.L    NONE
0000D0: 00000922                DC.L    NONE
0000D4: 00000922                DC.L    NONE
0000D8: 00000922                DC.L    NONE
0000DC: 00000922                DC.L    NONE
0000E0: 00000922                DC.L    NONE
0000E4: 00000922                DC.L    NONE
0000E8: 00000922                DC.L    NONE
0000EC: 00000922                DC.L    NONE
0000F0: 00000922                DC.L    NONE
0000F4: 00000922                DC.L    NONE
0000F8: 00000922                DC.L    NONE
0000FC: 00000922                DC.L    NONE
000100: 00000922                DC.L    NONE
000104: 00000922                DC.L    NONE
000108: 00000922                DC.L    NONE
00010C: 00000922                DC.L    NONE
000110: 00000922                DC.L    NONE
000114: 00000922                DC.L    NONE
000118: 00000922                DC.L    NONE
00011C: 00000922                DC.L    NONE
000120: 00000922                DC.L    NONE
000124: 00000922                DC.L    NONE
000128: 00000922                DC.L    NONE
00012C: 00000922                DC.L    NONE
000130: 00000922                DC.L    NONE
000134: 00000922                DC.L    NONE
000138: 00000922                DC.L    NONE
00013C: 00000922                DC.L    NONE
000140: 00000922                DC.L    NONE
000144: 00000922                DC.L    NONE
000148: 00000922                DC.L    NONE
00014C: 00000922                DC.L    NONE
000150: 00000922                DC.L    NONE
000154: 00000922                DC.L    NONE
000158: 00000922                DC.L    NONE
00015C: 00000922                DC.L    NONE
000160: 00000922                DC.L    NONE
000164: 00000922                DC.L    NONE
000168: 00000922                DC.L    NONE
00016C: 00000922                DC.L    NONE
000170: 00000922                DC.L    NONE
000174: 00000922                DC.L    NONE
000178: 00000922                DC.L    NONE
00017C: 00000922                DC.L    NONE
000180: 00000922                DC.L    NONE
000184: 00000922                DC.L    NONE
000188: 00000922                DC.L    NONE
00018C: 00000922                DC.L    NONE
000190: 00000922                DC.L    NONE
000194: 00000922                DC.L    NONE
000198: 00000922                DC.L    NONE
00019C: 00000922                DC.L    NONE
0001A0: 00000922                DC.L    NONE
0001A4: 00000922                DC.L    NONE
0001A8: 00000922                DC.L    NONE
0001AC: 00000922                DC.L    NONE
0001B0: 00000922                DC.L    NONE
0001B4: 00000922                DC.L    NONE
0001B8: 00000922                DC.L    NONE
0001BC: 00000922                DC.L    NONE
0001C0: 00000922                DC.L    NONE
0001C4: 00000922                DC.L    NONE
0001C8: 00000922                DC.L    NONE
0001CC: 00000922                DC.L    NONE
0001D0: 00000922                DC.L    NONE
0001D4: 00000922                DC.L    NONE
0001D8: 00000922                DC.L    NONE
0001DC: 00000922                DC.L    NONE
0001E0: 00000922                DC.L    NONE
0001E4: 00000922                DC.L    NONE
0001E8: 00000922                DC.L    NONE
0001EC: 00000922                DC.L    NONE
0001F0: 00000922                DC.L    NONE
0001F4: 00000922                DC.L    NONE
0001F8: 00000922                DC.L    NONE
0001FC: 00000922                DC.L    NONE
000200: 00000922                DC.L    NONE
000204: 00000922                DC.L    NONE
000208: 00000922                DC.L    NONE
00020C: 00000922                DC.L    NONE
000210: 00000922                DC.L    NONE
000214: 00000922                DC.L    NONE
000218: 00000922                DC.L    NONE
00021C: 00000922                DC.L    NONE
000220: 00000922                DC.L    NONE
000224: 00000922                DC.L    NONE
000228: 00000922                DC.L    NONE
00022C: 00000922                DC.L    NONE
000230: 00000922                DC.L    NONE
000234: 00000922                DC.L    NONE
000238: 00000922                DC.L    NONE
00023C: 00000922                DC.L    NONE
000240: 00000922                DC.L    NONE
000244: 00000922                DC.L    NONE
000248: 00000922                DC.L    NONE
00024C: 00000922                DC.L    NONE
000250: 00000922                DC.L    NONE
000254: 00000922                DC.L    NONE
000258: 00000922                DC.L    NONE
00025C: 00000922                DC.L    NONE
000260: 00000922                DC.L    NONE
000264: 00000922                DC.L    NONE
000268: 00000922                DC.L    NONE
00026C: 00000922                DC.L    NONE
000270: 00000922                DC.L    NONE
000274: 00000922                DC.L    NONE
000278: 00000922                DC.L    NONE
00027C: 00000922                DC.L    NONE
000280: 00000922                DC.L    NONE
000284: 00000922                DC.L    NONE
000288: 00000922                DC.L    NONE
00028C: 00000922                DC.L    NONE
000290: 00000922                DC.L    NONE
000294: 00000922                DC.L    NONE
000298: 00000922                DC.L    NONE
00029C: 00000922                DC.L    NONE
0002A0: 00000922                DC.L    NONE
0002A4: 00000922                DC.L    NONE
0002A8: 00000922                DC.L    NONE
0002AC: 00000922                DC.L    NONE
0002A0: 00000922                DC.L    NONE
0002A4: 00000922                DC.L    NONE
0002A8: 00000922                DC.L    NONE
0002AC: 00000922                DC.L    NONE
0002B0: 00000922                DC.L    NONE
0002B4: 00000922                DC.L    NONE
0002B8: 00000922                DC.L    NONE
0002BC: 00000922                DC.L    NONE
0002C0: 00000922                DC.L    NONE
0002C4: 00000922                DC.L    NONE
0002C8: 00000922                DC.L    NONE
0002CC: 00000922                DC.L    NONE
0002D0: 00000922                DC.L    NONE
0002D4: 00000922                DC.L    NONE
0002D8: 00000922                DC.L    NONE
0002DC: 00000922                DC.L    NONE
0002E0: 00000922                DC.L    NONE
0002E4: 00000922                DC.L    NONE
0002E8: 00000922                DC.L    NONE
0002EC: 00000922                DC.L    NONE
0002F0: 00000922                DC.L    NONE
0002F4: 00000922                DC.L    NONE
0002F8: 00000922                DC.L    NONE
0002FC: 00000922                DC.L    NONE
000300: 00000922                DC.L    NONE
000304: 00000922                DC.L    NONE
000308: 00000922                DC.L    NONE
00030C: 00000922                DC.L    NONE
000310: 00000922                DC.L    NONE
000314: 00000922                DC.L    NONE
000318: 00000922                DC.L    NONE
00031C: 00000922                DC.L    NONE
000320: 00000922                DC.L    NONE
000324: 00000922                DC.L    NONE
000328: 00000922                DC.L    NONE
00032C: 00000922                DC.L    NONE
000330: 00000922                DC.L    NONE
000334: 00000922                DC.L    NONE
000338: 00000922                DC.L    NONE
00033C: 00000922                DC.L    NONE
000340: 00000922                DC.L    NONE
000344: 00000922                DC.L    NONE
000348: 00000922                DC.L    NONE
00034C: 00000922                DC.L    NONE
000350: 00000922                DC.L    NONE
000354: 00000922                DC.L    NONE
000358: 00000922                DC.L    NONE
00035C: 00000922                DC.L    NONE
000360: 00000922                DC.L    NONE
000364: 00000922                DC.L    NONE
000368: 00000922                DC.L    NONE
00036C: 00000922                DC.L    NONE
000370: 00000922                DC.L    NONE
000374: 00000922                DC.L    NONE
000378: 00000922                DC.L    NONE
00037C: 00000922                DC.L    NONE
000380: 00000922                DC.L    NONE
000384: 00000922                DC.L    NONE
000388: 00000922                DC.L    NONE
00038C: 00000922                DC.L    NONE
000390: 00000922                DC.L    NONE
000394: 00000922                DC.L    NONE
000398: 00000922                DC.L    NONE
00039C: 00000922                DC.L    NONE
0003A0: 00000922                DC.L    NONE
0003A4: 00000922                DC.L    NONE
0003A8: 00000922                DC.L    NONE
0003AC: 00000922                DC.L    NONE
0003B0: 00000922                DC.L    NONE
0003B4: 00000922                DC.L    NONE
0003B8: 00000922                DC.L    NONE
0003BC: 00000922                DC.L    NONE
0003C0: 00000922                DC.L    NONE
0003C4: 00000922                DC.L    NONE
0003C8: 00000922                DC.L    NONE
0003CC: 00000922                DC.L    NONE
0003D0: 00000922                DC.L    NONE
0003D4: 00000922                DC.L    NONE
0003D8: 00000922                DC.L    NONE
0003DC: 00000922                DC.L    NONE
0003E0: 00000922                DC.L    NONE
0003E4: 00000922                DC.L    NONE
0003E8: 00000922                DC.L    NONE
0003EC: 00000922                DC.L    NONE
0003F0: 00000922                DC.L    NONE
0003F4: 00000922                DC.L    NONE
0003F8: 00000922                DC.L    NONE
0003FC: 00000922                DC.L    NONE
000922:	4E73		    NONE:	RTE
000924: 41FA022F        BUSERR: LEA     MBUSERR(PC),A0
000928: 6022                    BRA.S   RESTART

00092A: 41FA0244        ADDRERR:LEA     MADDERR(PC),A0
00092E: 601C                    BRA.S   RESTART

000930: 41FA025E        ILLEGAL:LEA     MILLEGA(PC),A0
000934: 6016                    BRA.S   RESTART

000936: 41FA0284        VIOLATE:LEA     MVIOLAT(PC),A0
00093A: 6010                    BRA.S   RESTART

00093C: 41FA02A9        UNINIT: LEA     MUNINIT(PC),A0
000940: 6000000A                BRA.W   RESTART

000944: 41FA02D8        SPRIOUS:LEA     MSPURIO(PC),A0
000948: 60000002                BRA.W   RESTART

00094C: 46FC2700        RESTART:MOVE    #$2700,SR
000950: 4FF90007FFFE            LEA     $07FFFE.L,A7
000956: 61A2                    BSR.S   PUTMSG
000958: 6000FCCE                BRA.W   LOADERR

$00400 から初期化ルーチンが始まります。
$FF1F03 の値が 0 でなければ、RAM テストを行います。
$FFxxxx は Apple II のメモリ領域が割り当てられているようです。
$010000-$07FFFF まで、テストパターンを書き込み、同じ値が読めるかテストています。カード上には、256K DRAM が 4 スロット分用意されていますが、512 KB しかテストしていません。

000400: 46FC2700        INIT:   MOVE    #$2700,SR       ;init, check RAM
000404: 4A3900FF1F03            TST.B   $FF1F03.L       ;RAM test flag?
00040A: 673A                    BEQ.S   CONFIG          ;Goto configure part
00040C: 41F900010000            LEA     $010000.L,A0    ;A0 = Start of RAM
000412: 43F90007FFFE            LEA     $07FFFE.L,A1    ;A1 = End of RAM
000418: 303C0001                MOVE.W  #$0001,D0       ;RAM check pattern
00041C: 30C0            MTEST0: MOVE.W  D0,(A0)+        ;Write for RAM check
00041E: E258                    ROR.W   #1,D0           ;Change check pattern
000420: B3C8                    CMPA.L  A0,A1           ;End of RAM?
000422: 66F8                    BNE.S   MTEST0          ;Continue next address
000424: 303C0001                MOVE.W  #$0001,D0       ;Reset check pattern
000428: 41F900010000            LEA     $010000.L,A0    ;Reset Start address
00042E: B058            MTEST1: CMP.W   (A0)+,D0        ;Compare
000430: 66000010                BNE.W   RAMERR          ;If different, error
000434: E258                    ROR.W   #1,D0           ;Change check pattern
000436: B3C8                    CMPA.L  A0,A1           ;End of RAM?
000438: 66F4                    BNE.S   MTEST1          ;Continue next address
00043A: 41FA05D8                LEA     MRAMOK(PC),A0   ;A0 = OK message
00043E: 60000006                BRA.W   CONFIG          ;Goto configure part
000442: 41FA05E6        RAMERR: LEA     MRAMNG(PC),A0   ;A0 = Error message

$00466 から、各種パラメータを設定しています。
$FF1F00 から、Jonathan カードの拡張スロットアドレスの下位バイト ($n0) を読み出し、カードのアドレス ($FFC0n0) を $010000 に設定します。
起動ドライブ番号 (1) を $FF0005 に設定し、ドライブの拡張スロット番号 x $10 を $FF1F10 から読み出し、$FF0006 に設定します。
Apple II のソフトスイッチを使い 80 桁モードに設定します。
画面をクリアし、起動メッセージを表示します。

000446: 2E3C00FFC000    CONFIG: MOVE.L  #$FFC000,D7     ;Apple II I/O address
00044C: 1E3900FF1F00            MOVE.B  $FF1F00.L,D7    ;Jonathan Card Slot I/O
000452: 23C700010000            MOVE.L  D7,$010000.L
000458: 7E00                    MOVEQ   #$00,D7
00045A: 13C700FF0005            MOVE.B  D7,$FF0005.L
000460: 523900FF0005            ADDQ.B  #1,$FF0005.L    ;Set boot drive = 1
000466: 45F900FF1F10            LEA     $FF1F10.L,A2    ;Boot drive slot x $10
00046C: 13F2700000FF...         MOVE.B  $00(A2,D7.W),$FF0006.L;Set drive slot
000474: 423900FFC00D            CLR.B   $FFC00D.L       ;SET80VID
00047A: 423900FFC001            CLR.B   $FFC001.L       ;80STOREON
000480: 423900FFC010            CLR.B   $FFC010.L       ;KBDSTRB
000486: 13FC00800001...         MOVE.B  #$80,$01000C.L  ;Set hi-bit mask
00048E: 6100043C                BSR.W   MAIN
000492: 610002C4                BSR.W   CLRSCRN
000496: 610002F0                BSR.W   HOME
00049A: 4A3900FF1F03            TST.B   $FF1F03.L       ;RAM test flag
0004A0: 6704                    BEQ.S   INITMSG
0004A2: 61000456                BSR.W   PUTMSG          ;if set, print msg
0004A6: 41FA05BF        INITMSG:LEA     MINIT(PC),A0
0004AA: 6100044E                BSR.W   PUTMSG

$FF1F40 に入っている名前のファイルを DOS 3.3 ディスクから探します。
VTOC (トラック $11、セクタ $00) を読み出します。DOS 3.3 セクタの読み出しは、$FF0002 にトラック番号、$FF0003 にセクタ番号を設定し、RWTS ルーチンで行っています。セクタバッファは $FF2500-$FF25FF を使っています。
VTOC のオフセット $1 と $2 から、カタログセクタ(ディレクトリ)を設定し読み出します。
一つのカタログセクタに格納されている、7 個のファイルを順に検索します。トラック番号が $FF の場合、削除されたファイルなのでスキップします。トラック番号 $00 も使われないので、スキップします。
$FF1F40 から $FF1F5D に設定されているファイル名のハイビットを ON にします。カタログのファイル名と比較します。
カタログセクタに合致するファイルがなければ、次のカタログセクタを読み出します。すべてのカタログセクタを検索してもファイルが見つからなければ、エラーメッセージを表示し終了します。

0004AE: 41F900FF1F40            LEA     $FF1F40.L,A0    ;File name
0004B4: 303C001D                MOVE.W  #$001D,D0       ;Name length
0004B8: 00180080        SETFLG: ORI.B   #$80,(A0)+      ;Set high ASCII
0004BC: 51C8FFFA                DBRA    D0,SETFLG
0004C0: 13FC001100FF...         MOVE.B  #$11,$FF0002.L  ;Track $11
0004C8: 13FC000000FF...         MOVE.B  #$00,$FF0003.L  ;Sector $00
0004D0: 610001F6                BSR.W   RWTS            ;Read DOS3.3 VTOC
0004D4: 41F900FF2500            LEA     $FF2500.L,A0    ;first directory entry
0004DA: 13E8000100FF...         MOVE.B  $0001(A0),$FF0002.L;Track              
0004E2: 13E8000200FF...         MOVE.B  $0002(A0),$FF0003.L;Sector
0004EA: 610001DC                BSR.W   RWTS            ;Read DOS3.3 Directory 
0004EE: 323C0006        NEXTDIR:MOVE.W  #$0006,D1       ;num of entry - 1
0004F2: 41F900FF2500            LEA     $FF2500.L,A0
0004F8: D1FC0000000B            ADDA.L  #$0000000B,A0   ;File 1 entry
0004FE: 0C1000FF        NXTFILE:CMPI.B  #$FF,(A0)       ;check track num
000502: 6720                    BEQ.S   SKPFILE         ;$FF is deleted file
000504: 4A10                    TST.B   (A0)            ;Flie is track 0
000506: 671C                    BEQ.S   SKPFILE
000508: 303C001D                MOVE.W  #$001D,D0       ;file name length
00050C: 43F900FF1F40            LEA     $FF1F40.L,A1    ;Required file name
000512: 2448                    MOVEA.L A0,A2
000514: D5FC00000003            ADDA.L  #$00000003,A2   ;File name
00051A: B509            CHKNAME:CMPM.B  (A1)+,(A2)+     ;Check file name
00051C: 6606                    BNE.S   SKPFILE
00051E: 51C8FFFA                DBRA    D0,CHKNAME
000522: 6038                    BRA.S   DOSFILE

000524: D1FC00000023    SKPFILE:ADDA.L  #$00000023,A0   ;Next file entry
00052A: 51C9FFD2                DBRA    D1,NXTFILE
00052E: 41F900FF2500            LEA     $FF2500.L,A0
000534: 4A280001                TST.B   $0001(A0)       ;Next Directory
000538: 6716                    BEQ.S   BOOTERR         ;Boot Error
00053A: 13E8000100FF...         MOVE.B  $0001(A0),$FF0002.L;Track
000542: 13E8000200FF...         MOVE.B  $0002(A0),$FF0003.L;Sector
00054A: 6100017C                BSR.W   RWTS
00054E: 609E                    BRA.S   NEXTDIR

000550: 41FA0532        BOOTERR:LEA     MBOOTNG(PC),A0
000554: 610003A4                BSR.W   PUTMSG
000558: 600000CE                BRA.W   LOADERR

RWTS ルーチンでは、$FF0004 に DOS 3.3 RWTS の読み出しコマンド 1 を設定し、Jonathan のスロット I/O に 0 を書き込んで、Apple II の HALT 信号を止め、RWTS を実行します。Apple II 側では、$FF0004 を監視し、必要な処理を行なっています。

0006C8: 13FC000100FF... RWTS:   MOVE.B  #$01,$FF0004.L  ;Set Read command
0006D0: 6100000C                BSR.W   CALLA2
0006D4: 4A3900FF0004            TST.B   $FF0004.L       ;Check error code
0006DA: 66E0                    BNE.S   READERR
0006DC: 4E75                    RTS

0006DE: 48E70080        CALLA2: MOVEM.L A0,-(A7)
0006E2: 207900010000            MOVEA.L $010000.L,A0    ;Set Jonathan Slot addr
0006E8: 4210                    CLR.B   (A0)            ;Clear apple II halt
0006EA: 4CDF0100                MOVEM.L (A7)+,A0
0006EE: 0839000100FE... WAIT:   BTST    #1,$FE0000.L
0006F6: 67F6                    BEQ.S   WAIT
0006F8: 4E75                    RTS

ファイルが見つかったら、ファイルのセクタ数を調べます。
セクタ数が 0 なら、ファイルが空なのでエラーメッセージを表示し終了します。

00055C: 2248            DOSFILE:MOVEA.L A0,A1           ;Copy file entry to A1
00055E: 4281                    CLR.L   D1
000560: 12290022                MOVE.B  $0022(A1),D1    ;Get num of sector
000564: E149                    LSL.W   #8,D1
000566: 12290021                MOVE.B  $0021(A1),D1    ;Num of Sector
00056A: 10290000                MOVE.B  $0000(A1),D0    ;Get track num
00056E: 13C000FF0002            MOVE.B  D0,$FF0002.L    ;Set track num
000574: 10290001                MOVE.B  $0001(A1),D0    ;Get sector num
000578: 13C000FF0003            MOVE.B  D0,$FF0003.L    ;Set sector num
00057E: 61000148                BSR.W   RWTS            ;Load track/sector list
000582: 4A41                    TST.W   D1              ;Check number of sector
000584: 660C                    BNE.S   LDCODE
000586: 41FA051E                LEA     MCODEEM(PC),A0  ;Empty code
00058A: 6100036E                BSR.W   PUTMSG
00058E: 60000098                BRA.W   LOADERR
000628: 41FA04C7        LOADERR:LEA     MLOADER(PC),A0
00062C: 610002CC                BSR.W   PUTMSG
000630: 13FC00FE00FF...         MOVE.B  #$FE,$FF0004.L  ;
000638: 610000A4                BSR.W   CALLA2
00063C: 41FA0402                LEA     MRSTART(PC),A0
000640: 6000FE04                BRA.W   CONFIG

トラック/セクタリストを $01000D-$01010C にコピーします。
一つのトラック/セクタリストには 122 個のトラック/セクタ位置が格納できます。
ファイルのセクタ数が 123 ($7B) 以上であるか調べ、必要なトラック/セクタリストの数を、ファイルのセクタ数から引き、$010008 に保存します。

000592: 41F900FF2500    LDCODE: LEA     $FF2500.L,A0    ;Copy track/sector list
000598: 43F90001000D            LEA     $01000D.L,A1    ;to $01000D
00059E: 303C00FF                MOVE.W  #$00FF,D0
0005A2: 61000156                BSR.W   COPY
0005A6: 45F90001000D            LEA     $01000D.L,A2    ;track/sector list
0005AC: 45EA000C                LEA     $000C(A2),A2    ;1st file sector
0005B0: 23CA00010004            MOVE.L  A2,$010004.L    ;Save sector
0005B6: 2001                    MOVE.L  D1,D0           ;num of sector
0005B8: 5381            NXSEC:  SUBQ.L  #1,D1
0005BA: 04800000007B            SUBI.L  #$0000007B,D0
0005C0: 6EF6                    BGT.S   NXSEC
0005C2: 33C100010008            MOVE.W  D1,$010008.L    ;Num of sector
0006FA: 12D8            COPY:   MOVE.B  (A0)+,(A1)+     ;Copy (A0) to (A1)
0006FC: 51C8FFFC                DBRA    D0,COPY         ;by D0 bytes
000700: 4E75                    RTS

ファイルのコピー先を $100000 に設定します。
RDCODE ルーチンで、ファイルの全セクタを読み出します。

0005C8: 43F900100000            LEA     $100000.L,A1
0005CE: 323900010008            MOVE.W  $010008.L,D1
0005D4: 5341                    SUBQ.W  #1,D1
0005D6: 6100006C        NXCODE: BSR.W   RDCODE
0005DA: 41F900FF2500            LEA     $FF2500.L,A0
0005E0: 303C00FF                MOVE.W  #$00FF,D0
0005E4: 61000114                BSR.W   COPY
0005E8: 51C9FFEC                DBRA    D1,NXCODE

RDCODE ルーチンでは、トラック/セクタリストを参照し、読み出しトラックとセクタを設定します。トラック/セクタリストの終わりに達したら、次のトラック/セクタリストを読み出します。

000644: 48E70060        RDCODE: MOVEM.L A2-A1,-(A7)
000648: 41F90001010D            LEA     $01010D.L,A0    ;check end of t/s
00064E: 247900010004            MOVEA.L $010004.L,A2
000654: B5C8                    CMPA.L  A0,A2
000656: 663E                    BNE.S   RDSEC
000658: 43F90001000D            LEA     $01000D.L,A1
00065E: 4A290001                TST.B   $0001(A1)       ;Check track num
000662: 6758                    BEQ.S   READERR
000664: 13E9000100FF...         MOVE.B  $0001(A1),$FF0002.L;Track
00066C: 13E9000200FF...         MOVE.B  $0002(A1),$FF0003.L;Sector
000674: 61000052                BSR.W   RWTS
000678: 41F900FF2500            LEA     $FF2500.L,A0
00067E: 43F90001000D            LEA     $01000D.L,A1
000684: 303C00FF                MOVE.W  #$00FF,D0
000688: 61000070                BSR.W   COPY
00068C: 45F90001000D            LEA     $01000D.L,A2
000692: 45EA000C                LEA     $000C(A2),A2
000696: 13EA000000FF... RDSEC:  MOVE.B  $0000(A2),$FF0002.L;Track
00069E: 13EA000100FF...         MOVE.B  $0001(A2),$FF0003.L;Sector
0006A6: D5FC00000002            ADDA.L  #$00000002,A2   ;next entry
0006AC: 6100001A                BSR.W   RWTS
0006B0: 23CA00010004            MOVE.L  A2,$010004.L    ;set next t/s entry
0006B6: 4CDF0600                MOVEM.L (A7)+,A1-A2
0006BA: 4E75                    RTS

0006BC: 41FA040B        READERR:LEA     MREADER(PC),A0
0006C0: 61000238                BSR.W   PUTMSG
0006C4: 6000FF62                BRA.W   LOADERR

全セクタの読み出しが終わったら、START ルーチンを $01010E の RAM 領域にコピーし、画面をクリアし、全てのレジスタをくりして、コピーした START ルーチンに飛びます。

0005EC: 41F90000095C            LEA     START.L,A0
0005F2: 43F90001010E            LEA     $01010E.L,A1
0005F8: 303C0018                MOVE.W  #$0018,D0
0005FC: 610000FC                BSR.W   COPY
000600: 61000156                BSR.W   CLRSCRN
000604: 7000                    MOVEQ   #$00,D0
000606: 7200                    MOVEQ   #$00,D1
000608: 7400                    MOVEQ   #$00,D2
00060A: 7600                    MOVEQ   #$00,D3
00060C: 7800                    MOVEQ   #$00,D4
00060E: 7A00                    MOVEQ   #$00,D5
000610: 7C00                    MOVEQ   #$00,D6
000612: 7E00                    MOVEQ   #$00,D7
000614: 91C8                    SUBA.L  A0,A0
000616: 93C9                    SUBA.L  A1,A1
000618: 95CA                    SUBA.L  A2,A2
00061A: 97CB                    SUBA.L  A3,A3
00061C: 99CC                    SUBA.L  A4,A4
00061E: 9BCD                    SUBA.L  A5,A5
000620: 9DCE                    SUBA.L  A6,A6
000622: 4EF90001010E            JMP     $01010E.L

START ルーチンでは、$FC0000 のスイッチで、ROM 領域を RAM に切り替えます。ファイルから読み出したデータのアドレス $100000 が、$000000 に切り替わります。
スタックポインタ、プログラムカウンタ、ステータスレジスタをスタックに積み、ファイルから読み出されたプログラムに処理を移します。

00095C: 4A3900FC0000    START:  TST.B   $FC0000.L       ;Switch ROM to RAM
000962: 2E7900000000            MOVEA.L $000000.L,A7    ;Reset SP
000968: 2F3900000004            MOVE.L  $000004.L,-(A7)
00096E: 3F3C2700                MOVE.W  #$2700,-(A7)
000972: 4E73                    RTE

キー入力ルーチン

000702: 48E74080                MOVEM.L A0/D1,-(A7)
000706: 61000022                BSR.W   CURSOR
00070A: 0839000700FF... CHKKEY: BTST    #7,$FFC000.L    ;KBD
000712: 67F6                    BEQ.S   CHKKEY
000714: 423900FFC010            CLR.B   $FFC010.L       ;KBDSTRB
00071A: 103900FFC000            MOVE.B  $FFC000.L,D0    ;KBD
000720: 61000008                BSR.W   CURSOR
000724: 4CDF0102                MOVEM.L (A7)+,D1/A0
000728: 4E75                    RTS

00072A: 48E78080        CURSOR: MOVEM.L A0/D0,-(A7)
00072E: 4280                    CLR.L   D0
000730: 10390001000A            MOVE.B  $01000A.L,D0
000736: E508                    LSL.B   #2,D0
000738: 41FA027A                LEA     TEXTADR(PC),A0
00073C: 20700000                MOVEA.L $00(A0,D0.W),A0
000740: 10390001000B            MOVE.B  $01000B.L,D0
000746: E208                    LSR.B   #1,D0
000748: 6100018A                BSR.W   SETBANK
00074C: 0A3000800000            EORI.B  #$80,$00(A0,D0.W)
000752: 4CDF0101                MOVEM.L (A7)+,D0/A0
000756: 4E75                    RTS

画面クリアルーチン

000758: 48E7E0C0        CLRSCRN:MOVEM.L A1-A0/D2-D0,-(A7)
00075C: 303C0001                MOVE.W  #$0001,D0       ;1 : num of page - 1
000760: 41FA0252        CLRPAGE:LEA     TEXTADR(PC),A0  ;A0 = Text VRAM address
000764: 323C0017                MOVE.W  #$0017,D1       ;23 = screen height - 1
000768: 2258            CLRLINE:MOVEA.L (A0)+,A1        ;Set screen address
00076A: 343C0027                MOVE.W  #$0027,D2       ;39 = screen width - 1
00076E: 12FC00A0        CLRCHRA:MOVE.B  #$A0,(A1)+      ;Clear a line
000772: 51CAFFFA                DBRA    D2,CLRCHRA
000776: 51C9FFF0                DBRA    D1,CLRLINE
00077A: 6100013E                BSR.W   CHGBANK
00077E: 51C8FFE0                DBRA    D0,CLRPAGE
000782: 4CDF0307                MOVEM.L (A7)+,D0-D2/A0-A1
000786: 4E75                    RTS

000788: 42390001000A    HOME:   CLR.B   $01000A.L       ;Clear Y pos
00078E: 42390001000B            CLR.B   $01000B.L       ;Clear X pos
000794: 4E75                    RTS

文字表示ルーチン

000796: 48E7FFFE        PRINT:  MOVEM.L A6-A0/D7-D0,-(A7)
00079A: 0C00000D                CMPI.B  #$0D,D0
00079E: 67000020                BEQ.W   CR
0007A2: 6E000056                BGT.W   PUTCHAR
0007A6: 0C000008                CMPI.B  #$08,D0
0007AA: 67000022                BEQ.W   BS
0007AE: 0C00000A                CMPI.B  #$0A,D0
0007B2: 67000018                BEQ.W   LF
0007B6: 0C000009                CMPI.B  #$09,D0
0007BA: 67000028                BEQ.W   TAB
0007BE: 603A                    BRA.S   PUTCHAR

0007C0: 13FC00000001... CR:     MOVE.B  #$00,$01000B.L  ;Carridge Return
0007C8: 600000EA                BRA.W   RETPRT

0007CC: 6044            LF:     BRA.S   NEXTLIN         ;Line Feed

0007CE: 0C3900000001... BS:     CMPI.B  #$00,$01000B.L  ;Back Space
0007D6: 670000DC                BEQ.W   RETPRT
0007DA: 53390001000B            SUBQ.B  #1,$01000B.L
0007E0: 600000D2                BRA.W   RETPRT

0007E4: 103C0020        TAB:    MOVE.B  #$20,D0         ;TAB Space
0007E8: 61AC                    BSR.S   PRINT
0007EA: 12390001000B            MOVE.B  $01000B.L,D1    ;Get X pos
0007F0: 02010007                ANDI.B  #$07,D1
0007F4: 66EE                    BNE.S   TAB
0007F6: 600000BC                BRA.W   RETPRT

0007FA: 4281            PUTCHAR:CLR.L   D1
0007FC: 12390001000B            MOVE.B  $01000B.L,D1    ;Get X pos
000802: 0C010050                CMPI.B  #$50,D1         ;Pos X = 80?
000806: 6600006E                BNE.W   PUTC            ;If not then print char
00080A: 13FC00000001...         MOVE.B  #$00,$01000B.L  ;Clear Pos X
000812: 12390001000A    NEXTLIN:MOVE.B  $01000A.L,D1    ;Check Line
000818: 5201                    ADDQ.B  #1,D1
00081A: 0C010018                CMPI.B  #$18,D1         ;If end of line
00081E: 6700000A                BEQ.W   SCROLL          ; then SCROLL
000822: 13C10001000A            MOVE.B  D1,$01000A.L    ;Next Line
000828: 604C                    BRA.S   PUTC

00082A: 383C0001        SCROLL: MOVE.W  #$0001,D4       ;Num of page - 1
00082E: 13FC00170001...         MOVE.B  #$17,$01000A.L  ;Bottom Line
000836: 41FA017C        CP1UP:  LEA     TEXTADR(PC),A0
00083A: 343C0016                MOVE.W  #$0016,D2       ;Screen height
00083E: 2458            CPLINE: MOVEA.L (A0)+,A2
000840: 2650                    MOVEA.L (A0),A3
000842: 363C0027                MOVE.W  #$0027,D3       ;Screen width
000846: 14DB            CPCHAR: MOVE.B  (A3)+,(A2)+     ;Copy 1 line up
000848: 51CBFFFC                DBRA    D3,CPCHAR
00084C: 51CAFFF0                DBRA    D2,CPLINE
000850: 61000068                BSR.W   CHGBANK
000854: 51CCFFE0                DBRA    D4,CP1UP
000858: 383C0001                MOVE.W  #$0001,D4
00085C: 41FA01B2                LEA     TEXTEND(PC),A0
000860: 343C0027        CLRLIN: MOVE.W  #$0027,D2       ;Screen width
000864: 2450                    MOVEA.L (A0),A2
000866: 14FC00A0        CLRCHR: MOVE.B  #$A0,(A2)+      ;Clear line
00086A: 51CAFFFA                DBRA    D2,CLRCHR
00086E: 6100004A                BSR.W   CHGBANK
000872: 51CCFFEC                DBRA    D4,CLRLIN
000876: 41FA013C        PUTC:   LEA     TEXTADR(PC),A0
00087A: 4281                    CLR.L   D1
00087C: 12390001000A            MOVE.B  $01000A.L,D1    ;Get Y pos
000882: E509                    LSL.B   #2,D1
000884: 22701000                MOVEA.L $00(A0,D1.W),A1
000888: 6100004A                BSR.W   SETBANK
00088C: 0C00000A                CMPI.B  #$0A,D0
000890: 67000022                BEQ.W   RETPRT
000894: 12390001000B            MOVE.B  $01000B.L,D1    ;Get X pos
00089A: E209                    LSR.B   #1,D1
00089C: 80390001000C            OR.B    $01000C.L,D0    ;Set High bit
0008A2: 13801000                MOVE.B  D0,$00(A1,D1.W) ;Print a character
0008A6: 12390001000B            MOVE.B  $01000B.L,D1    ;Increment X pos
0008AC: 5201                    ADDQ.B  #1,D1
0008AE: 13C10001000B            MOVE.B  D1,$01000B.L    ;Save X pos
0008B4: 4CDF7FFF        RETPRT: MOVEM.L (A7)+,D0-D7/A0-A6
0008B8: 4E75                    RTS

0008BA: 0839000700FF... CHGBANK:BTST    #7,$FFC01C.L    ;RDPAGE2
0008C2: 6608                    BNE.S   MAIN
0008C4: 423900FFC055    AUX:    CLR.B   $FFC055.L       ;PAGE2
0008CA: 4E75                    RTS

0008CC: 423900FFC054    MAIN:   CLR.B   $FFC054.L       ;TXTPAGE1
0008D2: 4E75                    RTS

0008D4: 083900000001... SETBANK:BTST    #0,$01000B.L    ;Is X pos even?
0008DC: 660E                    BNE.S   ODDPOS
0008DE: 0839000700FF...         BTST    #7,$FFC01C.L    ;RDPAGE2
0008E6: 6610                    BNE.S   RETBANK
0008E8: 61DA                    BSR.S   AUX
0008EA: 600C                    BRA.S   RETBANK

0008EC: 0839000700FF... ODDPOS: BTST    #7,$FFC01C.L    ;RDPAGE2
0008F4: 6702                    BEQ.S   RETBANK
0008F6: 61D4                    BSR.S   MAIN
0008F8: 4E75            RETBANK:RTS

0008FA: 48E78080        PUTMSG: MOVEM.L A0/D0,-(A7)
0008FE: 1018                    MOVE.B  (A0)+,D0        ;Get X pos
000900: 6B000010                BMI.W   NOPOS           ;Skip set pos
000904: 13C00001000A            MOVE.B  D0,$01000A.L    ;X pos
00090A: 13D80001000B            MOVE.B  (A0)+,$01000B.L ;Y pos
000910: 61C2                    BSR.S   SETBANK
000912: 1018            NOPOS:  MOVE.B  (A0)+,D0
000914: 6100FE80                BSR.W   PRINT
000918: 4A10                    TST.B   (A0)
00091A: 66F6                    BNE.S   NOPOS
00091C: 4CDF0101                MOVEM.L (A7)+,D0/A0
000920: 4E75                    RTS

$00974 から先は、各種データが格納されています。
コピーライト、MANAGEMENT RESOURCE INTERNATIONAL という会社が、ファームウェアを開発したようです。

000974: 434F50595249...         DC.B    "COPYRIGHT (C) 19"
000984: 38352C313938...         DC.B    "85,1986 MANAGEME"
000994: 4E5420524553...         DC.B    "NT RESOURCES INT"
0009A4: 45524E415449...         DC.B    "ERNATIONAL, LTD."

Apple II TEXT VRAM アドレステーブル

0009B4: 00FF0400        TEXTADR:DC.L    $00FF0400       ;Line 0
0009B8: 00FF0480                DC.L    $00FF0480       ;Line 1
0009BC: 00FF0500                DC.L    $00FF0500       ;Line 2
0009C0: 00FF0580                DC.L    $00FF0580       ;Line 3
0009C4: 00FF0600                DC.L    $00FF0600       ;Line 4
0009C8: 00FF0680                DC.L    $00FF0680       ;Line 5
0009CC: 00FF0700                DC.L    $00FF0700       ;Line 6
0009D0: 00FF0780                DC.L    $00FF0780       ;Line 7
0009D4: 00FF0428                DC.L    $00FF0428       ;Line 8
0009D8: 00FF04A8                DC.L    $00FF04A8       ;Line 9
0009DC: 00FF0528                DC.L    $00FF0528       ;Line 10
0009E0: 00FF05A8                DC.L    $00FF05A8       ;Line 11
0009E4: 00FF0628                DC.L    $00FF0628       ;Line 12
0009E8: 00FF06A8                DC.L    $00FF06A8       ;Line 13
0009EC: 00FF0728                DC.L    $00FF0728       ;Line 14
0009F0: 00FF07A8                DC.L    $00FF07A8       ;Line 15
0009F4: 00FF0450                DC.L    $00FF0450       ;Line 16
0009F8: 00FF04D0                DC.L    $00FF04D0       ;Line 17
0009FC: 00FF0550                DC.L    $00FF0550       ;Line 18
000A00: 00FF05D0                DC.L    $00FF05D0       ;Line 19
000A04: 00FF0650                DC.L    $00FF0650       ;Line 20
000A08: 00FF06D0                DC.L    $00FF06D0       ;Line 21
000A0C: 00FF0750                DC.L    $00FF0750       ;Line 22
000A10: 00FF07D0        TEXTEND:DC.L    $00FF07D0       ;Line 23

メッセージ


000A14: 00              MRAMOK: DC.B    $00             ;X pos
000A15: 00                      DC.B    $00             ;Y pos
000A16: 52414D205445...         DC.B    "RAM TEST - PASSE"
000A26: 440D0A00                DC.B    "D",$0D,$0A,$00
000A2A: 00              MRAMNG: DC.B    $00             ;X pos
000A2B: 00                      DC.B    $00             ;Y pos
000A2C: 52414D205445...         DC.B    "RAM TEST - FAILE"
000A3C: 440D0A00                DC.B    "D",$0D,$0A,$00
000A40: 00              MRSTART:DC.B    $00             ;X pos
000A41: 00                      DC.B    $00             ;Y pos
000A42: 417474656D70...         DC.B    "Attempting to re"
000A52: 737461727420...         DC.B    "start jonathan(t"
000A62: 6D290D0A00              DC.B    "m)",$0D,$0A,$00
000A67: FF              MINIT:  DC.B    $FF
000A68: 496E69746961...         DC.B    "Initializing jon"
000A78: 617468616E28...         DC.B    "athan(tm)",$0D,$0A,$00
000A84: FF              MBOOTNG:DC.B    $FF
000A85: 4170706C6963...         DC.B    "Application boot"
000A95: 20636F646520...         DC.B    " code missing.",$0D,$0A
000AA5: 00                      DC.B    $00
000AA6: FF              MCODEEM:DC.B    $FF
000AA7: 4170706C6963...         DC.B    "Application code"
000AB7: 2066696C6520...         DC.B    " file is empty.",$0D
000AC7: 0A00                    DC.B    $0A,$00
000AC9: FF              MREADER:DC.B    $FF
000ACA: 4572726F7220...         DC.B    "Error reading ap"
000ADA: 706C69636174...         DC.B    "plication boot c"
000AEA: 6F64652E0D0A00          DC.B    "ode.",$0D,$0A,$00
000AF1: FF              MLOADER:DC.B    $FF
000AF2: 416E20657272...         DC.B    "An error has bee"
000B02: 6E2064657465...         DC.B    "n detected while"
000B12: 20747279696E...         DC.B    " trying to",$0D,$0A," loa"
000B22: 6420616E2061...         DC.B    "d an application"
000B32: 2E20596F7520...         DC.B    ". You are being "
000B42: 72657475726E...         DC.B    "returned to DOS."
000B52: 0D0A00                  DC.B    $0D,$0A,$00
000B55: FF              MBUSERR:DC.B    $FF
000B56: 412062757320...         DC.B    "A bus error has "
000B66: 6F6363757265...         DC.B    "occured",$0D,$0A,$00
000B70: FF              MADDERR:DC.B    $FF
000B71: 416E20616464...         DC.B    "An address error"
000B81: 20686173206F...         DC.B    " has occured",$0D,$0A,$00
000B90: FF              MILLEGA:DC.B    $FF
000B91: 416E20696C6C...         DC.B    "An illegal instr"
000BA1: 756374696F6E...         DC.B    "uction error has"
000BB1: 206F63637572...         DC.B    " occured",$0D,$0A,$00
000BBC: FF              MVIOLAT:DC.B    $FF
000BBD: 412070726976...         DC.B    "A privilige viol"
000BCD: 6174696F6E20...         DC.B    "ation error has "
000BDD: 6F6363757265...         DC.B    "occured",$0D,$0A,$00
000BE7: FF              MUNINIT:DC.B    $FF
000BE8: 416E20756E69...         DC.B    "An uninitialized"
000BF8: 20696E746572...         DC.B    " interrupt vecto"
000C08: 72206572726F...         DC.B    "r error has occu"
000C18: 7265640D0A00            DC.B    "red",$0D,$0A,$00
000C1E: FF              MSPURIO:DC.B    $FF
000C1F: 412073707572...         DC.B    "A spurious inter"
000C2F: 727570742065...         DC.B    "rupt error has o"
000C3F: 636375726564...         DC.B    "ccured",$0D,$0A,$00

000C48: 00000000                DC.L    $00000000
000C4C: 00000000                DC.L    $00000000
000C50: 00000000                DC.L    $00000000
000C54: 00000000                DC.L    $00000000
000C58: 00000000                DC.L    $00000000
000C5C: 00000000                DC.L    $00000000

いいなと思ったら応援しよう!