SSブログ
English Version

CP/M-80でのBIOSエミュレートによるMBASICの起動 [Z80]

 Twitter のタイムラインで CP/M-80 版 MBASIC は BIOS のコンソール入出力機能のみでも基本動作はするという情報を見かけたので確認して見ました。

 最近使っている 20MHz 動作の Z80PicCompactの開発機は CP/M が自動起動する設定にしているので、「CP/M用hexローダーの製作」の記事で紹介した HexLoader を使ってヘキサファイルをロードして実験しました。

 MBASICを起動するためにはBIOS のコンソール関連の実装以外に下記の項目への対応が必要でした。
  1. BDOS コールアドレスの設定
     MBASIC は BDOS コール(0005H)部分の BDOS アドレスを参照して、BDOSCCP 領域も使用するので BDOS コール用のジャンプ命令を設定する必要がある。
    ★修正 2023/05/17
     MBASIC はディスクアクセス機能が必要なので BDOS 領域は壊さないことを確認しました。


  2. コマンドパラメータ無しの設定
     MBASIC は起動時に 0080H 部分にあるコマンドパラメータを参照してパラメータがある場合、ソースをロードしようとします。0080H を 00H に設定することでパラメータが無い状態にします(この部分は上記の HexLoader が使用するメモリなのでこのために HexLoader をアップデートしました)

上記の項目を対応することで無事 MBASIC が起動するようになりました。

 殆ど処理が無いですが、ソースは下記になります。

