NKC Forum
Register | FAQ | Search | Who is online? | Member list | Today's posts | Calendar | Login



Author Topic: bewegte Grafik mit GDP64
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on January 13, 2020 10:31 PM (#1)  |  Quote Quote   PM PM   E-mail E-mail
Ich versuche grad in Assembler (Z80) ein Programm zu schreiben in dem ein Objekt auf dem Bildschirm flackerfrei bewegt wird. Dabei nutze ich zwei der vier Bildschirmseiten der GDP64. Ich schreibe auf die nicht sichtbare und schalte dann um.
Was ich aber nicht hinbringe ist es die nicht sichtbare Seite schnell zu löschen. Der normale Löschbefehl an die GDP löscht immer die gerade sichtbare Leseseite.

Hat jemand eventuell ein kurzes Assemblerprogrammlisting das zb. ein quadrat flackerfrei auf dem Bildschirm bewegt?

Ah mir wäre da sehr geholfen.

Grüße, Alex

Posts: 19 | Member since: May 2019 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on January 14, 2020 10:55 AM (#2)  |  Quote Quote   PM PM   E-mail E-mail
Hallo,
(schnelles) loeschen mit der GDP geht durch ueberschreiben mit 'Loeschstift' (0x01). Also mit Loeschstift entweder einfach die komplette Grafik nochmal schreiben, oder falls es sich um eine komplexe Grafik aus vielen Kurzvektoren handelt (zB ein SpaceInvaders Monster), ist es schneller mit einem Block/Cursor (0x0a oder 0x0b) die Grafik zu ueberschreiben, dazu ist ggf die Fontgroesse anzupassen.

Beispiele fuer Bewegtes mit der GDP64 gibts auch in den RDK Buechern.

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on January 14, 2020 05:08 PM (#3)  |  Quote Quote   PM PM   E-mail E-mail
Hi smed,

perfekt, verstanden. Das probier ich gleich mal aus :)
Verwendest du das Vertical Blank Signal der GDP? Das ist Bit 1 des Statusregisters. Oder brauchst du das gar nicht?

Die Grafik deines Spaceinvaders sieht saugut und flüssig aus!

Grüße und danke nochmal für die Tips!
Alex

Posts: 19 | Member since: May 2019 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on January 14, 2020 08:48 PM (#4)  |  Quote Quote   PM PM   E-mail E-mail
Hi,
das VSYNC bit (siehe auch @SYNC im GP) kann man als 20ms Timer verwenden und damit die Seitenumschaltung synchronisieren um Flickereffekte zu vermeiden. Man verlangsamt damit allerding uU das gesamte Program. :(

Bei SpaceInvaders wird das VSYNC nur als Zeitbasis verwandt um Soundsamples in gleichmaessigen Abstaenden auszugeben. Die Feuer-Gerausche bestehen aus mehreren Toenen die alle ~20ms aus einem Ringbuffer an den Soundchip gegeben werden.

SpaceInvaders basiert uebrigens auf einer kleinen "NKC GameEngine" fuer Grafik/Sound/Joystick. Die GameEngine kuemmert sich vor allem um die bewegten Grafikelemente, also ggf das Neuzeichnen und Loeschen an der richtigen Stelle und Bildseite, dann kann man sich beim proogrammieren auf das eigentliche Game konzentrieren. Hast du einen Z80 C (cross) Compiler? Dann koenntest du eine Z80 Portierung versuchen, sollte nicht zu kompilziert sein, ich benutze keine C libraries.

Wenn du was zum Laufen kriegts bitte zeigen ! Willst du ein Spiel programmieren?

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on January 15, 2020 09:01 PM (#5)  |  Quote Quote   PM PM   E-mail E-mail
Hi smed,

ich bin da super spartanisch unterwegs mit dem EZASS 2.0 der eine echte Qual ist. Mit kleinen Routinen kann ich zumindest Code einfügen aber lustig ist das nicht. Wäre schon cool wenn man auf dem PC den Code schreiben könnte und dann z.B. übder die CAS-NEO dann in den NKC überträgt.
So versuch ich grad das Mondlandeprogramm nachzubauen das man in einem der alten Videos sieht. Das war aber mit einem 68000er und nicht mit der Z80.

Kein Vergleich zu deinem Spiel natürlich :-)

Grüße
Alex

Posts: 19 | Member since: May 2019 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on January 16, 2020 09:15 AM (#6)  |  Quote Quote   PM PM   E-mail E-mail
Hi,
ich habe gcc 8.2 als 68k C cross compiler auf dem Windows PC und Sublime Text als Texteditor, damit macht NKC programmierung wieder richtig Spass. SpaceInvaders source ist komplett C, keine einzige Zeile Assembler code.

Der gcc compiler ist ganz rudimentaer konfiguriert, ohne Support fuer die standart C libraries, floating point, ELF etc. Als output gibt es dann ein ganz einfaches relokatives binary ohne jeglichen esoterischen overhead. Das laesst sich auch gut dis-assemblieren und anschauen was manchmal ganz interessant ist und sehr nah (und manchmal sogar 'besser') als "Handassembler" ist. Ich benutze C also eher als grossen 'Makroassembler', das reicht mir voellig fuer ein paar sehr hardwarenahe Games.

Zum NKC uebertragen und gestartet wird das binary automatisch per USB/Arduino...von so einem setup habe ich 35 Jahre getrauemt und letztendlich (dem Internet sei Dank) in ein paar Wochen von Null hinbekommen.

Schau dir mal den Z80 cross compiler SDCC an http://sdcc.sourceforge.net/ ich denke mal damit liesse sich so ein setup wie ich es fuer den 68k habe auch fuer den Z80 machen. Waere ja super das SpaceInvaders auch fuer den Z80 zu kompilieren, und ganz generell etwas fuer das NKC Softwareportfolio zu tun...

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on January 16, 2020 07:41 PM (#7)  |  Quote Quote   PM PM   E-mail E-mail
...na, der SDCC Z80 C cross compiler hat mich dann doch noch interessiert. Also schnell mal auf PC installiert. Easy. Dann ein rudimentaeres C Program um die GDP anzusprechen:



Der erzeugte Z80 Assembler code:



So compiliert:



Die erste Zeile compiliert und erzeugt ein S19 'executable' file ohne den startup code der hier unerwuenschten C runtime libraries.
Die zweite Zeile macht aus dem S19 file ein "flat binary". Dazu benutze ich das GNU tool objcopy, das gibts ueberall im Netz.

Und hier das binary mit HxD angeschaut, 5 bytes ready for the NKC!



Ja, die Z80 CP/M C Compiler Gurus gähnen jetzt :rolleyes:, aber es geht hier um Z80 C cross compiler auf PC...und etwas NKC spezifisches (GDP), ich finde das interessanter als ein multi-kB grosses "Hello World" mit dem Speicherfresserferkel 'printf'...und all den C standart libraries, etc. die fuer die meisten NKC Prograemmchen doch irrelevant sind.

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
Steffen.111
Kennt sich schon aus
**
ID # 184


  Posted on January 18, 2020 03:58 PM (#8)  |  Quote Quote   PM PM   E-mail E-mail
@hellobomm

...warum überträgst Du nicht mit USB-Stick?
...ist doch einfacher als mit SD-Card!

Hast Du Dir mal das GP-2019 angesehen?
VG
Steffen

Posts: 140 | Member since: August 2017 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on March 23, 2020 06:39 PM (#9)  |  Quote Quote   PM PM   E-mail E-mail
Jungs, kann mir jemand verraten wie ich in Assembler den Inhalt eines Registers als Dezimalzahl auf der GDP64 ausgeben kann??

Hat jemand ein Codeschnipsel für mich? :-)))))

Posts: 19 | Member since: May 2019 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on March 23, 2020 07:48 PM (#10)  |  Quote Quote   PM PM   E-mail E-mail
Hi,
bist Du ein 68k'ler? Dann zitiere ich Jens' Handbuch des Grundprograms:

START:
CLR D4 * Zähler
SCHLEIFE:
LEA BUFFER(PC),A0 * Adresse für Ablage
MOVE.B D4,D0
MOVEQ #!PRINT8B,D7 * Zahl ausgeben
TRAP #1
LEA BUFFER(PC),A0 * Wieder Adresse laden
MOVEQ #$22,D0 * Schriftgröße
MOVEQ #2,D1 * X-Position
MOVE #128,D2 * Y-Position
MOVEQ #!WRITE,D7 * Ausgabe auf den Bildschirm
TRAP #1
MOVEQ #2,D0 * 200 ms warten
MOVEQ #!DELAY,D7
TRAP #1
ADDQ #1,D4 * Nächste Zahl
CMP #256,D4
BNE.S SCHLEIFE * Wiederholen
RTS
BUFFER:
DS.B 10 * eigentlich nur 9 Bytes nötig.

Im Z80 Grundprogramm gibts entsprechendes.

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on March 23, 2020 11:14 PM (#11)  |  Quote Quote   PM PM   E-mail E-mail
Hi smed,

danke aber ich bin noch mit der Z80 unterwegs :D
Weißt du wie die Funktion im Z80 Grundprogramm heißt die das macht? Dann kann ich im Listing nachgucken. Ich hab eigentlich schon geschaut :confused:

Grüße
hellobomm

Posts: 19 | Member since: May 2019 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on March 24, 2020 10:32 AM (#12)  |  Quote Quote   PM PM   E-mail E-mail
>Im Z80 Grundprogramm gibts entsprechendes.
Oops, sorry das stimmt ja gar nicht!

Da kann ich leider nicht wirklich weiterhelfen, habe nix in Sachen Z80.

Dieser link hilft aber weiter:
https://www.chibiakumas.com/z80/advanced.php

Gruss
smed

-----------------------
NKC'ler seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k.

NKC - OpenSource since 1983

Posts: 198 | Member since: January 2011 | IP address: not saved
Steffen.111
Kennt sich schon aus
**
ID # 184


  Posted on March 24, 2020 02:25 PM (#13)  |  Quote Quote   PM PM   E-mail E-mail
Doch, ist im GP drin !


;------------------------------------------------------------------
; Dezimalzahl HL in Buffer schreiben
; Input
;HLWert in HEX
;IXZeiger Ausgabepuffer
; Output
;IXZeigt auf Ende-Kennung
prthld:
push hl
push bc
ld bc,-10000
call prthld1
ld bc,-1000
call prthld1
prthld0:
ld bc,-100
call prthld1
ld c,-10
call prthld1
ld c,-1
call prthld1
pop bc
pop hl
ret
prthld1:
ld a,'0'-1
prthld2:
inc a
add hl,bc
jr c,prthld2
sbc hl,bc
RST 10h;call zeich, Zeichen in Buffer ab IX
ret


zeich:; Ausgabe Zeichen in Accu
ld (ix+0),a; Zeichen in Buffer schreiben
zeich1:
ld (ix+1),0; Endekennung in Buffer schreiben
inc ix; Pointer erhöhen
ret



Mist, die Formatierung ist dahin auch mit [Code]
Ich hoffe Du kommst trotzdem klar!
VG
Steffen

Posts: 140 | Member since: August 2017 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on April 18, 2020 08:10 PM (#14)  |  Quote Quote   PM PM   E-mail E-mail
Hi Steffen,

danke!! Aber ich glaub ich brauche doch deine Hilfe.


Sieht das Listing formatiert so aus? ld(ix+1),0 wurde nicht akzeptiert. Also hab ich ld a=0, ld(ix+1),a draus gemacht

;Dezimalzahl HL in Buffer schreiben
;Input: hl in hex, IXZeiger Ausgabepuffer
;Output: IXZeigt auf Ende-Kennung

prthld: push hl
push bc
ld bc,-10000
call prthld1
ld bc,-1000
call prthld1

prthld0: ld bc,-100
call prthld1
ld c,-10
call prthld1
ld c,-1
call prthld1
pop bc
pop hl
ret

prthld1: ld a,'0'-1
prthld2: inc a
add hl,bc
jr c,prthld2
sbc hl,bc
RST 10h (was macht denn das?)
call zeich (RICHTIG??????)
ret


;Ausgabe Zeichen in Accu
zeich: ld (ix+0),a; Zeichen in Buffer schreiben
zeich1: ld a=0; (geändert damit mein NKC das frisst)
ld (ix+1),a; Endekennung in Buffer schreiben
inc ix; Pointer erhöhen
ret


Könntest du mir ein ganz kurzes Beispiel zeigen wie ich z.B. die Zahl "45" mit der "prthld" auf einer Stelle im Bildschirm ausgeben kann?

Das wäre super!!

Vielen Dank!!!!

Posts: 19 | Member since: May 2019 | IP address: not saved
hellobomm
Lernt noch alles kennen
*
ID # 201


  Posted on April 18, 2020 10:25 PM (#15)  |  Quote Quote   PM PM   E-mail E-mail
ha!

ich habs hinbekommen. Ich hab das rst10h weggelassen

Danke nochmal!!!

Posts: 19 | Member since: May 2019 | IP address: not saved
Steffen.111
Kennt sich schon aus
**
ID # 184


  Posted on April 19, 2020 01:30 PM (#16)  |  Quote Quote   PM PM   E-mail E-mail
Hallo Alex,
war leider ein paar Tage nicht hier.

"RST 10h" ersetzt bei mir "Call zeich"

ld (ix+1),0 übersetzt mein Assi mit: "DD 36 01 00"
(Assi: Z80 Simulator IDE)
Mit Deiner Lösung geht das Ausgabezeichen verloren, kann aber es sein, dass es hier nicht stört.

Ist Mist, dass die Listings deformatiert werden! Oder ich bin zu blöd!?

Aber Du hast ja schon was Du wolltest! :)
VG
Steffen

PS.: Ach so Deine Frage:

call getausbuf ;Textbuffer initialisieren -> IX = Pointer

LD HL,0045h
call prthld ;HL DEZ in Buffer ab IX schreiben

ld HL,100 ;=X-Pos
ld DE,100 ;=Y-Pos
ld A, 21h ;=Schriftgröße
call printbu ;gibt Buffer auf BS aus (incl. 0ah etc)

Posts: 140 | Member since: August 2017 | IP address: not saved



| https://hschuetz.selfhost.eu | Board rules | Privacy policy


Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts


Site created in 0.034147 seconds
Processed 17 files
gzip compression enabled
2770.66 KiB memory usage