Code optimization 2 (Development Foros MSX)MSX Resource Center MSXdev 2008 - MSX1 development bonanza!           
                       
English Nederlands Español Português Russian                  
 Noticias
   Página principal
  Almacén de noticias
  Temas de noticias

 Recursos
   Foros MSX
  Artículos
  Analisis
  Informe de ferias/RUs
  Álbum de fotos
  Ferias y encuentros
  Encuestas
  Enlaces
  Buscar

 Software
   Descargas
  Tienda Online

 MRC
   Quiénes somos
  Únete a nuestro equipo
  Donar
  Políticas
  Contacta con nosotros
  Enlázanos
  Estadísticas

 Buscar
 
  

  

 Login
 

Login

Contraseña




¿Aún no tienes una cuenta? ¡Conviértete en miembro del MSX Resource Center! ¡Únete a nosotros!.


 Estadísticas
 

Hay 115 invitados y 6 miembros en línea

Eres un usuario anónimo.
 

Foros MSX


Foros MSX

Development - Code optimization 2

Autor

Code optimization 2

ARTRAG
msx master
Mensajes: 1592
Publicado: Febrero 09 2008, 18:24   
Which version can be better optimized ?

Version 1


ld_de_ix    macro
            db  0xdd
            ld  d,h
            db  0xdd
            ld  e,l
            endm

ld_ix_de    macro
            db  0xdd
            ld  h,d
            db  0xdd
            ld  l,e
            endm

ld_bc_ix    macro
            db  0xdd
            ld  b,h
            db  0xdd
            ld  c,l
            endm

ld_ix_bc    macro
            db  0xdd
            ld  h,b
            db  0xdd
            ld  l,c
            endm

helper      macro
            ex  de,hl
            pop af          ; get return address
            pop de          ; get nframe
            push af         ; put return address
            push ix    
            push hl         ; save source_addr
        
            ld  hl,_frames
            add hl,de
            add hl,de
            ld  e,(hl)
            inc hl
            ld  d,(hl)  ; de punta alla frame corrente
            endm
            
                    
psect   npct,global,size=06000h

framex0:
    dw p0
    db 0,2
    db 0,2
    db 128

frame0:
    dw p1
    db 5,1
    db 4,1
    db 3,1
    db 2,1
    db 1,1
    db 128

p0:
    db 18,19,20,21
p1:
    db 147,147,147,147,147

_frames:
    dw framex0,frame0


    global _map_w


;de   dest_addr in the room
;bc   nframe;
    global __npctplot
__npctplot:
    push    ix
    ld  hl,_frames
    add hl,bc
    add hl,bc
    ld  c,(hl)
    inc hl
    ld  b,(hl)

    ld_ix_bc    ; ora ix punta alla frame corrente

    ex  de,hl   ; hl punta alla destinazione in room

    ld  e,(ix+0) ; de punta ai dati della frame
    ld  d,(ix+1)

    jp  2f      ; SHARED_LOOP


;de   source_addr;
;bc   dest_addr in the room
;stack nframe
    global __npctrest
__npctrest:
    helper

    ld_ix_de    ; ora ix punta alla frame corrente

    pop de      ; de punta alla source in buffer

    ld h,b
    ld l,c      ; ora hl punta alla destination in room

    jp  2f

; SHARED_LOOP

1:  push hl
    ld  c,a
    ld  b,0
    add hl,bc       ; dest

    ld  c,(ix+1)    ; len
    ex de,hl
    ldir
    ex  de,hl

    pop hl
    ld  bc,(_map_w)
    add hl,bc

2:  inc ix
    inc ix

    ld  a,(ix+0)      ; 128 == fine
    and a
    jp  p, 1b
    pop ix
    ret

ex_de_ix    macro
            db  0xdd
            ld  a,h   ; 10
            db  0xdd            
            ld  h,d   ; 10
            ld  d,a     ; 5
            
            db  0xdd            
            ld  a,l   ; 10
            db  0xdd            
            ld  l,e   ; 10
            ld  e,a     ; 5
            endm
            


;de   source_addr in the room
;bc   dest_addr;
;stack nframe
    global __npctgrab
