Shop OBEX P1 Docs P2 Docs Learn Events
Proposed method of LMM for PropBASIC. Comments requested. — Parallax Forums

Proposed method of LMM for PropBASIC. Comments requested.

BeanBean Posts: 8,129
edited 2010-02-11 19:18 in Propeller 1
Before everyone gets all fired-up...LMM will not be in PropBASIC until AFTER the inital release. There are too many potential bugs.

But I was cleaning up the compiler code and though I'd better at least get an idea of how I am going to implement it.

So here is my version of LMM.

I have about zero experience with LMM, so I'd like some comments from member who have used it.

I have unrolled the execute loop 4 times, I know I could go further but I want to save as much space as possible for variables.

This code seems to work fine. You can copy and paste the main body of the code many times (past the 496 instruction limit) and it will still work.

''  *** COMPILED WITH PropBasic VERSION 00.00.79  Feb 3, 2010 ***

CON                                                          'DEVICE P8X32A, XTAL1, PLL16X
  _ClkMode = XTAL1 + PLL16X                                 
  _XInFreq =   5000000                                       'FREQ 80_000_000

' LEDS    PIN 23..16 LOW                                     'LEDS    PIN 23..16 LOW

' Delay   SUB 1                                              'Delay   SUB 1

PUB __Program                                                'PROGRAM Start LMM
  __OFFSET := @__Init                                       
  CogInit(0, @_LMM_Entry, @__DATASTART)                     
                                                            
DAT                                                         
                  org           0                           
__Init                                                      
                  mov           dira,__InitDirA             
                  mov           outa,__InitOutA             
                  jmp           #_LMM_JUMP                  
                  long          @Start - @__Init            

Start                                                        'Start:
                  mov           __temp1,#255                 '  LEDS = 255
                  shl           __temp1,#16                 
                  and           __temp1,LEDS                
                  andn          outa,LEDS                   
                  or            outa,__temp1                
 
                  mov           __param1,#100                '  Delay 100
                  jmp           #_LMM_CALL                  
                  long          @Delay_ret - @__Init        
                  long          @Delay - @__Init            
 
                  mov           __temp1,#0                   '  LEDS = 0
                  shl           __temp1,#16                 
                  and           __temp1,LEDS                
                  andn          outa,LEDS                   
                  or            outa,__temp1                
 
                  mov           __param1,#100                '  Delay 100
                  jmp           #_LMM_CALL                  
                  long          @Delay_ret - @__Init        
                  long          @Delay - @__Init            

                  jmp           #_LMM_JUMP                   '  GOTO Start
                  long          @Start - @__Init            
 
                  mov           __temp1,#0                   'END
                  waitpne       __temp1,__temp1             

Delay                                                        'SUB Delay
                  mov           __temp1,cnt                  '  PAUSE __param1
                  adds          __temp1,_1mSec              
                  mov           __temp2,__param1            
                  mins          __temp2,#1 WC               
__L0001                                                     
    IF_NC         waitcnt       __temp1,_1mSec              
    IF_NC         djnz          __temp2,#_LMM_JUMP                  
                  long          @__L0001 - @__Init          
 
                  rdlong        __PC,__PC                    'ENDSUB
Delay_ret                                                   
                  long          0-0                         
                                                            

DAT                                                         
  '-------------------------------------------------------------------------------------------
  'LMM Execution code                                       
  ' -------------------------------------------------------------------------------------------
                                                            
  ORG 0                                                     
                                                            
_LMM_Entry                                                  
                  mov           __PC,__OFFSET               
                                                            
_LMM_LOOP                                                   
                  rdlong        __INSTR1,__PC               
                  add           __PC,#4                     
__INSTR1                                                    
                  nop           ' Placeholder for LMM instruction
                                                            
                  rdlong        __INSTR2,__PC               
                  add           __PC,#4                     
__INSTR2                                                    
                  nop           ' Placeholder for LMM instruction
                                                            
                  rdlong        __INSTR3,__PC               
                  add           __PC,#4                     
__INSTR3                                                    
                  nop           ' Placeholder for LMM instruction
                                                            
                  rdlong        __INSTR4,__PC               
                  add           __PC,#4                     
__INSTR4                                                    
                  nop           ' Placeholder for LMM instruction
                                                            
                  jmp           #_LMM_LOOP                  
                                                            
_LMM_JUMP                                                   
                  rdlong        __PC,__PC                   
                  add           __PC,__OFFSET               
                  jmp           #_LMM_LOOP                  
                                                            
