[Project Log] Python on the 6502/C64, 8080, 6800, 6809 and AVR

yeah, from what I’ve seen the three iterations of PET, C64, and C128 have enough differences in the firmware that simple basic apps work but sys calls and POOK/PEEK addresses break between the two.

But, the c128 can bank switch into the c64 firmware and run c64 programs.

The answer is plentiful once I had the right search terms: https://csl.name/post/c64-coding/

Parsing suites around indentation is turning out to be tougher than expected. Once that nut has been cracked, my alternate moonshot will be:

fibonacci = 0
prev = 1
n = 1
while n <= 32:
    temp = fibonacci
    fibonacci = fibonacci + prev
    prev = temp
    print(n, fibonacci)
    n = n + 1
1 Like

Great find on that article… should of known those demoscene guys figured it out. I’m also inspired, acme+vice and vice can actually run .prg files via cli. That’s got me wanting to setup a wrapper for linux’s binfmt so a RPI can run c64 apps as native code.

Also, your saying your c64 python interpreter can do Fibonacci now? Or that’s the next phase?

I can do Fibonacci once I am able to compile the while loop. All of the other pieces are there.

Next will be the other three arithmetic operations - subtract is easy (negate and add,) divide is essentially there as it is used to convert numbers for display. The only tough one is multiplication.

Also compile if/else and implement input.

And generate code for the Commodore. There is nothing like seeing code run on actual hardware.

2 Likes

There is nothing like seeing code run on actual hardware.

Agreed!

I’m looking forward to creating a few demoscene apps when its at that point.

1 Like

Found a pretty trashy problem – a sticky wicket as our brothers across the pond might say.

Python is a garbage collected language. That is, the programmer does not have to manage memory explicitly. “The system” tracks memory references and deals with unused items.

As the compiler writer, I am playing the role of “the system;” it is on me to implement memory management.

I had hoped to avoid keeping track of every variable which might reference memory and making periodic sweeps to detect unreferenced items. A complication is the need to traverse every tuple, list, set and dictionary for further references. The preferable alternative is to update reference counts whenever variable assignments take place.

The situation was under control until the conjunction of function calls and expression evaluation.

Consider

print(x)

The variable “x” references the object containing the value. Calling “print” does not change anything.

Now consider

print(x + 3)

An object with the value of “x + 3” is created. It is then passed to “print.” The reference count of this object must be decremented upon return from “print” so that is is reclaimed

The question is: what is the most efficient way the track which objects need to be dereferenced following a function call?

Entering Guru Meditation…

2 Likes

I may just get lucky on this one. As the compiler generates code to evaluate an expression for an argument, it can make note of that fact somewhere.

what is the most efficient way the track which objects need to be dereferenced following a function call?

I would think some stack manipulation could do the job.

While still figuring out how to compile a loop, I did a bit of stress testing.

Unrolled the loop in the Fibonacci program and added enough iterations to ensure the numbers involved are more than 32 bits:

fibonacci = 0
prev = 1
n = 1

# 1
temp = fibonacci
fibonacci = fibonacci + prev
prev = temp
print(n, fibonacci)
n = n + 1

: 
:
:

# 48
temp = fibonacci
fibonacci = fibonacci + prev
prev = temp
print(n, fibonacci)
n = n + 1

and the resultant output is:

1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
17 1597
18 2584
19 4181
20 6765
21 10946
22 17711
23 28657
24 46368
25 75025
26 121393
27 196418
28 317811
29 514229
30 832040
31 1346269
32 2178309
33 3524578
34 5702887
35 9227465
36 14930352
37 24157817
38 39088169
39 63245986
40 102334155
41 165580141
42 267914296
43 433494437
44 701408733
45 1134903170
46 1836311903
47 2971215073
48 4807526976

Even if the compiler proves to be impractical, I still have a big number library…

1 Like

The function call interface has been firmed up significantly.

 			  00168	; 00004	print(x + 1, y + 2, z)
 02A5 AD 1721	      [4] 00169		lda	_print
 02A8 0D 1722	      [4] 00170		ora	_print+1
 02AB D0 0B (02B8)  [2/3] 00171		bne	L00002
 			  00172
 02AD A9 21	      [2] 00173		lda	#_print&$FF
 02AF 85 3A	      [3] 00174		sta	Var
 02B1 A9 17	      [2] 00175		lda	#_print>>8
 02B3 85 3B	      [3] 00176		sta	Var+1
 02B5 20 16C0	      [6] 00177		jsr	Undef
 			  00178
 02B8			  00179	L00002
 02B8 AE 172A	      [4] 00180		ldx	_x
 02BB 8A	      [2] 00181		txa
 02BC 0D 172B	      [4] 00182		ora	_x+1
 02BF D0 0B (02CC)  [2/3] 00183		bne	L00003
 			  00184
 02C1 A9 2A	      [2] 00185		lda	#_x&$FF
 02C3 85 3A	      [3] 00186		sta	Var
 02C5 A9 17	      [2] 00187		lda	#_x>>8
 02C7 85 3B	      [3] 00188		sta	Var+1
 02C9 20 16C0	      [6] 00189		jsr	Undef
 			  00190
 02CC			  00191	L00003
 02CC AD 172B	      [4] 00192		lda	_x+1
 02CF 86 14	      [3] 00193		stx	Ptr0
 02D1 85 15	      [3] 00194		sta	Ptr0+1
 02D3 A2 1B	      [2] 00195		ldx	#I_00001&$FF
 02D5 A9 17	      [2] 00196		lda	#I_00001>>8
 02D7 86 16	      [3] 00197		stx	Ptr1
 02D9 85 17	      [3] 00198		sta	Ptr1+1
 02DB 20 0ADA	      [6] 00199		jsr	int.__add__
 02DE 48	      [3] 00200		pha
 02DF 8A	      [2] 00201		txa
 02E0 48	      [3] 00202		pha
 02E1 AE 172F	      [4] 00203		ldx	_y
 02E4 8A	      [2] 00204		txa
 02E5 0D 1730	      [4] 00205		ora	_y+1
 02E8 D0 0B (02F5)  [2/3] 00206		bne	L00004
 			  00207
 02EA A9 2F	      [2] 00208		lda	#_y&$FF
 02EC 85 3A	      [3] 00209		sta	Var
 02EE A9 17	      [2] 00210		lda	#_y>>8
 02F0 85 3B	      [3] 00211		sta	Var+1
 02F2 20 16C0	      [6] 00212		jsr	Undef
 			  00213
 02F5			  00214	L00004
 02F5 AD 1730	      [4] 00215		lda	_y+1
 02F8 86 14	      [3] 00216		stx	Ptr0
 02FA 85 15	      [3] 00217		sta	Ptr0+1
 02FC A2 19	      [2] 00218		ldx	#I_00002&$FF
 02FE A9 17	      [2] 00219		lda	#I_00002>>8
 0300 86 16	      [3] 00220		stx	Ptr1
 0302 85 17	      [3] 00221		sta	Ptr1+1
 0304 20 0ADA	      [6] 00222		jsr	int.__add__
 0307 48	      [3] 00223		pha
 0308 8A	      [2] 00224		txa
 0309 48	      [3] 00225		pha
 030A A9 08	      [2] 00226		lda	#8
 030C 85 06	      [3] 00227		sta	Int0
 030E A9 00	      [2] 00228		lda	#0
 0310 85 07	      [3] 00229		sta	Int0+1
 0312 20 0515	      [6] 00230		jsr	Alloc
 0315 A5 14	      [3] 00231		lda	Ptr0
 0317 85 32	      [3] 00232		sta	Pargs
 0319 A5 15	      [3] 00233		lda	Ptr0+1
 031B 85 33	      [3] 00234		sta	Pargs+1
 031D A0 00	      [2] 00235		ldy	#0
 031F A9 83	      [2] 00236		lda	#TYPE_TUPLE
 0321 91 32	      [6] 00237		sta	(Pargs),Y
 0323 A9 03	      [2] 00238		lda	#3
 0325 C8	      [2] 00239		iny
 0326 91 32	      [6] 00240		sta	(Pargs),Y
 0328 A9 02	      [2] 00241		lda	#2
 032A 85 06	      [3] 00242		sta	Int0
 032C A9 00	      [2] 00243		lda	#0
 032E 85 07	      [3] 00244		sta	Int0+1
 0330 20 0515	      [6] 00245		jsr	Alloc
 0333 A5 14	      [3] 00246		lda	Ptr0
 0335 85 34	      [3] 00247		sta	Kargs
 0337 A5 15	      [3] 00248		lda	Ptr0+1
 0339 85 35	      [3] 00249		sta	Kargs+1
 033B A0 00	      [2] 00250		ldy	#0
 033D A9 85	      [2] 00251		lda	#TYPE_DICT
 033F 91 34	      [6] 00252		sta	(Kargs),Y
 0341 A9 00	      [2] 00253		lda	#0
 0343 C8	      [2] 00254		iny
 0344 91 34	      [6] 00255		sta	(Kargs),Y
 0346 A9 01	      [2] 00256		lda	#1
 0348 85 03	      [3] 00257		sta	Byt1
 034A A0 07	      [2] 00258		ldy	#7
 034C AE 1734	      [4] 00259		ldx	_z
 034F 8A	      [2] 00260		txa
 0350 0D 1735	      [4] 00261		ora	_z+1
 0353 D0 0B (0360)  [2/3] 00262		bne	L00005
 			  00263
 0355 A9 34	      [2] 00264		lda	#_z&$FF
 0357 85 3A	      [3] 00265		sta	Var
 0359 A9 17	      [2] 00266		lda	#_z>>8
 035B 85 3B	      [3] 00267		sta	Var+1
 035D 20 16C0	      [6] 00268		jsr	Undef
 			  00269
 0360			  00270	L00005
 0360 AD 1735	      [4] 00271		lda	_z+1
 0363 91 32	      [6] 00272		sta	(Pargs),Y
 0365 8A	      [2] 00273		txa
 0366 88	      [2] 00274		dey
 0367 91 32	      [6] 00275		sta	(Pargs),Y
 0369 88	      [2] 00276		dey
 036A 68	      [4] 00277		pla
 036B AA	      [2] 00278		tax
 036C 68	      [4] 00279		pla
 036D 91 32	      [6] 00280		sta	(Pargs),Y
 036F 8A	      [2] 00281		txa
 0370 88	      [2] 00282		dey
 0371 91 32	      [6] 00283		sta	(Pargs),Y
 0373 88	      [2] 00284		dey
 0374 68	      [4] 00285		pla
 0375 AA	      [2] 00286		tax
 0376 68	      [4] 00287		pla
 0377 91 32	      [6] 00288		sta	(Pargs),Y
 0379 8A	      [2] 00289		txa
 037A 88	      [2] 00290		dey
 037B 91 32	      [6] 00291		sta	(Pargs),Y
 037D AE 1721	      [4] 00292		ldx	_print
 0380 AD 1722	      [4] 00293		lda	_print+1
 0383 20 0A7E	      [6] 00294		jsr	Call
 0386 A0 04	      [2] 00295		ldy	#4
 0388 B1 32	    [5/6] 00296		lda	(Pargs),Y
 038A AA	      [2] 00297		tax
 038B C8	      [2] 00298		iny
 038C B1 32	    [5/6] 00299		lda	(Pargs),Y
 038E 20 05BF	      [6] 00300		jsr	Deref
 0391 A0 02	      [2] 00301		ldy	#2
 0393 B1 32	    [5/6] 00302		lda	(Pargs),Y
 0395 AA	      [2] 00303		tax
 0396 C8	      [2] 00304		iny
 0397 B1 32	    [5/6] 00305		lda	(Pargs),Y
 0399 20 05BF	      [6] 00306		jsr	Deref
 039C A5 32	      [3] 00307		lda	Pargs
 039E 85 14	      [3] 00308		sta	Ptr0
 03A0 A5 33	      [3] 00309		lda	Pargs+1
 03A2 85 15	      [3] 00310		sta	Ptr0+1
 03A4 20 05E9	      [6] 00311		jsr	Free
 03A7 A5 34	      [3] 00312		lda	Kargs
 03A9 85 14	      [3] 00313		sta	Ptr0
 03AB A5 35	      [3] 00314		lda	Kargs+1
 03AD 85 15	      [3] 00315		sta	Ptr0+1
 03AF 20 05E9	      [6] 00316		jsr	Free

