DIVISION_32_32: ; INITIALISIERUNG ldi temp1,0 sts ERGEBNIS_L_L,temp1 sts ERGEBNIS_L_H,temp1 sts ERGEBNIS_H_L,temp1 sts ERGEBNIS_H_H,temp1 ldi temp1,1 sts ZW_L_L,temp1 ;ldi ZW_L_L,1 ; +1 ldi temp1,0 sts ZW_L_H,temp1 sts ZW_H_L,temp1 sts ZW_H_H,temp1 ; FEHLERPRÜFUNG lds temp1,DIVISOR_L_L tst temp1 brne DIVISION_32_32_LINKS lds temp1,DIVISOR_L_H tst temp1 brne DIVISION_32_32_LINKS lds temp1,DIVISOR_H_L tst temp1 brne DIVISION_32_32_LINKS lds temp1,DIVISOR_H_H tst temp1 brne DIVISION_32_32_LINKS rjmp DIVISION_32_32_ERROR ; Divisor linksbündig DIVISION_32_32_LINKS: lds temp1,DIVISOR_H_H tst temp1 ; Linksbündig ? brmi DIVISION_32_32_START ; ja ==> SPRUNG lds temp1,ZW_L_L LSL temp1 sts ZW_L_L,temp1 ;LSL ZW_L_L ; 1x links lds temp1,ZW_L_H ROL temp1 sts ZW_L_H,temp1 lds temp1,ZW_H_L ROL temp1 sts ZW_H_L,temp1 lds temp1,ZW_H_H ROL temp1 sts ZW_H_H,temp1 lds temp1,DIVISOR_L_L LSL temp1 sts DIVISOR_L_L,temp1 ;LSL ZW_L_L ; 1x links lds temp1,DIVISOR_L_H ROL temp1 sts DIVISOR_L_H,temp1 lds temp1,DIVISOR_H_L ROL temp1 sts DIVISOR_H_L,temp1 lds temp1,DIVISOR_H_H ROL temp1 sts DIVISOR_H_H,temp1 rjmp DIVISION_32_32_LINKS x122xx: jmp DIVISION_32_32_SCHIEBEN ; DIVISION START DIVISION_32_32_START: lds temp1,DIVIDENT_H_H lds temp,divisor_H_H cp temp1,temp ; DIVIDENT ">=" DIVISOR ? (H_H) brlo x122xx ; nein=> SPRUNG breq DIVISION_32_32__w brsh DIVISION_32_32_ADD_SUB DIVISION_32_32__w: lds temp1,DIVIDENT_H_L lds temp,divisor_H_L cp temp1,temp ; DIVIDENT ">=" DIVISOR ? (H_H) brlo x122xx ; nein=> SPRUNG breq DIVISION_32_32__ww brsh DIVISION_32_32_ADD_SUB DIVISION_32_32__ww: lds temp1,DIVIDENT_L_H lds temp,divisor_L_H cp temp1,temp ; DIVIDENT ">=" DIVISOR ? (H_H) brlo x122xx ; nein=> SPRUNG breq DIVISION_32_32__www brsh DIVISION_32_32_ADD_SUB DIVISION_32_32__www: lds temp1,DIVIDENT_L_L lds temp,divisor_L_L cp temp1,temp ; DIVIDENT ">=" DIVISOR ? (H_H) brlo x122xx ; nein=> SPRUNG ; ADDIEREN und SUBTRAHIEREN DIVISION_32_32_ADD_SUB: lds temp1,ERGEBNIS_L_L lds temp,ZW_L_L add temp1,temp sts ERGEBNIS_L_L,temp1 sts ZW_L_L,temp lds temp1,ERGEBNIS_L_H lds temp,ZW_L_H adc temp1,temp sts ERGEBNIS_L_H,temp1 sts ZW_L_H,temp lds temp1,ERGEBNIS_H_L lds temp,ZW_H_L adc temp1,temp sts ERGEBNIS_H_L,temp1 sts ZW_H_L,temp lds temp1,ERGEBNIS_H_H lds temp,ZW_H_H adc temp1,temp sts ERGEBNIS_H_H,temp1 sts ZW_H_H,temp lds temp1,DIVIDENT_L_L lds temp,divisor_L_L sub temp1,temp sts DIVIDENT_L_L,temp1 sts divisor_L_L,temp lds temp1,DIVIDENT_L_H lds temp,divisor_L_H sbc temp1,temp sts DIVIDENT_L_H,temp1 sts divisor_L_H,temp lds temp1,DIVIDENT_H_L lds temp,divisor_H_L sbc temp1,temp sts DIVIDENT_H_L,temp1 sts divisor_H_L,temp lds temp1,DIVIDENT_H_H lds temp,divisor_H_H sbc temp1,temp sts DIVIDENT_H_H,temp1 sts divisor_H_H,temp ; 1 x rechts schieben DIVISION_32_32_SCHIEBEN: lds temp1,DIVISOR_H_H lsr temp1 sts DIVISOR_H_H,temp1 lds temp1,DIVISOR_H_L ror temp1 sts DIVISOR_H_L,temp1 lds temp1,DIVISOR_L_H ror temp1 sts DIVISOR_L_H,temp1 lds temp1,DIVISOR_L_L ror temp1 sts DIVISOR_L_L,temp1 lds temp1,ZW_H_H lsr temp1 sts ZW_H_H,temp1 lds temp1,ZW_H_L ror temp1 sts ZW_H_L,temp1 lds temp1,ZW_L_H ror temp1 sts ZW_L_H,temp1 lds temp1,ZW_L_L ror temp1 sts ZW_L_L,temp1 ; HILFSREGISTER=0 ? lds temp1,ZW_L_L tst temp1 ; =0 ? brne x88xx ; nein ==> SPRUNG lds temp1,ZW_L_H tst temp1 brne x88xx lds temp1,ZW_H_L tst temp1 brne x88xx lds temp1,ZW_H_H tst temp1 brne x88xx ret ; ERROR (DIVISION durch NULL) DIVISION_32_32_ERROR: ret x88xx: jmp DIVISION_32_32_START