2017-02-24 12 views
0

http://zxm.speccy.cz/data/Z80%20Bits.html#2.2이 z80 분할 알고리즘이 손상 되었습니까?

입력 : HL = 배당, C = 제수, A = 0 출력 : HL = 지수, A = 나머지

add hl,hl  ; unroll 16 times 
rla   ; ... 
cp c  ; ... 
jr c,$+4  ; ... 
sub c  ; ... 
inc l  ; ... 

나는 그것을 밖으로 시도하고, HL 설정 = $ 1200 = 0, c = $ 91, 나는 HL에서 0을 얻는다. $ 1f가 아니어야합니까?

+0

나는 c> 7Fh 및 HL> 00FFh 일 때 코드가 실패 할 수 있다고 생각한다. 들어오는 비트가 1 인 A == 80h라고 가정하면 A == 01h로 롤오버됩니다. 그러나 C> 7Fh 인 별도의 경우를 수행하면 처음 8 번의 반복을 다음과 같이 최적화 할 수 있습니다. ld a, h \ ld h, l \ ld l, 0. – Zeda

답변

1

깨졌습니다. 당신이 $1200A을 통해 당신이 더 큰 $91보다 얻는다 결코 볼 시프트 레지스터 경우

add hl,hl  ; unroll 16 times 
rla    ; ... 
jr c,$+5  ; important! 
cp c   ; ... 
jr c,$+4  ; ... 
sub c   ; ... 
inc l   ; ... 

: 여기에 고정 된 버전입니다. 그러나 $90에 도달하면 $120이 아닌 $20이 아닌 다음 비교가 필요합니다. 추가 한 캐리 (carry)에 대한 체크는 그 케이스를 처리합니다.

페이지의 많은 예제와 비슷한 문제가있는 것처럼 보입니다.

덧붙여서 rla 대신에 속도 나 크기는 변하지 않지만 투명도가 크게 증가하여 대신에 adc a,a을 사용할 수 있습니다. AHL은 24 비트 숫자로 처리됩니다.

+0

잘 작동하는 것 같습니다. 고마워요! –