Wie funktioniert das bitte :
TEST OF BYTE ABSOLUTE $A0000000;
Wie kann die Adresse TEST erhöhen und wie kann man bitte ein Byte an diese neue Adresse übergeben ?
Danke.
Wie funktioniert das bitte :
TEST OF BYTE ABSOLUTE $A0000000;
Wie kann die Adresse TEST erhöhen und wie kann man bitte ein Byte an diese neue Adresse übergeben ?
Danke.
Das funktioniert so nicht, was du suchst ist ein Zeiger.
ich schau mal kurz
EDITH: in deinem Falle könntest du z.b. mit MEM[Segment: Offset] arbeiten; Also z.b.
var i:word;
var x,old:byte;
begin
asm
{holen und speichern des aktuellen Videomodes in der Variable old}
mov ah,$0F
int $10
mov old,al
{setzen des Videomodes 13h}
mov ah,$00
mov al,$13
int $10
end;
{ein bisschen colorcycling}
for x:=0 to 255 do
for i:=0 to 65535 do MEM[$A000:i]:=x;
{wiederherstellen des alten Videomodes}
asm
mov ah,$00
mov al,old
int $10
end;
end;
Alles anzeigen
ansonsten geht z.b.
uses System;
var x:^byte
x:=SEGA000; //ich weiß grad nicht wie ich dem Zeiger direkt eine Adresse geben kann :-/
inc(x);
x^:=dein Wert den du ausgeben willst.
Absolute ist wiederrum nützlich wenn du Variablen aufteilen willst, z.b.
var wort:word;
var bite:array[0..1]of byte Absolute wort;
damit lässt sich einfach auf das Hi und Lo byte der Variable wort zugreifen.
Hast du dazu mal Kontext? Das sieht mir nach Pascal aus, aber die Syntax ist mir nicht geläufig.
Es ist Turbo Pascal 6.0
Der Compiler spuckt auch keine Fehlermeldung aus.
Ich kann im ModeX-VGA an dieser Stelle nur mit einer kompletter Adresse spielen ohne Segment.
Borlande c:
VGA[active_page+(y<<6)+(y<<4)+(x>>2)]=color;
Und dieses Funktioniert nicht mit der Pixelübergabe mit dem Segment beim Mode x:
Mem [vgapage:activ_page+(y shl 6)+(y shl 4)+(x shr 2)] :=c;
Es wird so keine Pixel übertragen.
Es muss wie du auch sagst ein Zeiger sein.
das ist das Program für den Mode x in TP
program vgamx;
uses Crt, Dos;
const
vgapage = $a000;
seq_addr = $3c4;
seq_data = $3c5;
crtc_addr = $3d4;
crtc_data = $3d5;
var
activ_page,activ_page1,activ_page2:word;
x : word;
color: byte;
ch: char;
Procedure SetText;
BEGIN
asm
mov ax,0003h
int 10h
end;
END;
procedure vgamode;
var
regs: Registers;
begin
with regs do
begin
AH := $0;
AL := $13;
intr($10, regs);
end;
end;
procedure unchained;
begin
port[seq_addr] := $04;
port[seq_data] := $06;
portw[seq_addr] := $ff02;
port[crtc_addr] := $14;
port[crtc_data] := $00;
port[crtc_addr] := $17;
port[crtc_data] := $e3;
end;
procedure page_flip(page1 : word; page2 : word);
var
hiad :word;
lowad :word;
temp : word;
begin
temp :=page1;
page1:=page2;
page2:=temp;
hiad:= $0c or (page1 and $ff00);
lowad:= $0d or (page1 shl 8);
portw[crtc_addr] :=hiad;
portw[crtc_addr] :=lowad;
end;
procedure SetPixel(x: word; y: word; c: byte);
begin
port[seq_addr] :=$02;
portw[seq_data]:= (x and 3) shl 1;
Mem [vgapage:activ_page+(y shl 6)+(y shl 4)+(x shr 2)] :=c;
end;
begin
vgamode;
unchained;
repeat
ch := ReadKey;
case ch of
'q': begin
color := 12;
activ_page :=16000;
activ_page1 :=16000;
For x:=0 to 199 do
begin
setpixel(x,x,color);
end;
end;
'w': begin
color := 14;
activ_page :=32000;
activ_page2 :=32000;
For x:=0 to 199 do
begin
setpixel(x,x div 2,color);
end;
end;
'f':begin
page_flip(activ_page1,activ_page2);
end;
'u':begin
unchained;
end;
end;
until ch = #27;
settext;
end.
Alles anzeigen
und so in Borland c++ welches funktioniert mit dem Mode x wo ich die beiden Seiten mit 2 Linien fülle und dann immer umschalten kann:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <mem.h>
#include <conio.h>
#define SC_INDEX 0x03c4
#define SC_DATA 0x03c5
#define CRTC_INDEX 0x03d4
#define CRTC_DATA 0x03d5
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
word x,y;
word active_page,active_page1, active_page2 ;
byte *VGA=(byte *)0xA0000000L;
void SetTextMode ()
{
_AH = 0;
_AL = 0x03;
geninterrupt (0x10);
}
void SetMode13h ()
{
_AH = 0;
_AL = 0x13;
geninterrupt (0x10);
}
void set_unchained_mode(void)
{
word i;
dword *ptr=(dword *)VGA;
outp(SC_INDEX, 0x04);
outp(SC_DATA, 0x06);
outpw(SC_INDEX, 0xff02);
for(i=0;i<0x4000;i++)
*ptr++ = 0;
outp(CRTC_INDEX,0x14);
outp(CRTC_DATA, 0x00);
outp(CRTC_INDEX,0x17);
outp(CRTC_DATA, 0xe3);
}
void page_flip(word *page1,word *page2)
{
word high_add,low_add;
word temp;
temp=*page1;
*page1=*page2;
*page2=temp;
high_add = 0x0c | (*page1 & 0xff00);
low_add = 0x0d | (*page1 << 8);
outpw(CRTC_INDEX, high_add);
outpw(CRTC_INDEX, low_add);
}
void plot_pixel(int x,int y,byte color)
{
outp(SC_INDEX,0x02);
outp(SC_DATA, 1 << (x&3) );
VGA[active_page+(y<<6)+(y<<4)+(x>>2)]=color;
}
int main()
{
byte cmd;
byte col;
SetMode13h ();
set_unchained_mode();
do {
cmd = getch();
switch (cmd)
{
case 'q':
col=12;
active_page =16000;
active_page1 =16000;
for(x=0;x <=199;x++)
{
plot_pixel(x,x,col);
}
break;
case 'w':
col=14;
active_page = 32000;
active_page2 =32000;
for(x=0;x <=199;x++)
{
plot_pixel(x,x/2,col);
}
break;
case 'f':
page_flip(&active_page1,&active_page2);
break;
case 'u':
set_unchained_mode();
break;
}
} while (cmd != 'x');
}
Alles anzeigen
Gruss
Ähm, was schreibst du auf den Ports rum?
EDITH: sehe schon, höhere Auflösung, Bankswitching
EDITH2: aber warum bei Mode 13h - der passt doch in die 64k - Zeichnest du Offscreen?
EDITH3: Achso MODE X
schau mal oben in meinen Beitrag... da ist noch ein kleines Demoprogramm...
EDIT:
procedure SetPixel(x: word; y: word; c: byte);
begin
{port[seq_addr] :=$02;
portw[seq_data]:= (x and 3) shl 1;}
Mem [vgapage:{activ_page+}(y shl 6)+(y shl 4)+(x shr 2)] :=c;
end;
funktioniert: ich vermute die Daten landen in der falschen Page, bzw das MEM läuft über - 320x240Pixel sind ~76kb dort sind aber nur 16Bitwerte zulässig
bzw. über Port machst du ja einen Seitenwechsel - aber beim eigentlichen Zugriff ignorierst du das...
Hmm..danke.
Ich habe die Auflösunf 320x200.
Meinst du den Seitenwechsel hier : vgapage = $a000; beim Segment?
Wie müsste dann bitte der 64kb Seitenwechsel hier statt finden im Segment : $a000 Seite 1 , $...... Seite 2 bis Seite 4 ?
Danke.
Ich weis jetzt nicht wie du die Seiten eingestellt hast, von den Werten her schauts nach 16000 bytes aus (müssten eigentlich bei 16kb 16384bytes sein, oder lassen sich tatsächlich genau 16000 bytes einstellen)
aber du müstest:
_offset:=pixel_pro_Zeile*y+x;
page:=_offset div Seitengröße
_offset:=_offset-page*Seitengröße
rechnen.Ich finde leider nicht mehr mein Apfelmännchen, da hatte ich 1024x768x16bit und entsprechend viele Seitenwechsel...
PS. und bei _offset aufpassen wegen überläufen... (bei word gilt: 65535+1=0)
Das geht nur mit 16000Byte für die Seitenwahl . Hat was mit der Bitverschiebung zu tun in jeder Seite.
Jede Grafikseite kann mit 64000Pixel gefüllt werden ergibt 256kb.
Mit diesem C-Programm schreibe ich auf einer Seite eine Linie rot und auf der anderen Seite 64000 gelbe Pixel.
Taste Q und Taste W.
Mit der Taste F kann ich dann zwischen beiden Seiten Umschalten.
Die Seiten sind im Mode X : 0; 16000; 32000; 48000; Seite 1-4.
Ich kann alle Seiten mischen .
Mein Muster unten sind Seite 2 und 3 , die ich dann wechselseitig in den Vordergrund setze.
Die Dateiendung txt umbenennen in exe.
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <mem.h>
#include <conio.h>
#define SC_INDEX 0x03c4
#define SC_DATA 0x03c5
#define CRTC_INDEX 0x03d4
#define CRTC_DATA 0x03d5
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
word x,y;
word active_page,active_page1, active_page2 ;
byte *VGA=(byte *)0xA0000000L;
void SetTextMode ()
{
_AH = 0;
_AL = 0x03;
geninterrupt (0x10);
}
void SetMode13h ()
{
_AH = 0;
_AL = 0x13;
geninterrupt (0x10);
}
void set_unchained_mode(void)
{
word i;
dword *ptr=(dword *)VGA;
outp(SC_INDEX, 0x04);
outp(SC_DATA, 0x06);
outpw(SC_INDEX, 0xff02);
for(i=0;i<0x4000;i++)
*ptr++ = 0;
outp(CRTC_INDEX,0x14);
outp(CRTC_DATA, 0x00);
outp(CRTC_INDEX,0x17);
outp(CRTC_DATA, 0xe3);
}
void page_flip(word *page1,word *page2)
{
word high_add,low_add;
word temp;
temp=*page1;
*page1=*page2;
*page2=temp;
high_add = 0x0c | (*page1 & 0xff00);
low_add = 0x0d | (*page1 << 8);
outpw(CRTC_INDEX, high_add);
outpw(CRTC_INDEX, low_add);
}
void plot_pixel(int x,int y,byte color)
{
outp(SC_INDEX,0x02);
outp(SC_DATA, 1 << (x&3) );
VGA[active_page+(y<<6)+(y<<4)+(x>>2)]=color;
}
int main()
{
byte cmd;
byte col;
SetMode13h ();
set_unchained_mode();
do
{
cmd = getch();
switch (cmd)
{
case 'q':
col=12;
active_page =16000;
active_page1 =16000;
for(x=0;x <=199;x++)
{
plot_pixel(x,x,col);
}
break;
case 'w':
col=14;
active_page = 32000;
active_page2 =32000;
for(y=0;y <=199;y++)
{
for(x=0;x <=319;x++)
{
plot_pixel(x,y,col);
}
}
break;
case 'f':
page_flip(&active_page1,&active_page2);
break;
case 'u':
set_unchained_mode();
break;
}
} while (cmd != 'x');
}
Alles anzeigen
Das Programm habe ich umgeschrieben für TP, funktioniert aber nicht in TP.
Jetzt funktioniert es mit dem Mode X in TP 6.0
- 4 unabhängige Grafikseiten , wechseln, kopieren
Gruss
woran lag es?
Ich habe das Sytem komplett neu aufgebaut für Mode x für mich in TP. Hat etliche Stunden gedauert.
Habe hier und da neue Befehle entdeckt die man nicht im Zusammenhang findet weil das eigentliche Mode X nicht benutzt wurde als einzelnen Screen umschalten
oder kopieren. Dadurch kam eine Befehlssuppe zustande durch die verschiedenen Ansprüche die nicht die Grundidee vertraten wie das ABC.
Auch die ASM-Code Schlangen für Mode X vertraten immer verschiedene Ideen aber nicht das Grundprinzip.
Ich habe für das Mode X in TP kein ASM genutzt, weil das TP schon schön schnell ist.
Gruss
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!