byte mirror

Por monant

Resident (48)

imagem de monant

10-04-2008, 22:26

[ input = 1 byte ; value to be mirrored
result = 1 byte ; mirrored byte ]

org &hc000
xor a : ld (result),a
ld c,1 : ld d,128 : ld b,8
start ld a,(input)
and c
jr z,after
ld a,(result) : add a,d : ld (result),a
after sla c : srl d :djnz start
ret

Hallo ,

I coded this routine as it come up to my mind, but

I need a simplier and faster routine to mirror a byte.

when I say Mirror i mean for example

input = &b11000000 result = &b00000011
input = &b00000001 result = &B10000000

thanks

Entrar ou registrar-se para comentar

Por jltursan

Prophet (2619)

imagem de jltursan

10-04-2008, 23:15

Just rotate?

Try this one:


; INPUT: A=byte to be rotated
; OUPUT: C=byte rotated

	ld b,8
rot:	rrca
	rl c
	djnz rot
	ret

Por monant

Resident (48)

imagem de monant

10-04-2008, 23:24

got it! ,This routine is professionalHannibal

Por ro

Scribe (4812)

imagem de ro

11-04-2008, 19:26

Well, you know. Only pros here! Tongue

Por Edwin

Paragon (1182)

imagem de Edwin

11-04-2008, 21:54

In that case, I'll optimise it somewhat for speed!


; INPUT: A=byte to be rotated
; OUPUT: C=byte rotated

	ld b,4
rot:	rrca
	rl c
        rrca
	rl c
	djnz rot
	ret

It is a miracle! Tongue

Por arnold_m

Master (173)

imagem de arnold_m

11-04-2008, 22:48

No need to use the b register here:

; INPUT: A=byte to be mirrored
; OUTPUT: C=mirrored byte

  scf
  adc a,a
loop:
  rr c
  add a,a
  rr c
  add a,a
  jp nz, loop
  ret

Of course one can also unroll the loop even further, left as exercise for the reader.

If you have too much memory on your hands you could usea look-up table:

; INPUT: C=byte to be mirrored
; OUTPUT: A=mirrored byte

  ld b,mirrortable/256
  ld a,(bc)
  ret
  .balign 256 ; align to 256-byte boundary
mirrortable:
  defb #00, #80, #40, #C0 ; etc. 

You'll want to generate the data with one of the other methods. The actual routine is now as long as a call, so you should make it a macro rather than a call.

Por Metalbrain

Expert (67)

imagem de Metalbrain

13-04-2008, 16:22

My version:

; INPUT: A=byte to be rotated
; OUPUT: C=byte rotated

	ld c,1
rot:	rrca
	rl c
	jr nc,rot
	ret