PICAXE X2 range released.

Tom2000

Senior Member
@ Dr_Acula : It is a simple "yes/no" question

I'm not sure it is, not as clear-cut as "yes, we are revamping the language and will provide that", "no, we're never doing that", as there are a number of reasonable responses in between. I'll leave Technical to give an official response.
Fair enough, Hippy.

And, by the way, congratulations to all at RevEd for getting the X2 line out the door. That's a significant milestone for you. I wish you success with the new product line.

Tom


PS... now that I think about things a bit, local variables and parameter passing might not be all that difficult to implement, since both would use exactly the same mechanism and facilities. (I'm not asking for Dr. Acula's stongly-typed language, just primitive p-list handling and variable return.)

First, establish a parameter stack. Figure out how big to make it, where to put it, how to manipulate the stack pointer on subroutine call and return, and impose data type constraints. For a starter, maybe limit the mechanism to byte types, with word types handled automatically by the compiler as a pair of bytes.

Establish constraints for the parameter list. Data types (byte and word) and maximum p-list length and maximum local variable block size.

Establish rules for subroutine return, making it as easy on yourselves as possible. Say that all subroutines that return a parameter value will, automatically, return one word. Whatever would get V1.0 out the door soonest.

To keep it simple, pass all parameters by value for the first cut, not by name. In other words, no pointer passing unless it's the value of one of the built-in pointers such as @ptr. (I can hear Dr. Acula's scream all the way up here in Seattle. :) )

At subroutine call, have the compiler count the bytes in the p-list, then copy the values of the variables in the p-list to the stack, adjusting the stack pointer for each one. A stack push, if you will. Then adjust the stack pointer for the size of the subroutine's local variable block. (Locals will be kept on the variable stack, just above -- or below -- the passed parameter values.)

As the subroutine executes, local variables will be accessed as stack pointer indirect operations.

At subroutine return, if there's no return value, just restore the stack pointer to its value before the call. Presto! The passed parameters and local variables have suddenly disappeared.

If the subroutine returns a value, it's the responsibility of the statement following the subroutine call to copy that value from the top of the stack to local storage (or whatever), then adjust the stack pointer.

Finally, include the syntax in the language to support the new features.

This mechanism will automatically provide nested subroutine calls.

That's about it. Although I know there's a devil in these details, something like this should be workable. Even the primitive mechanism I've described would go a long way toward making large programs easier to read, write, debug, and most importantly, maintain.

T.
 

Dippy

Moderator
I can imagine that getting all that sorted would be a hard task.
And, of course, everyone will want done free of charge. And done in 5 minutes?

Pushing and popping is a popular method with at least one BASIC complier I know for passing variables into subroutines.

"language is currently pretty much 'anything goes' as... (etc)"
- Mmmm... maybe a little out of date there. I know of 3 popular and professional BASIC compilers which have a fantastic structure arrangement. Even snobby C coders would see similarities :) and even some PASCAL coders too!

Anyway, lets assume it's not just around the corner and optimise what we have - which is perfectly good enough for most in this market.
 

hippy

Ex-Staff (retired)
language is currently pretty much 'anything goes' as... (etc)" - Mmmm... maybe a little out of date there.

Arguably so, and maybe we should skip enhancing Basic, bypass C and C++, and go straight to Java, or something which gets the 'modernists' raving ;-)

As noted, there are alternatives which do things differently to the PICAXE, but there's the market that chooses PICAXE over the competition for a whole range of reasons. It's important ( debate on potential changes accepted ) to deliver what people want. Not everyone is a first-class professional programmer or highly-skilled, and different people have different expectations, desires and needs. PICAXE can be seen as targeted towards the lower-skilled - and there's no shame in that - but is capable and credible enough to be used by those with more advanced skills. What differentiates PICAXE from others is perhaps that ease of use which can be appreciated across all skill levels.

But I think I'm preaching to the choir in that respect :)
 

kevrus

New Member
by Hippy
PICAXE can be seen as targeted towards the lower-skilled - and there's no shame in that - but is capable and credible enough to be used by those with more advanced skills.
I certainly fall into the lower-skilled group...these few posts on strings, stacks,passing variables etc have got me totally lost, although I do understand the need to follow larger programs, I have one using a GLCD that is currently at 3800 bytes (no attempt at optimising yet) and I struggle to follow it, even though iI wrote it!!
 

boriz

