Speicherbereiche füllen, einstellen, verschieben in Assembler

Moderator: Rockford

Antworten
yMoreT8
Beiträge: 43
Registriert: 18.03.2024 17:33
Has thanked: 7 times
Been thanked: 2 times
Kontaktdaten:

Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von yMoreT8 »

Das ist mit dem 6502 durchaus etwas aufwändig. Ich glaube ich muss um z.b. einen player0 memory zu initialisieren, mit indirekt-impliziten Befehlen arbeiten wie dem

Code: Alles auswählen

STA (ptr),Y
'ptr'müsste dann aber irgenwo in die page0 zeigen ($0000–$00FF). Soweit ich das erkennen kann ist dort nur bis $7F belegt?

Dann müsste ich für eine loop einen count Parameter mitgeben. Bis 256 Stellen könnte man mit einem Register mitteilen, z.B. dem X.

Code: Alles auswählen

addr = $0080
	lda #$00
	sta addr
	lda #$4
	sta addr+1
	ldx #255
	jsr clearmen
	rts
	
clearmem
	lda #00
loop
	sta (addr),y
	iny
	dex
	cpx #00
	bne loop
So, in der Art...

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von pps »

Hier im Beispiel ist Y nicht definiert.
Man kann auch statt X gleich Y nehmen im loop.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von Dr. Irata »

die Schleife kanst du schneller machen:

Code: Alles auswählen

		.proc clearmem
		lda #0
		ldy #0
loop
		sta (addr),y
		iny
		bcc  loop
		
		rts
		.endp	

Online
Benutzeravatar
DjayBee
Beiträge: 681
Registriert: 17.08.2021 04:02
Has thanked: 418 times
Been thanked: 200 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von DjayBee »

Da hast du einen Tippfehler drin und ein Byte lässt sich auch noch sparen.

Code: Alles auswählen

		.proc clearmem
		lda #0
		TAY
loop
		sta (addr),y
		iny
		BNE  loop
		
		rts
		.endp	


yMoreT8
Beiträge: 43
Registriert: 18.03.2024 17:33
Has thanked: 7 times
Been thanked: 2 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von yMoreT8 »

DjayBee hat geschrieben:
24.03.2024 00:08

Code: Alles auswählen

		.proc clearmem
		lda #0
		TAY
loop
		sta (addr),y
		iny
		BNE  loop
		rts
		.endp	
Ja, "tay" lädt ja den Akku A in das Y-Register. Da A auf 00 eingestellt ist ist das gleichbedeutend mit "ldy #0" in diesem Kontext. Will man den Speicher wirklich immer auf 00 einstellen ist das ok, will man ihn mit einem beliebigen Wert initialisieren, z.B. auch mal $FF, dann müsste man es getrennt machen.

Ist das Assembler-Makro ".proc" und ".endp" nur guter Stil, oder hat das auch eine echte Funktion? Die Angabe der Schleifenposition "loop" ist ja immer etwas kritisch, weil man die ja oft braucht. Sorgt das Klammern in proc/endp vielleicht dafür das diese Sprungmarke nur innerhalb dieser Subroutine gilt und nicht global für den Rest des Codes?

Damit kann ich ja auch nur 256 Bytes in auf einer Page-Boundary leeren. Wenn ich, wie z.B. beim PM 2kb Speicher initialisieren will, müsste ich die 8mal aufrufen. Man könnte nun eine Spezialroutine machen die sowas tut:

Code: Alles auswählen

		sta (addr),y
		sta (addr+$100),y
		sta (addr+$200),y
		sta (addr+$300),y
		sta (addr+$400),y
		sta (addr+$500),y
		sta (addr+$600),y
		sta (addr+$700),y
und somit gleich acht 256-Byte Blöcke auf einmal leert. Das wäre dann eine "clearmem2kb" oder so.
Macht das Sinn? Oder baut man eine universelle Routine die dann andere Parameter benötigt?
Dazu müsste man neben der Basis-Adresse auch die Anzahl der Bytes in einem WORD irgendwo im Speicher ablegen. Man könnte ja anstelle dem Register auch die Speicherstelle mit "inc/dec" zählen lassen. Nur für den Überlauf muss man wohl selbst sorgen, da inc/dec auch nur auf ein Byte wirken.

Da man damit ohnehin nur Speicherbereiche initialisieren kann die auf eine Page-Boundary liegen, würde es doch auch reichen als Einsprung-Parameter neben der Länge in Bytes die Page anzugeben? Ich merke schon das es einen großen Unterschied macht ob man eine Universalroutine bauen will oder eine hochspezialisierte. Auch später im Laufzeitverhalten. Also sollte man sich evtl. sogar zwei Routinen bauen:
Variante a) Eine die an einer beliebigen Stelle im Arbeitsspeicher eine beliebige Anzahl Bytes auf einen beliebigen Wert einstellen kann.
Variante b) Eine die eine oder mehrere Pages an einer gegebenen Page auf einen bestimmten Wert einstellt. Hier würde ich nichtmal einen Byte-Counter angeben, sondern es wird die ganze Page initialisiert.

So hätte man etwas superflexibles, was halt länger läuft und für die Holzhammer-Dinger eine hochperformante, die aber nur grob arbeitet.

Online
Benutzeravatar
DjayBee
Beiträge: 681
Registriert: 17.08.2021 04:02
Has thanked: 418 times
Been thanked: 200 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von DjayBee »

