Mini Competition für "Grid"-Problem

Es gibt 165 Antworten in diesem Thema, welches 26.331 mal aufgerufen wurde. Der letzte Beitrag (5. September 2022 um 11:55) ist von -trb-.

  • Ich hab mein Päckchen bei Hannenz abgeliefert.

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • 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 $02


    Start 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 :gruebel

    mfg
    marco64

    Einmal editiert, zuletzt von marco64 (18. Dezember 2005 um 01:20)

  • 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 :gruebel

    mfg
    marco64

    im 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. :O
    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 :]

  • 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. :P

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

    Michael

    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. |

  • 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

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    5 Mal editiert, zuletzt von biguser (18. Dezember 2005 um 11:28)

  • 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.

  • 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. :O
    Sieht gut aus. So ungefähr hatte ich mir das vorgestellt :D

    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 :D

  • 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 $02

    Roland: fieses Teil :o) Verbeuge mich.
    der jsr an 80fd ist pure genius :)
    den VIC-mirror hab ich voll verpennt.

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

    3 Mal editiert, zuletzt von enthusi (19. Dezember 2005 um 10:39)

  • Oh :( ist der Thread schon tot? Dann hab ich das ende ja verpasst...
    R.I.P.

    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen.

  • 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... :D