Variables (including “print”) are nothing more than a reference to an object. Hence the checks everywhere for whether they are defined.

Some of the ABI has been tightened up to reduce the amount of inline code generated by the compiler. Further savings can be gained by factoring subroutines out of what is left.

Because of dynamic typing, the entire context of a function call must be captured. The most straightforward way of doing this is by creating a tuple of the positional arguments and a dictionary of the keyword arguments. It is up to the called function to determine what is legal and what is in error.

The calls to free Pargs and Kargs used to be in Call, but had to be broken out because these two objects keep track of objects resulting from argument expression evaluation (which need to be reclaimed.)

Did some major factoring. The above function call now looks like this:

 			  00166	; 00005	print(x + 1, y + 2, z)
 02B1 A2 39	      [2] 00167		ldx	#_x&$FF
 02B3 A9 17	      [2] 00168		lda	#_x>>8
 02B5 20 09E5	      [6] 00169		jsr	GetObject
 02B8 86 14	      [3] 00170		stx	Ptr0
 02BA 85 15	      [3] 00171		sta	Ptr0+1
 02BC A2 1B	      [2] 00172		ldx	#I_00001&$FF
 02BE A9 17	      [2] 00173		lda	#I_00001>>8
 02C0 86 16	      [3] 00174		stx	Ptr1
 02C2 85 17	      [3] 00175		sta	Ptr1+1
 02C4 20 0ADA	      [6] 00176		jsr	int.__add__
 02C7 48	      [3] 00177		pha
 02C8 8A	      [2] 00178		txa
 02C9 48	      [3] 00179		pha
 02CA A2 3E	      [2] 00180		ldx	#_y&$FF
 02CC A9 17	      [2] 00181		lda	#_y>>8
 02CE 20 09E5	      [6] 00182		jsr	GetObject
 02D1 86 14	      [3] 00183		stx	Ptr0
 02D3 85 15	      [3] 00184		sta	Ptr0+1
 02D5 A2 19	      [2] 00185		ldx	#I_00002&$FF
 02D7 A9 17	      [2] 00186		lda	#I_00002>>8
 02D9 86 16	      [3] 00187		stx	Ptr1
 02DB 85 17	      [3] 00188		sta	Ptr1+1
 02DD 20 0ADA	      [6] 00189		jsr	int.__add__
 02E0 48	      [3] 00190		pha
 02E1 8A	      [2] 00191		txa
 02E2 48	      [3] 00192		pha
 02E3 A9 03	      [2] 00193		lda	#3
 02E5 A2 00	      [2] 00194		ldx	#0
 02E7 20 09FD	      [6] 00195		jsr	AllocPargsAndKargs
 02EA A0 07	      [2] 00196		ldy	#7
 02EC A2 43	      [2] 00197		ldx	#_z&$FF
 02EE A9 17	      [2] 00198		lda	#_z>>8
 02F0 20 09E5	      [6] 00199		jsr	GetObject
 02F3 20 0A45	      [6] 00200		jsr	StoreParg
 02F6 68	      [4] 00201		pla
 02F7 AA	      [2] 00202		tax
 02F8 68	      [4] 00203		pla
 02F9 20 0A45	      [6] 00204		jsr	StoreParg
 02FC 68	      [4] 00205		pla
 02FD AA	      [2] 00206		tax
 02FE 68	      [4] 00207		pla
 02FF 20 0A45	      [6] 00208		jsr	StoreParg
 0302 A2 30	      [2] 00209		ldx	#_print&$FF
 0304 A9 17	      [2] 00210		lda	#_print>>8
 0306 20 09E5	      [6] 00211		jsr	GetObject
 0309 20 0A7E	      [6] 00212		jsr	Call
 030C A0 04	      [2] 00213		ldy	#4
 030E 20 0A55	      [6] 00214		jsr	DerefParg
 0311 A0 02	      [2] 00215		ldy	#2
 0313 20 0A55	      [6] 00216		jsr	DerefParg
 0316 20 0A67	      [6] 00217		jsr	FreePargsAndKargs

Make no mistake. The same amount of work is being done; it is now mostly hidden behind all of those subroutine calls. It runs very slightly slower, but frees up substantial space for larger programs.

1 Like

