Кодинг для Спектрум и 8бит

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Кодинг для Спектрум и 8бит » Программирование » Деление на 10


Деление на 10

Сообщений 1 страница 3 из 3

1

Как-то раз мне попался на глаза трэд

Код:
; HL dividend less then 1023d ( only need 0-799 )
; returns A quotient
; H remainder


Div10:
xor a
ld b,#7
ld de,#-640d
divloop:
add hl,de
jr c, div1
sbc hl,de
ora a ; not sure if this is needed here to clear carry
div1:
rl a
add hl,hl
djnz divloop
add hl,hl
ret


нифига не понятно(: я стал искать дальше. Ее один Unsigned Integer Division Routines для 6502:

Код:
;Divide by 10
;17 bytes, 30 cycles
  lsr
  sta  temp
  lsr
  adc  temp
  ror
  lsr
  lsr
  adc  temp
  ror
  adc  temp
  ror
  lsr
  lsr


Уф, мне стало легче. Подобный код можно переписать на z80:

Код:
;compile with sjasmplus
	device zxspectrum128
        ORG #6000
begin


	jr $
	ld a,34
;;;Divide by 10
;;;17 bytes, 30 cycles
;;  lsr
	srl a
;;  sta  temp
	ld c,a
;;  lsr 0->A->C
	srl a
;;  adc  temp
	adc a,c
;;  ror C<-7<-0<-C
	rr a
;;  lsr
	srl a
;;  lsr
	srl a
;;  adc  temp
	adc a,c
;;  ror
	rr a
;;  adc  temp
	adc a,c
;;  ror
	rr a
;;  lsr
	srl a
;;  lsr
	srl a
;A=N/10
	jr $
end
	display /d,end-begin
	savesna "!void.sna",begin

Это работает. Я решил испытать алгоритм на 16 бит:

Код:
	device zxspectrum128
        ORG #6000
begin
	jr $
	ld hl,1234

;  lsr
	srl h:rr l
;  sta  temp
	ld bc,hl
;  lsr
	srl h:rr l
;  adc  temp
	adc hl,bc
;  ror
	rr h:rr l
;  lsr
	srl h:rr l
;  lsr
	srl h:rr l
;  adc  temp
	adc hl,bc
;  ror
	rr h:rr l
;  adc  temp
	adc hl,bc
;  ror
	rr h:rr l
;  lsr
	srl h:rr l
;  lsr
	srl h:rr l
	
;HL=123
	jr $
end
	display /d,end-begin
	savesna "!void.sna",begin


И, кажется, что решение очень интересное, которое есть куда применить. Только я не врубаюсь, как это работает.

2

В школе должны были научить делить столбиком.
Без остатка бесполезно.
Разбираться в коде в котором чистится и так сброшенный флаг и используется rl a нельзя ни при каких условиях, слабоумие заразно.

3

про остаток верно сказано
Вот еще вариант:

Код:
	device zxspectrum128
        ORG #6000
begin

;fix wrong .SNA
;костылек ужясма
  LD            HL ,$5CB6
  LD            ($5C4F),HL
  LD            DE ,$15AF
  LD            BC ,$0015
  EX            DE ,HL
  LDIR
  EX            DE ,HL
  DEC           HL
  LD            ($5C57),HL
  INC           HL
  LD            ($5C53),HL
  LD            ($5C4B),HL
  LD            (HL)  ,$80
  INC           HL
  LD            ($5C59),HL;E-LINE

;2
 ld hl,$15C6
 ld de,$5C10
 ld bc,$0E
 ldir

;открытие потока
 ld a,2
 call $1601

	ld a,22
	rst 10h

	xor a
	rst 10h

	rst 10h

	ei


;print
	ld hl,0
prlp:
	push hl
	exx; DE=place for data, B=count numbers
	ld de,dstring-1
	ld b,0
	exx
;http://z80-heaven.wikidot.com/math#toc21
;Speed Optimised HL_div_10
;By adding 9 bytes to the code, we save 87 cycles:
;(min speed = 636 t-states)
DivHLby10:
;Inputs:
;     HL
;Outputs:
;     HL is the quotient
;     A is the remainder
;     DE is not changed
;     BC is 10

 ld bc,$0D0A
 xor a
 add hl,hl
 rla
 add hl,hl
 rla
 add hl,hl
 rla

b2: add hl,hl
 rla
 cp c
 jr c,b1;$+4
   sub c
   inc l
b1: djnz b2;$-7
 exx
 inc b
 inc de
 ld (de),a
 exx
 ld a,h
 or l
 jr nz,DivHLby10

;print number
	exx
prnum:
	ld a,(de)
	dec de
	add a,"0"
	rst 10h
	djnz prnum

	ld a,","
	rst 10h
	exx
	pop hl
	inc hl
	
	ld a,h
	or l
	jp nz,prlp
 jr $
dstring:
end
	display /d,end-begin
	savesna "!void.sna",begin



Вы здесь » Кодинг для Спектрум и 8бит » Программирование » Деление на 10