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