Senior Member
What's all this talk of a compiler? I thought Picaxe Basic was interpreted (requiring a large program to be taking up space, even on a 'blank' Picaxe)

If it is indeed (even partially) compiled before downloading to the chip, then there is no technical reason why the language cannot be updated to include an INLINE ASSEMBLER!!! This would alone solve every single drawback of the Picaxe. Including, but definitely not limited to, the ones mentioned in this thread.

If however, the Picaxe Basic source code is sent to the chip, and a RESIDENT interpreter decodes and executes each line, one at a time, then it would be more difficult to implement.

So which is it? Compiled or interpreted?
 

hippy

Ex-Staff (retired)
PICAXE firmware is an interpreter but source is not sent straight to the chip; it is a tokenised and compressed representation of commands which is sent.

"Compiler" still fits the bill in terms of translating source into this tokenised format although it is often associated with compiling source to native, executable machine code.

The full ballgame is; compiled to tokenised form, downloaded, then interpreted.
 

Tom2000

Senior Member
I certainly fall into the lower-skilled group...these few posts on
strings, stacks,passing variables etc have got me totally lost, although I do understand the
need to follow larger programs, I have one using a GLCD that is currently at 3800 bytes (no
attempt at optimising yet) and I struggle to follow it, even though iI wrote it!!
If you can manage a 3800 byte program, you're definitely not a member of the lower-skilled group!

In the posts above, forget about all the jargon. What we're all getting at is a better way to
write and maintain Picaxe BASIC code.

Right now, you know that all memory is global. That is, every memory register can be read
and written by any line of the program, located anywhere. This causes huge problems in a
large program.

Let's say you're using b6 for something in one subroutine. b6 can be read and written by
any line, in any subroutine or your mainline, anywhere in your program. With your large
program, I'm sure you've encountered problems remembering just what you're doing with
each memory register in all you're program's code. It's only too easy to write code that
modifies the value of b6 that you're using somewhere else. If you didn't mean to overwrite
b6's value, maybe because you wrote the code that used the original b6 last week and you
forgot that you did, you'll have a serious bug in your code.

This is a particular problem if you've named b6 something else. Just reading the name
won't give you a clue that it's a global memory register, other than the fact that, right
now, everything is a global variable.

To get around that problem, we want local variables. This just means that any subroutine
can have memory that's available only to that subroutine, memory that can't be written or
read outside that subroutine.

Let's look at one possible example of a subroutine that uses local variables:

Code:
Add:

;  Declare two local variables, var1 and var2, of data type byte.  These will exist only within
;  this subroutine.  

;  They are created when the subroutine is first called, and disappear when the subroutine
;  returns.  

;  They can't be accessed by any code outside this subroutine.  

;  You can even name other local variables var1 and var2.  Matter of fact, you could
;  have many locals named var1 and var2.  With the local variable mechanism, none of 
;  these var1 and var2 thingies can interfere with one another.

;  If locals are implemented well, these variables will be initialized to zero, automatically, 
;  when they are created
   
   byte var1
   byte var2

;  Do something with these locals

   var1 = 14
   var2 = 23
   var1 = var1 + var2

;  Put the result in a global variable that can be accessed outside of the subroutine

   b6 = var1

;  Return from the subroutine.  var1 and var2 are automatically destroyed at return

return
Parameter passing is a way to feed the subroutine with input values without using global
memory registers, which again prevents overwriting a memory register inadvertently.


Code:
; The subroutine call:  the two parameters passed can be any value or existing variable,
;  either local or global.  The subroutine will take these two values as its input.

   gosub Add(14,23)

; or

   number1 = 14     ; number1 and number2 can be either local or global variables
   number2 = 23
   gosub Add(number1,number2)


;  The subroutine label now contains a parameter list that tells you the subroutine expects
;  to receive two values from the calling statement.  If the calling statement doesn't match
;  the paramter list format declared here, the compiler generates an error message.

Add(val1,val2):

  ; do something with the passed-in parameters:

   b6 = val1 + val2

return

;  Note that the only global memory register used in this whole call and return operation
;  is b6.  None of the other variables can be accessed by any other code in the program.

;  Note also that the variable names used in these operations are unique to the lines
;  where they are used, not global within the program.  You could use the names var1 and
;  var2 anywhere else in the program without interference with this particular operation,
;  and without generating a compile-time error.  You don't have to remember whether
;  or not you've used a variable name elsewhere in your program.
Now let's take care of that nasty ol' global variable that we're using to return the
subroutine's result. Doing so will remove any possibility of inadvertent interference with our
operation by any code located elsewhere in the program. Let's first start with the
subroutine:

