Autore Topic: Array Sort  (Letto 1963 volte)

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Array Sort
« il: 06 Novembre 2004, 17:35:59 »
 Su comp.sys.cbm c'e' il solito Rick Balkins (Wildstar) che sbrocca sul progetto CSDoom, dice di essere un programmatore quando non sa manco cosa servono LDA STA e i ";" nei sorgenti asm. L'hanno sfidato a scrivere un programma in asm, senza copiarlo - come ha gia' fatto dal sito di Richard Bayliss. :D
Ad ogni modo, si tratta di scrivere un prg che riordini un array di 256 bytes.
Questo e' quello che sono riuscito a fare.
Codice: [Seleziona]
; sort a 256 byte array at $c100
; challenge set up by MagerValp to Wildstar on COMP.SYS.CBM :D
; Message-ID: <p14hdo4fak2.fsf@panini.cling.gu.se>
; thread "wildstar.hollosite.com - request to be shutdown."
; iAN CooG/HokutoForce
        org $c000
array   = $c100
FIRST   = $fb
SECOND  = $fd

        ldy #1
        sty SECOND     ; $C101
        dey
        sty FIRST      ; $C100
        lda #>array
        sta FIRST+1
        sta SECOND+1
loop    
        lda (SECOND),y
        cmp (FIRST),y
        bcs noswap     ; 2nd less than 1st , swap them
        pha            ;A = (SECOND)
        lda (FIRST),y
        sta (SECOND),y
        pla
        sta (FIRST),y
noswap  
        inc SECOND
        bne loop       ; checked all 2nd elements? 1st is the lower now
        ldx FIRST      ; now set next ptrs: $C101 and $C102
        inx
        stx FIRST
        inx
        beq exit       ; if 2nd = $ff we can exit
        stx SECOND
        bne loop
exit  
        rts

Si puo' ottimizzare, o al limite ridurre?
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Array Sort
« Risposta #1 il: 07 Novembre 2004, 05:58:05 »
 
Citazione da: "iAN CooG/HF"
Si puo' ottimizzare, o al limite ridurre?
ridurre si puo'
Codice: [Seleziona]
       org $c000

array   = $c100

loop    
        ldy #$00
        ldx #$01
next    
        lda array,x  ; C100+x = $c101
        cmp array-1,x; C0ff+x = $c100
        bcs cont
swap    
        pha
        lda array-1,x
        sta array,x
        pla
        sta array-1,x
        iny            ; Y>0 = flag to repeat all
cont    
        inx
        bne next
        cpy #$00       ; a swap was done?
        bne loop       ; then repeat
        rts            ; else we're done
sono 16 istruzioni in 32 bytes, contro le 25 in 44b della mia prima versione.
Ma perde di efficienza perche' si ripete il ciclo senza tenere conto che il primo elemento, dopo ogni ripetizione, e' sempre il valore minore e si potrebbe fare a meno di controllare.
Ma chi se importa, parlare di efficienza con una routine che deve fare cosi' poche cose e' un po' esagerato :P
L'importante e' che sia ridotto.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Array Sort
« Risposta #2 il: 07 Novembre 2004, 16:30:51 »
 Ed ecco i RISULTATI di questa competition non dichiarata :)

Alla fine le versioni piu' ottimizzate sono bene o male uguali.
Il risultato piu' appagante e comico e' stato che Wildstar, non sapendo che pesci pigliare, ha postato sul canale #c64friends (floodando) il sorgente che si trova QUA , sgamato dal sottoscritto 2 minuti dopo che l'aveva postato.
Grazie a questa ennesima e plateale bravata ora e' ufficialmente bollato a vita come Gran Cazzaro della comunita' C64 :D
I log della serata sono a disposizione per i curiosi e per chi si vuole fare un po' di risate (non si nota che ci sto godendo come un riccio, vero?) :ciapet:  
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

The Overkiller

  • Utente
  • **
  • Post: 367
    • http://hokutoforce.c64.org
  • Gioco Preferito: Project Firestart
Array Sort
« Risposta #3 il: 07 Novembre 2004, 18:50:05 »
 Dhe hi ho  :D . Ho visto che hanno partecipato anche Fungus e TMR ....