_LMM_CALL                                                   
                  rdlong        __temp1,__PC                
                  add           __temp1,__OFFSET            
                  add           __PC,#8                     
                  wrlong        __PC,__temp1                
                  sub           __PC,#4                     
                  rdlong        __PC,__PC                   
                  add           __PC,__OFFSET               
                  jmp           #_LMM_LOOP                  
                                                            
                  '             Variables for LMM execution code
__OFFSET         LONG 0-0' Set by spin                      
__PC             LONG 0  ' Program counter                  
'**********************************************************************
__InitDirA       LONG %00000000_11111111_00000000_00000000
__InitOutA       LONG %00000000_00000000_00000000_00000000
_1mSec           LONG 80000
LEDS             LONG 255 << 16
_FREQ            LONG 80000000

__remainder
__temp1          RES 1
__temp2          RES 1
__temp3          RES 1
__temp4          RES 1
__temp5          RES 1
__param1         RES 1
__param2         RES 1
__param3         RES 1
__param4         RES 1
__paramcnt       RES 1
 
FIT 492
 
CON
  LSBFIRST                         = 0
  MSBFIRST                         = 1
  MSBPRE                           = 0
  LSBPRE                           = 1
  MSBPOST                          = 2
  LSBPOST                          = 3
 
DAT
__DATASTART



Bean
·

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Use BASIC on the Propeller with the speed of assembly language.

PropBASIC thread http://forums.parallax.com/showthread.php?p=867134

Post Edited (Bean) : 2/5/2010 6:21:04 PM GMT

