; FILE CPUTST.SRC VER 1.0
; CREATED 10-01-80
; LAST UPDATE WRITTEN BY D.A. STEELE
;
; THIS PROCEDURE WILL EXECUTE AND CHECK RESULTS OF SEVERAL
; INSTRUCTIONS IN EACH LOGICAL GROUP. ALL Z-80 INSTRUCTIONS
; WILL NOT BE TESTED NOR WILL ALL REGISTERS OF FLAGS BE TESTED
; FOR EACH INSTRUCTION EXECUTES.
;
; THERE ARE SOME INSTRUCTION GROUPS WHICH ARE USED SO OFTEN
; BY THE OPERATING SYSTEM THAT IT DOES NOT SEEM NECESSARY TO
; TEST THEM. THESE WOULD INCLUDE 'PUSH', 'POP', 'IN', 'OUT'.
;
; THIS MODULE SHOULD BE DECLARED EXTERNAL IN THE PASCAL MONITOR
; PROGRAM.
;
; FUNCTION CPUTST : INTEGER; EXTERNAL;
;
;
NAME CPUTST
ENTRY CPUTST
CPUERR DS 2
;===============================================================
; ERROR ROUTINE TO BE CALLED
ERROR: MVI A,1
STA CPUERR
RET
;===============================================================
; ERROR ROUTINE TO BE JUMPED TO
JERROR: MVI A,1
STA CPUERR
RET ;ALL THE WAY TO THE BACKGROUND
;===============================================================
; THIS TEST WILL TEST THE FLAGS AS WELL AS THE CONDITIONAL
; CALL OPCODES
;
CALLT: XRA A ;RESET C,S SET Z,P
CNZ ERROR ;AS CALLS ARE DEPENDENT ON THE
CC ERROR ;STACK THESE TESTS AS WELLL AS
CNV ERROR ;OTHERS WILL DEPEND IN PART ON RAM
CM ERROR
MVI B,11111110B
XRA B ;SET S,P RESET C,Z
CZ ERROR
CP ERROR
CPE ERROR
RET ;TO THE BACKGROUND
;===============================================================
�; THIS IS TO TEST THE CONDITIONAL RETURNES
;
RETT: LDA CPUERR
INR A
STA CPUERR
XRA A ;RESET C,P,S SET Z
RNZ
RC
RNV
RM
MVI B,11111110B
XRA B ;SET S,P RESET C,Z
RZ
RPE
RC
RP
LDA CPUERR
DCR A
STA CPUERR
RET
;===============================================================
; THIS WILL TEST THE CONDITIONAL JUMPS
;
JMPT: XRA A
JNZ JERROR
JC JERROR
JNV JERROR
JM JERROR
MVI B,11111110B
XRA B
JZ JERROR
JP JERROR
JPE JERROR
RET
;===============================================================
; THIS WILL TEST SOME OF THE ROTATE AND SHIFT INSTRUCTIONS
;
ROTT: XRA A ;ZERO CARRY
BSET 0,A
ROTT1: RAR
CNC ERROR
ORA A
CNZ ERROR
STC
RAR
CC ERROR
ORA A
CPI 80H
CNZ ERROR
� RAR ;0100 0000
RAR ;0010 0000
RAR ;0001 0000
RAR ;0000 1000
CPI 8
CNZ ERROR
RLC
RLC
RLC
RLC
CPI 80H
CNZ ERROR
RET
;===========================================================
; THIS IS A COMPARE ROUTINE TO CPMPARE A STRING OF BITS
; THE LENGTH OF WHICH IS IN BC AND IS POINTED TO BY HL
; WITH ANOTHER STRING POINTED TO BY DE.
COMP:
PUSH PSW
COMP1: MOV A,M ;GET ONE OF THE FIRST BYTES
XCHG
CCI ;COMPAIR A WITH MEMORY. INX HL
;AND DCX BC.
CNZ ERROR ;IF THE BYTES ARE NOT EQUAL ERROR
XCHG
INX H ;INCREMENT THE OTHER POINTER
MOV A,B ;IS IT THE END OF THE STRING
ORA C
NOP ;MAINTAIN CODE SIZE
JNZ COMP1 ;IF NOT END DO IT AGAIN
POP PSW
RET
;===============================================================
; TEST THE BLOCK MOVE AND SEARCH FUNCTIONS
;
ST1 DS 25
ST2 DS 25
BMT: XRA A
BMT1: STA ST1
LXI H,ST1
LXI D,ST1+1
LXI B,25
LDIR
LXI H,ST1+24
LXI D,ST2+24
LXI B,25
LDDR
LXI H,ST1
� LXI D,ST2
LXI B,25
CALL COMP
INR A
JRNZ BMT1
RET
;===============================================================
; TEHT VARIOUS MOVE INSTRUCTIONS
;
MOVS DS 1
;===============================================================
; TEST LOADS AND STORES
;
LDATAX DB 0,55H
LDATAY DB 0AAH,0
LDATAZ DB 55H,0AAH
LDATA0 DB 0,0
LDATA1 DS 2
LDATA2 DS 2
CMPX: PUSH PSW
LXI H,LDATAX
LXI D,LDATA0
LXI B,6
CALL COMP
POP PSW
RET
LOADT: LXI B,LDATA0
LDAX B
LXI B,LDATA1
STAX B
LDA LDATA0
MOV B,A
LDA LDATA1
CMP B
� CNZ ERROR
INR A
STA LDATA0
JRNZ LOADT
INR A
STA LDATAX
STA LDATAX+1
STA LDATAX+2
STA LDATAX+3
STA LDATAX+4
STA LDATAX+5
JRNZ LOADT1
RET
;===============================================================
; TEST DOUBBLE REGISTER ADD AND SUBTRACT
;
DADT: LXI H,5555H
LXI B,0AA00H
LXI D,00AAH
DADC B
DADC D
CC ERROR ;SHOULD NOT GET CARRY
MVI A,0FFH
CMP H
CNZ ERROR
CMP L
CNZ ERROR
RET
;===============================================================
; TEST REGISTER INCREMENT AND DECREMENT
;
INCT: LXI H,0FF00H
INX H
INX H
INX H ; = FF03
DCR H
DCR H
DCR H ; = FC03
INR L
INR L
INR L ; = FC06
DCX H
DCX H
� DCX H ; = FC03
;===============================================================
; TEST ACCUMULATOR INSTRUCTIONS
;
ACCT: MVI A,10101010B
ADI 10101010B ; SET CF AND = 01010100
CNC ERROR
ACI 0 ; SHOULD ADD 1 01010101
CC ERROR
CPI 01010101B
CNZ ERROR
MVI A,00111010B ; 00111010
STC
SBI 7CH ; 2'SC = 10000100
; 2'SC OF CARRY = 11111111
;RESULT = 10111101
CPI 0BDH
CNZ ERROR
MVI A,10101010B
ANI 10100000B ; = 10100000
MVI B,01010101B
ORA B ; = 11110101
MVI B,10011111B
XRA B ; = 01101010
SUB B ; = 11001011
CPI 11001011B
CNZ ERROR
RET
;===============================================================
; THIS IS A 1 MILISECOND DELAY TO ALLOW THE UART TIME TO ACT
;
DELAY: PUSH B
MVI B,222
DELAY1: ORA A
DCR B
JNZ DELAY1
POP B
RET
;===============================================================
�; TIMING TEST
;
TIME:
MVI E,'S'
MVI C,2
CALL 5
LXI B,15000 ;DELAY OF 15 SEC
TIME1: CALL DELAY
DCX B
MOV A,B
ORA C
JNZ TIME1
MVI E,'F'
MVI C,2
CALL 5
RET
;===============================================================
; CPU TEST BACKGROUND
;===============================================================
;
CPUTST; XRA A
STA CPUERR
STA CPUERR+1
CALL CALLT ;TEST CALLS AND FLAGS
CALL RETT ;TEST RETURNS ABD FLAGS
CALL JMPT ;TEST JUMPS AND FLAGS
CALL ROTT ; " ROTATES AND SHIFTS
CALL BMT ; " BLOCK MOVES
CALL MOVT ; " MOVES
CALL LOADT ; " LOADS AND STORES
CALL DADT ; " DOUBBLE ADDS AND SUBS.
CALL INCT ; " REG. INC. AND DEC.
CALL ACCT ; " ACCUMULATOR INSTRUCTIONS
CALL TIME ; TIMING TEST
XIT: XRA A ;PREPAIR TO RETURN TO PASCAL-Z
LXI H,CPUERR ;GET THE ADDRESS OF ERROR FLAG
MOV E,M
INX H
MOV D,M
RET