SSブログ
English Version

レトロマイコン86ボードの構想(その9)bootstrapでのCP/M-86の起動 [8086]

 前回の記事でCP/M-86をCold Start Loaderで起動できたことを書きました。
 今回はBootstrapを使ってCP/M-86を本来の起動方法で立ち上げます。

 BootstrapはDiskAのシステム用トラック(今回は1トラックをシステム用に確保しています)からCold Start Loaderを読込んで起動するだけの機能なので作成は簡単なのですが、ブレッドボード上で回路を組んでいるため、ハードが不安定になることが度々あり、その都度、原因調査と対策をして時間が掛かりました(何度か安定化したといっているのでオオカミ少年状態です(少年ではないのですがw))
 ブレッドボードで評価する時は、次回から新しいブレッドボードを使い、結線の線材も自作するなど、検討した方がいいかもしれません。

 話をBootstrapに戻すとシステムトラック上のBootstrapとCold Boot Loaderの配置はSDカードのブロックサイズが512bytesであることを考慮してCold Boot Loaderのヘッダを除く、コード部を0200H(2ブロック目)から配置しました。
 Bootstrapは先頭の128バイトに収めます。
   ; ++++ SD block assign ++++
   ;
   ;  blk No  adr  length  content
   ;    0    0000H   80H    Bootstrap
   ;    0    0080H  100H    not use
   ;    0    0180H   80H    ColdStartLoader's header
   ;    1    0200H  nnnn    code of ColdStartLoader
   ;   ...

 Bootstrapのソースは短いので全リストを貼っておきます。