Another one for comparison

 			  00092	; 00001	one = 1
 020E A2 88	      [2] 00093		ldx	#I_00001&$FF
 0210 A9 17	      [2] 00094		lda	#I_00001>>8
 0212 86 12	      [3] 00095		stx	PtrA
 0214 85 13	      [3] 00096		sta	PtrA+1
 			  00097
 0216 AE 17D0	      [4] 00098		ldx	_one
 0219 AD 17D1	      [4] 00099		lda	_one+1
 021C 20 0593	      [6] 00100		jsr	DeRef
 			  00101
 021F A6 12	      [3] 00102		ldx	PtrA
 0221 A5 13	      [3] 00103		lda	PtrA+1
 0223 8E 17D0	      [4] 00104		stx	_one
 0226 8D 17D1	      [4] 00105		sta	_one+1
 			  00106	; 00002	print(one, 2, '3', sep=',', end="...\n")
 0229 A9 03	      [2] 00107		lda	#3
 022B A2 02	      [2] 00108		ldx	#2
 022D 20 0A6A	      [6] 00109		jsr	AllocPargsAndKargs
 0230 A9 07	      [2] 00110		lda	#7
 0232 85 02	      [3] 00111		sta	Byt0
 0234 A0 09	      [2] 00112		ldy	#9
 0236 A2 AF	      [2] 00113		ldx	#S_00000&$FF
 0238 A9 17	      [2] 00114		lda	#S_00000>>8
 023A 20 0ABA	      [6] 00115		jsr	StoreKarg
 023D A9 17	      [2] 00116		lda	#S_00001>>8
 023F A2 A9	      [2] 00117		ldx	#S_00001&$FF
 0241 20 0ABA	      [6] 00118		jsr	StoreKarg
 0244 A2 8E	      [2] 00119		ldx	#S_00002&$FF
 0246 A9 17	      [2] 00120		lda	#S_00002>>8
 0248 20 0ABA	      [6] 00121		jsr	StoreKarg
 024B A9 17	      [2] 00122		lda	#S_00003>>8
 024D A2 A3	      [2] 00123		ldx	#S_00003&$FF
 024F 20 0ABA	      [6] 00124		jsr	StoreKarg
 0252 84 03	      [3] 00125		sty	Byt1
 0254 A4 02	      [3] 00126		ldy	Byt0
 0256 A2 8A	      [2] 00127		ldx	#S_00004&$FF
 0258 A9 17	      [2] 00128		lda	#S_00004>>8
 025A 20 0AB2	      [6] 00129		jsr	StoreParg
 025D A2 86	      [2] 00130		ldx	#I_00002&$FF
 025F A9 17	      [2] 00131		lda	#I_00002>>8
 0261 20 0AB2	      [6] 00132		jsr	StoreParg
 0264 A2 D0	      [2] 00133		ldx	#_one&$FF
 0266 A9 17	      [2] 00134		lda	#_one>>8
 0268 20 0A52	      [6] 00135		jsr	GetObject
 026B 20 0AB2	      [6] 00136		jsr	StoreParg
 026E A2 B8	      [2] 00137		ldx	#_print&$FF
 0270 A9 17	      [2] 00138		lda	#_print>>8
 0272 20 0A52	      [6] 00139		jsr	GetObject
 0275 20 0AEB	      [6] 00140		jsr	Call
 0278 20 0AD4	      [6] 00141		jsr	FreePargsAndKargs

This is a good start to compiling while loops.

The following Python program

while : z = 1; y = 2
while :
  a = 1
  while :
    b = 2
  c = 3
d = 4

generates

 			  00092	; 00001	while : z = 1; y = 2
 020E			  00093	L00000
 020E			  00094	L00001
 020E A2 BF	      [2] 00095		ldx	#I_00001&$FF
 0210 A9 16	      [2] 00096		lda	#I_00001>>8
 0212 86 12	      [3] 00097		stx	PtrA
 0214 85 13	      [3] 00098		sta	PtrA+1
 			  00099
 0216 AE 16DA	      [4] 00100		ldx	_z
 0219 AD 16DB	      [4] 00101		lda	_z+1
 021C 20 04C6	      [6] 00102		jsr	DeRef
 			  00103
 021F A6 12	      [3] 00104		ldx	PtrA
 0221 A5 13	      [3] 00105		lda	PtrA+1
 0223 8E 16DA	      [4] 00106		stx	_z
 0226 8D 16DB	      [4] 00107		sta	_z+1
 0229 A2 BD	      [2] 00108		ldx	#I_00002&$FF
 022B A9 16	      [2] 00109		lda	#I_00002>>8
 022D 86 12	      [3] 00110		stx	PtrA
 022F 85 13	      [3] 00111		sta	PtrA+1
 			  00112
 0231 AE 16D5	      [4] 00113		ldx	_y
 0234 AD 16D6	      [4] 00114		lda	_y+1
 0237 20 04C6	      [6] 00115		jsr	DeRef
 			  00116
 023A A6 12	      [3] 00117		ldx	PtrA
 023C A5 13	      [3] 00118		lda	PtrA+1
 023E 8E 16D5	      [4] 00119		stx	_y
 0241 8D 16D6	      [4] 00120		sta	_y+1
 0244 4C 020E	      [3] 00121		jmp	L00000
 0247			  00122	L00002
 			  00123	; 00002	while :
 0247			  00124	L00003
 0247			  00125	L00004
 			  00126	; 00003	  a = 1
 0247 A2 BF	      [2] 00127		ldx	#I_00001&$FF
 0249 A9 16	      [2] 00128		lda	#I_00001>>8
 024B 86 12	      [3] 00129		stx	PtrA
 024D 85 13	      [3] 00130		sta	PtrA+1
 			  00131
 024F AE 16C1	      [4] 00132		ldx	_a
 0252 AD 16C2	      [4] 00133		lda	_a+1
 0255 20 04C6	      [6] 00134		jsr	DeRef
 			  00135
 0258 A6 12	      [3] 00136		ldx	PtrA
 025A A5 13	      [3] 00137		lda	PtrA+1
 025C 8E 16C1	      [4] 00138		stx	_a
 025F 8D 16C2	      [4] 00139		sta	_a+1
 			  00140	; 00004	  while :
 0262			  00141	L00006
 0262			  00142	L00007
 			  00143	; 00005	    b = 2
 0262 A2 BD	      [2] 00144		ldx	#I_00002&$FF
 0264 A9 16	      [2] 00145		lda	#I_00002>>8
 0266 86 12	      [3] 00146		stx	PtrA
 0268 85 13	      [3] 00147		sta	PtrA+1
 			  00148
 026A AE 16C6	      [4] 00149		ldx	_b
 026D AD 16C7	      [4] 00150		lda	_b+1
 0270 20 04C6	      [6] 00151		jsr	DeRef
 			  00152
 0273 A6 12	      [3] 00153		ldx	PtrA
 0275 A5 13	      [3] 00154		lda	PtrA+1
 0277 8E 16C6	      [4] 00155		stx	_b
 027A 8D 16C7	      [4] 00156		sta	_b+1
 			  00157	; 00006	  c = 3
 027D 4C 0262	      [3] 00158		jmp	L00006
 0280			  00159	L00008
 0280 A2 BB	      [2] 00160		ldx	#I_00003&$FF
 0282 A9 16	      [2] 00161		lda	#I_00003>>8
 0284 86 12	      [3] 00162		stx	PtrA
 0286 85 13	      [3] 00163		sta	PtrA+1
 			  00164
 0288 AE 16CB	      [4] 00165		ldx	_c
 028B AD 16CC	      [4] 00166		lda	_c+1
 028E 20 04C6	      [6] 00167		jsr	DeRef
 			  00168
 0291 A6 12	      [3] 00169		ldx	PtrA
 0293 A5 13	      [3] 00170		lda	PtrA+1
 0295 8E 16CB	      [4] 00171		stx	_c
 0298 8D 16CC	      [4] 00172		sta	_c+1
 			  00173	; 00007	d = 4
 029B 4C 0247	      [3] 00174		jmp	L00003
 029E			  00175	L00005
 029E A2 B9	      [2] 00176		ldx	#I_00004&$FF
 02A0 A9 16	      [2] 00177		lda	#I_00004>>8
 02A2 86 12	      [3] 00178		stx	PtrA
 02A4 85 13	      [3] 00179		sta	PtrA+1
 			  00180
 02A6 AE 16D0	      [4] 00181		ldx	_d
 02A9 AD 16D1	      [4] 00182		lda	_d+1
 02AC 20 04C6	      [6] 00183		jsr	DeRef
 			  00184
 02AF A6 12	      [3] 00185		ldx	PtrA
 02B1 A5 13	      [3] 00186		lda	PtrA+1
 02B3 8E 16D0	      [4] 00187		stx	_d
 02B6 8D 16D1	      [4] 00188		sta	_d+1

The hard part now is evaluating relational expressions and handling boolean values…

1 Like

Got tired of looking at the inefficiency so tweaked code generation for assigning a constant just a bit.

Instead of

 			  00092	; 00001	x = 2
 020E A2 49	      [2] 00093		ldx	#I_00002&$FF
 0210 A9 67	      [2] 00094		lda	#I_00002>>8
 0212 86 12	      [3] 00095		stx	PtrA
 0214 85 13	      [3] 00096		sta	PtrA+1
 			  00097
 0216 AE 6765	      [4] 00098		ldx	_x
 0219 AD 6766	      [4] 00099		lda	_x+1
 021C 20 55EB	      [6] 00100		jsr	DeRef
 			  00101
 021F A6 12	      [3] 00102		ldx	PtrA
 0221 A5 13	      [3] 00103		lda	PtrA+1
 0223 8E 6765	      [4] 00104		stx	_x
 0226 8D 6766	      [4] 00105		sta	_x+1

