2016-10-21 5 views
-2

도스 모드의 그래픽 모드에서 화면을 지울 필요가 있습니다 (단색으로 모두 채색해야합니다), 그 사람이 무엇을 알아야하며, 레지스터에 무엇을 넣어야합니까? 어떤 레지스터에 화면을 넣을 색을 넣을까요? 도우미에게 정말 고마워! DOS 운영 체제에서 그래픽 모드로 화면을 색칠하는 방법은 무엇입니까?

이 (어셈블리) 내 코드입니다 : 누군가가 도움을 줄 수있는 경우 나 arrowes 상하 & 내 출구 내가 사랑하는 것이 나에게 deternmind 코드 0을 쓰고 바로 & 왼쪽으로 이동하고 왜 이유를 이해

! : 그
> IDEAL MODEL 
small STACK 
100h DATASEG 
x dw 0 
xa dw 0 
y dw 5 
ya dw 5 
z dw 1 
za dw 1 
color db 4 
Pixels Color bgcolor db 0 ;BackGround Color 
> CODESEG start: 
mov ax, @data 
mov ds, ax 
; Graphic mode 
mov ax, 13h 
int 10h 
; Print red dot 
mov bh,0h 
mov cx,[x] 
mov dx,[y] 
> mov al,[color] 
mov ah,0ch 
int 10h 
amit: 
>  ;Wait for + 
>  mov ah,00h 
>  int 16h 
>  cmp ax, 0d3dh 
>  je plus 
>  ;Wait for - 
>  cmp ax, 0c2dh 
>  je minus 
>  ; Wait for exit 
>  cmp ax, 1071h 
>  je exit 
>  cmp ax, 4d00h 
>  je right 
>  cmp ax, 4b00h 
>  je left1 
>  cmp ax, 4800h 
>  je up1 
>  cmp ax, 5000h 
>  je down1 
>  
>  exit: 
>   mov ah, 0 
>   mov al, 2 
>   int 10h 
>   mov ax, 4c00h 
>   int 21h 
>  plus: 
>   add [x], 1 
>   mov cx, [x] 
>   add [y], 1 
>   mov dx, [y] 
>   mov bh, 0h 
>   mov al,[color] 
>   mov ah, 0ch 
>   int 10h 
>   add [z], 1h 
>   add [za], 1h 
>   jmp amit 
>  left1: 
>   jmp left 
>  up1: 
>   jmp up 
>  down1: 
>   jmp down 
>  minus: 
>   mov bh, 00h 
>   mov al,[bgcolor] 
>   mov ah,0ch 
>   int 10h 
>   sub [x], 1 
>   mov cx, [x] 
>   sub [y], 1 
>   mov dx, [y] 
>   sub [z], 1h 
>   sub [za], 1h 
>   jmp amit 
>  right: 
>   clsright: 
>    mov bh, 00h 
>    mov al,[bgcolor] 
>    mov ah,0ch 
>    int 10h 
>    sub [x], 1 
>    mov cx, [x] 
>    sub [y], 1 
>    mov dx, [y] 
>    sub [z], 1h 
>    cmp [z], 0h 
>    jne clsright 
>   add [x],1h 
>   jmp arrowplus 
>  left: 
>   clsleft: 
>    mov bh, 00h 
>    mov al,[bgcolor] 
>    mov ah,0ch 
>    int 10h 
>    sub [x], 1 
>    mov cx, [x] 
>    sub [y], 1 
>    mov dx, [y] 
>    sub [z], 1h 
>    cmp [z], 0h 
>    jne clsleft 
>    sub [x], 1h 
>    jmp arrowplus 
>  up: 
>   clsup: 
>    mov bh, 00h 
>    mov al,[bgcolor] 
>    mov ah,0ch 
>    int 10h 
>    sub [x], 1 
>    mov cx, [x] 
>    sub [y], 1 
>    mov dx, [y] 
>    sub [z], 1h 
>    cmp [z], 0h 
>    jne clsup 
>    sub [y], 1h 
>    jmp arrowplus 
>  down: 
>   clsdown: 
>    mov bh, 00h 
>    mov al,[bgcolor] 
>    mov ah,0ch 
>    int 10h 
>    sub [x], 1 
>    mov cx, [x] 
>    sub [y], 1 
>    mov dx, [y] 
>    sub [z], 1h 
>    cmp [z], 0h 
>    jne clsdown 
>    add [y], 1h 
>    jmp arrowplus 
>  arrowplus: 
>   add [x], 1 
>   mov cx, [x] 
>   add [y], 1 
>   mov dx, [y] 
>   mov bh, 0h 
>   mov al,[color] 
>   mov ah, 0ch 
>   int 10h 
>   add [z], 1h 
>   mov [z], dx 
>   cmp [za], dx 
>   jne arrowplus 
>   jmp amit END start 
+1