Pic24V20でのCP/M-86用Bootstrap(アセンブラ)
CP/M ASM86 1.1 SOURCE: BOOTV20.A86 Pic24V20 booter PAGE 1 title 'Pic24V20 booter' ;++++++++++++++++++++++++++++++++++++++ ; Pic24V20 CP/M-86 booter for CpmLoader ; Ver 0.01 2019/08/27 skyriver ;++++++++++++++++++++++++++++++++++++++ 0080 SEC_SIZE EQU 128 ; sector size 0200 SdBufSz EQU 512 ; SD card block size ; ++++ SD block assign ++++ ; ; blk No adr length content ; 0 0000H 80H this(bootstrap) ; 0 0080H 100H not use ; 0 0180H 80H ColdStartLoader's header ; 1 0200H nnn code of ColdStartLoader ; ... ; ; ++++ memory assign definition ++++ 0000 BooterSeg EQU 0 ; booter segment 0380 BooterStart EQU 0380H ; booter start address 0400 LoaderSeg EQU 0400H ; CpmLoader segment 000B LoaderBlk EQU (( 1600H + SdBufSz - 1) / SdBufSz ) ; ++++ CpmLoader entry ++++ 1200 bios_code EQU 1200h ;start of LDBIOS 0003 ccp_offset EQU 0003h ;base of CPMLOADER 0406 bdos_ofst EQU 0406h ;stripped BDOS entry 000D cr EQU 0dh ;carriage return 000A lf EQU 0ah ;line feed 0000 CSEG BooterSeg ORG BooterStart ;++++++++++++++++++++++++++++++++++++ ; PIC interface ;++++++++++++++++++++++++++++++++++++ ; memory assign ; ffde0 ffde:0000 SD buf 512bytes ; fffe0 ffde:0200 work area 16 bytes ; ffff0 ffff:0000 reset jump ; FFDE PWrkSeg EQU 0FFDEH ; function No. 0000 FC_EXIT EQU 0 ; EXIT CP/M 0001 FC_CONST EQU 1 ; CONST 0002 FC_CONIN EQU 2 ; CONIN 0003 FC_CONOUT EQU 3 ; CONOUT 0004 FC_READ EQU 4 ; READ SD Card 0005 FC_WRITE EQU 5 ; WRITE SD Card 0006 FC_PUNCH EQU 6 ; PUNCH 0007 FC_READER EQU 7 ; READER 0000 SdBuf EQU 0 ; SD buffer offset 0200 PicWrk EQU SdBuf + SdBufSz ; Pic I/F work area 0200 FuncNo EQU PicWrk ; RB 1 ; function No 0201 CoData EQU FuncNo + 1 ; RB 1 ; conout data 0202 SdSec EQU CoData + 1 ; RB 4 ; SD block No. 0206 RetVal EQU SdSec + 4 ; RB 2 ; return value 0208 PreSd EQU RetVal + 2 ; RB 4 ; previos SD block No. 020C ChgFlg EQU PreSd + 4 ; RB 1 ; buffer change flag for Blocking/Deblocking 020D BlkCnt EQU ChgFlg + 1 ; RB 1 ; Block first write counter ; *** offset from PicWrk *** 0000 oFuncNo EQU FuncNo - PicWrk 0001 oCoData EQU CoData - PicWrk 0002 oSdSec EQU SdSec - PicWrk 0006 oRetVal EQU RetVal - PicWrk 0008 oPreSd EQU PreSd - PicWrk 000C oChgFlg EQU ChgFlg - PicWrk 000D oBlkCnt EQU BlkCnt - PicWrk 0380 FA Start: CLI 0381 8CC8 MOV AX,CS 0383 8ED0 MOV SS,AX 0385 B8DEFF MOV AX,PWrkSeg 0388 8ED8 MOV DS,AX 038A B80004 MOV AX,LoaderSeg 038D 8EC0 MOV ES,AX 038F BC0604 MOV SP,offset stkbase 0392 FC CLD ;set forward direction 0393 BB0002 MOV BX,PicWrk ; PIC I/F work 0396 BA0B80 MOV DX,08000H + LoaderBlk ; DL : load blk counter 0399 BEE703 MOV SI,offset StMsg 039C E83400 03D3 CALL Puts 039F C60704 MOV BYTE PTR oFuncNo[BX],FC_READ 03A2 C747020100 MOV WORD PTR oSdSec[BX],1 ; set first blk No. 03A7 BF0000 MOV DI,0 03AA EE LOOP: OUT DX,AL ; read SD Block 03AB 8A4706 MOV AL,oRetVal[BX] ; get return value 03AE 84C0 TEST AL,AL 03B0 751A 03CC JNZ ERR 03B2 BE0000 MOV SI,SdBuf 03B5 B90001 MOV CX,SdBufSz / 2 03B8 F3A5 REP MOVSW 03BA FE4702 INC BYTE PTR oSdSec[BX] 03BD FECA DEC DL 03BF 75E9 03AA JNZ LOOP 03C1 BEF403 MOV SI,offset OkMsg 03C4 E80C00 03D3 CALL Puts 03C7 EA00120004 JMPF Init ; error handler 03CC BEF703 ERR: MOV SI,offset ErrMsg 03CF E80100 03D3 CALL Puts 03D2 F4 HLT ; put string on console ; SI <- string adr 03D3 C60703 Puts: MOV BYTE PTR oFuncNo[BX],FC_CONOUT 03D6 2E8A840000 Puts10: MOV AL,CS:[SI] 03DB 0AC0 OR AL,AL 03DD 7407 03E6 JZ PutsEn 03DF 884701 MOV BYTE PTR oCoData[BX],AL 03E2 46 INC SI 03E3 EE OUT DX,AL 03E4 EBF0 03D6 JMPS Puts10 03E6 C3 PutsEn: RET 03E7 6C6F6164696E StMsg DB 'loading ... ',0 67202E2E2E20 00 03F4 6F6B00 OkMsg DB 'ok',0 03F7 6572726F7200 ErrMsg DB 'error',0 03FD CodEnd EQU offset $ ORG ( offset $ + 1 ) AND 0FFFEH 03FE RW 4 0406 stkbase EQU offset $ 0400 CSEG LoaderSeg ORG bios_code Init: ; loader bios Init entry END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 1%

★2019/11/16 変更 Bootstrapリストを最新版に変更

 ハードが安定している時には、CP/M-86の起動がメチャ楽になりました。
 電源投入時からCP/M-86起動までのサンプルログを以下に示します。
 下記のサンプルログでは手動でCP/M-86を起動していますが、picle言語で書いたCP/M-86booterを自動起動するように設定すれば電源オンでCP/M-86が起動するようになります。

