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