mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-12-23 00:29:47 +00:00
211c75d84d
Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
344 lines
4.9 KiB
Z80 Assembly
344 lines
4.9 KiB
Z80 Assembly
.title 'Preliminary Z80 tests'
|
|
|
|
; prelim.z80 - Preliminary Z80 tests
|
|
; Copyright (C) 1994 Frank D. Cringle
|
|
;
|
|
; This program is free software; you can redistribute it and/or
|
|
; modify it under the terms of the GNU General Public License
|
|
; as published by the Free Software Foundation; either version 2
|
|
; of the License, or (at your option) any later version.
|
|
;
|
|
; This program is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with this program; if not, write to the Free Software
|
|
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
; These tests have two goals. To start with, we assume the worst and
|
|
; successively test the instructions needed to continue testing.
|
|
; Then we try to test all instructions which cannot be handled by
|
|
; zexlax - the crc-based instruction exerciser.
|
|
|
|
; Initially errors are 'reported' by jumping to 0. This should reboot
|
|
; cp/m, so if the program terminates without any output one of the
|
|
; early tests failed. Later errors are reported by outputting an
|
|
; address via the bdos conout routine. The address can be located in
|
|
; a listing of this program.
|
|
|
|
; If the program runs to completion it displays a suitable message.
|
|
|
|
aseg
|
|
org 100h
|
|
|
|
start: ld a,1 ; test simple compares and z/nz jumps
|
|
cp 2
|
|
jp z,0
|
|
cp 1
|
|
jp nz,0
|
|
jp lab0
|
|
halt ; emergency exit
|
|
db 0ffh
|
|
|
|
lab0: call lab2 ; does a simple call work?
|
|
lab1: jp 0 ; fail
|
|
|
|
lab2: pop hl ; check return address
|
|
ld a,h
|
|
cp high lab1
|
|
jp z,lab3
|
|
jp 0
|
|
lab3: ld a,l
|
|
cp low lab1
|
|
jp z,lab4
|
|
jp 0
|
|
|
|
; test presence and uniqueness of all machine registers
|
|
; (except ir)
|
|
lab4: ld sp,regs1
|
|
pop af
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ex af,af'
|
|
exx
|
|
pop af
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
pop ix
|
|
pop iy
|
|
ld sp,regs2+20
|
|
push iy
|
|
push ix
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
ex af,af'
|
|
exx
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
|
|
v: set 0
|
|
rept 20
|
|
ld a,(regs2+v/2)
|
|
v: set v+2
|
|
cp v
|
|
jp nz,0
|
|
endm
|
|
|
|
; test access to memory via (hl)
|
|
ld hl,hlval
|
|
ld a,(hl)
|
|
cp 0a5h
|
|
jp nz,0
|
|
ld hl,hlval+1
|
|
ld a,(hl)
|
|
cp 03ch
|
|
jp nz,0
|
|
|
|
; test unconditional return
|
|
ld sp,stack
|
|
ld hl,reta
|
|
push hl
|
|
ret
|
|
jp 0
|
|
|
|
; test instructions needed for hex output
|
|
reta: ld a,255
|
|
and a,15
|
|
cp 15
|
|
jp nz,0
|
|
ld a,05ah
|
|
and 15
|
|
cp 00ah
|
|
jp nz,0
|
|
rrca
|
|
cp 005h
|
|
jp nz,0
|
|
rrca
|
|
cp 082h
|
|
jp nz,0
|
|
rrca
|
|
cp 041h
|
|
jp nz,0
|
|
rrca
|
|
cp 0a0h
|
|
jp nz,0
|
|
ld hl,01234h
|
|
push hl
|
|
pop bc
|
|
ld a,b
|
|
cp 012h
|
|
jp nz,0
|
|
ld a,c
|
|
cp 034h
|
|
jp nz,0
|
|
|
|
; from now on we can report errors by displaying an address
|
|
|
|
; test conditional call, ret, jp, jr
|
|
tcond: macro flag,pcond,ncond,rel
|
|
ld hl,&flag
|
|
push hl
|
|
pop af
|
|
call &pcond,lab1&pcond
|
|
jp error
|
|
lab1&pcond: pop hl
|
|
ld hl,0d7h xor &flag
|
|
push hl
|
|
pop af
|
|
call &ncond,lab2&pcond
|
|
jp error
|
|
lab2&pcond: pop hl
|
|
ld hl,lab3&pcond
|
|
push hl
|
|
ld hl,&flag
|
|
push hl
|
|
pop af
|
|
ret &pcond
|
|
call error
|
|
lab3&pcond: ld hl,lab4&pcond
|
|
push hl
|
|
ld hl,0d7h xor &flag
|
|
push hl
|
|
pop af
|
|
ret &ncond
|
|
call error
|
|
lab4&pcond: ld hl,&flag
|
|
push hl
|
|
pop af
|
|
jp &pcond,lab5&pcond
|
|
call error
|
|
lab5&pcond: ld hl,0d7h xor &flag
|
|
push hl
|
|
pop af
|
|
jp &ncond,lab6&pcond
|
|
call error
|
|
lab6&pcond:
|
|
if &rel
|
|
ld hl,&flag
|
|
push hl
|
|
pop af
|
|
jr &pcond,lab7&pcond
|
|
call error
|
|
lab7&pcond: ld hl,0d7h xor &flag
|
|
push hl
|
|
pop af
|
|
jr &ncond,lab8&pcond
|
|
call error
|
|
lab8&pcond:
|
|
endif
|
|
endm
|
|
|
|
tcond 1,c,nc,1
|
|
tcond 4,pe,po,0
|
|
tcond 040h,z,nz,1
|
|
tcond 080h,m,p,0
|
|
|
|
; test indirect jumps
|
|
ld hl,lab5
|
|
jp (hl)
|
|
call error
|
|
lab5: ld hl,lab6
|
|
push hl
|
|
pop ix
|
|
jp (ix)
|
|
call error
|
|
lab6: ld hl,lab7
|
|
push hl
|
|
pop iy
|
|
jp (iy)
|
|
call error
|
|
|
|
; djnz (and (partially) inc a, inc hl)
|
|
lab7: ld a,0a5h
|
|
ld b,4
|
|
lab8: rrca
|
|
djnz lab8
|
|
cp 05ah
|
|
call nz,error
|
|
ld b,16
|
|
lab9: inc a
|
|
djnz lab9
|
|
cp 06ah
|
|
call nz,error
|
|
ld b,0
|
|
ld hl,0
|
|
lab10: inc hl
|
|
djnz lab10
|
|
ld a,h
|
|
cp 1
|
|
call nz,error
|
|
ld a,l
|
|
cp 0
|
|
call nz,error
|
|
|
|
; relative addressing
|
|
reladr: macro r
|
|
ld &r,hlval
|
|
ld a,(&r)
|
|
cp 0a5h
|
|
call nz,error
|
|
ld a,(&r+1)
|
|
cp 03ch
|
|
call nz,error
|
|
inc &r
|
|
ld a,(&r-1)
|
|
cp 0a5h
|
|
call nz,error
|
|
ld &r,hlval-126
|
|
ld a,(&r+127)
|
|
cp 03ch
|
|
call nz,error
|
|
ld &r,hlval+128
|
|
ld a,(&r-128)
|
|
cp 0a5h
|
|
call nz,error
|
|
endm
|
|
|
|
reladr ix
|
|
reladr iy
|
|
|
|
allok: ld de,okmsg
|
|
ld c,9
|
|
call 5
|
|
jp 0
|
|
|
|
okmsg: db 'Preliminary tests complete$'
|
|
|
|
|
|
; display address at top of stack and exit
|
|
error: pop bc
|
|
ld h,high hextab
|
|
ld a,b
|
|
rrca
|
|
rrca
|
|
rrca
|
|
rrca
|
|
and 15
|
|
ld l,a
|
|
ld a,(hl)
|
|
call conout
|
|
ld a,b
|
|
and 15
|
|
ld l,a
|
|
ld a,(hl)
|
|
call conout
|
|
ld a,c
|
|
rrca
|
|
rrca
|
|
rrca
|
|
rrca
|
|
and 15
|
|
ld l,a
|
|
ld a,(hl)
|
|
call conout
|
|
ld a,c
|
|
and 15
|
|
ld l,a
|
|
ld a,(hl)
|
|
call conout
|
|
ld a,13
|
|
call conout
|
|
ld a,10
|
|
call conout
|
|
jp 0
|
|
|
|
conout: push af
|
|
push bc
|
|
push de
|
|
push hl
|
|
ld c,2
|
|
ld e,a
|
|
call 5
|
|
pop hl
|
|
pop de
|
|
pop bc
|
|
pop af
|
|
ret
|
|
|
|
v: set 0
|
|
regs1: rept 20
|
|
v: set v+2
|
|
db v
|
|
endm
|
|
|
|
regs2: ds 20,0
|
|
|
|
hlval: db 0a5h,03ch
|
|
|
|
; skip to next page boundary
|
|
org (($+255)/256)*256
|
|
hextab: db '0123456789abcdef'
|
|
ds 240
|
|
stack: equ $
|
|
|
|
end
|