wesentlich ist, daß der Computer auf keinen Fall mit echt gebrochenen Werten rechnen kann *) - allenfalls mit sehr großen ganzen Zahlen!
Da lag der Knackpunkt: Ich wollte gefühlsmäßig die Zahl immer noch in Vorkomma- und Nachkommateil aufspalten, obwohl das durch die Skalierung eigentlich gar keinen Sinn mehr ergab.
Auf jeden Fall echt gut, diese Skalierung. ![]()
Noch kurz:
P.S. Du hast in Bitte melde dich an, um diesen Link zu sehen. am Anfang der Routine LDA #0 vergessen. Den Befehl kannst Du nicht einfach weglassen, sonst rechnet die Routine falsch!
Da hatte ich einfach den ganzen INIT-Block zur Vereinfachung weggelassen. dvd und dvd+1 ($fb und $fc in deinem Code) müssen ja auch vorher 0 gesetzt werden, oder?
Auf jeden Fall sieht das komplette Programm bei mir jetzt so aus und funktioniert auch:
*=$033c
dvs = $fa
dvd = $fb ; $fc, $fd
mydvd = 23
mydvs = 7
lda #mydvs
sta dvs
lda #mydvd
sta dvd+2
lda #$00
sta dvd
sta dvd+1
ldx #24
shift asl dvd
rol dvd+1
rol dvd+2
rol
bcs subtr
cmp dvs
bcc next
subtr sbc dvs
inc dvd
next dex
bne shift
; Runden?
asl
bcs round
cmp dvs
bcc finish
round inc dvd
bne finish
inc dvd+1
bne finish
inc dvd+2
finish rts
; Ausgangszustand:
; $fb $fc $fd
; $00 $00 $17
;
; Ergebnis vor dem Runden:
; $fb $fc $fd
; $24 $49 $03
;
; Ergebnis nach dem Runden:
; $fb $fc $fd
; $25 $49 $03
Alles anzeigen
Nochmal danke für die guten Tipps!