Simples CLS in ASM

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Simples CLS in ASM

Beitrag von oDOSseus »

Hey, ich nochmal

Ich würde gerne in Assembler den Bildschirm löschen aber:
  • 1. Nicht den Textmode ändern (80x50 oder 80x25)
    2. Nicht direkt in den Speicher schreiben
    3. Die Farbattribute nicht ändern
Gibts da was?
Ich probierte:

Code: Alles auswählen

mov    ah,    $0F
int    $10
mov    ah,    $00
int    $10
Aber das wechselt immer in 80x25 Modus.
Benutzeravatar
darktrym
LAN Manager
Beiträge: 207
Registriert: So 5. Jan 2014, 10:59
Wohnort: -D-

Re: Simples CLS in ASM

Beitrag von darktrym »

Im Buch mit dem pinken Shirt wird das sogar ausdrücklich empfohlen, Bildschirm löschen durch Setzen des gleichen Videomodus. Wundert mich dass das hier nicht klappt.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Liegt vllt daran, dass bei 80x50 auch die Zeichengröße geändert wird. Vermute ich zumindest.
Brueggi

Re: Simples CLS in ASM

Beitrag von Brueggi »

INT $10:

AH = 07h
AL = number of lines by which to scroll down (00h=clear entire window)
BH = attribute used to write blank lines at top of window
CH,CL = row,column of window's upper left corner
DH,DL = row,column of window's lower right Corner

Also solltest Du AL auf 0 setzen und dann in CH/CL bzw. DH/DL die Grenzen des kompletten Schirms setzen. Dann löscht Du den Bildschirm. Ich meine, das sollte funktionieren:

MOV AX,$0700
MOV BH,$07
XOR CX,CX
MOV DX,$184F
INT $10

Den Cursor muss man aber danach wieder manuell auf Pos. 0,0 setzen.

P.S.: Das Beispiel setzt aber neue Farb-Attribute. Ansonsten müsstest Du wirklich was selbst gebasteltes nehmen.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Warum DX=184F?
Sollte es bei 80x50 nicht DX=314F sein?
Brueggi

Re: Simples CLS in ASM

Beitrag von Brueggi »

Jup, ich bin von 80x25 ausgegangen im Beispiel :-)
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Wenn ich das für 80x50 mache, klappt dass dann auch im 80x25 modus?


Ich habe jetzt einfach 50mal dos gesagt es soll einen zeilen umbruch machen. Das ist super lahm, wird aber nur einmal ausgeführt und ist damit nich von bedeutung.
Brueggi

Re: Simples CLS in ASM

Beitrag von Brueggi »

Du meinst, wenn Du die CLS-Routine "fest" für 80x50 schreibst und die dann auch im 80x25-Modus so ausführst?
Kann ich Dir so nicht beantworten, ob es klappt - denke aber schon, denn den Rest des Speichers sieht man ja sowieso nicht (also quasi die untere Hälfte des 80x50-Schirms, den man bei 80x25 nicht sieht). Müsstest Du mal probieren. Vielleicht ist das BIOS ja auch so schlau und merkt, wenn die Parameter mit der tatsächlichen Auflösung nicht übereinstimmen.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Ich werde das mal nachgucken wenn das Projekt fertig ist.
Brueggi

Re: Simples CLS in ASM

Beitrag von Brueggi »

Darf man neugierig sein, und fragen, was Du programmierst? ;-)
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Conways game of life.

http://www.mathematische-basteleien.de/gameoflife.htm

Ein anstoßen mit Zufallsgeneriertem Feld ist schon fertig. Jetzt gerade will ich eine Datei einlesen, um die dann als Startfeld zu nutzen. Dann isses fertig und ich lad es hoch. Der Quelltext wird hier veröffentlicht. In QuickBasic ist es bereits fertig (kein Datei-start von mir gewünscht), ASM hoffentlich auch bald.
Brueggi

Re: Simples CLS in ASM

Beitrag von Brueggi »

Ui, da bin ich gespannt! :-)
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Simples CLS in ASM

Beitrag von Dosenware »

hab ich seinerzeit mal schnell in Pascal gemacht... wirklich Quick&dirty - fragt nicht was da im QT sonst noch passiert... ich hatte etliche male dran rumgebastelt... so dass halt noch ungenutzte fragmente drin sind.

Code: Alles auswählen

uses crt;
const max_x=320;
const max_y=200;
const maxcount=((max_x)*(max_y))-1;
var x:PChar;
var x2:PChar;
var Bedingung:array[0..8]of byte;
var cx,cy,cxl,cxh,cyl,cyh:word;
var Nachbarn,d:word;
var w:char;

