;    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

MOVT:     MVI       A,0
MOVT1:    MOV       H,A
         MOV       L,H
         MOV       D,L
         MOV       E,D
         MOV       B,E
         MOV       C,B
         LXI       H,MOVS
         MOV       M,C
         MOV       B,M
         CMP       B
         CNZ       ERROR
         INR       A
         JRNZ      MOVT1
         RET

;===============================================================
;    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

LOADT1:   LHLD      LDATAX
         LBCD      LDATAY
         LDED      LDATAZ
         SHLD      LDATA0
         SBCD      LDATA1
         SDED      LDATA2
         CALL      CMPX

         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

INCT1     MVI       B,0FFH
INCT11    INX       H
         DJNZ      INCT11         ; = FD02

INCT2     MVI       B,0FDH
INCT21    DCR       H
         DJNZ      INCT21         ; = 00

         MOV       A,H
         CPI       0
         CNZ       ERROR
         RET

;===============================================================
;    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