Code optimization 2 (Development MSX Fora)MSX Resource Center MSXdev 2008 - MSX1 development bonanza!           
            
English Nederlands Español Português Russian         
 Nieuws
   Voorpagina
  Nieuws archief
  Nieuws onderwerpen

 Informatie
   MSX Fora
  Artikelen
  Recensies
  Beursverslagen
  Fotoreportages
  Beurzen en meetings
  Enquêtes
  Links
  Zoek

 Software
   Downloads
  Webshop

 MRC
   Wie we zijn
  Kom bij ons team
  Doneren
  Policies
  Contact met het MRC
  Link naar Ons
  Statistieken

 Zoek
 
  

  

 Login
 

Gebruikersnaam

Wachtwoord




Ben je nog niet lid? Klik hier en word MSX vriend!


 Statistieken
 

Er zijn 127 gasten en 4 MSX vrienden online

Je bent een anonieme bezoeker.
 

MSX Fora


MSX Fora

Development - Code optimization 2

Schrijver

Code optimization 2

ARTRAG
msx master
Berichten: 1592
Geplaatst: 09 Februari 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 Stichting MSX Resource Center. MSX is een trademark van MSX Licensing Corporation.