URL
https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk
Subversion Repositories open8_urisc
[/] [open8_urisc/] [trunk/] [Open8 Tools/] [README.4.CPUInfo.txt] - Rev 179
Go to most recent revision | Compare with Previous | Blame | View Log
----------------------------------------------Open8 uRISC Assembly language description------------------------------------------------------------------Hardware information--------------------The CPU has 8 8-bit general purpose registers available,R0-R7. In some operations, one register is paired with thenext one so they behave like a 16-bit register.R0 is a special register, in that it is always the secondunstated operand in commands that work with 2 values (ie.ADD R3 adds together R3 and R0), It also recieves theresults of most commands that have results (ie. ADD R3stores the result of R0+R3 in R0).There are 4 normally used state flags. The Zero flag,the Carry flag, the Negative flag, and the InterruptEnable flag. The Negative, Zero, and Carry flags areset/reset whenever any operation is carried out on ANYregister. Ie. If you decrement R3 and it reaches zero,the Zero flag gets set. There are also 4 other GeneralPurpose flags whose setting and checking is left up toyou if you choose to use them.These flags are implemented in a bit of memory calledthe Program Status Register, or PSR.There's also a program counter, as you'd expect, but youcan't access it's value from any of the opcodes, directlyor otherwise. That fact, and the lack of a BRanch Alwayscommand, makes it tough to write easily relocateablecode.--------------OPCODE LISTING--------------Opcode Description [Example]------------------------------------------------------------------INC R0-07 | Increment Register [INC R4]ADC R0-07 | R0=R#+R0 using carry flag [ADC R4]TX0 R0-R7 | R0=R# [TX0 R2]OR R0-R7 | R0=R0|R# [OR R6]AND R0-R7 | R0=R0&R# [AND R4]CLR R0 | Clears R0 [CLR R0]XOR R0-R7 | R0=R0^R# [XOR R2]ROL R0-R7 | R#=R#<<1. Roll R# Left [ROL R2]ROR R0-R7 | R#=R#>>1. Roll R# Right [ROR R2]DEC R0-R7 | R#=R#-1 [DEC R4]SBC R0-R7 | R0=R0-R# using carry flag [SBC R6]ADD R0-R7 | R0=R0+R# [ADD R3]MUL R0-R7 | R1:R0 = Rn * R0STP PSR_Z | Set Zero flag [STP PSR_Z]STP PSR_C | Set Carry flag [STP PSR_C]STP PSR_N | Set Negative flag [STP PSR_N]STP PSR_I | Set Interrupt Enable flag [STP PSR_I]STP PSR_GP4 | Set GP4 flag [STP PSR_GP4]STP PSR_GP5 | Set GP5 flag [STP PSR_GP5]STP PSR_GP6 | Set GP6 flag [STP PSR_GP6]STP PSR_GP7 | Set GP7 flag [STP PSR_GP7]BTT 0-7 | Test Bit # in R0. Set Zero flag or not.[BTT 2]CLP PSR_Z | Clear Zero flag [CLP PSR_Z]CLP PSR_C | Clear Carry flag [CLP PSR_C]CLP PSR_N | Clear Negative flag [CLP PSR_N]CLP PSR_I | Clear Interrupt Enable flag [CLP PSR_I]CLP PSR_GP4 | Clear GP4 flag [CLP PSR_GP4]CLP PSR_GP5 | Clear GP5 flag [CLP PSR_GP5]CLP PSR_GP6 | Clear GP6 flag [CLP PSR_GP6]CLP PSR_GP7 | Clear GP7 flag [CLP PSR_GP7]T0X R0-R7 | R#=R0 [TX0 R2]CMP R0-R7 | Compare R# With R0, put result in R0.[CMP R3]PSH R0-R7 | Push R# onto the stack. [PSH R2]POP R0-R7 | Pop R# from the stack. [POP R1]DBNZ R0-R7 | Decrement register, and branch if result is zeroBNZ | Branch if Zero flag is not set. [BNZ LABEL]BNC | Branch if Carry flag is not set. [BNC LABEL]BNN | Branch if Negative flag is not set. [BNN LABEL]BNI | Branch if Interrupt Enable flag is not set. [BNI LABEL]BNGP4 | Branch If GP4 flag is not set. [BNGP4 LABEL]BNGP5 | Branch If GP5 flag is not set. [BNGP5 LABEL]BNGP6 | Branch If GP6 flag is not set. [BNGP6 LABEL]BNGP7 | Branch If FP7 flag is not set. [BNGP7 LABEL]BRZ | Branch on Zero flag is set. [BRZ LABEL]BRC | Branch if Carry flag is set. [BRC LABEL]BRN | Branch on Negative flag is set. [BRN LABEL]BRI | Branch if Interrupt Enable flag is set. [BRI LABEL]BRGP4 | Branch If GP4 flag is set. [BRGP4 LABEL]BRGP5 | Branch If GP5 flag is set. [BRGP5 LABEL]BRGP6 | Branch If GP6 flag is set. [BRGP6 LABEL]BRGP7 | Branch If GP7 flag is set. [BRGP7 LABEL]USR R0-R7 | User defined opcode. NOP if undefined. [USR R0]INT 0-7 | (Call?) Interrupt number. [INT 7]USR2 R0-R7 | User defined opcode 2. NOP if undefined. [USR2 R0]RSP | Reset stack pointer. Uses R0+R1 for address. [RSP]RTS | Return from subroutine. [RTS]RTI | Return from interrupt. [RTI]BRK | Break. For debugging. 5 clock NOP. [BRK]JMP | Jump to absolute address. [JMP LABEL]JSR | Jump to subroutine at absolute address. [JSR LABEL]UPP R0-R7 | Increment R# and R#+1 as a 16-bit register [UPP R4]STA R0-R7 | Store R# contents at Address [STA R0,$0020]STX R0-R7 | Store R0 at location indexed by R# [STX R2]STO R0-R7 | Store R0 at location indexed by R#+offset [STO R2,$aa]LDI R0-R7 | Load an Integer into R# [LDI R2,#$00]LDA R0-R7 | Load R# with the contents at address [LDA R4,$0366]LDX R0-R7 | Load R0 with location indexed by R# [LDX R2]LDO R0-R7 | Load R0 with location indexed by R#+offset [LDO R2,$ee]
Go to most recent revision | Compare with Previous | Blame | View Log
