Ich habe nach langem mal wieder angefangen unter DOS mich mit Programmiersprachen zu beschäftigen.
Damals vor 20 Jahren hatte ich viel mit Basic und ab und an Pascal / C++ gearbeitet.
Leider vergisst man doch sehr viel.
Ich würde gerne erstmal ein Grundgerüst für Grafik zusammenstellen, worauf man dann Spiele aufbauen kann. Also brauche ich "schnelle" Grafik.
Basic kann ich zwar am besten, aber es ist unter DOS halt zu langsam und es ist sehr eingeschränkt.
Ich habe mich jetzt dazu durch gerungen Borland C++ 3.1 zu verwenden, da ich mit DOS arbeiten möchte.
Zielplattform 386-DX 33-40 / VGA / 4MB RAM
Der Compiler kann 386 optimierten Code schreiben, ich denke das passt so.
Fürs erste würde ich mich gerne mit der Grafik beschäftigen.
-VGA MODE X 320x200 256 4 Bildschirmseiten
-EGA 320x200 16Farben 8 Bildschirmseiten Parallax Scrolling würde ich mir gerne anschauen.
Im Netzt finde ich nicht mehr wirklich viel brauchbares hierzu.
zu Mode X habe ich jetzt was halbes zusammen geschrieben es fehlt aber noch an allem.
das Programm setzt die Grafikkarte auf MODE X mit 320x200 Auflösung und es werden Pixel rein geschrieben.
Danach kann man das ganze mit den tasten asdw verschieben mit q beendet man das Programm.
Es ist noch nicht strukturiert und auch wild beschriftet.
hat wer Mustercode oder gute Dokumentationen, ich nehme alles was mir weiter hilft.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
int MXini()
// >> Mode X <<-------------------------------------------------------------
{
asm {
mov ax, 13h
int 10h //{ Get into MCGA Mode }
mov dx, 3c4h //{ Port 3c4h = Sequencer Address Register }
mov al, 4 //{ Index 4 = memory mode }
out dx, al
inc dx //{ Port 3c5h ... here we set the mem mode }
in al, dx
and al, not 08h
or al, 04h
out dx, al
mov dx, 3ceh
mov al, 5
out dx, al
inc dx
in al, dx
and al, not 10h
out dx, al
dec dx
mov al, 6
out dx, al
inc dx
in al, dx
and al, not 02h
out dx, al
mov dx, 3c4h
mov ax, (0fh shl 8) + 2
out dx, ax
mov ax, 0a000h
mov es, ax
sub di, di
mov ax, 0000h //{8080h}
mov cx, 32768
cld
rep stosw //{ Clear garbage off the screen ... }
mov dx, 3d4h
mov al, 14h
out dx, al
inc dx
in al, dx
and al, not 40h
out dx, al
dec dx
mov al, 17h
out dx, al
inc dx
in al, dx
or al, 40h
out dx, al
mov dx, 3d4h
mov al, 13h
out dx, al
inc dx
mov al, 40 //[Size] //{ Size * 8 = Pixels across. Only 320 are visible}
out dx, al
}
}
int MXpset(int MXx , int MXy,char MXc)
// >> PSET << --------------------------------------------------------------
{
asm {
mov ax,MXy //[y] Position
xor bx,bx
mov bl,40 //[size] Breite in Pixel / 8
imul bx
shl ax,1
mov bx,ax
mov ax, MXx //[X Position
mov cx, ax
shr ax, 2
add bx, ax
and cx, 00000011b
mov ah, 1
shl ah, cl
mov dx, 3c4h //{ Sequencer Register }
mov al, 2 //{ Map Mask Index }
out dx, ax
mov ax, 0a000h
mov es, ax
mov al, MXc //[col] Farbe
mov es: [bx], al
}
}
int MXplane(char(MXP))
{
//SET Plane for writting in!!
asm {
mov al,2h
mov ah,1
mov cl,MXP //Plane
shl ah,cl
mov dx,3c4h //Sequencer Register
out dx,ax
}
}
int MXmove(int MXm)
{
// >> Pixelschieber <<-------------------------------------------------------
asm {
mov bx, MXm //Block +/-
mov ah, bh
mov al, 0ch
mov dx, 3d4h
out dx, ax
mov ah, bl
mov al, 0dh
mov dx, 3d4h
out dx, ax
}
}
int MXput(int MXx,int MXy, int MXc)
{
// >> Flip Source to Destination ?? <<-------------------------------------------------------
asm {
}
asm {
push ds
mov ax,0 //DEST
mov es,ax
mov ax,0 //source
mov ds,ax
xor si,si
xor di,di
mov cx,32000
rep movsw
pop ds
}
}
//##########################################################################
//### MAIN ###
//##########################################################################
int main(void)
{
MXini();//setzt MODEX
MXpset(0,0,14);//Punkt darstellen
char ch;
//Rechteck fllen >>>>>>>>>>>>
int x;
int y;
int c;
y=0;
x=0;
c=0;
do
{
MXpset(x,y,c);//Punkt darstellen
x=x+1;
c=c+1;
if (c>255) c=0;
if (x>319)
{
x=0;
y=y+1;
}
//Rechteck fllen <<<<<<<<<<<<
//y=y+1;
}while(y<200);
//test
x=0;
y=0;
do
{
//printf("%.10f",d);
if (kbhit() )
{
ch=getche();
// printf("\key >" , ch);
// if (ch == 'd') MXpset(160,100,14);//Punkt darstellen
if (ch=='a') x=x-1;
if (ch=='d') x=x+1;
if (ch=='w') y=y-1;
if (ch=='s') y=y+1;
MXmove((x+y*80));
}
} while(ch != 'q');
}
Alles anzeigen