Welcome

ASCOP4 Assembler

   The  ASCOP4  assembler  supports  the  COP400 series of 4-bit
microprocessors.  The COP400 family provides a  wide  choice  of
RAM,  ROM,  and  IO  capability.   The ascop4 assembler specific
directives configure the assembler to support a large number  of
COP400 family processors.  

PROCESSOR SPECIFIC DIRECTIVES 

.cop Directive 

   Format:  

        .cop    'type' 


   The  COP400 family of processors have instruction set and ROM
memory differences which are configured by specifying  the  .cop
directive followed by the processor type.  

   A  .cop  directive without an argument initializes the assem-
bler to accept all instructions, sets the ROM size  to  2K,  en-
ables  full  functionality  of the xad instruction, and sets the
.__.CPU.  variable to zero.  

   The .cop directive currently supports the following processor
types where [n] is the value given  to  the  assembler  .__.CPU.
variable:  

        402   [1]       404   [2]       404M  [3]
        410   [4]       410L  [5]       410C  [6]
        411   [7]       411L  [8]       411C  [9]
        413   [10]      413C  [11]      413CH [12]
        420   [13]      420L  [14]
        421   [15]      421L  [16]
        422   [17]      422L  [18]
        424   [19]      424L  [20]
        425   [21]      425L  [22]
        426   [23]      426L  [24]
        440   [25]      441   [26]      442   [27]
        2440  [28]      2441  [29]      2442  [30]
        444   [31]      444L  [32]
        445   [33]      445L  [34]


   The  variable  '.__.CPU.'  is by default defined as local and
will not be output to the created .rel file.  The assembler com-
mand  line  options -g or -a will not cause the local symbols to
be output to the created .rel file.  

   The  assembler  .globl  directive  may  be used to change the
variable type to global causing its definition to be  output  to
the  rel  file.  The inclusion of the definition of the variable
'.__.CPU.' might be a useful means of validating that separately
assembled  files have been compiled for the same processor type.
The linker will report an error for variables with multiple  non
equal definitions.  


.rom_size Directives 

   Format:  

        .rom256      256  Byte ROM Size 

        .rom512      512  Byte ROM Size 

        .rom1k       1024 Byte ROM Size 

        .rom2k       2048 Byte ROM Size 


.xad Directive 

   Format:  

        .xad    n 


   The .xad directive can override the operating mode of the xad
instruction selected by a .cop directive.  A non zero value of n
limits the xad instruction to the following form:  

        xad 3,15

   and  a zero or blank argument restores the xad instruction to
its full functionality.  


.setpg Directive 

Format:  

        .setpg [base [,area]] 


   The  .setpg  directive is used to inform the assembler of the
area containing ROM pages 2 and 3 and the offset address  within
the  selected  area.   The  only value allowed for the offset is
0x80 (the beginning of page 2).  

   The normal invocation methods are:  

        .area   ROM
        .setpg

        or

        .setpg  0x80,ROM


   for  the  COP4 microprocessors.  If a .setpg directive is not
issued the assembler defaults the region to the area "_CODE"  at
offset 0x80.  

   The  need  for  this  directive will become apparent from the
following short description of the jp and jsrp instructions.  

   The  jp  and  jsrp  instructions are unique in the sense that
they are dependent upon where in  the  program  space  they  are
located.  This can be seen by comparing the opcode values for jp
and jsrp.  

jp   loc
  -  0x80 | <A6:A0> Jump within pages 2 and 3
  -  0xC0 | <A5:A0> Jump within current page, not 2 or 3

jsrp sub
  -  0x80 | <A5:A0> JSR to page 2, not in 2 or 3

--------------------------------------------------------

jp   0xE0
  -  0x80 | <A6:A0> -->> 0x80 | 0x60 -->> 0xE0
  -                 (jp to page 3,  jp in page 2 or 3)
jp   0x20
  -  0xC0 | <A5:A0> -->> 0xC0 | 0x20 -->> 0xE0
  -                 (jp to current page,  page 0)

or

jp   0xA0
  -  0x80 | <A6:A0> -->> 0x80 | 0x20 -->> 0xA0
  -                 (jp to page 2,  jp in page 2 or 3)
jsrp 0xA0
  -  0x80 | <A5:A0> -->> 0x80 | 0x20 -->> 0xA0
  -                 (jsrp to page 2)


   The  assembler and linker are not capable of changing the op-
code based upon the relocated address of the instruction.   Thus
a new instruction mnemonic, jp23, is introduced to indicate a jp
instruction within pages 2 and 3.  The linker verifies that  any
jp23 jump address is in this region (0x80 to 0xFF).  

        jp      Use in pages 0, 1, and >= 4
        jp23    Use in pages 2 and 3

   The  programmer  is  required to manually verify that jp23 is
