NKC Forum
Registrieren | FAQ | Suche | Wer ist online? | Mitgliederliste | Heutige Beiträge | Kalender | Einloggen



Autor Thema: bewegte Grafik mit GDP64
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 13. Januar 2020 22:31 (#1)  |  Zitat Zitat   PN PN   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

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 14. Januar 2020 10:55 (#2)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 14. Januar 2020 17:08 (#3)  |  Zitat Zitat   PN PN   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

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 14. Januar 2020 20:48 (#4)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 15. Januar 2020 21:01 (#5)  |  Zitat Zitat   PN PN   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

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 16. Januar 2020 09:15 (#6)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 16. Januar 2020 19:41 (#7)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
Steffen.111
Kennt sich schon aus
**
ID # 184


  Erstellt am 18. Januar 2020 15:58 (#8)  |  Zitat Zitat   PN PN   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

Beiträge: 140 | Mitglied seit: August 2017 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 23. März 2020 18:39 (#9)  |  Zitat Zitat   PN PN   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? :-)))))

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 23. März 2020 19:48 (#10)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 23. März 2020 23:14 (#11)  |  Zitat Zitat   PN PN   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

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 24. März 2020 10:32 (#12)  |  Zitat Zitat   PN PN   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

Beiträge: 198 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
Steffen.111
Kennt sich schon aus
**
ID # 184


  Erstellt am 24. März 2020 14:25 (#13)  |  Zitat Zitat   PN PN   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

Beiträge: 140 | Mitglied seit: August 2017 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 18. April 2020 20:10 (#14)  |  Zitat Zitat   PN PN   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!!!!

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
hellobomm
Lernt noch alles kennen
*
ID # 201


  Erstellt am 18. April 2020 22:25 (#15)  |  Zitat Zitat   PN PN   E-Mail E-Mail
ha!

ich habs hinbekommen. Ich hab das rst10h weggelassen

Danke nochmal!!!

Beiträge: 19 | Mitglied seit: Mai 2019 | IP-Adresse: nicht gespeichert
Steffen.111
Kennt sich schon aus
**
ID # 184


  Erstellt am 19. April 2020 13:30 (#16)  |  Zitat Zitat   PN PN   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)

Beiträge: 140 | Mitglied seit: August 2017 | IP-Adresse: nicht gespeichert



| https://hschuetz.selfhost.eu | Boardregeln | Datenschutzerklärung


Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts


Seite in 0,032407 Sekunden erstellt
16 Dateien verarbeitet
gzip Komprimierung eingeschaltet
2497,12 KiB Speichernutzung