From: io_x on

"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

"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

"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

"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
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!