The Overkiller / Hokuto Force / PoL
Hokuto Force

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Array Sort
« Risposta #4 il: 08 Novembre 2004, 23:07:58 »
 
Citazione da: "The Overkiller"
Dhe hi ho  :D . Ho visto che hanno partecipato anche Fungus e TMR ....
Sia le entries di TMR che di Fungus non funzionavano. TMR l'ho gia' avvertito perche' aveva fatto una mini-cappella sul loop (loppava all'infinito), Fungus si arrangia, la sua routine manco va. Altre 2 entries sono errate, ChristianLott e MarkSeelye, perche' shiftano a dx di un byte l'array.
Anche i grandi sbagliano :fagiano:
Comunque, oggi mi sono dato da fare e ho finalmente ottenuto delle versioni iper ridotte.

Codice: [Seleziona]
; sort a 256 byte array at $c100
; V1.6 less efficient but 37 bytes, used illegal opcode LAX(zp),y
; 1st comparison always on the same element
; iAN CooG/HokutoForce
        org $c000
array   = $c100
FIRST   = $fb
SECOND  = $fd

        lda #>array
        sta FIRST+1
        sta SECOND+1
        lda #0
        tay
        sta FIRST      ; $C100
loop1  
        sta SECOND     ; $C100
loop2  
        lax (SECOND),y
        cmp (FIRST),y
        bcs noswap     ; 2nd less than 1st , swap them
        lda (FIRST),y
        sta (SECOND),y
        txa
        sta (FIRST),y
noswap  
        inc SECOND
        bne loop2      ; checked all 2nd elements? 1st is the lower now
        inc FIRST      ; now set next ptrs: $C101 and $C102
        lda FIRST
        bne loop1
exit    
        rts

Notare l'uso dell'opcde LAX che carica il valore contemporaneamente in A e X.

E per finire, la versione piu' piccola che sono riuscito ad ottenere: 30 bytes

Codice: [Seleziona]
; sort a 256 byte array at $c100
; v2.0  less efficient but very small, 30 bytes
; used both X & Y as indexes
; 1st comparison on same element at every loop start
; iAN CooG/HokutoForce

        org $c000

array   = $c100

        ldx #0
loop1  
        txa
        tay
loop2  
        lda array,y
        cmp array,x
        bcs noswap
        pha
        lda array,x
        sta array,y
        pla
        sta array,x
noswap  
        iny
        bne loop2
        inx
        bne loop1
        rts


in pratica il tutto funziona grazie a questo pseudocodice
Codice: [Seleziona]
N=0;
while(N<256)
{
   M=N;
   while(M<256)
   {
     if(ARR[M]<ARR[N])
       swap(ARR[M],ARR[N]);
     M++;
   }
   N++;
}
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Array Sort
« Risposta #5 il: 08 Novembre 2004, 23:32:36 »
 Io ero riuscito a ridurre di un byte la tua versione precedente:

Codice: [Seleziona]
org $c000

array   = $c100

loop    
       ldy #$01
       ldx #$01
next    
       lda array,x ; C100+x = $c101
       cmp array-1,x; C0ff+x = $c100
       bcs cont
swap    
       pha
       lda array-1,x
       sta array,x
       pla
       sta array-1,x
       iny           ; Y>0 = flag to repeat all
cont    
       inx
       bne next
       dey      ; a swap was done?
       bne loop      ; then repeat
       rts           ; else we're done

Spero di non aver fatto una cappella come gli altri! Ciao!
-=MarC=ellO=-

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Array Sort
« Risposta #6 il: 09 Novembre 2004, 01:11:21 »
Citazione da: "MarC=ello"
Spero di non aver fatto una cappella come gli altri! Ciao!
Anzi, funziona perfettamente.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Array Sort
« Risposta #7 il: 09 Novembre 2004, 01:37:31 »
 Dimenticavo: Wildstar roolez!  :D

Citazione
E per finire, la versione piu' piccola che sono riuscito ad ottenere: 30 bytes

 :hail:  
-=MarC=ellO=-

