OpenCores
URL https://opencores.org/ocsvn/ssbcc/ssbcc/trunk

Subversion Repositories ssbcc

[/] [ssbcc/] [trunk/] [core/] [9x8/] [macros/] [fetchvector.py] - Diff between revs 3 and 4

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 3 Rev 4
# Copyright 2014, Sinclair R.F., Inc.
# Copyright 2014, Sinclair R.F., Inc.
 
 
 
from asmDef import AsmException
 
 
def fetchvector(ad):
def fetchvector(ad):
  """
  """
  Built-in macro to move multiple bytes from memory to the data stack.  The byte
  Built-in macro to move multiple bytes from memory to the data stack.  The byte
  at the specified memory address is stored at the top of the data stack with
  at the specified memory address is stored at the top of the data stack with
  subsequent bytes store below it.\n
  subsequent bytes store below it.\n
  Usage:
  Usage:
    .fetchvector(variable,N)
    .fetchvector(variable,N)
  where
  where
    variable    is the name of a variable
    variable    is the name of a variable
    N           is the constant number of bytes to transfer\n
    N           is the constant number of bytes to transfer\n
  The effect is to push the values u_LSB=variable[N-1], ..., u_msb=variable[0]
  The effect is to push the values u_LSB=variable[N-1], ..., u_msb=variable[0]
  onto the data stack.\n
  onto the data stack.\n
  ( - u_LSB ... u_MSB )
  ( - u_LSB ... u_MSB )
  """
  """
 
 
  def length(ad,argument):
  def length(ad,argument):
    return int(argument[1]['value']) + 1;
    N = ad.Emit_IntegerValue(argument[1]);
 
    if not (N > 0):
 
      raise asmDef.AsmException('Vector length must be positive at %s' % argument[1]['loc']);
 
    return N+1;
 
 
  # Add the macro to the list of recognized macros.
  # Add the macro to the list of recognized macros.
  ad.AddMacro('.fetchvector', length, [
  ad.AddMacro('.fetchvector', length, [
                                        ['','symbol'],
                                        ['','symbol'],
                                        ['','singlevalue','symbol']
                                        ['','singlevalue','symbol']
                                      ]);
                                      ]);
 
 
  # Define the macro functionality.
  # Define the macro functionality.
  def emitFunction(ad,fp,argument):
  def emitFunction(ad,fp,argument):
    variableName = argument[0]['value'];
    variableName = argument[0]['value'];
    (addr,ixBank,bankName) = ad.Emit_GetAddrAndBank(variableName);
    (addr,ixBank,bankName) = ad.Emit_GetAddrAndBank(variableName);
    N = int(argument[1]['value']);
    N = ad.Emit_IntegerValue(argument[1]);
    ad.EmitPush(fp,addr+N-1,'%s+%d' % (variableName,N-1));
    offsetString = '%s-1' % argument[1]['value'] if type(argument[0]['value']) == str else '%d-1' % N;
 
    ad.EmitPush(fp,addr+N-1,'%s+%s' % (variableName,offsetString));
    for dummy in range(N-1):
    for dummy in range(N-1):
      ad.EmitOpcode(fp,ad.specialInstructions['fetch-'] | ixBank,'fetch- '+bankName);
      ad.EmitOpcode(fp,ad.specialInstructions['fetch-'] | ixBank,'fetch- '+bankName);
    ad.EmitOpcode(fp,ad.specialInstructions['fetch'] | ixBank,'fetch '+bankName);
    ad.EmitOpcode(fp,ad.specialInstructions['fetch'] | ixBank,'fetch '+bankName);
 
 
  ad.EmitFunction['.fetchvector'] = emitFunction;
  ad.EmitFunction['.fetchvector'] = emitFunction;
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.