BootstrapでのCP/M-86の起動
picle compiler CP/M-86 Ver0.01 2019/07/03 by skyriver :¥¥ +B000-BDAB # CP/M-86 boot 2019/08/23 +C000-CC8D #LibCpm CP/M86(PMP) v0.01 2019/08/17 +D000-DEEB #LibSpi SPI lib V0.04 for CP/M86 2019/08/16 +E000-E4F6 # Memory check executer 2019/08/19 +F000-FC43 # Pic24V20 HexLoader v0.02 2019/08/12 :¥< 3499 :run ... loading Pic24V20 CP/M-86 Version 2.2 Segment Address = 0040 Last Offset = 31FF System Generated by skyriver 2019/08/14 A>dir A: ASM86 CMD : ASSIGN CMD : CONFIG CMD : CPM SYS A: DATA PFK : DDT86 CMD : DSKMAINT CMD : ED CMD A: FUNCTION CMD : GENCMD CMD : HELP CMD : HELP HLP A: PIP CMD : PRINT CMD : SETUP CMD : STAT CMD A: SUBMIT CMD : TOD CMD A>dir p: NO FILE A>stat A: RW, Free Space: 1,780k P: RW, Free Space: 1,944k A>


★2019/09/07 追記
 CP/M-86用のデジタルリサーチ社製Cコンパイラでhello表示してみた。
 stdio.hの67行目でエラーが発生しましたがリンク後起動したところ、hello表示できました。

DRCでhello
B>type hello.c #include <stdio.h> main() { printf("Hello!"); } B>drc hello -------------------------------------------------- Digital Research C 04/17/84 Version 1.11 Serial No. 3073-0000-001282 All Rights Reserved Copyright (c) 1983,1984 Digital Research, Inc. -------------------------------------------------- Digital Research C Version 1.11 -- Preprocessor stdio.h:67: Illegal operator in constant expression Digital Research C Version 1.11 -- Code Gen hello.c: code: 14 static: 7 extern: 160 B>link86 hello=hello -------------------------------------------------- LINK-86 Linkage Editor 19 March 1984 Version 1.4 Serial No. 3073-0000-001282 All Rights Reserved Copyright (C) 1982-1984 Digital Research, Inc. -------------------------------------------------- CODE 05ADD DATA 00EA8 STACK 00000 USE FACTOR: 17% B>a:stat hello.* Drive B: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW B:HELLO .C 213 28k 2 Dir RW B:HELLO .CMD 5 2k 1 Dir RW B:HELLO .OBJ 4 2k 1 Dir RW B:HELLO .SYM ---------------------------------------------- Total: 34k 5 B: RW, Free Space: 1,014k B>hello Hello! B>


★2019/09/15 追記
 デジタルリサーチ社の Personal Basic でASCIIARTを動かしてみました。
 Personal Basicはプロンプト行がそのまま入力行になっているためかプログラムからの出力が80文字手前で次の行へ改行してしまうので冒頭にwidth命令を追加して80文字/行に設定しています。

 実行時間は2分5秒でした(V20のクロックは8MHzです)
 因みにマイクロソフトのMBASICでの実行時間は2分42秒でした。
 CP/M-68Kではデジタルリサーチ社のCBASICはBCD演算のためかASCIIARTの実行時間がかなり遅かったのですがCP/M-86ではMSより速いですね。

