ユーザ用ツール

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
mz-700 [2023/12/06 13:00] – [MZ-800の初期化処理について] arakimz-700 [2026/07/16 07:35] (現在) – [MZ-800エミュレータでMZ-700のIPLを使う] araki
行 2: 行 2:
  
 ===== 概要 ===== ===== 概要 =====
 +
 +{{:undefined:mz721.jpg?400|}}
 ===== MZ-800エミュレータでMZ-700のIPLを使う ===== ===== MZ-800エミュレータでMZ-700のIPLを使う =====
  
行 10: 行 12:
 但し、正しい作法を守れば、という条件がついている。 但し、正しい作法を守れば、という条件がついている。
 単純に、MZ-700のIPLを与えれば動くというものではないので、ここではその作法について説明する。 単純に、MZ-700のIPLを与えれば動くというものではないので、ここではその作法について説明する。
 +
 +なお、mz-800emuは2.0.x-previewから mz700emu-ntsc, mz700emu-pal, mz1500emu もビルドできるようになっており、それぞれの機種向けのROMも内包している。((ただしライセンス的に白かどうかは不明。MZ-1500に関しては、書籍でIPLが完全公開されているので問題はないかもしれないが。))
 +
 +ただし、実機から吸い出したROMを使用する場合は、たとえmz700emu-ntscであっても、以下で説明しているパッチを適用する必要がある。
  
 ==== MZ-800をMZ-700のようになるまで初期化する ==== ==== MZ-800をMZ-700のようになるまで初期化する ====
行 131: 行 137:
 幸い、1Z-009Aの8253/8255の初期化はほぼ初めに行われるため、モニターのエントリーポイントではなく、この処理の直後に、IPL2.ROM側から戻してやることで、システムの状態を正しく保ったまま処理を継続させることができる。 幸い、1Z-009Aの8253/8255の初期化はほぼ初めに行われるため、モニターのエントリーポイントではなく、この処理の直後に、IPL2.ROM側から戻してやることで、システムの状態を正しく保ったまま処理を継続させることができる。
  
 +==== 初期化コード ====
 +
 +上記の処理を以下のように実装した。
 +
 +<code>
 +;===========================
 +; MZ-800 to MZ-700
 +;===========================
 +        .z80
 +        org     0e800h
 +mz700   equ     00052h  ; do not return to 004ah
 +stack   equ     010f0h
 +cgrom   equ     01000h
 +pcgram  equ     0c000h
 +mset53  equ     00308h
 +
 +entry:
 +        di
 +        im      1               ; set interrupt mode to 1
 +
 +        ld      a,8             ; set MZ-700 mode
 +        out     (0ceh),a
 +        ld      a,1             ; set CRTC to MZ-700 mode
 +        out     (0cdh),a
 +        out     (0cch),a
 +        out     (0e4h),       ; set memory map
 +        ld      sp,stack        ; initialize stack pointer
 +        ; init 8255
 +        ld      a,08ah
 +        ld      (0e003h),     ; set 8255 to MZ-700/800/1500 mode
 +        ld      a,1
 +        ld      (0e003h),     ; enable clock supply to SN76489AN
 +        ld      a,5
 +        ld      (0e003h),     ; enable timer interrupt
 +        ; init 8253
 +        ld      de,0
 +        call    mset53
 +        ; init PIO
 +        ld      bc,04fch
 +        ld      hl,piodat
 +        otir
 +        ld      bc,04fdh
 +        otir
 +        ; init SIO
 +        ld      a,1
 +        out     (0f7h),a
 +        xor     a
 +        out     (0f7h),a
 +        ; init PSG (SN76489AN)
 +        ld      b,4
 +        ld      a,09fh
 +psgset:
 +        out     (0f2h),a
 +        add     a,020h
 +        djnz    psgset
 +        ; init screen
 +        ld      hl,0d800h
 +        ld      de,0d000h
 +        ld      bc,0400h
 +cls_loop:
 +        ld      (hl),71h        ; set fgc=7/bgc=1
 +        inc     hl
 +        xor     a
 +        ld      (de),         ; erase vram
 +        inc     de
 +
 +        dec     bc
 +        ld      a,b
 +        or      c
 +        jr      nz,cls_loop
 +
 +        ; copy CGROM to PCG
 +        in      a,(0e0h)
 +        ld      de,pcgram
 +        ld      hl,cgrom
 +        ld      bc,1000h
 +        ldir
 +        in      a,(0e1h)
 +
 +        jp      mz700
 +
 +        org     0e900h
 +piodat  db      000h,0cfh,03fh,007h,000h,0cfh,000h,007h
 +
 +        end
 +</code>
  

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information