HC908 backend intergrating asm+C

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

HC908 backend intergrating asm+C

2,234 Views
MrBean
Contributor I

I need fast routines in this case so i built a 32bit timeout checking routine in assembly that is very fast.

It returns a bool in accumulator A and an accordingly set Z flag (condition code).

On use of this routine the compiler thinks it is necessary to test A again:

 

  936:   if(CheckTimeoutByRef(&Timeout)) { //If timeout:  0000 a600     [2]             LDA   @Timeout  0002 5f       [1]             CLRX    0003 cd0000   [5]             JSR   CheckTimeoutByRef  0006 4d       [1]             TSTA    0007 270b     [3]             BEQ   L14 ;abs = 0014  937: 

 

How do i tell the compiler that Z is already correctly set ie. that the TSTA instruction is not necessary ? (I know it saves just one instruction.)

The CheckTimeoutByRef function is pure assembly.

Add something to the function definition ? A pragma ? Or .... ?

Labels (1)
Tags (1)
0 Kudos
4 Replies

829 Views
CrasyCat
Specialist III

Hello

 

This is not possible. When you are calling a function the compiler expects it to follow the calling convention defined by the compiler.

This calling convention is described in the "Compiler_HC08.pdf" manual chapter "Using the Compiler" section "HC(S)08 Back End" -> "Calling Protocol and Conventions"

 

THere is no way to change the calling convention (i.e. The way parameter are passed and values are returned).

When you are mixing C and assembly file it is your responsibility that your assembly files follows the compiler calling convention.

 

CrasyCat

0 Kudos

829 Views
MrBean
Contributor I

What made you think i did not understand the calling convention ?

 

Thanx anyway, pity that the calling convention & the compiler dont seem to want to know about a condition code...

 

I had the hope that there would be a pragma for it or that RTS ! {},{} could be used.

Message Edited by MrBean on 2009-04-28 13:43 01:43 PM
0 Kudos

829 Views
CrasyCat
Specialist III

Hello

 

You can submit a service request to ask for an extension in the compiler.

 

Here is the URL for submitting a service request:

 

https://www.freescale.com/webapp/servicerequest.create_SR.framework?regFlag=fromOpenSR

 

CrasyCat

0 Kudos

829 Views
MrBean
Contributor I

I could, yes.

But that would be just one user asking for a seldom used compiler extention, imho...

I'll do with what i have.

 

I've been looking at these library functions from rtshc08.c:

 

#pragma NO_EXITvoid _PUSH_CC(void) {/* DESC:    push condition code without affecting any other register   IN:      CC   OUT:   WRITTEN:  */   asm {                PSHA                ; // save A                TPA                 ; // save CC on stack                PSHA                LDA    4,SP         ; // push return address                PSHA                LDA    4,SP                PSHA                LDA    4,SP         ; // reload A                RTS ! {H+X+A}, {SR}   }}#pragma NO_EXITvoid _POP_CC(void) {/* DESC:    pop condition code without affecting any other register   IN:   OUT:     CC   WRITTEN:  */   asm {                STA    4,SP        ; // save A                PULA               ; // move return address to the place of '_PUSH_CC'                STA    4,SP                PULA                STA    4,SP                PULA               ; // restore CC                TAP                PULA               ; // restore A                RTS ! {H+X+A+SR}, {}   }}

 

 

 

Here the compiler clearly knows about CC aka SR.

Looking at generated code: the compiler uses the above functions quite often.

 

Could you (or someone else) explain what these do, please ? : 

RTS ! {H+X+A}, {SR}

RTS ! {H+X+A+SR}, {}

 

I have been reading the help about "In & Gen Sets" but i still dont understand it quite...

Message Edited by MrBean on 2009-05-12 16:56 04:56 PM
0 Kudos