CP/M BIOS エミュレータのソース
; CP/M-80 for Z80PicCompact ; Ver 0.01 2023/01/14 by skyriver ; based on CP/M-80 bios for Z80GAL ; Ver 0.01 2020/11/07 by skyriver ; Ver 0.02 2021/10/02 by skyriver ; save BC-reg at CONOUT ; test for Emurate CP/M BIOS environment 2023/05/15 ;++++ CP/M parameter ++++ 0006 MAXDSK EQU 6 ;number of drives. 0040 MAX_SEC EQU 64 ;sectors/track 0006 MAX_SIF EQU 6 ; MAX_SEC = 1 << MAX_SIF 002E MSIZE EQU 46 ;size of available RAM in KB 6800 BIAS EQU (MSIZE-20) * 1024 9C00 CCP EQU 3400H+BIAS ;base of cpm ccp A406 BDOS EQU CCP+806H ;base of bdos B200 BIOS EQU CCP+1600H ;base of bios 0004 CDISK EQU 0004H ;current disk number (0 ... 15) 0003 IOBYTE EQU 0003H ;intel iobyte 0080 BUFF EQU 0080H ;default buffer address 000D CR EQU 13 000A LF EQU 10 0080 SECSIZE EQU 128 ; sector size 0800 CPMBKSZ EQU 2048 ; CP/M block size 0200 SDBLKSZ EQU 512 ; SD card block size 0038 RSTAD EQU 038H ; interrupt entry adr 0100 CPM_AP EQU 0100H ; CP/M app entry ;++++ Z80PicCompact definition +++++++++++++++++++++++++++++++++++++++ 0000 DATPORT EQU 0 ; data port 0001 CMDPORT EQU 1 ; command port ; +++ status bit allign +++ 0001 RXRDY_B EQU 01H 0080 TXRDY_B EQU 80H 0002 SDERR_B EQU 02H ; +++ mode command +++ 0001 SIO_CHAR EQU 1 ; char mode 0002 SIO_STR EQU 2 ; put string 0003 SD_SECT EQU 3 ; set sector 0004 SD_RD EQU 4 ; read block 0005 SD_WRBUF EQU 5 ; write data to buffer 0006 SD_WR EQU 6 ; write block .Z80 0000' ASEG ORG BIOS B200 C3 B256 JP BOOT B203 WBOOTE: B203 C3 B299 JP WBOOT B206 C3 B280 JP CONST B209 C3 B288 JP CONIN B20C C3 B28B JP CONOUT B20F C3 B29A JP LIST B212 C3 B29A JP PUNCH B215 C3 B29A JP READER B218 C3 B29A JP HOME B21B C3 B29A JP SELDSK B21E C3 B29A JP SETTRK B221 C3 B29A JP SETSEC B224 C3 B29A JP SETDMA B227 C3 B29A JP READ B22A C3 B29A JP WRITE B22D C3 B29A JP LISTST B230 C3 B29A JP SECTRAN B233 StMsg: B233 0D 0A 34 DB CR,LF,MSIZE/10+'0' B236 36 DB (MSIZE mod 10) + '0' B237 6B 20 43 50 DB 'k CP/M Ver 2.2 BIOS Emulator' B23B 2F 4D 20 56 B23F 65 72 20 32 B243 2E 32 20 42 B247 49 4F 53 20 B24B 45 6D 75 6C B24F 61 74 6F 72 B253 0D 0A 00 DB CR,LF,0 B256 F3 BOOT: DI B257 ED 56 IM 1 B259 31 0080 LD SP,BUFF ;; XOR A ;; LD (IOBYTE),A ;; LD (CDISK),A ;; LD (SelDk),A B25C 3E C9 LD A,0C9H B25E 32 0038 LD (RSTAD),A B261 21 B233 LD HL,StMsg B264 CD B28F CALL Puts ;; JR GOCPM B267 GOCPM: B267 3E C3 LD A,0C3H B269 32 0000 LD (0),A B26C 21 B203 LD HL,WBOOTE B26F 22 0001 LD (1),HL B272 32 0005 LD (5),A B275 21 A406 LD HL,BDOS B278 22 0006 LD (6),HL B27B 36 C9 LD (HL),0C9H ; return code ;; LD BC,BUFF ;; CALL SETDMA ;; LD A,(CDISK) ;; LD C,A ;; JP CCP B27D C3 0100 JP CPM_AP ; ; check console key data ; A -> 0ffh:data exist 00h:none B280 CONST: B280 DB 01 IN A,(CMDPORT) ; get status B282 E6 01 AND RXRDY_B B284 C8 RET Z ; no data B285 3E FF LD A,0FFH B287 C9 RET ; ; input console ; A -> key data B288 DB 00 CONIN: IN A,(DATPORT) B28A C9 RET ; out console ; C <- data B28B 79 CONOUT: LD A,C B28C D3 00 OUT (DATPORT),A B28E C9 RET ; print string ; HL <- string addr B28F Puts: B28F 7E LD A,(HL) B290 B7 OR A B291 C8 RET Z B292 4F LD C,A B293 CD B28B CALL CONOUT B296 23 INC HL B297 18 F6 JR Puts B299 76 WBOOT: HALT B29A LIST: B29A PUNCH: B29A READER: B29A HOME: B29A SELDSK: B29A SETTRK: B29A SETSEC: B29A SETDMA: B29A READ: B29A WRITE: B29A LISTST: B29A SECTRAN: B29A C9 RETURN: RET END Macros: Symbols: A406 BDOS 6800 BIAS B200 BIOS B256 BOOT 0080 BUFF 9C00 CCP 0004 CDISK 0001 CMDPORT B288 CONIN B28B CONOUT B280 CONST 0800 CPMBKSZ 0100 CPM_AP 000D CR 0000 DATPORT B267 GOCPM B29A HOME 0003 IOBYTE 000A LF B29A LIST B29A LISTST 0006 MAXDSK 0040 MAX_SEC 0006 MAX_SIF 002E MSIZE B29A PUNCH B28F PUTS B29A READ B29A READER B29A RETURN 0038 RSTAD 0001 RXRDY_B 0200 SDBLKSZ 0002 SDERR_B 0004 SD_RD 0003 SD_SECT 0006 SD_WR 0005 SD_WRBUF 0080 SECSIZE B29A SECTRAN B29A SELDSK B29A SETDMA B29A SETSEC B29A SETTRK 0001 SIO_CHAR 0002 SIO_STR B233 STMSG 0080 TXRDY_B B299 WBOOT B203 WBOOTE B29A WRITE No Fatal error(s)


 Twitter に投稿した動画付きメッセージを貼っておきます。上記の BIOS エミュレータ+ MBASIC 本体のHEXファイルをロードすることで MBASIC を起動しています。
 BIOS エミュレータの WBOOT は HALT するようにしてあるので CP/M に戻るために元々の WBOOT(0xfa03)をコールしています。



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

nice! 0

コメント 0

コメントを書く

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