it does this now

 			  00092	; 00001	x = 2
 020E AE 16B1	      [4] 00093		ldx	_x
 0211 AD 16B2	      [4] 00094		lda	_x+1
 0214 20 0496	      [6] 00095		jsr	DeRef
 			  00096
 0217 A2 8E	      [2] 00097		ldx	#I_00002&$FF
 0219 A9 16	      [2] 00098		lda	#I_00002>>8
 021B 8E 16B1	      [4] 00099		stx	_x
 021E 8D 16B2	      [4] 00100		sta	_x+1
1 Like

Getting there…

 			  00092	; 00001	x = 5
 			  00093
 020E AE 1897	      [4] 00094		ldx	_x
 0211 AD 1898	      [4] 00095		lda	_x+1
 0214 20 060E	      [6] 00096		jsr	DeRef
 			  00097
 0217 A2 50	      [2] 00098		ldx	#I_00005&$FF
 0219 A9 18	      [2] 00099		lda	#I_00005>>8
 021B 8E 1897	      [4] 00100		stx	_x
 021E 8D 1898	      [4] 00101		sta	_x+1
 			  00102	; 00002	while x:
 0221			  00103	L00000
 0221 A2 97	      [2] 00104		ldx	#_x&$FF
 0223 A9 18	      [2] 00105		lda	#_x>>8
 0225 20 0B10	      [6] 00106		jsr	GetObject
 0228 20 07B3	      [6] 00107		jsr	object.bool
 022B D0 03 (0230)  [2/3] 00108		bne	L00001
 022D 4C 027C	      [3] 00109		jmp	L00002
 0230			  00110	L00001
 			  00111	; 00003	  print(x)
 0230 A9 01	      [2] 00112		lda	#1
 0232 A2 00	      [2] 00113		ldx	#0
 0234 20 0B28	      [6] 00114		jsr	AllocPargsAndKargs
 0237 A0 03	      [2] 00115		ldy	#3
 0239 A2 97	      [2] 00116		ldx	#_x&$FF
 023B A9 18	      [2] 00117		lda	#_x>>8
 023D 20 0B10	      [6] 00118		jsr	GetObject
 0240 20 0B70	      [6] 00119		jsr	StoreParg
 0243 A2 8E	      [2] 00120		ldx	#_print&$FF
 0245 A9 18	      [2] 00121		lda	#_print>>8
 0247 20 0B10	      [6] 00122		jsr	GetObject
 024A 20 0BA9	      [6] 00123		jsr	Call
 024D 20 0B92	      [6] 00124		jsr	FreePargsAndKargs
 			  00125	; 00004	  x = x + -1
 0250 A2 97	      [2] 00126		ldx	#_x&$FF
 0252 A9 18	      [2] 00127		lda	#_x>>8
 0254 20 0B10	      [6] 00128		jsr	GetObject
 0257 86 14	      [3] 00129		stx	Ptr0
 0259 85 15	      [3] 00130		sta	Ptr0+1
 025B A2 79	      [2] 00131		ldx	#I__00001&$FF
 025D A9 18	      [2] 00132		lda	#I__00001>>8
 025F 86 16	      [3] 00133		stx	Ptr1
 0261 85 17	      [3] 00134		sta	Ptr1+1
 0263 20 0E10	      [6] 00135		jsr	object.__add__
 			  00136
 0266 AE 1897	      [4] 00137		ldx	_x
 0269 AD 1898	      [4] 00138		lda	_x+1
 026C 20 060E	      [6] 00139		jsr	DeRef
 			  00140
 026F A6 12	      [3] 00141		ldx	PtrA
 0271 A5 13	      [3] 00142		lda	PtrA+1
 0273 8E 1897	      [4] 00143		stx	_x
 0276 8D 1898	      [4] 00144		sta	_x+1
 			  00145	; 00005	print('Launch!')
 0279 4C 0221	      [3] 00146		jmp	L00000
 027C			  00147	L00002
 027C A9 01	      [2] 00148		lda	#1
 027E A2 00	      [2] 00149		ldx	#0
 0280 20 0B28	      [6] 00150		jsr	AllocPargsAndKargs
 0283 A0 03	      [2] 00151		ldy	#3
 0285 A2 82	      [2] 00152		ldx	#S_00000&$FF
 0287 A9 18	      [2] 00153		lda	#S_00000>>8
 0289 20 0B70	      [6] 00154		jsr	StoreParg
 028C A2 8E	      [2] 00155		ldx	#_print&$FF
 028E A9 18	      [2] 00156		lda	#_print>>8
 0290 20 0B10	      [6] 00157		jsr	GetObject
 0293 20 0BA9	      [6] 00158		jsr	Call
 0296 20 0B92	      [6] 00159		jsr	FreePargsAndKargs