Code:
Add(var1,var2):

   var1 = var1 + var2

return var1    ;  This tells the subroutine to return the value of var1 to the calling statement


The calling statement might look something like this:

   sum = gosub Add(number1,number2)

The subroutine will add the values of variables named number1 and number2, then return
the result to the calling statement.  The calling statement will then take the result and
store it in a variable named sum.  sum can be either a local or global variable.

Note also that the names used in the parameter list of the calling statement don't have
to match the names used by the subroutine's parameter list.
So, from these examples, I think you can see that local variables and parameter passing
makes your life as a programmer much easier.

You don't have to have a photographic memory in order to write code that's results can't be
inadvertently modified by code eslewhere in your program, code that you wrote, perhaps, a
week or a year ago.

You don't have to worry about unique variable names.

The code is much easier to read, too. And modification is also much simpler and very much
safer. With variable values and names isolated throughout your program, you don't have to
worry about a tiny change to your program inadvertently screwing up something, totally
unrelated, elsewhere in your code.

Way back when, a friend of mine coined a term for HP BASIC which, at that time, shared
the same problems as Picaxe BASIC: no local variables, no local variable names, no
parameter passing, and no return values from subroutines. He called that "holographic
code." A tiny change made at one place in the program would affect every other thing in
said program.

Did I clear it up for you, or did I confuse you further?

Have fun!

Tom
 

BCJKiwi

Senior Member
Speaking as a non-programmer (??), the simplest way to work around the fact that all variables are global, is to have an unlimited supply of them, and, if wanted, label every one. Then, only use the one you want when you want - effectively it becomes a local variable but can also be used as global to pass data between subroutines.
For larger programs I create a list at the top with all the variables and what they are used for - have had to organise some as 'global' for re-use as there have been programs with insufficient varibles (28X1).
Also have already used eeprom and @ptr to achieve additional functionality in this area on the 28X1.

It seems 256 byte variables in the X2 (56 as bxx + the rest as @bptr) is a pretty big advance on the 28 available in the 28X1.
 
Last edited:

hippy

Ex-Staff (retired)
One handy way to get local variables is to poke existing variables away and peek back what they were when finished.

That's been used in a number of programs and is useful when variables are in short supply or writing multi-task code. That's how I did my MP3 player; a number of tasks, each having b0-b7 as locals ( each task loads up its own copies previously saved, saves them when finished ) with b8-b13 global, and they could be saved and restored if any task needed some extra.

With larger variable space plus the various '@' variables there is scope for doing some quite clever things.
 

kevrus

New Member
Tom, many thanks for the explanation, it did clear things up quite well. Now I have an understanding, I can see the advantages, although I think it would take some practice before I could get to grips with it.
As for my 3800 byte code, its a merging of two separate (but related) projects plus some excercises at plotting images on a GLCD (using the glic chip).... probably only a 1500 byte code if written and optimised 'correctly' by some of the more experienced coders hence not as 'impressive' as it first appears (thanks for the confidence booster though).
 

BCJKiwi

Senior Member
@SS,
What is "actually 1024" ?
bxx + @bptr total is 256 (0 thru 255) or are you referring to something else?
 

hippy

Ex-Staff (retired)
PICAXE Manual 2 describes all the various types of memory and storage there is but to recap for the 28X2's ...