Personal BasicでのASCIIART実行
E>basic -------------------------------------------------- Personal Basic Version 1.1 Serial No. 3085-0000-000530 All Rights Reserved Copyright (c) 1983 Digital Research, Inc. -------------------------------------------------- Ok merge asciiart Ok list 1 width 80 10 FOR Y=-12 TO 12 20 FOR X=-39 TO 39 30 CA=X*.0458 40 CB= Y*.08333 50 A=CA 60 B=CB 70 FOR I=0 TO 15 80 T=A*A-B*B+CA 90 B=2*A*B+CB 100 A=T 110 IF (A*A+B*B)>4 THEN GOTO 200 120 NEXT I 130 PRINT " "; 140 GOTO 210 200 IF I>9 THEN I=I+7 205 PRINT CHR$(48+I); 210 NEXT X 220 PRINT 230 NEXT Y Ok run 000000011111111111111111122222233347E7AB322222111100000000000000000000000000000 000001111111111111111122222222333557BF75433222211111000000000000000000000000000 000111111111111111112222222233445C 643332222111110000000000000000000000000 011111111111111111222222233444556C 654433332211111100000000000000000000000 11111111111111112222233346 D978 BCF DF9 6556F4221111110000000000000000000000 111111111111122223333334469 D 6322111111000000000000000000000 1111111111222333333334457DB 85332111111100000000000000000000 11111122234B744444455556A 96532211111110000000000000000000 122222233347BAA7AB776679 A32211111110000000000000000000 2222233334567 9A A532221111111000000000000000000 222333346679 9432221111111000000000000000000 234445568 F B5432221111111000000000000000000 864332221111111000000000000000000 234445568 F B5432221111111000000000000000000 222333346679 9432221111111000000000000000000 2222233334567 9A A532221111111000000000000000000 122222233347BAA7AB776679 A32211111110000000000000000000 11111122234B744444455556A 96532211111110000000000000000000 1111111111222333333334457DB 85332111111100000000000000000000 111111111111122223333334469 D 6322111111000000000000000000000 11111111111111112222233346 D978 BCF DF9 6556F4221111110000000000000000000000 011111111111111111222222233444556C 654433332211111100000000000000000000000 000111111111111111112222222233445C 643332222111110000000000000000000000000 000001111111111111111122222222333557BF75433222211111000000000000000000000000000 000000011111111111111111122222233347E7AB322222111100000000000000000000000000000 Ok


★2019/09/22 追記
 CP/M-86はネットから入手できるソフトが思ったより多くないですね^^;
 デジタルリサーチ以外のCコンパイラを探したところ、Aztec Cを見つけました。
 でもincludeでファイルが読めないとのエラーが出てコンパイルできない・・
 CP/M-86が正常に動いていないのか・・

Aztec Cでのコンパイルエラー
C>dir C: ARCV CMD : AS CMD : C LIB : CC CMD C: CCB CMD : CNM CMD : CPM86 ARC : CRC CMD C: CRCLIST : D11 LIB : D20 LIB : DEVRLS DOC C: DIFF CMD : DOS11 ARC : DOS20 ARC : EXMPL C C: G ARC : G LIB : HEADER ARC : HEX86 CMD C: LB CMD : LN CMD : M LIB : M87 LIB C: M87S LIB : MATH ARC : MCH86 ARC : MISC ARC C: OBD CMD : ORD CMD : OVBGN O : OVLD O C: OVLDPATH O : S ARC : S LIB : SQZ CMD C: SROM O : STDIO ARC : STKSIZ C : TERM ARC C: STDIO H : CTYPE H : CTMPA28 638 : CTMPB28 638 C: CTMPC28 638 : CTMPD28 638 : HELLO C : CTMPE28 638 C>type hello.c #include <stdio.h> main() { printf( "Hello!" ); } C>cc hello Aztec C 8086 3.20d 7-18-85 (C) 1982,83,84,85 by Manx Software Systems, Inc. #include <stdio.h> ^ HELLO.c:1: ERROR 47: open failure on include file: C>a:stat stdio.h Drive C: User : 0 Recs Bytes FCBs Attributes Name 10 2k 1 Dir RW C:STDIO .H ---------------------------------------------- Total: 2k 1 C: RW, Free Space: 1,204k C>


★2019/09/22 追記
 上に書いたAztec Cのコンパイルエラーですが、#includeで指定するファイルを<>ではなく""で囲むとエラーが出なくなりました。
 下のログはDRC(デジタルリサーチ社製)とAztecCでのコンパイル状況と実行ファイルのサイズの比較です。
 AztecCの方がかなりコンパクトな実行ファイルを作成してますね。
 まぁもっと大きなプログラムの場合、どうなるかはやってみないと判らないですが・・

