18 inTeGeR MulTiPlieR
18-2
Seiko epson Corporation
S1C63003/004/008/016 TeChniCal Manual
(Rev. 1.1)
Division Mode
18.4
To perform a division, set the divisor to the source register (SR) and the dividend to the destination register (DRH
and DRL), then write "1" to the calculation mode select register (CALMD). The division takes 10 CPU clock cycles
from writing "1" to CALMD until the quotient is loaded into the low-order 8 bits (DRL) of the destination register
and the remainder is loaded into the high-order 8 bits (DRH) of the destination register. At the same time the result is
loaded, the operation flags (NF, VF and ZF) are updated. However, when an overflow results (if the quotient exceeds
the 8-bit range), the destination register (DRH and DRL) does not change its contents as it maintains the dividend.
The following shows the conditions that change the operation flag states and examples of division.
N flag: Set when the MSB of DRL is "1" and reset when it is "0."
V flag: Set when the quotient exceeds the 8-bit range and reset when it is within the 8-bit range.
Z flag: Set when the 8-bit value in DRL is 00H and reset when it is not 00H.
<examples of division>
DRH/DRL (dividend) SR (divisor) DRL (quotient) DRH (remainder)
NF
VF
ZF
1A16H
64H
42H
4EH
0
0
0
332CH
64H
83H
00H
1
0
0
0000H
58H
00H
00H
0
0
1
2468H
13H
68H
24H
1
1
0
In the example of "2468H"
÷
"13H" shown above, DRH/DRL maintains the dividend because the quotient overflows
the 8-bit. To get the correct results when an overflow has occurred, perform the division with two steps as shown
below.
1. Divide the high-order 8 bits of the dividend (24H) by the divisor (13H) and then store the quotient (01H) to
memory.
DRH/DRL (dividend) SR (divisor) DRL (quotient) DRH (remainder)
NF
VF
ZF
0024H
13H
01H
11H
0
0
0
2. Keep the remainder (11H) in DRH and load the low-order 8 bits of the dividend (68H) to DRL, then perform
division again.
DRH/DRL (dividend) SR (divisor) DRL (quotient) DRH (remainder)
NF
VF
ZF
1168H
13H
EAH
0AH
1
0
0
The correct result is obtained as the quotient = 01EAH (the first and second results of DRL are merged into 16 bits)
and the remainder = 0AH. However, since the operation flags (NF/VF/ZF) are changed in each step, they cannot
indicate the states according to the final operation results.
Note: Make sure that the division results are correct using software as the hardware does not check.
execution Cycle
18.5
Both the multiplication and division take 10 CPU clock cycles for an operation. Therefore, before the results can be
read from the destination register DRH/DRL, wait at least 5 bus cycles after writing to CALMD. The same applies
to reading the operation flags NF/VF/ZF. The following shows a sample program.
ldb
%ext, src_data@h
ldb
%xl, src_data@l
; Set RAM address for operand
ldb
%ext, au@h
ldb
%yl, au@l
; Set multiplier I/O memory address
;
ldb
%ba, [%x]+
ldb
[%y]+, %ba
; Set data to SR
ldb
%ba, [%x]+
ldb
[%y]+, %ba
; Set data to DRL
ldb
%ba, [%x]+
ldb
[%y]+, %ba
; Set data to DRH
;
ld
[%y], 0b0001
; Start operation (select division mode)
;