General Purpose Variables - 256 bytes - The first 56 map to b0-b55 ( and other overlayed 'bit and 'w' variables ), all accessible via the 'bptr' and '@bptr' variables and Peek and Poke commands.

Special Function Variables - Variables which are used to control the chip operation through firmware; the 'pin' and 'dir' variables and so on plus the 'bptr' and '@bptr' variables themselves. Used as general purpose variables are.

System Variables - 8 words - An additional set of Special Function Variables which reflect what's going on within the firmware / hardware of the chip - interrupt flags, timers etc. Used as general purpose variables are.

Scratchpad - 1024 bytes - Accessible via 'ptr' and '@ptr' variables and Get and Put commands. Can be filled in the background through high-speed serial and read and written by another PICAXE when operating as an I2C slave.

Table - 256 bytes - Non-Volatile, read only data, defined by Table() accessible via ReadTable command.

Data Eeprom - 256 bytes - Non-volatile read and writeable data, defined by Eeprom() or Data(), accessible by Read and Write Commands.

SFR - 256 bytes - Chip control registers, accessed by PeekSfr and PokeSfr.
 

Brietech

Senior Member
I was able to write a 4083 byte (1699 lines!) program for my v2 laptop project, and it really wasn't that bad to manage. Using a stack (especially with the 'scratchpad' memory!) is fairly easy to do local variables, and should suffice for most things. I found the whole "collapsible text" feature in the programming editor to be the biggest help for handling large programs. That way you can have lots of sub-programs, and just collapse the parts you aren't working on.

Anyway, these chips are *awfully* sweet looking. I had sworn off 'laptopping' for a while when I finally finished my v2 project, but this really makes me want to try for a v3! Maybe this version will even have a GUI (and a mouse! and a camera! and maybe wireless internet! I'm getting ahead of myself again..) =)
 

SilentScreamer

Senior Member
I was able to write a 4083 byte (1699 lines!) program for my v2 laptop project, and it really wasn't that bad to manage. Using a stack (especially with the 'scratchpad' memory!) is fairly easy to do local variables, and should suffice for most things. I found the whole "collapsible text" feature in the programming editor to be the biggest help for handling large programs. That way you can have lots of sub-programs, and just collapse the parts you aren't working on.

Anyway, these chips are *awfully* sweet looking. I had sworn off 'laptopping' for a while when I finally finished my v2 project, but this really makes me want to try for a v3! Maybe this version will even have a GUI (and a mouse! and a camera! and maybe wireless internet! I'm getting ahead of myself again..) =)
And thanks to I2C eeprom programs the program space shouldn't be such an issue.
 

manuka

Senior Member
Breadboard ready -awaiting X2 delivery. (Picture shows student who'd anticipated X2 arrival for 2006 project)
 

Attachments

Last edited:

Tom2000

Senior Member
Scratchpad - 1024 bytes - Accessible via 'ptr' and '@ptr' variables and Get and Put commands. Can be filled in the background through high-speed serial and read and written by another PICAXE when operating as an I2C slave.
That sounds like a very cool and very useful feature! Does that make serial reads completely non-blocking?
 
Last edited:

Technical

Technical Support
Staff member
That sounds like a very cool and very useful feature! Does that make serial reads completely non-blocking?
This is an existing feature of the 28X1 as well (128 byte scratchpad), yes, they are non-blocking. See the hsersetup command.
 

boriz

Senior Member
...The full ballgame is; compiled to tokenised form, downloaded, then interpreted.

Ok. So perhaps two new tokens, STARTASM and ENDASM. The PE 'compiler' assembles the mnemonics between these tokens and the onboard firmware stops interpreting and (after storing the program counter) starts executing, restoring the program counter to the interpreter after the ENDASM. Or something like that. Sounds simple doesn't it :)
 

Tom2000

Senior Member
This is an existing feature of the 28X1 as well (128 byte scratchpad), yes, they are non-blocking. See the hsersetup command.
Oh, yes. I had forgotten about that. (That's one of the features that didn't work on the 28X1 Rev A.1 chips I bought, IIRC, but I remember reading about it in the manual.)

Thanks,

Tom
 

hippy

Ex-Staff (retired)
@ boriz : It sounds simple but is a little more complicated than that. It may get added one day but, as always, it's a question of effort and support costs against usefulness and gain. I can only really think of a few cases where access to assembler could have some benefit and it would seem more likely such things would be implemented as Basic commands to make them more easily usable by everyone if they were needed.
 

manie

Senior Member
Although I've said before that it will be a long time before I outgrow the venerable 28x1 and/or 40x1 chips, it does seem that the x2's provide such a wealth of improvements that will really make PCB design SO MUCH EASIER. Imagine, you don't have to suit the layout to a required function, you can now actually suit the function from the pins ! I think that is one of the bigger advantages to these new chips. Well done Rev-Ed.
Manie
 

SilentScreamer

Senior Member
Although I've said before that it will be a long time before I outgrow the venerable 28x1 and/or 40x1 chips, it does seem that the x2's provide such a wealth of improvements that will really make PCB design SO MUCH EASIER. Imagine, you don't have to suit the layout to a required function, you can now actually suit the function from the pins ! I think that is one of the bigger advantages to these new chips. Well done Rev-Ed.
Manie
This is an example of why I dislike the M series. Inputs down one side and outputs down the other? Makes PCB design with multiple ICs far harder than it needs to be.
 

boriz

Senior Member
"I can only really think of a few cases where access to assembler could have some benefit"

You're joking right? Just how much faster is machine code than interpreted basic? I think fairly soon after introducing an inline assembler, people will be writing their own commands and functions and publishing them here. Need another PWM? No problem. Need greater accuracy, speed, 32bit maths, sin/cos, floating point, real time signal processing, whatever? No problem. Special maths, special comm protocols, lookups, etc, all super fast.

I honestly believe that an inline assembler is far and above the most useful function any high level language can ever have.
 

womai

Senior Member
Only problem I can see - what's the target market? If someone can fluently write complicated things in assembler it means he/she is already quite advanced - then why would he/she use a Picaxe for that, instead if a (cheaper) native PIC? And if you want to keep the convenience of a higher language, use one of the inexpensive Basic or C compilers (which all can include segments of machine code).

IMHO the Picaxe (especially the X2 series) is very flexible while still quite easy to use for a beginner. I can't think of too many cases where you'd want to add assembler - in this case I'd take a PIC and program it in C, for virtually the same speed and level of control (with very few exceptions).
 

boriz

Senior Member
"If someone can fluently write complicated things in assembler "

And what of those who can't? Everyone has to start somewhere. I first began experimenting with machine code on a BBC micro. The inline assembler idea makes it so easy to jump into and out of assembly language. Dip your toe as it were. It's the best possible place to start.

It can only advance the functionality of the Picaxe, and bring more people to it. Once inline assembly is present, you can pretend it's not if you like. But I think most people will sooner or later see the potential benefit of a small section of assembly code in a predominantly Basic program.

Anyway, without knowing any assembly language, you can still pick and mix from the library of subroutines that will inevitably build up here on the forums.

I honestly can't understand the reluctance. I feel like Orville Wright being told "Forget it. No one will ever need to ride around the sky."
 

demonicpicaxeguy

Senior Member
I honestly can't understand the reluctance. I feel like Orville Wright being told "Forget it. No one will ever need to ride around the sky."
in line asm for a compiler is one thing as is quite easy to do in most cases,
however inline asm for an interpreted program is another kettle of the preverbial fish it's not impossble but your interpreter has to be setup for it and it really is a waste of time, when all said and done,

inline asm which is do use quite a bit, and i'm by no way advertising a product, but i use the Pic Simulatoride quite a bit and it's builtin basic compiler, however there are quite a few routines written primaryily in C understandibly for good reason, so what i do is a take those compile them and then butcher the asm code and use it inline and form a subroutine around it, however i really don't gain much if any speed in execution and it's all a matter of code compatability more than anything, there are subroutines i'd rather not rewrite in basic just to compile back to asm again!,

the other thing to consider is does the target chip have the program memmory space to deal with any extra custom written subroutines? i'm guessing not in any of the picaxe cases
 

hippy

Ex-Staff (retired)
This is an example of why I dislike the M series. Inputs down one side and outputs down the other? Makes PCB design with multiple ICs far harder than it needs to be.
On the other hand, it greatly simplifies things for others, particularly the educational target market.

Even with having the flexibility of any I/O line for any I/O purpose, one still runs into issues of only being able to access certain byte-wide sets of I/O if that is to be done efficiently which consequently undermines that flexibility or requires the software to jump through hoops to allow it.

My own 'ideal CPU' would have mapping registers which would allow any internally referenced I/O to map to any physical leg, but processor manufacturer's haven't delivered that yet. Microchip have however caught on to the idea of allowing the polarity of the internal UART Tx and RX to be inverted to save having to use external MAX232 so there's hope yet.


You're joking right? Just how much faster is machine code than interpreted basic? ... I honestly believe that an inline assembler is far and above the most useful function any high level language can ever have.
I was taking an increase in speed as read ( though as DPG notes, and others have before, expected speed gains do not always materialise in reality ), it was more necessity and usefulness I was considering. There's no doubt that assembler allows more things to be done, but if what is needed is already available there is little need to go to assembler to achieve that.

In many ways it's like the difference between a text editor and a full-featured DTP package. Somewhere between the two is what most people want. Everything can be enhanced upwards but many will see doing so as feature-bloat, going away from what they need and want, while developing and supporting the things people aren't interested in takes away from what they do use. All manufacturers have to decide where their products fit, what they will do and will not do, make a decision as to what their customers want and which customers they are going after. No product is a universal panacea, and there will always be potential customers who will never get exactly what they want no matter what a product is.

Requesting assembler support is perhaps akin to asking that desktop applications allow 'plug-ins', so users can decide what enhancements to add as and when. It looks appealing because that appears to minimise the work a manufacturer has to do and limits the burden placed on the manufacturer. Reality is that it is never that simple or that is all there is to it in practice.

I honestly can't understand the reluctance. I feel like Orville Wright being told "Forget it. No one will ever need to ride around the sky."
I see it more as telling Orville; forget about bolting wings on the horse and cart, use something which is more appropriate if you want to get off the ground in a significant way.

Rev-Ed does produce the BAS800, a PICmicro programmer and limited-scale Basic to Assembler converter, which opens the door to mixing and matching Basic and Assembler which is one choice to consider if you want to move in that direction.
 

Brietech

Senior Member
Brietech: Don't forget a PICAXE Programming Editor version as well!

I would love to just include a real tokenizer!! Rev-Ed doesn't release any insight into their token format for the higher chips, do they? I recall the 08M chips using like a 5-bit opcode bit-packed across byte boundaries, or something crazy like that, but I know the higher chips have >32 instructions, and I know the programming editor has a few "meta-instructions" now.

The ability to execute code off of external EEPROMs means I could actually do that if I knew the token format though (*hint hint* *cough* technical? *cough*) =)
 

demonicpicaxeguy

Senior Member
I would love to just include a real tokenizer!! Rev-Ed doesn't release any insight into their token format for the higher chips, do they? I recall the 08M chips using like a 5-bit opcode bit-packed across byte boundaries, or something crazy like that, but I know the higher chips have >32 instructions, and I know the programming editor has a few "meta-instructions" now.

The ability to execute code off of external EEPROMs means I could actually do that if I knew the token format though (*hint hint* *cough* technical? *cough*) =)
now that external programs can be executed from an external chip i've got little doubt it'll take very long for somone to de-code the tokens...
they'll either have to release some sort of tokeniser or live with whoever de-codes it and publishes their findings, just like the basic stamp

good luck whoever it is..
 

Brietech

Senior Member
the part that makes it somewhat non-obvious is the bit-packing (at least with the 08-M). Storing it in external EEPROM does make the job a great deal simpler though. That would be a fun project =)
 

boriz

Senior Member
“bolting wings on the horse and cart”

Hippy, friend, how could you say that? You know as well as any that there is no physical difference between a Picaxe and a raw PIC microcontroller. An inline assembler would make available the power, speed and versatility of the raw PIC while at the same time having no effect on the ‘plug and play’ ease of use of the Picaxe system. It’s win win anyway you look at it. Anyone who is in any doubt about what can be achieved with a bit of assembler should spend a few minutes perusing the app notes on the Microchip site.
 

Technical

Technical Support
Staff member
they'll either have to release some sort of tokeniser
...you mean like the Windows/Mac/Linux free of charge compilers already on our website! The compilers are hugely complex, we do not publish the tokenisation system because 1) it is our copyrighted intellectual property and 2) we already provide free, much more simple, ways to use the PICAXE BASIC on the 3 major computer platforms.