Aztec CとDRCとの比較
B>drc hello -------------------------------------------------- Digital Research C 04/17/84 Version 1.11 Serial No. 3073-0000-001282 All Rights Reserved Copyright (c) 1983,1984 Digital Research, Inc. -------------------------------------------------- Digital Research C Version 1.11 -- Preprocessor Digital Research C Version 1.11 -- Code Gen hello.c: code: 14 static: 7 extern: 160 B>link86 hello=hello -------------------------------------------------- LINK-86 Linkage Editor 19 March 1984 Version 1.4 Serial No. 3073-0000-001282 All Rights Reserved Copyright (C) 1982-1984 Digital Research, Inc. -------------------------------------------------- CODE 05ADD DATA 00EA8 USE FACTOR: 17% B>c: C>cc hello Aztec C 8086 3.20d 7-18-85 (C) 1982,83,84,85 by Manx Software Systems, Inc. 8086 Assembler Vers. 3.20d 7-18-85 C>ln hello.o c.lib Aztec C Linker Vers. 3.20d 7-18-85 Base: 0000 Code: 1238 Data: 02d4 Udata: 0200 Total: 001820 C>a:stat b:hello.* Drive B: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW B:HELLO .C 213 28k 2 Dir RW B:HELLO .CMD 5 2k 1 Dir RW B:HELLO .OBJ 4 2k 1 Dir RW B:HELLO .SYM ---------------------------------------------- Total: 34k 5 B: RW, Free Space: 1,018k C>a:stat c:hello.* Drive C: User : 0 Recs Bytes FCBs Attributes Name 1 2k 1 Dir RW C:HELLO .C 46 6k 1 Dir RW C:HELLO .CMD 2 2k 1 Dir RW C:HELLO .O ---------------------------------------------- Total: 10k 3 C: RW, Free Space: 1,180k C>


★2019/10/22 追記
 Aztec Cのコンパイルオプションでインクルードドライブを標準ヘッダファイルのあるドライブ(今回の場合はCドライブ)に指定するとエラーが出なくなりました。

   cc -ic: SrcFileName


★2019/09/23 追記
 AztecCの著作権についてメモしておきます。

 the official AZTEC C onlineのサイトでApple IIとCommondore 64用のAztec Cが公開されていて、このサイト内のLeap into a new dimension with Aztec Cのページで免責事項として次のように記載されています。
 Apple IIとCommondore 64用のAztec Cに関してはfreeで使っていいようです。


Disclaimer

This website and the content available from this website unless otherwise noted are original or derivative works and as such the licencing by the original authors applies insofar as legal Copyright ownership applies. Bill Buckels makes no claims of ownership whatsoever for the content available from this website unless otherwise noted, and further assumes no liability for the results of its use.

You may use the content available from this website in any way you find useful (subject to all the aforestated conditions of use) and provided that you agree that Bill Buckels has no warranty obligations or liability resulting from said use in any way whatsoever. If you do not agree or if your use is not Fair then do not download from this website .



 google翻訳が下記で「所有権を一切主張せず」とあるので少なくともこのサイトで公開されているApple IIとCommondore 64用のコンパイラに関しては自由に使えるようです。


免責事項

このウェブサイトおよびこのウェブサイトから入手可能なコンテンツは、特に明記しない限り、オリジナルまたは二次的著作物であり、著作権の法的所有権が適用される限り、オリジナル著者によるライセンスが適用されます。ビル・バックルズは、特に明記しない限り、このウェブサイトから入手可能なコンテンツの所有権を一切主張せず、さらにその使用結果について責任を負いません

このウェブサイトから入手できるコンテンツは、有用と思われる方法で使用することができます(すべての植林された使用条件に従うものとします)。また、Bill Buckelsが何らかの方法で上記の使用に起因する保証義務または責任を負わないことに同意するものとします。同意しない場合、または使用が公正でない場合は、このWebサイトからダウンロードしないでください 。




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

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

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。