__npctgrab:
    helper        
    
    inc de      ; skip pointer
    inc de

    pop hl      ; hl punta alla source in room

    ld_ix_bc    ; punta alla destination in frame buffer

    ld  b,0
    jp 2f

1:  push hl
    ld  c,a
    add hl,bc       ; source
    
    inc  de
    ld  a,(de)    ; len
    ld  c,a
    inc de
    
    ex_de_ix  
    ldir
    ex_de_ix  
    
    pop hl
    
    ld  bc,(_map_w)
    add hl,bc

2:  ld  a,(de)      ; 128 == fine
    and a
    jp  p, 1b
    pop ix
    ret



Version 2

framex1:
db 0,2,18,19
db 0,2,20,21
db 128

frame0:
db 5,1,147
db 4,1,147
db 3,1,147
db 2,1,147
db 1,1,147
db 128

_frames:
    dw  framex1,frame0

    global _map_w

;de dest_addr in the room
;bc nframe;
global _npctplot
_npctplot:

    ld hl,_frames
    add hl,bc
    add hl,bc

    ld a,(hl)
    inc hl
    ld h,(hl)
    ld l,a

    ld bc,0
    jp 2f

loop:
    ex de,hl
    add hl,bc
    push hl         ;save dest
    ld c,a
    add hl,bc
    ex de,hl

    inc hl
    ld c, (hl)
    inc hl
    ldir

    pop de          ;restore dest    
   
    ld a,(_map_w)
    ld c,a
        
2:  ld a,(hl)
    and a
    jp p,loop
    ret




;de   source_addr;
;bc   dest_addr;
;stack nframe
    global _npctgrab
_npctgrab:

    ex  de,hl
    pop af          ; get return address
    pop de          ; get nframe
    push af         ; put return address
    push ix    
    push hl         ; save source_addr

    ld  hl,_frames
    add hl,de
    add hl,de
    ld  e,(hl)
    inc hl
    ld  d,(hl)  ; de punta alla frame corrente

    db  0xdd    
    ld  l,e
    db  0xdd
    ld  h,d     ; ora ix punta alla frame corrente

    pop hl      ; hl punta alla source in room

    ld d,b  ; bc puntava alla destination in frame buffer
    ld e,c  ; ora de punta alla destination in frame buffer
    ld  b,0
    
    jp  2f

1:  ld  c,a
    push hl
    add hl,bc       ; source

    ld  c,(ix+1)    ; len
    inc c
    inc c
    add ix,bc
    dec c
    dec c

    ldir
    pop hl
    ld  bc,(_map_w)
    add hl,bc

2:  ld  a,(ix+0)      ; 128 == fine
    and a
    jp p,1b

    pop ix
    ret


;de   source_addr;
;bc   dest_addr;
;stack nframe
    global _npctrest
_npctrest:

    ex  de,hl
    pop af          ; get return address
    pop de          ; get nframe
    push af         ; put return address
    push ix    
    push hl         ; save source_addr

    ld  hl,_frames
    add hl,de
    add hl,de
    ld  e,(hl)
    inc hl
    ld  d,(hl)  ; de punta alla frame corrente

    db  0xdd    
    ld  l,e
    db  0xdd
    ld  h,d     ; ora ix punta alla frame corrente

    pop hl      ; hl punta alla source in room

    ld d,b      
    ld e,c      ; de punta alla destination in frame buffer

    ld  b,0
        
    jp 2f

1:  push de
    add a,e
    ld  e,a
    jp nc,3f
    inc d
3:    

    ld  c,(ix+1)    ; len
    inc c
    inc c
    add ix,bc
    dec c
    dec c
    
    ldir
    pop de

    ld  a,(_map_w)
    add a,e
    ld e,a
    jp nc,2f
    inc d
    
2:  ld  a,(ix+0)      ; 128 == fine
    and a
    jp p,1b

    pop ix
    ret


Both work but version 2 seems faster

 
 







(c) 1994 - 2008 Fundación MSX Resource Center. MSX es una marca registrada de MSX Licensing Corporation