There is no intention to add assembler code to the PICAXE BASIC. There is a huge list of reasons why, but the 4 main reasons are:
1) The target market is not that of those who can program in assembler code. There are dozens of other products that already support assembler, PICAXE is simply not designed for this market.
2) It is technically very difficult to merge a tokenised PICAXE program with a raw assembler program. It is very easy to add inline assembler to 'raw' assembler code generated by a simple C/BASIC/etc compiler - as the compiler just merges it in as the conversion to assembler takes place (as with the existing 'convert basic to assembler' function Hippy has already described). But this is a totally different system to how the PICAXE system actually works.
3) Modern PICs can be only erased/programmed in blocks of 64/32 bytes of assembler code. Therefore sharing the memory with variable size assembler code blocks is also difficult.
4) Finally, including assembler code would potentially allow experienced programmers to write programs to decode and copy/steal the PICAXE bootstrap source. This is not to the financial benefit of Revolution or the development of the PICAXE range of products.
 

nbw

Senior Member
My 1.2 cents' worth (we're in a recession, so we have to make cut-backs) - with the X2 chips you now get a truckload of processing grunt, code space, and other options you didn't have before for a fair price, all of them mostly easy enough that Stan's Gran could code them while watching Coro. I presume that was her in the aforeposted pic; the lady with the breadboard?

The X2s are at the level now where basically the next step up is to learn PIC.
 
Top