used in pages 2 and 3 and that jp is used in all other pages.  

   The  COP400  documentation resolves the jp - jsrp conflict by
not allowing a jsrp instruction to be located within page  2  or
3.   The programmer must manually verify that a jsrp instruction
is not located in page 2 or 3.  Use the jsr instruction in pages
2 and 3.  

COP400 INSTRUCTION SET 

    Instruction Argument Syntax:

        A       4-Bit Accumulator
        B       7-Bit RAM Address Register
        Br      Upper 3-Bits of B (Register Address)
        Bd      Lower 4-Bits of B (Digit Address)
        C       1-Bit Carry Register
        d       4-Bit Operand Field (RAM Digit Select)
        r       3-Bit Operand Field (RAM Register Select)

        n       2-Bit Operand Data (Immediate)
        y       4-Bit Operand Data (Immediate)

        addr    jump address or label

The terms n, y, d, r and addr may be expressions.  

   Note  that  not  all addressing modes may be valid with every
instruction.  Refer to  the  COP400  technical  data  for  valid
modes.  

   The  following tables list the mnemonics and arguments recog-
nized by the ASCOP4 assembler.  

COP400 Instructions 

    Arithmetic Instructions
        asc             (Add RAM to A with carry, then SKC)
        add             (Add RAM to A)
        adt             (Add ten to A)
        aisc    #y      (Add immediate, Skip on carry)
        casc            (Add RAM to /A with carry, then SKC)
        comp            (Ones complement of A to A)
        nop             (No Operation)
        or              (OR RAM with A)
        rc              (Reset Carry)
        sc              (Set Carry)
        xor             (Exclusive-OR RAM with A)

    Transfer Of Control Instructions
        jid             (Jump Indirect)
        jmp     addr    (Jump)
        jp      addr    (Jump within Page)
        jp23    addr    (Jump to Page 2 or 3)
        jsrp    addr    (Jump to Subroutine Page 2)
        jsr     addr    (Jump to Subroutine)

        ret             (Return from Subroutine)
        retsk           (Return from Subroutine then Skip)
        halt            (Halt)
        it              (Idle until Timer overflow)

    Memory Reference Instructions
        came            (Copy A,RAM to E)
        camq            (Copy A,RAM to Q)
        camt            (Copy A,RAM to T)
        cema            (Copy E to A,RAM)
        cqma            (Copy Q to A,RAM)
        ctma            (Copy T to A,RAM)
        ld      r       (Load RAM into A, XOR Br with r)
        ldd     r,d     (Load RAM into A from Direct r,d)
        lqid            (Load Q Indirect)
        rmb     n       (Reset RAM Bit)
        smb     n       (Set RAM Bit)
        stii    #y      (Store Immediate to RAM, Increment Bd)
        x       r       (RAM <--> A, Br XOR r)
        xad     r,d     (RAM(r,d) <--> A)
        xds     r       (RAM <--> A, Bd - 1 -> Bd, Br XOR r)
                        (Skip on Decrement of Bd from 0 to 15)
        xis     r       (RAM <--> A, Bd + 1 -> Bd, Br XOR r)
                        (Skip on Increment of Bd from 15 to 0)

    Register Reference Instructions
        cab             (Copy A to Bd)
        cba             (Copy Bd to A)
        lbi     r,d     (Load B from Direct r,d)
        lei     #y      (Load EN from Immediate data)
        xabr            (A <--> Br)
        xan             (A <--> N, N is 2-Bit Stack Pointer)

    Test Instructions
        skc             (Skip if C is True)
        ske             (Skip if A Equals RAM)
        skgz            (Skip if G is Zero)
        skgbz   #n      (Skip if G Bit is Zero)
        skmbz   #n      (Skip if RAM Bit is Zero)

    Input/Output Instructions
        camr            (Output A,RAM to R Port)
        ing             (Input G Port into A)
        inh             (Input H Port into A)
        inin            (Input IN Inputs into A)
        inil            (Input IL Latches into A)
        inl             (Input L Port into RAM,A)
        inr             (Input R Port init RAM,A)
        obd             (Output Bd to D Outputs)
        ogi     #y      (Output Immediate to G Port)
        omg             (Output RAM to G Ports)
        omh             (Output RAM to H Port)
        xas             (Exchange A with SIO)

ASCOP4 MACRO FILE 

   The  'ascop4.mac'  macro file contains an alternate method to
configure the ascop4 assembler for a  specific  processor.   The
macro  file  contains  macros  which  redefine  the instructions
present in the full ascop4 functionality.  This file can be mod-
ified to specify processors not natively supported by the ascop4
assembler.  See the internals of the macro file for  implementa-
tion details.  

Go to the Documentation Index

... Exit the ASxxxx Documentation

... Home Page

Last Updated: September 2023