343 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
|                 ;===============================================================
 | |
|                 ; nanoTest.asm
 | |
|                 ;   Used for checking the NanoBlaze instruction set
 | |
|                 ;===============================================================
 | |
|                 ; 1) Test logical operations with direct values
 | |
|                 ;---------------------------------------------------------------
 | |
| 								LOAD      s7, 01
 | |
|                 CONSTANT  testPattern, 0F
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "LOAD", "AND"
 | |
|                 ;---------------------------------------------------------------
 | |
| 								LOAD      s0, testPattern
 | |
| 								AND       s0, 33
 | |
| 								COMPARE   s0, 03
 | |
| 								JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "OR"
 | |
|                 ;---------------------------------------------------------------
 | |
| 								LOAD      s1, testPattern
 | |
| 								OR        s1, 33
 | |
| 								COMPARE   s1, 3F
 | |
| 								JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "XOR"
 | |
|                 ;---------------------------------------------------------------
 | |
| 								LOAD      s2, testPattern
 | |
| 								XOR       s2, 33
 | |
| 								COMPARE   s2, 3C
 | |
| 								JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 2) Test logical operations with registers
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "LOAD"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 33
 | |
|                 LOAD      s3, s0
 | |
|                 COMPARE   s3, 33
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "AND"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 AND       s0, s3
 | |
|                 COMPARE   s0, 03
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "OR"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s1, 0F
 | |
|                 OR        s1, s3
 | |
|                 COMPARE   s1, 3F
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "XOR"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s2, 0F
 | |
|                 XOR       s2, s3
 | |
|                 COMPARE   s2, 3C
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 3) Test arithmetic operations with constants
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "ADD" and "ADDCY"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 ADD       s0, 31        ;  40
 | |
|                 ADDCY     s0, F0        ; 130
 | |
|                 ADDCY     s0, F0        ; 121
 | |
|                 ADD       s0, 0F        ;  30
 | |
|                 COMPARE   s0, 30
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "SUB" and "SUBCY"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s1, 0F
 | |
|                 SUB       s1, 0C        ;  03
 | |
|                 SUBCY     s1, F0        ; 113
 | |
|                 SUBCY     s1, F0        ;  22
 | |
|                 SUB       s1, 01        ;  21
 | |
|                 COMPARE   s1, 21
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 4) Test arithmetic operations with registers
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "ADD" and "ADDCY"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 LOAD      s1, 31
 | |
|                 LOAD      s2, F0
 | |
|                 LOAD      s3, 0F
 | |
|                 ADD       s0, s1        ;  40
 | |
|                 ADDCY     s0, s2        ; 130
 | |
|                 ADDCY     s0, s2        ; 121
 | |
|                 ADD       s0, s3        ;  30
 | |
|                 COMPARE   s0, 30
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "SUB" and "SUBCY"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s1, 0F
 | |
|                 LOAD      s0, 0C
 | |
|                 LOAD      s2, F0
 | |
|                 LOAD      s3, 01
 | |
|                 SUB       s1, s0        ;  03
 | |
|                 SUBCY     s1, s2        ; 113
 | |
|                 SUBCY     s1, s2        ;  22
 | |
|                 SUB       s1, s3        ;  21
 | |
|                 COMPARE   s1, 21
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 5) Test shifts
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test shift right
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F        ; 0F
 | |
|                 SR0       s0            ; 07
 | |
|                 SRX       s0            ; 03
 | |
|                 SR1       s0            ; 81
 | |
|                 SRX       s0            ; C0, C=1
 | |
|                 SRA       s0            ; E0, C=0
 | |
|                 SRA       s0            ; 70
 | |
|                 COMPARE   s0, 70
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test shift left
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s1, F0        ; FO
 | |
|                 SL0       s1            ; E0
 | |
|                 SLX       s1            ; C0
 | |
|                 SL1       s1            ; 81
 | |
|                 SLX       s1            ; 03, C=1
 | |
|                 SLA       s1            ; 07, C=0
 | |
|                 SLA       s1            ; 0E
 | |
|                 COMPARE   s1, 0E
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 6) Test comparison operators
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "COMPARE"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 COMPARE   s0, F0        ; A < B => C=1
 | |
|                 JUMP      NC, error
 | |
|                 COMPARE   s0, F0        ; A < B => Z=0
 | |
|                 JUMP      Z, error
 | |
|                 COMPARE   s0, s0        ; A = B => Z=1
 | |
|                 JUMP      NZ, error
 | |
|                 COMPARE   s0, 08        ; A > B => C=0
 | |
|                 JUMP      C, error
 | |
|                 COMPARE   s0, 08        ; A > B => Z=0
 | |
|                 JUMP      Z, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "TEST"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 TEST      s0, F0        ; AND is 00 => Z=1
 | |
|                 JUMP      NZ, error
 | |
|                 TEST      s0, FF        ; AND is 0F => Z=0
 | |
|                 JUMP      Z, error
 | |
|                 ;===============================================================
 | |
|                 ; 7) Test INPUT and OUTPUT operators
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "INPUT" and "OUTPUT" direct
 | |
|                 ;
 | |
|                 ; The testbench should invert the word written at address FC.
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, AA
 | |
|                 OUTPUT    s0, FC
 | |
|                 INPUT     s1, FC
 | |
|                 COMPARE   s1, 55
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "INPUT" and "OUTPUT" indexed
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, CC
 | |
|                 LOAD      s2, FC
 | |
