2

我为 Intel 8080 编写了一个模拟器,我想检查我实现的指令是否正确。是否有测试套件或方法来测试每条指令是否正确?

我的模拟器是用 C 编写的。

4

1 回答 1

5

不幸的是,喧闹的链接都早已失效。所以我会尝试发布一个不依赖链接的更全面的答案。

您正在寻找的是一套 8080/8085 CPU 诊断练习。我发现三个一起构成了一个非常全面的测试套件。

  • 8080/8085 CPU 诊断,1.0 版,由 Microcosm Associates 提供
  • 诊断 II,1.2 版,由 Supersoft Associates 进行的 CPU 测试
  • Ian Bartholomew 和 Frank Cringles 的 8080/8085 CPU 锻炼器

这是 Microcosm CPU Diag 测试套件的 ASM:

;***********************************************************************
; MICROCOSM ASSOCIATES  8080/8085 CPU DIAGNOSTIC VERSION 1.0  (C) 1980
;***********************************************************************
; Load into virtual altair with: ALTAIR L=TEST.HEX
; Then press F2 to view screen, and 'G' to execute the test.
;
;DONATED TO THE "SIG/M" CP/M USER'S GROUP BY:
;KELLY SMITH, MICROCOSM ASSOCIATES
;3055 WACO AVENUE
;SIMI VALLEY, CALIFORNIA, 93065
;(805) 527-9321 (MODEM, CP/M-NET (TM))
;(805) 527-0518 (VERBAL)
;
        CPU 8080    
        ORG 00100H

        LXI     H, LOLZ
        CALL    MSG
        JMP     CPU ;JUMP TO 8080 CPU DIAGNOSTIC
;
LOLZ:   DB  "MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0  (C) 1980", 0dh, 0ah, 24h
;
BDOS    EQU     00005H  ;BDOS ENTRY TO CP/M
WBOOT:  JMP     0
;
;MESSAGE OUTPUT ROUTINE
;
MSG:    MOV A,M ; Get data
        CPI '$' ; End?
        RZ
        CALL    PCHAR   ; Output
        INX H   ; Next
        JMP MSG ; Do all
;
;
;CHARACTER OUTPUT ROUTINE
;
PCHAR:  PUSH    PSW
        PUSH    D
        PUSH    H
        MOV E,A
        MVI C,2
        CALL    BDOS
        POP     H
        POP D
        POP PSW
        RET
;
;
;
BYTEO:  PUSH    PSW
        CALL    BYTO1
        MOV E,A
        CALL    PCHAR
        POP PSW
        CALL    BYTO2
        MOV E,A
        JMP PCHAR
BYTO1:  RRC
        RRC
        RRC
        RRC
BYTO2:  ANI 0FH
        CPI 0AH
        JM  BYTO3
        ADI 7
BYTO3:  ADI 30H
        RET
;
;
;
;************************************************************
;           MESSAGE TABLE FOR OPERATIONAL CPU TEST
;************************************************************
;
OKCPU:  DB  0DH,0AH
        DB  "CPU IS OPERATIONAL$"
;
NGCPU:  DB  0DH,0AH
        DB  " CPU HAS FAILED!    ERROR EXIT=$"
;
;
;
;************************************************************
;                8080/8085 CPU TEST/DIAGNOSTIC
;************************************************************
;
;NOTE: (1) PROGRAM ASSUMES "CALL",AND "LXI SP" INSTRUCTIONS WORK!
;
;      (2) INSTRUCTIONS NOT TESTED ARE "HLT","DI","EI",
;          AND "RST 0" THRU "RST 7"
;
;
;
;TEST JUMP INSTRUCTIONS AND FLAGS
;
CPU:    LXI SP,STACK    ;SET THE STACK POINTER
        ANI 0   ;INITIALIZE A REG. AND CLEAR ALL FLAGS
        JZ  J010    ;TEST "JZ"
        CALL    CPUER
J010:   JNC J020    ;TEST "JNC"
        CALL    CPUER
J020:   JPE J030    ;TEST "JPE"
        CALL    CPUER
