mirror of
https://github.com/wfjm/w11.git
synced 2026-01-13 15:37:43 +00:00
- rtl/w11a - pdp11.vhd: add cpustat_type in_vecflow - pdp11_sequencer.vhd: BUGFIX: get correct PS after vector push abort - tools - tcode/cpu_details.mac: add test A3.5 - tcode/cpu_mmu.mac: add test C2.5, C2.6, C2.7 - xxdp/ekbee1_patch_1170.scmd: fix test 122 - xxdp/ekbee1_patch_w11a.tcl: fix test 122
739 lines
38 KiB
Plaintext
739 lines
38 KiB
Plaintext
; $Id: cpu_eis.mac 1329 2022-12-11 17:28:28Z mueller $
|
|
; SPDX-License-Identifier: GPL-3.0-or-later
|
|
; Copyright 2022- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
|
;
|
|
; Revision History:
|
|
; Date Rev Version Comment
|
|
; 2022-07-25 1263 1.0 Initial version
|
|
; 2022-07-11 1251 0.1 First draft
|
|
;
|
|
; Test CPU EIS instructions
|
|
;
|
|
.include |lib/tcode_std_base.mac|
|
|
;
|
|
; Section A: div =============================================================
|
|
; This section verifies
|
|
; x xxx xxx xxx xxx xxx NZVC Instruction / Remark
|
|
; 0 111 001 rrr sss sss NZVC DIV
|
|
;
|
|
; A1.1 div test basics
|
|
; A1.2 div test systematic
|
|
; A1.3 div odd register
|
|
;
|
|
|
|
jmp ta0101
|
|
;
|
|
; driver for div tests
|
|
;
|
|
topdiv: mov (r5),r4 ; setup data pointer
|
|
mov 2(r5),r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
;
|
|
100$: mov (r4)+,r0 ; load divident high
|
|
mov (r4)+,r1 ; load divident low
|
|
div (r4)+,r0 ; divide by divisor
|
|
mov (r3),r2 ; get psw
|
|
bit #cp00v0,r2 ; V set ?
|
|
beq 101$ ; if yes
|
|
bic #cpnz00,r2 ; ignore N and Z (differ in e11 and SimH)
|
|
101$: hcmpeq (r4)+,r2 ; check psw
|
|
bit #cp00vc, r2 ; V or C set ?
|
|
beq 200$ ; eq if V=0 and C=0
|
|
add #4,r4 ; skip q and r check
|
|
br 300$
|
|
;
|
|
200$: hcmpeq (r4)+,r0 ; check quotient
|
|
hcmpeq (r4)+,r1 ; check reminder
|
|
;
|
|
300$: cmp r4,r5 ; more to do ?
|
|
blo 100$
|
|
return
|
|
;
|
|
; Test A1.1 -- div test basics ++++++++++++++++++++++++++++++++++++++++++++++++
|
|
; Notes:
|
|
; - from test_w11a_div.tcl, div_testd2 cases, translated almost 1-to-1
|
|
; - the state of Z,N is according to Processor Handbook 1979 undefined for
|
|
; a DIV when V=1 (so after zero divide and overflow).
|
|
; - SimH, e11, and real 11/70 differ in the Z state when V=1
|
|
; - SimH: always Z=0 for overflow (V=1,C=0)
|
|
; - 11/70: sometimes Z=1 after overflow
|
|
; - e11: sometimes Z=1 after overflow, whether 11/70 precise unknown
|
|
; - w11: always Z=0 for overflow, as in SimH
|
|
; - should execute on w11, SimH and e11, so Z and N are excluded from PSW check
|
|
;
|
|
ta0101: mov #1000$,r5
|
|
call topdiv
|
|
jmp 9999$
|
|
;
|
|
1000$: .word 1010$
|
|
.word 1011$
|
|
;
|
|
;
|
|
; ddh ddl dr psw q r
|
|
1010$:
|
|
; --- dr>0
|
|
.word 0, 0, 3, cp0z00, 0, 0
|
|
.word 0, 1, 3, cp0z00, 0, 1
|
|
.word 0, 2, 3, cp0z00, 0, 2
|
|
.word 0, 3, 3, cp0000, 1, 0
|
|
.word 0, 4, 3, cp0000, 1, 1
|
|
.word -1, -1, 3, cp0z00, 0, -1
|
|
.word -1, -2, 3, cp0z00, 0, -2
|
|
.word -1, -3, 3, cpn000, -1, 0
|
|
.word -1, -4, 3, cpn000, -1, -1
|
|
; --- dr<0
|
|
.word 0, 0, -3, cp0z00, 0, 0
|
|
.word 0, 1, -3, cp0z00, 0, 1
|
|
.word 0, 2, -3, cp0z00, 0, 2
|
|
.word 0, 3, -3, cpn000, -1, 0
|
|
.word 0, 4, -3, cpn000, -1, 1
|
|
.word -1, -1, -3, cp0z00, 0, -1
|
|
.word -1, -2, -3, cp0z00, 0, -2
|
|
.word -1, -3, -3, cp0000, 1, 0
|
|
.word -1, -4, -3, cp0000, 1, -1
|
|
; --- dr==0
|
|
.word 0, 0, 0, cp00vc, 0, 0 ; !vc
|
|
.word 0, 1, 0, cp00vc, 0, 0 ; !vc
|
|
.word -1, -1, 0, cp00vc, 0, 0 ; !vc
|
|
; --- 4 quadrant basics
|
|
.word 0, 34., 5., cp0000, 6., 4.
|
|
.word 0, 34., -5., cpn000, -6., 4.
|
|
.word -1, -34., 5., cpn000, -6., -4.
|
|
.word -1, -34., -5., cp0000, 6., -4.
|
|
; --- late div quite cases in 2 quadrant algorithm
|
|
.word -1,-32767., -1., cp0000, 32767., 0. ;-32767/-1
|
|
.word -1, 100000, -1., cp00v0, 0, 0 ;-32768/-1 !v
|
|
.word -1, 077777, -1., cp00v0, 0, 0 ;-32769/-1 !v
|
|
;
|
|
.word -1, 000002, -2., cp0000, 32767., 0. ;-65534/-2
|
|
.word -1, 000001, -2., cp0000, 32767., -1. ;-65535/-2
|
|
.word -1, 000000, -2., cp00v0, 0, 0 ;-65536/-2 !v
|
|
.word -2, 177777, -2., cp00v0, 0, 0 ;-65537/-2 !v
|
|
; --- big divident overflow cases
|
|
.word 77777, 177777, 1., cp00v0, 0, 0 ;0x7fffffff/ 1 !v
|
|
.word 77777, 177777, 2., cp00v0, 0, 0 ;0x7fffffff/ 2 !v
|
|
.word 77777, 177777, -1., cp00v0, 0, 0 ;0x7fffffff/-1 !v
|
|
.word 77777, 177777, -2., cp00v0, 0, 0 ;0x7fffffff/-2 !v
|
|
.word 100000, 000000, 1., cp00v0, 0, 0 ;0x80000000/ 1 !v
|
|
.word 100000, 000000, 2., cp00v0, 0, 0 ;0x80000000/ 2 !v
|
|
.word 100000, 000000, -1., cp00v0, 0, 0 ;0x80000000/-1 !v
|
|
.word 100000, 000000, -2., cp00v0, 0, 0 ;0x80000000/-2 !v
|
|
;
|
|
1011$:
|
|
|
|
9999$: iot ; end of test A1.1
|
|
;
|
|
; Test A1.2 -- div test systematic ++++++++++++++++++++++++++++++++++++++++++++
|
|
; from test_w11a_div.tcl, div_testdqr cases, exported via div_show_exp
|
|
;
|
|
ta0102: mov #1000$,r5
|
|
call topdiv
|
|
jmp 9999$
|
|
;
|
|
1000$: .word 1010$
|
|
.word 1011$
|
|
;
|
|
;
|
|
; ddh ddl dr psw q r
|
|
1010$:
|
|
; test q=100000 boundary cases (q = max neg value)
|
|
; case dd>0, dr<0 -- factor 21846
|
|
.word 0025253,0000000, -21846., cpn000, -32768., 0.;dd= 715849728
|
|
.word 0025253,0000001, -21846., cpn000, -32768., 1.;dd= 715849729
|
|
.word 0025253,0052524, -21846., cpn000, -32768., 21844.;dd= 715871572
|
|
.word 0025253,0052525, -21846., cpn000, -32768., 21845.;dd= 715871573
|
|
.word 0025253,0052526, -21846., cp00v0, 10923., 21846.;dd= 715871574
|
|
.word 0025253,0052527, -21846., cp00v0, 10923., 21847.;dd= 715871575
|
|
; case dd<0, dr>0 -- factor 21846
|
|
.word 0152525,0000000, 21846., cpn000, -32768., 0.;dd= -715849728
|
|
.word 0152524,0177777, 21846., cpn000, -32768., -1.;dd= -715849729
|
|
.word 0152524,0125254, 21846., cpn000, -32768., -21844.;dd= -715871572
|
|
.word 0152524,0125253, 21846., cpn000, -32768., -21845.;dd= -715871573
|
|
.word 0152524,0125252, 21846., cp00v0, -10924., -21846.;dd= -715871574
|
|
.word 0152524,0125251, 21846., cp00v0, -10924., -21847.;dd= -715871575
|
|
; case dd>0, dr<0 -- factor 21847
|
|
.word 0025253,0100000, -21847., cpn000, -32768., 0.;dd= 715882496
|
|
.word 0025253,0100001, -21847., cpn000, -32768., 1.;dd= 715882497
|
|
.word 0025253,0152525, -21847., cpn000, -32768., 21845.;dd= 715904341
|
|
.word 0025253,0152526, -21847., cpn000, -32768., 21846.;dd= 715904342
|
|
.word 0025253,0152527, -21847., cp00v0, 10923., -10921.;dd= 715904343
|
|
.word 0025253,0152530, -21847., cp00v0, 10923., -10920.;dd= 715904344
|
|
; case dd<0, dr>0 -- factor 21847
|
|
.word 0152524,0100000, 21847., cpn000, -32768., 0.;dd= -715882496
|
|
.word 0152524,0077777, 21847., cpn000, -32768., -1.;dd= -715882497
|
|
.word 0152524,0025253, 21847., cpn000, -32768., -21845.;dd= -715904341
|
|
.word 0152524,0025252, 21847., cpn000, -32768., -21846.;dd= -715904342
|
|
.word 0152524,0025251, 21847., cp00v0, -10924., 10921.;dd= -715904343
|
|
.word 0152524,0025250, 21847., cp00v0, -10924., 10920.;dd= -715904344
|
|
; test q=077777 boundary cases (q = max pos value)
|
|
; case dd>0, dr>0 -- factor 21846
|
|
.word 0025252,0125252, 21846., cp0000, 32767., 0.;dd= 715827882
|
|
.word 0025252,0125253, 21846., cp0000, 32767., 1.;dd= 715827883
|
|
.word 0025252,0177776, 21846., cp0000, 32767., 21844.;dd= 715849726
|
|
.word 0025252,0177777, 21846., cp0000, 32767., 21845.;dd= 715849727
|
|
.word 0025253,0000000, 21846., cp00v0, 10923., 0.;dd= 715849728
|
|
.word 0025253,0000001, 21846., cp00v0, 10923., 1.;dd= 715849729
|
|
; case dd<0, dr<0 -- factor 21846
|
|
.word 0152525,0052526, -21846., cp0000, 32767., 0.;dd= -715827882
|
|
.word 0152525,0052525, -21846., cp0000, 32767., -1.;dd= -715827883
|
|
.word 0152525,0000002, -21846., cp0000, 32767., -21844.;dd= -715849726
|
|
.word 0152525,0000001, -21846., cp0000, 32767., -21845.;dd= -715849727
|
|
.word 0152525,0000000, -21846., cp00v0, -10923., 0.;dd= -715849728
|
|
.word 0152524,0177777, -21846., cp00v0, -10924., -1.;dd= -715849729
|
|
; case dd>0, dr>0 -- factor 21847
|
|
.word 0025253,0025251, 21847., cp0000, 32767., 0.;dd= 715860649
|
|
.word 0025253,0025252, 21847., cp0000, 32767., 1.;dd= 715860650
|
|
.word 0025253,0077776, 21847., cp0000, 32767., 21845.;dd= 715882494
|
|
.word 0025253,0077777, 21847., cp0000, 32767., 21846.;dd= 715882495
|
|
.word 0025253,0100000, 21847., cp00v0, 10923., -32768.;dd= 715882496
|
|
.word 0025253,0100001, 21847., cp00v0, 10923., -32767.;dd= 715882497
|
|
; case dd<0, dr<0 -- factor 21847
|
|
.word 0152524,0152527, -21847., cp0000, 32767., 0.;dd= -715860649
|
|
.word 0152524,0152526, -21847., cp0000, 32767., -1.;dd= -715860650
|
|
.word 0152524,0100002, -21847., cp0000, 32767., -21845.;dd= -715882494
|
|
.word 0152524,0100001, -21847., cp0000, 32767., -21846.;dd= -715882495
|
|
.word 0152524,0100001, -21847., cp0000, 32767., -21846.;dd= -715882495
|
|
.word 0152524,0100000, -21847., cp00v0, -10924., -32768.;dd= -715882496
|
|
; test dr=100000 boundary cases (dr = max neg value)
|
|
; case dd<0, q>0
|
|
.word 0177777,0100000, -32768., cp0000, 1., 0.;dd= -32768
|
|
.word 0177777,0077777, -32768., cp0000, 1., -1.;dd= -32769
|
|
.word 0177777,0000001, -32768., cp0000, 1., -32767.;dd= -65535
|
|
.word 0177777,0000000, -32768., cp0000, 2., 0.;dd= -65536
|
|
.word 0177776,0177777, -32768., cp0000, 2., -1.;dd= -65537
|
|
.word 0177776,0100001, -32768., cp0000, 2., -32767.;dd= -98303
|
|
.word 0177776,0100000, -32768., cp0000, 3., 0.;dd= -98304
|
|
.word 0177776,0077777, -32768., cp0000, 3., -1.;dd= -98305
|
|
.word 0177776,0000001, -32768., cp0000, 3., -32767.;dd= -131071
|
|
.word 0177776,0000000, -32768., cp0000, 4., 0.;dd= -131072
|
|
.word 0177775,0177777, -32768., cp0000, 4., -1.;dd= -131073
|
|
.word 0177775,0100001, -32768., cp0000, 4., -32767.;dd= -163839
|
|
.word 0177775,0000000, -32768., cp0000, 6., 0.;dd= -196608
|
|
.word 0140003,0000000, -32768., cp0000, 32762., 0.;dd=-1073545216
|
|
.word 0140002,0000000, -32768., cp0000, 32764., 0.;dd=-1073610752
|
|
.word 0140001,0100000, -32768., cp0000, 32765., 0.;dd=-1073643520
|
|
.word 0140001,0000000, -32768., cp0000, 32766., 0.;dd=-1073676288
|
|
.word 0140000,0177777, -32768., cp0000, 32766., -1.;dd=-1073676289
|
|
.word 0140000,0100001, -32768., cp0000, 32766., -32767.;dd=-1073709055
|
|
.word 0140000,0100000, -32768., cp0000, 32767., 0.;dd=-1073709056
|
|
.word 0140000,0077777, -32768., cp0000, 32767., -1.;dd=-1073709057
|
|
.word 0140000,0000001, -32768., cp0000, 32767., -32767.;dd=-1073741823
|
|
; case dd>0, q<0
|
|
.word 0000000,0100000, -32768., cpn000, -1., 0.;dd= 32768
|
|
.word 0000000,0100001, -32768., cpn000, -1., 1.;dd= 32769
|
|
.word 0000000,0177777, -32768., cpn000, -1., 32767.;dd= 65535
|
|
.word 0000001,0000000, -32768., cpn000, -2., 0.;dd= 65536
|
|
.word 0000001,0000001, -32768., cpn000, -2., 1.;dd= 65537
|
|
.word 0000001,0077777, -32768., cpn000, -2., 32767.;dd= 98303
|
|
.word 0037777,0100000, -32768., cpn000, -32767., 0.;dd= 1073709056
|
|
.word 0037777,0100001, -32768., cpn000, -32767., 1.;dd= 1073709057
|
|
.word 0037777,0177777, -32768., cpn000, -32767., 32767.;dd= 1073741823
|
|
.word 0040000,0000000, -32768., cpn000, -32768., 0.;dd= 1073741824
|
|
.word 0040000,0000001, -32768., cpn000, -32768., 1.;dd= 1073741825
|
|
.word 0040000,0077777, -32768., cpn000, -32768., 32767.;dd= 1073774591
|
|
; test dr=077777 boundary cases (dr = max pos value)
|
|
; case dd>0, q>0
|
|
.word 0000000,0077777, 32767., cp0000, 1., 0.;dd= 32767
|
|
.word 0000000,0100000, 32767., cp0000, 1., 1.;dd= 32768
|
|
.word 0000000,0177775, 32767., cp0000, 1., 32766.;dd= 65533
|
|
.word 0000000,0177776, 32767., cp0000, 2., 0.;dd= 65534
|
|
.word 0000000,0177777, 32767., cp0000, 2., 1.;dd= 65535
|
|
.word 0000001,0077774, 32767., cp0000, 2., 32766.;dd= 98300
|
|
.word 0037776,0100002, 32767., cp0000, 32766., 0.;dd= 1073643522
|
|
.word 0037776,0100003, 32767., cp0000, 32766., 1.;dd= 1073643523
|
|
.word 0037777,0000000, 32767., cp0000, 32766., 32766.;dd= 1073676288
|
|
.word 0037777,0000001, 32767., cp0000, 32767., 0.;dd= 1073676289
|
|
.word 0037777,0000002, 32767., cp0000, 32767., 1.;dd= 1073676290
|
|
.word 0037777,0077777, 32767., cp0000, 32767., 32766.;dd= 1073709055
|
|
; case dd<0, q<0
|
|
.word 0177777,0100001, 32767., cpn000, -1., 0.;dd= -32767
|
|
.word 0177777,0100000, 32767., cpn000, -1., -1.;dd= -32768
|
|
.word 0177777,0000003, 32767., cpn000, -1., -32766.;dd= -65533
|
|
.word 0177777,0000002, 32767., cpn000, -2., 0.;dd= -65534
|
|
.word 0177777,0000001, 32767., cpn000, -2., -1.;dd= -65535
|
|
.word 0177776,0100004, 32767., cpn000, -2., -32766.;dd= -98300
|
|
.word 0140000,0177777, 32767., cpn000, -32767., 0.;dd=-1073676289
|
|
.word 0140000,0177776, 32767., cpn000, -32767., -1.;dd=-1073676290
|
|
.word 0140000,0100001, 32767., cpn000, -32767., -32766.;dd=-1073709055
|
|
.word 0140000,0100000, 32767., cpn000, -32768., 0.;dd=-1073709056
|
|
.word 0140000,0077777, 32767., cpn000, -32768., -1.;dd=-1073709057
|
|
.word 0140000,0000002, 32767., cpn000, -32768., -32766.;dd=-1073741822
|
|
; test dd max cases
|
|
; case dd>0 dr<0 near nmax*nmax+nmax-1 = +1073774591
|
|
.word 0037777,0177777, -32768., cpn000, -32767., 32767.;dd= 1073741823
|
|
.word 0040000,0000000, -32768., cpn000, -32768., 0.;dd= 1073741824
|
|
.word 0040000,0000001, -32768., cpn000, -32768., 1.;dd= 1073741825
|
|
.word 0040000,0077776, -32768., cpn000, -32768., 32766.;dd= 1073774590
|
|
.word 0040000,0077777, -32768., cpn000, -32768., 32767.;dd= 1073774591
|
|
.word 0037777,0100000, -32768., cpn000, -32767., 0.;dd= 1073709056
|
|
.word 0037777,0100001, -32768., cpn000, -32767., 1.;dd= 1073709057
|
|
; case dd>0 dr>0 near pmax*pmax+pmax-1 = +1073709055
|
|
.word 0037777,0000000, 32767., cp0000, 32766., 32766.;dd= 1073676288
|
|
.word 0037777,0000001, 32767., cp0000, 32767., 0.;dd= 1073676289
|
|
.word 0037777,0000002, 32767., cp0000, 32767., 1.;dd= 1073676290
|
|
.word 0037777,0077776, 32767., cp0000, 32767., 32765.;dd= 1073709054
|
|
.word 0037777,0077777, 32767., cp0000, 32767., 32766.;dd= 1073709055
|
|
.word 0037777,0100000, 32767., cp00v0, 16383., -32768.;dd= 1073709056
|
|
.word 0037776,0100001, 32767., cp0000, 32765., 32766.;dd= 1073643521
|
|
; case dd<0 dr>0 near nmax*pmax+pmax-1 = -1073741822
|
|
.word 0140000,0100001, 32767., cpn000, -32767., -32766.;dd=-1073709055
|
|
.word 0140000,0100000, 32767., cpn000, -32768., 0.;dd=-1073709056
|
|
.word 0140000,0077777, 32767., cpn000, -32768., -1.;dd=-1073709057
|
|
.word 0140000,0000003, 32767., cpn000, -32768., -32765.;dd=-1073741821
|
|
.word 0140000,0000002, 32767., cpn000, -32768., -32766.;dd=-1073741822
|
|
.word 0140000,0000001, 32767., cp00v0, -16384., 1.;dd=-1073741823
|
|
.word 0140000,0000000, 32767., cp00v0, -16384., 0.;dd=-1073741824
|
|
; case dd<0 dr<0 near pmax*nmax+nmax-1 = -1073741823
|
|
.word 0140000,0100001, -32768., cp0000, 32766., -32767.;dd=-1073709055
|
|
.word 0140000,0100000, -32768., cp0000, 32767., 0.;dd=-1073709056
|
|
.word 0140000,0077777, -32768., cp0000, 32767., -1.;dd=-1073709057
|
|
.word 0140000,0000002, -32768., cp0000, 32767., -32766.;dd=-1073741822
|
|
.word 0140000,0000001, -32768., cp0000, 32767., -32767.;dd=-1073741823
|
|
.word 0140000,0000000, -32768., cp00v0, -16384., 0.;dd=-1073741824
|
|
.word 0137777,0177777, -32768., cp00v0, -16385., -1.;dd=-1073741825
|
|
;
|
|
1011$:
|
|
;
|
|
9999$: iot ; end of test A1.2
|
|
;
|
|
;
|
|
; Test A1.3 -- div odd register +++++++++++++++++++++++++++++++++++++++
|
|
; check div odd register behavior
|
|
; Note: The div instruction has, in contrast to ashc, no useful semantics when
|
|
; called with an odd register. DEC documentation doesnt specify the
|
|
; behavior. SimH assumes, that register handling is done like for ashc,
|
|
; so effective dd is 'R<<16 | R' and reminder is stored. w11 implements
|
|
; div like this. This test briefly verifies this behavior.
|
|
|
|
ta0103: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
clr r0 ; for tmu optics
|
|
100$: mov (r4)+,r1 ; load dd
|
|
div (r4)+,r1 ; div
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r1 ; check res (reminder)
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
; dd, dr, psw, res ;
|
|
1000$: .word 000000, 1., cp0z00, 000000 ; h: 000000
|
|
.word 000007, 16., cp0000, 000007 ; 458759/16: 28672, 7 h: 070000
|
|
.word 000007, 17., cp0000, 000016 ; 458759/17: 26985,14 h: 064551
|
|
.word 000007, 19., cp0000, 000004 ; 458759/19: 24145, 4 h: 057121
|
|
.word 000007, 15., cp0000, 000016 ; 458759/15: 30583,14 h: 073567
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test A1.3
|
|
;
|
|
; Section B: mul =============================================================
|
|
; This section verifies
|
|
; x xxx xxx xxx xxx xxx NZVC Instruction / Remark
|
|
; 0 111 000 rrr sss sss NZ0C MUL
|
|
;
|
|
; B1.1 mul even and odd
|
|
; B1.2 mul+div (and adc,adc,sxt)
|
|
;
|
|
; Test B1.1 -- mul even and odd ++++++++++++++++++++++++++++++++++++++
|
|
; check that mul works with even and odd destination register
|
|
;
|
|
jmp tb0101
|
|
;
|
|
; driver for mul even tests
|
|
;
|
|
tbmule: mov #cp.psw,r3 ; setup psw pointer
|
|
100$: mov (r4)+,r0 ; load f1
|
|
mul (r4)+,r0 ; mul
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r0 ; check p_high
|
|
hcmpeq (r4)+,r1 ; check p_low
|
|
cmp r4,r5
|
|
blo 100$
|
|
return
|
|
;
|
|
; driver for mul odd tests
|
|
;
|
|
tbmulo: mov #cp.psw,r3 ; setup psw pointer
|
|
100$: mov (r4)+,r1 ; load f1
|
|
mul (r4)+,r1 ; mul
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
tst (r4)+ ; skip p_high
|
|
hcmpeq (r4)+,r1 ; check p_low
|
|
cmp r4,r5
|
|
blo 100$
|
|
return
|
|
;
|
|
tb0101: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
call tbmule ; test even
|
|
;
|
|
mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
call tbmulo ; test odd
|
|
;
|
|
jmp 9999$
|
|
;
|
|
; fx, f2, psw, ph, pl ;
|
|
1000$: .word 0., 0., cp0z00, 0, 0 ; p = 0.
|
|
.word 0., 1., cp0z00, 0, 0 ; p = 0.
|
|
.word 0., -1., cp0z00, 0, 0 ; p = 0.
|
|
.word 1., 0., cp0z00, 0, 0 ; p = 0.
|
|
.word 1., 1., cp0000, 0, 1 ; p = 1.
|
|
.word 1., -1., cpn000, 177777, 177777 ; p = -1.
|
|
.word -1., 0., cp0z00, 0, 0 ; p = 0.
|
|
.word -1., 1., cpn000, 177777, 177777 ; p = -1.
|
|
.word -1., -1., cp0000, 0, 1 ; p = 1.
|
|
.word 181., 181., cp0000, 0, 077771 ; p = 32761.
|
|
.word 181., 182., cp000c, 0, 100256 ; p = 32942.
|
|
.word 181., -182., cpn00c, 177777, 077522 ; p = -32942.
|
|
.word 31022., 9562., cp000c, 010656, 040054 ; p = 296632364.
|
|
.word 18494.,-24041., cpn00c, 162577, 134622 ; p =-444614254.
|
|
.word -12549., 2397., cpn00c, 177065, 002057 ; p = -30079953.
|
|
.word -20493.,-23858., cp000c, 016444, 055612 ; p = 488921994.
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test B1.1
|
|
;
|
|
; Test B1.2 -- mul+div (and adc,adc,sxt) +++++++++++++++++++++++++++++
|
|
; combined div and mul test
|
|
;
|
|
tb0102: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
;
|
|
100$: mov (r4)+,r0 ; load divident high
|
|
mov (r4)+,r1 ; load divident low
|
|
div (r4)+,r0 ; divide by divisor
|
|
mov r0,r2 ; get quotient
|
|
mul -2(r4),r2 ; multiply with divisor
|
|
add r1,r3 ; add reminder on p_low
|
|
adc r2 ; propagate carry to p_high
|
|
tst r1 ; sign extend reminder
|
|
sxt r1
|
|
add r1,r2 ; and add to p_high
|
|
hcmpeq -4(r4),r3 ; check p_low against divident low
|
|
hcmpeq -6(r4),r2 ; check p_high against divident high
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
; ddh ddl dr
|
|
1000$: .word 0, 0, 0
|
|
.word 0, 1, 3
|
|
.word 0, 2, 3
|
|
.word 0, 3, 3
|
|
.word 0, 4, 3
|
|
.word -1, -1, 3
|
|
.word -1, -2, 3
|
|
.word -1, -3, 3
|
|
.word -1, -4, 3
|
|
.word 0, 0, -3
|
|
.word 0, 1, -3
|
|
.word 0, 2, -3
|
|
.word 0, 3, -3
|
|
.word 0, 4, -3
|
|
.word -1, -1, -3
|
|
.word -1, -2, -3
|
|
.word -1, -3, -3
|
|
.word -1, -4, -3
|
|
.word 010656, 040054, 9562. ; dd = 296632364.
|
|
.word 010656, 040053, 9562. ; dd = 296632363.
|
|
.word 010656, 040055, 9562. ; dd = 296632365.
|
|
.word 010656, 040054, -9562. ; dd = 296632364.
|
|
.word 010656, 040053, -9562. ; dd = 296632363.
|
|
.word 010656, 040055, -9562. ; dd = 296632365.
|
|
.word 162577, 134622, 24041. ; dd = -444614254.
|
|
.word 162577, 134621, 24041. ; dd = -444614255.
|
|
.word 162577, 134623, 24041. ; dd = -444614253.
|
|
.word 162577, 134622,-24041. ; dd = -444614254.
|
|
.word 162577, 134621,-24041. ; dd = -444614255.
|
|
.word 162577, 134623,-24041. ; dd = -444614253.
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test B1.2
|
|
;
|
|
; Section C: ash =============================================================
|
|
; This section verifies
|
|
; x xxx xxx xxx xxx xxx NZVC Instruction / Remark
|
|
; 0 111 010 rrr sss sss NZVC ASH
|
|
;
|
|
; Test C1.1 -- ash +++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
;
|
|
tc0101: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
100$: mov (r4)+,r0 ; load src
|
|
ash (r4)+,r0 ; ash
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r0 ; check
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
200$: .word 0
|
|
;
|
|
; src, shift, psw, res ;
|
|
1000$: .word 000000, 0., cp0z00, 000000
|
|
.word 000200, 0., cp0000, 000200
|
|
.word 000200, 1., cp0000, 000400
|
|
.word 000200, 7., cp0000, 040000
|
|
.word 000200, 8., cpn0v0, 100000 ; sign!
|
|
.word 000200, 9., cp0zvc, 000000 ; sign!, C=1
|
|
.word 000200, 10., cp0zv0, 000000 ; sign!
|
|
.word 000200, 31., cp0zv0, 000000 ; sign!; max pos count
|
|
.word 000200, 32., cp0z00, 000000 ; !! 0040 --> like -32.
|
|
.word 000200, 60., cp0000, 000010 ; !! 0074 --> like -4.
|
|
.word 000200, 65., cp0000, 000400 ; !! 0101 --> like 1.
|
|
.word 000200, -1., cp0000, 000100
|
|
.word 000200, -7., cp0000, 000001
|
|
.word 000200, -8., cp0z0c, 000000 ; C=1
|
|
.word 000200, -9., cp0z00, 000000
|
|
.word 000200, -31., cp0z00, 000000
|
|
.word 000200, -32., cp0z00, 000000 ; max neg count
|
|
.word 000200, -33., cp0zv0, 000000 ; !! 0737 --> like 31.
|
|
.word 000200, -60., cp0000, 004000 ; !! 0704 --> like 4.
|
|
.word 000200, -65., cp0000, 000100 ; !! 0677 --> like -1.
|
|
.word 000200, 000077, cp0000, 000100 ; -1. only 6 bits
|
|
.word 000200, 000071, cp0000, 000001 ; -7. only 6 bits
|
|
.word 000200, 000070, cp0z0c, 000000 ; -8. only 6 bits
|
|
.word 100200, 0., cpn000, 100200
|
|
.word 100200, 1., cp00vc, 000400 ; sign change, C=1
|
|
.word 100200, 7., cp00v0, 040000 ; sign change
|
|
.word 100200, 8., cpn0v0, 100000 ; sign change
|
|
.word 100200, 9., cp0zvc, 000000 ; sign change, C=1
|
|
.word 100200, -1., cpn000, 140100
|
|
.word 100200, -7., cpn000, 177401
|
|
.word 100200, -8., cpn00c, 177600 ; C=1
|
|
.word 100200, -9., cpn000, 177700
|
|
.word 100200, -15., cpn000, 177777
|
|
.word 100200, -16., cpn00c, 177777 ; C=1
|
|
.word 100200, -17., cpn00c, 177777 ; C=1
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test C1.1
|
|
;
|
|
; Section D: ashc ============================================================
|
|
; This section verifies
|
|
; x xxx xxx xxx xxx xxx NZVC Instruction / Remark
|
|
; 0 111 011 rrr sss sss NZVC ASHC
|
|
;
|
|
; D1.1 ashc even register
|
|
; D1.2 ashc odd register
|
|
;
|
|
; Test D1.1 -- ashc even register +++++++++++++++++++++++++++++++++++
|
|
;
|
|
td0101: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
100$: mov (r4)+,r0 ; load src_h
|
|
mov (r4)+,r1 ; load src_l
|
|
ashc (r4)+,r0 ; ashc
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r0 ; check res_h
|
|
hcmpeq (r4)+,r1 ; check res_l
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
; src_h, src_h, shift, psw, res_h, res_l ;
|
|
1000$: .word 000000, 000000, 0., cp0z00, 000000, 000000
|
|
.word 000020, 000200, 0., cp0000, 000020, 000200
|
|
.word 000020, 000200, 1., cp0000, 000040, 000400
|
|
.word 000020, 000200, 8., cp0000, 010000, 100000
|
|
.word 000020, 000200, 9., cp0000, 020001, 000000
|
|
.word 000020, 000200, 10., cp0000, 040002, 000000
|
|
.word 000020, 000200, 11., cpn0v0, 100004, 000000 ; sign!
|
|
.word 000020, 000200, 12., cp00vc, 000010, 000000 ; sign! C=1
|
|
.word 000020, 000200, 13., cp00v0, 000020, 000000 ; sign!
|
|
.word 000020, 000200, 23., cp00v0, 040000, 000000 ; sign!
|
|
.word 000020, 000200, 24., cpn0v0, 100000, 000000 ; sign!
|
|
.word 000020, 000200, 25., cp0zvc, 000000, 000000 ; sign! C=1
|
|
.word 000020, 000200, 26., cp0zv0, 000000, 000000 ; sign!
|
|
.word 000020, 000200, 31., cp0zv0, 000000, 000000 ; sign! max pos
|
|
.word 000020, 000200, 32., cp0z00, 000000, 000000 ; 0040 like -32.
|
|
.word 000020, 000200, 60., cp0000, 000001, 000010 ; 0074 like -4.
|
|
.word 000020, 000200, 65., cp0000, 000040, 000400 ; 0101 like 1.
|
|
.word 000020, 000200, -1., cp0000, 000010, 000100
|
|
.word 000020, 000200, -4., cp0000, 000001, 000010
|
|
.word 000020, 000200, -5., cp0000, 000000, 100004
|
|
.word 000020, 000200, -7., cp0000, 000000, 020001
|
|
.word 000020, 000200, -8., cp000c, 000000, 010000 ; C=1
|
|
.word 000020, 000200, -9., cp0000, 000000, 004000
|
|
.word 000020, 000200, -20., cp0000, 000000, 000001
|
|
.word 000020, 000200, -21., cp0z0c, 000000, 000000 ; C=1
|
|
.word 000020, 000200, -22., cp0z00, 000000, 000000
|
|
.word 000020, 000200, -32., cp0z00, 000000, 000000 ; max neg
|
|
.word 000020, 000200, -33., cp0zv0, 000000, 000000 ; 0737 like 31.
|
|
.word 000020, 000200, -60., cp0000, 000400, 004000 ; 0704 like 4.
|
|
.word 000020, 000200, -65., cp0000, 000010, 000100 ; 0677 like -1.
|
|
.word 100020, 000200, 0., cpn000, 100020, 000200
|
|
.word 100020, 000200, 1., cp00vc, 000040, 000400 ; sign! C=1
|
|
.word 100020, 000200, 10., cp00v0, 040002, 000000 ; sign!
|
|
.word 100020, 000200, 11., cpn0v0, 100004, 000000 ; sign!
|
|
.word 100020, 000200, 12., cp00vc, 000010, 000000 ; sign! C=1
|
|
.word 100020, 000200, 13., cp00v0, 000020, 000000 ; sign!
|
|
.word 100020, 000200, -1., cpn000, 140010, 000100
|
|
.word 100020, 000200, -4., cpn000, 174001, 000010
|
|
.word 100020, 000200, -5., cpn000, 176000, 100004
|
|
.word 100020, 000200, -7., cpn000, 177400, 020001
|
|
.word 100020, 000200, -8., cpn00c, 177600, 010000 ; C=1
|
|
.word 100020, 000200, -9., cpn000, 177700, 004000
|
|
.word 100020, 000200, -15., cpn000, 177777, 000040
|
|
.word 100020, 000200, -16., cpn000, 177777, 100020
|
|
.word 100020, 000200, -20., cpn000, 177777, 174001
|
|
.word 100020, 000200, -21., cpn00c, 177777, 176000 ; C=1
|
|
.word 100020, 000200, -22., cpn000, 177777, 177000
|
|
.word 100020, 000200, -30., cpn000, 177777, 177776
|
|
.word 100020, 000200, -31., cpn000, 177777, 177777
|
|
.word 100020, 000200, -32., cpn00c, 177777, 177777 ; C=1
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test D1.1
|
|
;
|
|
; Test D1.2 -- ashc odd register ++++++++++++++++++++++++++++++++++++
|
|
; Note: ashc has very non-obvious cc semantics because the non visible
|
|
; upper half plays a role. see 'h:' in data below
|
|
;
|
|
td0102: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
clr r0 ; for tmu optics
|
|
100$: mov (r4)+,r1 ; load src
|
|
ashc (r4)+,r1 ; ashc
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r1 ; check res
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
; src, shift, psw, res ;
|
|
1000$: .word 000000, 0., cp0z00, 000000 ; h: 000000
|
|
.word 002010, 0., cp0000, 002010 ; h: 002010
|
|
.word 002010, 1., cp0000, 004020 ; h: 004020
|
|
.word 002010, 4., cp0000, 040200 ; h: 040200
|
|
.word 002010, 5., cpn0v0, 100400 ; sign! h: 100400
|
|
.word 002010, 6., cp00vc, 001000 ; sign! C=1 h: 001001
|
|
.word 002010, 7., cp00v0, 002000 ; sign! h: 002002
|
|
.word 002010, 11., cp00v0, 040000 ; sign! h: 040004
|
|
.word 002010, 12., cpn0v0, 100000 ; sign! h: 100100
|
|
.word 002010, 13., cp00vc, 000000 ; sign! C=1 Z=0! h: 000201
|
|
.word 002010, 14., cp00v0, 000000 ; sign! Z=0! h: 000402
|
|
.word 002010, 20., cp00v0, 000000 ; sign! Z=0! h: 040200
|
|
.word 002010, 21., cpn0v0, 000000 ; sign! N=1! Z=0! h: 100400
|
|
.word 002010, 22., cp00vc, 000000 ; sign! C=1! Z=0! h: 001000
|
|
.word 002010, 23., cp00v0, 000000 ; sign! Z=0! h: 002000
|
|
.word 002010, 27., cp00v0, 000000 ; sign! Z=0! h: 040000
|
|
.word 002010, 28., cpn0v0, 000000 ; sign! N=1! Z=0! h: 100000
|
|
.word 002010, 29., cp0zvc, 000000 ; sign! h: 000000
|
|
.word 002010, 30., cp0zv0, 000000 ; sign! h: 000000
|
|
.word 002010, -1., cp0000, 001004 ; h: 001004
|
|
.word 002010, -3., cp0000, 000201 ; h: 000201
|
|
.word 002010, -4., cp000c, 100100 ; C=1 N=0! h: 000100
|
|
.word 002010, -5., cp0000, 040040 ; h: 000040
|
|
.word 002010, -10., cp0000, 001001 ; h: 000001
|
|
.word 002010, -11., cp000c, 100400 ; C=1 N=0! h: 000000
|
|
.word 002010, -12., cp0000, 040200 ; h: 000000
|
|
.word 002010, -15., cp0000, 004020 ; h: 000000
|
|
.word 002010, -16., cp0000, 002010 ; h: 000000
|
|
.word 002010, -19., cp0000, 000201 ; h: 000000
|
|
.word 002010, -20., cp000c, 000100 ; C=1 !no rol! h: 000000
|
|
.word 002010, -21., cp0000, 000040 ; h: 000000
|
|
.word 002010, -26., cp0000, 000001 ; h: 000000
|
|
.word 002010, -27., cp0z0c, 000000 ; C=1 Z=1 h: 000000
|
|
.word 002010, -28., cp0z00, 000000 ; Z=1 h: 000000
|
|
.word 102010, 0., cpn000, 102010 ; h: 102010
|
|
.word 102010, -1., cpn000, 041004 ; N=1! h: 141004
|
|
.word 102010, -3., cpn000, 010201 ; N=1! h: 170201
|
|
.word 102010, -4., cpn00c, 104100 ; C=1 N=1! h: 174100
|
|
.word 102010, -5., cpn000, 042040 ; N=1! h: 176040
|
|
.word 102010, -10., cpn000, 001041 ; N=1! h: 177741
|
|
.word 102010, -11., cpn00c, 100420 ; C=1 N=1! h: 177760
|
|
.word 102010, -12., cpn000, 040210 ; N=1! h: 177770
|
|
.word 102010, -15., cpn000, 004021 ; N=1! h: 177777
|
|
.word 102010, -16., cpn00c, 102010 ; C=1 h: 177777
|
|
.word 102010, -17., cpn000, 141004 ; h: 177777
|
|
.word 102010, -19., cpn000, 170201 ; h: 177777
|
|
.word 102010, -20., cpn00c, 174100 ; C=1 h: 177777
|
|
.word 102010, -21., cpn000, 176040 ; h: 177777
|
|
.word 102010, -26., cpn000, 177741 ; h: 177777
|
|
.word 102010, -27., cpn00c, 177760 ; C=1 h: 177777
|
|
.word 102010, -28., cpn000, 177770 ; h: 177777
|
|
.word 102010, -31., cpn000, 177777 ; h: 177777
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test D1.2
|
|
;
|
|
; Section E: xor =============================================================
|
|
; This section verifies
|
|
; x xxx xxx xxx xxx xxx NZVC Instruction / Remark
|
|
; 0 111 100 rrr ddd ddd NZ0- XOR
|
|
;
|
|
; E1.1 xor znvc=0
|
|
; E1.2 xor znvc=1
|
|
;
|
|
; Test E1.1 -- xor znvc=0 ++++++++++++++++++++++++++++++++++++++++++++
|
|
; check xor with all ccs cleared; memory destination
|
|
;
|
|
te0101: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
mov #200$,r1 ; setup dst pointer
|
|
100$: mov (r4)+,r0 ; load src
|
|
mov (r4)+,(r1) ; load dst
|
|
ccc ; nzvc=0
|
|
xor r0,(r1) ; xor
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,(r1) ; check
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
200$: .word 0
|
|
;
|
|
; dst, src, psw, res
|
|
1000$: .word 000000, 000000, cp0z00, 000000
|
|
.word 000011, 000000, cp0000, 000011
|
|
.word 000011, 000110, cp0000, 000101
|
|
.word 000011, 001100, cp0000, 001111
|
|
.word 110000, 011000, cpn000, 101000
|
|
.word 110000, 110000, cp0z00, 000000
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test E1.1
|
|
;
|
|
; Test E1.2 -- xor znvc=1 ++++++++++++++++++++++++++++++++++++++++++++
|
|
; check xor with all ccs set; register destination
|
|
;
|
|
te0102: mov #1000$,r4 ; setup data pointer
|
|
mov #1010$,r5 ; setup end pointer
|
|
mov #cp.psw,r3 ; setup psw pointer
|
|
100$: mov (r4)+,r0 ; load src
|
|
mov (r4)+,r1 ; load dst
|
|
scc ; nzvc=1
|
|
xor r0,r1 ; xor
|
|
hcmpeq (r4)+,(r3) ; check psw
|
|
hcmpeq (r4)+,r1 ; check
|
|
cmp r4,r5
|
|
blo 100$
|
|
jmp 9999$
|
|
;
|
|
; dst, src, psw, res
|
|
1000$: .word 000000, 000000, cp0z0c, 000000
|
|
.word 000011, 000000, cp000c, 000011
|
|
.word 000011, 000110, cp000c, 000101
|
|
.word 000011, 001100, cp000c, 001111
|
|
.word 110000, 011000, cpn00c, 101000
|
|
.word 110000, 110000, cp0z0c, 000000
|
|
1010$:
|
|
;
|
|
9999$: iot ; end of test E1.2
|
|
;
|
|
; END OF ALL TESTS - loop closure ============================================
|
|
;
|
|
mov tstno,r0 ; hack, for easy monitoring ...
|
|
hcmpeq tstno,#10. ; all tests done ?
|
|
;
|
|
jmp loop
|
|
;
|
|
.end start
|