SSブログ
English Version

3チップ構成68Kマイコンの構想(その8)ローダーによるCP/Mの起動 [68K]

 前回の「3チップ構成68Kマイコンの構想(その7)CP/Mのリロケート」の記事でCP/Mのリロケートができたので、今回はCP/Mをローダーで起動できるようにします。

 CP/M-68KはCP/M本体のサイズが大きくなり、当時記録媒体として一般的なフロッピーディスクのブート用に割当てた数トラックに収まらなくなったこともあり、CP/M本体のファイル(CPM.SYS)はAドライブ上に置き、CP/M本体を起動するために必要な最小限の機能に絞ったBDOS相当の機能を持ったものがCP/Mローダー(CPMLDR)です。
 ネットで見つけた英語のマニュアル(CP/M-68K Operating System System Guide)には「CPMLDR is a miniature version of CP/M-68K」と書かれています。

 CP/Mのブートの概要は
  1. Cold Boot Loaderの起動
     1トラック目の最初のセクタ(128bytes)に保存したCold Boot LoaderをPIC側が68K内のメモリに展開し、起動する。
     PIC側からアクセスできる68K側のメモリ範囲は狭い(最初の1KB(000000-0003FF)と最後の1KB)ので今回はベクターテーブル内ではありますが、0x0380を開始アドレスとしました。

  2. CPMLDRのメモリ展開
     Cold Boot Loaderは2番目以降のセクタに記録されたCPMLDRをメモリに展開し、起動する。CPMLDRの開始アドレスは0x008000にしました。

  3. CP/Mの起動
     CPMLDRがAドライブのファイルシステム上にあるCPM.SYSを起動し、CP/Mが立ち上がります。

 結局、CP/M本体がディスク上にあることには変わりないのでブート用トラックの本数を増やしてそこにCPM.SYSを格納すればいいじゃないかとも思えますが、CPM.SYSがファイルシステム上にあることでCP/MのBIOS変更等の作業がかなり楽になるという大きなメリットがあります。また、ブートトラック数を増やすと従来のディスクとの互換性が崩れます。

 CPMLDRはミニチュアのCP/Mなので動かすためには専用のBIOSが必要になりますが、CP/M用のBIOSから機能を間引けばいいだけなので作業的には楽です。
 1点だけ注意が必要で、CP/M用のBIOSはTRAPでコールされるので RTE でリターンしますが、CPMLDRからは_biosのラベルへのコールになるのでリターンは通常の RTS 命令になります。

 CPMLDR用のBIOSに実装する(または間引く)機能はマニュアルに書いてありますが、今回作成したCPMLDR用BIOS(ldrbios.s)の一部を引用すると下記のような機能の実装にしています。
 18番目の「Get MRT」(アプリで使えるメモリ範囲の情報を返す機能)はマニュアルには「Not used now, but may be used in future releases.」と書かれていますが現在は当時から見れば遠い未来なので実装していませんw

CPMLDR用BIOSソースの抜粋
_bios: move.l #FuncNo,a1 lsl #2,d0 * d0 = d0*4 movea.l 6(pc,d0),a0 * code : 207B 0006 jsr (a0) * call handler rts biosbase: dc.l _init * 0 dc.l no_func * 1 dc.l no_func * 2 dc.l no_func * 3 dc.l conout * 4 dc.l no_func * 5 dc.l no_func * 6 dc.l no_func * 7 dc.l home * 8 dc.l seldsk * 9 dc.l settrk * 10 dc.l setsec * 11 dc.l setdma * 12 dc.l read * 13 dc.l no_func * 14 dc.l no_func * 15 dc.l sectran * 16 dc.l no_func * 17 dc.l no_func * 18 dc.l no_func * 19 dc.l no_func * 20 dc.l no_func * 21 dc.l setexc * 22 maxfuncs equ (*-biosbase)/4 no_func: move.b #FC_EXIT,(a1) reset bra * _init: rts


 CPMLDR用のbiosの準備が出来たら、アセンブルし、LDRLIBとリンクします。

