Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
zwergnase
Anmeldungsdatum: 03.01.2006 Beiträge: 26 Wohnort: Frankfurt am Main
|
Verfasst am: 21.07.2006, 12:11 Titel: Page Flipping in SCREEN 13 Mode unter QBASIC? |
|
|
Weiß jemand vielleicht wie ich page flipping im SCREEN 13 Modus unter QBASIC realisiere? Der Modus unterstützt ja leider keine Seiten. Also hab ich n Array erzeugt. In das ich zeichnen kann, Double buffering hab ich damit schon realisiert.
Um page flipping anzuwenden muss ich ja dafür sorgen das der Zeiger der auf den auszugebenden Speicherbereich zeigt, also im Normalfall $HA000
jetzt auf meinen vom Array reservierten Speicher wechselt. Wie aber mach ich so was? Kann man das mit QBASIC machen, oder ist da ASM nötig?
Martin |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 21.07.2006, 12:38 Titel: |
|
|
Hi,
also mit QBasic direkt geht das leider nicht.
Eine Möglichkeit wäre die AK-LIB zu verwenden:
http://www.iconsoft.de/download/ak15.zip
Dabei handelt es sich um eine SVGA-LIB mit VESA-Unterstützung.
Dort kannst du mit dem Grafikmodus &H12E auch deine 320x200x256 realisieren und hast dazu noch echte zusätzliche Bildschirmseiten.
Diese können dann mit den Befehlen
Code: |
CALL XSCREEN (&H12E) ' setzt den Grafikmodus 320x200x256
CALL SET.VIEW.PAGE(0) ' 0 = die Seite die momentan zu sehen sein soll
CALL SET.WORK.PAGE(0) ' 0 = die Seite auf der du arbeitest
|
gesetzt werden.
Eine Anleitung ist beim zip-Archiv dabei.
Ob man den RAM-Pointer &HA000 auch woanders hinsetzen kann per ASM müßte ich selber nochma nachschauen. Dürfte aber eigentlich nur eine Umleitung des DMA-Kanals sein wenn ich mich nicht stark täusche.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
zwergnase
Anmeldungsdatum: 03.01.2006 Beiträge: 26 Wohnort: Frankfurt am Main
|
Verfasst am: 21.07.2006, 13:07 Titel: Danke für den Tip |
|
|
Hallo und danke für die schnelle Antwort. Die lib ist sicher ne gute Lösung.
Wollte allerdings auch mas über die Vorgänge in meinem Computer erfahren.
Deshalb dacht ich mir das ich das selbst erledige, wenn das ganze nicht mit riesigem Aufwand verbunden ist. Aber so wie sich das anhört scheint das ja net so schwer zu sein. Also ASM!!
Weis einer vieleicht wie man das realisieren kann in ASM?
Martin |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
zwergnase
Anmeldungsdatum: 03.01.2006 Beiträge: 26 Wohnort: Frankfurt am Main
|
Verfasst am: 21.07.2006, 14:13 Titel: Eventuelles Problem mit VideoRAM begrenzung |
|
|
Mir ist da noch was aufgefallen.
Beim Page flipping wird ja normalerweise zwischen zwei Speicherbereichen im VideoRAM der Grafikkarte umgeschaltet. Im SCREEN 13 benötigt eine Seite ja den gesammten zur verfügung gestelleten Grafikspeicher, weshalb keine Seiten zur Verfügung gestellt werden. Das bedeutet ja aber das ich um page flipping hinzubekommen zwischen dem Speicher der Grafikkarte und dem Arbeitsspeicher schalten muss. Geht das ohne Probleme? Ist das langsamer als das umschalten im Grafikspeicher?
Ist das dann vieleicht sogar langsamer als double buffering?
Martin |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 21.07.2006, 14:55 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | Wenn das hier einer weiß, dann A.K.!  |
immer ruhig mit den jungen Pferden.
B2T:
Also per ASM sollte das möglich sein.
Meine Idee wäre es (wenn man den DMA mal weglässt) sich einfach eine MEMCOPY-Routine in ASM fertig zumachen.
Das ganze in debug.exe schreiben und in QB einbinden und mit CALL ABSOLUTE aufrufen.
DEF SEG = varseg(prog$)
CALL ABSOLUTE (datseg%, datoff%, sadd(prog$))
Code: |
PUSH DS
PUSH BP
MOV BP, SP
MOV DS,[BP+0A] ' DS:SI mit dem Ram-Pointer der virtuellen
MOV SI,[BP+08] ' Seite laden (Aus Übergabe)
MOV AX,A000 ' ES:DI mit dem VRam-Pointer laden
MOV ES,AX ' A000:0000
XOR DI,DI
MOV CX,FA00 ' CX als Zähler mit 64000 (320x200) laden
CLD ' Direction-Flag löschen
N1:
LODSW ' Word aus Datenbereich laden (AX = [DS:SI])
ES: ' Word aus VRam laden (BX = [ES:DI])
MOV BX,[DI]
XCHG AX,BX ' SWAP AX, BX
MOV [DI],BX ' getauschtes Word wieder nach [ES:DI]
DS: ' getauschtes Word wieder nach [DS:SI-2]
MOV [SI-2],AX ' (lodsw bewirkt eine SI-Inkrementierung um 2)
INC DI ' DI = DI + 2, (INC sollte schneller sein als ADD)
INC DI
LOOP N1
POP BP
POP DS
RETF
|
so sollte das gehen. Jedesmal wenn du das aufrufst wird der Inhalt des VRAM mit dem deines eigenen Datenfeldes ausgetauscht und umgekehrt.
Zum Einbinden dieses Programmes hier eine Anleitung:
http://www.iconsoft.de/index.php?show=tutorial_asm
Das Programm selber ist ungetestet, sollte aber laufen.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
|