Been finishing up addition and subtraction.

 			  00092	; 00001	a = b + c
 020E A2 EC	      [2] 00093		ldx	#_b&$FF
 0210 A9 1B	      [2] 00094		lda	#_b>>8
 0212 20 0D6F	      [6] 00095		jsr	GetObject
 0215 86 14	      [3] 00096		stx	Ptr0
 0217 85 15	      [3] 00097		sta	Ptr0+1
 0219 A2 F1	      [2] 00098		ldx	#_c&$FF
 021B A9 1B	      [2] 00099		lda	#_c>>8
 021D 20 0D6F	      [6] 00100		jsr	GetObject
 0220 86 16	      [3] 00101		stx	Ptr1
 0222 85 17	      [3] 00102		sta	Ptr1+1
 0224 20 10B7	      [6] 00103		jsr	object.__add__
 			  00104
 0227 AE 1BE7	      [4] 00105		ldx	_a
 022A AD 1BE8	      [4] 00106		lda	_a+1
 022D 20 0803	      [6] 00107		jsr	DeRef
 			  00108
 0230 A6 12	      [3] 00109		ldx	PtrA
 0232 A5 13	      [3] 00110		lda	PtrA+1
 0234 8E 1BE7	      [4] 00111		stx	_a
 0237 8D 1BE8	      [4] 00112		sta	_a+1
 			  00113	; 00002	a = 1 + 2
 			  00114
 023A AE 1BE7	      [4] 00115		ldx	_a
 023D AD 1BE8	      [4] 00116		lda	_a+1
 0240 20 0803	      [6] 00117		jsr	DeRef
 			  00118
 0243 A2 A8	      [2] 00119		ldx	#I_00003&$FF
 0245 A9 1B	      [2] 00120		lda	#I_00003>>8
 0247 8E 1BE7	      [4] 00121		stx	_a
 024A 8D 1BE8	      [4] 00122		sta	_a+1
 			  00123	; 00003	a = 2 + True
 			  00124
 024D AE 1BE7	      [4] 00125		ldx	_a
 0250 AD 1BE8	      [4] 00126		lda	_a+1
 0253 20 0803	      [6] 00127		jsr	DeRef
 			  00128
 0256 A2 A8	      [2] 00129		ldx	#I_00003&$FF
 0258 A9 1B	      [2] 00130		lda	#I_00003>>8
 025A 8E 1BE7	      [4] 00131		stx	_a
 025D 8D 1BE8	      [4] 00132		sta	_a+1
 			  00133	; 00004	a = 2 + False
 			  00134
 0260 AE 1BE7	      [4] 00135		ldx	_a
 0263 AD 1BE8	      [4] 00136		lda	_a+1
 0266 20 0803	      [6] 00137		jsr	DeRef
 			  00138
 0269 A2 AA	      [2] 00139		ldx	#I_00002&$FF
 026B A9 1B	      [2] 00140		lda	#I_00002>>8
 026D 8E 1BE7	      [4] 00141		stx	_a
 0270 8D 1BE8	      [4] 00142		sta	_a+1
 			  00143	; 00005	a = True + 2
 			  00144
 0273 AE 1BE7	      [4] 00145		ldx	_a
 0276 AD 1BE8	      [4] 00146		lda	_a+1
 0279 20 0803	      [6] 00147		jsr	DeRef
 			  00148
 027C A2 A8	      [2] 00149		ldx	#I_00003&$FF
 027E A9 1B	      [2] 00150		lda	#I_00003>>8
 0280 8E 1BE7	      [4] 00151		stx	_a
 0283 8D 1BE8	      [4] 00152		sta	_a+1
 			  00153	; 00006	a = False + 2
 			  00154
 0286 AE 1BE7	      [4] 00155		ldx	_a
 0289 AD 1BE8	      [4] 00156		lda	_a+1
 028C 20 0803	      [6] 00157		jsr	DeRef
 			  00158
 028F A2 AA	      [2] 00159		ldx	#I_00002&$FF
 0291 A9 1B	      [2] 00160		lda	#I_00002>>8
 0293 8E 1BE7	      [4] 00161		stx	_a
 0296 8D 1BE8	      [4] 00162		sta	_a+1
 			  00163	; 00007	a = False + False
 			  00164
 0299 AE 1BE7	      [4] 00165		ldx	_a
 029C AD 1BE8	      [4] 00166		lda	_a+1
 029F 20 0803	      [6] 00167		jsr	DeRef
 			  00168
 02A2 A2 A2	      [2] 00169		ldx	#I_00000&$FF
 02A4 A9 1B	      [2] 00170		lda	#I_00000>>8
 02A6 8E 1BE7	      [4] 00171		stx	_a
 02A9 8D 1BE8	      [4] 00172		sta	_a+1
 			  00173	; 00008	a = False + True
 			  00174
 02AC AE 1BE7	      [4] 00175		ldx	_a
 02AF AD 1BE8	      [4] 00176		lda	_a+1
 02B2 20 0803	      [6] 00177		jsr	DeRef
 			  00178
 02B5 A2 A4	      [2] 00179		ldx	#I_00001&$FF
 02B7 A9 1B	      [2] 00180		lda	#I_00001>>8
 02B9 8E 1BE7	      [4] 00181		stx	_a
 02BC 8D 1BE8	      [4] 00182		sta	_a+1
 			  00183	; 00009	a = True + False
 			  00184
 02BF AE 1BE7	      [4] 00185		ldx	_a
 02C2 AD 1BE8	      [4] 00186		lda	_a+1
 02C5 20 0803	      [6] 00187		jsr	DeRef
 			  00188
 02C8 A2 A4	      [2] 00189		ldx	#I_00001&$FF
 02CA A9 1B	      [2] 00190		lda	#I_00001>>8
 02CC 8E 1BE7	      [4] 00191		stx	_a
 02CF 8D 1BE8	      [4] 00192		sta	_a+1
 			  00193	; 00010	a = True + True
 			  00194
 02D2 AE 1BE7	      [4] 00195		ldx	_a
 02D5 AD 1BE8	      [4] 00196		lda	_a+1
 02D8 20 0803	      [6] 00197		jsr	DeRef
 			  00198
 02DB A2 AA	      [2] 00199		ldx	#I_00002&$FF
 02DD A9 1B	      [2] 00200		lda	#I_00002>>8
 02DF 8E 1BE7	      [4] 00201		stx	_a
 02E2 8D 1BE8	      [4] 00202		sta	_a+1
 			  00203	; 00011	a = "Hello " + "world."
 			  00204
 02E5 AE 1BE7	      [4] 00205		ldx	_a
 02E8 AD 1BE8	      [4] 00206		lda	_a+1
 02EB 20 0803	      [6] 00207		jsr	DeRef
 			  00208
 02EE A2 B4	      [2] 00209		ldx	#S_00000&$FF
 02F0 A9 1B	      [2] 00210		lda	#S_00000>>8
 02F2 8E 1BE7	      [4] 00211		stx	_a
 02F5 8D 1BE8	      [4] 00212		sta	_a+1
 			  00213	; 00012	a = b - c
 02F8 A2 EC	      [2] 00214		ldx	#_b&$FF
 02FA A9 1B	      [2] 00215		lda	#_b>>8
 02FC 20 0D6F	      [6] 00216		jsr	GetObject
 02FF 86 14	      [3] 00217		stx	Ptr0
 0301 85 15	      [3] 00218		sta	Ptr0+1
 0303 A2 F1	      [2] 00219		ldx	#_c&$FF
 0305 A9 1B	      [2] 00220		lda	#_c>>8
 0307 20 0D6F	      [6] 00221		jsr	GetObject
 030A 86 16	      [3] 00222		stx	Ptr1
 030C 85 17	      [3] 00223		sta	Ptr1+1
 030E 20 1183	      [6] 00224		jsr	object.__sub__
 			  00225
 0311 AE 1BE7	      [4] 00226		ldx	_a
 0314 AD 1BE8	      [4] 00227		lda	_a+1
 0317 20 0803	      [6] 00228		jsr	DeRef
 			  00229
 031A A6 12	      [3] 00230		ldx	PtrA
 031C A5 13	      [3] 00231		lda	PtrA+1
 031E 8E 1BE7	      [4] 00232		stx	_a
 0321 8D 1BE8	      [4] 00233		sta	_a+1
 			  00234	; 00013	a = 2 - 1
 			  00235
 0324 AE 1BE7	      [4] 00236		ldx	_a
 0327 AD 1BE8	      [4] 00237		lda	_a+1
 032A 20 0803	      [6] 00238		jsr	DeRef
 			  00239
 032D A2 A4	      [2] 00240		ldx	#I_00001&$FF
 032F A9 1B	      [2] 00241		lda	#I_00001>>8
 0331 8E 1BE7	      [4] 00242		stx	_a
 0334 8D 1BE8	      [4] 00243		sta	_a+1
 			  00244	; 00014	a = 2 - True
 			  00245
 0337 AE 1BE7	      [4] 00246		ldx	_a
 033A AD 1BE8	      [4] 00247		lda	_a+1
 033D 20 0803	      [6] 00248		jsr	DeRef
 			  00249
 0340 A2 A4	      [2] 00250		ldx	#I_00001&$FF
 0342 A9 1B	      [2] 00251		lda	#I_00001>>8
 0344 8E 1BE7	      [4] 00252		stx	_a
 0347 8D 1BE8	      [4] 00253		sta	_a+1
 			  00254	; 00015	a = 2 - False
 			  00255
 034A AE 1BE7	      [4] 00256		ldx	_a
 034D AD 1BE8	      [4] 00257		lda	_a+1
 0350 20 0803	      [6] 00258		jsr	DeRef
 			  00259
 0353 A2 AA	      [2] 00260		ldx	#I_00002&$FF
 0355 A9 1B	      [2] 00261		lda	#I_00002>>8
 0357 8E 1BE7	      [4] 00262		stx	_a
 035A 8D 1BE8	      [4] 00263		sta	_a+1
 			  00264	; 00016	a = True - 2
 			  00265
 035D AE 1BE7	      [4] 00266		ldx	_a
 0360 AD 1BE8	      [4] 00267		lda	_a+1
 0363 20 0803	      [6] 00268		jsr	DeRef
 			  00269
 0366 A2 D3	      [2] 00270		ldx	#I__00001&$FF
 0368 A9 1B	      [2] 00271		lda	#I__00001>>8
 036A 8E 1BE7	      [4] 00272		stx	_a
 036D 8D 1BE8	      [4] 00273		sta	_a+1
 			  00274	; 00017	a = False - 2
 			  00275
 0370 AE 1BE7	      [4] 00276		ldx	_a
 0373 AD 1BE8	      [4] 00277		lda	_a+1
 0376 20 0803	      [6] 00278		jsr	DeRef
 			  00279
 0379 A2 D1	      [2] 00280		ldx	#I__00002&$FF
 037B A9 1B	      [2] 00281		lda	#I__00002>>8
 037D 8E 1BE7	      [4] 00282		stx	_a
 0380 8D 1BE8	      [4] 00283		sta	_a+1
 			  00284	; 00018	a = False - False
 			  00285
 0383 AE 1BE7	      [4] 00286		ldx	_a
 0386 AD 1BE8	      [4] 00287		lda	_a+1
 0389 20 0803	      [6] 00288		jsr	DeRef
 			  00289
 038C A2 A2	      [2] 00290		ldx	#I_00000&$FF
 038E A9 1B	      [2] 00291		lda	#I_00000>>8
 0390 8E 1BE7	      [4] 00292		stx	_a
 0393 8D 1BE8	      [4] 00293		sta	_a+1
 			  00294	; 00019	a = False - True
 			  00295
 0396 AE 1BE7	      [4] 00296		ldx	_a
 0399 AD 1BE8	      [4] 00297		lda	_a+1
 039C 20 0803	      [6] 00298		jsr	DeRef
 			  00299
 039F A2 D3	      [2] 00300		ldx	#I__00001&$FF
 03A1 A9 1B	      [2] 00301		lda	#I__00001>>8
 03A3 8E 1BE7	      [4] 00302		stx	_a
 03A6 8D 1BE8	      [4] 00303		sta	_a+1
 			  00304	; 00020	a = True - False
 			  00305
 03A9 AE 1BE7	      [4] 00306		ldx	_a
 03AC AD 1BE8	      [4] 00307		lda	_a+1
 03AF 20 0803	      [6] 00308		jsr	DeRef
 			  00309
 03B2 A2 A4	      [2] 00310		ldx	#I_00001&$FF
 03B4 A9 1B	      [2] 00311		lda	#I_00001>>8
 03B6 8E 1BE7	      [4] 00312		stx	_a
 03B9 8D 1BE8	      [4] 00313		sta	_a+1
 			  00314	; 00021	a = True - True
 			  00315
 03BC AE 1BE7	      [4] 00316		ldx	_a
 03BF AD 1BE8	      [4] 00317		lda	_a+1
 03C2 20 0803	      [6] 00318		jsr	DeRef
 			  00319
 03C5 A2 A2	      [2] 00320		ldx	#I_00000&$FF
 03C7 A9 1B	      [2] 00321		lda	#I_00000>>8
 03C9 8E 1BE7	      [4] 00322		stx	_a
 03CC 8D 1BE8	      [4] 00323		sta	_a+1