CPMLDR用biosのアセンブルとリンク
M>as68 -l -p ldrbios.s >ldrbios.prn M>lo68 -s -t8000 -uLDR -o cpmldr.sys ldrlib ldrbios.o M>stat *.sys DRIVE M: USER : 0 RECS BYTES FCBS ATTRIBUTES NAME 174 22K 2 DIR RW M:CPM0400 .SYS 23 4K 1 DIR RW M:CPMLDR .SYS ---------------------------------------------- TOTAL: 26K 3 M: RW, FREE SPACE: 1,474K M>size68 cpmldr.sys cpmldr.sys:2468+380+1422=4270 (10AE ) stack size = 0 M>dump cpmldr.sys 0000 00 (000000): 601A 0000 09A4 0000 017C 0000 058E 0000 *`....$...|......* 0000 10 (000010): 0000 0000 0000 0000 8000 FFFF 4FF9 0000 *............Oy..* 0000 20 (000020): 8F20 4280 4EB9 0000 888E 303C 0016 323C *. B.N9....0<..2<* 0000 30 (000030): 0008 243C 0000 8030 4EB9 0000 888E 007C *..$<...0N9.....|* 0000 40 (000040): 2000 4FF9 0000 8F20 6000 0180 0057 2000 * .Oy... `....W .* 0000 50 (000050): 4E73 4E56 0000 48E7 0104 2A6E 0008 6012 *NsNV..Hg..*n..`.* 0000 60 (000060): 101D 4880 3E80 3F3C 0002 4EB9 0000 873C *..H.>.?<..N9...<* 0000 70 (000070): 548F 1015 66EA 4A9F 4CDF 2000 4E5E 4E75 *T...fjJ.L_ .N^Nu* 0001 00 (000080): 4E56 0000 48E7 0700 3E2E 0008 3007 6022 *NV..Hg..>...0.`"* 0001 10 (000090): 2EBC 0000 89C6 61BA 4EB9 0000 8000 2EBC *.<...Fa:N9.....<* 0001 20 (0000A0): 0000 89D4 61AC 601A 2EBC 0000 89ED 61A2 *...Ta,`..<...ma"* 0001 30 (0000B0): 6010 4A40 67DA B07C 0001 67E2 B07C 0002 *`.J@gZ0|..gb0|..* 0001 40 (0000C0): 67E6 2EBC 0000 8A03 6188 4EB9 0000 8000 *gf.<....a.N9....* 0001 50 (0000D0): 4A9F 4CDF 00C0 4E5E 4E75 4E56 0000 48E7 *J.L_.@N^NuNV..Hg* 0001 60 (0000E0): 031C 2A6E 0008 2EBC 0000 902E 4267 3F3C *..*n...<....Bg?<* 0001 70 (0000F0): 001A 4EB9 0000 873C 588F 2E8D 4267 3F3C *..N9...<X...Bg?<* 0002 00 (000100): 000F 4EB9 0000 873C 588F B07C 00FF 6D08 *..N9...<X.0|..m.* 0002 10 (000110): 3EBC 0001 6100 FF6A 422D 0020 2E8D 4267 *><..a..jB-. ..Bg* 0002 20 (000120): 3F3C 0014 4EB9 0000 873C 588F 4A40 6708 *?<..N9...<X.J@g.* 0002 30 (000130): 3EBC 0001 6100 FF4A 267C 0000 902E 0C53 *><..a..J&|.....S* 0002 40 (000140): 601A 6606 302B 001A 6608 3EBC 0002 6100 *`.f.0+..f.><..a.* 0002 50 (000150): FF30 286B 0016 2E2B 0002 DEAB 0006 3EBC *.0(k...+..^+..><* 0002 60 (000160): 0064 2F0C 2F3C 0000 904A 4EB9 0000 837A *.d/./<...JN9...z*


 CPMLDR.SYSができたので動作確認のために前回記事に書いた方法でパソコン側に持ってきてSレコードに変換し、Sレコードローダで68K内のメモリに展開して起動してみます。(その前に当然Aドライブ上に前回記事で作成したCP/MファイルをCPM.SYSのファイル名で入れておきます)
 CPMLDRはサイズが小さいのでCP/Mの起動が楽になりました^^
 CP/M本体の起動時はいきなりプロンプト("A>")が表示され、物静かなOSだなぁ~と思っていましたが、CPMLDRを起動するとバージョン等、色々表示されます。

CPMLDRでのCP/M起動
:\\ +B000-B886 # 3chips MC68008 OneBoard test 2018/09/02 +C000-CB3D #LibCpm CP/M(PMP) lib68K v0.03 2018/09/14 +D000-DEEA #LibSpi SPI lib V0.03 2018/09/05 +E000-E860 # 3chips MC68008 OneBoard Hello 2018/08/19 +F000-FE9F # 3chips MC68008 OneBoard S fomat loader 2018/08/30 :src $f000 :run 22222222222222222222222222222222222222222222222222222222222222222222222222222222 222222222222 :src :\< 2182 :run CP/M-68K(tm) Version 1.3 08/05/85 Copyright (c) 1985 Digital Research, Inc. Pic24CPM-68K ver0.01 2018/09/23 by skyriver A>dir A: COPY REL : CPM SYS : DDT REL : DDT68000 68K : INIT REL A: PIP REL : README TXT : RELOC REL : RELOC SUB : RELOC1 SUB A: SD REL : STAT REL A>


 残りはCold Boot Loaderですが、これはSDカードの読込みの仕組みが解っていれば実装は簡単です。
 アセンブル&リンク操作とアセンブル結果も貼っておきます。

boot68k.sのアセンブルとリンク
M>as68 -l -p boot68k.s >boot68k.prn M>lo68 -s -t0380 -o boot68k.sys boot68k.o M>type boot68k.prn C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.10 Page 1 Source File: boot68k.s 1 ************************************** 2 * CP/M-68K boot loader 3 * For Pic24CPM68K with SD Card 4 * adapted to Blocking/Deblocking 5 * ver 0.03a 2018/10/14 by skyriver 6 ************************************** 7 8 9 BOOTSTART equ $0380 * start address of boot loader 10 CPMLDR equ $008000 * start address of CPM loader 11 LDR_SIZE equ $1200 * size of CPM loader 12 13 PICWRK equ $07fdf0 * PIC service work area 14 PICDMA equ $07fe00 * DMA for PIC 15 SEC_SIZE equ 128 * sector size 16 BLK_SIZE equ (SEC_SIZE*4) 17 CR equ 13 18 LF equ 10 19 20 LDR_BLK equ LDR_SIZE/BLK_SIZE 21 22 23 FC_EXIT equ 0 * EXIT CP/M 24 FC_CONST equ 1 * CONST 25 FC_CONIN equ 2 * CONIN 26 FC_CONOUT equ 3 * CONOUT 27 FC_READ equ 4 * READ SD Card 28 FC_WRITE equ 5 * WRITE SD Card 29 FC_PUNCH equ 6 * PUNCH 30 FC_READER equ 7 * READER 31 32 * ++++ work area for PIC Interface 33 FuncNo equ PICWRK * ds 1 : function No 34 ArgByte equ PICWRK+1 * ds 1 : byte argument 35 SdSec equ PICWRK+2 * ds 4 36 RetVal equ PICWRK+6 * ds 2 : return value 37 38 OArgByte equ 1 39 OSdSec equ 2 40 ORetVal equ 6 41 42 43 00000000 .text 44 45 * org BOOTSTART 46 47 00000000 227C0007FDF0 _boot: move.l #FuncNo,a1 48 00000006 4DF900000044 lea startmes,a6 49 50 0000000C 121E _bo10: move.b (a6)+,d1 51 0000000E 6704 beq _bo20 52 00000010 6140 bsr conout 53 00000012 60F8 bra _bo10 54 _bo20: 55 00000014 12BC0004 move.b #FC_READ,(a1) C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.10 Page 2 Source File: boot68k.s 56 00000018 4280 clr.l d0 * SD block No.(include boot sec) 57 0000001A 267C00008000 move.l #CPMLDR,a3 * set COMLDR address 58 00000020 244B move.l a3,a2 59 00000022 94FC0080 suba #SEC_SIZE,a2 * sub boot sec size 60 00000026 7408 moveq #(LDR_BLK-1),d2 * set sector loop counter 61 62 00000028 23400002 loop: move.l d0,OSdSec(a1) * set SD block No. 63 0000002C 4E70 reset * read sector 64 0000002E 207C0007FE00 move.l #PICDMA,a0 65 00000034 727F moveq #(BLK_SIZE/4-1),d1 66 00000036 24D8 rdcpy: move.l (a0)+,(a2)+ 67 00000038 51C9FFFC dbf d1,rdcpy 68 69 0000003C 5240 addq.w #1,d0 * next block No. 70 0000003E 51CAFFE8 dbf d2,loop 71 72 00000042 4ED3 jmp (a3) 73 74 75 startmes: 76 00000044 0D2E2E2E206C6F61 dc.b CR,'... loading ',0 76 0000004C 64696E672000 77 78 .even 79 80 * console out 81 * d1.w <- data 82 * 83 conout: 84 00000052 024100FF andi.w #$00ff, d1 85 00000056 00410300 ori.w #FC_CONOUT*256,d1 86 0000005A 3281 move.w d1,(a1) 87 0000005C 4E70 reset 88 0000005E 4E75 rts 89 90 00000060 .end BOOTSTART C P / M 6 8 0 0 0 A s s e m b l e r Revision 02.10 Page 3 Source File: boot68k.s S y m b o l T a b l e ArgByte 0007FDF1 ABS BLK_SIZE 00000200 ABS BOOTSTAR 00000380 ABS CPMLDR 00008000 ABS CR 0000000D ABS FC_CONIN 00000002 ABS FC_CONOU 00000003 ABS FC_CONST 00000001 ABS FC_EXIT 00000000 ABS FC_PUNCH 00000006 ABS FC_READ 00000004 ABS FC_READE 00000007 ABS FC_WRITE 00000005 ABS FuncNo 0007FDF0 ABS LDR_BLK 00000009 ABS LDR_SIZE 00001200 ABS LF 0000000A ABS OArgByte 00000001 ABS ORetVal 00000006 ABS OSdSec 00000002 ABS PICDMA 0007FE00 ABS PICWRK 0007FDF0 ABS RetVal 0007FDF6 ABS SEC_SIZE 00000080 ABS SdSec 0007FDF2 ABS _bo10 0000000C TEXT _bo20 00000014 TEXT _boot 00000000 TEXT conout 00000052 TEXT loop 00000028 TEXT rdcpy 00000036 TEXT startmes 00000044 TEXT M>


 Cold Boot Loaderのリンク結果をSDカードの先頭ブロックに、次のブロック以降にCPMLDRを入れれば、SDカードからCP/Mがブート可能となり、CP/Mの起動が非常に楽になります^^
 尚、アセンブルやリンクはCP/M-68Kシミュレータ上で行った方が作業的には楽だと思いますが、今回は昔のCP/M移植手順を楽しむという意味で敢えて実機上で行っています。
 まぁインターネット上の豊富な情報や当時と比べれば処理能力が桁違いに高いパソコンを使ってはいるのですが・・w

Cold Boot LoaderによるCP/Mの起動
:run ... loading CP/M-68K(tm) Version 1.3 08/05/85 Copyright (c) 1985 Digital Research, Inc. Pic24CPM-68K ver0.01 2018/09/23 by skyriver A>dir A: COPY REL : CPM SYS : DDT REL : DDT68000 68K : INIT REL A: PIP REL : README TXT : RELOC REL : RELOC SUB : RELOC1 SUB A: SD REL : STAT REL A>


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー