Раздели на калькуляторе
Получишь: 1234/5678=0,21733004579
и ещё куча цифр, но нам такой точности не надо
Нам надо 16-ти битная дробная часть
т.е. умножаем это число на 65536 и получаем 14242 (#37A2)
Вид для печати
аа, понял. Эта процедура только для целочисленного деления.
Смотри тут
Есть вроде подходящая процедура - DIV 12/12=8.8
А возможно её под 16 бит переделать?Код:;DIV 12/12=8.8
;HL(SIGN)=HL(SIGN)/DE(UNSIGN)
FDIVW LD BC,0
EX DE,HL
INC H:DEC H
JR Z,FDVW2
.3 INC B:SRA H:JR Z,FDVW1:RR L
INC B:SRA H
FDVW1 RR L
FDVW2 LD H,TBLOG2[
LD A,(HL):INC H
LD H,(HL):LD L,A
ADD HL,BC
EX DE,HL
LD A,H:RLA
JR NC,FDVW3
LD A,L:CPL:LD L,A
LD A,H:CPL:LD H,A:INC HL
SCF
FDVW3 EX AF,AF
LD BC,#0800
INC H:DEC H
JR Z,FDVW5
.3 INC B:SRA H:JR Z,FDVW4:RR L
INC B:SRA H
FDVW4 RR L
FDVW5 LD H,TBLOG2[
LD A,(HL):INC H
LD H,(HL):LD L,A
ADD HL,BC
OR A:SBC HL,DE
JP M,FDVW8
LD A,H:LD B,A
LD H,TB2X[
LD L,(HL):LD H,1
SUB 8:JR NC,FDVW7
LD A,7:SUB B
LD ($+4),A
JR NZ,$
.7 ADD HL,HL
LD L,H,H,0
FDVW6 EX AF,AF
RET NC
LD A,L:CPL:LD L,A
LD A,H:CPL:LD H,A:INC HL
RET
FDVW7 LD A,#0F:SUB B
JR C,FDVW8
LD ($+4),A
JR NZ,$
.7 ADD HL,HL
JR FDVW6
FDVW8 LD HL,0
RET
Destr, там еще какая то таблица требуется
ты бы размерность таблицы посмотрелКод:FDVW2 LD H,TBLOG2[
Так, с делилкой вроде разобрались.
Как насчёт умножайки?
16*16=32 (HL*DE=HLDE)
Сейчас юзаю такую:
Бывают быстрей?Код:IMULW ; (+-) HLDE = HL*DE
LD A,H:XOR D:PUSH AF
BIT 7,H:CALL NZ,NEGHL
BIT 7,D:CALL NZ,NEGDE
CALL MULW
POP AF
RET P
NEGHLDE XOR A:SUB E:LD E,A
LD A,0:SBC A,D:LD D,A
LD A,0:SBC A,L:LD L,A
SBC A,H:SUB L:LD H,A
RET
MLW0 LD HL,0
RET
NEGHL XOR A:SUB L:LD L,A
SBC A,H:SUB L:LD H,A
RET
NEGDE XOR A:SUB E:LD E,A
SBC A,D:SUB E:LD D,A
RET
MULW ; HLDE = HL * DE
LD A,L:OR H:JR Z,MLW0
LD A,E:OR D:JR Z,MLW0
LD A,L,B,H:LD HL,0:OR A
JP Z,MLW3
DUP 8
RRA:JR NC,$+3:ADD HL,DE:RR H,L
EDUP
RRA:LD C,A
LD A,B
MULW1 OR A:JR Z,MLW2
DUP 8
RRA:JR NC,$+3:ADD HL,DE:RR H,L
EDUP
RRA:LD D,A,E,C
RET
MLW3 LD A,L,L,H,H,0
LD C,A,A,B
JR MULW1
MLW2 LD A,L,L,H,H,0
LD D,A,E,C
RET
Ребята, а отсюда:
http://baze.au.com/misc/z80bits.html
процедуры пройдут?
Вообще нужна процедура 16=16*16
Но хитрая.
Сейчас делаю так:
CALL IMULW ;HLDE=HL*DE
LD E,D,D,L
Т.е. нужны собственно не HLDE, а только LD
Как-бы сократить чтоб шустрей было?