From: io_x on 7 Oct 2009 03:04 "Esra Sdrawkcab" <admin(a)127.0.0.1> ha scritto nel messaggio news:op.u1edaqyxhswpfo(a)dell3100... > On Tue, 06 Oct 2009 08:54:24 +0100, io_x <a(a)b.c.invalid> wrote: >> lea si, [di+sopra] > this isn't needed until later, and can be a direct address, i.e . > mov si, arr+sopra yes this is true because "lea si, [di+sopra]" seems here 4 but "mov si, arr+sopra" should be 3 >> rep stosb ; tutto 10 [visitato] qui cx=0 >> lea di, [si-sopra2] > lea -> mov > this amount can be calculated at assembly time: > mov di, arr+sopra2, I think this instead here have no gain >> mov bx, H21 > can we assume bh=0? I think so > mov bl,H21 > >> mov ax, "+-" >> mov dx, "|N" ; le caselle NN: non visitate >> .2: mov cx, L ; altrimenti visitate > as cx was 0 from above, you need only mov cl,L >> .3: stosw >> mov byte[di], ah >> inc di >> loop .3 >> stosb >> mov byte[di], 0Dh >> inc di >> inc di ; fa la linea >> xchg ax, dx >> dec bx >> jnz .2 ; passa alla linea successiva >> mov byte[di], '$' >> mov byte[di-sopra2-3], 07fh > can be a direct memory address and where is the gain? thank you
From: io_x on 7 Oct 2009 06:08 "io_x" <a(a)b.c.invalid> ha scritto nel messaggio news:4ac5c7f6$0$1106$4fafbaef(a)reader4.news.tin.it... > http://www.frontiernet.net/~fys/hugi/hcompo.htm it is 200 byte ;for hugi compo #29 - random mazes ;nasmw -o m.com m.asm ;>nasmw -v ; NASM version 0.98.38 compiled on Sep 12 2003 ;; ; Una casella e' la seguente scrittura ; +-- ; |XY ; quindi e' formata da 6 chars. ; N significa *non visitato*, se a posto di N ci sta un qualsiasi altro ; carattere significa visitato. ; +--+--+--+ ; | |3 | | ; +--+--+--+ ; | 2|NN|0 | ; +--+--+--+ ; | |1 | | ; +--+--+--+ ; L == lunghezza in caselle del rettangolo del labirinto ; H == altezza in caselle del rettangolo del labirinto ;; %define L 25 %define H 10 ; massimi valori ;%define L 85 ;%define H 86 %define BytesMemory ((L+1)*(H+2)*6) %define H21 (2*H+1) %define sopra (L+1)*6 %define sopra2 (L+1)*3 %define LineareMax 3*((L-1)+2*(L+1)*H)+1 %define passi (LineareMax-sopra-1)/3 org 100h Start: ; **************************** ; *** Prende il numero with the help by Esra Sdrawkcab ; **************************** ; assumo che ax==0 mov si, 081h mov bl, ' ' ..0: aad 10 ; al+=10*ah e ah=0 mov ah, al lodsb sub al, bl mov bl, '0' ; prima ' ' poi '0' jge .0 ; o un char minore di '0' mov [seed], ah ; inizializza il seed per rand ; ******************************************* ; *** Fa la griglia ; ******************************************* mov di, arr mov cx, BytesMemory mov al, 10 rep stosb ; all\a mov di, (arr+sopra2) mov bx, H21 mov ax, "+-" mov dx, "|N" ; le caselle NN: non visitate ..2: mov cx, L ; altrimenti visitate ..3: stosw mov byte[di], ah inc di loop .3 stosb mov byte[di], 13 inc di inc di ; fa la linea xchg ax, dx dec bx jnz .2 ; passa alla linea successiva mov byte[di], '$' mov byte[di-sopra2-3], 07fh mov si, (arr+sopra) mov byte[si], 02h ; ritorna in si la casella iniziale ; ************************************** ; *** Trova una casella casuale ; ************************************** ; P(x,y)=i_inz+y*(L+1)*6+x*3 mov cx, L call ran mov bx, dx add bx, dx add bx, dx ; x*3 mov cx, H call ran mov ax, sopra mul dx ; y*(L+1)*6 add bx, ax lea di, [si+bx] ; in di la casella iniziale del labirinto ; ******************************************* ; *** Fa il labirinto ; ******************************************* ; parte dalla casella puntata da di inc di ; punta all'interno della casella, dove c'e' 'N' ..4: mov word[di], " " ; " " significa visitata ..5: mov cx, 4 call ran ; le caselle confinanti sono 4 ..6: and dx, 03h ; dl=0[destra],1[basso],2[sinistra],3[alto] mov si, dx mov bp, dx mov bx, [muro+si+bp] ; in bx offset del muro ; se bp=2*bx-(--(si&1)) => in bp offset della prossima casella and si, 1 dec si lea bp, [bx+si] add bp, bx cmp byte[di+bp], 'N' je .a ; se tale casella non e' visitata va in .a ..7: inc dx loop .6 ; vai alla prossima casella ; ** caso le caselle sono tutte visitate cmp sp, 0FFFEh jae .z ; se lo stack e' vuoto esci[ e'in casella iniziale] pop dx pop di ; altrimenti prende la casella precedente mov cl, 4 jmp short .7 %if BytesMemory>24000 ..e: mov sp, 0FFFEh ret ; nel caso di errore non stampa esce al dos ; ritorna al DOS %endif ..a: ; ** caso vi � una casella non visitata mov word[di+bx], " " ; leva il muro di divisione [ed eventualemente una N] ; che verra' in ogni caso levata dall'istruzione in .4 %if BytesMemory>24000 cmp sp, limite jbe .e ; lo stack non puo' invadere questo file in memoria %endif push di push dx add di, bp jmp short .4 ..z: ; ****************************** ; *** Stampa sullo schermo ; ****************************** lea dx, [arr+sopra2] mov ah, 09h int 21h ; usa si per stampare l'array ret ; ritorna un numero 0..cx in dx ran: mov ax, 04e35h imul word[seed] inc ax mov [seed], ax shr ax, 8 cwd idiv cx ret align 2 seed dw 0 ;; ; +--+--+--+ ; | |3 | | ; +--+--+--+ ; | 2|NN|0 | ; +--+--+--+ ; | |1 | | ; +--+--+--+ ; dl=0[destra],1[basso],2[sinistra],3[alto] ;; ; 0 1 2 3 muro dw 2, sopra2, -1, -sopra2 Section .bss arr resb BytesMemory fine resb 4 limite resb 4
From: Benjamin David Lunt on 7 Oct 2009 20:17 "io_x" <a(a)b.c.invalid> wrote in message news:4acc66f1$0$1100$4fafbaef(a)reader3.news.tin.it... > > "io_x" <a(a)b.c.invalid> ha scritto nel messaggio > news:4ac5c7f6$0$1106$4fafbaef(a)reader4.news.tin.it... >> http://www.frontiernet.net/~fys/hugi/hcompo.htm > > it is 200 byte > Got it. It passes the test. Thanks. Ben
From: io_x on 9 Oct 2009 02:43 "io_x" <a(a)b.c.invalid> ha scritto nel messaggio news:4acc66f1$0$1100$4fafbaef(a)reader3.news.tin.it... > > "io_x" <a(a)b.c.invalid> ha scritto nel messaggio > news:4ac5c7f6$0$1106$4fafbaef(a)reader4.news.tin.it... >> http://www.frontiernet.net/~fys/hugi/hcompo.htm > > it is 200 byte 188 ;for hugi compo #29 - random mazes ;nasmw -o m.com m.asm ;>nasmw -v ; NASM version 0.98.38 compiled on Sep 12 2003 ;; ; Una casella e' la seguente scrittura ; +-- ; |XY ; quindi e' formata da 6 chars. ; N significa *non visitato*, se a posto di N ci sta un qualsiasi altro ; carattere significa visitato. ; +--+--+--+ ; | |3 | | ; +--+--+--+ ; | 2|NN|0 | ; +--+--+--+ ; | |1 | | ; +--+--+--+ ; L == lunghezza in caselle del rettangolo del labirinto ; H == altezza in caselle del rettangolo del labirinto ;; %define L 25 %define H 10 ; massimi valori ;%define L 85 ;%define H 86 %define BytesMemory ((L+1)*(H+2)*6) %define H21 (2*H+1) %define sopra (L+1)*6 %define sopra2 (L+1)*3 %define LineareMax 3*((L-1)+2*(L+1)*H)+1 %define passi (LineareMax-sopra-1)/3 org 100h Start: ; **************************** ; *** Prende il numero with the help by Esra Sdrawkcab ; **************************** ; assumo che ax==0 bx=0 mov si, 081h mov bl, ' ' ..0: aad 10 ; al+=10*ah e ah=0 mov ah, al lodsb sub al, bl mov bl, '0' ; prima ' ' poi '0' jge .0 ; o un char minore di '0' mov bl, ah ; inizializza il seed==bx per rand ; ******************************************* ; *** Fa la griglia ; ******************************************* mov di, arr mov cx, BytesMemory mov al, 10 rep stosb ; all\a cx==0 mov di, (arr+sopra2) mov bp, H21 mov ax, "+-" mov dx, "|N" ..2: mov cl, L ; altrimenti visitate ..3: stosw mov byte[di], ah inc di loop .3 stosb mov byte[di], 13 inc di inc di ; fa la linea xchg ax, dx dec bp jnz .2 ; passa alla linea successiva mov byte[di], '$' mov byte[di-sopra2-3], 07fh mov si, (arr+sopra) mov byte[si], 02h ; ritorna in si la casella iniziale ; ************************************** ; *** Trova una casella casuale ; ************************************** ; P(x,y)=i_inz+y*(L+1)*6+x*3 mov cl, L call ran mov bp, dx add bp, dx add bp, dx ; x*3 mov cl, H call ran mov ax, sopra mul dx ; y*(L+1)*6 add bp, ax lea di, [si+bp] ; in di la casella iniziale del labirinto ; ******************************************* ; *** Fa il labirinto ; ******************************************* ; parte dalla casella puntata da di inc di ; punta nella casella, dove c'e' 'N' ..4: mov word[di], " " ; " " significa visitata ..5: mov cl, 4 call ran ; le caselle confinanti sono 4 ..6: and dx, byte 03h ; dl=0[dest.],1[basso],2[sini.],3[alto] mov si, dx mov bp, dx mov bp, [muro+si+bp] and si, byte 1 dec si add si, bp lea ax, [bp+di] add si, ax ; B[k+k+j+i]=='N' cmp byte[si], 'N' je .a ; se tale casella non e' visitata va in .a ..7: inc dx loop .6 ; vai alla prossima casella ; ** caso le caselle sono tutte visitate cmp sp, 0FFFEh jae .z ; se lo stack e' vuoto esci pop dx pop di ; altrimenti prende la casella precedente mov cl, 4 jmp short .7 %if BytesMemory>24000 ..e: mov sp, 0FFFEh ret ; nel caso di errore non stampa proprio niente: ; ritorna al DOS %endif ..a: ; ** caso vi � una casella non visitata mov word[di+bp], " " ; leva il muro di divisione [ed forse una N] ; che verra' in ogni caso levata in .4 %if BytesMemory>24000 cmp sp, limite jbe .e ; lo stack non puo' invadere la memoria %endif push di push dx mov di, si jmp short .4 ..z: ; ****************************** ; *** Stampa sullo schermo ; ****************************** mov dx, (arr+sopra2) mov ah, 09h int 21h ret ; ritorna un numero 0..cx in dx ran: mov ax, 04e35h imul bx inc ax mov bx, ax shr ax, 8 cwd idiv cx ret align 2 ;; ; +--+--+--+ ; | |3 | | ; +--+--+--+ ; | 2|NN|0 | ; +--+--+--+ ; | |1 | | ; +--+--+--+ ; dl=0[destra],1[basso],2[sinistra],3[alto] ;; ; 0 1 2 3 muro dw 2, sopra2, -1, -sopra2 Section .bss arr resb BytesMemory fine resb 128 limite resb 4
From: Esra Sdrawkcab on 10 Oct 2009 06:23
On Fri, 09 Oct 2009 07:43:32 +0100, io_x <a(a)b.c.invalid> wrote: > > "io_x" <a(a)b.c.invalid> ha scritto nel messaggio > news:4acc66f1$0$1100$4fafbaef(a)reader3.news.tin.it... >> >> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio >> news:4ac5c7f6$0$1106$4fafbaef(a)reader4.news.tin.it... >>> http://www.frontiernet.net/~fys/hugi/hcompo.htm >> >> it is 200 byte > > 188 [snipped] > ; ******************************************* > ; *** Fa la griglia > ; ******************************************* Could you save some here by not filling the maze at start, but adding crlf as you go? (add 3 bytes) mov si,0A0dh (delete these 4 lines, 10 bytes) > mov di, arr > mov cx, BytesMemory > mov al, 10 > rep stosb ; all\a cx==0 > mov di, (arr+sopra2) > mov bp, H21 > mov ax, "+-" > mov dx, "|N" > .2: mov cl, L ; altrimenti visitate > .3: stosw > mov byte[di], ah > inc di > loop .3 > stosb (delete these 3 lines 4 bytes) > mov byte[di], 13 > inc di > inc di ; fa la linea but adding crlf here? (add 3 lines 3 bytes) xchg ax,si ; si not used yet, make it crlf stosw ; add crlf, 2*inc di xchg ax,si ;put back > xchg ax, dx > dec bp > jnz .2 ; passa alla linea successiva > mov byte[di], '$' > mov byte[di-sopra2-3], 07fh > mov si, (arr+sopra) > mov byte[si], 02h ; ritorna in si la casella iniziale initialise maze is now 2C bytes =44d Nuns! Reverse! |