yMoreT8 hat geschrieben:
24.03.2024 12:51
Ist das Assembler-Makro ".proc" und ".endp" nur guter Stil, oder hat das auch eine echte Funktion?
Das musst du Dr.Irata fragen. Ich habe das noch nie benutzt. ;)
Die Angabe der Schleifenposition "loop" ist ja immer etwas kritisch, weil man die ja oft braucht. Sorgt das Klammern in proc/endp vielleicht dafür das diese Sprungmarke nur innerhalb dieser Subroutine gilt und nicht global für den Rest des Codes?
MADS unterstützt für solche offensichtlichen Minisprünge das Label "@".
Wenn du zu @+ springst, wird das nächste hinter dem aktuellen Punkt liegende @ angesprungen. Mit @- das davor stehende, was in unserem Beispiel korrekt als Ersatz für "loop" wäre.
Damit kann ich ja auch nur 256 Bytes in auf einer Page-Boundary leeren. Wenn ich, wie z.B. beim PM 2kb Speicher initialisieren will, müsste ich die 8mal aufrufen. Man könnte nun eine Spezialroutine machen die sowas tut:
Nicht mit (indirekter),y Adressierung, nur mit absoluter.
Alternativ kannst du in einer äußeren Schleife einfach das High-Byte deiner Zeropage Adresse hochzählen.
Da man damit ohnehin nur Speicherbereiche initialisieren kann die auf eine Page-Boundary liegen
Warum? Wenn deine Startadresse keine page-Boundary ist, dann kannst du beliebige Bereiche beackern.
Nur die Ende-Abfrage wird dann etwas kniffliger.

yMoreT8
Beiträge: 43
Registriert: 18.03.2024 17:33
Has thanked: 7 times
Been thanked: 2 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von yMoreT8 »

Eine Page-Fill Routine, also eine die nur ganze Pages füllen kann, könnte dann z.B. so aussehen:

Code: Alles auswählen


; DEMO
	lda #$ff		; fill memory with FF
	ldx #$40	; fill page $40 (=$4000)
	ldy #$08	; fill 8 pages (=$4000 - $4800)
	jsr fillPage

ADRPTR = $0090
PCOUNT = $0092

; Set memory pagewise at given page to given value
; Fill value in register A
; Start page in register X (0-255)
; Number of pages in register Y (1-255)

	.proc fillPage
	pha
	lda #$00
	sta ADRPTR
	stx ADRPTR+1
	sty PCOUNT
	pla

pgloop	ldy #$00
byloop	sta (ADRPTR),y
	iny
	bne byloop
	inc ADRPTR+1
	dec PCOUNT
	bne pgloop
	
	rts
	.endp fillPage	
Zuletzt geändert von yMoreT8 am 24.03.2024 13:26, insgesamt 1-mal geändert.

yMoreT8
Beiträge: 43
Registriert: 18.03.2024 17:33
Has thanked: 7 times
Been thanked: 2 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von yMoreT8 »

Laut MADS Gitlab page: "MADS allows using ... local-global-temporary labels.". JAC! hat das hier sogar erklärt, mein Riecher war also richtig:
https://forums.atariage.com/topic/17955 ... nt-2246672
Alles was man in ".proc" und ".endp" umschließt ist lokal. Somit kann man auch Bibliotheken bauen und Labels wiederverwenden die sich dann nicht gegenseitig beeinflussen.

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von pps »

yMoreT8 hat geschrieben:
24.03.2024 13:24
Laut MADS Gitlab page: "MADS allows using ... local-global-temporary labels.". JAC! hat das hier sogar erklärt, mein Riecher war also richtig:
https://forums.atariage.com/topic/17955 ... nt-2246672
Alles was man in ".proc" und ".endp" umschließt ist lokal. Somit kann man auch Bibliotheken bauen und Labels wiederverwenden die sich dann nicht gegenseitig beeinflussen.
Und wenn man dann noch innerhalb eines Procs Routinen mit .local/.endl nutzt, kann man noch mehr Lokale Variablen und auch Sprunglabels immer wieder nutzen.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von Dr. Irata »

Wenn man längere Programme schreibt, kann es schnell unübersichtlich werden. Daher nutze ich die .proc / .endp Funktion - es ist wie so eine Art Objective Programmierung. Damit baue ich ganz viele kleine manchmal auch etwas größere Programmroutinen, die ich immer wieder auch aus anderen Programmteilen nutze. Diese Proc´s kann man bei Mads auf- und zuklappen, so habe ich immer beim programmieren eine wirklich gute Übersicht!!
Aber jeder muss da seinen eigenen Weg finden!!

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von Dr. Irata »

Bildschirmfoto 2024-03-24 um 13.41.52.png
so sieht das bei mir aus, wenn ich programmiere... ist ein kleiner Ausschnitt meines aktuellen Projektes...

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von pps »

Dr. Irata hat geschrieben:
24.03.2024 13:42
Bildschirmfoto 2024-03-24 um 13.41.52.png

so sieht das bei mir aus, wenn ich programmiere... ist ein kleiner Ausschnitt meines aktuellen Projektes...
Puh, da hätte ich aber schon längst ausgelagert in externe Dateien. Aber ja, ich mache sowas auch nicht sofort, sondern, nur dann, wenn es mir zu viel wird. Oft schreibe ich drauf los. Dann wird es auch so eine Mega Datei. Wenn das Projekt dann aber länger benötigt, um fertig zu werden, lagere ich dann irgendwann aus. Das ist dann doch übersichtlicher.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Speicherbereiche füllen, einstellen, verschieben in Assembler

Beitrag von Dr. Irata »

... ja das mit ausgelagerten Dateien habe ich auch im ersten Projekt gemacht, so ist es für mich übersichtlicher ...

Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast