; Z80TEST ; tests the validity of a z80 emulation ; ; First we test a few flags to make sure that the emulator works enough ; to test itself. Basically we want to make sure we can test the flags ; and jump to 0 if the processor does something unexpected. If it passes ; all of our tests then the OK string is printed and the program ends. ; if there is a problem the program should end just after the problem ; instructions. This allows us to examine the debugger output at that ; point without having to painstakingly follow the code all the way. org 100h ; test some flags flags first ld a, 0ffh add a, a jp nc, 0 ld a, 1 add a, a jp c, 0 xor a, a jp nz, 0 inc a jp z, 0 dec a jp m, 0 dec a jp p, 0 ld a, 7fh inc a jp po, 0 and 0ffh jp pe, 0 ; adc and add add_test1 macro reg ld reg, 34h ld a, 21h add a, reg jp c, 0 cp 55h jp nz, 0 scf ld a, 21h adc a, reg jp c, 0 cp 56h jp nz, 0 adc a, a jp po, 0 adc a, a jp nc, 0 ld a, 0fh ld reg, 55h and reg cp 5 jp nz, 0 endm ld hl, test_var add_test1 (hl) ld ix, test_var - 7 add_test1 (ix+7) ld iy, test_var - 7 add_test1 (iy+7) add_test1 b add_test1 c add_test1 d add_test1 e add_test1 h add_test1 l add_test2 macro reg ld hl, 1234h ld reg, 4321h add hl, reg jp c, 0 ld a, l cp h jp nz, 0 cp 55h jp nz, 0 scf adc hl, hl ld a, l dec a cp h jp nz, 0 cp 0aah jp nz, 0 endm add_test2 bc add_test2 de add_test2 sp add_test3 macro reg ld ix, 1234h ld reg, 4321h add ix, reg jp c, 0 push ix pop hl ld a, l cp h jp nz, 0 cp 55h jp nz, 0 add ix, ix push ix pop hl ld a, l cp h jp nz, 0 cp 0aah jp nz, 0 ld iy, 1234h ld reg, 4321h add iy, reg jp c, 0 push iy pop hl ld a, l cp h jp nz, 0 cp 55h jp nz, 0 add iy, iy push iy pop hl ld a, l cp h jp nz, 0 cp 0aah jp nz, 0 endm add_test3 bc add_test3 de add_test3 sp ld a, 21h add a, 34h jp c, 0 cp 55h jp nz, 0 scf ld a, 21h adc a, 34h jp c, 0 cp 56h jp nz, 0 adc a, a jp po, 0 adc a, a jp nc, 0 ld a, 0fh and 55h cp 5 jp nz, 0 ; that finishes the As! ld_imm macro reg ld reg, 34h ld a, 34h cp reg jp nz, 0 endm ld_imm a ld_imm b ld_imm c ld_imm d ld_imm e ld_imm h ld_imm l ld_imm (hl) ld de, ok ld c, 9 call 5 jp 0 ok: db 'OK', 0dh, 0ah, '$' test_var: ds 100h