fab

  • Utente
  • **
  • Post: 493
    • http://wav-prg.sourceforge.net/
  • Gioco Preferito: Tetris, Turrican, Impossible Mission
Array Sort
« Risposta #8 il: 13 Novembre 2004, 13:13:24 »
Citazione da: "iAN CooG/HF"
Grazie a questa ennesima e plateale bravata ora e' ufficialmente bollato a vita come Gran Cazzaro della comunita' C64 :D
 
Non ce n'era bisogno: i suoi post su comp.sys.cbm e sulla mailing list del C-One (ogni tanto Jens Schoenfeld della Individual Computers si in***za con lui. Allora lui usa degli eteronimi, come Zenomega2x, ma viene scoperto subito, mettendosi ancora più in ridicolo) erano già abbastanza. Ma questa è un'ulteriore conferma.

A volte mi chiedo: ma chi glielo fa fare a Wildstar di mettersi in ridicolo di fronte a tutta la comunità? Pensare che basterebbe che stesse zitto, e nessuno lo prenderebbe in giro!
Un giapponese sa recitare a memoria tutti i numeri di pi greco fino all'83431º decimale. Sa a memoria anche l'unico numero telefonico che è nella sua agendina - Daniele Luttazzi

The Overkiller

  • Utente
  • **
  • Post: 367
    • http://hokutoforce.c64.org
  • Gioco Preferito: Project Firestart
Array Sort
« Risposta #9 il: 13 Novembre 2004, 17:35:27 »
Citazione da: "fab"
Citazione da: "iAN CooG/HF"
Grazie a questa ennesima e plateale bravata ora e' ufficialmente bollato a vita come Gran Cazzaro della comunita' C64 :D
 
Non ce n'era bisogno: i suoi post su comp.sys.cbm e sulla mailing list del C-One (ogni tanto Jens Schoenfeld della Individual Computers si in***za con lui. Allora lui usa degli eteronimi, come Zenomega2x, ma viene scoperto subito, mettendosi ancora più in ridicolo) erano già abbastanza. Ma questa è un'ulteriore conferma.

A volte mi chiedo: ma chi glielo fa fare a Wildstar di mettersi in ridicolo di fronte a tutta la comunità? Pensare che basterebbe che stesse zitto, e nessuno lo prenderebbe in giro!
Perchè è un represso.... Io non so una cippa di assembly e do il mio contributo alla comunità con quello che so fare, si vede che lui invece vuole passare per il megacool coder.  Vabbè !!!!!   :dotto:  
The Overkiller / Hokuto Force / PoL
Hokuto Force

djwiper

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Array Sort
« Risposta #10 il: 17 Novembre 2004, 10:20:24 »
 Mi impegnerò... studierò per partecipare prima o poi anche io a queste 'sfide'  :P

Eppure sapete una cosa? Guardando lo pseudo-codice di IAN, che dovrebbe essere in C, riesco a grandi linee a capire come tradurlo in ASM. Mi sorge una domanda: non è che è meglio, per me, imparare un pò meglio il C per poi passare all'ASM? Ovviamente il C semplice, senza implementazioni di oggetti che difficilmente vedrei nell'amato commodore.
Ho capito di odiare le firme...

fab

  • Utente
  • **
  • Post: 493
    • http://wav-prg.sourceforge.net/
  • Gioco Preferito: Tetris, Turrican, Impossible Mission
Array Sort
« Risposta #11 il: 17 Novembre 2004, 20:24:35 »
Citazione da: "djwiper"
riesco a grandi linee a capire come tradurlo in ASM. Mi sorge una domanda: non è che è meglio, per me, imparare un pò meglio il C per poi passare all'ASM?
Io ho imparato l'Assembler del C64 prima di sapere che il C esistesse. Però conoscere meglio i linguaggi di programmazione aiuta.

Tieni presente che l'Assembler è privo di qualsiasi strutturazione (cicli ecc.) e ti devi implementare praticamente tutto da zero. In questo senso è simile al BASIC del C64  ;)  
Un giapponese sa recitare a memoria tutti i numeri di pi greco fino all'83431º decimale. Sa a memoria anche l'unico numero telefonico che è nella sua agendina - Daniele Luttazzi