Ich hab mein Päckchen bei Hannenz abgeliefert.
Mini Competition für "Grid"-Problem
-
hannenz -
14. Dezember 2005 um 17:52 -
Erledigt
Es gibt 165 Antworten in diesem Thema, welches 26.335 mal aufgerufen wurde. Der letzte Beitrag (
-
-
es ist jetzt 00:24 und es sind bei mir 5 PNs /Mails eingegangen; desweiteren habe ich jeweils die letzten Posts derjenigen mitaufgenommen, die ihrene Code schon gepoistet hatten, somit sind insgesamt 10 Codes angetreten.
Die Ansätze sind alle recht ähnlich (Charset ändern und ROM-Clrscr-Routine), nur ein Code hat einen anetwas anderen Ansatz über $d3d8, habe leider keine Ahnung was das macht aber es schint zu funktionieren ;). Dies ist mit 21 bzw. 22 Bytes auch der WINNER-CODE (mit/ohne Illegal opcode)
Ein abgegebener Code bringt leider nicht das geforderte Ergebnis.
Die Längen gehen von 21 bis 49 Bytes.Hier nun aber endlich die Codes:
GRID Problem Auswertung........und ... den KÜRZESTEN HAT .........................................................................
GRATULIERE ****************** B I G U S E R ************************
-----------------------------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: biguser (version 1)
Länge: 21 Bytes
läuft auf: enthält 1 Illegal Opcode
Start: SYS 264
------------------------------------------------
* = $0100!by $ff,$80,$80,$80,$80,$80,$80,$80 ; 8
lda #$10 ; 2
loop sta $d3d8,y ; 3
ror ; 1
iny ; 1
bne loop ; 2
jsr $e536 ; 3
!by $02; jam ; 1 / illegal Opcode
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: biguser (version 2)
Länge: 22 Bytes
läuft auf: ohne Illegal Opcode
Start: SYS 264
------------------------------------------------
* = $0100!by $ff,$80,$80,$80,$80,$80,$80,$80 ; 8
lda #$10 ; 2
loop sta $d3d8,y ; 3
ror ; 1
iny ; 1
bne loop ; 2
jsr $e536 ; 3
bne * ; 2
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: DrCreep:
Länge: 23 Bytes,
läuft auf: Emu, Original (nicht altes ROM)
Start: SYS 257
------------------------------------------------
0100 FF .by $ff
0101 8E 21 D0 stx $d021
0104 8E 20 D0 stx $d020
0107 A9 11 lda #$11
0109 8D 18 D0 sta $d018
010C 20 36 E5 jsr $e536
010F A9 80 lda #$80
0111 9D 00 01 sta $0100,x
0114 E8 inx
0115 D0 FA bne $0111
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: Derrick
Länge: 24 Bytes
läuft auf: ?
Start: SYS 264
-------------------------------------------------
*=$100!Byte $ff,$80,$80,$80,$80,$80,$80,$80
sta $d020
sta $d021
lda #$11
sta $d018
jsr $e536
!Byte $02
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: Marco65
Länge: 24 Bytes
Start: sys 264
------------------------------------------------
.C:0100 FF 80 80 80 80 80 80 80
.C:0108 8E 20 D0...STX $D020
.C:010b 8E 21 D0...STX $D021
.C:010e A9 11......LDA #$11
.C:0110 8D 18 D0...STA $D018
.C:0113 20 36 E5...JSR $E536
.C:0116 D0 FE......BNE $0116
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: cky
Länge: 27 Bytes
läuft auf:
Start: sys 8456
** dieser code ergibt leider nicht das geforderte Ergebnis!! **
------------------------------------------------
*=$2100.byte $00,$7f,$7f,$7f
.byte $7f,$7f,$7f,$7f
sta $d020
sta $d021
jsr $e536
lda #$19
sta $d018
inc $d021
bne *
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: Kratznagel
Länge: 27 Bytes
Start: sys 264
------------------------------------------------
*= $0100
!byte %11111111
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
*= $0108
stx $d020
stx $d021
ldx #%00010001
stx $0286
stx $d018
jsr $e544
.loop
bne .loop
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: BastetFurry
Länge: 28 Bytes
Start: sys 8456
------------------------------------------------
*=$2100
!byte %11111111
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
!byte %10000000
;Startaddresse ist $2108 oder 8456
stx $d020
stx $d021
inx
stx $0286
lda #%00011000
sta $d018
jsr $e544
endless:
bne endless
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: jansalleine
Länge: 41 Bytes
Start: sys 4096
------------------------------------------------
*=$1000
ldy #$04
ldx #$19
stx $d018
p1 lda #$80
sta $1f10,x
lda #$41
sta $0286
jsr $ffd2
stx $2008
inx
bne p1
sty $07e7
dey
bne p1
stx $d020
stx $d021
jmp *
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: cbmhardware
Länge: 49 Bytes
Start: sys 8206
------------------------------------------------
*=$2008!Byte $80,$80,$80,$80,$80,$80,$80,$ff
; sys 8206 zum Starten
lda #$18
sta $D018
stx $d020
stx $d021
ldy #$04
loop_: lda #$01
char: sta $0400,x
color: sta $d800,x
dex
bne loop_
iny
sty char+2
tya
adc #$d3
sta color+2
cpy #$09
bne loop_
jmp *-4
------------------------------------------------ -
Nicht schlecht....
..nach anfänglichen staunen über grössen wie 32, 30, 28 usw... und der vermutung, dass es nicht kürzer geht sind ja die meisten auf die idee mit dem stack und sehr kurze versionen gekommen....
ps: wo ist der code von enthusi ? naja...kommt ja vielleicht noch.
Meine Version hatte ich ja sogar mal in einem Demo veröffentlicht