1 Like

Houston…Fibonacci Base here…the Python has landed…

The Python source:

fibonacci = 0
prev = 1
n = 1
while n <= 300:
    temp = fibonacci
    fibonacci = fibonacci + prev
    prev = temp
    print(n, fibonacci)
    n = n + 1

The generated code:

 			  00094	; 00001	fibonacci = 0
 			  00095
 020E AE 1CBD	      [4] 00096		ldx	_fibonacci
 0211 AD 1CBE	      [4] 00097		lda	_fibonacci+1
 0214 20 0536	      [6] 00098		jsr	DeRef
 			  00099
 0217 A2 A0	      [2] 00100		ldx	#I_00000&$FF
 0219 A9 1C	      [2] 00101		lda	#I_00000>>8
 021B 8E 1CBD	      [4] 00102		stx	_fibonacci
 021E 8D 1CBE	      [4] 00103		sta	_fibonacci+1
 			  00104	; 00002	prev = 1
 			  00105
 0221 AE 1CB0	      [4] 00106		ldx	_prev
 0224 AD 1CB1	      [4] 00107		lda	_prev+1
 0227 20 0536	      [6] 00108		jsr	DeRef
 			  00109
 022A A2 A2	      [2] 00110		ldx	#I_00001&$FF
 022C A9 1C	      [2] 00111		lda	#I_00001>>8
 022E 8E 1CB0	      [4] 00112		stx	_prev
 0231 8D 1CB1	      [4] 00113		sta	_prev+1
 			  00114	; 00003	n = 1
 			  00115
 0234 AE 1CB8	      [4] 00116		ldx	_n
 0237 AD 1CB9	      [4] 00117		lda	_n+1
 023A 20 0536	      [6] 00118		jsr	DeRef
 			  00119
 023D A2 A2	      [2] 00120		ldx	#I_00001&$FF
 023F A9 1C	      [2] 00121		lda	#I_00001>>8
 0241 8E 1CB8	      [4] 00122		stx	_n
 0244 8D 1CB9	      [4] 00123		sta	_n+1
 			  00124	; 00004	while n <= 300:
 0247			  00125	L00000
 0247 A2 B8	      [2] 00126		ldx	#_n&$FF
 0249 A9 1C	      [2] 00127		lda	#_n>>8
 024B 20 0B33	      [6] 00128		jsr	GetObject
 024E 86 18	      [3] 00129		stx	Ptr0
 0250 85 19	      [3] 00130		sta	Ptr0+1
 0252 A2 A4	      [2] 00131		ldx	#I_00300&$FF
 0254 A9 1C	      [2] 00132		lda	#I_00300>>8
 0256 86 1A	      [3] 00133		stx	Ptr1
 0258 85 1B	      [3] 00134		sta	Ptr1+1
 025A 20 11F1	      [6] 00135		jsr	object.__le__
 025D 20 06D7	      [6] 00136		jsr	object.__bool__
 0260 D0 03 (0265)  [2/3] 00137		bne	L00001
 0262 4C 0329	      [3] 00138		jmp	L00002
 0265			  00139	L00001
 			  00140	; 00005	    temp = fibonacci
 0265 A2 BD	      [2] 00141		ldx	#_fibonacci&$FF
 0267 A9 1C	      [2] 00142		lda	#_fibonacci>>8
 0269 20 0B33	      [6] 00143		jsr	GetObject
 026C 86 16	      [3] 00144		stx	PtrA
 026E 85 17	      [3] 00145		sta	PtrA+1
 0270 20 0619	      [6] 00146		jsr	AddRef
 			  00147
 0273 AE 1CCA	      [4] 00148		ldx	_temp
 0276 AD 1CCB	      [4] 00149		lda	_temp+1
 0279 20 0536	      [6] 00150		jsr	DeRef
 			  00151
 027C A6 16	      [3] 00152		ldx	PtrA
 027E A5 17	      [3] 00153		lda	PtrA+1
 0280 8E 1CCA	      [4] 00154		stx	_temp
 0283 8D 1CCB	      [4] 00155		sta	_temp+1
 			  00156	; 00006	    fibonacci = fibonacci + prev
 0286 A2 BD	      [2] 00157		ldx	#_fibonacci&$FF
 0288 A9 1C	      [2] 00158		lda	#_fibonacci>>8
 028A 20 0B33	      [6] 00159		jsr	GetObject
 028D 86 18	      [3] 00160		stx	Ptr0
 028F 85 19	      [3] 00161		sta	Ptr0+1
 0291 A2 B0	      [2] 00162		ldx	#_prev&$FF
 0293 A9 1C	      [2] 00163		lda	#_prev>>8
 0295 20 0B33	      [6] 00164		jsr	GetObject
 0298 86 1A	      [3] 00165		stx	Ptr1
 029A 85 1B	      [3] 00166		sta	Ptr1+1
 029C 20 0E7C	      [6] 00167		jsr	object.__add__
 			  00168
 029F AE 1CBD	      [4] 00169		ldx	_fibonacci
 02A2 AD 1CBE	      [4] 00170		lda	_fibonacci+1
 02A5 20 0536	      [6] 00171		jsr	DeRef
 			  00172
 02A8 A6 16	      [3] 00173		ldx	PtrA
 02AA A5 17	      [3] 00174		lda	PtrA+1
 02AC 8E 1CBD	      [4] 00175		stx	_fibonacci
 02AF 8D 1CBE	      [4] 00176		sta	_fibonacci+1
 			  00177	; 00007	    prev = temp
 02B2 A2 CA	      [2] 00178		ldx	#_temp&$FF
 02B4 A9 1C	      [2] 00179		lda	#_temp>>8
 02B6 20 0B33	      [6] 00180		jsr	GetObject
 02B9 86 16	      [3] 00181		stx	PtrA
 02BB 85 17	      [3] 00182		sta	PtrA+1
 02BD 20 0619	      [6] 00183		jsr	AddRef
 			  00184
 02C0 AE 1CB0	      [4] 00185		ldx	_prev
 02C3 AD 1CB1	      [4] 00186		lda	_prev+1
 02C6 20 0536	      [6] 00187		jsr	DeRef
 			  00188
 02C9 A6 16	      [3] 00189		ldx	PtrA
 02CB A5 17	      [3] 00190		lda	PtrA+1
 02CD 8E 1CB0	      [4] 00191		stx	_prev
 02D0 8D 1CB1	      [4] 00192		sta	_prev+1
 			  00193	; 00008	    print(n, fibonacci)
 02D3 A9 02	      [2] 00194		lda	#2
 02D5 A2 00	      [2] 00195		ldx	#0
 02D7 20 0B4B	      [6] 00196		jsr	AllocPargsAndKargs
 02DA A0 05	      [2] 00197		ldy	#5
 02DC A2 BD	      [2] 00198		ldx	#_fibonacci&$FF
 02DE A9 1C	      [2] 00199		lda	#_fibonacci>>8
 02E0 20 0B33	      [6] 00200		jsr	GetObject
 02E3 20 0B93	      [6] 00201		jsr	StoreParg
 02E6 A2 B8	      [2] 00202		ldx	#_n&$FF
 02E8 A9 1C	      [2] 00203		lda	#_n>>8
 02EA 20 0B33	      [6] 00204		jsr	GetObject
 02ED 20 0B93	      [6] 00205		jsr	StoreParg
 02F0 A2 A7	      [2] 00206		ldx	#_print&$FF
 02F2 A9 1C	      [2] 00207		lda	#_print>>8
 02F4 20 0B33	      [6] 00208		jsr	GetObject
 02F7 20 0BCC	      [6] 00209		jsr	object.__call__
 02FA 20 0BB5	      [6] 00210		jsr	FreePargsAndKargs
 			  00211	; 00009	    n = n + 1
 02FD A2 B8	      [2] 00212		ldx	#_n&$FF
 02FF A9 1C	      [2] 00213		lda	#_n>>8
 0301 20 0B33	      [6] 00214		jsr	GetObject
 0304 86 18	      [3] 00215		stx	Ptr0
 0306 85 19	      [3] 00216		sta	Ptr0+1
 0308 A2 A2	      [2] 00217		ldx	#I_00001&$FF
 030A A9 1C	      [2] 00218		lda	#I_00001>>8
 030C 86 1A	      [3] 00219		stx	Ptr1
 030E 85 1B	      [3] 00220		sta	Ptr1+1
 0310 20 0E7C	      [6] 00221		jsr	object.__add__
 			  00222
 0313 AE 1CB8	      [4] 00223		ldx	_n
 0316 AD 1CB9	      [4] 00224		lda	_n+1
 0319 20 0536	      [6] 00225		jsr	DeRef
 			  00226
 031C A6 16	      [3] 00227		ldx	PtrA
 031E A5 17	      [3] 00228		lda	PtrA+1
 0320 8E 1CB8	      [4] 00229		stx	_n
 0323 8D 1CB9	      [4] 00230		sta	_n+1
 0326 4C 0247	      [3] 00231		jmp	L00000
 0329			  00232	L00002

