m8div06252026e.asm

;; david vajda
;; div command bitwise
;; 06/25/2026

.include "m8def.inc"

.equ DIVIDEND   =   56
.equ DIVISOR    =   7

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRD, r16

;; r16: dividend
;; r17: divisor
;; r18: dividend tmp - nach verknuepfung mit bitmaske
;; r19: bitmaske.
;; r20: der anfang der bitmaske: die bitmaske
;;      koennte immer bei 0b10000000 sein, ...
;;      0b10000000, 0b11000000, 0b11100000
;;      da sie aber wandert .. naemlich an die hinteren teile
;;      0b00010000, 0b00011000, 0b00011100 z.B.
;;      gibt es ein bitmasken startflag: angefangen bei
;;      0b10000000 geht es in der auesseren schleife nach:
;;      0b01000000, 0b00100000, 0b00010000 ... usw.
;; r21: dies ist die maske, beginnend bei 0b1111.1111
;;      die mitgenommen wird und bei jedem einzelschritt, eine
;;      fuehrende 1 verlieren sollte, 0b0111.1111, 0b0011.111,
;;      0b0001.1111 usw. und bei der eigentlichen subtraktion
;;      dazu da ist, beim verbleibenden dividenden, den vorderen
;;      teil zu entfernen.
;; r22: quotient

ldi r16, DIVIDEND
ldi r17, DIVISOR

shiftright001:
sbrc r16, 7
rjmp shiftright001end
lsl r16
rjmp shiftright001
shiftright001end:

;; ...

ldi r22, 0b00000000
ldi r21, 0b11111111
ldi r20, 0b10000000
div000:
mov r19, r20
div001:
mov r18, r16        ;;  den dividenden aus dem bleiben r16 ins tmp r18
and r18, r19        ;;  den divenden im tmp mit der bitmaske verknuepfen

;; hier die eigentliche subtraktion

cp r18, r17
brlt subtraction001end
subtraction001:
sub r18, r17
and r16, r21
or r16, r18
lsl r22
ori r22, 0b00000001
rjmp subtraction002end
subtraction001end:
lsr r21
lsl r22             ;; quotient wird null erzeugt und muss weiter geschoeben werden
subtraction002end:

;; hier die eigentliche subtraktion beendet...

lsr r19             ;; die maske eines rechts um sie zu vergroessern
or r19, r20         ;; im naechsten schritt naemlich
rjmp div001
lsr r17             ;; den divisor weiter nach rechts schieben
lsr r20
rjmp div000

out PORTD, r22

end: rjmp end