!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