(zum Glück hat das wohl keiner hier gefunden)naja.. hier der Code (der NICHT im Stack liegt):
ps: der code setzt keine vorbelegung von x,y oder accu register voraus
(so wie die meisten hier voraussetzen, dass accu oder x = $00 ist)$80F5 SEI
$80F6 TXS
$80F7 LDA #$10
$80F9 STA $D3D7,X
$80FC TXA
$80FD JSR $E536
$8100 TSX
$8101 DEX
$8102 BNE $80F5
$8104 kill-opcode $02Start auf $8100 (oder Sys 33024) ....und dann ca. 10 Sekunden warten....dauert halt bis sich das Programm entpackt
also nicht gleich denken, dass es nicht geht.Sind dann also 16 Bytes (wenn man kein illegal opcode will dann eben ein BEQ $8104 anstelle des kill-opcode $02.... dann sinds 17 Bytes)
Viel Spass beim analysieren...
Ps: habe noch eine 14 Byte Version, die aber leider nicht ganz 100% das Ergebniss bringt)
Sind also
-
biguser: Wie genau funktioniert dieses "STA $D3D8,y". Ich weis zwar das es alle 64? Byte Schatten gibt aber mit "STA $D018,y" gibt es nur Müll

mfg
marco64 -
Zitat
Original von marco64
biguser: Wie genau funktioniert dieses "STA $D3D8,y". Ich weis zwar das es alle 64? Byte Schatten gibt aber mit "STA $D018,y" gibt es nur Müll
mfg
marco64im prinzip gehts darum, dass man nur EINEN STA für $d018, d020 und d021 verwendet. drum mit ,X.
und da X ja über einige werte heruntergezählt wird (z.b. von $ff bis $00) und man ja
nicht will, dass so wichtige adressen wie $d011 oder $d016 mit dem falschen wert überschrieben werden, legt man die basis-adresse auf $d3d8 (oder d3d7)....dann werden im endeffect die VIC adressen $d017- $d03f überschrieben...und da liegt für den bildschirm in diesem fall nix wichtiges (mit ausnahme von $d018, d020 und d021, und DIE wollen wir ja setzen)....
nach $d3d7 legt man es, da wie schon gesagt, der VIC alle 64 bytes gespiegelt wird.
würde man die basisadresse auf $d017 (oder d018 ) legen, würde ja z.b. $d051 auch überschrieben (also $d011) und das wollen wir nicht.so wird eben $d3d7 - $d4d6 überschrieben ...und ab $d400 liegt der SID, der für uns keine Rolle spielt.
-
Roland:
Danke, hab verstanden. Darauf hätte man fast selber kommen können, man sieht nur den Wald vor lauter Bäumen nicht. :baby:Trotzdem habe ich immer noch nicht kappiert warum dein Prg läuft. Mal sehen ob es klar wird wenn ich einen Einzelschrittdurchlauf mache.
gruss
marco64
-
Hmmm, als ASM-Anfänger kann ich wohl mit Platz 3 zufrieden sein :D.
Teilweise sehr interessant - die anderen.Bin aber zu müde um das jetzt noch zu verstehen.

