Jak zainicjalizować tryb 13h i rysować w nim

jareq007

Inicjalizacja trybu graficznego

procedure init;assembler;
asm
    mov ah, 00h
    mov ax, 13h;
    int 10h;
end;

Powrót do trybu tekstowego

procedure init_txt;assembler;
asm
    mov ah, 00h
    mov ax, 03h;
    int 10h;
end;

Narysowanie pixela w punkcie (x, y)

procedure putpixel(x, y : word; kolor : byte);
var zmienna : word;
begin
    zmienna:=(y shl 8)+(y shl 6) + x;
    asm
        mov ax, 0A000h;
        mov es, ax;
        mov di, zmienna;
        mov al, kolor;
        mov byte ptr es:[di], al;
    end;
end;

Pobranie koloru pixela z punktu (x, y)

function getpixel(x, y : word):byte;assembler;
asm
    mov ah, 0Dh;
    mov cx, x;
    mov dx, y;
    int 10h;
end;

Na podstawie procedury putpixel() można napisać funkcję rysującą dowolny kształt - możliwości ograniczone jedynie Twoją wyobraźnią :)

Zobacz też:
Przykłady z książki "Tworzenie gier 2D i 3D w języku TP"

5 komentarzy

umm a jak zrobić żeby w devie się to nie wykrzaczyło? (wyskakuje mi runtime error 216)

Inna wersja GetPixel\PutPixel\InitGraph

CONST
 GraphMode  :Byte    = $13;              { tryb graficzny 320x200x256 }
 NormalMode :Byte    = $03;              { tryb tekstowy 80x25        }
 VgaAddr    :Pointer = Ptr($A000, 0000); { Adres poczatku ekranu      }

PROCEDURE SetVgaMode(Mode :Byte); ASSEMBLER;
ASM
 MOV AH, 00h
 MOV AL, [Mode]
 INT 10h
END; { SetVgaMode }

// Parametr buf określa gdzie rysujem obraz. Można rysować bezpośrednio na ekranie lub w pamięci. Jeżeli rysujemy na ekreanie to w miejsce buf podstawiamy VgaAddr.
PROCEDURE PutPixel(Buf :Pointer; X, Y :Word; Kolor :Byte); ASSEMBLER;
ASM
 LES  DI, Buf
 MOV  AX, [Y]
 MOV  DI, AX
 SHL  AX, 8
 SHL  DI, 6
 ADD  DI, AX
 ADD  DI, [X]
 MOV  AL, [Kolor]
 MOV  BYTE PTR ES:[DI], AL
END; { PutPixel }

FUNCTION GetPixel(Buf :Pointer; X, Y :Word) :Byte; ASSEMBLER;
ASM
  LES  DI, Buf
  MOV  AX, [Y]
  MOV  DI, AX
  SHL  AX, 8
  SHL  DI, 6
  ADD  DI, AX
  ADD  DI, [X]
  MOV  AL, BYTE PTR ES:[DI]
END; { GetPixel }

linie :
mov ah, 00h
mov ax, 13h

jest nie potrzebna można je zastąpić jedną :
mov ah, 13h

Mam nadzieje, że faq w pascalu wkońcu ruszy.

Lepiej by było napisać getpixel bez użycia przerwania - tak jak putpixel. Raczej wiekszość sobie z tym poradzi, ale nie wszyscy.