비디오 메모리에 직접 비트를 조작 할 수 화면,하지만 BIOS를 사용하는 매우 느린 방법을 사용할 수 있습니다 [Int 10h/AH = 0Ch] (http://www.ctyme.com/intr/rb-0104.htm) –

+0

나중에 더 많은 것들이 필요할 경우 프로젝트에 추가하려면 [화면에서 ​​객체를 이동시키는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/)를 참조하십시오. a/29579522/2521214) 메뉴 (텍스트 모드), 스프라이트, 동시 제어 (3 플레이어), 파일 액세스를 포함하여 MS-DOS 320x200x8bit 모드 (내게 사용하는 것과 동일한)에서 내 오래된 게임 중 하나에 대한 소스를 넣었습니다. 작은 모델의 모든 것 (* .com 실행 파일의 최대 64KB) – Spektre

답변

2

저는 VGA 모드로 작업 중이거나 VGA로 전환 할 수 있다고 가정합니다. 다른 모드 here에 대한 좋은 설명이 있습니다. 간단히 말해, 그래픽 또는 텍스트의 여러 디스플레이 모드로 전환 할 수 있습니다. VGA를 포함한 모든 레거시 모드의 경우 인터럽트를 통해 디스 플레이와 상호 작용할 수 있지만 상당히 어색합니다. 더 나은 옵션은 DMA (Direct Memory Access)를 사용하는 것입니다. 디스플레이 메모리에 직접 매핑되는 메모리 주소의 간격입니다. 따라서 메모리에 바이트를 쓰면 정확한 모드에 따라 문자/픽셀/픽셀을 변경할 수 있습니다. 가장 쉬운 방법은 VGA 16 색으로 전환하고 화면에 일정한 바이트를 쓰는 것입니다. DMA here 및이 모드의 색상 표 here을 사용하여 모니터와 상호 작용하는 정보를 찾을 수 있습니다.

샘플 코드 (this 페이지에 신용) :이 모드에 대한

mov ax, 13h ; AH=0 (Change video mode), AL=13h (VGA mode, 16 colors, 320x200) 
int 10h ; Video BIOS interrupt, switching to VGA 
mov ax, 0A000h ; The offset to video mapped memory 
mov es, ax ; We load it to ES through AX, becouse immediate operation is not allowed on ES 
mov ax, 0 ; 0 will put it in top left corner. To put it in top right corner load with 320, in the middle of the screen 32160 = 320*100 + 160. 
mov di, ax ; load Destination Index register with ax value (the coords to put the pixel) 
mov al, 7 ; Grey color. 
mov cx, 64000 ; 6400 = 320 * 200 pixels 
rep stosb ; paint the whole screen with grey 

색상 팔레트, 완전성을 위해서 :

0 - black 
1 - blue 
2 - green 
3 - cyan 
4 - red 
5 - magenta 
6 - brown 
7 - light gray 
8 - gray 
9 - light blue 
10 - light green 
11 - light cyan 
12 - light red 
13 - light magenta 
14 - yellow 
15 - white 
내가 업데이트 할
+0

제안하는 각 방법에 대한 샘플 코드를 게시 할 수 있습니까? –

+1

링크에 샘플 코드가 있습니다. 나는 아무렇게나 붙일 것이다. – galra

+1

때때로 링크를 사용할 수 없게됩니다. 여기에 코드를 게시하면 아이디어가 보존됩니다. –