日立 MB-6892レベル3 VRAMエリアが移動できるか確認してみる その2

Last Updated on 2020年4月2日 by kabekin

皆さんから頂いた情報を整理するとカラーRAMの関係でレベル3では気軽にVRAMエリアを移動できないことが分かりました。
しかし、CRTCのパラメータを変更後の画面の乱れはBASICのワークエリアにパラメータをセットすることで正常になりました^^;;;

今後、何かの参考になるかもしれないので実験内容をメモしておきます^^

* CRTC 初期化実験 HD46505SP
* 参考:マイコンピュータ誌 No.8 CRTC(HD46505)とその使い方
* Lv.3 CRTCセットとワークエリアセット+パラメータテーブル手直し
* Lv.4 R8パラメータ変更とカーソル再表示
 IF 0
  電源オン時のグラフィックモード(L3Emu)
  インタレース/ノンインタレースが画面で分かるようにするには[画面]-[描画モード]-[走査線]を選択
  MODESW_OFF=40文字,ハイレゾ,インターレース = NEWON3
  MODESW_ON =80文字,ハイレゾ,インターレース = NEWON7
  ■スクリーンモード (L3)
 ┌─────┬──────────┬──────────┐
 │          │          SCREEN0  │        SCREEN1   │
 │          │      ノーマルモード│    ハイレゾモード │
 │          │       解像度 メモリ│    解像度  メモリ │
 ├─────┼──────────┼──────────┤
 │WIDTH 40  │NEWON11  80*100 1KB │NEWON3 320*200  8KB │
 │WIDTH 80  │NEWON15 160*100 2KB │NEWON7 640*200 16KB │
 └─────┴──────────┴──────────┘
  インタレースモード SCREEN,,0
  ノンインタレースモード SCREEN,,1
  ■I/Oアドレス
  $FFC6 CRTC アドレスレジスタ(W)
  $FFC7 CRTC データレジスタ(R/W)
 $FFD6 インターレースフラグ Bit3=1でインタレース,0でノンインタレース
 $FFD0 画面/ACIAモード
  CRTCにデータをストアする部分 $FB7B
  $FFDOにライトしている部分 $FB28
  ■CRTC(HD46505SP)レジスタパラメータ(L3)
 ┌─────────┬─────────────┬─────────────┐
 │水平文字数        │           40文字        │          80文字         │
 │NEWON             │     NEWON3       NEWON11 │    NEWON7       NEWON15  │
 │                  │     HIRESO       NORMAL  │    HIRESO       NORMAL   │
 │解像度            │     320*200      80*100  │    640*200      160*100  │
 │SCREEN,,1/,,0     │ノンインタ インタレース  ノンインタ インタレース│ノンインタ インタレース  ノンインタ インタレース│
 │MODE-SEL FFD0     │ $00   $00     $40   $40  │ $80    $80    $C0   $C0  │
 │MODE              │        0                 │         1                │
 ├─────────┼─────────────┼─────────────┤
 │R0  水平総文字数  │       $3F           $3F  │        $7F         $7F   │
 │R1  水平表示文字数│       $28           $28  │        $50         $50   │
 │R2  水平同期位置  │       $31           $31  │        $5F         $5F   │
 │R3  同期パルス幅    │       $85           $85  │        $8A         $8A   │
 │R4  垂直総文字数  │       $1F           $1F  │        $1F         $1F   │
 │R5  トータルラスタアジャスト │       $06           $06  │        $06         $06   │
 │R6  垂直表示文字数│       $19           $19  │        $19         $19   │
 │R7  垂直同期位置  │       $1C           $1C  │        $1C         $1C   │
 │R8  インタレース&スキュー   │ $40   $43     $40   $43  │ $40    $43    $40  $43   │
 │R8※インタレース&スキュー   │ $80   $83     $80   $83  │ $80    $83    $80  $83   │
 │R9  最大ラスタアドレス  │ $07   $0E     $07   $0E  │ $07    $0E    $07  $0E   │
 │R10 カーソルスタートラスタ   │ $27   $2A     $27   $2E  │ $27    $2E    $27  $2E   │
 │R11 カーソルエンドラスタ   │ $07   $0F     $07   $0F  │ $07    $0F    $07  $0F   │
 │R12 スタートアドレス(H)  │ $04   $04     $04   $04  │ $04    $04    $04  $04   │
 │R13 スタートアドレス(L)  │ $00   $00     $00   $00  │ $00    $00    $00  $00   │
 │R14 カーソル(H)       │ $04   $04     $04   $04  │ $04    $05    $04  $04   │
 │R15 カーソル(L)       │ $00   $00     $00   $00  │ $00    $18    $00  $00   │
 │R16 ライトペン(H)     │       N/A           N/A  │        N/A         N/A   │
 │R17 ライトペン(L)     │       N/A           N/A  │        N/A         N/A   │
 └─────────┴─────────────┴─────────────┘
  上記のノンインタレースはインタレース→ノンインタレースに変更したときの値
 ノンインタレースからインタレースに変更したときもR8~R15までのみストアしていた→R0~R7は同様なのでINIT時のみストア?
 WIDTH80⇔WIDTH40の変更ではR0~R3とR12~R15がストアされた
 ■BASICワークエリア
 $00A2 = 文字数(40/80)
 $00A3,A4 = VRAM開始アドレス(CRTC R12,R13と同じ)
 $00A7 = スクリーンモード($00=40字NORMAL, $01=80字NORMAL, $02=40字HIRESO, $03=80字HIRESO
これを踏まえて整理すると
 R4~R7は全モード共通
 グラフィック解像度はMODE-SELの違いのみでCRTCパラメータの違いはない
 R10,R11,R14,R15はカーソル表示用←設定パラメータではない
 R12,R13はVRAMの先頭アドレス
 $FFD6のインタレースフラグや$FFD0の画面/ACIAモードのI/Oも設定が必要
 CRTCのパラメータのみでなくBASICのワークエリアの変更も必要
 ENDIF
 TTL CRTC INIT PROGRAM(L3)
lNTLCE  EQU  $FFD6   ;インターレースフラグ Bit3=1でインタレース,0でノンインタレース
MODESEL EQU  $FFD0   ;画面/ACIAモード
CRTCAR  EQU  $FFC6   ;CRTCアドレスレジスタ
CRTCDR  EQU  $FFC7   ;CRTCデータレジスタ
BASWK1  EQU  $00A2   ;L3BASIC WORK 文字数
BASWK2  EQU  $00A3   ;L3BASIC WORK VRAM先頭
BASWK3  EQU  $00A7   ;スクリーンモード
BASWK4  EQU  $0115   ;カーソルモード
 ORG $0000  ;L3には$5000~ロード
 BRA START
START EQU *
*CRTCセット
 LDY #CRTCAR  ;CRTCアドレスセット
* LEAX TBL40F,PCR
 LEAX TBL80F,PCR
 BSR PARAMSET
 LEAX TBLCOM1,PCR
 BSR PARAMSET
 LEAX TBLNIL,PCR
* LEAX TBLIL,PCR
 BSR PARAMSET
* LEAX TBL40S,PCR
 LEAX TBL80S,PCR
 BSR PARAMSET
* インタレース設定
 LDA #$00  ;ノンインタレース
* LDA #$08  ;インタレース
 STA lNTLCE
* MODE-SELセット
* LDA #$40  ;80文字 HIRESO
 LDA #$80  ;80文字 HIRESO
 STA MODESEL
*BASICワークエリアセット
* LDA #40
 LDA #80
 STA BASWK1  ;文字数
 LDD #$0400
 STD BASWK2  ;VRAM先頭
* LDA #2
 LDA #3
 STA BASWK3  ;スクリーンモード
 LDA #$FF
 STA BASWK4  ;カーソルモード
 RTS
*CRTCにパラメータをセットSub.
*X=PARAMテーブルのポインタ
*Y=CRTCのアドレスL
PARAMSET EQU *
 PSHS D,X,Y
 LDA ,X+  ;CRTC RegNo取得
LP1 LDB ,X+  ;CRTS PARAMを取得
 CMPB #$FF
 BEQ FIN
 STA ,Y
 INCA
 STB 1,Y
 BRA LP1
FIN PULS D,X,Y,PC
* CRTCパラメータテーブル(L3)
TBL40F  FCB $00,$3F,$28,$31,$85,$FF          ;40文字モードパラメータ1(R0~R3)
TBL80F  FCB $00,$7F,$50,$5F,$8A,$FF          ;80文字モードパラメータ1(R0~R3)
TBLCOM1 FCB $04,$1F,$06,$19,$1C,$FF          ;共通パラメータ1(R4~R7)
TBL40S  FCB $0A,$27,$07,$04,$00,$04,$00,$FF  ;40文字モードパラメータ2(R10~R15)
TBL80S  FCB $0A,$2A,$0F,$04,$00,$04,$00,$FF  ;80文字モードパラメータ2(R10~R15)
TBLIL   FCB $08,$83,$0E,$FF                  ;インタレースモード(R8~R9)
TBLNIL  FCB $08,$80,$07,$FF                  ;ノンインタレースモード(R8~R9)
 END

BASICのROMを使わずにCRT出力の処理を実装しようと調べていたのですが、
CRTCのパラメータを直接変更後にBASICのワークエリアをセットしないといけないのが悩ましいところ・・・
とりあえず、CRTCパラメータの設定方法が分かったので勉強になりました^^
皆様情報ありがとうございます
しかし、レベル3でFLEX9やOS-9,CP/Mを使う場合のVRAMの扱いはどうやるんだろう・・・
謎が深まります^^;;;
そんな、レベル3 VRAM関連調査の記録・・・


残件
CRTCパラメータ設定時にR14,R15(カーソル) を$0400にしても、何も設定しなくてもカーソルが出なくなる

4件のコメント

  1. ふと思ったのですが・・・
    CP/Mの場合はZ80のRAMは6809のと共有だとして(ホントはどうなっているんでしょうか?)
    HW的にVRAMの領域がZ80アドレス空間の後ろになるように配置されているとか・・・
    それともS1みたいにVRAMとかI/O領域は一切持たず、64KBすべてRAMとか??
    どうですかね?

    1. これからチャレンジしようとしているレベル3用のCP/M80はハドソンのHuEngineというZ80カード内に64KBのRAMを持っておりますのでS1-CP/M80と同じようにI/O領域を持たないものになっています。
      この場合はTPAはZ80カード内の64KB RAMにロードするのでS1と同じような感じでVRAMは邪魔にならないと思われます。
      しかしFLEX9を想定した場合、FM7と同じで$A000以降はRAMとROMでバンク切替できるのですが0~$7FFFのRAMは1本の連続したRAMでバンク切替や空間切替はできない認識です^^
      マーク2でもバンク切替できるのは$A000以降なのでVRAMのある$0400~$4400の裏にはRAMが無いことから、どのようにしてFLEX9やOS-9を動かしていたのか謎です^^;;;
      私のマーク5は64KB拡張RAMが付いているので、これなら頑張れば移植できるかもしれません(^^;;;

    1. R8のパラメータを変更することでカーソルのズレが解決できました!
      カーソルの表示が出ないのはCRTCのパラメータ(カーソル位置)の問題ではなくワークエリアの$115に値を書くことで表示できました。
      動作の確認が取れましたので上記の実験プログラムR8のパラメータを$8xに変更したものに修正致しています。
      カーソルのズレていないレベル3はいいですね^^;;

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください