!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