!to "rec.prg", cbm *=$c000 ; $0334 belegt durch stp !addr v = $0335 ; $0335/$0336 !addr i = $0337 ; $0337/$0338 jmp start !source "stack.a" ; Programmvorlage ; ; procedure rec(v, i) ; write(hex(v)) ; writeln(v) ; if i < 12 then ; rec(v * 2, i + 1) ; v := v xor 255 ; write(hex(v)) ; writeln(v) ; ; rec(1, 1) ; Ergebnis: ; ; 000000000001 ($001) ; 000000000010 ($002) ; 000000000100 ($004) ; 000000001000 ($008) ; 000000010000 ($010) ; 000000100000 ($020) ; 000001000000 ($040) ; 000010000000 ($080) ; 000100000000 ($100) ; 001000000000 ($200) ; 010000000000 ($400) ; 100000000000 ($800) ; 011111111111 ($7ff) ; 101111111111 ($bff) ; 110111111111 ($dff) ; 111011111111 ($eff) ; 111101111111 ($f7f) ; 111110111111 ($fbf) ; 111111011111 ($fdf) ; 111111101111 ($fef) ; 111111110111 ($ff7) ; 111111111011 ($ffb) ; 111111111101 ($ffd) ; 111111111110 ($ffe) ; ( w -- w^$ffff ) inv +decstp lda stl,x eor #$ff sta stl,x lda sth,x eor #$ff sta sth,x +incstp rts ; -- hexout -- ; Gibt den Wert im A-Register in hexadezimaler Form aus; hexout pha ; Parameter sichern lsr ; die oberen 4 Bits nach unten holen lsr lsr lsr tax ; passendes Zeichen laden und ausgeben lda hex_digits,x jsr chrout pla ; Parameter wieder holen and #$0f ; die unten 4 Bits isolieren tax ; passendes Zeichen laden und ausgeben lda hex_digits,x jsr chrout rts hex_digits !tx "0123456789ABCDEF" ; ( w -- ) hex +pop stx stp ; Stackpointer sichern tay ; low byte sichern pla ; high byte ausgeben jsr hexout tya ; low byte ausgeben jsr hexout ldx stp ; Stackpointer wieder laden rts rec ; write(hex(v)) ; writeln(v) +lod v jsr dup jsr hex +lit 32 ; Leerzeichen als Trenner jsr outchr jsr outdec +lit 13 jsr outchr ; if i < 12 then +lod i +lit 12 jsr lss +jpc rec_end ; rec(v * 2, i + 1) +lod v jsr dup ; v durch Duplizieren auf dem Stack sichern +lit 2 jsr mul +sto v +lod i jsr dup ; i durch Duplizieren auf dem Stack sichern jsr incr +sto i jsr rec +sto i ; i wieder vom Stack holen und ablegen +sto v ; i wieder vom Stack holen und ablegen rec_end ; v := v xor 255 ; write(hex(v)) ; writeln(v) +lod v jsr inv jsr dup +sto v jsr dup jsr hex +lit 32 ; Leerzeichen als Trenner jsr outchr jsr outdec +lit 13 ; Zeilenumbruch jsr outchr rts start +initstp ; rec(1, 1) +lit 1 +sto v +lit 1 +sto i jsr rec rts