Comments

  • jazzedjazzed Posts: 11,803
    edited 2010-02-05 18:04
    Hi Bean.

    Using an LMM macro jump vector table will simplify things and allow you to use
    the same kernel regardless of where the LMM macros are implemented.
    The downside is using longs for the table and slightly delayed execution.

    DAT org 0
    INIT    jmp #_init  ' 0
    MJMP    jmp #_jmp   ' 1
    MCALL   jmp #_call  ' 2
    ' ... other macros.
    
    _init
    ' init body
    
    _jmp
    ' jmp body
    
    _call
    ' call body
    
    
  • Bill HenningBill Henning Posts: 6,445
    edited 2010-02-05 18:04
    I don't see any problems... and your CALL/RETURN mechanism is basically the same as for PASM, which I think will make it easier for beginners to understand.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    www.mikronauts.com E-mail: mikronauts _at_ gmail _dot_ com 5.0" VGA LCD in stock!
    Morpheus dual Prop SBC w/ 512KB kit $119.95, Mem+2MB memory/IO kit $89.95, both kits $189.95 SerPlug $9.95
    Propteus and Proteus for Propeller prototyping 6.250MHz custom Crystals run Propellers at 100MHz
    Las - Large model assembler Largos - upcoming nano operating system
  • BeanBean Posts: 8,129
    edited 2010-02-05 18:21
    Am I correct that the "LONG @label - @__Init" will not cause any problems if executed since all the condition bits will be zero (since the value will always be less than 18 bits) ?

    Bean

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Use BASIC on the Propeller with the speed of assembly language.

    PropBASIC thread http://forums.parallax.com/showthread.php?p=867134
  • Bill HenningBill Henning Posts: 6,445
    edited 2010-02-05 18:26
    Yes, you are correct. I rely on that in my LMM code too.
    Bean said...
    Am I correct that the "LONG @label - @__Init" will not cause any problems if executed since all the condition bits will be zero (since the value will always be less than 18 bits) ?

    Bean
    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    www.mikronauts.com E-mail: mikronauts _at_ gmail _dot_ com 5.0" VGA LCD in stock!
    Morpheus dual Prop SBC w/ 512KB kit $119.95, Mem+2MB memory/IO kit $89.95, both kits $189.95 SerPlug $9.95
    Propteus and Proteus for Propeller prototyping 6.250MHz custom Crystals run Propellers at 100MHz
    Las - Large model assembler Largos - upcoming nano operating system
  • Dr_AculaDr_Acula Posts: 5,484
    edited 2010-02-06 03:04
    Having seen on a board in front of me the awesome power of LMM with Catalina C (programs hundreds of kilobytes long), I'm really excited about similar code for Basic.

    A few months ago I was pretty chuffed when I compiled a C and a Basic program on the Zicog, and after compilation both returned a "40kb free" message. More than the memory on the propeller. Then RossH goes and blows that out of the water with ten times that. And now PropBasic is heading the same way. I am *very* impressed.

    The code looks great. Speed is not a big issue ('tis now as it ever was, use assembly for speed), but the ability to start writing a program and to keep writing and keep writing and never worry about running out of space, well that is just awesome.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    www.smarthome.viviti.com/propeller
  • BeanBean Posts: 8,129
    edited 2010-02-06 04:25
    @Dr_Acula,
    · PropBASIC LMM is not virtual memory. It runs from HUB ram, so programs are still limited to 32K. But that is a far cry from 2K. Also lots of room for variables with LMM.

    · Speed is about 1/5 of native code. I think that is a fair trade-off. Code with lots of calls and jumps will suffer most, but will still be·blazing compared to spin.

    · You will be able to specify LMM for the main code, and for each TASK. So some tasks can be native (for video drivers and stuff) and some can be LMM within the same program.

    · Actually for small TASKs it takes less space to make them native. I think very few TASKs will be LMM, but I wanted to have the option.

    · I ran into an issue using VAR arrays. I use MOVS and MOVD to do indexing, well that doesn't work in LMM. So I had to make two more LMM routines to handle it.
    · I'm going through the compiler and making the changes to handle LMM. I may post it for some testing, but NOT as the offical beta version.

    · Once you get your head around it, LMM isn't that hard. I hope the LMM code generated will provide assistance to PropBASIC users who want to do LMM in assembly.

    · Thanks for the encouragement.

    Bean.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Use BASIC on the Propeller with the speed of assembly language.

    PropBASIC thread http://forums.parallax.com/showthread.php?p=867134

    Post Edited (Bean) : 2/6/2010 4:32:32 AM GMT
  • Dr_AculaDr_Acula Posts: 5,484
    edited 2010-02-06 07:44
    32k would be a huge amount for propbasic, given how efficiently the compiler seems to be coding. As an aside, I've been coding all day on an SBasic program and only got to 10k.

    I'm looking at my code at the moment and thinking maybe it could be ported to propbasic?

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    www.smarthome.viviti.com/propeller
  • Toby SeckshundToby Seckshund Posts: 2,027
    edited 2010-02-06 08:32
    "to start writing a program and to keep writing and keep writing and never worry about running out of space, well that is just awesome."

    Thats not "awesome" its "Microsoft"

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Style and grace : Nil point
  • BeanBean Posts: 8,129
    edited 2010-02-07 16:50
    If anyone is interested in testing LMM in PropBASIC send me a PM.

    Bean.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Use BASIC on the Propeller with the speed of assembly language.

    PropBASIC thread http://forums.parallax.com/showthread.php?p=867134
  • Christof Eb.Christof Eb. Posts: 1,088
    edited 2010-02-07 17:30
    Hi Bean,

    during my experiments with PropBasic I have seen, that you can do really very much without LMM and you have got full speed.

    So I am very glad to read, that there will be the choice for each task if this task will run in the cog only or with LMM!



    Is there a chance to include some sort of debugging feature into the LMM? It should be possible to insert debugging steps between program parts?

    Perhaps you could install some sort of a "hook" for a debugger routine,·that can be called after each basic line. This debugger routine could be done later.

    The debugger routine might copy a source code line number and all cog variables to hub ram. A debug task might then send the information to a serial line.

    The hook could perhaps be used for some sort of polled interrupts too?

    I think, that debugging features are often·very valuable, perhaps more valuable then execution speed.

    (I would like to have multi line comments too...)

    Christof
  • BeanBean Posts: 8,129
    edited 2010-02-11 19:18
    Hmmm, A debugger hook is an interesting idea. I'll have to explore that a little bit more.

    Just to give you some idea of speed:

    PASM instructions without jumps require 20 clocks (on average), 3 instructions require 16 clocks, then the·4th requires 32 clocks.

    Jumps require 32 clocks. Calls require 96 clocks.

    So code with alot of jumps and calls do take a real performace hit.

    Bean.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Use BASIC on the Propeller with the speed of assembly language.

    PropBASIC thread http://forums.parallax.com/showthread.php?p=867134

    March 2010 Nuts and Volts article·http://www.parallax.com/Portals/0/Downloads/docs/cols/nv/prop/col/nvp5.pdf


    Post Edited (Bean) : 2/11/2010 7:29:27 PM GMT
Sign In or Register to comment.