For the 6502 and Pythons fans out there, a couple of additional code morsels.
First up, converting a variable precision integer to a string:
01778 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
01779 ;
01780 ; int.str - Convert an integer to string.
01781 ;
01782 ; Input:
01783 ; Ptr0 = address of the integer
01784 ;
01785 ; Output:
01786 ; Ptr0 = address of the string
01787 ;
01788 ; Uses:
01789 ; Int3 - the number of bytes in the integer
01790 ; Int4 - the number of digits
01791 ; Scr0 - the dividend
01792 ; Scr1 - the value 10
01793 ; Scr2 - the quotient
01794 ; Scr3 - the string buffer
01795 ;
09CF 01796 int.str
09CF A0 00 [2] 01797 ldy #0 ; Get object type
09D1 B1 10 [5/6] 01798 lda (Ptr0),Y
09D3 29 C0 [2] 01799 and #$C0
09D5 C9 40 [2] 01800 cmp #$40
09D7 F0 01 (09DA) [2/3] 01801 beq int.str0
01802
09D9 FF 01803 .fcb $FF ; Hook for future big integer type
01804
09DA 01805 int.str0
09DA A5 10 [3] 01806 lda Ptr0 ; Stash address of the integer
09DC 18 [2] 01807 clc
09DD 69 01 [2] 01808 adc #1
09DF 85 14 [3] 01809 sta Ptr2
09E1 A5 11 [3] 01810 lda Ptr0+1
09E3 69 00 [2] 01811 adc #0
09E5 85 15 [3] 01812 sta Ptr2+1
01813
09E7 A0 00 [2] 01814 ldy #0 ; Get length of integer
09E9 18 [2] 01815 clc ; Add 1 in case of MININT value
09EA B1 10 [5/6] 01816 lda (Ptr0),Y
09EC 29 3F [2] 01817 and #$3F
09EE 85 0C [3] 01818 sta Int3
09F0 69 01 [2] 01819 adc #1
09F2 AA [2] 01820 tax
09F3 85 0A [3] 01821 sta Int2
09F5 A9 00 [2] 01822 lda #0
09F7 85 0B [3] 01823 sta Int2+1
09F9 85 0D [3] 01824 sta Int3+1
01825
09FB 01826 int.str1
09FB A9 1C [2] 01827 lda #Scr0&$FF ; Verify scratch space 0 length
09FD 85 16 [3] 01828 sta Ptr3
09FF A9 00 [2] 01829 lda #Scr0>>8
0A01 85 17 [3] 01830 sta Ptr3+1
0A03 20 096B [6] 01831 jsr scratch.realloc
01832
0A06 A9 20 [2] 01833 lda #Scr1&$FF ; Verify scratch space 1 length
0A08 85 16 [3] 01834 sta Ptr3
0A0A A9 00 [2] 01835 lda #Scr1>>8
0A0C 85 17 [3] 01836 sta Ptr3+1
0A0E 20 096B [6] 01837 jsr scratch.realloc
01838
0A11 A9 24 [2] 01839 lda #Scr2&$FF ; Verify scratch space 2 length
0A13 85 16 [3] 01840 sta Ptr3
0A15 A9 00 [2] 01841 lda #Scr2>>8
0A17 85 17 [3] 01842 sta Ptr3+1
0A19 20 096B [6] 01843 jsr scratch.realloc
01844
0A1C A5 0C [3] 01845 lda Int3 ; Get length of integer * 3
0A1E 0A [2] 01846 asl A
0A1F 85 0A [3] 01847 sta Int2
0A21 A5 0D [3] 01848 lda Int3+1
0A23 2A [2] 01849 rol A
0A24 85 0B [3] 01850 sta Int2+1
0A26 88 [2] 01851 dey
0A27 A5 0C [3] 01852 lda Int3
0A29 18 [2] 01853 clc
0A2A 65 0A [3] 01854 adc Int2
0A2C 85 0A [3] 01855 sta Int2
0A2E A5 0D [3] 01856 lda Int3+1
0A30 65 0B [3] 01857 adc Int2+1
0A32 85 0B [3] 01858 sta Int2+1
01859
0A34 A9 28 [2] 01860 lda #Scr3&$FF ; Verify scratch space 3 length
0A36 85 16 [3] 01861 sta Ptr3
0A38 A9 00 [2] 01862 lda #Scr3>>8
0A3A 85 17 [3] 01863 sta Ptr3+1
0A3C 20 096B [6] 01864 jsr scratch.realloc
01865
0A3F A5 14 [3] 01866 lda Ptr2 ; Copy integer to dividend
0A41 85 10 [3] 01867 sta Ptr0
0A43 A5 15 [3] 01868 lda Ptr2+1
0A45 85 11 [3] 01869 sta Ptr0+1
0A47 A5 1C [3] 01870 lda Scr0
0A49 85 12 [3] 01871 sta Ptr1
0A4B A5 1D [3] 01872 lda Scr0+1
0A4D 85 13 [3] 01873 sta Ptr1+1
0A4F A5 0C [3] 01874 lda Int3
0A51 85 06 [3] 01875 sta Int0
0A53 A5 0D [3] 01876 lda Int3+1
0A55 85 07 [3] 01877 sta Int0+1
0A57 20 03B5 [6] 01878 jsr MovBlk
01879
0A5A A5 1C [3] 01880 lda Scr0 ; Determine address of high byte
0A5C 18 [2] 01881 clc
0A5D 65 0C [3] 01882 adc Int3
0A5F 85 12 [3] 01883 sta Ptr1
0A61 A5 1D [3] 01884 lda Scr0+1
0A63 65 0D [3] 01885 adc Int3+1
0A65 85 13 [3] 01886 sta Ptr1+1
0A67 A5 12 [3] 01887 lda Ptr1
0A69 38 [2] 01888 sec
0A6A E9 01 [2] 01889 sbc #1
0A6C 85 12 [3] 01890 sta Ptr1
0A6E A5 13 [3] 01891 lda Ptr1+1
0A70 E9 00 [2] 01892 sbc #0
0A72 85 13 [3] 01893 sta Ptr1+1
01894
0A74 A0 00 [2] 01895 ldy #0 ; Is the number negative
0A76 B1 12 [5/6] 01896 lda (Ptr1),Y
0A78 85 03 [3] 01897 sta Byt0 ; Remember it
0A7A 10 2D (0AA9) [2/3] 01898 bpl int.str2
01899
0A7C A5 1C [3] 01900 lda Scr0 ; Negate the number
0A7E 85 10 [3] 01901 sta Ptr0
0A80 A5 1D [3] 01902 lda Scr0+1
0A82 85 11 [3] 01903 sta Ptr0+1
0A84 A5 0C [3] 01904 lda Int3
0A86 85 06 [3] 01905 sta Int0
0A88 A5 0D [3] 01906 lda Int3+1
0A8A 85 07 [3] 01907 sta Int0+1
0A8C 20 0797 [6] 01908 jsr IntNegate
01909
0A8F A0 00 [2] 01910 ldy #0 ; MININT if upper byte is the same
0A91 B1 12 [5/6] 01911 lda (Ptr1),Y
0A93 C5 03 [3] 01912 cmp Byt0
0A95 D0 12 (0AA9) [2/3] 01913 bne int.str2
01914
0A97 C8 [2] 01915 iny ; Need an extra byte to handle it
0A98 A9 00 [2] 01916 lda #0
0A9A 91 12 [6] 01917 sta (Ptr1),Y
0A9C A5 0C [3] 01918 lda Int3
0A9E 18 [2] 01919 clc
0A9F 69 01 [2] 01920 adc #1
0AA1 85 0C [3] 01921 sta Int3
0AA3 A5 0D [3] 01922 lda Int3+1
0AA5 69 00 [2] 01923 adc #0
0AA7 85 0D [3] 01924 sta Int3+1
01925
0AA9 01926 int.str2
0AA9 A5 24 [3] 01927 lda Scr2 ; Initially, quotient is 0
0AAB 85 10 [3] 01928 sta Ptr0
0AAD A5 25 [3] 01929 lda Scr2+1
0AAF 85 11 [3] 01930 sta Ptr0+1
0AB1 A5 0C [3] 01931 lda Int3
0AB3 85 06 [3] 01932 sta Int0
0AB5 A5 0D [3] 01933 lda Int3+1
0AB7 85 07 [3] 01934 sta Int0+1
0AB9 20 0396 [6] 01935 jsr SetBlk
01936
0ABC A9 00 [2] 01937 lda #0 ; Initially no digits
0ABE 85 0E [3] 01938 sta Int4
0AC0 85 0F [3] 01939 sta Int4+1
01940
0AC2 A5 28 [3] 01941 lda Scr3 ; Build converted number backward
0AC4 18 [2] 01942 clc
0AC5 65 2A [3] 01943 adc ScrLen3
0AC7 85 16 [3] 01944 sta Ptr3
0AC9 A5 29 [3] 01945 lda Scr3+1
0ACB 65 2B [3] 01946 adc ScrLen3+1
0ACD 85 17 [3] 01947 sta Ptr3+1
01948
0ACF 01949 int.str3
0ACF A5 20 [3] 01950 lda Scr1 ; Divisor is 10
0AD1 85 10 [3] 01951 sta Ptr0
0AD3 A5 21 [3] 01952 lda Scr1+1
0AD5 85 11 [3] 01953 sta Ptr0+1
0AD7 A5 0C [3] 01954 lda Int3
0AD9 85 06 [3] 01955 sta Int0
0ADB A5 0D [3] 01956 lda Int3+1
0ADD 85 07 [3] 01957 sta Int0+1
0ADF 20 0396 [6] 01958 jsr SetBlk
0AE2 A0 00 [2] 01959 ldy #0
0AE4 A9 0A [2] 01960 lda #10
0AE6 91 20 [6] 01961 sta (Scr1),Y
01962
0AE8 A5 0C [3] 01963 lda Int3 ; Divide dividend by 10
0AEA 85 06 [3] 01964 sta Int0
0AEC A5 0D [3] 01965 lda Int3+1
0AEE 85 07 [3] 01966 sta Int0+1
0AF0 20 0625 [6] 01967 jsr IDivMod
01968
0AF3 A5 16 [3] 01969 lda Ptr3 ; Remainder is next digit
0AF5 38 [2] 01970 sec
0AF6 E9 01 [2] 01971 sbc #1
0AF8 85 16 [3] 01972 sta Ptr3
0AFA A5 17 [3] 01973 lda Ptr3+1
0AFC E9 00 [2] 01974 sbc #0
0AFE 85 17 [3] 01975 sta Ptr3+1
0B00 A0 00 [2] 01976 ldy #0
0B02 B1 1C [5/6] 01977 lda (Scr0),Y
0B04 18 [2] 01978 clc
0B05 69 30 [2] 01979 adc #'0'
0B07 91 16 [6] 01980 sta (Ptr3),Y
01981
0B09 A5 0E [3] 01982 lda Int4 ; Count the digit
0B0B 18 [2] 01983 clc
0B0C 69 01 [2] 01984 adc #1
0B0E 85 0E [3] 01985 sta Int4
0B10 A5 0F [3] 01986 lda Int4+1
0B12 69 00 [2] 01987 adc #0
0B14 85 0F [3] 01988 sta Int4+1
01989
0B16 A5 24 [3] 01990 lda Scr2 ; Copy quotient to dividend
0B18 85 10 [3] 01991 sta Ptr0
0B1A A5 25 [3] 01992 lda Scr2+1
0B1C 85 11 [3] 01993 sta Ptr0+1
0B1E A5 1C [3] 01994 lda Scr0
0B20 85 12 [3] 01995 sta Ptr1
0B22 A5 1D [3] 01996 lda Scr0+1
0B24 85 13 [3] 01997 sta Ptr1+1
0B26 A5 0C [3] 01998 lda Int3
0B28 85 06 [3] 01999 sta Int0
0B2A A5 0D [3] 02000 lda Int3+1
0B2C 85 07 [3] 02001 sta Int0+1
0B2E 20 03B5 [6] 02002 jsr MovBlk
02003
0B31 A5 1C [3] 02004 lda Scr0 ; Repeat if the dividend is not zero
0B33 85 10 [3] 02005 sta Ptr0
0B35 A5 1D [3] 02006 lda Scr0+1
0B37 85 11 [3] 02007 sta Ptr0+1
0B39 A5 0C [3] 02008 lda Int3
0B3B 85 06 [3] 02009 sta Int0
0B3D A5 0D [3] 02010 lda Int3+1
0B3F 85 07 [3] 02011 sta Int0+1
0B41 20 09AC [6] 02012 jsr IsZero
0B44 D0 89 (0ACF) [2/4] 02013 bne int.str3
02014
0B46 A5 03 [3] 02015 lda Byt0 ; Is the number negative?
0B48 10 20 (0B6A) [2/3] 02016 bpl int.str4
02017
0B4A A5 16 [3] 02018 lda Ptr3 ; Add a minus sign
0B4C 38 [2] 02019 sec
0B4D E9 01 [2] 02020 sbc #1
0B4F 85 16 [3] 02021 sta Ptr3
0B51 A5 17 [3] 02022 lda Ptr3+1
0B53 E9 00 [2] 02023 sbc #0
0B55 85 17 [3] 02024 sta Ptr3+1
0B57 A0 00 [2] 02025 ldy #0
0B59 A9 2D [2] 02026 lda #'-'
0B5B 91 16 [6] 02027 sta (Ptr3),Y
02028
0B5D A5 0E [3] 02029 lda Int4 ; Count the minus sign
0B5F 18 [2] 02030 clc
0B60 69 01 [2] 02031 adc #1
0B62 85 0E [3] 02032 sta Int4
0B64 A5 0F [3] 02033 lda Int4+1
0B66 69 00 [2] 02034 adc #0
0B68 85 0F [3] 02035 sta Int4+1
02036
0B6A 02037 int.str4
0B6A A5 0E [3] 02038 lda Int4 ; Allocate result string
0B6C 18 [2] 02039 clc
0B6D 69 03 [2] 02040 adc #3
0B6F 85 06 [3] 02041 sta Int0
0B71 A5 0F [3] 02042 lda Int4+1
0B73 69 00 [2] 02043 adc #0
0B75 85 07 [3] 02044 sta Int0+1
0B77 20 03D6 [6] 02045 jsr Alloc
02046
0B7A A5 10 [3] 02047 lda Ptr0 ; Stash memory address
0B7C 85 12 [3] 02048 sta Ptr1
0B7E 85 14 [3] 02049 sta Ptr2
0B80 A5 11 [3] 02050 lda Ptr0+1
0B82 85 13 [3] 02051 sta Ptr1+1
0B84 85 15 [3] 02052 sta Ptr2+1
02053
0B86 05 10 [3] 02054 ora Ptr0 ;*** Out of memory check here
02055
0B88 A5 16 [3] 02056 lda Ptr3 ; Copy string into memory block
0B8A 85 10 [3] 02057 sta Ptr0
0B8C A5 17 [3] 02058 lda Ptr3+1
0B8E 85 11 [3] 02059 sta Ptr0+1
0B90 A5 12 [3] 02060 lda Ptr1
0B92 18 [2] 02061 clc
0B93 69 03 [2] 02062 adc #3
0B95 85 12 [3] 02063 sta Ptr1
0B97 A5 13 [3] 02064 lda Ptr1+1
0B99 69 00 [2] 02065 adc #0
0B9B 85 13 [3] 02066 sta Ptr1+1
0B9D A5 0E [3] 02067 lda Int4
0B9F 85 06 [3] 02068 sta Int0
0BA1 A5 0F [3] 02069 lda Int4+1
0BA3 85 07 [3] 02070 sta Int0+1
0BA5 20 03B5 [6] 02071 jsr MovBlk
02072
0BA8 A5 14 [3] 02073 lda Ptr2 ; Recover memory address
0BAA 85 10 [3] 02074 sta Ptr0
0BAC A5 15 [3] 02075 lda Ptr2+1
0BAE 85 11 [3] 02076 sta Ptr0+1
02077
0BB0 A0 00 [2] 02078 ldy #0 ; Finish making it an official string
0BB2 A9 81 [2] 02079 lda #$81
0BB4 91 10 [6] 02080 sta (Ptr0),Y
0BB6 C8 [2] 02081 iny
0BB7 A5 0E [3] 02082 lda Int4
0BB9 91 10 [6] 02083 sta (Ptr0),Y
0BBB C8 [2] 02084 iny
0BBC A5 0F [3] 02085 lda Int4+1
0BBE 91 10 [6] 02086 sta (Ptr0),Y
02087
0BC0 60 [6] 02088 rts ; Phew!