And the output:

1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
17 1597
18 2584
19 4181
20 6765
21 10946
22 17711
23 28657
24 46368
25 75025
26 121393
27 196418
28 317811
29 514229
30 832040
31 1346269
32 2178309
33 3524578
34 5702887
35 9227465
36 14930352
37 24157817
38 39088169
39 63245986
40 102334155
41 165580141
42 267914296
43 433494437
44 701408733
45 1134903170
46 1836311903
47 2971215073
48 4807526976
49 7778742049
50 12586269025
51 20365011074
52 32951280099
53 53316291173
54 86267571272
55 139583862445
56 225851433717
57 365435296162
58 591286729879
59 956722026041
60 1548008755920
61 2504730781961
62 4052739537881
63 6557470319842
64 10610209857723
65 17167680177565
66 27777890035288
67 44945570212853
68 72723460248141
69 117669030460994
70 190392490709135
71 308061521170129
72 498454011879264
73 806515533049393
74 1304969544928657
75 2111485077978050
76 3416454622906707
77 5527939700884757
78 8944394323791464
79 14472334024676221
80 23416728348467685
81 37889062373143906
82 61305790721611591
83 99194853094755497
84 160500643816367088
85 259695496911122585
86 420196140727489673
87 679891637638612258
88 1100087778366101931
89 1779979416004714189
90 2880067194370816120
91 4660046610375530309
92 7540113804746346429
93 12200160415121876738
94 19740274219868223167
95 31940434634990099905
96 51680708854858323072
97 83621143489848422977
98 135301852344706746049
99 218922995834555169026
100 354224848179261915075
101 573147844013817084101
102 927372692193078999176
103 1500520536206896083277
104 2427893228399975082453
105 3928413764606871165730
106 6356306993006846248183
107 10284720757613717413913
108 16641027750620563662096
109 26925748508234281076009
110 43566776258854844738105
111 70492524767089125814114
112 114059301025943970552219
113 184551825793033096366333
114 298611126818977066918552
115 483162952612010163284885
116 781774079430987230203437
117 1264937032042997393488322
118 2046711111473984623691759
119 3311648143516982017180081
120 5358359254990966640871840
121 8670007398507948658051921
122 14028366653498915298923761
123 22698374052006863956975682
124 36726740705505779255899443
125 59425114757512643212875125
126 96151855463018422468774568
127 155576970220531065681649693
128 251728825683549488150424261
129 407305795904080553832073954
130 659034621587630041982498215
131 1066340417491710595814572169
132 1725375039079340637797070384
133 2791715456571051233611642553
134 4517090495650391871408712937
135 7308805952221443105020355490
136 11825896447871834976429068427
137 19134702400093278081449423917
138 30960598847965113057878492344
139 50095301248058391139327916261
140 81055900096023504197206408605
141 131151201344081895336534324866
142 212207101440105399533740733471
143 343358302784187294870275058337
144 555565404224292694404015791808
145 898923707008479989274290850145
146 1454489111232772683678306641953
147 2353412818241252672952597492098
148 3807901929474025356630904134051
149 6161314747715278029583501626149
150 9969216677189303386214405760200
151 16130531424904581415797907386349
152 26099748102093884802012313146549
153 42230279526998466217810220532898
154 68330027629092351019822533679447
155 110560307156090817237632754212345
156 178890334785183168257455287891792
157 289450641941273985495088042104137
158 468340976726457153752543329995929
159 757791618667731139247631372100066
160 1226132595394188293000174702095995
161 1983924214061919432247806074196061
162 3210056809456107725247980776292056
163 5193981023518027157495786850488117
164 8404037832974134882743767626780173
165 13598018856492162040239554477268290
166 22002056689466296922983322104048463
167 35600075545958458963222876581316753
168 57602132235424755886206198685365216
169 93202207781383214849429075266681969
170 150804340016807970735635273952047185
171 244006547798191185585064349218729154
172 394810887814999156320699623170776339
173 638817435613190341905763972389505493
174 1033628323428189498226463595560281832
175 1672445759041379840132227567949787325
176 2706074082469569338358691163510069157
177 4378519841510949178490918731459856482
178 7084593923980518516849609894969925639
179 11463113765491467695340528626429782121
180 18547707689471986212190138521399707760
181 30010821454963453907530667147829489881
182 48558529144435440119720805669229197641
183 78569350599398894027251472817058687522
184 127127879743834334146972278486287885163
185 205697230343233228174223751303346572685
186 332825110087067562321196029789634457848
187 538522340430300790495419781092981030533
188 871347450517368352816615810882615488381
189 1409869790947669143312035591975596518914
190 2281217241465037496128651402858212007295
191 3691087032412706639440686994833808526209
192 5972304273877744135569338397692020533504
193 9663391306290450775010025392525829059713
194 15635695580168194910579363790217849593217
195 25299086886458645685589389182743678652930
196 40934782466626840596168752972961528246147
197 66233869353085486281758142155705206899077
198 107168651819712326877926895128666735145224
199 173402521172797813159685037284371942044301
200 280571172992510140037611932413038677189525
201 453973694165307953197296969697410619233826
202 734544867157818093234908902110449296423351
203 1188518561323126046432205871807859915657177
204 1923063428480944139667114773918309212080528
205 3111581989804070186099320645726169127737705
206 5034645418285014325766435419644478339818233
207 8146227408089084511865756065370647467555938
208 13180872826374098837632191485015125807374171
209 21327100234463183349497947550385773274930109
210 34507973060837282187130139035400899082304280
211 55835073295300465536628086585786672357234389
212 90343046356137747723758225621187571439538669
213 146178119651438213260386312206974243796773058
214 236521166007575960984144537828161815236311727
215 382699285659014174244530850035136059033084785
216 619220451666590135228675387863297874269396512
217 1001919737325604309473206237898433933302481297
218 1621140188992194444701881625761731807571877809
219 2623059926317798754175087863660165740874359106
220 4244200115309993198876969489421897548446236915
221 6867260041627791953052057353082063289320596021
222 11111460156937785151929026842503960837766832936
223 17978720198565577104981084195586024127087428957
224 29090180355503362256910111038089984964854261893
225 47068900554068939361891195233676009091941690850
226 76159080909572301618801306271765994056795952743
227 123227981463641240980692501505442003148737643593
228 199387062373213542599493807777207997205533596336
229 322615043836854783580186309282650000354271239929
230 522002106210068326179680117059857997559804836265
231 844617150046923109759866426342507997914076076194
232 1366619256256991435939546543402365995473880912459
233 2211236406303914545699412969744873993387956988653
234 3577855662560905981638959513147239988861837901112
235 5789092068864820527338372482892113982249794889765
236 9366947731425726508977331996039353971111632790877
237 15156039800290547036315704478931467953361427680642
238 24522987531716273545293036474970821924473060471519
239 39679027332006820581608740953902289877834488152161
240 64202014863723094126901777428873111802307548623680
241 103881042195729914708510518382775401680142036775841
242 168083057059453008835412295811648513482449585399521
243 271964099255182923543922814194423915162591622175362
244 440047156314635932379335110006072428645041207574883
245 712011255569818855923257924200496343807632829750245
246 1152058411884454788302593034206568772452674037325128
247 1864069667454273644225850958407065116260306867075373
248 3016128079338728432528443992613633888712980904400501
249 4880197746793002076754294951020699004973287771475874
250 7896325826131730509282738943634332893686268675876375
251 12776523572924732586037033894655031898659556447352249
252 20672849399056463095319772838289364792345825123228624
253 33449372971981195681356806732944396691005381570580873
254 54122222371037658776676579571233761483351206693809497
255 87571595343018854458033386304178158174356588264390370
256 141693817714056513234709965875411919657707794958199867
257 229265413057075367692743352179590077832064383222590237
258 370959230771131880927453318055001997489772178180790104
259 600224643828207248620196670234592075321836561403380341
260 971183874599339129547649988289594072811608739584170445
261 1571408518427546378167846658524186148133445300987550786
262 2542592393026885507715496646813780220945054040571721231
263 4114000911454431885883343305337966369078499341559272017
264 6656593304481317393598839952151746590023553382130993248
265 10770594215935749279482183257489712959102052723690265265
266 17427187520417066673081023209641459549125606105821258513
267 28197781736352815952563206467131172508227658829511523778
268 45624969256769882625644229676772632057353264935332782291
269 73822750993122698578207436143903804565580923764844306069
270 119447720249892581203851665820676436622934188700177088360
271 193270471243015279782059101964580241188515112465021394429
272 312718191492907860985910767785256677811449301165198482789
273 505988662735923140767969869749836918999964413630219877218
274 818706854228831001753880637535093596811413714795418360007
275 1324695516964754142521850507284930515811378128425638237225
276 2143402371193585144275731144820024112622791843221056597232
277 3468097888158339286797581652104954628434169971646694834457
278 5611500259351924431073312796924978741056961814867751431689
279 9079598147510263717870894449029933369491131786514446266146
280 14691098406862188148944207245954912110548093601382197697835
281 23770696554372451866815101694984845480039225387896643963981
282 38461794961234640015759308940939757590587318989278841661816
283 62232491515607091882574410635924603070626544377175485625797
284 100694286476841731898333719576864360661213863366454327287613
285 162926777992448823780908130212788963731840407743629812913410
286 263621064469290555679241849789653324393054271110084140201023
287 426547842461739379460149980002442288124894678853713953114433
288 690168906931029935139391829792095612517948949963798093315456
289 1116716749392769314599541809794537900642843628817512046429889
290 1806885656323799249738933639586633513160792578781310139745345
291 2923602405716568564338475449381171413803636207598822186175234
292 4730488062040367814077409088967804926964428786380132325920579
293 7654090467756936378415884538348976340768064993978954512095813
294 12384578529797304192493293627316781267732493780359086838016392
295 20038668997554240570909178165665757608500558774338041350112205
296 32423247527351544763402471792982538876233052554697128188128597
297 52461916524905785334311649958648296484733611329035169538240802
298 84885164052257330097714121751630835360966663883732297726369399
299 137347080577163115432025771710279131845700275212767467264610201
300 222232244629420445529739893461909967206666939096499764990979600

