Programowanie w języku Pascal » FAQ

Jak zainicjalizować tryb 13h i rysować w nim

  • 2006-07-24 13:03
  • 5 komentarzy
  • 1312 odsłon
  • Oceń ten tekst jako pierwszy

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

Future Knight 2007-12-08 11:08

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

Oleksy_Adam 2006-07-24 15:28

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 }

szprota 2004-01-27 12:21

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

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

musio 2004-01-10 19:47

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

Marooned 2004-01-06 17:31

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