begin
randomize;
d:=200;
getmem(x,maxcount);
getmem(x2,maxcount);
for cx:=0 to maxcount-1 do x2[cx]:=char(0);
for cx:=0 to 8 do Bedingung[cx]:=0;
writeln('(j)a, (n)ein, (w)iederbeleben) (w)ieberbeleben bei:');
writeln('0 Nachbarn');
w:=readkey; if w='j' then Bedingung[0]:=1 else if w='w' then Bedingung[0]:=2;
writeln('1 Nachbar');
w:=readkey; if w='j' then Bedingung[1]:=1 else if w='w' then Bedingung[1]:=2;
writeln('2 Nachbarn');
w:=readkey; if w='j' then Bedingung[2]:=1 else if w='w' then Bedingung[2]:=2;
writeln('3 Nachbarn');
w:=readkey; if w='j' then Bedingung[3]:=1 else if w='w' then Bedingung[3]:=2;
writeln('4 Nachbarn');
w:=readkey; if w='j' then Bedingung[4]:=1 else if w='w' then Bedingung[4]:=2;
writeln('5 Nachbarn');
w:=readkey; if w='j' then Bedingung[5]:=1 else if w='w' then Bedingung[5]:=2;
writeln('6 Nachbarn');
w:=readkey; if w='j' then Bedingung[6]:=1 else if w='w' then Bedingung[6]:=2;
writeln('7 Nachbarn');
w:=readkey; if w='j' then Bedingung[7]:=1 else if w='w' then Bedingung[7]:=2;
writeln('8 Nachbarn');
w:=readkey; if w='j' then Bedingung[8]:=1 else if w='w' then Bedingung[8]:=2;
clrscr;
Writeln('Startpattern X=Zelle; 3x3, r=random');
w:=readkey;
if (w<>'r') then
   begin
              write  (w);if w='x' then x2[ 99*max_x+159]:=char($01);
   w:=readkey;write  (w);if w='x' then x2[ 99*max_x+160]:=char($01);
   w:=readkey;writeln(w);if w='x' then x2[ 99*max_x+161]:=char($01);
   w:=readkey;write  (w);if w='x' then x2[100*max_x+159]:=char($01);
   w:=readkey;write  (w);if w='x' then x2[100*max_x+160]:=char($01);
   w:=readkey;writeln(w);if w='x' then x2[100*max_x+161]:=char($01);
   w:=readkey;write  (w);if w='x' then x2[101*max_x+159]:=char($01);
   w:=readkey;write  (w);if w='x' then x2[101*max_x+160]:=char($01);
   w:=readkey;writeln(w);if w='x' then x2[101*max_x+161]:=char($01);
   end
else
   begin
   cy:=random(maxcount);
   for cx:=0 to cy do x2[random(maxcount)]:=char(1);
   end;
{
1234/34
234/34
2345/4 erzeugt sehr starke muster
234/4 verarmt
345/4  verarmt
 34/34
234/34 wächst keine stabilen muster
1357/35 langsames wachsen
135/35  langsames aussterben
}
asm
mov ah,$00
mov al,$13
int $10
end;   {}
move(x2^,x^,maxcount);
for cx:=0 to maxcount do Mem[SEGA000:cx]:=byte(x2[cx])*$f;
readkey;
repeat
 for cx:=0 to max_x-1 do
     begin
     if cx=0 then cxl:=max_x-1 else cxl:=cx-1;
     if cx=max_x-1 then cxh:=0 else cxh:=cx+1;
     for cy:=0 to max_y-1 do
         begin
         if cy=0 then cyl:=max_y-1 else cyl:=cy-1;
         if cy=max_y-1 then cyh:=0 else cyh:=cy+1;

         Nachbarn:=(byte(x[(cyl*max_x)+cxl]))+(byte(x[(cyl*max_x)+cx]))+(byte(x[(cyl*max_x)+cxh]))+
                   (byte(x[(cy *max_x)+cxl]))+                          (byte(x[(cy *max_x)+cxh]))+
                   (byte(x[(cyh*max_x)+cxl]))+(byte(x[(cyh*max_x)+cx]))+(byte(x[(cyh*max_x)+cxh]));

       {  writeln('posxy:',cxl,' ',cx,' ',cxh,'y',cyl,' ',cy,' ',cyh,' inhalt:',byte(x[cy*max_x+cx]),' Nachbarn: ',Nachbarn,
          'Bed l w:',Bedingung[Nachbarn]);
         readkey;{}

         if Bedingung[Nachbarn]=1 then
         else
          begin
          if Bedingung[Nachbarn]=2 then
             begin
             x2[cx+(cy*max_x)]:=char($01);
             Mem[SEGA000:cx+(cy*max_x)]:=$0F;
             end
          else
            begin
             x2[cx+(cy*max_x)]:=char($00);
             Mem[SEGA000:cx+(cy*max_x)]:=$00;
             end
          end;
         end;
     end;
 asm
 cld
 mov dx,ds
 les di,x
 lds si,x2
 mov cx,$8000
 db $F3 {rep}
 db $A5 {movsw}
 mov ds,dx
 end;


delay(d);
if keypressed then
   begin;
   w:=readkey;
   if w='+' then d:=d+1;
   if (w='-') and (d>0)then d:=d-1;
   end;
until w='q';
asm
mov ax,$0000
int $10
end;
end.
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Simples CLS in ASM

Beitrag von oDOSseus »

Antworten