|                 OUTPUT    s0, (s2)
 | |
|                 INPUT     s1, (s2)
 | |
|                 COMPARE   s1, 33
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 8) Test STORE and FETCH operators
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "STORE" and "FETCH" direct
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 0F
 | |
|                 STORE     s0, 03
 | |
|                 FETCH     s1, 03
 | |
|                 COMPARE   s1, 0F
 | |
|                 JUMP      NZ, error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "STORE" and "FETCH" indexed
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, F0
 | |
|                 LOAD      s2, 04
 | |
|                 STORE     s0, (s2)
 | |
|                 FETCH     s1, (s2)
 | |
|                 COMPARE   s1, F0
 | |
|                 JUMP      NZ, error
 | |
|                 ;===============================================================
 | |
|                 ; 9) Test JUMP instructions
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "JUMP NC"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, F0
 | |
|                 ADD       s0, 00        ; s0=F0, C=0, Z=0
 | |
|                 JUMP      NC, continue1
 | |
|                 JUMP      error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "JUMP NZ"
 | |
|                 ;---------------------------------------------------------------
 | |
|      continue1: ADD       s0, 00        ; s0=F0, C=0, Z=0
 | |
|                 JUMP      NZ, continue2
 | |
|                 JUMP      error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "JUMP C"
 | |
|                 ;---------------------------------------------------------------
 | |
|      continue2: ADD       s0, F0        ; s0=E0, C=1, Z=0
 | |
|                 JUMP      C, continue3
 | |
|                 JUMP      error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "JUMP Z"
 | |
|                 ;---------------------------------------------------------------
 | |
|      continue3: SUB       s0, E0        ; s0=00, C=0, Z=1
 | |
|                 JUMP      Z, continue4
 | |
|                 JUMP      error
 | |
|      continue4: NOP
 | |
|                 ;===============================================================
 | |
|                 ; 10) Test call instructions
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; define subroutine
 | |
|                 ;---------------------------------------------------------------
 | |
|                 JUMP      continue5
 | |
|       subRetDo: ADD       s0, 01
 | |
|                 RETURN
 | |
|                 JUMP      error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "CALL"
 | |
|                 ;---------------------------------------------------------------
 | |
|      continue5: LOAD      s0, 00
 | |
|                 LOAD      s1, F0
 | |
|                 CALL      subRetDo      ; s0=01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "CALL NC"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ADD       s1, 00        ; s1=F0, C=0, Z=0
 | |
|                 CALL      NC, subRetDo  ; s0=02
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "CALL NZ"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ADD       s1, 00        ; s1=F0, C=0, Z=0
 | |
|                 CALL      NZ, subRetDo  ; s0=03
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "CALL C"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ADD       s1, F0        ; s0=E0, C=1, Z=0
 | |
|                 CALL      C, subRetDo   ; s0=04
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "CALL Z"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 SUB       s1, E0        ; s0=00, C=0, Z=1
 | |
|                 CALL      Z, subRetDo   ; s0=05
 | |
|                 COMPARE   s0, 05
 | |
|                 jump      nz, error
 | |
|                 ;===============================================================
 | |
|                 ; 11) Test call return instructions
 | |
|                 ;---------------------------------------------------------------
 | |
| 								ADD       s7, 01
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; define subroutines
 | |
|                 ;---------------------------------------------------------------
 | |
|                 JUMP      continue6
 | |
|       subRetNC: ADD       s0, 01
 | |
|                 RETURN    NC
 | |
|                 JUMP      error
 | |
|       subRetNZ: ADD       s0, 01
 | |
|                 RETURN    NZ
 | |
|                 JUMP      error
 | |
|        subRetC: ADD       s0, 01
 | |
|                 RETURN    C
 | |
|                 JUMP      error
 | |
|        subRetZ: ADD       s0, 01
 | |
|                 RETURN    Z
 | |
|                 JUMP      error
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "RETURN NC"
 | |
|                 ;---------------------------------------------------------------
 | |
|      continue6: LOAD      s0, 00        ; increment will give C=0, Z=0
 | |
|                 CALL      NC, subRetNC
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "RETURN NZ"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 00        ; increment will give C=0, Z=0
 | |
|                 CALL      NZ, subRetNZ
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "RETURN C"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, FF        ; increment will give C=1, Z=1
 | |
|                 CALL      C, subRetC
 | |
|                 ;---------------------------------------------------------------
 | |
|                 ; Test "RETURN Z"
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, FF        ; increment will give C=1, Z=1
 | |
|                 CALL      Z, subRetZ
 | |
|                 ;===============================================================
 | |
|                 ; End of tests
 | |
|                 ;
 | |
|                 ; The testbench should react if value 1 is written to address 00.
 | |
|                 ;---------------------------------------------------------------
 | |
|                 LOAD      s0, 01
 | |
|                 OUTPUT    s0, 00
 | |
|                 JUMP      endOfMemory
 | |
|                 ;===============================================================
 | |
|                 ; Assert error
 | |
|                 ;
 | |
|                 ; The testbench should react if value 0 is written to address 00.
 | |
|                 ;---------------------------------------------------------------
 | |
| ADDRESS 3FD
 | |
|          error: LOAD      s0, 00
 | |
|                 OUTPUT    s0, 00
 | |
|                 ;===============================================================
 | |
|                 ; End of instruction memory
 | |
|                 ;---------------------------------------------------------------
 | |
|    endOfMemory: JUMP      endOfMemory
 |