We choose to compile Python and do the other things, not because they are easy, but because they are hard;

4 Likes

1 Like

It has been a long time since the last report, but the compiler can finally multiply numbers.

In my excitement, I hurredly typed in

print(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9)

so that I can admire the parser stack and unstack intermediate values. But it wrote code for:

print(141)

Curses, outsmarted by my own compiler…

So,

print(one + two * three + four * five + six * seven + eight * nine)

generates

 02D6 A2 23	      [2] 00199		ldx	#_three&$FF
 02D8 A9 23	      [2] 00200		lda	#_three>>8
 02DA 20 0C86	      [6] 00201		jsr	GetObject
 02DD 86 1A	      [3] 00202		stx	Ptr1
 02DF 85 1B	      [3] 00203		sta	Ptr1+1
 02E1 A2 F5	      [2] 00204		ldx	#_two&$FF
 02E3 A9 22	      [2] 00205		lda	#_two>>8
 02E5 20 0C86	      [6] 00206		jsr	GetObject
 02E8 86 18	      [3] 00207		stx	Ptr0
 02EA 85 19	      [3] 00208		sta	Ptr0+1
 02EC 20 146F	      [6] 00209		jsr	object.__mul__
 02EF 86 1A	      [3] 00210		stx	Ptr1
 02F1 85 1B	      [3] 00211		sta	Ptr1+1
 02F3 A2 13	      [2] 00212		ldx	#_one&$FF
 02F5 A9 23	      [2] 00213		lda	#_one>>8
 02F7 20 0C86	      [6] 00214		jsr	GetObject
 02FA 86 18	      [3] 00215		stx	Ptr0
 02FC 85 19	      [3] 00216		sta	Ptr0+1
 02FE 20 108F	      [6] 00217		jsr	object.__add__
 0301 48	      [3] 00218		pha
 0302 8A	      [2] 00219		txa
 0303 48	      [3] 00220		pha
 0304 A2 04	      [2] 00221		ldx	#_five&$FF
 0306 A9 23	      [2] 00222		lda	#_five>>8
 0308 20 0C86	      [6] 00223		jsr	GetObject
 030B 86 1A	      [3] 00224		stx	Ptr1
 030D 85 1B	      [3] 00225		sta	Ptr1+1
 030F A2 E4	      [2] 00226		ldx	#_four&$FF
 0311 A9 22	      [2] 00227		lda	#_four>>8
 0313 20 0C86	      [6] 00228		jsr	GetObject
 0316 86 18	      [3] 00229		stx	Ptr0
 0318 85 19	      [3] 00230		sta	Ptr0+1
 031A 20 146F	      [6] 00231		jsr	object.__mul__
 031D 86 1A	      [3] 00232		stx	Ptr1
 031F 85 1B	      [3] 00233		sta	Ptr1+1
 0321 68	      [4] 00234		pla
 0322 AA	      [2] 00235		tax
 0323 68	      [4] 00236		pla
 0324 86 18	      [3] 00237		stx	Ptr0
 0326 85 19	      [3] 00238		sta	Ptr0+1
 0328 20 108F	      [6] 00239		jsr	object.__add__
 032B 48	      [3] 00240		pha
 032C 8A	      [2] 00241		txa
 032D 48	      [3] 00242		pha
 032E A2 DB	      [2] 00243		ldx	#_seven&$FF
 0330 A9 22	      [2] 00244		lda	#_seven>>8
 0332 20 0C86	      [6] 00245		jsr	GetObject
 0335 86 1A	      [3] 00246		stx	Ptr1
 0337 85 1B	      [3] 00247		sta	Ptr1+1
 0339 A2 0C	      [2] 00248		ldx	#_six&$FF
 033B A9 23	      [2] 00249		lda	#_six>>8
 033D 20 0C86	      [6] 00250		jsr	GetObject
 0340 86 18	      [3] 00251		stx	Ptr0
 0342 85 19	      [3] 00252		sta	Ptr0+1
 0344 20 146F	      [6] 00253		jsr	object.__mul__
 0347 86 1A	      [3] 00254		stx	Ptr1
 0349 85 1B	      [3] 00255		sta	Ptr1+1
 034B 68	      [4] 00256		pla
 034C AA	      [2] 00257		tax
 034D 68	      [4] 00258		pla
 034E 86 18	      [3] 00259		stx	Ptr0
 0350 85 19	      [3] 00260		sta	Ptr0+1
 0352 20 108F	      [6] 00261		jsr	object.__add__
 0355 48	      [3] 00262		pha
 0356 8A	      [2] 00263		txa
 0357 48	      [3] 00264		pha
 0358 A2 FC	      [2] 00265		ldx	#_nine&$FF
 035A A9 22	      [2] 00266		lda	#_nine>>8
 035C 20 0C86	      [6] 00267		jsr	GetObject
 035F 86 1A	      [3] 00268		stx	Ptr1
 0361 85 1B	      [3] 00269		sta	Ptr1+1
 0363 A2 1A	      [2] 00270		ldx	#_eight&$FF
 0365 A9 23	      [2] 00271		lda	#_eight>>8
 0367 20 0C86	      [6] 00272		jsr	GetObject
 036A 86 18	      [3] 00273		stx	Ptr0
 036C 85 19	      [3] 00274		sta	Ptr0+1
 036E 20 146F	      [6] 00275		jsr	object.__mul__
 0371 86 1A	      [3] 00276		stx	Ptr1
 0373 85 1B	      [3] 00277		sta	Ptr1+1
 0375 68	      [4] 00278		pla
 0376 AA	      [2] 00279		tax
 0377 68	      [4] 00280		pla
 0378 86 18	      [3] 00281		stx	Ptr0
 037A 85 19	      [3] 00282		sta	Ptr0+1
 037C 20 108F	      [6] 00283		jsr	object.__add__
 037F 48	      [3] 00284		pha
 0380 8A	      [2] 00285		txa
 0381 48	      [3] 00286		pha
 0382 A9 01	      [2] 00287		lda	#1
 0384 A2 00	      [2] 00288		ldx	#0
 0386 20 0C9E	      [6] 00289		jsr	AllocPargsAndKargs
 0389 A0 03	      [2] 00290		ldy	#3
 038B 68	      [4] 00291		pla
 038C AA	      [2] 00292		tax
 038D 68	      [4] 00293		pla
 038E 20 0D04	      [6] 00294		jsr	StoreParg
 0391 A2 EC	      [2] 00295		ldx	#_print&$FF
 0393 A9 22	      [2] 00296		lda	#_print>>8
 0395 20 0C86	      [6] 00297		jsr	GetObject
 0398 20 0D49	      [6] 00298		jsr	object.__call__
 039B A0 02	      [2] 00299		ldy	#2
 039D 20 0D14	      [6] 00300		jsr	DerefParg
 03A0 20 0D26	      [6] 00301		jsr	FreePargsAndKargs

Expression evaluation is plagued with memory leaks like function calls had been. :frowning:

Every time a partial value is used in a calculation, it has been “consumed” and its storage must be reclaimed. The code in the previous code loses four blocks of memory.

Unfortunately, there does not appear to be an easy solution to this problem. There are three general paths for data through the code: pushed on the stack, evaluated as the left-hand side of the operator and evaluated as the right-hand side of the operator.

Reentering guru meditation…

2 Likes