質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

VESA画面モードについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,082
退会済みユーザー

退会済みユーザー

原因わかりませんが、仮想OSの違いによって出力結果が全く違います。
どうやって直せるのか解説など宜しくお願いします。

【仮想OS】
Oracle VM VirtualBox
VMware Workstation

【現状】
※例え:画面モード 0x011B (1280x1024x32)
Oracle VM VirtualBoxの場合、表示部分は問題ないが、画面サイズの縦横が逆になっている
VMware Workstationの場合、画面サイズと表示が全く違う

【スクリーンショット】
Oracle VM VirtualBox
イメージ説明VMware Workstaion
![イメージ説明
【一部ソース】
テストとして、色を適当に出力するようになっております。
CODE_DESC        EQU 0x08
DATA_DESC        EQU 0x10
VIDEO_MODE_NUM    EQU 0x011B
VGA_MODE        EQU 0x0013

VMODE                    EQU 0x0FE0
COLOR                    EQU 0x0FE2
MEMORY_MODEL            EQU 0x0FE3
SCRN_X                    EQU 0x0FE4
SCRN_Y                    EQU 0x0FE6
WINDOW_A_OFFSET            EQU 0x0FE8
WINDOW_B_OFFSET         EQU 0x0FEA
ONE_LINE_VRAM_BYTES        EQU 0x0FEC
VRAM                    EQU 0x0FF0
VRAM_OUT_SCRN_OFFSET    EQU 0x0FF4
VRAM_OUT_SCRN_SIZE        EQU 0x0FF8


[BITS 16]

ORG 0xC200

JMP OS

%include "VGA.inc"
%include "GDT.inc"
%include "A20.inc"

OS:
        CLI
        ;初期化
        XOR AX, AX
        XOR BX, BX
        XOR CX, CX
        XOR DX, DX
        MOV DS, AX
        MOV ES, AX
        MOV    AX, 0x9000        ; スタックポインタを0x0009FFFFに設定する
        MOV    SS, AX
        MOV    SP, 0xFFFF
        STI
        ;VESA詳細取得
        MOV AX, 0x9000
        MOV ES, AX
        MOV DI, 0
        MOV AX, 0x4F00
        INT 0x10
        CMP AX, 0x004F
        JNE .VGA
        
        MOV AX,[ES:DI+4]
        CMP AX, 0x0200
        JB .VGA
        
        ;VESA画面モード情報取得
        MOV CX, VIDEO_MODE_NUM
        MOV AX, 0x4F01
        INT 0x10
        CMP AX, 0x004F
        JNE .VGA
        
        ;VESA画面モード設定
        MOV BX, VIDEO_MODE_NUM
        MOV AX, 0x4F02
        INT 0x10 
        
        ;画面モード情報保持
        MOV SI, DI
        MOV DX, VIDEO_MODE_NUM; 現在の画面モード
        MOV WORD [VMODE], DX
        MOV DX, WORD [ES:SI+0x08]; Window A 開始アドレス
        MOV WORD [WINDOW_A_OFFSET], DX
        MOV DX, WORD [ES:SI+0x0A]; Window B 開始アドレス
        MOV WORD [WINDOW_B_OFFSET], DX
        MOV DX, WORD [ES:SI+0x10]; 1ラインのVRAM上のバイト数
        MOV WORD [ONE_LINE_VRAM_BYTES], DX
        MOV DX, WORD [ES:SI+0x12]; X 解像度
        MOV WORD [SCRN_X], DX
        MOV DX, WORD [ES:SI+0x14]; Y 解像度
        MOV WORD [SCRN_Y], DX
        MOV DL, BYTE [ES:SI+0x19]; カラービット
        MOV BYTE [COLOR], DL
        MOV DL, BYTE [ES:SI+0x1B]; メモリモデル    0x00=テキスト
        MOV BYTE [MEMORY_MODEL], DL;                0x01=CGAグラフィック
                                   ;                0x02=Hercules グラフィック
                                   ;                0x03=EGA 16 カラー
                                   ;                0x04=Packed ピクセル (256パレット)
                                   ;                0x05=チェーンなしの256カラーモード
                                   ;                0x06=15bit, 16bit, 24bit ダイレクトカラー
                                   ;                0x07=YUV
        MOV EDX, DWORD [ES:SI+0x28]; VRAMベースアドレス
        MOV DWORD [VRAM], EDX
        MOV EDX, DWORD [ES:SI+0x2C]; 画面外の先頭VRAMオフセット
        MOV DWORD [VRAM_OUT_SCRN_OFFSET], EDX
        MOV DX, WORD [ES:SI+30]; 画面外のVRAMのサイズ(KB単位)
        MOV WORD [VRAM_OUT_SCRN_SIZE], DX
        
        JMP .VIDEO_After
        
        ;VGA画面モード設定
        .VGA:
        CALL SET_VIDEO_VGA
        
        ;画面モード情報保持
        MOV WORD [VMODE], 0x0013;現在の画面モード
        MOV WORD [SCRN_X], 320
        MOV WORD [SCRN_Y], 200
        MOV BYTE [COLOR], 8
        MOV DWORD [VRAM], 0x000A0000
        
        .VIDEO_After:
        MOV AX, 0xF002
        INT 0x16
        CALL InstallGDT;GDT設定
        CALL Enable_A20;A20以上有効
        
        CLI
        MOV EAX, CR0
        OR EAX, 1
        MOV CR0, EAX
        JMP CODE_DESC:OS32

fin:
        HLT
        JMP fin

[BITS 32]

OS32:
        ;初期化
        MOV AX, DATA_DESC; DATA_DESCには0x10が入っています
        MOV SS, AX; 以下データセグメントセレクタを入れています
        MOV ES, AX
        MOV DS, AX
        
        MOV ESP, 0x90000; スタックポインタも初期化します
        
        XOR AX, AX
        MOV FS, AX
        MOV GS, AX
        
        
        MOV EDX, DWORD [VRAM]
        MOV EDI, EDX
        XOR EAX, EAX
        MOV ECX, EAX
        MOV EDX, EAX
        
        ;X*3+Y*(X*3), 3=RGB 0x00RRGGBB
        
        MOV AX, WORD [SCRN_X]
        MOV CX, 3
        MUL CX
        MOV CX, AX
        
        MOV AX, WORD [SCRN_Y]
        MUL CX
        MOV CX, DX
        SHL ECX, 16
        MOV CX, AX
        MOV EDX, ECX
        
        XOR EAX, EAX
        MOV ECX, EAX
        MOV EAX, 0x00000000
        
        .looper:
        MOV DWORD [EDI+ECX], EAX
        ADD ECX, 3
        
        CMP ECX, EDX
        JBE .looper
        XOR ECX, ECX
        ADD EAX, 273105
        CMP EAX, 0x00FFFFFF
        JBE .looper
        XOR EAX, EAX
        JMP .looper

        JMP fin32
        
fin32:
        HLT
        JMP fin32

汚いソースコードですが、どうか宜しくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

ビデオモードのサイズをより小さいの方にしたら、問題なくできました。
VMwareは32bit/24bitは何故か使えませんが、8bitモードにして、カラーパレットを設定したら、問題なくでました。回答してくれた方、自己解決してしまい申し訳ございません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

VirtualBoxの方しか見つけられなかったですが、仮想OSの方にVESAの解像度は設定されていますか?

参考: 9.8. Advanced display configuration 9.8.1. Custom VESA resolutions

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る