2015-03-01 4 views
3

MCGA поддерживает глубину цвета 4 бит, что составляет 16 цветов. Но когда я пытаюсь напечатать все эти цвета, я получаю только первые 8 из них, а остальные 8 просто дублируют их, как на рис. Ниже. Может быть, я делаю что-то неправильно здесь, или все из-за DOSBox?16 цветов для фона в текстовом режиме MCGA BIOS (AL = 03h)

trying to get all the 16 colors

Код (MASM, под DOSBox 0.74):

TITLE PROGRAM193 
;---------------------------------------------------------- 
     .MODEL  SMALL 
     .STACK  64 
     .DATA   
;---------------------------------------------------------- 
     .CODE 
MAIN PROC FAR 
    MOV  AX, @DATA 
    MOV  DS, AX 

    MOV  AX, 0600h ;AH = 06h (scroll up window) 
    ; black (0) 
    MOV  BH, 0Fh  ;0 (black) background, F (white) text 
    MOV  CX, 0000h ;upper line, left column 
    MOV  DX, 004Fh ;finishing line, right column 
    INT  10h 

    ; blue (1) 
    MOV  BH, 1Fh 
    MOV  CX, 0100h 
    MOV  DX, 014Fh 
    INT  10h 

    ; green (2) 
    MOV  BH, 2Fh 
    MOV  CX, 0200h 
    MOV  DX, 024Fh 
    INT  10h 

    ; cyan (3) 
    MOV  BH, 3Fh 
    MOV  CX, 0300h 
    MOV  DX, 034Fh 
    INT  10h 

    ; red (4) 
    MOV  BH, 4Fh 
    MOV  CX, 0400h 
    MOV  DX, 044Fh 
    INT  10h 

    ; magenta (5) 
    MOV  BH, 5Fh 
    MOV  CX, 0500h 
    MOV  DX, 054Fh 
    INT  10h 

    ; brown (6) 
    MOV  BH, 6Fh 
    MOV  CX, 0600h 
    MOV  DX, 064Fh 
    INT  10h 

    ; light gray (7) 
    MOV  BH, 7Fh 
    MOV  CX, 0700h 
    MOV  DX, 074Fh 
    INT  10h 

    ; ------------------------------- 
    ; | The problem starts up here... | 
    ; ------------------------------- 
    ; dark gray (8) 
    MOV  BH, 8Fh 
    MOV  CX, 0800h 
    MOV  DX, 084Fh 
    INT  10h 

    ; light blue (9) 
    MOV  BH, 9Fh 
    MOV  CX, 0900h 
    MOV  DX, 094Fh 
    INT  10h 

    ; light green (A) 
    MOV  BH, 0AFh 
    MOV  CX, 0A00h 
    MOV  DX, 0A4Fh 
    INT  10h 

    ; light cyan (B) 
    MOV  BH, 0BFh 
    MOV  CX, 0B00h 
    MOV  DX, 0B4Fh 
    INT  10h 

    ; light red (C) 
    MOV  BH, 0CFh 
    MOV  CX, 0C00h 
    MOV  DX, 0C4Fh 
    INT  10h 

    ; light magenta (D) 
    MOV  BH, 0DFh 
    MOV  CX, 0D00h 
    MOV  DX, 0D4Fh 
    INT  10h 

    ; yellow (E) 
    MOV  BH, 0EFh       
    MOV  CX, 0E00h 
    MOV  DX, 0E4Fh 
    INT  10h 

    ; white (F) 
    MOV  BH, 0F1h 
    MOV  CX, 0F00h 
    MOV  DX, 0F4Fh 
    INT  10h 

    MOV  AX, 4C00h 
    INT   21h       
MAIN ENDP 
     END  MAIN 
+1

Поскольку вы, кажется, заинтересованы в этом виде старого обидчивый программирования ASM, хорошее правило thumb - то, что Dosbox почти всегда прав. Есть, очевидно, случаи, когда он частично не подражает старой ОС 100%, но что-то на этом уровне работает очень хорошо. – Blindy

+0

Я не ставил его, потому что он был старым, я обращался к вашему вопросу «или все из-за DOSBox». Если вы продолжите программирование под Dosbox, это очень поможет вам понять, что это довольно хорошо - любое странное поведение - это то, как работает DOS. Таким образом вы узнаете, что в Google найти решение! – Blindy

+0

@ Блинди, понял! Это было написано где-то вроде «Машина всегда правильная», и это кажется правдой. Спасибо за это упоминание. – yulian

ответ

7

По умолчанию для текста есть 16 цветов и только 8 цветов для фона.

Существует способ получить все 16 цветов для фона, что требует отключения «Мигающий атрибут».

Вот как это можно сделать:

MAIN PROC FAR 
    MOV  AX, @DATA 
    MOV  DS, AX 


    ; turn-off blinking attribute 
    MOV  AX, 1003h  
    MOV  BL, 00 
    INT  10h 


    MOV  AX, 0600h ;AH = 06h (scroll up window) 
    ; black (0) 
    MOV  BH, 0Fh  ;0 (black) background, F (white) text 
    MOV  CX, 0000h ;upper line, left column 
    MOV  DX, 004Fh ;finishing line, right column 
    INT  10h 

    ; the rest of the magic... 

Результат показан ниже:

enter image description here

+0

Я передам вам список прерываний Ralf Brown в HTML-формате (http://www.ctyme.com/rbrown.htm) (как можно ближе к «официальному», как вы собираетесь получить), и вы найдете что этот метод применим только к * некоторым * системам и EGA и VGA - не ** CGA ** по запросу. – Magoo

+0

@Magoo, согласно инструкции прерывания, найденной на предлагаемом сайте 'Int 10/AH = 0Fh', я получил регистр' AX = 5003', 'BX = 0000'. Есть также описания возврата: 'AH = количество столбцов символов. 'AL = режим отображения. 'BH = активная страница'. Я посмотрел здесь (http://www.columbia.edu/~em36/wpdos/videomodes.txt) для значений видеорежима и выяснил, что текущий видеорежим - *** 03h = T (текст) 80x25 8x16 (пиксель) 640x400 16 (цвета) 8 (страниц) MCGA (предшественник CGA и преемник VGA) (система) ***. По крайней мере, все правильно, как я вижу. Но я все еще могу ошибаться, я не исключаю этого. – yulian

3

Ooh - древней технологии в самом деле!

16 цветов доступны на переднем плане, но только 8 для фона. Верхний бит использовался для мигания и иногда не реализовывался.

+0

О, мужик! Спасибо, что отметили около 8 цветов для фона! Я не знал об этом, поэтому не знал, где искать решение проблемы. Теперь проблема решена. – yulian

+0

Было бы неплохо увидеть, как вы его решили. –

+1

@ user3144770, предложил изменить, но Magoo не одобрил его. Теперь я отправлю ответ, чтобы другие люди смогли увидеть, как его решить. – yulian