Werd's mir morgen nochmal genauer ansehen.Die Idee mit dem EINEN STORE-Befehl für alle drei hatte ich zwar auch, hab sie aber nicht umsetzen können ;(.
Naja, bin schon gespannt was als nächstes kommt...
-
Falls ich das richtig sehe wird in Rolands Routine bei jedem Aufruf von $E536 aus der Adresse $80FD heraus als Rücksprungadresse $ff,$80 auf den Stack gepackt. Mit TSX DEX TXS geht es dann byte-weise den Stack abwärts, bis man am Anfang bei $0100 angekommen ist und der Stack dann von $0100 aus an mit $ff,$80,$80,$80, etc. gefült ist. Damit in der Zwischenzeit keine Interuptroutine andere Werte auf den Stack packt, wird per SEI der Interrupt verhindert...
-
Ich hab ne ganze weile gebraucht bis ich es verstanden habe. Zuerst dachte ich das durch das häufe springen ins rom irgendwo eine art überlauf stattfindet, aber das der Sprung selbst das Zeichen aufbaut habe ich erst gesehen als ich den Stack bei jedem Befehl anzeigen lassen habe. GENIAL
![Freude :]](https://www.forum64.de/wcf/images/smilies/pleased.gif)
-
Zitat
Original von hannenz
Hier nun aber endlich die Codes:
GRID Problem Auswertung........und ... den KÜRZESTEN HAT .........................................................................
Bitte melde dich an, um diesen Link zu sehen.
Da bin ich ja nochmal davon gekommen.

Eigentlich hatte ich mit meinem kurzen Versuch beim Kaeffchen auch nicht wirklich mitgemacht.

Michael
-
Auch wenns lahm ist, keine schlechte Methode, Roland. Jetzt, wo man die Lösung sieht, liegt es praktisch auf der Hand es so zu machen. Darauf gekommen wäre ich wohl dennoch nicht. Ich bin auch nur ein lausiger Coder.
Wenn man Dr.Creeps Erzeugung der 7x #$80 Charbytes + gekoppelter Endlosloop mit meiner Version kreuzt, dann erhält man noch eine schnelle 21 Bytes lange Version ohne illegale Opcodes.
* = $0100
!by $ff ; 1
lda #$10 ; 2
loop1 sta $d3d8,y ; 3
ror ; 1
iny ; 1
bne loop1 ; 2
jsr $e536 ; 3
lda #$80 ; 2
loop2 sta $0100,x ; 3
inx ; 1
bne loop2 ; 2 -
Zitat
Original von Roland
Sind dann also 16 Bytes (wenn man kein illegal opcode will dann eben ein BEQ $8104 anstelle des kill-opcode $02.... dann sinds 17 Bytes)Na wenigstens hab ich ne gute Schätzung abgegeben, wie lang der Code von Roland wohl sein wird. Sehr interessant die ganze Geschichte.
-
Zu den Rom-Versionen: In der AAY sind die Unterschiede aufgelistet.
-
Zitat
Original von biguser
Wenn man Dr.Creeps Erzeugung der 7x #$80 Charbytes + gekoppelter Endlosloop mit meiner Version kreuzt, dann erhält man noch eine schnelle 21 Bytes lange Version ohne illegale Opcodes.Darüber hatte ich gestern Nacht auch noch kurz nachgedacht. War aber zu faul und zu müde.

Sieht gut aus. So ungefähr hatte ich mir das vorgestellt
Rolands Lösung ist natürlich perfekt. Wär ich aber im Leben nicht drauf gekommen - obwohl es so klar ist, wenn man's erstmal gesehen hat

-
ZitatAlles anzeigen
Original von hannenz
------------------------------------------------
Bitte melde dich an, um diesen Link zu sehen.
Autor: cky
Länge: 27 Bytes
läuft auf:
Start: sys 8456
** dieser code ergibt leider nicht das geforderte Ergebnis!! **
------------------------------------------------Hm, hannenz...da musst mir mal auf die Sprünge helfen, inwiefern erfüllt er nicht das geforderte Ergebnis. Vielleicht habe ich ja auch bloss 'ne Denkblockade

-
bei mir erzeugt der Code sowohl auf dem Original als auch auf VICE nur einen weißen Hintergrund mit schwarzem Rahmen... es war allerdings auch schon spät heut nacht beim Abtippen in den Monitor.... vielleicht habe ich mich vertippt??! Ich check das gleich nochmal...
EDIT: Ok, muß mich wohl entschuldigen, da war ich wohl schon zu müde letzte NAcht, sorry CKY. Natürlich funktioniert der Code.
-
Zitat
Original von hannenz
EDIT: Ok, muß mich wohl entschuldigen, da war ich wohl schon zu müde letzte NAcht, sorry CKY. Natürlich funktioniert der Code.Macht nichts, hätte ja auch sein können, das da 'nen Bug drin ist

-
Huch? Man musste was rechtzeitig einschicken? Naja, ich bin erst heute wieder da.
Meine Versionen waren beide 22 byte code zzgl 2 byte header dann natuerlich
Die erste ohne ill.Opcode und in Vice laufend.Code*=$0100 !byte $ff !byte $80,$80,$80,$80,$80,$80,$80 a asl sta $d020,x lda #$11 sta $d018 jsr $e536 bcs a
dafuer die md5-sum falls jemand 'kontrollieren' will
der code da oben sollte auch auf den alten ROMs laufen (oder?)und leider genauso lang, aber da ware noch was drin denke ich:
Code*=$2101 !byte $7f,$7f,$7f,$7f,$7f,$7f,$7f sta $d020 jsr $e536 stx $d021 ldy #$19 sty $d018 !byte $02Roland: fieses Teil :o) Verbeuge mich.
der jsr an 80fd ist pure genius
den VIC-mirror hab ich voll verpennt. -
Oh
ist der Thread schon tot? Dann hab ich das ende ja verpasst...
R.I.P. -
Zitat
Original von enthusi
Oh
ist der Thread schon tot? Dann hab ich das ende ja verpasst...
R.I.P.Wie war das noch gleich ?? "Wer zuletzt kommt, der macht einen neuen Thread mit neuer Aufgabe auf", oder so ähnlich...

-