J030:   JP  J040    ;TEST "JP"
        CALL    CPUER
J040:   JNZ J050    ;TEST "JNZ"
        JC  J050    ;TEST "JC"
        JPO J050    ;TEST "JPO"
        JM  J050    ;TEST "JM"
        JMP J060    ;TEST "JMP" (IT'S A LITTLE LATE,BUT WHAT THE HELL!
J050:   CALL    CPUER
J060:   ADI 6   ;A=6,C=0,P=1,S=0,Z=0
        JNZ J070    ;TEST "JNZ"
        CALL    CPUER
J070:   JC  J080    ;TEST "JC"
        JPO J080    ;TEST "JPO"
        JP  J090    ;TEST "JP"
J080:   CALL    CPUER
J090:   ADI 070H    ;A=76H,C=0,P=0,S=0,Z=0
        JPO J100    ;TEST "JPO"
        CALL    CPUER
J100:   JM  J110    ;TEST "JM"
        JZ  J110    ;TEST "JZ"
        JNC J120    ;TEST "JNC"
J110:   CALL    CPUER
J120:   ADI 081H    ;A=F7H,C=0,P=0,S=1,Z=0
        JM  J130    ;TEST "JM"
        CALL    CPUER
J130:   JZ  J140    ;TEST "JZ"
        JC  J140    ;TEST "JC"
        JPO J150    ;TEST "JPO"
J140:   CALL    CPUER
J150:   ADI 0FEH    ;A=F5H,C=1,P=1,S=1,Z=0
        JC  J160    ;TEST "JC"
        CALL    CPUER
J160:   JZ  J170    ;TEST "JZ"
        JPO J170    ;TEST "JPO"
        JM  AIMM    ;TEST "JM"
J170:   CALL    CPUER
;
;
;
;TEST ACCUMULATOR IMMEDIATE INSTRUCTIONS
;
AIMM:   CPI 0   ;A=F5H,C=0,Z=0
        JC  CPIE    ;TEST "CPI" FOR RE-SET CARRY
        JZ  CPIE    ;TEST "CPI" FOR RE-SET ZERO
        CPI 0F5H    ;A=F5H,C=0,Z=1
        JC  CPIE    ;TEST "CPI" FOR RE-SET CARRY ("ADI")
        JNZ CPIE    ;TEST "CPI" FOR RE-SET ZERO
        CPI 0FFH    ;A=F5H,C=1,Z=0
        JZ  CPIE    ;TEST "CPI" FOR RE-SET ZERO
        JC  ACII    ;TEST "CPI" FOR SET CARRY
CPIE:   CALL    CPUER
ACII:   ACI 00AH    ;A=F5H+0AH+CARRY(1)=0,C=1
        ACI 00AH    ;A=0+0AH+CARRY(0)=0BH,C=0
        CPI 00BH
        JZ  SUII    ;TEST "ACI"
        CALL    CPUER
SUII:   SUI 00CH    ;A=FFH,C=0
        SUI 00FH    ;A=F0H,C=1
        CPI 0F0H
        JZ  SBII    ;TEST "SUI"
        CALL    CPUER
SBII:   SBI 0F1H    ;A=F0H-0F1H-CARRY(0)=FFH,C=1
        SBI 00EH    ;A=FFH-OEH-CARRY(1)=F0H,C=0
        CPI 0F0H
        JZ  ANII    ;TEST "SBI"
        CALL    CPUER
ANII:   ANI 055H    ;A=F0H<AND>55H=50H,C=0,P=1,S=0,Z=0
        CPI 050H
        JZ  ORII    ;TEST "ANI"
        CALL    CPUER
ORII:   ORI 03AH    ;A=50H<OR>3AH=7AH,C=0,P=0,S=0,Z=0
        CPI 07AH
        JZ  XRII    ;TEST "ORI"
        CALL    CPUER
XRII:   XRI 00FH    ;A=7AH<XOR>0FH=75H,C=0,P=0,S=0,Z=0
        CPI 075H
        JZ  C010    ;TEST "XRI"
        CALL    CPUER
;
;
;
;TEST CALLS AND RETURNS
;
C010:   ANI 000H    ;A=0,C=0,P=1,S=0,Z=1
        CC  CPUER   ;TEST "CC"
        CPO CPUER   ;TEST "CPO"
        CM  CPUER   ;TEST "CM"
        CNZ CPUER   ;TEST "CNZ"
        CPI 000H
        JZ  C020    ;A=0,C=0,P=0,S=0,Z=1
        CALL    CPUER
C020:   SUI 077H    ;A=89H,C=1,P=0,S=1,Z=0
        CNC CPUER   ;TEST "CNC"
        CPE CPUER   ;TEST "CPE"
        CP  CPUER   ;TEST "CP"
        CZ  CPUER   ;TEST "CZ"
        CPI 089H
        JZ  C030    ;TEST FOR "CALLS" TAKING BRANCH
        CALL    CPUER
C030:   ANI 0FFH    ;SET FLAGS BACK!
        CPO CPOI    ;TEST "CPO"
        CPI 0D9H
        JZ  MOVI    ;TEST "CALL" SEQUENCE SUCCESS
        CALL    CPUER
CPOI:   RPE     ;TEST "RPE"
        ADI 010H    ;A=99H,C=0,P=0,S=1,Z=0
        CPE CPEI    ;TEST "CPE"
        ADI 002H    ;A=D9H,C=0,P=0,S=1,Z=0
        RPO     ;TEST "RPO"
        CALL    CPUER
CPEI:   RPO     ;TEST "RPO"
        ADI 020H    ;A=B9H,C=0,P=0,S=1,Z=0
        CM  CMI ;TEST "CM"
        ADI 004H    ;A=D7H,C=0,P=1,S=1,Z=0
        RPE     ;TEST "RPE"
        CALL    CPUER
CMI:    RP      ;TEST "RP"
        ADI 080H    ;A=39H,C=1,P=1,S=0,Z=0
        CP  TCPI    ;TEST "CP"
        ADI 080H    ;A=D3H,C=0,P=0,S=1,Z=0
        RM      ;TEST "RM"
        CALL    CPUER
TCPI:   RM      ;TEST "RM"
        ADI 040H    ;A=79H,C=0,P=0,S=0,Z=0
        CNC CNCI    ;TEST "CNC"
        ADI 040H    ;A=53H,C=0,P=1,S=0,Z=0
        RP      ;TEST "RP"
        CALL    CPUER
CNCI:   RC      ;TEST "RC"
        ADI 08FH    ;A=08H,C=1,P=0,S=0,Z=0
        CC  CCI ;TEST "CC"
        SUI 002H    ;A=13H,C=0,P=0,S=0,Z=0
        RNC     ;TEST "RNC"
        CALL    CPUER
CCI:    RNC     ;TEST "RNC"
        ADI 0F7H    ;A=FFH,C=0,P=1,S=1,Z=0
        CNZ CNZI    ;TEST "CNZ"
        ADI 0FEH    ;A=15H,C=1,P=0,S=0,Z=0
        RC      ;TEST "RC"
        CALL    CPUER
CNZI:   RZ      ;TEST "RZ"
        ADI 001H    ;A=00H,C=1,P=1,S=0,Z=1
        CZ  CZI ;TEST "CZ"
        ADI 0D0H    ;A=17H,C=1,P=1,S=0,Z=0
        RNZ     ;TEST "RNZ"
        CALL    CPUER
CZI:    RNZ     ;TEST "RNZ"
        ADI 047H    ;A=47H,C=0,P=1,S=0,Z=0
        CPI 047H    ;A=47H,C=0,P=1,S=0,Z=1
        RZ      ;TEST "RZ"
        CALL    CPUER
;
;
;
;TEST "MOV","INR",AND "DCR" INSTRUCTIONS
;
MOVI:   MVI A,077H
        INR A
        MOV B,A
        INR B
        MOV C,B
        DCR C
        MOV D,C
        MOV E,D
        MOV H,E
        MOV L,H
        MOV A,L ;TEST "MOV" A,L,H,E,D,C,B,A
        DCR A
        MOV C,A
        MOV E,C
        MOV L,E
        MOV B,L
        MOV D,B
        MOV H,D
        MOV A,H ;TEST "MOV" A,H,D,B,L,E,C,A
        MOV D,A
        INR D
        MOV L,D
        MOV C,L
        INR C
        MOV H,C
        MOV B,H
        DCR B
        MOV E,B
        MOV A,E ;TEST "MOV" A,E,B,H,C,L,D,A
        MOV E,A
        INR E
        MOV B,E
        MOV H,B
        INR H
        MOV C,H
        MOV L,C
        MOV D,L
        DCR D
        MOV A,D ;TEST "MOV" A,D,L,C,H,B,E,A
        MOV H,A
        DCR H
        MOV D,H
        MOV B,D
        MOV L,B
        INR L
        MOV E,L
        DCR E
        MOV C,E
        MOV A,C ;TEST "MOV" A,C,E,L,B,D,H,A
        MOV L,A
        DCR L
        MOV H,L
        MOV E,H
        MOV D,E
        MOV C,D
        MOV B,C
        MOV A,B
        CPI 077H
        CNZ CPUER   ;TEST "MOV" A,B,C,D,E,H,L,A
;
;
;
;TEST ARITHMETIC AND LOGIC INSTRUCTIONS
;
        XRA A
        MVI B,001H
        MVI C,003H
        MVI D,007H
        MVI E,00FH
        MVI H,01FH
        MVI L,03FH
        ADD B
        ADD C
        ADD D
        ADD E
        ADD H
        ADD L
        ADD A
        CPI 0F0H
        CNZ CPUER   ;TEST "ADD" B,C,D,E,H,L,A
        SUB B
        SUB C
        SUB D
        SUB E
        SUB H
        SUB L
        CPI 078H
        CNZ CPUER   ;TEST "SUB" B,C,D,E,H,L
        SUB A
        CNZ CPUER   ;TEST "SUB" A
        MVI A,080H
        ADD A
        MVI B,001H
        MVI C,002H
        MVI D,003H
        MVI E,004H
        MVI H,005H
        MVI L,006H
        ADC B
        MVI B,080H
        ADD B
        ADD B
        ADC C
        ADD B
        ADD B
        ADC D
        ADD B
        ADD B
        ADC E
        ADD B
        ADD B
        ADC H
        ADD B
        ADD B
        ADC L
        ADD B
        ADD B
        ADC A
        CPI 037H
        CNZ CPUER   ;TEST "ADC" B,C,D,E,H,L,A
        MVI A,080H
        ADD A
        MVI B,001H
        SBB B
        MVI B,0FFH
        ADD B
        SBB C
        ADD B
        SBB D
        ADD B
        SBB E
        ADD B
        SBB H
        ADD B
        SBB L
        CPI 0E0H
        CNZ CPUER   ;TEST "SBB" B,C,D,E,H,L
        MVI A,080H
        ADD A
        SBB A
        CPI 0FFH
        CNZ CPUER   ;TEST "SBB" A
        MVI A,0FFH
        MVI B,0FEH
        MVI C,0FCH
        MVI D,0EFH
        MVI E,07FH
        MVI H,0F4H
        MVI L,0BFH
        ANA A
        ANA C
        ANA D
        ANA E
        ANA H
        ANA L
        ANA A
        CPI 024H
        CNZ CPUER   ;TEST "ANA" B,C,D,E,H,L,A
        XRA A
        MVI B,001H
        MVI C,002H
        MVI D,004H
        MVI E,008H
        MVI H,010H
        MVI L,020H
        ORA B
        ORA C
        ORA D
        ORA E
        ORA H
        ORA L
        ORA A
        CPI 03FH
        CNZ CPUER   ;TEST "ORA" B,C,D,E,H,L,A
        MVI A,000H
        MVI H,08FH
        MVI L,04FH
        XRA B
        XRA C
        XRA D
        XRA E
        XRA H
        XRA L
        CPI 0CFH
        CNZ CPUER   ;TEST "XRA" B,C,D,E,H,L
        XRA A
        CNZ CPUER   ;TEST "XRA" A
        MVI B,044H
        MVI C,045H
        MVI D,046H
        MVI E,047H
        MVI H,(TEMP0/0FFH)  ;HIGH BYTE OF TEST MEMORY LOCATION
        MVI L,(TEMP0&0FFH)  ;LOW BYTE OF TEST MEMORY LOCATION
        MOV M,B
        MVI B,000H
        MOV B,M
        MVI A,044H
        CMP B
        CNZ CPUER   ;TEST "MOV" M,B AND B,M
        MOV M,D
        MVI D,000H
        MOV D,M
        MVI A,046H
        CMP D
        CNZ CPUER   ;TEST "MOV" M,D AND D,M
        MOV M,E
        MVI E,000H
        MOV E,M
        MVI A,047H
        CMP E
        CNZ CPUER   ;TEST "MOV" M,E AND E,M
        MOV M,H
        MVI H,(TEMP0/0FFH)
        MVI L,(TEMP0&0FFH)
        MOV H,M
        MVI A,(TEMP0/0FFH)
        CMP H
        CNZ CPUER   ;TEST "MOV" M,H AND H,M
        MOV M,L
        MVI H,(TEMP0/0FFH)
        MVI L,(TEMP0&0FFH)
        MOV L,M
        MVI A,(TEMP0&0FFH)
        CMP L
        CNZ CPUER   ;TEST "MOV" M,L AND L,M
        MVI H,(TEMP0/0FFH)
        MVI L,(TEMP0&0FFH)
        MVI A,032H
        MOV M,A
        CMP M
        CNZ CPUER   ;TEST "MOV" M,A
        ADD M
        CPI 064H
        CNZ CPUER   ;TEST "ADD" M
        XRA A
        MOV A,M
        CPI 032H
        CNZ CPUER   ;TEST "MOV" A,M
        MVI H,(TEMP0/0FFH)
        MVI L,(TEMP0&0FFH)
        MOV A,M
        SUB M
        CNZ CPUER   ;TEST "SUB" M
        MVI A,080H
        ADD A
        ADC M
        CPI 033H
        CNZ CPUER   ;TEST "ADC" M
        MVI A,080H
        ADD A
        SBB M
        CPI 0CDH
        CNZ CPUER   ;TEST "SBB" M
        ANA M
        CNZ CPUER   ;TEST "ANA" M
        MVI A,025H
        ORA M
        CPI 037H
        CNZ CPUER   ;TEST "ORA" M
        XRA M
        CPI 005H
        CNZ CPUER   ;TEST "XRA" M
        MVI M,055H
        INR M
        DCR M
        ADD M
        CPI 05AH
        CNZ CPUER   ;TEST "INR","DCR",AND "MVI" M
        LXI B,12FFH
        LXI D,12FFH
        LXI H,12FFH
        INX B
        INX D
        INX H
        MVI A,013H
        CMP B
        CNZ CPUER   ;TEST "LXI" AND "INX" B
        CMP D
        CNZ CPUER   ;TEST "LXI" AND "INX" D
        CMP H
        CNZ CPUER   ;TEST "LXI" AND "INX" H
        MVI A,000H
        CMP C
        CNZ CPUER   ;TEST "LXI" AND "INX" B
        CMP E
        CNZ CPUER   ;TEST "LXI" AND "INX" D
        CMP L
        CNZ CPUER   ;TEST "LXI" AND "INX" H
        DCX B
        DCX D
        DCX H
        MVI A,012H
        CMP B
        CNZ CPUER   ;TEST "DCX" B
        CMP D
        CNZ CPUER   ;TEST "DCX" D
        CMP H
        CNZ CPUER   ;TEST "DCX" H
        MVI A,0FFH
        CMP C
        CNZ CPUER   ;TEST "DCX" B
        CMP E
        CNZ CPUER   ;TEST "DCX" D
        CMP L
        CNZ CPUER   ;TEST "DCX" H
        STA TEMP0
        XRA A
        LDA TEMP0
        CPI 0FFH
        CNZ CPUER   ;TEST "LDA" AND "STA"
        LHLD    TEMPP
        SHLD    TEMP0
        LDA TEMPP
        MOV B,A
        LDA TEMP0
        CMP B
        CNZ CPUER   ;TEST "LHLD" AND "SHLD"
        LDA TEMPP+1
        MOV B,A
        LDA TEMP0+1
        CMP B
        CNZ CPUER   ;TEST "LHLD" AND "SHLD"
        MVI A,0AAH
        STA TEMP0
        MOV B,H
        MOV C,L
        XRA A
        LDAX    B
        CPI 0AAH
        CNZ CPUER   ;TEST "LDAX" B
        INR A
        STAX    B
        LDA TEMP0
        CPI 0ABH
        CNZ CPUER   ;TEST "STAX" B
        MVI A,077H
        STA TEMP0
        LHLD    TEMPP
        LXI D,00000H
        XCHG
        XRA A
        LDAX    D
        CPI 077H
        CNZ CPUER   ;TEST "LDAX" D AND "XCHG"
        XRA A
        ADD H
        ADD L
        CNZ CPUER   ;TEST "XCHG"
        MVI A,0CCH
        STAX    D
        LDA TEMP0
        CPI 0CCH
        STAX    D
        LDA TEMP0
        CPI 0CCH
        CNZ CPUER   ;TEST "STAX" D
        LXI H,07777H
        DAD H
        MVI A,0EEH
        CMP H
        CNZ CPUER   ;TEST "DAD" H
        CMP L
        CNZ CPUER   ;TEST "DAD" H
        LXI H,05555H
        LXI B,0FFFFH
        DAD B
        MVI A,055H
        CNC CPUER   ;TEST "DAD" B
        CMP H
        CNZ CPUER   ;TEST "DAD" B
        MVI A,054H
        CMP L
        CNZ CPUER   ;TEST "DAD" B
        LXI H,0AAAAH
        LXI D,03333H
        DAD D
        MVI A,0DDH
        CMP H
        CNZ CPUER   ;TEST "DAD" D
        CMP L
        CNZ CPUER   ;TEST "DAD" B
        STC
        CNC CPUER   ;TEST "STC"
        CMC
        CC  CPUER   ;TEST "CMC
        MVI A,0AAH
        CMA 
        CPI 055H
        CNZ CPUER   ;TEST "CMA"
        ORA A   ;RE-SET AUXILIARY CARRY
        DAA
        CPI 055H
        CNZ CPUER   ;TEST "DAA"
        MVI A,088H
        ADD A
        DAA
        CPI 076H
        CNZ CPUER   ;TEST "DAA"
        XRA A
        MVI A,0AAH
        DAA
        CNC CPUER   ;TEST "DAA"
        CPI 010H
        CNZ CPUER   ;TEST "DAA"
        XRA A
        MVI A,09AH
        DAA
        CNC CPUER   ;TEST "DAA"
        CNZ CPUER   ;TEST "DAA"
        STC
        MVI A,042H
        RLC
        CC  CPUER   ;TEST "RLC" FOR RE-SET CARRY
        RLC
        CNC CPUER   ;TEST "RLC" FOR SET CARRY
        CPI 009H
        CNZ CPUER   ;TEST "RLC" FOR ROTATION
        RRC
        CNC CPUER   ;TEST "RRC" FOR SET CARRY
        RRC
        CPI 042H
        CNZ CPUER   ;TEST "RRC" FOR ROTATION
        RAL
        RAL
        CNC CPUER   ;TEST "RAL" FOR SET CARRY
        CPI 008H
        CNZ CPUER   ;TEST "RAL" FOR ROTATION
        RAR
        RAR
        CC  CPUER   ;TEST "RAR" FOR RE-SET CARRY
        CPI 002H
        CNZ CPUER   ;TEST "RAR" FOR ROTATION
        LXI B,01234H
        LXI D,0AAAAH
        LXI H,05555H
        XRA A
        PUSH    B
        PUSH    D
        PUSH    H
        PUSH    PSW
        LXI B,00000H
        LXI D,00000H
        LXI H,00000H
        MVI A,0C0H
        ADI 0F0H
        POP PSW
        POP H
        POP D
        POP B
        CC  CPUER   ;TEST "PUSH PSW" AND "POP PSW"
        CNZ CPUER   ;TEST "PUSH PSW" AND "POP PSW"
        CPO CPUER   ;TEST "PUSH PSW" AND "POP PSW"
        CM  CPUER   ;TEST "PUSH PSW" AND "POP PSW"
        MVI A,012H
        CMP B
        CNZ CPUER   ;TEST "PUSH B" AND "POP B"
        MVI A,034H
        CMP C
        CNZ CPUER   ;TEST "PUSH B" AND "POP B"
        MVI A,0AAH
        CMP D
        CNZ CPUER   ;TEST "PUSH D" AND "POP D"
        CMP E
        CNZ CPUER   ;TEST "PUSH D" AND "POP D"
        MVI A,055H
        CMP H
        CNZ CPUER   ;TEST "PUSH H" AND "POP H"
        CMP L
        CNZ CPUER   ;TEST "PUSH H" AND "POP H"
        LXI H,00000H
        DAD SP
        SHLD    SAVSTK  ;SAVE THE "OLD" STACK-POINTER!
        LXI SP,TEMP4
        DCX SP
        DCX SP
        INX SP
        DCX SP
        MVI A,055H
        STA TEMP2
        CMA
        STA TEMP3
        POP B
        CMP B
        CNZ CPUER   ;TEST "LXI","DAD","INX",AND "DCX" SP
        CMA
        CMP C
        CNZ CPUER   ;TEST "LXI","DAD","INX", AND "DCX" SP
        LXI H,TEMP4
        SPHL
        LXI H,07733H
        DCX SP
        DCX SP
        XTHL
        LDA TEMP3
        CPI 077H
        CNZ CPUER   ;TEST "SPHL" AND "XTHL"
        LDA TEMP2
        CPI 033H
        CNZ CPUER   ;TEST "SPHL" AND "XTHL"
        MVI A,055H
        CMP L
        CNZ CPUER   ;TEST "SPHL" AND "XTHL"
        CMA
        CMP H
        CNZ CPUER   ;TEST "SPHL" AND "XTHL"
        LHLD    SAVSTK  ;RESTORE THE "OLD" STACK-POINTER
        SPHL
        LXI H,CPUOK
        PCHL        ;TEST "PCHL"
;
;
;
CPUER:  LXI H,NGCPU ;OUTPUT "CPU HAS FAILED    ERROR EXIT=" TO CONSOLE
        CALL    MSG
        XTHL
        MOV A,H
        CALL    BYTEO   ;SHOW ERROR EXIT ADDRESS HIGH BYTE
        MOV A,L
        CALL    BYTEO   ;SHOW ERROR EXIT ADDRESS LOW BYTE
        JMP WBOOT   ;EXIT TO CP/M WARM BOOT
;
;
;
CPUOK:  LXI H,OKCPU ;OUTPUT "CPU IS OPERATIONAL" TO CONSOLE
        CALL    MSG
        JMP WBOOT   ;EXIT TO CP/M WARM BOOT
;
;
;
TEMPP:  DW  TEMP0   ;POINTER USED TO TEST "LHLD","SHLD",
            ; AND "LDAX" INSTRUCTIONS
;
TEMP0:  DS  1   ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
TEMP1:  DS  1   ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
TEMP2   DS  1   ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
TEMP3:  DS  1   ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
TEMP4:  DS  1   ;TEMPORARY STORAGE FOR CPU TEST MEMORY LOCATIONS
SAVSTK: DS  2   ;TEMPORARY STACK-POINTER STORAGE LOCATION
;
;
;
STACK   EQU TEMPP+256   ;DE-BUG STACK POINTER STORAGE AREA
;
        END

其他两个测试套件可以在Alexander Demin 的 i8080-core repo我的 fork中找到。不幸的是,我只有 Microcosm 测试套件的 asm。

于 2016-05-17T17:23:07.293 回答