[Coco] Linville's ramblings on assembly vs machine code

L. Curtis Boyle curtisboyle at sasktel.net
Mon Jul 10 18:05:58 EDT 2017


It should be mentioned that the order of the stack registers is VERY important in OS-9, system all the system calls use SWI (which pushes all registers), and the calls themselves get parameters passed to them by the registers on the stack, each with a specific purpose/function.

L. Curtis Boyle
curtisboyle at sasktel.net

TRS-80 Color Computer Games website
http://www.lcurtisboyle.com/nitros9/coco_game_list.html



> On Jul 10, 2017, at 3:34 PM, Robert Gault <robert.gault at att.net> wrote:
> 
> Dave Philipsen wrote:
>> <snip>
>> I was talking with someone once about pushing and pulling registers to/from the stack on the 6809.
>> He had a concern about how one particular disassembler represented the order in which a list of
>> registers would be pushed or pulled.  From the point of view of someone who worked purely with
>> assembly mnemonics and never even bothered to look at the machine codes that had been assembled,
>> this might be a valid question.  Does it matter how you order the registers when you push or pull
>> them? (i.e. is pshs  a,b,x,y different than pshs y,x,b,a ?)
>> If when you learned assembler you at least got a taste of how it relates to machine code you would
>> know right away that it matters not because each of the registers to be pushed or pulled is
>> represented by a single bit in a post code byte that follows the opcode.  The processor will always
>> push or pull the registers in the same order regardless of how you write it in assembler.  So to
>> answer the question: no, pshs a,b,x,y is not any different than pshs y,x,b,a.
>> 
>> <snip>
> 
> Well, here is at least one exception that proves the rule. :)
> 
> It makes a very big difference what order the stacking process takes place! You can easily find examples in the Coco code where a stack has been pushed and depending on the following code, the contents of the stack was changed and then eventually pulled.
> If you don't know where a particular register was placed on the stack, then you won't know where that value is located so it can be changed.
> 
> One example of this issue occurs when you replace a 6809 with a 6309 and try to work in native mode. The NMI routine in DOS1.1 is
> DNMISV	LDA	NMIFLAG
> 	BEQ	LD7BB
> 	LDX	DNMIVC
> 	STX	10,S
> 	CLR	NMIFLG
> LD7BB	RTI
> 
> The above works with a 6809 or a 6309 in emulation mode. With a 6309 in native mode, the code needs to be
> 	STX	12,S
> as the stacking is changed.
> 
> Robert
> 
> 
> 
> -- 
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco
> 



More information about the Coco mailing list