URL
https://opencores.org/ocsvn/w11/w11/trunk
Subversion Repositories w11
Compare Revisions
- This comparison shows the changes necessary to convert path
/w11
- from Rev 31 to Rev 30
- ↔ Reverse comparison
Rev 31 → Rev 30
/trunk/tools/asm-11/lib/defs_tm.mac
File deleted
/trunk/tools/tcl/ibd_tm11/.cvsignore
File deleted
/trunk/tools/tcl/ibd_tm11/util.tcl
File deleted
trunk/tools/tcl/ibd_tm11
Property changes :
Deleted: svn:ignore
## -1,34 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
-pkgIndex.tcl
Index: trunk/tools/tcl/rw11/tbench.tcl
===================================================================
--- trunk/tools/tcl/rw11/tbench.tcl (revision 31)
+++ trunk/tools/tcl/rw11/tbench.tcl (revision 30)
@@ -1,4 +1,4 @@
-# $Id: tbench.tcl 683 2015-05-17 21:54:35Z mueller $
+# $Id: tbench.tcl 676 2015-05-09 16:31:54Z mueller $
#
# Copyright 2013-2015 by Walter F.J. Mueller
#
@@ -13,7 +13,6 @@
#
# Revision History:
# Date Rev Version Comment
-# 2015-05-17 683 2.2 support sub directories and return in tests
# 2015-05-09 676 2.1 use 'rlc log -bare' instead of 'puts'
# 2014-11-30 607 2.0 use new rlink v4 iface
# 2013-04-26 510 1.0 Initial version (extracted from util.tcl)
@@ -29,16 +28,9 @@
#
# tbench: driver for tbench scripts
#
- proc tbench {tname} {
- set fname $tname
- set tbase "."
- if {[string match "@*" $tname]} {
- set fname [string range $tname 1 end]
- }
- if {![file exists $fname]} {set tbase "$::env(RETROBASE)/tools/tbench"}
-
+ proc tbench {fname} {
rlink::anena 1; # enable attn notify
- set errcnt [tbench_list $tname $tbase]
+ set errcnt [tbench_list $fname]
return $errcnt
}
@@ -45,46 +37,25 @@
#
# tbench_file: execute list of tbench steps
#
- proc tbench_list {tname tbase} {
+ proc tbench_list {lname} {
set errcnt 0
-
- set rname $tname
- set islist 0
- if {[string match "@*" $tname]} {
- set islist 1
- set rname [string range $tname 1 end]
- }
-
- set dname [file dirname $rname]
- set fname [file tail $rname]
- if {$dname ne "."} {
- set tbase [file join $tbase $dname]
- }
-
- if {![file readable "$tbase/$fname"]} {
- error "-E: file $tbase/$fname not found or readable"
- }
-
- if {$islist} {
- set fh [open "$tbase/$fname"]
+ if {[string match "@*" $lname]} {
+ set fname [string range $lname 1 end]
+ set fh [open "$::env(RETROBASE)/tools/tbench/$fname"]
while {[gets $fh line] >= 0} {
if {[string match "#*" $line]} {
if {[string match "##*" $line]} { rlc log -bare $line }
} elseif {[string match "@*" $line]} {
- incr errcnt [tbench_list $line $tbase]
+ incr errcnt [tbench_list $line]
} else {
- incr errcnt [tbench_step $line $tbase]
+ incr errcnt [tbench_step $line]
}
}
close $fh
-
} else {
- incr errcnt [tbench_step $fname $tbase]
+ incr errcnt [tbench_step $lname]
}
-
- if {$islist} {
- rlc log -bare [format "%s: %s" $tname [rutil::errcnt2txt $errcnt]]
- }
+ rlc log -bare [format "%s: %s" $lname [rutil::errcnt2txt $errcnt]]
return $errcnt
}
@@ -91,35 +62,11 @@
#
# tbench_step: execute single tbench step
#
- proc tbench_step {fname tbase} {
- if {![file readable "$tbase/$fname"]} {
- error "-E: file $tbase/$fname not found or readable"
- }
-
- # cleanup any remaining temporary procs with names tmpproc_*
- foreach pname [info procs tmpproc_*] { rename $pname "" }
-
+ proc tbench_step {fname} {
rlc errcnt -clear
- set cpu "cpu0"
- set ecode [catch "source $tbase/$fname" resmsg]
+ set cpu cpu0
+ source "$::env(RETROBASE)/tools/tbench/$fname"
set errcnt [rlc errcnt]
-
- switch $ecode {
- 0 {}
- 1 { puts "-E: test execution FAILED with error message:"
- if {[info exists errorInfo]} {puts $errorInfo} else {puts $resmsg}
- incr errcnt
- }
- 2 { puts "-I: test ended by return: $resmsg"}
- default {
- puts "-E: test execution FAILED with catch code $ecode"
- incr errcnt
- }
- }
-
- # remove temporary procs with names tmpproc_*
- foreach pname [info procs tmpproc_*] { rename $pname "" }
-
rlc log -bare [format "%s: %s" $fname [rutil::errcnt2txt $errcnt]]
return $errcnt
}
/trunk/tools/tcl/rw11/util.tcl
1,4 → 1,4
# $Id: util.tcl 683 2015-05-17 21:54:35Z mueller $ |
# $Id: util.tcl 675 2015-05-08 21:05:08Z mueller $ |
# |
# Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
# |
13,8 → 13,6
# |
# Revision History: |
# Date Rev Version Comment |
# 2015-05-17 683 1.3.4 setup_sys: add TM11 |
# 2015-05-15 682 1.3.3 BUGFIX: setup_cpu: fix cpu reset (now -stop -creset) |
# 2015-05-08 675 1.3.2 w11a start/stop/suspend overhaul |
# 2015-03-28 660 1.3.1 add setup_cntl |
# 2015-03-21 659 1.3 setup_sys: add RPRM (later renamed to RHRP) |
54,7 → 52,7
rlc set basestat 2 |
rlink::setup; # basic rlink defs |
rw11 rlw rls w11a 1; # create 1 w11a cpu |
cpu0 cp -stop -creset; # stop and reset CPU |
cpu0 cp -creset; # reset CPU |
return "" |
} |
|
70,7 → 68,6
cpu0 add rk11 |
cpu0 add rl11 |
cpu0 add rhrp |
cpu0 add tm11 |
cpu0 add lp11 |
cpu0 add pc11 |
rlw start |
/trunk/tools/tcl/setup_packages
1,5 → 1,5
#! /usr/bin/env tclshcpp |
# $Id: setup_packages 683 2015-05-17 21:54:35Z mueller $ |
# $Id: setup_packages 668 2015-04-25 14:31:19Z mueller $ |
# |
pkg_mkIndex -verbose ../lib \ |
librlinktpp.so \ |
19,6 → 19,5
# |
pkg_mkIndex -verbose ibd_ibmon *.tcl |
pkg_mkIndex -verbose ibd_rhrp *.tcl |
pkg_mkIndex -verbose ibd_tm11 *.tcl |
# |
pkg_mkIndex -verbose tst_rlink *.tcl |
/trunk/tools/tbench/all.dat
File deleted
/trunk/tools/tbench/cp/cp_all.dat
File deleted
/trunk/tools/tbench/cp/test_cp_ibrbasics.tcl
File deleted
/trunk/tools/tbench/cp/test_cp_membasics.tcl
File deleted
/trunk/tools/tbench/cp/test_cp_gpr.tcl
File deleted
/trunk/tools/tbench/cp/test_cp_psw.tcl
File deleted
/trunk/tools/tbench/cp/test_cp_cpubasics.tcl
File deleted
trunk/tools/tbench/cp
Property changes :
Deleted: svn:ignore
## -1,33 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
Index: trunk/tools/tbench/rhrp/rhrp_all.dat
===================================================================
--- trunk/tools/tbench/rhrp/rhrp_all.dat (revision 31)
+++ trunk/tools/tbench/rhrp/rhrp_all.dat (nonexistent)
@@ -1,8 +0,0 @@
-# $Id: rhrp_all.dat 683 2015-05-17 21:54:35Z mueller $
-#
-## steering file for all rhrp tests
-#
-test_rhrp_basics.tcl
-test_rhrp_regs.tcl
-test_rhrp_func_reg.tcl
-test_rhrp_int.tcl
Index: trunk/tools/tbench/rhrp/test_rhrp_regs.tcl
===================================================================
--- trunk/tools/tbench/rhrp/test_rhrp_regs.tcl (revision 31)
+++ trunk/tools/tbench/rhrp/test_rhrp_regs.tcl (nonexistent)
@@ -1,426 +0,0 @@
-# $Id: test_rhrp_regs.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-03-29 660 1.0 Initial version
-#
-# Test register response
-# A: test ba, bae, cs1.bae, wc and db (cntl regs)
-# B: test da, dc (and cc for RP typ)
-# C: test of,mr1,mr2(for RM typ); test NI regs: er2,er3,ec1,ec2
-# D: test hr (for RM typ); ensure unit distinct
-# E: test cs2.clr
-# F: test er1
-
-# ----------------------------------------------------------------------------
-rlc log "test_rhrp_regs: test register response ------------------------------"
-rlc log " setup context; unit 0:RP06, 1:RM05, 2: RP07, 3: off"
-package require ibd_rhrp
-ibd_rhrp::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-# configure drives
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
-
-# clear errors: cs1.tre=1 via unit 0
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre]
-
-# -- Section A ---------------------------------------------------------------
-rlc log " A1: test ba,bae and cs1.bae -------------------------------"
-rlc log " A1.1: loc write ba, read loc and rem ---------------"
-
-$cpu cp -wma rpa.ba 0xffff \
- -rma rpa.ba -edata 0xfffe \
- -ribr rpa.ba -edata 0xfffe \
- -wma rpa.ba 0x0 \
- -rma rpa.ba -edata 0x0 \
- -ribr rpa.ba -edata 0x0
-
-rlc log " A1.2: rem write ba, read loc and rem ---------------"
-
-$cpu cp -wibr rpa.ba 0x12ef \
- -ribr rpa.ba -edata 0x12ee \
- -rma rpa.ba -edata 0x12ee \
- -wibr rpa.ba 0x0 \
- -ribr rpa.ba -edata 0x0 \
- -rma rpa.ba -edata 0x0
-
-rlc log " A1.3: loc write bae, read l+r bae+cs1.bae ----------"
-
-set cs1msk [regbld ibd_rhrp::CS1 {bae -1}]
-foreach bae {077 071 000} {
- set cs1val [regbld ibd_rhrp::CS1 [list bae [expr {$bae & 03}]]]
- $cpu cp -wma rpa.bae $bae \
- -rma rpa.bae -edata $bae \
- -rma rpa.cs1 -edata $cs1val $cs1msk \
- -ribr rpa.bae -edata $bae \
- -ribr rpa.cs1 -edata $cs1val $cs1msk
-}
-
-rlc log " A1.4: rem write bae, read l+r bae+cs1.bae ----------"
-
-foreach bae {077 071 000} {
- set cs1val [regbld ibd_rhrp::CS1 [list bae [expr {$bae & 03}]]]
- $cpu cp -wibr rpa.bae $bae \
- -ribr rpa.bae -edata $bae \
- -ribr rpa.cs1 -edata $cs1val $cs1msk \
- -rma rpa.bae -edata $bae \
- -rma rpa.cs1 -edata $cs1val $cs1msk
-}
-
-rlc log " A1.5: loc write cs1.bae, read l+r bae+cs1.bae ------"
-
-$cpu cp -wibr rpa.bae 070; # set 3 lbs of bae
-
-foreach cs1bae {03 01 00} {
- set cs1val [regbld ibd_rhrp::CS1 [list bae $cs1bae]]
- set bae [expr {070 | $cs1bae}]
- $cpu cp -wma rpa.cs1 $cs1val \
- -rma rpa.bae -edata $bae \
- -rma rpa.cs1 -edata $cs1val $cs1msk \
- -ribr rpa.bae -edata $bae \
- -ribr rpa.cs1 -edata $cs1val $cs1msk
-}
-
-# Note: cs1.bae can only be loc written !
-# No need to do this via rem, use bae !!
-# therefore no 'rem write cs1.bae' test
-
-rlc log " A1.6: loc write cs1.func, read loc, ensure distinct "
-
-set funcu0 [regbld ibd_rhrp::CS1 {func 001}]
-set funcu1 [regbld ibd_rhrp::CS1 {func 025}]
-set funcu2 [regbld ibd_rhrp::CS1 {func 037}]
-set funcmsk [regbld ibd_rhrp::CS1 {func -1}]
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 $funcu0 \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.cs1 $funcu1 \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.cs1 $funcu2
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.cs1 -edata $funcu0 $funcmsk \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.cs1 -edata $funcu1 $funcmsk \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.cs1 -edata $funcu2 $funcmsk
-
-# Note: rem read of cs1.func always gives func frozen a go for xfer function !
-# therefore no rem read cs1.func test here
-
-rlc log " A2: test wc; ensure wc,ba distinct ------------------------"
-rlc log " A2.1: loc write wc,ba, read loc and rem ------------"
-
-foreach {wc ba} {0xdead 0x1234 0xbeaf 0x5678} {
- $cpu cp -wma rpa.wc $wc \
- -wma rpa.ba $ba \
- -rma rpa.wc -edata $wc \
- -rma rpa.ba -edata $ba \
- -ribr rpa.wc -edata $wc \
- -ribr rpa.ba -edata $ba
-}
-
-rlc log " A2.2: rem write wc,ba, read loc and rem ------------"
-
-foreach {wc ba} {0x4321 0x3456 0x5432 0x1234} {
- $cpu cp -wibr rpa.wc $wc \
- -wibr rpa.ba $ba \
- -ribr rpa.wc -edata $wc \
- -ribr rpa.ba -edata $ba \
- -rma rpa.wc -edata $wc \
- -rma rpa.ba -edata $ba
-}
-
-rlc log " A3: test db; check cs2.or,ir; ensure ba,dt distinct --"
-
-set cs2msk [regbld ibd_rhrp::CS2 or ir {unit -1}]
-set cs2val [regbld ibd_rhrp::CS2 or ir {unit 0}]
-
-# clear cs2 -> set unit 0; later check that or,ir set, and unit 0
-# only loc tested; rem side irrelevant
-foreach {db ba} {0xdead 0x1234 0xbeaf 0x5678} {
- $cpu cp -wma rpa.cs2 0 \
- -wma rpa.db $db \
- -wma rpa.ba $ba \
- -rma rpa.cs2 -edata $cs2val $cs2msk \
- -rma rpa.db -edata $db \
- -rma rpa.ba -edata $ba
-}
-
-# -- Section B ---------------------------------------------------------------
-rlc log " B1: test da,dc; ensure unit distinct; check cc ------------"
-
-# define tmpproc for readback checks
-proc tmpproc_checkdadc {cpu tbl} {
- foreach {unit ta sa dc} $tbl {
- set da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]]
- $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
- -rma rpa.da -edata $da \
- -rma rpa.dc -edata $dc \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
- -ribr rpa.da -edata $da \
- -ribr rpa.dc -edata $dc
- }
-}
-
-rlc log " B1.1: loc setup ------------------------------------"
-
-# unit ta sa dc
-# 5b 6b 10b
-set tbl { 0 007 006 00123 \
- 1 013 031 00345 \
- 2 037 077 01777
- }
-
-foreach {unit ta sa dc} $tbl {
- $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
- -wma rpa.da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]] \
- -wma rpa.dc $dc
-}
-
-rlc log " B1.2: loc+rem readback -----------------------------"
-tmpproc_checkdadc $cpu $tbl
-
-rlc log " B1.3: check cc for unit 0 (RP06) -------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.m13 -edata 00123
-
-rlc log " B1.4: rem setup ------------------------------------"
-
-# unit ta sa dc
-# 5b 6b 10b
-set tbl { 0 005 004 00234 \
- 1 020 077 00456 \
- 2 032 023 01070
- }
-
-foreach {unit ta sa dc} $tbl {
- $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
- -wibr rpa.da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]] \
- -wibr rpa.dc $dc
-}
-
-rlc log " B1.5: loc+rem readback -----------------------------"
-tmpproc_checkdadc $cpu $tbl
-
-rlc log " B1.6: check cc for unit 0 (RP06) -------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.m13 -edata 00234
-
-# -- Section C ---------------------------------------------------------------
-rlc log " C1: test of,mr1,mr2(for RM typ); test NI regs: er2,er3,ec1,ec2"
-
-# test fmt,eci,hci flags (NI, but stored), also off for RP
-set of_0 [regbld ibd_rhrp::OF fmt {odi 1} {off -1}]
-set of_1 [regbld ibd_rhrp::OF eci {odi 0}]
-set of_2 [regbld ibd_rhrp::OF hci {odi 0}]
-
-set mr1_0 0x7700
-set mr1_1 0x7701
-set mr1_2 0x7702
-
-set mr2_1 0x6601
-set mr2_2 0x6602
-
-set da_0 [regbld ibd_rhrp::DA {ta 010} {sa 022}]
-set da_1 [regbld ibd_rhrp::DA {ta 011} {sa 021}]
-set da_2 [regbld ibd_rhrp::DA {ta 012} {sa 020}]
-
-set dc_0 0x40
-set dc_1 0x41
-set dc_2 0x42
-
-rlc log " C1.1: loc write da,mr1,of,dc (mr2 for RM) ----------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.da $da_0 \
- -wma rpa.mr1 $mr1_0 \
- -wma rpa.of $of_0 \
- -wma rpa.dc $dc_0
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.da $da_1 \
- -wma rpa.mr1 $mr1_1 \
- -wma rpa.of $of_1 \
- -wma rpa.dc $dc_1 \
- -wma rpa.m14 $mr2_1
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.da $da_2 \
- -wma rpa.mr1 $mr1_2 \
- -wma rpa.of $of_2 \
- -wma rpa.dc $dc_2 \
- -wma rpa.m14 $mr2_2
-
-rlc log " C1.2: loc read da,mr1,of,dc (mr2 for RM) -----------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.da -edata $da_0 \
- -rma rpa.mr1 -edata $mr1_0 \
- -rma rpa.of -edata $of_0 \
- -rma rpa.dc -edata $dc_0
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.da -edata $da_1 \
- -rma rpa.mr1 -edata $mr1_1 \
- -rma rpa.of -edata $of_1 \
- -rma rpa.dc -edata $dc_1 \
- -rma rpa.m14 -edata $mr2_1
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.da -edata $da_2 \
- -rma rpa.mr1 -edata $mr1_2 \
- -rma rpa.of -edata $of_2 \
- -rma rpa.dc -edata $dc_2 \
- -rma rpa.m14 -edata $mr2_2
-
-rlc log " C2.1: loc write er2,er3,ec1,ec2 --------------------"
-
-# unit 0: RP typ -> m14 is er2; m15 is er3
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.m14 0xaa00 \
- -wma rpa.m15 0xaa10 \
- -wma rpa.ec1 0xaa20 \
- -wma rpa.ec1 0xaa30
-
-# unit 1+2: RM typ -> m15 is er2
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.m15 0xaa11 \
- -wma rpa.ec1 0xaa21 \
- -wma rpa.ec1 0xaa31
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.m15 0xaa12 \
- -wma rpa.ec1 0xaa22 \
- -wma rpa.ec1 0xaa32
-
-rlc log " C2.1: loc read er2,er3,ec1,ec2 (NI -> =0!) ---------"
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.m14 -edata 0x0 \
- -rma rpa.m15 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.m15 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.m15 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0 \
- -rma rpa.ec1 -edata 0x0
-
-# -- Section D ---------------------------------------------------------------
-rlc log " D1: test hr (for RM typ); ensure unit distinct ------------"
-
-# test unit 1+2, they are RM typ (RM05 and RP07)
-
-set da [regbld ibd_rhrp::DA {ta 005} {sa 023}]; # some da
-set dc 00456; # some dc
-
-rlc log " D1.1: write da(1) and dc(2) ------------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.da $da \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.da $dc
-
-rlc log " D1.2: check hr(1) and hr(2) ------------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.m13 -edata [rutil::com16 $da] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.m13 -edata [rutil::com16 $dc]
-
-rlc log " D1.3: write da(2) and dc(1) ------------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.da $da \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.da $dc
-
-rlc log " D1.4: check hr(1) and hr(2) ------------------------"
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.m13 -edata [rutil::com16 $dc] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.m13 -edata [rutil::com16 $da]
-
-# FIXME: add code to check hr response for all mb reg writes
-
-# -- Section E ---------------------------------------------------------------
-rlc log " E1: test rem er1 write; clear via func=dclr ---------------"
-rlc log " E1.1: rem er1 set uns,iae,aoe,ilf; loc readback ----"
-
-set er1msk [regbld ibd_rhrp::ER1 uns iae aoe ilf]
-
-# use unit 1
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}]
-
-$cpu cp -rma rpa.er1 -edata 0x0 \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 uns] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns] $er1msk \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 iae] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae] $er1msk \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 aoe] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae aoe] $er1msk \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 ilf] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae aoe ilf] $er1msk
-
-rlc log " E1.2: clear er1 via func=dclr ----------------------"
-
-$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -rma rpa.er1 -edata 0x0
-
-rlc log " E1.3: rem er1 set in different units ---------------"
-
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 iae] \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 aoe] \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
- -wibr rpa.er1 [regbld ibd_rhrp::ER1 ilf]
-
-rlc log " E1.4: loc readback, show er1 is distinct -----------"
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 iae] $er1msk \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 aoe] $er1msk \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] $er1msk
-
-rlc log " E1.5: show func=dclr distinct ----------------------"
-
-# clear unit 1, that that 1 clr and 0+2 untouched
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 iae] $er1msk \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma rpa.er1 -edata 0x0 \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] $er1msk
-
-rlc log " E1.6: clear er1 in remaining units -----------------"
-
-# unit 0+2 still have er1 bits set from previous test
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -rma rpa.er1 -edata 0x0 \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -rma rpa.er1 -edata 0x0
Index: trunk/tools/tbench/rhrp/test_rhrp_basics.tcl
===================================================================
--- trunk/tools/tbench/rhrp/test_rhrp_basics.tcl (revision 31)
+++ trunk/tools/tbench/rhrp/test_rhrp_basics.tcl (nonexistent)
@@ -1,200 +0,0 @@
-# $Id: test_rhrp_basics.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-03-29 660 1.0 Initial version
-#
-# Test basic access
-# 1. ibus/rbus ack (for cs1:cs3) and no ack (cs3+2)
-# 2. unit enable/disable and cs2.ned response
-# 3. drive type logic
-# 4. readability of all regs (enabled and diabled unit, check cs2.ned)
-
-# ----------------------------------------------------------------------------
-rlc log "test_rhrp_basics: basic access tests --------------------------------"
-rlc log " setup context"
-package require ibd_rhrp
-ibd_rhrp::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-rlc log " A1: test that cs1,cs3 give ack, cs3+2 gives no ack --------"
-
-set iaddrfail [expr {[cpu0 imap rpa.cs3] + 2}]
-
-rlc log " A1.1: rem read cs1,cs3,cs3+1 -----------------------"
-
-$cpu cp -ribr rpa.cs1 \
- -ribr rpa.cs3 \
- -ribr $iaddrfail -estaterr
-
-rlc log " A1.2: loc read cs1,cs3,cs3+1 -----------------------"
-
-$cpu cp -rma rpa.cs1 \
- -rma rpa.cs3 \
- -rma $iaddrfail -estaterr
-
-rlc log " A2: test unit enable, dt and cs2.ned ----------------------"
-rlc log " A2.1: disable unit 0 -------------------------------"
-
-#
-# select rem and loc unit 0; disable unit
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}]
-
-rlc log " A2.2: check dt read and cs2.ned --------------------"
-set cs2ned [regbld ibd_rhrp::CS2 ned]
-$cpu cp -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -rma rpa.dt \
- -rma rpa.cs2 -edata $cs2ned $cs2ned
-
-rlc log " A2.3: enable unit 0 as RP06; check cs2.ned, dt -----"
-
-# check for cs2.ned=0 response on dt read (after cs1.tre=1)
-# unit 0 selected rem and loc from previous section
-$cpu cp -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -rma rpa.dt -edata $ibd_rhrp::DT_RP06 \
- -rma rpa.cs2 -edata 0 $cs2ned
-
-rlc log " A3: set drive types, check proper dt response -------------"
-
-# dte dt
-set tbl [list $ibd_rhrp::DTE_RP04 $ibd_rhrp::DT_RP04 \
- $ibd_rhrp::DTE_RP06 $ibd_rhrp::DT_RP06 \
- $ibd_rhrp::DTE_RM04 $ibd_rhrp::DT_RM04 \
- $ibd_rhrp::DTE_RM80 $ibd_rhrp::DT_RM80 \
- $ibd_rhrp::DTE_RM05 $ibd_rhrp::DT_RM05 \
- $ibd_rhrp::DTE_RP07 $ibd_rhrp::DT_RP07 ]
-
-# unit 0 enabled and selected rem and loc from previous section
-foreach {dte dt} $tbl {
- $cpu cp -wibr rpa.dt $dte \
- -ribr rpa.dt -edata $dte \
- -rma rpa.dt -edata $dt
-}
-
-rlc log " A4: check unit selection and that units are distinct ------"
-
-rlc log " A4.1: setup units: 0: RP04 1:off 2:RP06 3:off ------"
-
-# unit dpr dte dt
-set tbl [list 0 1 $ibd_rhrp::DTE_RP04 $ibd_rhrp::DT_RP04 \
- 1 0 0 0 \
- 2 1 $ibd_rhrp::DTE_RP06 $ibd_rhrp::DT_RP06 \
- 3 0 0 0]
-
-foreach {unit dpr dte dt} $tbl {
- $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
- -wibr rpa.ds [regbld ibd_rhrp::DS [list dpr $dpr]] \
- -wibr rpa.dt $dte
-}
-
-rlc log " A4.2: readback dt rem and loc; check cs2.ned -------"
-
-set dsmsk [regbld ibd_rhrp::DS dpr]
-set cs2msk [regbld ibd_rhrp::CS2 ned {unit 3}]
-foreach {unit dpr dte dt} $tbl {
- set dsval [regbld ibd_rhrp::DS [list dpr $dpr]]
- set cs2val [regbld ibd_rhrp::CS2 [list ned [expr {1-$dpr}]] [list unit $unit]]
- $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
- -ribr rpa.ds -edata $dsval $dsmsk \
- -ribr rpa.dt -edata $dte \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -rma rpa.dt -edata $dt \
- -rma rpa.cs2 -edata $cs2val $cs2msk
-}
-
-rlc log " A5: check cs2.ned for all regs on disabled unit -----------"
-
-# use setting from last section: drive 0 on, drive 1 off
-# addr mb
-set tbl [list rpa.cs1 1 \
- rpa.wc 0 \
- rpa.ba 0 \
- rpa.da 1 \
- rpa.cs2 0 \
- rpa.ds 1 \
- rpa.er1 1 \
- rpa.as 1 \
- rpa.la 1 \
- rpa.db 0 \
- rpa.mr1 1 \
- rpa.dt 1 \
- rpa.sn 1 \
- rpa.of 1 \
- rpa.dc 1 \
- rpa.m13 1 \
- rpa.m14 1 \
- rpa.m15 1 \
- rpa.ec1 1 \
- rpa.ec2 1 \
- rpa.bae 0 \
- rpa.cs3 0 \
- ]
-
-# Note: First unit 1 (enabled) selected, and cs1.tre=1 done
-# Than unit 1 (disabled) selected, and registered read
-# This ensures that cs2.ned is really cleared, because a cs1.tre=1
-# write while a disabled drive is selected will clear and set ned !!
-set cs2msk [regbld ibd_rhrp::CS2 ned {unit -1}]
-foreach {addr mb} $tbl {
- set cs2val [regbld ibd_rhrp::CS2 [list ned $mb] {unit 1}]
- $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
- -rma $addr \
- -rma rpa.cs2 -edata $cs2val $cs2msk
-}
-
-rlc log " A6: check cs2.ned for all regs on enable unit -------------"
-
-# select drive 0 (on); cs1.tre=1; read all regs; check cs2 at end once (sticky)
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit 0]] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -rma rpa.cs1 \
- -rma rpa.wc \
- -rma rpa.ba \
- -rma rpa.da
-
-$cpu cp -rma rpa.cs2 \
- -rma rpa.ds \
- -rma rpa.er1 \
- -rma rpa.as \
- -rma rpa.la \
- -rma rpa.db \
- -rma rpa.mr1
-
-$cpu cp -rma rpa.dt \
- -rma rpa.sn \
- -rma rpa.of \
- -rma rpa.dc \
- -rma rpa.m13 \
- -rma rpa.m14 \
- -rma rpa.m15
-
-$cpu cp -rma rpa.ec1 \
- -rma rpa.ec2 \
- -rma rpa.bae \
- -rma rpa.cs3 \
- -rma rpa.cs2 -edata 0 [regbld ibd_rhrp::CS2 ned]
-
-rlc log " A7: check that unit 3-7 are loc selectable, but off -------"
-rlc log " A7.1: loc read dt for unit 3-7 ; check cs2.unit+ned"
-
-set cs2msk [regbld ibd_rhrp::CS2 ned {unit -1}]
-foreach {unit} {4 5 6 7} {
- set cs2val [regbld ibd_rhrp::CS2 ned [list unit $unit]]
- $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -rma rpa.dt -edata 0 \
- -rma rpa.cs2 -edata $cs2val $cs2msk
-}
-
Index: trunk/tools/tbench/rhrp/test_rhrp_func_reg.tcl
===================================================================
--- trunk/tools/tbench/rhrp/test_rhrp_func_reg.tcl (revision 31)
+++ trunk/tools/tbench/rhrp/test_rhrp_func_reg.tcl (nonexistent)
@@ -1,149 +0,0 @@
-# $Id: test_rhrp_func_reg.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-03-29 660 1.0 Initial version
-#
-# Test functions - register level
-# A:
-
-# ----------------------------------------------------------------------------
-rlc log "test_rhrp_func_reg: test functions - register level -----------------"
-rlc log " setup: unit 0:RP06(mol), 1:RM05(mol,wrl), 2: RP07(mol=0), 3: off"
-package require ibd_rhrp
-ibd_rhrp::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-# configure drives
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol wrl] \
- -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
-
-# setup system: select unit 0; clr errors (cs1.tre and func=dclr); clear ATs
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
- -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr mol dry]
-
-# -- Section A -- function basics --------------------------------------------
-rlc log " A -- function basics ----------------------------------------------"
-rlc log " A1: test cs1 func basics ----------------------------------"
-rlc log " A1.1a: func noop; check no as ----------------------"
-
-set dsmsk [regbld ibd_rhrp::DS ata dpr]
-
-$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_NOOP] \
- -rma rpa.as -edata 0x0 \
- -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr] $dsmsk
-
-rlc log " A2.1a: test invalid function (037) -----------------"
-
-$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func 037]
-
-rlc log " A2.1b: check as,er1.ilf,ds.ata; clear as; recheck --"
-
-$cpu cp -rma rpa.as -edata [regbld ibd_rhrp::AS u0] \
- -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] \
- -rma rpa.ds -edata [regbld ibd_rhrp::DS ata dpr] $dsmsk \
- -wma rpa.as [regbld ibd_rhrp::AS u0] \
- -rma rpa.as -edata 0x0 \
- -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr] $dsmsk
-
-rlc log " A2.2a: func dclr; check no as and er1 clear --------"
-
-$cpu cp -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -rma rpa.as -edata 0x0 \
- -rma rpa.er1 -edata 0x0
-
-# -- Section B -- state functions --------------------------------------------
-rlc log " B -- state functions ----------------------------------------------"
-
-# -- Section C -- seek functions ---------------------------------------------
-rlc log " C -- seek functions -----------------------------------------------"
-
-# -- Section D -- transfer functions -----------------------------------------
-rlc log " D -- transfer functions -------------------------------------------"
-rlc log " D1: test func read sequence -------------------------------"
-rlc log " D1.1: issue func with ie=0 ---------------------------"
-
-# discard pending attn to be on save side
-rlc wtlam 0.
-rlc exec -attn
-
-set attnmsk [expr {1<<$ibd_rhrp::ANUM}]
-
-set ba 0x1000
-set wc [expr {0xffff & (-256)}]
-set da [regbld ibd_rhrp::DA {ta 2} {sa 1}]
-set dc 0x0003
-
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -wma rpa.ba $ba \
- -wma rpa.bae 0x0 \
- -wma rpa.wc $wc \
- -wma rpa.da $da \
- -wma rpa.dc $dc \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_READ]
-
-rlc log " D1.2: loc status check: cs1.rdy=0, ds.dry=0 ----------"
-
-$cpu cp -rma rpa.cs1 -edata 0 [regbld ibd_rhrp::CS1 rdy] \
- -rma rpa.ds -edata 0 [regbld ibd_rhrp::DS dry]
-
-rlc log " D1.3: rem status check: attn + state -----------------"
-
-rlc exec -attn -edata $attnmsk
-
-# check rdy=0 ie=0 func=read
-set cs1val [regbld ibd_rhrp::CS1 [list func $ibd_rhrp::FUNC_READ]]
-set cs1msk [regbld ibd_rhrp::CS1 rdy ie {func -1}]
-# expect ds mol=1 dpr=1 dry=0
-set dsval [regbld ibd_rhrp::DS mol dpr]
-
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_CUNIT] \
- -ribr rpa.cs1 -edata $cs1val $cs1msk \
- -ribr rpa.ba -edata $ba \
- -ribr rpa.bae -edata 0x0 \
- -ribr rpa.wc -edata $wc \
- -ribr rpa.da -edata $da \
- -ribr rpa.dc -edata $dc \
- -ribr rpa.ds -edata $dsval
-
-rlc log " D1.4: rem send response ------------------------------"
-
-set ba [expr {0xffff & (-$wc)}]
-set da [regbld ibd_rhrp::DA {ta 2} {sa 2}]
-
-$cpu cp -wibr rpa.ba $ba \
- -wibr rpa.wc 0x0 \
- -wibr rpa.da $da \
- -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_DONE]
-
-rlc log " D1.5: loc check: cs1.rdy=1, ds.dry=1 -----------------"
-
-# expect cs1 sc=0 tre=0 dva=1 rdy=1 ie=0 func=read go=0
-set cs1val [regbld ibd_rhrp::CS1 dva rdy [list func $ibd_rhrp::FUNC_READ]]
-# expect ds ata=0 mol=1 dpr=1 dry=1
-set dsval [regbld ibd_rhrp::DS mol dpr dry]
-
-$cpu cp -rma rpa.cs1 -edata $cs1val \
- -rma rpa.ba -edata $ba \
- -rma rpa.wc -edata 0x0 \
- -rma rpa.da -edata $da \
- -rma rpa.ds -edata $dsval
Index: trunk/tools/tbench/rhrp/test_rhrp_int.tcl
===================================================================
--- trunk/tools/tbench/rhrp/test_rhrp_int.tcl (revision 31)
+++ trunk/tools/tbench/rhrp/test_rhrp_int.tcl (nonexistent)
@@ -1,490 +0,0 @@
-# $Id: test_rhrp_int.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-05-04 674 1.1 w11a start/stop/suspend overhaul
-# 2015-03-29 667 1.0 Initial version
-#
-# Test interrupt response
-# A:
-
-# ----------------------------------------------------------------------------
-rlc log "test_rhrp_int: test interrupt response ------------------------------"
-rlc log " setup: unit 0:RP06(mol), 1:RM05(mol,wrl), 2: RP07(mol=0), 3: off"
-package require ibd_rhrp
-ibd_rhrp::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-# configure drives
-$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol wrl] \
- -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
- -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
- -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
- -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
-
-# clear errors: cs1.tre=1 via unit 0
-$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
- -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
- -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
- -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
- -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr mol dry]
-
-# load test code
-$cpu ldasm -lst lst -sym sym {
- .include |lib/defs_cpu.mac|
- .include |lib/defs_rp.mac|
-;
- .include |lib/vec_cpucatch.mac|
-;
- . = 000254 ; setup RHRP interrupt vector
-v..rp: .word vh.rp
- .word cp.pr7
-;
- . = 1000 ; data area
-stack:
-ibuf: .blkw 4. ; input buffer
-rint: .word 0 ; reinterrupt
-;
-icnt: .word 0 ; interrupt count
-pcnt: .word 0 ; poll count
-obuf: .blkw 6. ; output buffer
-fbuf: .blkw 5. ; final buffer
-;
- . = 2000 ; code area
-start: spl 7 ; lock out interrupts
- clr icnt ; clear counters
- clr pcnt
-;
- mov #obuf,r0 ; clear obuf
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr r5 ; r5 used to time int delay
-;
- mov #ibuf,r0 ; setup regs from ibuf
- mov (r0)+,@#rp.cs2 ; cs2
- mov (r0)+,@#rp.da ; da
- mov (r0)+,@#rp.dc ; dc
- mov (r0)+,@#rp.cs1 ; cs1
- spl 0 ; allow interrupts
-;
- inc r5 ; time int delay, up to 10 instructions
- inc r5
- inc r5
- inc r5
- inc r5
- inc r5
- inc r5
- inc r5
- inc r5
- inc r5
-;
-poll: inc pcnt ; count polls
- tstb @#rp.cs1 ; check cs1 rdy
- bpl poll ; if rdy=0 keep polling
- tst icnt ; did we have an interrupt ?
- bne 1$ ;
-;
- mov #obuf,r0 ; store regs in obuf
- mov @#rp.cs1,(r0)+ ; cs1
- mov @#rp.cs2,(r0)+ ; cs2
- mov @#rp.er1,(r0)+ ; er1
- mov @#rp.ds,(r0)+ ; ds
- mov @#rp.as,(r0)+ ; as
-;
-1$: tst rint ; re-interrupt wanted ?
- bne 2$ ;
- mov #377,@#rp.as ; if not, cancel all attentions
- clr rint
-;
-2$: bit #rp.erp,@#rp.ds ; ds.erp = 1 ? any controller errors ?
- beq 3$
- mov #,@#rp.cs1 ; than do drive clear
-;
-3$: bit #rp.tre,@#rp.cs1 ; cs1.tre = 1 ? any transfer errors ?
- beq 4$
- mov #rp.tre,@#rp.cs1 ; if yes, clear them with tre=1 write
-;
-4$: mov #fbuf,r0 ; store final regs in fbuf
- mov @#rp.cs1,(r0)+ ; cs1
- mov @#rp.cs2,(r0)+ ; cs2
- mov @#rp.er1,(r0)+ ; er1
- mov @#rp.ds,(r0)+ ; ds
- mov @#rp.as,(r0)+ ; as
-
- halt ; halt if done
-stop:
-;
- clr pcnt ; clear pcnt again
- mov #obuf,r0 ; clear obuf again
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
-;
- mov #rp.ie,@#rp.cs1 ; re-enable interrupt
- br poll
-
-; RHRP interrupt handler
-vh.rp: mov #obuf,r0 ; store regs in obuf
- mov @#rp.cs1,(r0)+ ; cs1
- mov @#rp.cs2,(r0)+ ; cs2
- mov @#rp.er1,(r0)+ ; er1
- mov @#rp.ds,(r0)+ ; ds
- mov @#rp.as,r1 ;
- mov r1,(r0)+ ; as
- mov r5,(r0)+ ; int delay
-;
-1$: tst icnt ; test first interrupt
- beq 2$ ; if yes quit
- mov r1,@#rp.as ; if not, clear as
-2$: inc icnt ; count interrupts
- rti ; and return
-}
-
-##puts $lst
-
-# define tmpproc for readback checks
-proc tmpproc_dotest {cpu symName opts} {
- upvar 1 $symName sym
-
- set tout 10.; # FIXME_code: parameter ??
-
-# setup defs hash, first defaults, than write over concrete run values
- array set defs { i.cs2 0 \
- i.da 0 \
- i.dc 0 \
- i.cs1 0 \
- i.idly 0 \
- o.cs1 0 \
- o.cs2 0 \
- o.er1 0 \
- o.ds 0 \
- o.as 0 \
- o.itim 10 \
- o.icnt 0 \
- o.pcnt 1 \
- or.cs1 0 \
- or.cs2 0 \
- or.er1 0 \
- or.ds 0 \
- or.as 0 \
- or.icnt 0 \
- or.pcnt 1 \
- do.rint 0 \
- do.lam 0
- }
- array set defs $opts
-
- # build ibuf
- set ibuf [list $defs(i.cs2) $defs(i.da) $defs(i.dc) $defs(i.cs1) \
- $defs(do.rint)]
-
- # setup idly, write ibuf, setup stack, and start cpu at start:
- $cpu cp -wibr rpa.cs1 [regbld ibd_rhrp::RCS1 \
- [list val $defs(i.idly)] \
- [list func $ibd_rhrp::RFUNC_WIDLY] ] \
- -wal $sym(ibuf) \
- -bwm $ibuf \
- -wsp $sym(stack) \
- -stapc $sym(start)
-
- # here do minimal lam handling (harvest + send DONE)
- if {$defs(do.lam)} {
- rlc wtlam $tout apat
- $cpu cp -attn \
- -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_DONE]
- }
-
- $cpu wtcpu -reset $tout
-
- # determine regs after cleanup
- set cs1msk [rutil::com16 [regbld ibd_rhrp::CS1 {func -1}]]
- set fcs2 [expr {$defs(o.cs2) & 0x00ff}]; # cs1.tre clears upper byte !
- set fer1 0
- if {!$defs(do.rint)} { # no reinterrupt, ata clear by cpu
- set fcs1 [expr {$defs(o.cs1) & ~[regbld ibd_rhrp::CS1 sc tre {func -1}] }]
- set fds [expr {$defs(o.ds) & ~[regbld ibd_rhrp::DS ata erp] }]
- set fas 0
- } else { # reinterrupt, ata still pending
- set fcs1 [expr {$defs(o.cs1) & ~[regbld ibd_rhrp::CS1 tre {func -1}] }]
- set fds [expr {$defs(o.ds) & ~[regbld ibd_rhrp::DS erp] }]
- set fas $defs(o.as)
- }
- $cpu cp -rpc -edata $sym(stop) \
- -rsp -edata $sym(stack) \
- -wal $sym(icnt) \
- -rmi -edata $defs(o.icnt) \
- -rmi \
- -rmi -edata $defs(o.cs1) \
- -rmi -edata $defs(o.cs2) \
- -rmi -edata $defs(o.er1) \
- -rmi -edata $defs(o.ds) \
- -rmi -edata $defs(o.as) \
- -rmi -edata $defs(o.itim) \
- -rmi -edata $fcs1 $cs1msk \
- -rmi -edata $fcs2 \
- -rmi -edata $fer1 \
- -rmi -edata $fds \
- -rmi -edata $fas
-
- if {!$defs(do.rint)} return "";
-
- $cpu cp -start
-
- $cpu wtcpu -reset $tout
-
- # determine regs after cleanup
- set fcs1 [expr {$defs(or.cs1) & ~[regbld ibd_rhrp::CS1 sc] }]
- set fcs2 $defs(or.cs2)
- set fer1 0
- set fds [expr {$defs(or.ds) & ~[regbld ibd_rhrp::DS ata] }]
- set fas 0
-
- $cpu cp -rpc -edata $sym(stop) \
- -rsp -edata $sym(stack) \
- -wal $sym(icnt) \
- -rmi -edata $defs(or.icnt) \
- -rmi \
- -rmi -edata $defs(or.cs1) \
- -rmi -edata $defs(or.cs2) \
- -rmi -edata $defs(or.er1) \
- -rmi -edata $defs(or.ds) \
- -rmi -edata $defs(or.as) \
- -rmi \
- -rmi -edata $fcs1 \
- -rmi -edata $fcs2 \
- -rmi -edata $fer1 \
- -rmi -edata $fds \
- -rmi -edata $fas
-
- return ""
-}
-
-# discard pending attn to be on save side
-rlc wtlam 0.
-rlc exec -attn
-
-# -- Section A ---------------------------------------------------------------
-rlc log " A -- function basics ----------------------------------------------"
-rlc log " A1: test rdy and ie logic ---------------------------------"
-rlc log " A1.1 set cs1.ie=1 alone -> no interrupt ------------"
-
-# Note: no interrupt, so ie stays on !
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie] \
- o.icnt 0 \
- o.cs1 [regbld ibd_rhrp::CS1 dva rdy ie] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS mol dpr dry] \
- o.as 0 \
- o.itim 0
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A1.2 set cs1.ie=1 with rdy=1 -> software interrupt -"
-
-# Note: interrupt, so ie switched off again !
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 rdy ie] \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 dva rdy] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS mol dpr dry] \
- o.as 0 \
- o.itim 1
- ]
-
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A2: test state functions: iff no, as yes ------------------"
-rlc log " A2.1 noop function ---------------------------------"
-
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie go] \
- o.cs1 [regbld ibd_rhrp::CS1 ie dva rdy] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS mol dpr dry] \
- o.as 0 \
- o.itim 0
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A2.2 pack acknowledge function (sets ds.vv=1) ------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_PACK]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 $rbcs1func ie go] \
- o.cs1 [regbld ibd_rhrp::CS1 dva rdy ie $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS mol dpr dry vv] \
- o.as 0 \
- o.itim 0
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3: test seek type functions: iff no, as yes --------------"
-
-rlc log " A3.1 seek function, ie=0, valid da,dc---------------"
-
-# check that cs1.sc=1, ds.ata=1, and as.u0=1
-set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 $rbcs1func go] \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 0
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.2 seek function, valid da,dc, idly=0 ------------"
-
-# check re-interrupt too
-set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 814 \
- i.idly 0 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 1 \
- do.rint 1 \
- or.icnt 2 \
- or.cs1 [regbld ibd_rhrp::CS1 sc dva rdy] \
- or.cs2 [regbld ibd_rhrp::CS2 or ir] \
- or.er1 0 \
- or.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- or.as [regbld ibd_rhrp::AS u0]
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.3 seek function, invalid dc ---------------------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 815 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 [regbld ibd_rhrp::ER1 iae] \
- o.ds [regbld ibd_rhrp::DS ata erp mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 1
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.4 search function, valid da,dc, idly=0 ----------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 0 \
- i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
- i.idly 0 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 1
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.5 search function, valid da,dc, idly=2 ----------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 0 \
- i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
- i.idly 2 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 3
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.5 search function, valid da,dc, idly=8 ----------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 0 \
- i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
- i.idly 8 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 0 \
- o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 9
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A3.5 search function, invalid sa, idly=8 -----------"
-# Note: idly is 8, but error ata's come immediately !!
-
-set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- i.dc 0 \
- i.da [regbld ibd_rhrp::DA {ta 0} {sa 22}] \
- i.idly 8 \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.er1 [regbld ibd_rhrp::ER1 iae] \
- o.ds [regbld ibd_rhrp::DS ata erp mol dpr dry vv] \
- o.as [regbld ibd_rhrp::AS u0] \
- o.itim 1
- ]
-tmpproc_dotest $cpu sym $opts
-
-rlc log " A4: test transfer functions: iff yes, as no ---------------"
-rlc log " A4.1 read function, valid da,dc --------------------"
-
-set rbcs1func [list func $ibd_rhrp::FUNC_READ]
-set opts [list \
- i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
- o.icnt 1 \
- o.cs1 [regbld ibd_rhrp::CS1 dva rdy $rbcs1func] \
- o.cs2 [regbld ibd_rhrp::CS2 or ir] \
- o.ds [regbld ibd_rhrp::DS mol dpr dry vv] \
- do.lam 1
- ]
-tmpproc_dotest $cpu sym $opts
-
Index: trunk/tools/tbench/rhrp
===================================================================
--- trunk/tools/tbench/rhrp (revision 31)
+++ trunk/tools/tbench/rhrp (nonexistent)
trunk/tools/tbench/rhrp
Property changes :
Deleted: svn:ignore
## -1,33 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
Index: trunk/tools/tbench/tm11/tm11_all.dat
===================================================================
--- trunk/tools/tbench/tm11/tm11_all.dat (revision 31)
+++ trunk/tools/tbench/tm11/tm11_all.dat (nonexistent)
@@ -1,6 +0,0 @@
-# $Id: tm11_all.dat 683 2015-05-17 21:54:35Z mueller $
-#
-## steering file for all tm11 tests
-#
-test_tm11_regs.tcl
-test_tm11_int.tcl
Index: trunk/tools/tbench/tm11/test_tm11_regs.tcl
===================================================================
--- trunk/tools/tbench/tm11/test_tm11_regs.tcl (revision 31)
+++ trunk/tools/tbench/tm11/test_tm11_regs.tcl (nonexistent)
@@ -1,175 +0,0 @@
-# $Id: test_tm11_regs.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-05-17 683 1.0 Initial version
-#
-# Test register response
-# A: register basics
-
-# ----------------------------------------------------------------------------
-rlc log "test_tm11_regs: test register response ------------------------------"
-package require ibd_tm11
-ibd_tm11::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-# -- Section A ---------------------------------------------------------------
-rlc log " A1: test read ---------------------------------------------"
-rlc log " A1.1: loc read sr,...,rl ---------------------------"
-
-$cpu cp -rma tma.sr \
- -rma tma.cr \
- -rma tma.bc \
- -rma tma.ba \
- -rma tma.db \
- -rma tma.rl
-
-rlc log " A1.2: rem read sr,...,rl ---------------------------"
-
-$cpu cp -ribr tma.sr \
- -ribr tma.cr \
- -ribr tma.bc \
- -ribr tma.ba \
- -ribr tma.db \
- -ribr tma.rl
-
-rlc log " A1.3: test that rl+2,+4 gives no ack (loc) ---------"
-
-set iaddr2 [expr {[cpu0 imap tma.rl] + 2}]
-set iaddr4 [expr {[cpu0 imap tma.rl] + 4}]
-
-$cpu cp -ribr $iaddr2 -estaterr \
- -ribr $iaddr4 -estaterr
-
-# -- Section B ---------------------------------------------------------------
-rlc log " B1: test sr setup -------------------------------------------------"
-
-rlc log " B1.1: rem write via rl -----------------------------"
-# setup units with eof=!u1 eot=!u0 onl=1 bot=u0 wrl=u1
-set rsr0 [regbld ibd_tm11::RRL {eof 1} {eot 1} {onl 1} {bot 0} {wrl 0} {unit 0}]
-set rsr1 [regbld ibd_tm11::RRL {eof 1} {eot 0} {onl 1} {bot 1} {wrl 0} {unit 1}]
-set rsr2 [regbld ibd_tm11::RRL {eof 0} {eot 1} {onl 1} {bot 0} {wrl 1} {unit 2}]
-set rsr3 [regbld ibd_tm11::RRL {eof 0} {eot 0} {onl 1} {bot 1} {wrl 1} {unit 3}]
-# on readback SR has tur=1
-set sr0 [regbld ibd_tm11::SR {eof 1} {eot 1} {onl 1} {bot 0} {wrl 0} {tur 1}]
-set sr1 [regbld ibd_tm11::SR {eof 1} {eot 0} {onl 1} {bot 1} {wrl 0} {tur 1}]
-set sr2 [regbld ibd_tm11::SR {eof 0} {eot 1} {onl 1} {bot 0} {wrl 1} {tur 1}]
-set sr3 [regbld ibd_tm11::SR {eof 0} {eot 0} {onl 1} {bot 1} {wrl 1} {tur 1}]
-set sr7 [regbld ibd_tm11::SR {tur 1}]
-
-$cpu cp -wibr "tma.cr" [ibd_tm11::rcr_wunit 0] \
- -wibr "tma.rl" $rsr0 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 1] \
- -wibr "tma.rl" $rsr1 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 2] \
- -wibr "tma.rl" $rsr2 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 3] \
- -wibr "tma.rl" $rsr3
-
-rlc log " B1.2: rem read via rl ------------------------------"
-
-$cpu cp -wibr "tma.cr" [ibd_tm11::rcr_wunit 0] \
- -ribr "tma.rl" -edata $rsr0 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 1] \
- -ribr "tma.rl" -edata $rsr1 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 2] \
- -ribr "tma.rl" -edata $rsr2 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 3] \
- -ribr "tma.rl" -edata $rsr3
-
-rlc log " B1.3: loc read via sr ------------------------------"
-
-$cpu cp -wma "tma.cr" [regbld ibd_tm11::CR {unit 0}]\
- -rma "tma.sr" -edata $sr0 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 1}]\
- -rma "tma.sr" -edata $sr1 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 2}]\
- -rma "tma.sr" -edata $sr2 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 3}]\
- -rma "tma.sr" -edata $sr3
-
-rlc log " B1.4: ensure unit 4,..,7 signal offline ------------"
-
-$cpu cp -wma "tma.cr" [regbld ibd_tm11::CR {unit 4}]\
- -rma "tma.sr" -edata $sr7 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 5}]\
- -rma "tma.sr" -edata $sr7 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 6}]\
- -rma "tma.sr" -edata $sr7 \
- -wma "tma.cr" [regbld ibd_tm11::CR {unit 7}]\
- -rma "tma.sr" -edata $sr7
-
-rlc log " B1.5: setup unit 0:3 as onl=1 bot=1 ----------------"
-
-# use use ONL=1 BOT=1 for all units -> no error flags
-set rsr0 [regbld ibd_tm11::RRL {onl 1} {bot 1} {unit 0}]
-set rsr1 [regbld ibd_tm11::RRL {onl 1} {bot 1} {unit 1}]
-set rsr2 [regbld ibd_tm11::RRL {onl 1} {bot 1} {unit 2}]
-set rsr3 [regbld ibd_tm11::RRL {onl 1} {bot 1} {unit 3}]
-# on readback SR has tur=1
-set sr0 [regbld ibd_tm11::SR {onl 1} {bot 1} {tur 1}]
-set sr1 [regbld ibd_tm11::SR {onl 1} {bot 1} {tur 1}]
-set sr2 [regbld ibd_tm11::SR {onl 1} {bot 1} {tur 1}]
-set sr3 [regbld ibd_tm11::SR {onl 1} {bot 1} {tur 1}]
-$cpu cp -wibr "tma.cr" [ibd_tm11::rcr_wunit 0] \
- -wibr "tma.rl" $rsr0 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 1] \
- -wibr "tma.rl" $rsr1 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 2] \
- -wibr "tma.rl" $rsr2 \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 3] \
- -wibr "tma.rl" $rsr3
-
-rlc log " B2.1: loc write loc/rem read of cr -----------------"
-# test all cr fields except ie and go (no interrupts and functions yet)
-set crlist [list \
- [regbld ibd_tm11::CR {den 0} {pevn 0} {unit 0} {ea 0} {func 0}] \
- [regbld ibd_tm11::CR {den 3} {pevn 0} {unit 0} {ea 0} {func 0}] \
- [regbld ibd_tm11::CR {den 3} {pevn 1} {unit 0} {ea 0} {func 0}] \
- [regbld ibd_tm11::CR {den 3} {pevn 1} {unit 7} {ea 0} {func 0}] \
- [regbld ibd_tm11::CR {den 3} {pevn 1} {unit 3} {ea 3} {func 0}] \
- [regbld ibd_tm11::CR {den 3} {pevn 1} {unit 3} {ea 3} {func 7}] \
- ]
-
-foreach cr $crlist {
- # on cr read here always rdy=1
- set crread [expr {$cr | [regbld ibd_tm11::CR {rdy 1}] } ]
- $cpu cp -wma "tma.cr" $cr \
- -rma "tma.cr" -edata $crread \
- -ribr "tma.cr" -edata $crread
-}
-
-rlc log " B3.1: loc write loc/rem read for bc,ba -------------"
-# Note: ba ignores bit 0, only word addresses
-$cpu cp -wma "tma.bc" 0x0010 \
- -wma "tma.ba" 0x0020 \
- -rma "tma.bc" -edata 0x0010 \
- -rma "tma.ba" -edata 0x0020 \
- -ribr "tma.bc" -edata 0x0010 \
- -ribr "tma.ba" -edata 0x0020
-$cpu cp -wma "tma.bc" 0x8888 \
- -wma "tma.ba" 0x7777 \
- -rma "tma.bc" -edata 0x8888 \
- -rma "tma.ba" -edata 0x7776 \
- -ribr "tma.bc" -edata 0x8888 \
- -ribr "tma.ba" -edata 0x7776
-
-rlc log " B3.2: rem write loc/rem read for bc,ba -------------"
-
-$cpu cp -wibr "tma.bc" 0x1234 \
- -wibr "tma.ba" 0x4321 \
- -rma "tma.bc" -edata 0x1234 \
- -rma "tma.ba" -edata 0x4320 \
- -ribr "tma.bc" -edata 0x1234 \
- -ribr "tma.ba" -edata 0x4320
-$cpu cp -wibr "tma.bc" 0x0000 \
- -wibr "tma.ba" 0x0000 \
- -rma "tma.bc" -edata 0x0000 \
- -rma "tma.ba" -edata 0x0000 \
- -ribr "tma.bc" -edata 0x0000 \
- -ribr "tma.ba" -edata 0x0000
Index: trunk/tools/tbench/tm11/test_tm11_int.tcl
===================================================================
--- trunk/tools/tbench/tm11/test_tm11_int.tcl (revision 31)
+++ trunk/tools/tbench/tm11/test_tm11_int.tcl (nonexistent)
@@ -1,162 +0,0 @@
-# $Id: test_tm11_int.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2015- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-05-17 683 1.0 Initial version
-#
-# Test interrupt response
-# A:
-
-# ----------------------------------------------------------------------------
-rlc log "test_tm11_int: test interrupt response ------------------------------"
-rlc log " setup: all units online"
-package require ibd_tm11
-ibd_tm11::setup
-
-rlc set statmask $rw11::STAT_DEFMASK
-rlc set statvalue 0
-
-# configure drives
-set rsronl [regbld ibd_tm11::RRL {onl 1} {bot 1}]
-$cpu cp -wibr "tma.cr" [ibd_tm11::rcr_wunit 0] \
- -wibr "tma.rl" $rsronl \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 1] \
- -wibr "tma.rl" $rsronl \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 2] \
- -wibr "tma.rl" $rsronl \
- -wibr "tma.cr" [ibd_tm11::rcr_wunit 3] \
- -wibr "tma.rl" $rsronl
-
-# load test code
-$cpu ldasm -lst lst -sym sym {
- .include |lib/defs_cpu.mac|
- .include |lib/defs_tm.mac|
-;
- .include |lib/vec_cpucatch.mac|
-;
- . = 000224 ; setup TM11 interrupt vector
-v..tm: .word vh.tm
- .word cp.pr7
-;
- . = 1000 ; data area
-stack:
-ibuf: .blkw 3. ; input buffer
-obuf: .blkw 5. ; output buffer
-fbuf: .blkw 4. ; final buffer
-;
- . = 2000 ; code area
-start: spl 7 ; lock out interrupts
-;
- mov #obuf,r0 ; clear obuf
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
- clr (r0)+
-;
- mov #ibuf,r0 ; setup regs from ibuf
- mov (r0)+,@#tm.bc ; bc
- mov (r0)+,@#tm.ba ; ba
- mov (r0)+,@#tm.cr ; cr
- spl 0 ; allow interrupts
-;
-poll: tstb @#tm.cr ; check cr
- bpl poll ; if rdy=0 keep polling
-;
-4$: mov #fbuf,r0 ; store final regs in fbuf
- mov @#tm.sr,(r0)+ ; sr
- mov @#tm.cr,(r0)+ ; cr
- mov @#tm.bc,(r0)+ ; bc
- mov @#tm.ba,(r0)+ ; ba
-
- halt ; halt if done
-stop:
-
-; TM11 interrupt handler
-vh.tm: mov #obuf,r0 ; store regs in obuf
- mov #1,(r0)+ ; flag
- mov @#tm.sr,(r0)+ ; sr
- mov @#tm.cr,(r0)+ ; cr
- mov @#tm.bc,(r0)+ ; bc
- mov @#tm.ba,(r0)+ ; ba
- rti ; and return
-}
-
-##puts $lst
-
-# define tmpproc for readback checks
-proc tmpproc_dotest {cpu symName opts} {
- upvar 1 $symName sym
-
- set tout 10.; # FIXME_code: parameter ??
-
-# setup defs hash, first defaults, than write over concrete run values
- array set defs { i.cr 0 \
- i.bc 0 \
- i.ba 0 \
- o.sr 0 \
- o.cr 0 \
- o.bc 0 \
- o.ba 0 \
- do.lam 0
- }
- array set defs $opts
-
- # build ibuf
- set ibuf [list $defs(i.bc) $defs(i.ba) $defs(i.cr)]
-
- # setup write ibuf, setup stack, and start cpu at start:
- $cpu cp -wal $sym(ibuf) \
- -bwm $ibuf \
- -wsp $sym(stack) \
- -stapc $sym(start)
-
- # here do minimal lam handling (harvest + send DONE)
- if {$defs(do.lam)} {
- rlc wtlam $tout apat
- $cpu cp -attn \
- -wibr tma.cs [ibd_rhrp::cr_func $ibd_tm11::RFUNC_DONE]
- }
-
- $cpu wtcpu -reset $tout
-
- # determine regs after cleanup
- $cpu cp -rpc -edata $sym(stop) \
- -rsp -edata $sym(stack) \
- -wal $sym(obuf) \
- -rmi -edata 1 \
- -rmi -edata $defs(o.sr) \
- -rmi -edata $defs(o.cr) \
- -rmi -edata $defs(o.bc) \
- -rmi -edata $defs(o.ba) \
- -wal $sym(fbuf) \
- -rmi -edata $defs(o.sr) \
- -rmi -edata $defs(o.cr) \
- -rmi -edata $defs(o.bc) \
- -rmi -edata $defs(o.ba)
-
- return ""
-}
-
-# discard pending attn to be on save side
-rlc wtlam 0.
-rlc exec -attn
-
-# -- Section A ---------------------------------------------------------------
-rlc log " A1.1 set cr.ie=1 -> software interrupt -------------"
-
-set opts [list \
- i.cr [regbld ibd_tm11::CR ie] \
- i.bc 0xff00 \
- i.ba 0x8800 \
- o.sr [regbld ibd_tm11::SR onl bot tur] \
- o.cr [regbld ibd_tm11::CR rdy ie] \
- o.bc 0xff00 \
- o.ba 0x8800
- ]
-
-tmpproc_dotest $cpu sym $opts
-
Index: trunk/tools/tbench/tm11
===================================================================
--- trunk/tools/tbench/tm11 (revision 31)
+++ trunk/tools/tbench/tm11 (nonexistent)
trunk/tools/tbench/tm11
Property changes :
Deleted: svn:ignore
## -1,33 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
Index: trunk/tools/tbench/cpu_all.dat
===================================================================
--- trunk/tools/tbench/cpu_all.dat (revision 31)
+++ trunk/tools/tbench/cpu_all.dat (nonexistent)
@@ -1,7 +0,0 @@
-# $Id: cpu_all.dat 683 2015-05-17 21:54:35Z mueller $
-#
-## steering file for all cpu tests
-#
-@cp/cp_all.dat
-@w11a/w11a_all.dat
-#
Index: trunk/tools/tbench/dev_all.dat
===================================================================
--- trunk/tools/tbench/dev_all.dat (revision 31)
+++ trunk/tools/tbench/dev_all.dat (nonexistent)
@@ -1,7 +0,0 @@
-# $Id: dev_all.dat 687 2015-06-05 09:03:34Z mueller $
-#
-## steering file for all devices tests
-#
-@rhrp/rhrp_all.dat
-@tm11/tm11_all.dat
-#
Index: trunk/tools/tbench/w11a/test_w11a_dstm_word_flow.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_dstm_word_flow.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_dstm_word_flow.tcl (nonexistent)
@@ -1,103 +0,0 @@
-# $Id: test_w11a_dstm_word_flow.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2013-2014 by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-03-01 552 1.0.1 check that unused regs stay 0
-# 2013-03-31 502 1.0 Initial version
-#
-# Test dstm flow with inc ... instructions for word access
-#
-
-# ----------------------------------------------------------------------------
-rlc log "test_w11a_dstm_word_flow: test dstm flow for word with inc ..."
-rlc log " r0,(r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=0,1,2,3,4,5)"
-
-# code register pre/post conditions beyond defaults
-# r0 #010 -> #011
-# r1 #data1 -> #data1
-# r2 #data2 -> #data2+4
-# r3 #pdata3 -> #pdata3+4
-# r4 #data4e -> #data4e-4
-# r5 #pdat5e -> #pdat5e-4
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: inc r0
- inc (r1)
- inc (r2)+
- inc (r2)+
- inc @(r3)+
- inc @(r3)+
- inc -(r4)
- inc -(r4)
- inc @-(r5)
- inc @-(r5)
- halt
-stop:
-;
-data1: .word 20
-data2: .word 30,31
-data3: .word 40,41
-data4: .word 50,51
-data4e:
-data5: .word 60,61
-data5e:
-pdata3: .word data3,data3+2
-pdata5: .word data5,data5+2
-pdat5e:
-}
-
-rw11::asmrun $cpu sym [list r0 010 \
- r1 $sym(data1) \
- r2 $sym(data2) \
- r3 $sym(pdata3) \
- r4 $sym(data4e) \
- r5 $sym(pdat5e) ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 011 \
- r1 $sym(data1) \
- r2 [expr {$sym(data2) + 4}] \
- r3 [expr {$sym(pdata3) + 4}] \
- r4 [expr {$sym(data4e) - 4}] \
- r5 [expr {$sym(pdat5e) - 4}] ]
-rw11::asmtmem $cpu $sym(data1) {021 031 032 041 042 051 052 061 062}
-
-# ----------------------------------------------------------------------------
-rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
-
-# code register pre/post conditions beyond defaults
-# r0 #data0-020 -> ..same
-# r1 #pdata1-040 -> ..same
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: inc 20(r0)
- inc @40(r1)
- inc data2
- inc @pdata3
- inc @#data4
- halt
-stop:
-;
-data0: .word 200
-data1: .word 210
-data2: .word 220
-data3: .word 230
-data4: .word 240
-data4e:
-pdata1: .word data1
-pdata3: .word data3
-}
-
-rw11::asmrun $cpu sym [list r0 [expr {$sym(data0)-020}] \
- r1 [expr {$sym(pdata1)-040}] ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 [expr {$sym(data0)-020}] \
- r1 [expr {$sym(pdata1)-040}] \
- r2 0 \
- r3 0 \
- r4 0 \
- r5 0 ]
-rw11::asmtmem $cpu $sym(data0) {0201 0211 0221 0231 0241}
Index: trunk/tools/tbench/w11a/test_w11a_srcr_word_flow.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_srcr_word_flow.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_srcr_word_flow.tcl (nonexistent)
@@ -1,181 +0,0 @@
-# $Id: test_w11a_srcr_word_flow.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2013- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-03-01 552 1.0.1 check sp
-# 2013-03-31 502 1.0 Initial version
-#
-# Test srcr flow with mov ...,rx instructions for word access
-#
-
-# ----------------------------------------------------------------------------
-rlc log "test_w11a_srcr_word_flow: test srcr flow for word with mov ...,rx"
-rlc log " r0 (mode=0)"
-
-# code register pre/post conditions beyond defaults
-# r0 01234 -> ..same
-# r1 -> 01234
-# r2 -> #stack
-# r3 -> #start
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-stack:
-start: mov r0,r1
- mov sp,r2
- mov pc,r3
-lpc: halt
-stop:
-}
-
-rw11::asmrun $cpu sym [list r0 01234]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 01234 \
- r1 01234 \
- r2 $sym(stack) \
- r3 $sym(lpc) \
- r4 0 \
- r5 0 \
- sp $sym(stack) ]
-
-# ----------------------------------------------------------------------------
-rlc log " (r0),(r0)+,-(r0) (mode=1,2,4)"
-
-# code register pre/post conditions beyond defaults
-# r0 #data -> ..same
-# r1 -> 01001
-# r2 -> 01001
-# r3 -> 01002
-# r4 -> 01002
-# r5 -> 01001
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov (r0),r1
- mov (r0)+,r2
- mov (r0)+,r3
- mov -(r0),r4
- mov -(r0),r5
- halt
-stop:
-;
-data: .word 1001
- .word 1002
-}
-
-rw11::asmrun $cpu sym [list r0 $sym(data)]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 $sym(data) \
- r1 001001 \
- r2 001001 \
- r3 001002 \
- r4 001002 \
- r5 001001 ]
-
-# ----------------------------------------------------------------------------
-rlc log " @(r0)+,@-(r0) (mode=3,5)"
-
-# code register pre/post conditions beyond defaults
-# r0 #pdata -> ..same
-# r1 -> 02001
-# r2 -> 02002
-# r3 -> #pdata+4
-# r4 -> 02002
-# r5 -> 02001
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov @(r0)+,r1
- mov @(r0)+,r2
- mov r0,r3
- mov @-(r0),r4
- mov @-(r0),r5
- halt
-stop:
-;
-pdata: .word data0
- .word data1
-data0: .word 2001
- .word 0
-data1: .word 2002
-}
-
-rw11::asmrun $cpu sym [list r0 $sym(pdata)]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 $sym(pdata) \
- r1 002001 \
- r2 002002 \
- r3 [expr {$sym(pdata)+4}] \
- r4 002002 \
- r5 002001 ]
-
-# ----------------------------------------------------------------------------
-rlc log " nn(r0),@nn(r0) (mode=6,7)"
-
-# code register pre/post conditions beyond defaults
-# r0 #data -> ..same
-# r1 -> 03001
-# r2 -> 03002
-# r3 -> 03003
-# r4 -> 03004
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov 2(r0),r1
- mov @4(r0),r2
- mov 6(r0),r3
- mov @10(r0),r4
- halt
-stop:
-;
-data: .word 177777
- .word 003001
- .word data0
- .word 003003
- .word data1
-
-data0: .word 003002
-data1: .word 003004
-}
-
-rw11::asmrun $cpu sym [list r0 $sym(data)]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 $sym(data) \
- r1 003001 \
- r2 003002 \
- r3 003003 \
- r4 003004 \
- r5 0 ]
-
-# ----------------------------------------------------------------------------
-rlc log " #nn,@#nn,var,@var (mode=27,37,67,77)"
-
-# code register pre/post conditions beyond defaults
-# r1 -> 04001
-# r2 -> 04002
-# r3 -> 04003
-# r4 -> 04004
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov #004001,r1
- mov @#data2,r2
- mov data3,r3
- mov @pdata4,r4
- halt
-stop:
-;
-pdata4: .word data4
-
-data2: .word 004002
-data3: .word 004003
-data4: .word 004004
-}
-
-rw11::asmrun $cpu sym {}
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 0 \
- r1 004001 \
- r2 004002 \
- r3 004003 \
- r4 004004 \
- r5 0 ]
Index: trunk/tools/tbench/w11a/w11a_all.dat
===================================================================
--- trunk/tools/tbench/w11a/w11a_all.dat (revision 31)
+++ trunk/tools/tbench/w11a/w11a_all.dat (nonexistent)
@@ -1,12 +0,0 @@
-# $Id: w11a_all.dat 683 2015-05-17 21:54:35Z mueller $
-#
-## steering file for all w11a tests
-#
-test_w11a_srcr_word_flow.tcl
-test_w11a_dstw_word_flow.tcl
-test_w11a_dstm_word_flow.tcl
-test_w11a_dsta_flow.tcl
-test_w11a_inst_traps.tcl
-#
-test_w11a_div.tcl
-#
Index: trunk/tools/tbench/w11a/test_w11a_div.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_div.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_div.tcl (nonexistent)
@@ -1,390 +0,0 @@
-# $Id: test_w11a_div.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2014- by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-07-20 570 1.0.2 add rw11::div_show_test; test late div quit cases
-# 2014-07-12 569 1.0.1 move sxt16/32 to rutil
-# 2014-07-11 568 1.0 Initial version
-# 2014-06-29 566 0.1 First draft
-#
-# Test div instruction
-#
-
-namespace eval rw11 {
-
- #
- # div_simh: calculate expected division result as pdp11 simh does it -------
- #
- # this pdp11 div emulation adopted from pdp11_cpu.c (git head 2014-06-09)
- proc div_simh {ddi dri} {
- set src2 $dri
- set src $ddi
- set qd [expr ($ddi>>16) & 0xffff]; # w11a default for V=1 bailouts
- set rd [expr $ddi & 0xffff]; # "
- set n [expr {($ddi<0) ^ ($dri<0)}]; # "
- set z 0; # "
-
- # quit if divident larger than possible 16 bit signed products
- if {$src > 1073774591 || $src < -1073741823} {
- return [list $qd $rd $n $z 1 0]
- }
- # quit if divisor zero
- if {$src2 == 0} {
- return [list $qd $rd $n $z 1 1]
- }
-
- if {$src2 & 0x8000} {
- set src2 [expr $src2 | ~ 077777]
- }
- if {$src & 0x80000000} {
- set src [expr $src | ~ 017777777777]
- }
-
- # Tcl "/" uses 'round down' sematics, while C (and PDP11) 'round to 0'
- # ddi dri Tcl C/C++
- # 34 5 q= 6 r= 4 q= 6 r= 4
- # 34 -5 q= 7 r=-1 q=-6 r= 4
- # -34 5 q=-7 r= 1 q=-6 r=-4
- # -34 -5 q= 6 r=-4 q= 6 r=-4
- # Tcl --> r same sign as divisor
- # C --> r same sign as divident
- # so add correction step to always get C/C++/PDP11 divide semantics
- #
- set q [expr $src / $src2]
- set r [expr ($src - ($src2 * $q))]
-
- if {$r!=0 && (($src<0) ^ ($r<0))} { # divident and remainder diff sign
- set r [expr $r - $src2]
- set q [expr $q + (($q<0)?1:-1)]
- }
-
- if {($q > 32767) || ($q < -32768)} {
- return [list $qd $rd $n $z 1 0]
- }
-
- set n [expr {$q < 0}]
- set z [expr {$q == 0}]
- return [list $q $r $n $z 0 0]
- }
-
- #
- # div_testd3: test division ddh,ddl,,dr + expected result ------------------
- #
- proc div_testd3 {cpu symName ddh ddl dr q r n z v c} {
- upvar 1 $symName sym
- set nzvc [expr {($n<<3) | ($z<<2) | ($v<<1) | $c}]
- set dr16 [expr {$dr & 0xffff}]
- set q16 [expr {$q & 0xffff}]
- set r16 [expr {$r & 0xffff}]
-
- # use rw11::div_show_test to enable generation of divtst files
- if {[info exists rw11::div_show_test] && $rw11::div_show_test} {
- set ddi [expr (($ddh&0xffff)<<16) + ($ddl&0xffff)]
- set ddi [rutil::sxt32 $ddi]
- set dri [rutil::sxt16 $dr16]
- set qi [rutil::sxt16 $q16]
- set ri [rutil::sxt16 $r16]
- puts [format "%06o %06o %06o : %d%d%d%d %06o %06o # %11d/%6d:%6d,%6d" \
- $ddh $ddl $dr16 $n $z $v $c $q16 $r16 $ddi $dri $qi $ri ]
- }
-
- rw11::asmrun $cpu sym [list r0 $ddh r1 $ddl r2 $dr16]
- rw11::asmwait $cpu sym
-
- if {!$v && !$c} { # test q and r only when V=0 C=0 expected
- lappend treglist r0 $q16 r1 $r16
- }
- lappend treglist r3 $nzvc
-
- set errcnt [rw11::asmtreg $cpu $treglist]
-
- if {$errcnt} {
- puts [format \
- "div FAIL: dd=%06o,%06o dr=%06o exp: q=%06o r=%06o nzvc=%d%d%d%d" \
- $ddh $ddl $dr16 $q16 $r16 $n $z $v $c]
- }
- return $errcnt
- }
-
- #
- # div_testd2: test division dd,dr + expected result ------------------------
- #
- proc div_testd2 {cpu symName dd dr q r n z v c} {
- upvar 1 $symName sym
- set ddh [expr {($dd>>16) & 0xffff}]
- set ddl [expr { $dd & 0xffff}]
- return [div_testd3 $cpu sym $ddh $ddl $dr $q $r $n $z $v $c]
- }
-
- #
- # div_testdqr: test division, give divisor, quotient and remainder ---------
- #
- proc div_testdqr {cpu symName dri qi ri} {
- upvar 1 $symName sym
- set dri [rutil::sxt16 $dri]
- set qi [rutil::sxt16 $qi]
- set ri [rutil::sxt16 $ri]
- set ddi [expr {$dri*$qi + $ri}]
-
- set simhres [div_simh $ddi $dri]
- set q [lindex $simhres 0]
- set r [lindex $simhres 1]
- set n [lindex $simhres 2]
- set z [lindex $simhres 3]
- set v [lindex $simhres 4]
- set c [lindex $simhres 5]
-
- return [div_testd2 $cpu sym $ddi $dri $q $r $n $z $v $c]
- }
-}
-
-# ----------------------------------------------------------------------------
-rlc log "test_div: test div instruction"
-
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-stack:
-start: div r2,r0
- mov @#177776,r3
- bic #177760,r3
- halt
-stop:
-}
-
-rlc log " test basics (via testd2)"
-# dd dr q r n z v c
-rlc log " dr>0"
-rw11::div_testd2 $cpu sym 0 3 0 0 0 1 0 0
-rw11::div_testd2 $cpu sym 1 3 0 1 0 1 0 0
-rw11::div_testd2 $cpu sym 2 3 0 2 0 1 0 0
-rw11::div_testd2 $cpu sym 3 3 1 0 0 0 0 0
-rw11::div_testd2 $cpu sym 4 3 1 1 0 0 0 0
-rw11::div_testd2 $cpu sym -1 3 0 -1 0 1 0 0
-rw11::div_testd2 $cpu sym -2 3 0 -2 0 1 0 0
-rw11::div_testd2 $cpu sym -3 3 -1 0 1 0 0 0
-rw11::div_testd2 $cpu sym -4 3 -1 -1 1 0 0 0
-rlc log " dr<0"
-rw11::div_testd2 $cpu sym 0 -3 0 0 0 1 0 0
-rw11::div_testd2 $cpu sym 1 -3 0 1 0 1 0 0
-rw11::div_testd2 $cpu sym 2 -3 0 2 0 1 0 0
-rw11::div_testd2 $cpu sym 3 -3 -1 0 1 0 0 0
-rw11::div_testd2 $cpu sym 4 -3 -1 1 1 0 0 0
-rw11::div_testd2 $cpu sym -1 -3 0 -1 0 1 0 0
-rw11::div_testd2 $cpu sym -2 -3 0 -2 0 1 0 0
-rw11::div_testd2 $cpu sym -3 -3 1 0 0 0 0 0
-rw11::div_testd2 $cpu sym -4 -3 1 -1 0 0 0 0
-rlc log " dr==0"
-rw11::div_testd2 $cpu sym 0 0 0 0 0 1 1 1
-rw11::div_testd2 $cpu sym 1 0 0 0 0 1 1 1
-rw11::div_testd2 $cpu sym -1 0 0 0 0 1 1 1
-
-rlc log " test 4 quadrant basics (via testd2)"
-# dd dr q r n z v c
-rw11::div_testd2 $cpu sym 34 5 6 4 0 0 0 0
-rw11::div_testd2 $cpu sym 34 -5 -6 4 1 0 0 0
-rw11::div_testd2 $cpu sym -34 5 -6 -4 1 0 0 0
-rw11::div_testd2 $cpu sym -34 -5 6 -4 0 0 0 0
-
-rlc log " test 4 quadrant basics (via testdqr)"
-# dr q r
-rw11::div_testdqr $cpu sym 5 6 4;
-rw11::div_testdqr $cpu sym -5 -6 4;
-rw11::div_testdqr $cpu sym 5 -6 -4;
-rw11::div_testdqr $cpu sym -5 6 -4;
-
-rlc log " test q=100000 boundary cases (q = max neg value)"
-rlc log " case dd>0, dr<0 -- factor 21846"
-# dr q r
-rw11::div_testdqr $cpu sym -21846 0100000 0; # BAD-R4
-rw11::div_testdqr $cpu sym -21846 0100000 1; # BAD-R4
-rw11::div_testdqr $cpu sym -21846 0100000 21844; # BAD-R4
-rw11::div_testdqr $cpu sym -21846 0100000 21845; # BAD-R4
-rw11::div_testdqr $cpu sym -21846 0100000 21846; # v=1
-rw11::div_testdqr $cpu sym -21846 0100000 21847; # v=1
-
-rlc log " case dd<0, dr>0 -- factor 21846"
-rw11::div_testdqr $cpu sym 21846 0100000 0; # BAD-R4
-rw11::div_testdqr $cpu sym 21846 0100000 -1; # BAD-R4
-rw11::div_testdqr $cpu sym 21846 0100000 -21844; # BAD-R4
-rw11::div_testdqr $cpu sym 21846 0100000 -21845; # BAD-R4
-rw11::div_testdqr $cpu sym 21846 0100000 -21846; # v=1
-rw11::div_testdqr $cpu sym 21846 0100000 -21847; # v=1
-
-rlc log " case dd>0, dr<0 -- factor 21847"
-rw11::div_testdqr $cpu sym -21847 0100000 0; # BAD-R4
-rw11::div_testdqr $cpu sym -21847 0100000 1; # BAD-R4
-rw11::div_testdqr $cpu sym -21847 0100000 21845; # BAD-R4
-rw11::div_testdqr $cpu sym -21847 0100000 21846; # BAD-R4
-rw11::div_testdqr $cpu sym -21847 0100000 21847; # v=1
-rw11::div_testdqr $cpu sym -21847 0100000 21848; # v=1
-
-rlc log " case dd<0, dr>0 -- factor 21847"
-rw11::div_testdqr $cpu sym 21847 0100000 0; # BAD-R4
-rw11::div_testdqr $cpu sym 21847 0100000 -1; # BAD-R4
-rw11::div_testdqr $cpu sym 21847 0100000 -21845; # BAD-R4
-rw11::div_testdqr $cpu sym 21847 0100000 -21846; # BAD-R4
-rw11::div_testdqr $cpu sym 21847 0100000 -21847; # v=1
-rw11::div_testdqr $cpu sym 21847 0100000 -21848; # v=1
-
-#
-#
-rlc log " test q=077777 boundary cases (q = max pos value)"
-rlc log " case dd>0, dr>0 -- factor 21846"
-rw11::div_testdqr $cpu sym 21846 0077777 0; #
-rw11::div_testdqr $cpu sym 21846 0077777 1; #
-rw11::div_testdqr $cpu sym 21846 0077777 21844; #
-rw11::div_testdqr $cpu sym 21846 0077777 21845; #
-rw11::div_testdqr $cpu sym 21846 0077777 21846; # v=1
-rw11::div_testdqr $cpu sym 21846 0077777 21847; # v=1
-rlc log " case dd<0, dr<0 -- factor 21846"
-rw11::div_testdqr $cpu sym -21846 0077777 0; #
-rw11::div_testdqr $cpu sym -21846 0077777 -1; #
-rw11::div_testdqr $cpu sym -21846 0077777 -21844; #
-rw11::div_testdqr $cpu sym -21846 0077777 -21845; #
-rw11::div_testdqr $cpu sym -21846 0077777 -21846; # v=1
-rw11::div_testdqr $cpu sym -21846 0077777 -21847; # v=1
-rlc log " case dd>0, dr>0 -- factor 21847"
-rw11::div_testdqr $cpu sym 21847 0077777 0; #
-rw11::div_testdqr $cpu sym 21847 0077777 1; #
-rw11::div_testdqr $cpu sym 21847 0077777 21845; #
-rw11::div_testdqr $cpu sym 21847 0077777 21846; #
-rw11::div_testdqr $cpu sym 21847 0077777 21847; # v=1
-rw11::div_testdqr $cpu sym 21847 0077777 21848; # v=1
-rlc log " case dd<0, dr<0 -- factor 21847"
-rw11::div_testdqr $cpu sym -21847 0077777 0; #
-rw11::div_testdqr $cpu sym -21847 0077777 -1; #
-rw11::div_testdqr $cpu sym -21847 0077777 -21845; #
-rw11::div_testdqr $cpu sym -21847 0077777 -21846; #
-rw11::div_testdqr $cpu sym -21847 0077777 -21846; # v=1
-rw11::div_testdqr $cpu sym -21847 0077777 -21847; # v=1
-#
-#
-rlc log " test dr=100000 boundary cases (dr = max neg value)"
-rlc log " case dd<0, q>0"
-rw11::div_testdqr $cpu sym 0100000 1 0; #
-rw11::div_testdqr $cpu sym 0100000 1 -1; #
-rw11::div_testdqr $cpu sym 0100000 1 -32767; #
-rw11::div_testdqr $cpu sym 0100000 2 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 2 -1; #
-rw11::div_testdqr $cpu sym 0100000 2 -32767; #
-rw11::div_testdqr $cpu sym 0100000 3 0; #
-rw11::div_testdqr $cpu sym 0100000 3 -1; #
-rw11::div_testdqr $cpu sym 0100000 3 -32767; #
-rw11::div_testdqr $cpu sym 0100000 4 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 4 -1; #
-rw11::div_testdqr $cpu sym 0100000 4 -32767; #
-rw11::div_testdqr $cpu sym 0100000 6 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 32762 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 32764 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 32765 0; #
-rw11::div_testdqr $cpu sym 0100000 32766 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 32766 -1; #
-rw11::div_testdqr $cpu sym 0100000 32766 -32767; #
-rw11::div_testdqr $cpu sym 0100000 32767 0; #
-rw11::div_testdqr $cpu sym 0100000 32767 -1; #
-rw11::div_testdqr $cpu sym 0100000 32767 -32767; #
-rlc log " case dd>0, q<0"
-rw11::div_testdqr $cpu sym 0100000 -1 0; #
-rw11::div_testdqr $cpu sym 0100000 -1 1; #
-rw11::div_testdqr $cpu sym 0100000 -1 32767; #
-rw11::div_testdqr $cpu sym 0100000 -2 0; #
-rw11::div_testdqr $cpu sym 0100000 -2 1; #
-rw11::div_testdqr $cpu sym 0100000 -2 32767; #
-rw11::div_testdqr $cpu sym 0100000 -32767 0; #
-rw11::div_testdqr $cpu sym 0100000 -32767 1; #
-rw11::div_testdqr $cpu sym 0100000 -32767 32767; #
-rw11::div_testdqr $cpu sym 0100000 -32768 0; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 -32768 1; # BAD-R4
-rw11::div_testdqr $cpu sym 0100000 -32768 32767; # BAD-R4
-#
-#
-rlc log " test dr=077777 boundary cases (dr = max pos value)"
-rlc log " case dd>0, q>0"
-rw11::div_testdqr $cpu sym 077777 1 0; #
-rw11::div_testdqr $cpu sym 077777 1 1; #
-rw11::div_testdqr $cpu sym 077777 1 32766; #
-rw11::div_testdqr $cpu sym 077777 2 0; #
-rw11::div_testdqr $cpu sym 077777 2 1; #
-rw11::div_testdqr $cpu sym 077777 2 32766; #
-rw11::div_testdqr $cpu sym 077777 32766 0; #
-rw11::div_testdqr $cpu sym 077777 32766 1; #
-rw11::div_testdqr $cpu sym 077777 32766 32766; #
-rw11::div_testdqr $cpu sym 077777 32767 0; #
-rw11::div_testdqr $cpu sym 077777 32767 1; #
-rw11::div_testdqr $cpu sym 077777 32767 32766; #
-rlc log " case dd<0, q<0"
-rw11::div_testdqr $cpu sym 077777 -1 0; #
-rw11::div_testdqr $cpu sym 077777 -1 -1; #
-rw11::div_testdqr $cpu sym 077777 -1 -32766; #
-rw11::div_testdqr $cpu sym 077777 -2 0; #
-rw11::div_testdqr $cpu sym 077777 -2 -1; #
-rw11::div_testdqr $cpu sym 077777 -2 -32766; #
-rw11::div_testdqr $cpu sym 077777 -32767 0; #
-rw11::div_testdqr $cpu sym 077777 -32767 -1; #
-rw11::div_testdqr $cpu sym 077777 -32767 -32766; #
-rw11::div_testdqr $cpu sym 077777 -32768 0; # BAD-R4
-rw11::div_testdqr $cpu sym 077777 -32768 -1; # BAD-R4
-rw11::div_testdqr $cpu sym 077777 -32768 -32766; # BAD-R4
-#
-#
-rlc log " test dd max cases"
-rlc log " case dd>0 dr<0 near nmax*nmax+nmax-1 = +1073774591"
-rw11::div_testdqr $cpu sym -32768 -32768 -1; #
-rw11::div_testdqr $cpu sym -32768 -32768 0; # BAD-R4
-rw11::div_testdqr $cpu sym -32768 -32768 1; # BAD-R4
-rw11::div_testdqr $cpu sym -32768 -32768 32766; # BAD-R4
-rw11::div_testdqr $cpu sym -32768 -32768 32767; # c.c BAD-R4
-rw11::div_testdqr $cpu sym -32768 -32768 32768; # v=1
-rw11::div_testdqr $cpu sym -32768 -32768 32769; # v=1
-rlc log " case dd>0 dr>0 near pmax*pmax+pmax-1 = +1073709055"
-rw11::div_testdqr $cpu sym 32767 32767 -1; #
-rw11::div_testdqr $cpu sym 32767 32767 0; #
-rw11::div_testdqr $cpu sym 32767 32767 1; #
-rw11::div_testdqr $cpu sym 32767 32767 32765; #
-rw11::div_testdqr $cpu sym 32767 32767 32766; # c.c
-rw11::div_testdqr $cpu sym 32767 32767 32767; # v=1
-rw11::div_testdqr $cpu sym 32767 32767 32768; # v=1
-rlc log " case dd<0 dr>0 near nmax*pmax+pmax-1 = -1073741822"
-rw11::div_testdqr $cpu sym 32767 -32768 1; #
-rw11::div_testdqr $cpu sym 32767 -32768 0; # BAD-R4
-rw11::div_testdqr $cpu sym 32767 -32768 -1; # BAD-R4
-rw11::div_testdqr $cpu sym 32767 -32768 -32765; # BAD-R4
-rw11::div_testdqr $cpu sym 32767 -32768 -32766; # c.c BAD-R4
-rw11::div_testdqr $cpu sym 32767 -32768 -32767; # v=1
-rw11::div_testdqr $cpu sym 32767 -32768 -32768; # v=1
-rlc log " case dd<0 dr<0 near pmax*nmax+nmax-1 = -1073741823"
-rw11::div_testdqr $cpu sym -32768 32767 1; #
-rw11::div_testdqr $cpu sym -32768 32767 0; #
-rw11::div_testdqr $cpu sym -32768 32767 -1; #
-rw11::div_testdqr $cpu sym -32768 32767 -32766; #
-rw11::div_testdqr $cpu sym -32768 32767 -32767; # c.c
-rw11::div_testdqr $cpu sym -32768 32767 -32768; # v=1
-rw11::div_testdqr $cpu sym -32768 32767 -32769; # v=1
-#
-#
-rlc log " test late div quit cases in 2 quadrant algorithm"
-# dd dr q r n z v c
-rw11::div_testd2 $cpu sym -32767 -1 32767 0 0 0 0 0; #
-rw11::div_testd2 $cpu sym -32768 -1 0 0 0 0 1 0; #
-rw11::div_testd2 $cpu sym -32769 -1 0 0 0 0 1 0; #
-#
-rw11::div_testd2 $cpu sym -65534 -2 32767 0 0 0 0 0; #
-rw11::div_testd2 $cpu sym -65535 -2 32767 -1 0 0 0 0; #
-rw11::div_testd2 $cpu sym -65536 -2 0 0 0 0 1 0; #
-rw11::div_testd2 $cpu sym -65537 -2 0 0 0 0 1 0; #
-#
-#
-rlc log " test big divident overflow cases"
-# dd dr q r n z v c
-rw11::div_testd2 $cpu sym 0x7fffffff 1 0 0 0 0 1 0; #
-rw11::div_testd2 $cpu sym 0x7fffffff 2 0 0 0 0 1 0; #
-rw11::div_testd2 $cpu sym 0x7fffffff -1 0 0 1 0 1 0; #
-rw11::div_testd2 $cpu sym 0x7fffffff -2 0 0 1 0 1 0; #
-rw11::div_testd2 $cpu sym 0x80000000 1 0 0 1 0 1 0; #
-rw11::div_testd2 $cpu sym 0x80000000 2 0 0 1 0 1 0; #
-rw11::div_testd2 $cpu sym 0x80000000 -1 0 0 0 0 1 0; #
-rw11::div_testd2 $cpu sym 0x80000000 -2 0 0 0 0 1 0; #
Index: trunk/tools/tbench/w11a/test_w11a_dsta_flow.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_dsta_flow.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_dsta_flow.tcl (nonexistent)
@@ -1,147 +0,0 @@
-# $Id: test_w11a_dsta_flow.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2013-2014 by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-03-01 552 1.0.1 use stack:; check sp;
-# 2013-03-31 502 1.0 Initial version
-#
-# Test dsta flow with jsr pc,... instructions
-#
-
-# ----------------------------------------------------------------------------
-rlc log "test_w11a_dsta_flow: test dsta flow with jsr pc,..."
-rlc log " (r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=1,2,3,4,5)"
-
-# code register pre/post conditions beyond defaults
-# r0 #sub00 -> ..same
-# r1 #sub10 -> #sub10+2
-# r2 #psub2 -> #psub2+4
-# r3 #sub30+2 -> #sub30
-# r4 #psub4e -> #psub4
-# r5 #data -> #data+7*2*2
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-stack:
-start: jsr pc,(r0)
-100$: jsr pc,(r1)+
-110$: jsr pc,@(r2)+
-120$: jsr pc,@(r2)+
-121$: jsr pc,-(r3)
-130$: jsr pc,@-(r4)
-140$: jsr pc,@-(r4)
-141$: halt
-stop:
-;
-psub2: .word sub20, sub21
-psub4: .word sub41, sub40
-psub4e:
-sub00: mov #100,(r5)+
- mov (sp),(r5)+
- rts pc
-sub10: mov #110,(r5)+
- mov (sp),(r5)+
- rts pc
-sub20: mov #120,(r5)+
- mov (sp),(r5)+
- rts pc
-sub21: mov #121,(r5)+
- mov (sp),(r5)+
- rts pc
-sub30: mov #130,(r5)+
- mov (sp),(r5)+
- rts pc
-sub40: mov #140,(r5)+
- mov (sp),(r5)+
- rts pc
-sub41: mov #141,(r5)+
- mov (sp),(r5)+
- rts pc
-data: .blkw 2*7.
- .word 177777
-}
-
-rw11::asmrun $cpu sym [list r0 $sym(sub00) \
- r1 $sym(sub10) \
- r2 $sym(psub2) \
- r3 [expr {$sym(sub30)+2}] \
- r4 $sym(psub4e) \
- r5 $sym(data) ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 $sym(sub00) \
- r1 [expr {$sym(sub10)+2}] \
- r2 [expr {$sym(psub2)+4}] \
- r3 $sym(sub30) \
- r4 $sym(psub4) \
- r5 [expr {$sym(data) + 7*2*2}] \
- sp $sym(stack) ]
-rw11::asmtmem $cpu $sym(data) [list \
- 0100 $sym(start:100$) \
- 0110 $sym(start:110$) \
- 0120 $sym(start:120$) \
- 0121 $sym(start:121$) \
- 0130 $sym(start:130$) \
- 0140 $sym(start:140$) \
- 0141 $sym(start:141$) \
- 0177777 ]
-
-# ----------------------------------------------------------------------------
-rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
-
-# code register pre/post conditions beyond defaults
-# r0 #sub00-020 -> ..same
-# r1 #psub10-040 -> ..same
-# r5 #data -> #data+5*2*2
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-stack:
-start: jsr pc,20(r0)
-1100$: jsr pc,@40(r1)
-1110$: jsr pc,sub20
-1120$: jsr pc,@psub30
-1130$: jsr pc,@#sub40
-1140$: halt
-stop:
-;
-psub10: .word sub10
-psub30: .word sub30
-sub00: mov #1100,(r5)+
- mov (sp),(r5)+
- rts pc
-sub10: mov #1110,(r5)+
- mov (sp),(r5)+
- rts pc
-sub20: mov #1120,(r5)+
- mov (sp),(r5)+
- rts pc
-sub30: mov #1130,(r5)+
- mov (sp),(r5)+
- rts pc
-sub40: mov #1140,(r5)+
- mov (sp),(r5)+
- rts pc
-data: .blkw 2*5.
- .word 177777
-}
-
-rw11::asmrun $cpu sym [list r0 [expr {$sym(sub00)-020}] \
- r1 [expr {$sym(psub10)-040}] \
- r5 $sym(data) ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 [expr {$sym(sub00)-020}] \
- r1 [expr {$sym(psub10)-040}] \
- r2 0 \
- r3 0 \
- r4 0 \
- r5 [expr {$sym(data) + 5*2*2}] \
- sp $sym(stack) ]
-rw11::asmtmem $cpu $sym(data) [list \
- 01100 $sym(start:1100$) \
- 01110 $sym(start:1110$) \
- 01120 $sym(start:1120$) \
- 01130 $sym(start:1130$) \
- 01140 $sym(start:1140$) \
- 0177777 ]
Index: trunk/tools/tbench/w11a/test_w11a_dstw_word_flow.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_dstw_word_flow.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_dstw_word_flow.tcl (nonexistent)
@@ -1,102 +0,0 @@
-# $Id: test_w11a_dstw_word_flow.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2013-2014 by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-03-01 552 1.0.1 check that unused regs stay 0
-# 2013-03-31 502 1.0 Initial version
-#
-# Test dstw flow with mov #nnn,... instructions for word access
-#
-
-# ----------------------------------------------------------------------------
-rlc log "test_w11a_dstw_word_flow: test dstw flow for word with mov #nnn,..."
-rlc log " r0,(r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=0,1,2,3,4,5)"
-
-# code register pre/post conditions beyond defaults
-# r0 -> 0100
-# r1 #data1 -> ..same
-# r2 #data2 -> #data2+4
-# r3 #pdata3 -> #pdata3+4
-# r4 #data4e -> #data4e-4
-# r5 #pdat5e -> #pdat5e-4
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov #100,r0
- mov #110,(r1)
- mov #120,(r2)+
- mov #121,(r2)+
- mov #130,@(r3)+
- mov #131,@(r3)+
- mov #141,-(r4)
- mov #140,-(r4)
- mov #151,@-(r5)
- mov #150,@-(r5)
- halt
-stop:
-;
-data1: .word 0
-data2: .word 0,0
-data3: .word 0,0
-data4: .word 0,0
-data4e:
-data5: .word 0,0
-data5e:
-pdata3: .word data3,data3+2
-pdata5: .word data5,data5+2
-pdat5e:
-}
-
-rw11::asmrun $cpu sym [list r1 $sym(data1) \
- r2 $sym(data2) \
- r3 $sym(pdata3) \
- r4 $sym(data4e) \
- r5 $sym(pdat5e) ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 0100 \
- r1 $sym(data1) \
- r2 [expr {$sym(data2) + 4}] \
- r3 [expr {$sym(pdata3) + 4}] \
- r4 [expr {$sym(data4e) - 4}] \
- r5 [expr {$sym(pdat5e) - 4}] ]
-rw11::asmtmem $cpu $sym(data1) {0110 0120 0121 0130 0131 0140 0141 0150 0151}
-
-# ----------------------------------------------------------------------------
-rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
-
-# code register pre/post conditions beyond defaults
-# r0 #data0-020 -> ..same
-# r1 #pdata0-040 -> ..same
-$cpu ldasm -lst lst -sym sym {
- . = 1000
-start: mov #200,20(r0)
- mov #210,@40(r1)
- mov #220,data2
- mov #230,@pdata3
- mov #240,@#data4
- halt
-stop:
-;
-data0: .word 0
-data1: .word 0
-data2: .word 0
-data3: .word 0
-data4: .word 0
-data4e:
-pdata1: .word data1
-pdata3: .word data3
-}
-
-rw11::asmrun $cpu sym [list r0 [expr {$sym(data0)-020}] \
- r1 [expr {$sym(pdata1)-040}] ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 [expr {$sym(data0)-020}] \
- r1 [expr {$sym(pdata1)-040}] \
- r2 0 \
- r3 0 \
- r4 0 \
- r5 0 ]
-rw11::asmtmem $cpu $sym(data0) {0200 0210 0220 0230 0240}
Index: trunk/tools/tbench/w11a/test_w11a_inst_traps.tcl
===================================================================
--- trunk/tools/tbench/w11a/test_w11a_inst_traps.tcl (revision 31)
+++ trunk/tools/tbench/w11a/test_w11a_inst_traps.tcl (nonexistent)
@@ -1,90 +0,0 @@
-# $Id: test_w11a_inst_traps.tcl 683 2015-05-17 21:54:35Z mueller $
-#
-# Copyright 2013-2014 by Walter F.J. Mueller
-# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
-#
-# Revision History:
-# Date Rev Version Comment
-# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
-# 2014-03-01 552 1.0.1 check that unused regs stay 0; use stack:; check sp;
-# 2013-04-01 502 1.0 Initial version
-#
-# Test trap type instructions: bpt,iot, emt nn, trap nn
-#
-
-# ----------------------------------------------------------------------------
-rlc log "test_w11a_inst_traps: test trap type instructions"
-
-# code register pre/post conditions beyond defaults
-# r5 #data -> #data+6*5*2
-$cpu ldasm -lst lst -sym sym {
- . = 14
- .word h.bpt ; vec 14: bpt
- .word 340
- .word h.iot ; vec 20: iot
- .word 341
- . = 30
- .word h.emt ; vec 30: emt
- .word 342
- .word h.trp ; vec 34: trap
- .word 343
-;
- psw = 177776
-;
- . = 1000
-stack:
-start: mov #350,@#psw
- bpt
-350$: mov #351,@#psw
- iot
-351$: mov #352,@#psw
- emt 100
-352$: mov #353,@#psw
- emt 200
-353$: mov #354,@#psw
- trap 10
-354$: mov #355,@#psw
- trap 20
-355$: halt
-stop:
-;
-h.bpt: mov @#psw,(r5)+ ; record psw
- mov #1014,(r5)+ ; record trap id
- br iexit
-h.iot: mov @#psw,(r5)+
- mov #1020,(r5)+
- br iexit
-h.emt: mov @#psw,(r5)+
- mov #1030,(r5)+
- br iexit
-h.trp: mov @#psw,(r5)+
- mov #1034,(r5)+
-;
-iexit: mov (sp),r4 ; get stack PC
- mov r4,(r5)+ ; record PC
- mov 2(sp),(r5)+ ; record stack PS
- mov -2(r4),(r5)+ ; record opcode of trap
- rti
-;
-data: .blkw 6.*5.
- .word 177777
-}
-
-rw11::asmrun $cpu sym [list r5 $sym(data) ]
-rw11::asmwait $cpu sym
-rw11::asmtreg $cpu [list r0 0 \
- r1 0 \
- r2 0 \
- r3 0 \
- r5 [expr {$sym(data) + 6*5*2}] \
- sp $sym(stack) ]
-
-# data: trap ps; trap id; stack-pc; stack-ps opcode
-rw11::asmtmem $cpu $sym(data) \
- [list 000340 001014 $sym(start:350$) 000350 0000003 \
- 000341 001020 $sym(start:351$) 000351 0000004 \
- 000342 001030 $sym(start:352$) 000352 0104100 \
- 000342 001030 $sym(start:353$) 000353 0104200 \
- 000343 001034 $sym(start:354$) 000354 0104410 \
- 000343 001034 $sym(start:355$) 000355 0104420 \
- 0177777 ]
Index: trunk/tools/tbench/w11a
===================================================================
--- trunk/tools/tbench/w11a (revision 31)
+++ trunk/tools/tbench/w11a (nonexistent)
trunk/tools/tbench/w11a
Property changes :
Deleted: svn:ignore
## -1,33 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
Index: trunk/tools/tbench/test_rhrp_basics.tcl
===================================================================
--- trunk/tools/tbench/test_rhrp_basics.tcl (nonexistent)
+++ trunk/tools/tbench/test_rhrp_basics.tcl (revision 30)
@@ -0,0 +1,200 @@
+# $Id: test_rhrp_basics.tcl 667 2015-04-18 20:16:05Z mueller $
+#
+# Copyright 2015- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2015-03-29 660 1.0 Initial version
+#
+# Test basic access
+# 1. ibus/rbus ack (for cs1:cs3) and no ack (cs3+2)
+# 2. unit enable/disable and cs2.ned response
+# 3. drive type logic
+# 4. readability of all regs (enabled and diabled unit, check cs2.ned)
+
+# ----------------------------------------------------------------------------
+rlc log "test_rhrp_basics: basic access tests --------------------------------"
+rlc log " setup context"
+package require ibd_rhrp
+ibd_rhrp::setup
+
+rlc set statmask $rw11::STAT_DEFMASK
+rlc set statvalue 0
+
+rlc log " A1: test that cs1,cs3 give ack, cs3+2 gives no ack --------"
+
+set iaddrfail [expr {[cpu0 imap rpa.cs3] + 2}]
+
+rlc log " A1.1: rem read cs1,cs3,cs3+1 -----------------------"
+
+$cpu cp -ribr rpa.cs1 \
+ -ribr rpa.cs3 \
+ -ribr $iaddrfail -estaterr
+
+rlc log " A1.2: loc read cs1,cs3,cs3+1 -----------------------"
+
+$cpu cp -rma rpa.cs1 \
+ -rma rpa.cs3 \
+ -rma $iaddrfail -estaterr
+
+rlc log " A2: test unit enable, dt and cs2.ned ----------------------"
+rlc log " A2.1: disable unit 0 -------------------------------"
+
+#
+# select rem and loc unit 0; disable unit
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}]
+
+rlc log " A2.2: check dt read and cs2.ned --------------------"
+set cs2ned [regbld ibd_rhrp::CS2 ned]
+$cpu cp -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -rma rpa.dt \
+ -rma rpa.cs2 -edata $cs2ned $cs2ned
+
+rlc log " A2.3: enable unit 0 as RP06; check cs2.ned, dt -----"
+
+# check for cs2.ned=0 response on dt read (after cs1.tre=1)
+# unit 0 selected rem and loc from previous section
+$cpu cp -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -rma rpa.dt -edata $ibd_rhrp::DT_RP06 \
+ -rma rpa.cs2 -edata 0 $cs2ned
+
+rlc log " A3: set drive types, check proper dt response -------------"
+
+# dte dt
+set tbl [list $ibd_rhrp::DTE_RP04 $ibd_rhrp::DT_RP04 \
+ $ibd_rhrp::DTE_RP06 $ibd_rhrp::DT_RP06 \
+ $ibd_rhrp::DTE_RM04 $ibd_rhrp::DT_RM04 \
+ $ibd_rhrp::DTE_RM80 $ibd_rhrp::DT_RM80 \
+ $ibd_rhrp::DTE_RM05 $ibd_rhrp::DT_RM05 \
+ $ibd_rhrp::DTE_RP07 $ibd_rhrp::DT_RP07 ]
+
+# unit 0 enabled and selected rem and loc from previous section
+foreach {dte dt} $tbl {
+ $cpu cp -wibr rpa.dt $dte \
+ -ribr rpa.dt -edata $dte \
+ -rma rpa.dt -edata $dt
+}
+
+rlc log " A4: check unit selection and that units are distinct ------"
+
+rlc log " A4.1: setup units: 0: RP04 1:off 2:RP06 3:off ------"
+
+# unit dpr dte dt
+set tbl [list 0 1 $ibd_rhrp::DTE_RP04 $ibd_rhrp::DT_RP04 \
+ 1 0 0 0 \
+ 2 1 $ibd_rhrp::DTE_RP06 $ibd_rhrp::DT_RP06 \
+ 3 0 0 0]
+
+foreach {unit dpr dte dt} $tbl {
+ $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS [list dpr $dpr]] \
+ -wibr rpa.dt $dte
+}
+
+rlc log " A4.2: readback dt rem and loc; check cs2.ned -------"
+
+set dsmsk [regbld ibd_rhrp::DS dpr]
+set cs2msk [regbld ibd_rhrp::CS2 ned {unit 3}]
+foreach {unit dpr dte dt} $tbl {
+ set dsval [regbld ibd_rhrp::DS [list dpr $dpr]]
+ set cs2val [regbld ibd_rhrp::CS2 [list ned [expr {1-$dpr}]] [list unit $unit]]
+ $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
+ -ribr rpa.ds -edata $dsval $dsmsk \
+ -ribr rpa.dt -edata $dte \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -rma rpa.dt -edata $dt \
+ -rma rpa.cs2 -edata $cs2val $cs2msk
+}
+
+rlc log " A5: check cs2.ned for all regs on disabled unit -----------"
+
+# use setting from last section: drive 0 on, drive 1 off
+# addr mb
+set tbl [list rpa.cs1 1 \
+ rpa.wc 0 \
+ rpa.ba 0 \
+ rpa.da 1 \
+ rpa.cs2 0 \
+ rpa.ds 1 \
+ rpa.er1 1 \
+ rpa.as 1 \
+ rpa.la 1 \
+ rpa.db 0 \
+ rpa.mr1 1 \
+ rpa.dt 1 \
+ rpa.sn 1 \
+ rpa.of 1 \
+ rpa.dc 1 \
+ rpa.m13 1 \
+ rpa.m14 1 \
+ rpa.m15 1 \
+ rpa.ec1 1 \
+ rpa.ec2 1 \
+ rpa.bae 0 \
+ rpa.cs3 0 \
+ ]
+
+# Note: First unit 1 (enabled) selected, and cs1.tre=1 done
+# Than unit 1 (disabled) selected, and registered read
+# This ensures that cs2.ned is really cleared, because a cs1.tre=1
+# write while a disabled drive is selected will clear and set ned !!
+set cs2msk [regbld ibd_rhrp::CS2 ned {unit -1}]
+foreach {addr mb} $tbl {
+ set cs2val [regbld ibd_rhrp::CS2 [list ned $mb] {unit 1}]
+ $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma $addr \
+ -rma rpa.cs2 -edata $cs2val $cs2msk
+}
+
+rlc log " A6: check cs2.ned for all regs on enable unit -------------"
+
+# select drive 0 (on); cs1.tre=1; read all regs; check cs2 at end once (sticky)
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit 0]] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -rma rpa.cs1 \
+ -rma rpa.wc \
+ -rma rpa.ba \
+ -rma rpa.da
+
+$cpu cp -rma rpa.cs2 \
+ -rma rpa.ds \
+ -rma rpa.er1 \
+ -rma rpa.as \
+ -rma rpa.la \
+ -rma rpa.db \
+ -rma rpa.mr1
+
+$cpu cp -rma rpa.dt \
+ -rma rpa.sn \
+ -rma rpa.of \
+ -rma rpa.dc \
+ -rma rpa.m13 \
+ -rma rpa.m14 \
+ -rma rpa.m15
+
+$cpu cp -rma rpa.ec1 \
+ -rma rpa.ec2 \
+ -rma rpa.bae \
+ -rma rpa.cs3 \
+ -rma rpa.cs2 -edata 0 [regbld ibd_rhrp::CS2 ned]
+
+rlc log " A7: check that unit 3-7 are loc selectable, but off -------"
+rlc log " A7.1: loc read dt for unit 3-7 ; check cs2.unit+ned"
+
+set cs2msk [regbld ibd_rhrp::CS2 ned {unit -1}]
+foreach {unit} {4 5 6 7} {
+ set cs2val [regbld ibd_rhrp::CS2 ned [list unit $unit]]
+ $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -rma rpa.dt -edata 0 \
+ -rma rpa.cs2 -edata $cs2val $cs2msk
+}
+
Index: trunk/tools/tbench/test_cp_gpr.tcl
===================================================================
--- trunk/tools/tbench/test_cp_gpr.tcl (nonexistent)
+++ trunk/tools/tbench/test_cp_gpr.tcl (revision 30)
@@ -0,0 +1,64 @@
+# $Id: test_cp_gpr.tcl 676 2015-05-09 16:31:54Z mueller $
+#
+# Copyright 2013- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2013-03-31 502 1.0 Initial version
+#
+# Test that general purpose registers are writable and readable via cp
+# check all 16 registers, especially that
+# set 0 and 1 are distinct
+# k,s,u mode sp are distinct
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_cp_gpr: test cp access to general purpose registers ------------"
+rlc log " write set 0"
+$cpu cp -wps 0000000
+$cpu cp -wr0 0000001 \
+ -wr1 0000101
+$cpu cp -wr2 0000201 \
+ -wr3 0000301
+$cpu cp -wr4 0000401 \
+ -wr5 0000501
+
+rlc log " write set 1"
+$cpu cp -wps 0004000
+$cpu cp -wr0 0010001 \
+ -wr1 0010101
+$cpu cp -wr2 0010201 \
+ -wr3 0010301
+$cpu cp -wr4 0010401 \
+ -wr5 0010501
+
+rlc log " write all sp and pc"
+$cpu cp -wps 0000000 -wsp 0000601; # ksp
+$cpu cp -wps 0040000 -wsp 0010601; # ssp
+$cpu cp -wps 0140000 -wsp 0020601; # usp
+$cpu cp -wps 0000000 -wpc 0000701; # pc
+
+rlc log " read set 0"
+$cpu cp -wps 0000000; # set 0
+$cpu cp -rr0 -edata 0000001 \
+ -rr1 -edata 0000101
+$cpu cp -rr2 -edata 0000201 \
+ -rr3 -edata 0000301
+$cpu cp -rr4 -edata 0000401 \
+ -rr5 -edata 0000501
+
+rlc log " read set 1"
+$cpu cp -wps 0004000; # set 1
+$cpu cp -rr0 -edata 0010001 \
+ -rr1 -edata 0010101
+$cpu cp -rr2 -edata 0010201 \
+ -rr3 -edata 0010301
+$cpu cp -rr4 -edata 0010401 \
+ -rr5 -edata 0010501
+
+rlc log " read all sp and pc"
+$cpu cp -wps 0000000 -rsp -edata 0000601; # ksp
+$cpu cp -wps 0040000 -rsp -edata 0010601; # ssp
+$cpu cp -wps 0140000 -rsp -edata 0020601; # usp
+$cpu cp -wps 0000000 -rpc -edata 0000701; # pc
Index: trunk/tools/tbench/test_cp_ibrbasics.tcl
===================================================================
--- trunk/tools/tbench/test_cp_ibrbasics.tcl (nonexistent)
+++ trunk/tools/tbench/test_cp_ibrbasics.tcl (revision 30)
@@ -0,0 +1,98 @@
+# $Id: test_cp_ibrbasics.tcl 676 2015-05-09 16:31:54Z mueller $
+#
+# Copyright 2014- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-12-26 621 1.1 test membe
+# 2014-03-02 552 1.0 Initial version
+#
+# Test very basic memory interface gymnastics
+# 2. write/read IB space via bwm/brm (use MMU SAR SM I regs)
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_cp_ibrbasics: Test very basic ibus interface gymnastics --------"
+
+rlc log " write/read ibus space (MMU SAR SM I regs) via bwm/brm"
+$cpu cp -wal 0172240 \
+ -bwm {012340 012342 012344}
+
+$cpu cp -wal 0172240 \
+ -brm 3 -edata {012340 012342 012344}
+
+rlc log " write/read ibus space (MMU SAR SM I regs) via wibr/ribr"
+$cpu cp -ribr 0172240 -edata 012340 \
+ -ribr 0172242 -edata 012342 \
+ -ribr 0172244 -edata 012344
+$cpu cp -wibr 0172240 022340 \
+ -wibr 0172242 022342 \
+ -wibr 0172244 022344
+$cpu cp -ribr 0172240 -edata 022340 \
+ -ribr 0172242 -edata 022342 \
+ -ribr 0172244 -edata 022344
+
+rlc log " membe with wibr (non sticky)"
+$cpu cp -wibr 0172240 0x0100 \
+ -wibr 0172242 0x0302 \
+ -wibr 0172244 0x0504
+rlc log " membe = 0 (no byte selected)"
+$cpu cp -wmembe 0 \
+ -wibr 0172242 0xffff \
+ -rmembe -edata 0x03 \
+ -ribr 0172242 -edata 0x0302
+rlc log " membe = 1 (lsb selected)"
+$cpu cp -wmembe 0x01 \
+ -wibr 0172242 0xffaa \
+ -rmembe -edata 0x03 \
+ -ribr 0172242 -edata 0x03aa
+rlc log " membe = 2 (msb selected)"
+$cpu cp -wmembe 0x02 \
+ -wibr 0172242 0xbbff \
+ -rmembe -edata 0x03 \
+ -ribr 0172242 -edata 0xbbaa
+
+$cpu cp -ribr 0172240 -edata 0x0100 \
+ -ribr 0172242 -edata 0xbbaa \
+ -ribr 0172244 -edata 0x0504
+
+rlc log " membe with wibr (sticky)"
+$cpu cp -wibr 0172240 0x1110 \
+ -wibr 0172242 0x1312 \
+ -wibr 0172244 0x1514
+
+rlc log " membe = 0 + stick (no byte selected)"
+$cpu cp -wmembe 0 -stick \
+ -wibr 0172242 0xffff \
+ -rmembe -edata 0x04 \
+ -ribr 0172242 -edata 0x1312
+
+rlc log " membe = 1 + stick (lsb selected)"
+$cpu cp -wmembe 1 -stick \
+ -wibr 0172240 0xffaa \
+ -rmembe -edata 0x05 \
+ -wibr 0172242 0xffbb \
+ -rmembe -edata 0x05 \
+ -wibr 0172244 0xffcc \
+ -rmembe -edata 0x05
+$cpu cp -ribr 0172240 -edata 0x11aa \
+ -ribr 0172242 -edata 0x13bb \
+ -ribr 0172244 -edata 0x15cc
+
+rlc log " membe = 2 + stick (msb selected)"
+$cpu cp -wmembe 2 -stick \
+ -wibr 0172240 0xccff \
+ -rmembe -edata 0x06 \
+ -wibr 0172242 0xbbff \
+ -rmembe -edata 0x06 \
+ -wibr 0172244 0xaaff \
+ -rmembe -edata 0x06
+$cpu cp -ribr 0172240 -edata 0xccaa \
+ -ribr 0172242 -edata 0xbbbb \
+ -ribr 0172244 -edata 0xaacc
+rlc log " membe = 3 again"
+$cpu cp -wmembe 3 \
+ -rmembe -edata 0x03
+
+# --------------------------------------------------------------------
Index: trunk/tools/tbench/test_rhrp_func_reg.tcl
===================================================================
--- trunk/tools/tbench/test_rhrp_func_reg.tcl (nonexistent)
+++ trunk/tools/tbench/test_rhrp_func_reg.tcl (revision 30)
@@ -0,0 +1,149 @@
+# $Id: test_rhrp_func_reg.tcl 668 2015-04-25 14:31:19Z mueller $
+#
+# Copyright 2015- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2015-03-29 660 1.0 Initial version
+#
+# Test functions - register level
+# A:
+
+# ----------------------------------------------------------------------------
+rlc log "test_rhrp_func_reg: test functions - register level -----------------"
+rlc log " setup: unit 0:RP06(mol), 1:RM05(mol,wrl), 2: RP07(mol=0), 3: off"
+package require ibd_rhrp
+ibd_rhrp::setup
+
+rlc set statmask $rw11::STAT_DEFMASK
+rlc set statvalue 0
+
+# configure drives
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol wrl] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
+
+# setup system: select unit 0; clr errors (cs1.tre and func=dclr); clear ATs
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
+ -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr mol dry]
+
+# -- Section A -- function basics --------------------------------------------
+rlc log " A -- function basics ----------------------------------------------"
+rlc log " A1: test cs1 func basics ----------------------------------"
+rlc log " A1.1a: func noop; check no as ----------------------"
+
+set dsmsk [regbld ibd_rhrp::DS ata dpr]
+
+$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_NOOP] \
+ -rma rpa.as -edata 0x0 \
+ -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr] $dsmsk
+
+rlc log " A2.1a: test invalid function (037) -----------------"
+
+$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func 037]
+
+rlc log " A2.1b: check as,er1.ilf,ds.ata; clear as; recheck --"
+
+$cpu cp -rma rpa.as -edata [regbld ibd_rhrp::AS u0] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] \
+ -rma rpa.ds -edata [regbld ibd_rhrp::DS ata dpr] $dsmsk \
+ -wma rpa.as [regbld ibd_rhrp::AS u0] \
+ -rma rpa.as -edata 0x0 \
+ -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr] $dsmsk
+
+rlc log " A2.2a: func dclr; check no as and er1 clear --------"
+
+$cpu cp -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -rma rpa.as -edata 0x0 \
+ -rma rpa.er1 -edata 0x0
+
+# -- Section B -- state functions --------------------------------------------
+rlc log " B -- state functions ----------------------------------------------"
+
+# -- Section C -- seek functions ---------------------------------------------
+rlc log " C -- seek functions -----------------------------------------------"
+
+# -- Section D -- transfer functions -----------------------------------------
+rlc log " D -- transfer functions -------------------------------------------"
+rlc log " D1: test func read sequence -------------------------------"
+rlc log " D1.1: issue func with ie=0 ---------------------------"
+
+# discard pending attn to be on save side
+rlc wtlam 0.
+rlc exec -attn
+
+set attnmsk [expr {1<<$ibd_rhrp::ANUM}]
+
+set ba 0x1000
+set wc [expr {0xffff & (-256)}]
+set da [regbld ibd_rhrp::DA {ta 2} {sa 1}]
+set dc 0x0003
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -wma rpa.ba $ba \
+ -wma rpa.bae 0x0 \
+ -wma rpa.wc $wc \
+ -wma rpa.da $da \
+ -wma rpa.dc $dc \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_READ]
+
+rlc log " D1.2: loc status check: cs1.rdy=0, ds.dry=0 ----------"
+
+$cpu cp -rma rpa.cs1 -edata 0 [regbld ibd_rhrp::CS1 rdy] \
+ -rma rpa.ds -edata 0 [regbld ibd_rhrp::DS dry]
+
+rlc log " D1.3: rem status check: attn + state -----------------"
+
+rlc exec -attn -edata $attnmsk
+
+# check rdy=0 ie=0 func=read
+set cs1val [regbld ibd_rhrp::CS1 [list func $ibd_rhrp::FUNC_READ]]
+set cs1msk [regbld ibd_rhrp::CS1 rdy ie {func -1}]
+# expect ds mol=1 dpr=1 dry=0
+set dsval [regbld ibd_rhrp::DS mol dpr]
+
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_CUNIT] \
+ -ribr rpa.cs1 -edata $cs1val $cs1msk \
+ -ribr rpa.ba -edata $ba \
+ -ribr rpa.bae -edata 0x0 \
+ -ribr rpa.wc -edata $wc \
+ -ribr rpa.da -edata $da \
+ -ribr rpa.dc -edata $dc \
+ -ribr rpa.ds -edata $dsval
+
+rlc log " D1.4: rem send response ------------------------------"
+
+set ba [expr {0xffff & (-$wc)}]
+set da [regbld ibd_rhrp::DA {ta 2} {sa 2}]
+
+$cpu cp -wibr rpa.ba $ba \
+ -wibr rpa.wc 0x0 \
+ -wibr rpa.da $da \
+ -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_DONE]
+
+rlc log " D1.5: loc check: cs1.rdy=1, ds.dry=1 -----------------"
+
+# expect cs1 sc=0 tre=0 dva=1 rdy=1 ie=0 func=read go=0
+set cs1val [regbld ibd_rhrp::CS1 dva rdy [list func $ibd_rhrp::FUNC_READ]]
+# expect ds ata=0 mol=1 dpr=1 dry=1
+set dsval [regbld ibd_rhrp::DS mol dpr dry]
+
+$cpu cp -rma rpa.cs1 -edata $cs1val \
+ -rma rpa.ba -edata $ba \
+ -rma rpa.wc -edata 0x0 \
+ -rma rpa.da -edata $da \
+ -rma rpa.ds -edata $dsval
Index: trunk/tools/tbench/test_cp_membasics.tcl
===================================================================
--- trunk/tools/tbench/test_cp_membasics.tcl (nonexistent)
+++ trunk/tools/tbench/test_cp_membasics.tcl (revision 30)
@@ -0,0 +1,72 @@
+# $Id: test_cp_membasics.tcl 676 2015-05-09 16:31:54Z mueller $
+#
+# Copyright 2014- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-03-02 552 1.0 Initial version
+#
+# Test very basic memory interface gymnastics
+# 1. write/read address register
+# 2. write/read memory via wm/wmi/rm/rmi (16 bit mode)
+# 3. write/read memory via bwm/brm (16 bit mode)
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_cp_membasics: Test very basic memory interface gymnastics ------"
+
+# --------------------------------------------------------------------
+rlc log " write/read address register"
+
+# test wal
+$cpu cp -wal 002000 \
+ -ral -edata 002000 \
+ -rah -edata 000000
+
+# test wah+wal
+$cpu cp -wal 003000 \
+ -wah 000001 \
+ -ral -edata 003000 \
+ -rah -edata 000001
+
+# --------------------------------------------------------------------
+rlc log " write/read memory via wm/wmi/rm/rmi (16 bit mode)"
+
+# simple write/read without increment
+$cpu cp -wal 002000 \
+ -wm 001100 \
+ -ral -edata 002000 \
+ -rah -edata 000000 \
+ -rm -edata 001100
+
+# double write + single read, check overwrite
+$cpu cp -wal 002000 \
+ -wm 002200 \
+ -wm 002210 \
+ -ral -edata 002000 \
+ -rah -edata 000000 \
+ -rm -edata 002210
+
+# double write/read with increment
+$cpu cp -wal 002100 \
+ -wmi 003300 \
+ -wmi 003310 \
+ -wmi 003320 \
+ -ral -edata 002106 \
+ -rah -edata 000000
+
+$cpu cp -wal 002100 \
+ -rmi -edata 003300 \
+ -rmi -edata 003310 \
+ -rmi -edata 003320 \
+ -ral -edata 002106 \
+ -rah -edata 000000
+
+# --------------------------------------------------------------------
+rlc log " write/read memory via bwm/brm (16 bit mode)"
+$cpu cp -wal 02200 \
+ -bwm {007700 007710 007720 007730}
+
+$cpu cp -wal 02200 \
+ -brm 4 -edata {007700 007710 007720 007730}
Index: trunk/tools/tbench/test_rhrp_int.tcl
===================================================================
--- trunk/tools/tbench/test_rhrp_int.tcl (nonexistent)
+++ trunk/tools/tbench/test_rhrp_int.tcl (revision 30)
@@ -0,0 +1,490 @@
+# $Id: test_rhrp_int.tcl 678 2015-05-10 16:23:02Z mueller $
+#
+# Copyright 2015- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2015-05-04 674 1.1 w11a start/stop/suspend overhaul
+# 2015-03-29 667 1.0 Initial version
+#
+# Test interrupt response
+# A:
+
+# ----------------------------------------------------------------------------
+rlc log "test_rhrp_int: test interrupt response ------------------------------"
+rlc log " setup: unit 0:RP06(mol), 1:RM05(mol,wrl), 2: RP07(mol=0), 3: off"
+package require ibd_rhrp
+ibd_rhrp::setup
+
+rlc set statmask $rw11::STAT_DEFMASK
+rlc set statvalue 0
+
+# configure drives
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol wrl] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
+
+# clear errors: cs1.tre=1 via unit 0
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
+ -rma rpa.ds -edata [regbld ibd_rhrp::DS dpr mol dry]
+
+# load test code
+$cpu ldasm -lst lst -sym sym {
+ .include |lib/defs_cpu.mac|
+ .include |lib/defs_rp.mac|
+;
+ .include |lib/vec_cpucatch.mac|
+;
+ . = 000254 ; setup RHRP interrupt vector
+v..rp: .word vh.rp
+ .word cp.pr7
+;
+ . = 1000 ; data area
+stack:
+ibuf: .blkw 4. ; input buffer
+rint: .word 0 ; reinterrupt
+;
+icnt: .word 0 ; interrupt count
+pcnt: .word 0 ; poll count
+obuf: .blkw 6. ; output buffer
+fbuf: .blkw 5. ; final buffer
+;
+ . = 2000 ; code area
+start: spl 7 ; lock out interrupts
+ clr icnt ; clear counters
+ clr pcnt
+;
+ mov #obuf,r0 ; clear obuf
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr r5 ; r5 used to time int delay
+;
+ mov #ibuf,r0 ; setup regs from ibuf
+ mov (r0)+,@#rp.cs2 ; cs2
+ mov (r0)+,@#rp.da ; da
+ mov (r0)+,@#rp.dc ; dc
+ mov (r0)+,@#rp.cs1 ; cs1
+ spl 0 ; allow interrupts
+;
+ inc r5 ; time int delay, up to 10 instructions
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+ inc r5
+;
+poll: inc pcnt ; count polls
+ tstb @#rp.cs1 ; check cs1 rdy
+ bpl poll ; if rdy=0 keep polling
+ tst icnt ; did we have an interrupt ?
+ bne 1$ ;
+;
+ mov #obuf,r0 ; store regs in obuf
+ mov @#rp.cs1,(r0)+ ; cs1
+ mov @#rp.cs2,(r0)+ ; cs2
+ mov @#rp.er1,(r0)+ ; er1
+ mov @#rp.ds,(r0)+ ; ds
+ mov @#rp.as,(r0)+ ; as
+;
+1$: tst rint ; re-interrupt wanted ?
+ bne 2$ ;
+ mov #377,@#rp.as ; if not, cancel all attentions
+ clr rint
+;
+2$: bit #rp.erp,@#rp.ds ; ds.erp = 1 ? any controller errors ?
+ beq 3$
+ mov #,@#rp.cs1 ; than do drive clear
+;
+3$: bit #rp.tre,@#rp.cs1 ; cs1.tre = 1 ? any transfer errors ?
+ beq 4$
+ mov #rp.tre,@#rp.cs1 ; if yes, clear them with tre=1 write
+;
+4$: mov #fbuf,r0 ; store final regs in fbuf
+ mov @#rp.cs1,(r0)+ ; cs1
+ mov @#rp.cs2,(r0)+ ; cs2
+ mov @#rp.er1,(r0)+ ; er1
+ mov @#rp.ds,(r0)+ ; ds
+ mov @#rp.as,(r0)+ ; as
+
+ halt ; halt if done
+stop:
+;
+ clr pcnt ; clear pcnt again
+ mov #obuf,r0 ; clear obuf again
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+ clr (r0)+
+;
+ mov #rp.ie,@#rp.cs1 ; re-enable interrupt
+ br poll
+
+; RHRP interrupt handler
+vh.rp: mov #obuf,r0 ; store regs in obuf
+ mov @#rp.cs1,(r0)+ ; cs1
+ mov @#rp.cs2,(r0)+ ; cs2
+ mov @#rp.er1,(r0)+ ; er1
+ mov @#rp.ds,(r0)+ ; ds
+ mov @#rp.as,r1 ;
+ mov r1,(r0)+ ; as
+ mov r5,(r0)+ ; int delay
+;
+1$: tst icnt ; test first interrupt
+ beq 2$ ; if yes quit
+ mov r1,@#rp.as ; if not, clear as
+2$: inc icnt ; count interrupts
+ rti ; and return
+}
+
+##puts $lst
+
+# define tmpproc for readback checks
+proc tmpproc_dotest {cpu symName opts} {
+ upvar 1 $symName sym
+
+ set tout 10.; # FIXME_code: parameter ??
+
+# setup defs hash, first defaults, than write over concrete run values
+ array set defs { i.cs2 0 \
+ i.da 0 \
+ i.dc 0 \
+ i.cs1 0 \
+ i.idly 0 \
+ o.cs1 0 \
+ o.cs2 0 \
+ o.er1 0 \
+ o.ds 0 \
+ o.as 0 \
+ o.itim 10 \
+ o.icnt 0 \
+ o.pcnt 1 \
+ or.cs1 0 \
+ or.cs2 0 \
+ or.er1 0 \
+ or.ds 0 \
+ or.as 0 \
+ or.icnt 0 \
+ or.pcnt 1 \
+ do.rint 0 \
+ do.lam 0
+ }
+ array set defs $opts
+
+ # build ibuf
+ set ibuf [list $defs(i.cs2) $defs(i.da) $defs(i.dc) $defs(i.cs1) \
+ $defs(do.rint)]
+
+ # setup idly, write ibuf, setup stack, and start cpu at start:
+ $cpu cp -wibr rpa.cs1 [regbld ibd_rhrp::RCS1 \
+ [list val $defs(i.idly)] \
+ [list func $ibd_rhrp::RFUNC_WIDLY] ] \
+ -wal $sym(ibuf) \
+ -bwm $ibuf \
+ -wsp $sym(stack) \
+ -stapc $sym(start)
+
+ # here do minimal lam handling (harvest + send DONE)
+ if {$defs(do.lam)} {
+ rlc wtlam $tout apat
+ $cpu cp -attn \
+ -wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_DONE]
+ }
+
+ $cpu wtcpu -reset $tout
+
+ # determine regs after cleanup
+ set cs1msk [rutil::com16 [regbld ibd_rhrp::CS1 {func -1}]]
+ set fcs2 [expr {$defs(o.cs2) & 0x00ff}]; # cs1.tre clears upper byte !
+ set fer1 0
+ if {!$defs(do.rint)} { # no reinterrupt, ata clear by cpu
+ set fcs1 [expr {$defs(o.cs1) & ~[regbld ibd_rhrp::CS1 sc tre {func -1}] }]
+ set fds [expr {$defs(o.ds) & ~[regbld ibd_rhrp::DS ata erp] }]
+ set fas 0
+ } else { # reinterrupt, ata still pending
+ set fcs1 [expr {$defs(o.cs1) & ~[regbld ibd_rhrp::CS1 tre {func -1}] }]
+ set fds [expr {$defs(o.ds) & ~[regbld ibd_rhrp::DS erp] }]
+ set fas $defs(o.as)
+ }
+ $cpu cp -rpc -edata $sym(stop) \
+ -rsp -edata $sym(stack) \
+ -wal $sym(icnt) \
+ -rmi -edata $defs(o.icnt) \
+ -rmi \
+ -rmi -edata $defs(o.cs1) \
+ -rmi -edata $defs(o.cs2) \
+ -rmi -edata $defs(o.er1) \
+ -rmi -edata $defs(o.ds) \
+ -rmi -edata $defs(o.as) \
+ -rmi -edata $defs(o.itim) \
+ -rmi -edata $fcs1 $cs1msk \
+ -rmi -edata $fcs2 \
+ -rmi -edata $fer1 \
+ -rmi -edata $fds \
+ -rmi -edata $fas
+
+ if {!$defs(do.rint)} return "";
+
+ $cpu cp -start
+
+ $cpu wtcpu -reset $tout
+
+ # determine regs after cleanup
+ set fcs1 [expr {$defs(or.cs1) & ~[regbld ibd_rhrp::CS1 sc] }]
+ set fcs2 $defs(or.cs2)
+ set fer1 0
+ set fds [expr {$defs(or.ds) & ~[regbld ibd_rhrp::DS ata] }]
+ set fas 0
+
+ $cpu cp -rpc -edata $sym(stop) \
+ -rsp -edata $sym(stack) \
+ -wal $sym(icnt) \
+ -rmi -edata $defs(or.icnt) \
+ -rmi \
+ -rmi -edata $defs(or.cs1) \
+ -rmi -edata $defs(or.cs2) \
+ -rmi -edata $defs(or.er1) \
+ -rmi -edata $defs(or.ds) \
+ -rmi -edata $defs(or.as) \
+ -rmi \
+ -rmi -edata $fcs1 \
+ -rmi -edata $fcs2 \
+ -rmi -edata $fer1 \
+ -rmi -edata $fds \
+ -rmi -edata $fas
+
+ return ""
+}
+
+# discard pending attn to be on save side
+rlc wtlam 0.
+rlc exec -attn
+
+# -- Section A ---------------------------------------------------------------
+rlc log " A -- function basics ----------------------------------------------"
+rlc log " A1: test rdy and ie logic ---------------------------------"
+rlc log " A1.1 set cs1.ie=1 alone -> no interrupt ------------"
+
+# Note: no interrupt, so ie stays on !
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie] \
+ o.icnt 0 \
+ o.cs1 [regbld ibd_rhrp::CS1 dva rdy ie] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS mol dpr dry] \
+ o.as 0 \
+ o.itim 0
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A1.2 set cs1.ie=1 with rdy=1 -> software interrupt -"
+
+# Note: interrupt, so ie switched off again !
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 rdy ie] \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 dva rdy] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS mol dpr dry] \
+ o.as 0 \
+ o.itim 1
+ ]
+
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A2: test state functions: iff no, as yes ------------------"
+rlc log " A2.1 noop function ---------------------------------"
+
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie go] \
+ o.cs1 [regbld ibd_rhrp::CS1 ie dva rdy] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS mol dpr dry] \
+ o.as 0 \
+ o.itim 0
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A2.2 pack acknowledge function (sets ds.vv=1) ------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_PACK]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 $rbcs1func ie go] \
+ o.cs1 [regbld ibd_rhrp::CS1 dva rdy ie $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS mol dpr dry vv] \
+ o.as 0 \
+ o.itim 0
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3: test seek type functions: iff no, as yes --------------"
+
+rlc log " A3.1 seek function, ie=0, valid da,dc---------------"
+
+# check that cs1.sc=1, ds.ata=1, and as.u0=1
+set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 $rbcs1func go] \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 0
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.2 seek function, valid da,dc, idly=0 ------------"
+
+# check re-interrupt too
+set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 814 \
+ i.idly 0 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 1 \
+ do.rint 1 \
+ or.icnt 2 \
+ or.cs1 [regbld ibd_rhrp::CS1 sc dva rdy] \
+ or.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ or.er1 0 \
+ or.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ or.as [regbld ibd_rhrp::AS u0]
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.3 seek function, invalid dc ---------------------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_SEEK]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 815 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 [regbld ibd_rhrp::ER1 iae] \
+ o.ds [regbld ibd_rhrp::DS ata erp mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 1
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.4 search function, valid da,dc, idly=0 ----------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 0 \
+ i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
+ i.idly 0 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 1
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.5 search function, valid da,dc, idly=2 ----------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 0 \
+ i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
+ i.idly 2 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 3
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.5 search function, valid da,dc, idly=8 ----------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 0 \
+ i.da [regbld ibd_rhrp::DA {ta 0} {sa 21}] \
+ i.idly 8 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 0 \
+ o.ds [regbld ibd_rhrp::DS ata mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 9
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A3.5 search function, invalid sa, idly=8 -----------"
+# Note: idly is 8, but error ata's come immediately !!
+
+set rbcs1func [list func $ibd_rhrp::FUNC_SEAR]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ i.dc 0 \
+ i.da [regbld ibd_rhrp::DA {ta 0} {sa 22}] \
+ i.idly 8 \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 sc dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.er1 [regbld ibd_rhrp::ER1 iae] \
+ o.ds [regbld ibd_rhrp::DS ata erp mol dpr dry vv] \
+ o.as [regbld ibd_rhrp::AS u0] \
+ o.itim 1
+ ]
+tmpproc_dotest $cpu sym $opts
+
+rlc log " A4: test transfer functions: iff yes, as no ---------------"
+rlc log " A4.1 read function, valid da,dc --------------------"
+
+set rbcs1func [list func $ibd_rhrp::FUNC_READ]
+set opts [list \
+ i.cs1 [regbld ibd_rhrp::CS1 ie $rbcs1func go] \
+ o.icnt 1 \
+ o.cs1 [regbld ibd_rhrp::CS1 dva rdy $rbcs1func] \
+ o.cs2 [regbld ibd_rhrp::CS2 or ir] \
+ o.ds [regbld ibd_rhrp::DS mol dpr dry vv] \
+ do.lam 1
+ ]
+tmpproc_dotest $cpu sym $opts
+
Index: trunk/tools/tbench/rhrp_all.dat
===================================================================
--- trunk/tools/tbench/rhrp_all.dat (nonexistent)
+++ trunk/tools/tbench/rhrp_all.dat (revision 30)
@@ -0,0 +1,8 @@
+# $Id: rhrp_all.dat 668 2015-04-25 14:31:19Z mueller $
+#
+## steering file for all rhrp tests
+#
+test_rhrp_basics.tcl
+test_rhrp_regs.tcl
+test_rhrp_func_reg.tcl
+test_rhrp_int.tcl
Index: trunk/tools/tbench/test_rhrp_regs.tcl
===================================================================
--- trunk/tools/tbench/test_rhrp_regs.tcl (nonexistent)
+++ trunk/tools/tbench/test_rhrp_regs.tcl (revision 30)
@@ -0,0 +1,426 @@
+# $Id: test_rhrp_regs.tcl 678 2015-05-10 16:23:02Z mueller $
+#
+# Copyright 2015- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2015-03-29 660 1.0 Initial version
+#
+# Test register response
+# A: test ba, bae, cs1.bae, wc and db (cntl regs)
+# B: test da, dc (and cc for RP typ)
+# C: test of,mr1,mr2(for RM typ); test NI regs: er2,er3,ec1,ec2
+# D: test hr (for RM typ); ensure unit distinct
+# E: test cs2.clr
+# F: test er1
+
+# ----------------------------------------------------------------------------
+rlc log "test_rhrp_regs: test register response ------------------------------"
+rlc log " setup context; unit 0:RP06, 1:RM05, 2: RP07, 3: off"
+package require ibd_rhrp
+ibd_rhrp::setup
+
+rlc set statmask $rw11::STAT_DEFMASK
+rlc set statvalue 0
+
+# configure drives
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP06 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RM05 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
+ -wibr rpa.dt $ibd_rhrp::DTE_RP07 \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
+ -wibr rpa.ds [regbld ibd_rhrp::DS {dpr 0}]
+
+# clear errors: cs1.tre=1 via unit 0
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [regbld ibd_rhrp::CS1 tre]
+
+# -- Section A ---------------------------------------------------------------
+rlc log " A1: test ba,bae and cs1.bae -------------------------------"
+rlc log " A1.1: loc write ba, read loc and rem ---------------"
+
+$cpu cp -wma rpa.ba 0xffff \
+ -rma rpa.ba -edata 0xfffe \
+ -ribr rpa.ba -edata 0xfffe \
+ -wma rpa.ba 0x0 \
+ -rma rpa.ba -edata 0x0 \
+ -ribr rpa.ba -edata 0x0
+
+rlc log " A1.2: rem write ba, read loc and rem ---------------"
+
+$cpu cp -wibr rpa.ba 0x12ef \
+ -ribr rpa.ba -edata 0x12ee \
+ -rma rpa.ba -edata 0x12ee \
+ -wibr rpa.ba 0x0 \
+ -ribr rpa.ba -edata 0x0 \
+ -rma rpa.ba -edata 0x0
+
+rlc log " A1.3: loc write bae, read l+r bae+cs1.bae ----------"
+
+set cs1msk [regbld ibd_rhrp::CS1 {bae -1}]
+foreach bae {077 071 000} {
+ set cs1val [regbld ibd_rhrp::CS1 [list bae [expr {$bae & 03}]]]
+ $cpu cp -wma rpa.bae $bae \
+ -rma rpa.bae -edata $bae \
+ -rma rpa.cs1 -edata $cs1val $cs1msk \
+ -ribr rpa.bae -edata $bae \
+ -ribr rpa.cs1 -edata $cs1val $cs1msk
+}
+
+rlc log " A1.4: rem write bae, read l+r bae+cs1.bae ----------"
+
+foreach bae {077 071 000} {
+ set cs1val [regbld ibd_rhrp::CS1 [list bae [expr {$bae & 03}]]]
+ $cpu cp -wibr rpa.bae $bae \
+ -ribr rpa.bae -edata $bae \
+ -ribr rpa.cs1 -edata $cs1val $cs1msk \
+ -rma rpa.bae -edata $bae \
+ -rma rpa.cs1 -edata $cs1val $cs1msk
+}
+
+rlc log " A1.5: loc write cs1.bae, read l+r bae+cs1.bae ------"
+
+$cpu cp -wibr rpa.bae 070; # set 3 lbs of bae
+
+foreach cs1bae {03 01 00} {
+ set cs1val [regbld ibd_rhrp::CS1 [list bae $cs1bae]]
+ set bae [expr {070 | $cs1bae}]
+ $cpu cp -wma rpa.cs1 $cs1val \
+ -rma rpa.bae -edata $bae \
+ -rma rpa.cs1 -edata $cs1val $cs1msk \
+ -ribr rpa.bae -edata $bae \
+ -ribr rpa.cs1 -edata $cs1val $cs1msk
+}
+
+# Note: cs1.bae can only be loc written !
+# No need to do this via rem, use bae !!
+# therefore no 'rem write cs1.bae' test
+
+rlc log " A1.6: loc write cs1.func, read loc, ensure distinct "
+
+set funcu0 [regbld ibd_rhrp::CS1 {func 001}]
+set funcu1 [regbld ibd_rhrp::CS1 {func 025}]
+set funcu2 [regbld ibd_rhrp::CS1 {func 037}]
+set funcmsk [regbld ibd_rhrp::CS1 {func -1}]
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 $funcu0 \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.cs1 $funcu1 \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.cs1 $funcu2
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.cs1 -edata $funcu0 $funcmsk \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.cs1 -edata $funcu1 $funcmsk \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.cs1 -edata $funcu2 $funcmsk
+
+# Note: rem read of cs1.func always gives func frozen a go for xfer function !
+# therefore no rem read cs1.func test here
+
+rlc log " A2: test wc; ensure wc,ba distinct ------------------------"
+rlc log " A2.1: loc write wc,ba, read loc and rem ------------"
+
+foreach {wc ba} {0xdead 0x1234 0xbeaf 0x5678} {
+ $cpu cp -wma rpa.wc $wc \
+ -wma rpa.ba $ba \
+ -rma rpa.wc -edata $wc \
+ -rma rpa.ba -edata $ba \
+ -ribr rpa.wc -edata $wc \
+ -ribr rpa.ba -edata $ba
+}
+
+rlc log " A2.2: rem write wc,ba, read loc and rem ------------"
+
+foreach {wc ba} {0x4321 0x3456 0x5432 0x1234} {
+ $cpu cp -wibr rpa.wc $wc \
+ -wibr rpa.ba $ba \
+ -ribr rpa.wc -edata $wc \
+ -ribr rpa.ba -edata $ba \
+ -rma rpa.wc -edata $wc \
+ -rma rpa.ba -edata $ba
+}
+
+rlc log " A3: test db; check cs2.or,ir; ensure ba,dt distinct --"
+
+set cs2msk [regbld ibd_rhrp::CS2 or ir {unit -1}]
+set cs2val [regbld ibd_rhrp::CS2 or ir {unit 0}]
+
+# clear cs2 -> set unit 0; later check that or,ir set, and unit 0
+# only loc tested; rem side irrelevant
+foreach {db ba} {0xdead 0x1234 0xbeaf 0x5678} {
+ $cpu cp -wma rpa.cs2 0 \
+ -wma rpa.db $db \
+ -wma rpa.ba $ba \
+ -rma rpa.cs2 -edata $cs2val $cs2msk \
+ -rma rpa.db -edata $db \
+ -rma rpa.ba -edata $ba
+}
+
+# -- Section B ---------------------------------------------------------------
+rlc log " B1: test da,dc; ensure unit distinct; check cc ------------"
+
+# define tmpproc for readback checks
+proc tmpproc_checkdadc {cpu tbl} {
+ foreach {unit ta sa dc} $tbl {
+ set da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]]
+ $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
+ -rma rpa.da -edata $da \
+ -rma rpa.dc -edata $dc \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
+ -ribr rpa.da -edata $da \
+ -ribr rpa.dc -edata $dc
+ }
+}
+
+rlc log " B1.1: loc setup ------------------------------------"
+
+# unit ta sa dc
+# 5b 6b 10b
+set tbl { 0 007 006 00123 \
+ 1 013 031 00345 \
+ 2 037 077 01777
+ }
+
+foreach {unit ta sa dc} $tbl {
+ $cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 [list unit $unit]] \
+ -wma rpa.da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]] \
+ -wma rpa.dc $dc
+}
+
+rlc log " B1.2: loc+rem readback -----------------------------"
+tmpproc_checkdadc $cpu $tbl
+
+rlc log " B1.3: check cc for unit 0 (RP06) -------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.m13 -edata 00123
+
+rlc log " B1.4: rem setup ------------------------------------"
+
+# unit ta sa dc
+# 5b 6b 10b
+set tbl { 0 005 004 00234 \
+ 1 020 077 00456 \
+ 2 032 023 01070
+ }
+
+foreach {unit ta sa dc} $tbl {
+ $cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit $unit] \
+ -wibr rpa.da [regbld ibd_rhrp::DA [list ta $ta] [list sa $sa]] \
+ -wibr rpa.dc $dc
+}
+
+rlc log " B1.5: loc+rem readback -----------------------------"
+tmpproc_checkdadc $cpu $tbl
+
+rlc log " B1.6: check cc for unit 0 (RP06) -------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.m13 -edata 00234
+
+# -- Section C ---------------------------------------------------------------
+rlc log " C1: test of,mr1,mr2(for RM typ); test NI regs: er2,er3,ec1,ec2"
+
+# test fmt,eci,hci flags (NI, but stored), also off for RP
+set of_0 [regbld ibd_rhrp::OF fmt {odi 1} {off -1}]
+set of_1 [regbld ibd_rhrp::OF eci {odi 0}]
+set of_2 [regbld ibd_rhrp::OF hci {odi 0}]
+
+set mr1_0 0x7700
+set mr1_1 0x7701
+set mr1_2 0x7702
+
+set mr2_1 0x6601
+set mr2_2 0x6602
+
+set da_0 [regbld ibd_rhrp::DA {ta 010} {sa 022}]
+set da_1 [regbld ibd_rhrp::DA {ta 011} {sa 021}]
+set da_2 [regbld ibd_rhrp::DA {ta 012} {sa 020}]
+
+set dc_0 0x40
+set dc_1 0x41
+set dc_2 0x42
+
+rlc log " C1.1: loc write da,mr1,of,dc (mr2 for RM) ----------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.da $da_0 \
+ -wma rpa.mr1 $mr1_0 \
+ -wma rpa.of $of_0 \
+ -wma rpa.dc $dc_0
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.da $da_1 \
+ -wma rpa.mr1 $mr1_1 \
+ -wma rpa.of $of_1 \
+ -wma rpa.dc $dc_1 \
+ -wma rpa.m14 $mr2_1
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.da $da_2 \
+ -wma rpa.mr1 $mr1_2 \
+ -wma rpa.of $of_2 \
+ -wma rpa.dc $dc_2 \
+ -wma rpa.m14 $mr2_2
+
+rlc log " C1.2: loc read da,mr1,of,dc (mr2 for RM) -----------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.da -edata $da_0 \
+ -rma rpa.mr1 -edata $mr1_0 \
+ -rma rpa.of -edata $of_0 \
+ -rma rpa.dc -edata $dc_0
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.da -edata $da_1 \
+ -rma rpa.mr1 -edata $mr1_1 \
+ -rma rpa.of -edata $of_1 \
+ -rma rpa.dc -edata $dc_1 \
+ -rma rpa.m14 -edata $mr2_1
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.da -edata $da_2 \
+ -rma rpa.mr1 -edata $mr1_2 \
+ -rma rpa.of -edata $of_2 \
+ -rma rpa.dc -edata $dc_2 \
+ -rma rpa.m14 -edata $mr2_2
+
+rlc log " C2.1: loc write er2,er3,ec1,ec2 --------------------"
+
+# unit 0: RP typ -> m14 is er2; m15 is er3
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.m14 0xaa00 \
+ -wma rpa.m15 0xaa10 \
+ -wma rpa.ec1 0xaa20 \
+ -wma rpa.ec1 0xaa30
+
+# unit 1+2: RM typ -> m15 is er2
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.m15 0xaa11 \
+ -wma rpa.ec1 0xaa21 \
+ -wma rpa.ec1 0xaa31
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.m15 0xaa12 \
+ -wma rpa.ec1 0xaa22 \
+ -wma rpa.ec1 0xaa32
+
+rlc log " C2.1: loc read er2,er3,ec1,ec2 (NI -> =0!) ---------"
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.m14 -edata 0x0 \
+ -rma rpa.m15 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.m15 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.m15 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0 \
+ -rma rpa.ec1 -edata 0x0
+
+# -- Section D ---------------------------------------------------------------
+rlc log " D1: test hr (for RM typ); ensure unit distinct ------------"
+
+# test unit 1+2, they are RM typ (RM05 and RP07)
+
+set da [regbld ibd_rhrp::DA {ta 005} {sa 023}]; # some da
+set dc 00456; # some dc
+
+rlc log " D1.1: write da(1) and dc(2) ------------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.da $da \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.da $dc
+
+rlc log " D1.2: check hr(1) and hr(2) ------------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.m13 -edata [rutil::com16 $da] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.m13 -edata [rutil::com16 $dc]
+
+rlc log " D1.3: write da(2) and dc(1) ------------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.da $da \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.da $dc
+
+rlc log " D1.4: check hr(1) and hr(2) ------------------------"
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.m13 -edata [rutil::com16 $dc] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.m13 -edata [rutil::com16 $da]
+
+# FIXME: add code to check hr response for all mb reg writes
+
+# -- Section E ---------------------------------------------------------------
+rlc log " E1: test rem er1 write; clear via func=dclr ---------------"
+rlc log " E1.1: rem er1 set uns,iae,aoe,ilf; loc readback ----"
+
+set er1msk [regbld ibd_rhrp::ER1 uns iae aoe ilf]
+
+# use unit 1
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}]
+
+$cpu cp -rma rpa.er1 -edata 0x0 \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 uns] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns] $er1msk \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 iae] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae] $er1msk \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 aoe] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae aoe] $er1msk \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 ilf] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 uns iae aoe ilf] $er1msk
+
+rlc log " E1.2: clear er1 via func=dclr ----------------------"
+
+$cpu cp -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -rma rpa.er1 -edata 0x0
+
+rlc log " E1.3: rem er1 set in different units ---------------"
+
+$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 iae] \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 aoe] \
+ -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
+ -wibr rpa.er1 [regbld ibd_rhrp::ER1 ilf]
+
+rlc log " E1.4: loc readback, show er1 is distinct -----------"
+
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 iae] $er1msk \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 aoe] $er1msk \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] $er1msk
+
+rlc log " E1.5: show func=dclr distinct ----------------------"
+
+# clear unit 1, that that 1 clr and 0+2 untouched
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 iae] $er1msk \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
+ -rma rpa.er1 -edata 0x0 \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -rma rpa.er1 -edata [regbld ibd_rhrp::ER1 ilf] $er1msk
+
+rlc log " E1.6: clear er1 in remaining units -----------------"
+
+# unit 0+2 still have er1 bits set from previous test
+$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -rma rpa.er1 -edata 0x0 \
+ -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
+ -wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
+ -rma rpa.er1 -edata 0x0
Index: trunk/tools/tbench/test_cp_psw.tcl
===================================================================
--- trunk/tools/tbench/test_cp_psw.tcl (nonexistent)
+++ trunk/tools/tbench/test_cp_psw.tcl (revision 30)
@@ -0,0 +1,49 @@
+# $Id: test_cp_psw.tcl 676 2015-05-09 16:31:54Z mueller $
+#
+# Copyright 2013-2014 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-12-26 621 1.0.1 adopt to 4k word ibus window
+# 2013-03-31 502 1.0 Initial version
+#
+# Test that psw is writable and readable via various ways
+# 1. direct cp access
+# 2. via 16bit memory addressing
+# 3. via 22bit memory addressing
+# 4. via ibr window
+#
+# This test not only verifies psw, but also all basic access methods
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_cp_psw: test psw access via all methods ------------------------"
+rlc log " write/read via cp"
+foreach w { 000000 000017 } {
+ $cpu cp -wps $w \
+ -rps -edata $w
+}
+
+rlc log " write/read via 16bit cp addressing"
+$cpu cp -wal 0177776
+foreach w { 000000 000017 } {
+ $cpu cp -wm $w \
+ -rm -edata $w \
+ -rps -edata $w
+}
+
+rlc log " write/read via 22bit cp addressing"
+$cpu cp -wal 0177776 -wah 000177
+foreach w { 000000 000017 } {
+ $cpu cp -wm $w \
+ -rm -edata $w \
+ -rps -edata $w
+}
+
+rlc log " write/read via ibr window"
+foreach w { 000000 000017 } {
+ $cpu cp -wibr 0177776 $w \
+ -ribr 0177776 -edata $w \
+ -rps -edata $w
+}
Index: trunk/tools/tbench/test_cp_cpubasics.tcl
===================================================================
--- trunk/tools/tbench/test_cp_cpubasics.tcl (nonexistent)
+++ trunk/tools/tbench/test_cp_cpubasics.tcl (revision 30)
@@ -0,0 +1,134 @@
+# $Id: test_cp_cpubasics.tcl 676 2015-05-09 16:31:54Z mueller $
+#
+# Copyright 2013-2015 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2015-05-09 676 1.1 w11a start/stop/suspend overhaul
+# 2013-03-31 502 1.0 Initial version
+#
+# Test very basic cpu interface gymnastics
+# 1. load code via ldasm
+# 2. execute code via -start, -stapc
+# 3. single step code via -step
+# 4. verify -suspend, -resume
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_cp_cpubasics: Test very basic cpu interface gymnastics ---------"
+rlc log " A1: start/stop/step basics --------------------------------"
+rlc log " load simple linear code via lsasm"
+
+#
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: inc r2
+ inc r2
+ inc r2
+ halt
+stop:
+}
+
+rlc log " read back and check"
+$cpu cp -wal $sym(start) \
+ -brm 4 -edata {0005202 0005202 0005202 0000000}
+
+rlc log " execute via -start"
+$cpu cp -wr2 00000 \
+ -wpc $sym(start) \
+ -start
+$cpu wtcpu -reset 1.0
+$cpu cp -rr2 -edata 00003 \
+ -rpc -edata $sym(stop)
+
+rlc log " execute via -stapc"
+$cpu cp -wr2 00100 \
+ -stapc $sym(start)
+$cpu wtcpu -reset 1.0
+$cpu cp -rr2 -edata 00103 \
+ -rpc -edata $sym(stop)
+
+rlc log " execute via -step"
+$cpu cp -wr2 00300 \
+ -wpc $sym(start)
+$cpu cp -step \
+ -rpc -edata [expr {$sym(start)+002}] \
+ -rr2 -edata 00301 \
+ -rstat -edata 000100
+$cpu cp -step \
+ -rpc -edata [expr {$sym(start)+004}] \
+ -rr2 -edata 00302 \
+ -rstat -edata 000100
+$cpu cp -step \
+ -rpc -edata [expr {$sym(start)+006}] \
+ -rr2 -edata 00303 \
+ -rstat -edata 000100
+$cpu cp -step \
+ -rpc -edata [expr {$sym(start)+010}] \
+ -rr2 -edata 00303 \
+ -rstat -edata 000020
+
+rlc log " A2: suspend/resume basics; cpugo,cpususp flags ------------"
+# define tmpproc for r2 increment checks
+proc tmpproc_checkr2inc {val} {
+ set emsg ""
+ if {$val == 0} {
+ set emsg "FAIL: r2 change zero"
+ rlc errcnt -inc
+ }
+ rlc log -bare ".. r2 increment $val $emsg"
+}
+
+#
+rlc log " load simple loop code via lsasm"
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: inc r2
+ br start
+stop:
+}
+
+set statgo [regbld rw11::STAT cpugo]
+set statgosu [regbld rw11::STAT cpususp cpugo]
+
+rlc log " execute via -stapc, check cpugo and that r2 increments"
+$cpu cp -wr2 00000 \
+ -stapc $sym(start) \
+ -rr2 rr2_1 -estat $statgo \
+ -rr2 rr2_2 -estat $statgo
+tmpproc_checkr2inc $rr2_1
+tmpproc_checkr2inc [expr {$rr2_2 - $rr2_1}]
+
+rlc log " suspend, check cpususp=1 and that r2 doesn't increment"
+$cpu cp -suspend \
+ -wr2 00000 \
+ -rr2 -edata 0 -estat $statgosu \
+ -rr2 -edata 0 -estat $statgosu
+
+rlc log " resume, check cpususp=0 and that r2 increments again"
+$cpu cp -resume \
+ -rr2 rr2_1 -estat $statgo \
+ -rr2 rr2_2 -estat $statgo
+tmpproc_checkr2inc $rr2_1
+tmpproc_checkr2inc [expr {$rr2_2 - $rr2_1}]
+
+rlc log " suspend than step, two steps should inc r2 once"
+$cpu cp -suspend \
+ -wr2 00000 \
+ -step \
+ -step \
+ -rr2 -edata 1 \
+ -step \
+ -step \
+ -rr2 -edata 2
+
+rlc log " stop while suspended, check cpugo=0,cpususp=1,attn=1; harvest attn"
+$cpu cp -stop -estat [regbld rw11::STAT cpususp attn]
+$cpu wtcpu -reset 1.0
+
+rlc log " creset, check cpususp=0"
+# Note: creset still has cpususp stat flag set because it clears with one
+# cycle delay. So do -estat after next command
+$cpu cp -creset \
+ -rr2 -estat 0
Index: trunk/tools/tbench/test_w11a_inst_traps.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_inst_traps.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_inst_traps.tcl (revision 30)
@@ -0,0 +1,90 @@
+# $Id: test_w11a_inst_traps.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2013-2014 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-03-01 552 1.0.1 check that unused regs stay 0; use stack:; check sp;
+# 2013-04-01 502 1.0 Initial version
+#
+# Test trap type instructions: bpt,iot, emt nn, trap nn
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_w11a_inst_traps: test trap type instructions"
+
+# code register pre/post conditions beyond defaults
+# r5 #data -> #data+6*5*2
+$cpu ldasm -lst lst -sym sym {
+ . = 14
+ .word h.bpt ; vec 14: bpt
+ .word 340
+ .word h.iot ; vec 20: iot
+ .word 341
+ . = 30
+ .word h.emt ; vec 30: emt
+ .word 342
+ .word h.trp ; vec 34: trap
+ .word 343
+;
+ psw = 177776
+;
+ . = 1000
+stack:
+start: mov #350,@#psw
+ bpt
+350$: mov #351,@#psw
+ iot
+351$: mov #352,@#psw
+ emt 100
+352$: mov #353,@#psw
+ emt 200
+353$: mov #354,@#psw
+ trap 10
+354$: mov #355,@#psw
+ trap 20
+355$: halt
+stop:
+;
+h.bpt: mov @#psw,(r5)+ ; record psw
+ mov #1014,(r5)+ ; record trap id
+ br iexit
+h.iot: mov @#psw,(r5)+
+ mov #1020,(r5)+
+ br iexit
+h.emt: mov @#psw,(r5)+
+ mov #1030,(r5)+
+ br iexit
+h.trp: mov @#psw,(r5)+
+ mov #1034,(r5)+
+;
+iexit: mov (sp),r4 ; get stack PC
+ mov r4,(r5)+ ; record PC
+ mov 2(sp),(r5)+ ; record stack PS
+ mov -2(r4),(r5)+ ; record opcode of trap
+ rti
+;
+data: .blkw 6.*5.
+ .word 177777
+}
+
+rw11::asmrun $cpu sym [list r5 $sym(data) ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 0 \
+ r1 0 \
+ r2 0 \
+ r3 0 \
+ r5 [expr {$sym(data) + 6*5*2}] \
+ sp $sym(stack) ]
+
+# data: trap ps; trap id; stack-pc; stack-ps opcode
+rw11::asmtmem $cpu $sym(data) \
+ [list 000340 001014 $sym(start:350$) 000350 0000003 \
+ 000341 001020 $sym(start:351$) 000351 0000004 \
+ 000342 001030 $sym(start:352$) 000352 0104100 \
+ 000342 001030 $sym(start:353$) 000353 0104200 \
+ 000343 001034 $sym(start:354$) 000354 0104410 \
+ 000343 001034 $sym(start:355$) 000355 0104420 \
+ 0177777 ]
Index: trunk/tools/tbench/test_w11a_dstm_word_flow.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_dstm_word_flow.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_dstm_word_flow.tcl (revision 30)
@@ -0,0 +1,103 @@
+# $Id: test_w11a_dstm_word_flow.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2013-2014 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-03-01 552 1.0.1 check that unused regs stay 0
+# 2013-03-31 502 1.0 Initial version
+#
+# Test dstm flow with inc ... instructions for word access
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_w11a_dstm_word_flow: test dstm flow for word with inc ..."
+rlc log " r0,(r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=0,1,2,3,4,5)"
+
+# code register pre/post conditions beyond defaults
+# r0 #010 -> #011
+# r1 #data1 -> #data1
+# r2 #data2 -> #data2+4
+# r3 #pdata3 -> #pdata3+4
+# r4 #data4e -> #data4e-4
+# r5 #pdat5e -> #pdat5e-4
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: inc r0
+ inc (r1)
+ inc (r2)+
+ inc (r2)+
+ inc @(r3)+
+ inc @(r3)+
+ inc -(r4)
+ inc -(r4)
+ inc @-(r5)
+ inc @-(r5)
+ halt
+stop:
+;
+data1: .word 20
+data2: .word 30,31
+data3: .word 40,41
+data4: .word 50,51
+data4e:
+data5: .word 60,61
+data5e:
+pdata3: .word data3,data3+2
+pdata5: .word data5,data5+2
+pdat5e:
+}
+
+rw11::asmrun $cpu sym [list r0 010 \
+ r1 $sym(data1) \
+ r2 $sym(data2) \
+ r3 $sym(pdata3) \
+ r4 $sym(data4e) \
+ r5 $sym(pdat5e) ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 011 \
+ r1 $sym(data1) \
+ r2 [expr {$sym(data2) + 4}] \
+ r3 [expr {$sym(pdata3) + 4}] \
+ r4 [expr {$sym(data4e) - 4}] \
+ r5 [expr {$sym(pdat5e) - 4}] ]
+rw11::asmtmem $cpu $sym(data1) {021 031 032 041 042 051 052 061 062}
+
+# ----------------------------------------------------------------------------
+rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
+
+# code register pre/post conditions beyond defaults
+# r0 #data0-020 -> ..same
+# r1 #pdata1-040 -> ..same
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: inc 20(r0)
+ inc @40(r1)
+ inc data2
+ inc @pdata3
+ inc @#data4
+ halt
+stop:
+;
+data0: .word 200
+data1: .word 210
+data2: .word 220
+data3: .word 230
+data4: .word 240
+data4e:
+pdata1: .word data1
+pdata3: .word data3
+}
+
+rw11::asmrun $cpu sym [list r0 [expr {$sym(data0)-020}] \
+ r1 [expr {$sym(pdata1)-040}] ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 [expr {$sym(data0)-020}] \
+ r1 [expr {$sym(pdata1)-040}] \
+ r2 0 \
+ r3 0 \
+ r4 0 \
+ r5 0 ]
+rw11::asmtmem $cpu $sym(data0) {0201 0211 0221 0231 0241}
Index: trunk/tools/tbench/test_w11a_srcr_word_flow.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_srcr_word_flow.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_srcr_word_flow.tcl (revision 30)
@@ -0,0 +1,181 @@
+# $Id: test_w11a_srcr_word_flow.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2013- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-03-01 552 1.0.1 check sp
+# 2013-03-31 502 1.0 Initial version
+#
+# Test srcr flow with mov ...,rx instructions for word access
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_w11a_srcr_word_flow: test srcr flow for word with mov ...,rx"
+rlc log " r0 (mode=0)"
+
+# code register pre/post conditions beyond defaults
+# r0 01234 -> ..same
+# r1 -> 01234
+# r2 -> #stack
+# r3 -> #start
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+stack:
+start: mov r0,r1
+ mov sp,r2
+ mov pc,r3
+lpc: halt
+stop:
+}
+
+rw11::asmrun $cpu sym [list r0 01234]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 01234 \
+ r1 01234 \
+ r2 $sym(stack) \
+ r3 $sym(lpc) \
+ r4 0 \
+ r5 0 \
+ sp $sym(stack) ]
+
+# ----------------------------------------------------------------------------
+rlc log " (r0),(r0)+,-(r0) (mode=1,2,4)"
+
+# code register pre/post conditions beyond defaults
+# r0 #data -> ..same
+# r1 -> 01001
+# r2 -> 01001
+# r3 -> 01002
+# r4 -> 01002
+# r5 -> 01001
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov (r0),r1
+ mov (r0)+,r2
+ mov (r0)+,r3
+ mov -(r0),r4
+ mov -(r0),r5
+ halt
+stop:
+;
+data: .word 1001
+ .word 1002
+}
+
+rw11::asmrun $cpu sym [list r0 $sym(data)]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 $sym(data) \
+ r1 001001 \
+ r2 001001 \
+ r3 001002 \
+ r4 001002 \
+ r5 001001 ]
+
+# ----------------------------------------------------------------------------
+rlc log " @(r0)+,@-(r0) (mode=3,5)"
+
+# code register pre/post conditions beyond defaults
+# r0 #pdata -> ..same
+# r1 -> 02001
+# r2 -> 02002
+# r3 -> #pdata+4
+# r4 -> 02002
+# r5 -> 02001
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov @(r0)+,r1
+ mov @(r0)+,r2
+ mov r0,r3
+ mov @-(r0),r4
+ mov @-(r0),r5
+ halt
+stop:
+;
+pdata: .word data0
+ .word data1
+data0: .word 2001
+ .word 0
+data1: .word 2002
+}
+
+rw11::asmrun $cpu sym [list r0 $sym(pdata)]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 $sym(pdata) \
+ r1 002001 \
+ r2 002002 \
+ r3 [expr {$sym(pdata)+4}] \
+ r4 002002 \
+ r5 002001 ]
+
+# ----------------------------------------------------------------------------
+rlc log " nn(r0),@nn(r0) (mode=6,7)"
+
+# code register pre/post conditions beyond defaults
+# r0 #data -> ..same
+# r1 -> 03001
+# r2 -> 03002
+# r3 -> 03003
+# r4 -> 03004
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov 2(r0),r1
+ mov @4(r0),r2
+ mov 6(r0),r3
+ mov @10(r0),r4
+ halt
+stop:
+;
+data: .word 177777
+ .word 003001
+ .word data0
+ .word 003003
+ .word data1
+
+data0: .word 003002
+data1: .word 003004
+}
+
+rw11::asmrun $cpu sym [list r0 $sym(data)]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 $sym(data) \
+ r1 003001 \
+ r2 003002 \
+ r3 003003 \
+ r4 003004 \
+ r5 0 ]
+
+# ----------------------------------------------------------------------------
+rlc log " #nn,@#nn,var,@var (mode=27,37,67,77)"
+
+# code register pre/post conditions beyond defaults
+# r1 -> 04001
+# r2 -> 04002
+# r3 -> 04003
+# r4 -> 04004
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov #004001,r1
+ mov @#data2,r2
+ mov data3,r3
+ mov @pdata4,r4
+ halt
+stop:
+;
+pdata4: .word data4
+
+data2: .word 004002
+data3: .word 004003
+data4: .word 004004
+}
+
+rw11::asmrun $cpu sym {}
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 0 \
+ r1 004001 \
+ r2 004002 \
+ r3 004003 \
+ r4 004004 \
+ r5 0 ]
Index: trunk/tools/tbench/w11a_all.dat
===================================================================
--- trunk/tools/tbench/w11a_all.dat (nonexistent)
+++ trunk/tools/tbench/w11a_all.dat (revision 30)
@@ -0,0 +1,17 @@
+# $Id: w11a_all.dat 569 2014-07-13 14:36:32Z mueller $
+#
+## steering file for all w11a tests
+#
+test_cp_gpr.tcl
+test_cp_psw.tcl
+test_cp_membasics.tcl
+test_cp_ibrbasics.tcl
+test_cp_cpubasics.tcl
+test_w11a_srcr_word_flow.tcl
+test_w11a_dstw_word_flow.tcl
+test_w11a_dstm_word_flow.tcl
+test_w11a_dsta_flow.tcl
+test_w11a_inst_traps.tcl
+#
+test_w11a_div.tcl
+#
Index: trunk/tools/tbench/test_w11a_dsta_flow.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_dsta_flow.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_dsta_flow.tcl (revision 30)
@@ -0,0 +1,147 @@
+# $Id: test_w11a_dsta_flow.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2013-2014 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-03-01 552 1.0.1 use stack:; check sp;
+# 2013-03-31 502 1.0 Initial version
+#
+# Test dsta flow with jsr pc,... instructions
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_w11a_dsta_flow: test dsta flow with jsr pc,..."
+rlc log " (r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=1,2,3,4,5)"
+
+# code register pre/post conditions beyond defaults
+# r0 #sub00 -> ..same
+# r1 #sub10 -> #sub10+2
+# r2 #psub2 -> #psub2+4
+# r3 #sub30+2 -> #sub30
+# r4 #psub4e -> #psub4
+# r5 #data -> #data+7*2*2
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+stack:
+start: jsr pc,(r0)
+100$: jsr pc,(r1)+
+110$: jsr pc,@(r2)+
+120$: jsr pc,@(r2)+
+121$: jsr pc,-(r3)
+130$: jsr pc,@-(r4)
+140$: jsr pc,@-(r4)
+141$: halt
+stop:
+;
+psub2: .word sub20, sub21
+psub4: .word sub41, sub40
+psub4e:
+sub00: mov #100,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub10: mov #110,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub20: mov #120,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub21: mov #121,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub30: mov #130,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub40: mov #140,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub41: mov #141,(r5)+
+ mov (sp),(r5)+
+ rts pc
+data: .blkw 2*7.
+ .word 177777
+}
+
+rw11::asmrun $cpu sym [list r0 $sym(sub00) \
+ r1 $sym(sub10) \
+ r2 $sym(psub2) \
+ r3 [expr {$sym(sub30)+2}] \
+ r4 $sym(psub4e) \
+ r5 $sym(data) ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 $sym(sub00) \
+ r1 [expr {$sym(sub10)+2}] \
+ r2 [expr {$sym(psub2)+4}] \
+ r3 $sym(sub30) \
+ r4 $sym(psub4) \
+ r5 [expr {$sym(data) + 7*2*2}] \
+ sp $sym(stack) ]
+rw11::asmtmem $cpu $sym(data) [list \
+ 0100 $sym(start:100$) \
+ 0110 $sym(start:110$) \
+ 0120 $sym(start:120$) \
+ 0121 $sym(start:121$) \
+ 0130 $sym(start:130$) \
+ 0140 $sym(start:140$) \
+ 0141 $sym(start:141$) \
+ 0177777 ]
+
+# ----------------------------------------------------------------------------
+rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
+
+# code register pre/post conditions beyond defaults
+# r0 #sub00-020 -> ..same
+# r1 #psub10-040 -> ..same
+# r5 #data -> #data+5*2*2
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+stack:
+start: jsr pc,20(r0)
+1100$: jsr pc,@40(r1)
+1110$: jsr pc,sub20
+1120$: jsr pc,@psub30
+1130$: jsr pc,@#sub40
+1140$: halt
+stop:
+;
+psub10: .word sub10
+psub30: .word sub30
+sub00: mov #1100,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub10: mov #1110,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub20: mov #1120,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub30: mov #1130,(r5)+
+ mov (sp),(r5)+
+ rts pc
+sub40: mov #1140,(r5)+
+ mov (sp),(r5)+
+ rts pc
+data: .blkw 2*5.
+ .word 177777
+}
+
+rw11::asmrun $cpu sym [list r0 [expr {$sym(sub00)-020}] \
+ r1 [expr {$sym(psub10)-040}] \
+ r5 $sym(data) ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 [expr {$sym(sub00)-020}] \
+ r1 [expr {$sym(psub10)-040}] \
+ r2 0 \
+ r3 0 \
+ r4 0 \
+ r5 [expr {$sym(data) + 5*2*2}] \
+ sp $sym(stack) ]
+rw11::asmtmem $cpu $sym(data) [list \
+ 01100 $sym(start:1100$) \
+ 01110 $sym(start:1110$) \
+ 01120 $sym(start:1120$) \
+ 01130 $sym(start:1130$) \
+ 01140 $sym(start:1140$) \
+ 0177777 ]
Index: trunk/tools/tbench/test_w11a_div.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_div.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_div.tcl (revision 30)
@@ -0,0 +1,390 @@
+# $Id: test_w11a_div.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2014- by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-07-20 570 1.0.2 add rw11::div_show_test; test late div quit cases
+# 2014-07-12 569 1.0.1 move sxt16/32 to rutil
+# 2014-07-11 568 1.0 Initial version
+# 2014-06-29 566 0.1 First draft
+#
+# Test div instruction
+#
+
+namespace eval rw11 {
+
+ #
+ # div_simh: calculate expected division result as pdp11 simh does it -------
+ #
+ # this pdp11 div emulation adopted from pdp11_cpu.c (git head 2014-06-09)
+ proc div_simh {ddi dri} {
+ set src2 $dri
+ set src $ddi
+ set qd [expr ($ddi>>16) & 0xffff]; # w11a default for V=1 bailouts
+ set rd [expr $ddi & 0xffff]; # "
+ set n [expr {($ddi<0) ^ ($dri<0)}]; # "
+ set z 0; # "
+
+ # quit if divident larger than possible 16 bit signed products
+ if {$src > 1073774591 || $src < -1073741823} {
+ return [list $qd $rd $n $z 1 0]
+ }
+ # quit if divisor zero
+ if {$src2 == 0} {
+ return [list $qd $rd $n $z 1 1]
+ }
+
+ if {$src2 & 0x8000} {
+ set src2 [expr $src2 | ~ 077777]
+ }
+ if {$src & 0x80000000} {
+ set src [expr $src | ~ 017777777777]
+ }
+
+ # Tcl "/" uses 'round down' sematics, while C (and PDP11) 'round to 0'
+ # ddi dri Tcl C/C++
+ # 34 5 q= 6 r= 4 q= 6 r= 4
+ # 34 -5 q= 7 r=-1 q=-6 r= 4
+ # -34 5 q=-7 r= 1 q=-6 r=-4
+ # -34 -5 q= 6 r=-4 q= 6 r=-4
+ # Tcl --> r same sign as divisor
+ # C --> r same sign as divident
+ # so add correction step to always get C/C++/PDP11 divide semantics
+ #
+ set q [expr $src / $src2]
+ set r [expr ($src - ($src2 * $q))]
+
+ if {$r!=0 && (($src<0) ^ ($r<0))} { # divident and remainder diff sign
+ set r [expr $r - $src2]
+ set q [expr $q + (($q<0)?1:-1)]
+ }
+
+ if {($q > 32767) || ($q < -32768)} {
+ return [list $qd $rd $n $z 1 0]
+ }
+
+ set n [expr {$q < 0}]
+ set z [expr {$q == 0}]
+ return [list $q $r $n $z 0 0]
+ }
+
+ #
+ # div_testd3: test division ddh,ddl,,dr + expected result ------------------
+ #
+ proc div_testd3 {cpu symName ddh ddl dr q r n z v c} {
+ upvar 1 $symName sym
+ set nzvc [expr {($n<<3) | ($z<<2) | ($v<<1) | $c}]
+ set dr16 [expr {$dr & 0xffff}]
+ set q16 [expr {$q & 0xffff}]
+ set r16 [expr {$r & 0xffff}]
+
+ # use rw11::div_show_test to enable generation of divtst files
+ if {[info exists rw11::div_show_test] && $rw11::div_show_test} {
+ set ddi [expr (($ddh&0xffff)<<16) + ($ddl&0xffff)]
+ set ddi [rutil::sxt32 $ddi]
+ set dri [rutil::sxt16 $dr16]
+ set qi [rutil::sxt16 $q16]
+ set ri [rutil::sxt16 $r16]
+ puts [format "%06o %06o %06o : %d%d%d%d %06o %06o # %11d/%6d:%6d,%6d" \
+ $ddh $ddl $dr16 $n $z $v $c $q16 $r16 $ddi $dri $qi $ri ]
+ }
+
+ rw11::asmrun $cpu sym [list r0 $ddh r1 $ddl r2 $dr16]
+ rw11::asmwait $cpu sym
+
+ if {!$v && !$c} { # test q and r only when V=0 C=0 expected
+ lappend treglist r0 $q16 r1 $r16
+ }
+ lappend treglist r3 $nzvc
+
+ set errcnt [rw11::asmtreg $cpu $treglist]
+
+ if {$errcnt} {
+ puts [format \
+ "div FAIL: dd=%06o,%06o dr=%06o exp: q=%06o r=%06o nzvc=%d%d%d%d" \
+ $ddh $ddl $dr16 $q16 $r16 $n $z $v $c]
+ }
+ return $errcnt
+ }
+
+ #
+ # div_testd2: test division dd,dr + expected result ------------------------
+ #
+ proc div_testd2 {cpu symName dd dr q r n z v c} {
+ upvar 1 $symName sym
+ set ddh [expr {($dd>>16) & 0xffff}]
+ set ddl [expr { $dd & 0xffff}]
+ return [div_testd3 $cpu sym $ddh $ddl $dr $q $r $n $z $v $c]
+ }
+
+ #
+ # div_testdqr: test division, give divisor, quotient and remainder ---------
+ #
+ proc div_testdqr {cpu symName dri qi ri} {
+ upvar 1 $symName sym
+ set dri [rutil::sxt16 $dri]
+ set qi [rutil::sxt16 $qi]
+ set ri [rutil::sxt16 $ri]
+ set ddi [expr {$dri*$qi + $ri}]
+
+ set simhres [div_simh $ddi $dri]
+ set q [lindex $simhres 0]
+ set r [lindex $simhres 1]
+ set n [lindex $simhres 2]
+ set z [lindex $simhres 3]
+ set v [lindex $simhres 4]
+ set c [lindex $simhres 5]
+
+ return [div_testd2 $cpu sym $ddi $dri $q $r $n $z $v $c]
+ }
+}
+
+# ----------------------------------------------------------------------------
+rlc log "test_div: test div instruction"
+
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+stack:
+start: div r2,r0
+ mov @#177776,r3
+ bic #177760,r3
+ halt
+stop:
+}
+
+rlc log " test basics (via testd2)"
+# dd dr q r n z v c
+rlc log " dr>0"
+rw11::div_testd2 $cpu sym 0 3 0 0 0 1 0 0
+rw11::div_testd2 $cpu sym 1 3 0 1 0 1 0 0
+rw11::div_testd2 $cpu sym 2 3 0 2 0 1 0 0
+rw11::div_testd2 $cpu sym 3 3 1 0 0 0 0 0
+rw11::div_testd2 $cpu sym 4 3 1 1 0 0 0 0
+rw11::div_testd2 $cpu sym -1 3 0 -1 0 1 0 0
+rw11::div_testd2 $cpu sym -2 3 0 -2 0 1 0 0
+rw11::div_testd2 $cpu sym -3 3 -1 0 1 0 0 0
+rw11::div_testd2 $cpu sym -4 3 -1 -1 1 0 0 0
+rlc log " dr<0"
+rw11::div_testd2 $cpu sym 0 -3 0 0 0 1 0 0
+rw11::div_testd2 $cpu sym 1 -3 0 1 0 1 0 0
+rw11::div_testd2 $cpu sym 2 -3 0 2 0 1 0 0
+rw11::div_testd2 $cpu sym 3 -3 -1 0 1 0 0 0
+rw11::div_testd2 $cpu sym 4 -3 -1 1 1 0 0 0
+rw11::div_testd2 $cpu sym -1 -3 0 -1 0 1 0 0
+rw11::div_testd2 $cpu sym -2 -3 0 -2 0 1 0 0
+rw11::div_testd2 $cpu sym -3 -3 1 0 0 0 0 0
+rw11::div_testd2 $cpu sym -4 -3 1 -1 0 0 0 0
+rlc log " dr==0"
+rw11::div_testd2 $cpu sym 0 0 0 0 0 1 1 1
+rw11::div_testd2 $cpu sym 1 0 0 0 0 1 1 1
+rw11::div_testd2 $cpu sym -1 0 0 0 0 1 1 1
+
+rlc log " test 4 quadrant basics (via testd2)"
+# dd dr q r n z v c
+rw11::div_testd2 $cpu sym 34 5 6 4 0 0 0 0
+rw11::div_testd2 $cpu sym 34 -5 -6 4 1 0 0 0
+rw11::div_testd2 $cpu sym -34 5 -6 -4 1 0 0 0
+rw11::div_testd2 $cpu sym -34 -5 6 -4 0 0 0 0
+
+rlc log " test 4 quadrant basics (via testdqr)"
+# dr q r
+rw11::div_testdqr $cpu sym 5 6 4;
+rw11::div_testdqr $cpu sym -5 -6 4;
+rw11::div_testdqr $cpu sym 5 -6 -4;
+rw11::div_testdqr $cpu sym -5 6 -4;
+
+rlc log " test q=100000 boundary cases (q = max neg value)"
+rlc log " case dd>0, dr<0 -- factor 21846"
+# dr q r
+rw11::div_testdqr $cpu sym -21846 0100000 0; # BAD-R4
+rw11::div_testdqr $cpu sym -21846 0100000 1; # BAD-R4
+rw11::div_testdqr $cpu sym -21846 0100000 21844; # BAD-R4
+rw11::div_testdqr $cpu sym -21846 0100000 21845; # BAD-R4
+rw11::div_testdqr $cpu sym -21846 0100000 21846; # v=1
+rw11::div_testdqr $cpu sym -21846 0100000 21847; # v=1
+
+rlc log " case dd<0, dr>0 -- factor 21846"
+rw11::div_testdqr $cpu sym 21846 0100000 0; # BAD-R4
+rw11::div_testdqr $cpu sym 21846 0100000 -1; # BAD-R4
+rw11::div_testdqr $cpu sym 21846 0100000 -21844; # BAD-R4
+rw11::div_testdqr $cpu sym 21846 0100000 -21845; # BAD-R4
+rw11::div_testdqr $cpu sym 21846 0100000 -21846; # v=1
+rw11::div_testdqr $cpu sym 21846 0100000 -21847; # v=1
+
+rlc log " case dd>0, dr<0 -- factor 21847"
+rw11::div_testdqr $cpu sym -21847 0100000 0; # BAD-R4
+rw11::div_testdqr $cpu sym -21847 0100000 1; # BAD-R4
+rw11::div_testdqr $cpu sym -21847 0100000 21845; # BAD-R4
+rw11::div_testdqr $cpu sym -21847 0100000 21846; # BAD-R4
+rw11::div_testdqr $cpu sym -21847 0100000 21847; # v=1
+rw11::div_testdqr $cpu sym -21847 0100000 21848; # v=1
+
+rlc log " case dd<0, dr>0 -- factor 21847"
+rw11::div_testdqr $cpu sym 21847 0100000 0; # BAD-R4
+rw11::div_testdqr $cpu sym 21847 0100000 -1; # BAD-R4
+rw11::div_testdqr $cpu sym 21847 0100000 -21845; # BAD-R4
+rw11::div_testdqr $cpu sym 21847 0100000 -21846; # BAD-R4
+rw11::div_testdqr $cpu sym 21847 0100000 -21847; # v=1
+rw11::div_testdqr $cpu sym 21847 0100000 -21848; # v=1
+
+#
+#
+rlc log " test q=077777 boundary cases (q = max pos value)"
+rlc log " case dd>0, dr>0 -- factor 21846"
+rw11::div_testdqr $cpu sym 21846 0077777 0; #
+rw11::div_testdqr $cpu sym 21846 0077777 1; #
+rw11::div_testdqr $cpu sym 21846 0077777 21844; #
+rw11::div_testdqr $cpu sym 21846 0077777 21845; #
+rw11::div_testdqr $cpu sym 21846 0077777 21846; # v=1
+rw11::div_testdqr $cpu sym 21846 0077777 21847; # v=1
+rlc log " case dd<0, dr<0 -- factor 21846"
+rw11::div_testdqr $cpu sym -21846 0077777 0; #
+rw11::div_testdqr $cpu sym -21846 0077777 -1; #
+rw11::div_testdqr $cpu sym -21846 0077777 -21844; #
+rw11::div_testdqr $cpu sym -21846 0077777 -21845; #
+rw11::div_testdqr $cpu sym -21846 0077777 -21846; # v=1
+rw11::div_testdqr $cpu sym -21846 0077777 -21847; # v=1
+rlc log " case dd>0, dr>0 -- factor 21847"
+rw11::div_testdqr $cpu sym 21847 0077777 0; #
+rw11::div_testdqr $cpu sym 21847 0077777 1; #
+rw11::div_testdqr $cpu sym 21847 0077777 21845; #
+rw11::div_testdqr $cpu sym 21847 0077777 21846; #
+rw11::div_testdqr $cpu sym 21847 0077777 21847; # v=1
+rw11::div_testdqr $cpu sym 21847 0077777 21848; # v=1
+rlc log " case dd<0, dr<0 -- factor 21847"
+rw11::div_testdqr $cpu sym -21847 0077777 0; #
+rw11::div_testdqr $cpu sym -21847 0077777 -1; #
+rw11::div_testdqr $cpu sym -21847 0077777 -21845; #
+rw11::div_testdqr $cpu sym -21847 0077777 -21846; #
+rw11::div_testdqr $cpu sym -21847 0077777 -21846; # v=1
+rw11::div_testdqr $cpu sym -21847 0077777 -21847; # v=1
+#
+#
+rlc log " test dr=100000 boundary cases (dr = max neg value)"
+rlc log " case dd<0, q>0"
+rw11::div_testdqr $cpu sym 0100000 1 0; #
+rw11::div_testdqr $cpu sym 0100000 1 -1; #
+rw11::div_testdqr $cpu sym 0100000 1 -32767; #
+rw11::div_testdqr $cpu sym 0100000 2 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 2 -1; #
+rw11::div_testdqr $cpu sym 0100000 2 -32767; #
+rw11::div_testdqr $cpu sym 0100000 3 0; #
+rw11::div_testdqr $cpu sym 0100000 3 -1; #
+rw11::div_testdqr $cpu sym 0100000 3 -32767; #
+rw11::div_testdqr $cpu sym 0100000 4 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 4 -1; #
+rw11::div_testdqr $cpu sym 0100000 4 -32767; #
+rw11::div_testdqr $cpu sym 0100000 6 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 32762 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 32764 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 32765 0; #
+rw11::div_testdqr $cpu sym 0100000 32766 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 32766 -1; #
+rw11::div_testdqr $cpu sym 0100000 32766 -32767; #
+rw11::div_testdqr $cpu sym 0100000 32767 0; #
+rw11::div_testdqr $cpu sym 0100000 32767 -1; #
+rw11::div_testdqr $cpu sym 0100000 32767 -32767; #
+rlc log " case dd>0, q<0"
+rw11::div_testdqr $cpu sym 0100000 -1 0; #
+rw11::div_testdqr $cpu sym 0100000 -1 1; #
+rw11::div_testdqr $cpu sym 0100000 -1 32767; #
+rw11::div_testdqr $cpu sym 0100000 -2 0; #
+rw11::div_testdqr $cpu sym 0100000 -2 1; #
+rw11::div_testdqr $cpu sym 0100000 -2 32767; #
+rw11::div_testdqr $cpu sym 0100000 -32767 0; #
+rw11::div_testdqr $cpu sym 0100000 -32767 1; #
+rw11::div_testdqr $cpu sym 0100000 -32767 32767; #
+rw11::div_testdqr $cpu sym 0100000 -32768 0; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 -32768 1; # BAD-R4
+rw11::div_testdqr $cpu sym 0100000 -32768 32767; # BAD-R4
+#
+#
+rlc log " test dr=077777 boundary cases (dr = max pos value)"
+rlc log " case dd>0, q>0"
+rw11::div_testdqr $cpu sym 077777 1 0; #
+rw11::div_testdqr $cpu sym 077777 1 1; #
+rw11::div_testdqr $cpu sym 077777 1 32766; #
+rw11::div_testdqr $cpu sym 077777 2 0; #
+rw11::div_testdqr $cpu sym 077777 2 1; #
+rw11::div_testdqr $cpu sym 077777 2 32766; #
+rw11::div_testdqr $cpu sym 077777 32766 0; #
+rw11::div_testdqr $cpu sym 077777 32766 1; #
+rw11::div_testdqr $cpu sym 077777 32766 32766; #
+rw11::div_testdqr $cpu sym 077777 32767 0; #
+rw11::div_testdqr $cpu sym 077777 32767 1; #
+rw11::div_testdqr $cpu sym 077777 32767 32766; #
+rlc log " case dd<0, q<0"
+rw11::div_testdqr $cpu sym 077777 -1 0; #
+rw11::div_testdqr $cpu sym 077777 -1 -1; #
+rw11::div_testdqr $cpu sym 077777 -1 -32766; #
+rw11::div_testdqr $cpu sym 077777 -2 0; #
+rw11::div_testdqr $cpu sym 077777 -2 -1; #
+rw11::div_testdqr $cpu sym 077777 -2 -32766; #
+rw11::div_testdqr $cpu sym 077777 -32767 0; #
+rw11::div_testdqr $cpu sym 077777 -32767 -1; #
+rw11::div_testdqr $cpu sym 077777 -32767 -32766; #
+rw11::div_testdqr $cpu sym 077777 -32768 0; # BAD-R4
+rw11::div_testdqr $cpu sym 077777 -32768 -1; # BAD-R4
+rw11::div_testdqr $cpu sym 077777 -32768 -32766; # BAD-R4
+#
+#
+rlc log " test dd max cases"
+rlc log " case dd>0 dr<0 near nmax*nmax+nmax-1 = +1073774591"
+rw11::div_testdqr $cpu sym -32768 -32768 -1; #
+rw11::div_testdqr $cpu sym -32768 -32768 0; # BAD-R4
+rw11::div_testdqr $cpu sym -32768 -32768 1; # BAD-R4
+rw11::div_testdqr $cpu sym -32768 -32768 32766; # BAD-R4
+rw11::div_testdqr $cpu sym -32768 -32768 32767; # c.c BAD-R4
+rw11::div_testdqr $cpu sym -32768 -32768 32768; # v=1
+rw11::div_testdqr $cpu sym -32768 -32768 32769; # v=1
+rlc log " case dd>0 dr>0 near pmax*pmax+pmax-1 = +1073709055"
+rw11::div_testdqr $cpu sym 32767 32767 -1; #
+rw11::div_testdqr $cpu sym 32767 32767 0; #
+rw11::div_testdqr $cpu sym 32767 32767 1; #
+rw11::div_testdqr $cpu sym 32767 32767 32765; #
+rw11::div_testdqr $cpu sym 32767 32767 32766; # c.c
+rw11::div_testdqr $cpu sym 32767 32767 32767; # v=1
+rw11::div_testdqr $cpu sym 32767 32767 32768; # v=1
+rlc log " case dd<0 dr>0 near nmax*pmax+pmax-1 = -1073741822"
+rw11::div_testdqr $cpu sym 32767 -32768 1; #
+rw11::div_testdqr $cpu sym 32767 -32768 0; # BAD-R4
+rw11::div_testdqr $cpu sym 32767 -32768 -1; # BAD-R4
+rw11::div_testdqr $cpu sym 32767 -32768 -32765; # BAD-R4
+rw11::div_testdqr $cpu sym 32767 -32768 -32766; # c.c BAD-R4
+rw11::div_testdqr $cpu sym 32767 -32768 -32767; # v=1
+rw11::div_testdqr $cpu sym 32767 -32768 -32768; # v=1
+rlc log " case dd<0 dr<0 near pmax*nmax+nmax-1 = -1073741823"
+rw11::div_testdqr $cpu sym -32768 32767 1; #
+rw11::div_testdqr $cpu sym -32768 32767 0; #
+rw11::div_testdqr $cpu sym -32768 32767 -1; #
+rw11::div_testdqr $cpu sym -32768 32767 -32766; #
+rw11::div_testdqr $cpu sym -32768 32767 -32767; # c.c
+rw11::div_testdqr $cpu sym -32768 32767 -32768; # v=1
+rw11::div_testdqr $cpu sym -32768 32767 -32769; # v=1
+#
+#
+rlc log " test late div quit cases in 2 quadrant algorithm"
+# dd dr q r n z v c
+rw11::div_testd2 $cpu sym -32767 -1 32767 0 0 0 0 0; #
+rw11::div_testd2 $cpu sym -32768 -1 0 0 0 0 1 0; #
+rw11::div_testd2 $cpu sym -32769 -1 0 0 0 0 1 0; #
+#
+rw11::div_testd2 $cpu sym -65534 -2 32767 0 0 0 0 0; #
+rw11::div_testd2 $cpu sym -65535 -2 32767 -1 0 0 0 0; #
+rw11::div_testd2 $cpu sym -65536 -2 0 0 0 0 1 0; #
+rw11::div_testd2 $cpu sym -65537 -2 0 0 0 0 1 0; #
+#
+#
+rlc log " test big divident overflow cases"
+# dd dr q r n z v c
+rw11::div_testd2 $cpu sym 0x7fffffff 1 0 0 0 0 1 0; #
+rw11::div_testd2 $cpu sym 0x7fffffff 2 0 0 0 0 1 0; #
+rw11::div_testd2 $cpu sym 0x7fffffff -1 0 0 1 0 1 0; #
+rw11::div_testd2 $cpu sym 0x7fffffff -2 0 0 1 0 1 0; #
+rw11::div_testd2 $cpu sym 0x80000000 1 0 0 1 0 1 0; #
+rw11::div_testd2 $cpu sym 0x80000000 2 0 0 1 0 1 0; #
+rw11::div_testd2 $cpu sym 0x80000000 -1 0 0 0 0 1 0; #
+rw11::div_testd2 $cpu sym 0x80000000 -2 0 0 0 0 1 0; #
Index: trunk/tools/tbench/test_w11a_dstw_word_flow.tcl
===================================================================
--- trunk/tools/tbench/test_w11a_dstw_word_flow.tcl (nonexistent)
+++ trunk/tools/tbench/test_w11a_dstw_word_flow.tcl (revision 30)
@@ -0,0 +1,102 @@
+# $Id: test_w11a_dstw_word_flow.tcl 575 2014-07-27 20:55:41Z mueller $
+#
+# Copyright 2013-2014 by Walter F.J. Mueller
+# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
+#
+# Revision History:
+# Date Rev Version Comment
+# 2014-07-27 575 1.0.2 drop tout value from asmwait, reply on asmwait_tout
+# 2014-03-01 552 1.0.1 check that unused regs stay 0
+# 2013-03-31 502 1.0 Initial version
+#
+# Test dstw flow with mov #nnn,... instructions for word access
+#
+
+# ----------------------------------------------------------------------------
+rlc log "test_w11a_dstw_word_flow: test dstw flow for word with mov #nnn,..."
+rlc log " r0,(r0),(r0)+,@(r0)+,-(r0),@-(r0) (mode=0,1,2,3,4,5)"
+
+# code register pre/post conditions beyond defaults
+# r0 -> 0100
+# r1 #data1 -> ..same
+# r2 #data2 -> #data2+4
+# r3 #pdata3 -> #pdata3+4
+# r4 #data4e -> #data4e-4
+# r5 #pdat5e -> #pdat5e-4
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov #100,r0
+ mov #110,(r1)
+ mov #120,(r2)+
+ mov #121,(r2)+
+ mov #130,@(r3)+
+ mov #131,@(r3)+
+ mov #141,-(r4)
+ mov #140,-(r4)
+ mov #151,@-(r5)
+ mov #150,@-(r5)
+ halt
+stop:
+;
+data1: .word 0
+data2: .word 0,0
+data3: .word 0,0
+data4: .word 0,0
+data4e:
+data5: .word 0,0
+data5e:
+pdata3: .word data3,data3+2
+pdata5: .word data5,data5+2
+pdat5e:
+}
+
+rw11::asmrun $cpu sym [list r1 $sym(data1) \
+ r2 $sym(data2) \
+ r3 $sym(pdata3) \
+ r4 $sym(data4e) \
+ r5 $sym(pdat5e) ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 0100 \
+ r1 $sym(data1) \
+ r2 [expr {$sym(data2) + 4}] \
+ r3 [expr {$sym(pdata3) + 4}] \
+ r4 [expr {$sym(data4e) - 4}] \
+ r5 [expr {$sym(pdat5e) - 4}] ]
+rw11::asmtmem $cpu $sym(data1) {0110 0120 0121 0130 0131 0140 0141 0150 0151}
+
+# ----------------------------------------------------------------------------
+rlc log " nn(r0),@nn(r0),var,@var,@#var (mode=6,7,67,77,37)"
+
+# code register pre/post conditions beyond defaults
+# r0 #data0-020 -> ..same
+# r1 #pdata0-040 -> ..same
+$cpu ldasm -lst lst -sym sym {
+ . = 1000
+start: mov #200,20(r0)
+ mov #210,@40(r1)
+ mov #220,data2
+ mov #230,@pdata3
+ mov #240,@#data4
+ halt
+stop:
+;
+data0: .word 0
+data1: .word 0
+data2: .word 0
+data3: .word 0
+data4: .word 0
+data4e:
+pdata1: .word data1
+pdata3: .word data3
+}
+
+rw11::asmrun $cpu sym [list r0 [expr {$sym(data0)-020}] \
+ r1 [expr {$sym(pdata1)-040}] ]
+rw11::asmwait $cpu sym
+rw11::asmtreg $cpu [list r0 [expr {$sym(data0)-020}] \
+ r1 [expr {$sym(pdata1)-040}] \
+ r2 0 \
+ r3 0 \
+ r4 0 \
+ r5 0 ]
+rw11::asmtmem $cpu $sym(data0) {0200 0210 0220 0230 0240}
Index: trunk/tools/src/librw11/Rw11CntlTM11.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11CntlTM11.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11CntlTM11.cpp (nonexistent)
@@ -1,638 +0,0 @@
-// $Id: Rw11CntlTM11.cpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-// Other credits:
-// the boot code is from the simh project and Copyright Robert M Supnik
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11CntlTM11.cpp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation of Rw11CntlTM11.
-*/
-
-#include "boost/bind.hpp"
-#include "boost/foreach.hpp"
-#define foreach_ BOOST_FOREACH
-
-#include "librtools/RosFill.hpp"
-#include "librtools/RosPrintBvi.hpp"
-#include "librtools/RosPrintf.hpp"
-#include "librtools/Rexception.hpp"
-#include "librtools/RlogMsg.hpp"
-
-#include "Rw11CntlTM11.hpp"
-
-using namespace std;
-
-/*!
- \class Retro::Rw11CntlTM11
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-// constants definitions
-
-const uint16_t Rw11CntlTM11::kIbaddr;
-const int Rw11CntlTM11::kLam;
-
-const uint16_t Rw11CntlTM11::kTMSR;
-const uint16_t Rw11CntlTM11::kTMCR;
-const uint16_t Rw11CntlTM11::kTMBC;
-const uint16_t Rw11CntlTM11::kTMBA;
-const uint16_t Rw11CntlTM11::kTMDB;
-const uint16_t Rw11CntlTM11::kTMRL;
-
-const uint16_t Rw11CntlTM11::kProbeOff;
-const bool Rw11CntlTM11::kProbeInt;
-const bool Rw11CntlTM11::kProbeRem;
-
-const uint16_t Rw11CntlTM11::kTMSR_M_ICMD;
-const uint16_t Rw11CntlTM11::kTMSR_M_EOF;
-const uint16_t Rw11CntlTM11::kTMSR_M_PAE;
-const uint16_t Rw11CntlTM11::kTMSR_M_EOT;
-const uint16_t Rw11CntlTM11::kTMSR_M_RLE;
-const uint16_t Rw11CntlTM11::kTMSR_M_BTE;
-const uint16_t Rw11CntlTM11::kTMSR_M_NXM;
-const uint16_t Rw11CntlTM11::kTMSR_M_ONL;
-const uint16_t Rw11CntlTM11::kTMSR_M_BOT;
-const uint16_t Rw11CntlTM11::kTMSR_M_WRL;
-const uint16_t Rw11CntlTM11::kTMSR_M_REW;
-const uint16_t Rw11CntlTM11::kTMSR_M_TUR;
-
-const uint16_t Rw11CntlTM11::kTMCR_V_ERR;
-const uint16_t Rw11CntlTM11::kTMCR_V_DEN;
-const uint16_t Rw11CntlTM11::kTMCR_B_DEN;
-const uint16_t Rw11CntlTM11::kTMCR_V_UNIT;
-const uint16_t Rw11CntlTM11::kTMCR_B_UNIT;
-const uint16_t Rw11CntlTM11::kTMCR_M_RDY;
-const uint16_t Rw11CntlTM11::kTMCR_V_EA;
-const uint16_t Rw11CntlTM11::kTMCR_B_EA;
-const uint16_t Rw11CntlTM11::kTMCR_V_FUNC;
-const uint16_t Rw11CntlTM11::kTMCR_B_FUNC;
-const uint16_t Rw11CntlTM11::kTMCR_M_GO;
-
-const uint16_t Rw11CntlTM11::kFUNC_UNLOAD;
-const uint16_t Rw11CntlTM11::kFUNC_READ;
-const uint16_t Rw11CntlTM11::kFUNC_WRITE ;
-const uint16_t Rw11CntlTM11::kFUNC_WEOF;
-const uint16_t Rw11CntlTM11::kFUNC_SFORW;
-const uint16_t Rw11CntlTM11::kFUNC_SBACK;
-const uint16_t Rw11CntlTM11::kFUNC_WEIRG;
-const uint16_t Rw11CntlTM11::kFUNC_REWIND;
-
-const uint16_t Rw11CntlTM11::kRFUNC_WUNIT;
-const uint16_t Rw11CntlTM11::kRFUNC_DONE;
-
-const uint16_t Rw11CntlTM11::kTMCR_M_RICMD;
-const uint16_t Rw11CntlTM11::kTMCR_M_RPAE;
-const uint16_t Rw11CntlTM11::kTMCR_M_RRLE;
-const uint16_t Rw11CntlTM11::kTMCR_M_RBTE;
-const uint16_t Rw11CntlTM11::kTMCR_M_RNXM;
-const uint16_t Rw11CntlTM11::kTMCR_M_REAENA;
-const uint16_t Rw11CntlTM11::kTMCR_V_REA;
-const uint16_t Rw11CntlTM11::kTMCR_B_REA;
-
-const uint16_t Rw11CntlTM11::kTMRL_M_EOF;
-const uint16_t Rw11CntlTM11::kTMRL_M_EOT;
-const uint16_t Rw11CntlTM11::kTMRL_M_ONL;
-const uint16_t Rw11CntlTM11::kTMRL_M_BOT;
-const uint16_t Rw11CntlTM11::kTMRL_M_WRL;
-const uint16_t Rw11CntlTM11::kTMRL_M_REW;
-
-//------------------------------------------+-----------------------------------
-//! Default constructor
-
-Rw11CntlTM11::Rw11CntlTM11()
- : Rw11CntlBase("tm11"),
- fPC_tmcr(0),
- fPC_tmsr(0),
- fPC_tmbc(0),
- fPC_tmba(0),
- fRd_tmcr(0),
- fRd_tmsr(0),
- fRd_tmbc(0),
- fRd_tmba(0),
- fRd_bc(0),
- fRd_addr(0),
- fRd_nwrd(0),
- fRd_fu(0),
- fRd_opcode(0),
- fBuf(),
- fRdma(this,
- boost::bind(&Rw11CntlTM11::RdmaPreExecCB, this, _1, _2, _3, _4),
- boost::bind(&Rw11CntlTM11::RdmaPostExecCB, this, _1, _2, _3, _4))
-{
- // must be here because Units have a back-ptr (not available at Rw11CntlBase)
- for (size_t i=0; iWProt()) tmds |= kTMRL_M_WRL;
- if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT;
- }
- unit.SetTmds(tmds);
- cpu.AddWibr(clist, fBase+kTMCR, (uint16_t(ind)<& code,
- uint16_t& aload, uint16_t& astart)
-{
- uint16_t kBOOT_START = 02000;
- uint16_t bootcode[] = { // tm11 boot loader - from simh pdp11_tm.c (v3.9)
- 0046524, // boot_start: "TM"
- 0012706, kBOOT_START, // mov #boot_start, sp
- 0012700, uint16_t(unit), // mov #unit_num, r0
- 0012701, 0172526, // mov #172526, r1 ; mtcma
- 0005011, // clr (r1)
- 0012741, 0177777, // mov #-1, -(r1) ; mtbrc
- 0010002, // mov r0,r2
- 0000302, // swab r2
- 0062702, 0060011, // add #60011, r2
- 0010241, // mov r2, -(r1) ; space + go
- 0105711, // tstb (r1) ; mtc
- 0100376, // bpl .-2
- 0010002, // mov r0,r2
- 0000302, // swab r2
- 0062702, 0060003, // add #60003, r2
- 0010211, // mov r2, (r1) ; read + go
- 0105711, // tstb (r1) ; mtc
- 0100376, // bpl .-2
- 0005002, // clr r2
- 0005003, // clr r3
- 0012704, uint16_t(kBOOT_START+020), // mov #boot_start+20, r4
- 0005005, // clr r5
- 0005007 // clr r7
- };
-
- code.clear();
- foreach_ (uint16_t& w, bootcode) code.push_back(w);
- aload = kBOOT_START;
- astart = kBOOT_START+2;
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::Dump(std::ostream& os, int ind, const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11CntlTM11 @ " << this << endl;
- os << bl << " fPC_tmcr: " << RosPrintf(fPC_tmcr,"d",6) << endl;
- os << bl << " fPC_tmsr: " << RosPrintf(fPC_tmsr,"d",6) << endl;
- os << bl << " fPC_tmbc: " << RosPrintf(fPC_tmbc,"d",6) << endl;
- os << bl << " fPC_tmba: " << RosPrintf(fPC_tmba,"d",6) << endl;
- os << bl << " fRd_tmcr: " << RosPrintBvi(fRd_tmcr,8) << endl;
- os << bl << " fRd_tmsr: " << RosPrintBvi(fRd_tmsr,8) << endl;
- os << bl << " fRd_tmbc: " << RosPrintBvi(fRd_tmbc,8) << endl;
- os << bl << " fRd_tmba: " << RosPrintBvi(fRd_tmba,8) << endl;
- os << bl << " fRd_bc: " << RosPrintf(fRd_bc,"d",6) << endl;
- os << bl << " fRd_addr: " << RosPrintBvi(fRd_addr,8,18) << endl;
- os << bl << " fRd_nwrd: " << RosPrintf(fRd_nwrd,"d",6) << endl;
- os << bl << " fRd_fu: " << fRd_fu << endl;
- os << bl << " fRd_opcode: " << fRd_opcode << endl;
- os << bl << " fBuf.size() " << RosPrintf(fBuf.size(),"d",6) << endl;
- fRdma.Dump(os, ind+2, "fRdma: ");
- Rw11CntlBase::Dump(os, ind, " ^");
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-int Rw11CntlTM11::AttnHandler(RlinkServer::AttnArgs& args)
-{
- fStats.Inc(kStatNAttnHdl);
- Server().GetAttnInfo(args, fPrimClist);
-
- uint16_t tmcr = fPrimClist[fPC_tmcr].Data();
- uint16_t tmsr = fPrimClist[fPC_tmsr].Data();
- uint16_t tmbc = fPrimClist[fPC_tmbc].Data();
- uint16_t tmba = fPrimClist[fPC_tmba].Data();
-
- uint16_t unum = (tmcr>>kTMCR_V_UNIT) & kTMCR_B_UNIT;
- uint16_t ea = (tmcr>>kTMCR_V_EA) & kTMCR_B_EA;
- uint16_t fu = (tmcr>>kTMCR_V_FUNC) & kTMCR_B_FUNC;
-
- uint32_t addr = uint32_t(ea)<<16 | uint32_t(tmba);
-
- uint32_t nbyt = (~uint32_t(tmbc)&0xffff) + 1; // transfer size in bytes
-
- //Rw11Cpu& cpu = Cpu();
- RlinkCommandList clist;
-
- if (fTraceLevel>0) {
- RlogMsg lmsg(LogFile());
- static const char* fumnemo[8] =
- {"un ","rd ","wr ","we ","sf ","sb ","wi ","re "};
- lmsg << "-I TM11"
- << " fu=" << fumnemo[fu&07]
- << " un=" << unum
- << " cr=" << RosPrintBvi(tmcr,8)
- << " ad=" << RosPrintBvi(addr,8,18)
- << " bc=" << RosPrintBvi(tmbc,8)
- << " nb=";
- if (nbyt==65536) lmsg << " (0)"; else lmsg << RosPrintf(nbyt,"d",5);
- }
-
- // check for spurious interrupts (either RDY=1 or RDY=0 and rdma busy)
- if ((tmcr & kTMCR_M_RDY) || fRdma.IsActive()) {
- RlogMsg lmsg(LogFile());
- lmsg << "-E TM11 err "
- << " cr=" << RosPrintBvi(tmcr,8)
- << " spurious lam: "
- << (fRdma.IsActive() ? "RDY=0 and Rdma busy" : "RDY=1");
- return 0;
- }
-
- // check for general abort conditions: invalid unit number
- if (unum > NUnit()) {
- AddErrorExit(clist, kTMCR_M_RICMD);
- Server().Exec(clist);
- return 0;
- }
-
- Rw11UnitTM11& unit = *fspUnit[unum];
-
- // check for general abort conditions:
- // - unit not attached
- // - write to a write locked unit
- bool wcmd = fu == kFUNC_WRITE ||
- fu == kFUNC_WEIRG ||
- fu == kFUNC_WEOF;
-
- if ((!unit.Virt()) || (wcmd && unit.Virt()->WProt()) ) {
- AddErrorExit(clist, kTMCR_M_RICMD);
- Server().Exec(clist);
- return 0;
- }
-
- // remember request parameters for call back and error exit handling
- fRd_tmcr = tmcr;
- fRd_tmsr = tmsr;
- fRd_tmbc = tmbc;
- fRd_tmba = tmba;
- fRd_addr = addr;
- fRd_fu = fu;
-
- // now handle the functions
- int opcode = Rw11VirtTape::kOpCodeOK;
- RerrMsg emsg;
-
- if (fu == kFUNC_UNLOAD) { // Unload ------------------------
- fStats.Inc(kStatNFuncUnload);
- unit.Detach();
- AddFastExit(clist, opcode, 0);
- RlogMsg lmsg(LogFile());
- lmsg << "-I TM11"
- << " unit " << unum << "unload";
-
- } else if (fu == kFUNC_READ) { // Read --------------------------
- fStats.Inc(kStatNFuncRead);
- size_t nwalloc = (nbyt+1)/2;
- if (fBuf.size() < nwalloc) fBuf.resize(nwalloc);
- size_t ndone;
- bool rc = unit.VirtReadRecord(nbyt, reinterpret_cast(fBuf.data()),
- ndone, fRd_opcode, emsg);
- if (!rc) WriteLog("read", emsg);
- if ((!rc) || ndone == 0) {
- AddFastExit(clist, fRd_opcode, 0);
- } else if (ndone&0x1) { // FIXME_code: add odd rlen handling
- AddErrorExit(clist, kTMCR_M_RICMD|kTMSR_M_BTE); // now just bail out !!
- } else {
- size_t nwdma = ndone/2;
- fRdma.QueueWMem(addr, fBuf.data(), nwdma,
- Rw11Cpu::kCPAH_M_22BIT|Rw11Cpu::kCPAH_M_UBMAP);
- }
-
- } else if (fu == kFUNC_WRITE || // Write -------------------------
- fu == kFUNC_WEIRG) {
- fStats.Inc((fu==kFUNC_WRITE) ? kStatNFuncWrite : kStatNFuncWrteg);
- size_t nwdma = (nbyt+1)/2;
- if (fBuf.size() < nwdma) fBuf.resize(nwdma);
- if (nbyt&0x1) { // FIXME_code: add odd rlen handling
- AddErrorExit(clist, kTMCR_M_RICMD|kTMSR_M_BTE); // now just bail out !!
- } else {
- fRdma.QueueRMem(addr, fBuf.data(), nwdma,
- Rw11Cpu::kCPAH_M_22BIT|Rw11Cpu::kCPAH_M_UBMAP);
- }
-
- } else if (fu == kFUNC_WEOF) { // Write Eof ---------------------
- fStats.Inc(kStatNFuncWeof);
- if (!unit.VirtWriteEof(emsg)) WriteLog("weof", emsg);
- AddFastExit(clist, opcode, 0);
-
- } else if (fu == kFUNC_SFORW) { // Space forward -----------------
- fStats.Inc(kStatNFuncSforw);
- size_t ndone;
- if (!unit.VirtSpaceForw(nbyt, ndone, opcode, emsg)) WriteLog("sback", emsg);
- AddFastExit(clist, opcode, ndone);
-
- } else if (fu == kFUNC_SBACK) { // Space Backward ----------------
- fStats.Inc(kStatNFuncSback);
- size_t ndone;
- if (!unit.VirtSpaceBack(nbyt, ndone, opcode, emsg)) WriteLog("sback", emsg);
- AddFastExit(clist, opcode, ndone);
-
- } else if (fu == kFUNC_REWIND) { // Rewind ------------------------
- fStats.Inc(kStatNFuncRewind);
- if (!unit.VirtRewind(opcode, emsg)) WriteLog("rewind", emsg);
- AddFastExit(clist, opcode, 0);
- }
-
- if (clist.Size()) { // if handled directly
- Server().Exec(clist); // doit
- }
-
- return 0;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::RdmaPreExecCB(int stat, size_t nwdone, size_t nwnext,
- RlinkCommandList& clist)
-{
- // noop for TM11
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::RdmaPostExecCB(int stat, size_t ndone,
- RlinkCommandList& clist, size_t ncmd)
-{
- if (stat == Rw11Rdma::kStatusBusy) return;
-
- uint16_t tmcr = 0;
- // handle Rdma aborts
- if (stat == Rw11Rdma::kStatusFailRdma) tmcr |= kTMCR_M_RNXM;
-
- // finally to TM11 register update
- RlinkCommandList clist1;
- AddNormalExit(clist1, ndone, tmcr);
- Server().Exec(clist1);
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::AddErrorExit(RlinkCommandList& clist, uint16_t tmcr)
-{
- Rw11Cpu& cpu = Cpu();
-
- tmcr |= (kRFUNC_DONE<1) {
- RlogMsg lmsg(LogFile());
- lmsg << "-I TM11"
- << " err "
- << " "
- << " cr=" << RosPrintBvi(tmcr,8);
- }
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::AddFastExit(RlinkCommandList& clist, int opcode, size_t ndone)
-{
- uint16_t unum = (fRd_tmcr>>kTMCR_V_UNIT) & kTMCR_B_UNIT;
- Rw11UnitTM11& unit = *fspUnit[unum];
- Rw11Cpu& cpu = Cpu();
-
- uint16_t tmcr = 0;
- uint16_t tmds = kTMRL_M_ONL;
- if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL;
- if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT;
- if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT;
-
- switch (opcode) {
-
- case Rw11VirtTape::kOpCodeOK:
- case Rw11VirtTape::kOpCodeBot:
- break;
-
- case Rw11VirtTape::kOpCodeEof:
- tmds |= kTMRL_M_EOF;
- break;
-
- default:
- tmcr |= kTMCR_M_RBTE;
- break;
- }
-
- uint16_t tmbc = fRd_tmbc + uint16_t(ndone);
-
- unit.SetTmds(tmds);
- cpu.AddWibr(clist, fBase+kTMCR, (uint16_t(unum)<1) {
- RlogMsg lmsg(LogFile());
- bool err = tmcr & (kTMCR_M_RBTE);
- lmsg << "-I TM11"
- << (err ? " err " :" ok ")
- << " un=" << unum
- << " cr=" << RosPrintBvi(tmcr,8)
- << " ds=" << RosPrintBvi(tmds,8)
- << " bc=" << RosPrintBvi(tmbc,8);
- }
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::AddNormalExit(RlinkCommandList& clist, size_t ndone,
- uint16_t tmcr)
-{
- uint16_t unum = (fRd_tmcr>>kTMCR_V_UNIT) & kTMCR_B_UNIT;
- Rw11UnitTM11& unit = *fspUnit[unum];
- Rw11Cpu& cpu = Cpu();
-
- uint16_t tmds = kTMRL_M_ONL;
- if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL;
- if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT;
- if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT;
-
- uint32_t addr = fRd_addr + 2*ndone;
- uint16_t tmbc = fRd_tmbc + 2*uint16_t(ndone);
-
- if (fRd_fu == kFUNC_READ) { // handle READ
- switch (fRd_opcode) {
-
- case Rw11VirtTape::kOpCodeOK:
- break;
-
- case Rw11VirtTape::kOpCodeRecLenErr:
- tmcr |= kTMCR_M_RRLE;
- break;
-
- case Rw11VirtTape::kOpCodeBadParity:
- tmcr |= kTMCR_M_RPAE;
- break;
-
- default:
- tmcr |= kTMCR_M_RBTE;
- break;
- }
-
- } else { // handle WRITE or WEIRG
- int opcode;
- RerrMsg emsg;
- size_t nbyt = 2*ndone;
- if (!unit.VirtWriteRecord(nbyt, reinterpret_cast(fBuf.data()),
- opcode, emsg))
- WriteLog("write", emsg);
- }
-
- uint16_t tmba = uint16_t(addr & 0xfffe);
- uint16_t ea = uint16_t((addr>>16)&0x0003);
- tmcr |= kTMCR_M_REAENA | (ea<1) {
- RlogMsg lmsg(LogFile());
- bool err = tmcr & (kTMCR_M_RPAE|kTMCR_M_RRLE|kTMCR_M_RBTE|kTMCR_M_RNXM);
- lmsg << "-I TM11"
- << (err ? " err " :" ok ")
- << " un=" << unum
- << " cr=" << RosPrintBvi(tmcr,8)
- << " ad=" << RosPrintBvi(addr,8,18)
- << " bc=" << RosPrintBvi(tmbc,8)
- << " ds=" << RosPrintBvi(tmds,8);
- }
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11CntlTM11::WriteLog(const char* func, RerrMsg& emsg)
-{
- RlogMsg lmsg(LogFile());
- lmsg << "-E TM11"
- << " error for func=" << func
- << ":" << emsg;
-
- return;
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11CntlTM11.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11CntlTM11.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11CntlTM11.hpp (nonexistent)
@@ -1,180 +0,0 @@
-// $Id: Rw11CntlTM11.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11CntlTM11.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11CntlTM11.
-*/
-
-#ifndef included_Retro_Rw11CntlTM11
-#define included_Retro_Rw11CntlTM11 1
-
-#include "Rw11CntlBase.hpp"
-#include "Rw11UnitTM11.hpp"
-#include "Rw11Rdma.hpp"
-
-namespace Retro {
-
- class Rw11CntlTM11 : public Rw11CntlBase {
- public:
-
- Rw11CntlTM11();
- ~Rw11CntlTM11();
-
- void Config(const std::string& name, uint16_t base, int lam);
-
- virtual void Start();
-
- virtual bool BootCode(size_t unit, std::vector& code,
- uint16_t& aload, uint16_t& astart);
-
- virtual void UnitSetup(size_t ind);
-
- void SetChunkSize(size_t chunk);
- size_t ChunkSize() const;
-
- const Rstats& RdmaStats() const;
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- // some constants (also defined in cpp)
- static const uint16_t kIbaddr = 0172520; //!< TM11 default address
- static const int kLam = 7; //!< TM11 default lam
-
- static const uint16_t kTMSR = 000; //!< TMSR reg offset
- static const uint16_t kTMCR = 002; //!< TMCR reg offset
- static const uint16_t kTMBC = 004; //!< TMBC reg offset
- static const uint16_t kTMBA = 006; //!< TMBA reg offset
- static const uint16_t kTMDB = 010; //!< TMDB reg offset
- static const uint16_t kTMRL = 012; //!< TMRL reg offset
-
- static const uint16_t kProbeOff = kTMCR; //!< probe address offset (tmcr)
- static const bool kProbeInt = true; //!< probe int active
- static const bool kProbeRem = true; //!< probr rem active
-
- static const uint16_t kTMSR_M_ICMD = kWBit15; //!< ICMD: invalid cmd
- static const uint16_t kTMSR_M_EOF = kWBit14; //!< EOF: end-of-file seen
- static const uint16_t kTMSR_M_PAE = kWBit12; //!< PAE: parity error
- static const uint16_t kTMSR_M_EOT = kWBit10; //!< EOT: end-of-tape seen
- static const uint16_t kTMSR_M_RLE = kWBit09; //!< RLE: record lgth error
- static const uint16_t kTMSR_M_BTE = kWBit08; //!< BTE: bad tape error
- static const uint16_t kTMSR_M_NXM = kWBit07; //!< NXM: non-existant mem
- static const uint16_t kTMSR_M_ONL = kWBit06; //!< ONL: online
- static const uint16_t kTMSR_M_BOT = kWBit05; //!< BOT: at begin-of-tape
- static const uint16_t kTMSR_M_WRL = kWBit02; //!< WRL: write locked
- static const uint16_t kTMSR_M_REW = kWBit01; //!< REW: tape rewound
- static const uint16_t kTMSR_M_TUR = kWBit00; //!< TUR: unit ready
-
- static const uint16_t kTMCR_V_ERR = 15;
- static const uint16_t kTMCR_V_DEN = 13;
- static const uint16_t kTMCR_B_DEN = 0003;
- static const uint16_t kTMCR_V_UNIT = 8;
- static const uint16_t kTMCR_B_UNIT = 0007;
- static const uint16_t kTMCR_M_RDY = kWBit07;
- static const uint16_t kTMCR_V_EA = 4;
- static const uint16_t kTMCR_B_EA = 0003;
- static const uint16_t kTMCR_V_FUNC = 1;
- static const uint16_t kTMCR_B_FUNC = 0007;
- static const uint16_t kTMCR_M_GO = kWBit00;
-
- static const uint16_t kFUNC_UNLOAD = 0;
- static const uint16_t kFUNC_READ = 1;
- static const uint16_t kFUNC_WRITE = 2;
- static const uint16_t kFUNC_WEOF = 3;
- static const uint16_t kFUNC_SFORW = 4;
- static const uint16_t kFUNC_SBACK = 5;
- static const uint16_t kFUNC_WEIRG = 6;
- static const uint16_t kFUNC_REWIND = 7;
- // remote function codes
- static const uint16_t kRFUNC_WUNIT = 1;
- static const uint16_t kRFUNC_DONE = 2;
-
- // cr usage or rem func=wunit
- static const uint16_t kTMCR_V_RUNIT = 4;
- static const uint16_t kTMCR_B_RUNIT = 0003;
- // cr usage or rem func=done
- static const uint16_t kTMCR_M_RICMD = kWBit15;
- static const uint16_t kTMCR_M_RPAE = kWBit12;
- static const uint16_t kTMCR_M_RRLE = kWBit09;
- static const uint16_t kTMCR_M_RBTE = kWBit08;
- static const uint16_t kTMCR_M_RNXM = kWBit07;
- static const uint16_t kTMCR_M_REAENA = kWBit06;
- static const uint16_t kTMCR_V_REA = 4;
- static const uint16_t kTMCR_B_REA = 0003;
-
- // rem usage of TMRL (used to access unit specific TMSR fields)
- static const uint16_t kTMRL_M_EOF = kWBit10; //!< EOF: end-of-file seen
- static const uint16_t kTMRL_M_EOT = kWBit09; //!< EOT: end-of-tape seen
- static const uint16_t kTMRL_M_ONL = kWBit08; //!< ONL: online
- static const uint16_t kTMRL_M_BOT = kWBit07; //!< BOT: at begin-of-tape
- static const uint16_t kTMRL_M_WRL = kWBit06; //!< WRL: write locked
- static const uint16_t kTMRL_M_REW = kWBit05; //!< REW: tape rewinding
-
- // statistics counter indices
- enum stats {
- kStatNFuncUnload= Rw11Cntl::kDimStat, //!< func UNLOAD
- kStatNFuncRead, //!< func READ
- kStatNFuncWrite, //!< func WRITE
- kStatNFuncWeof, //!< func WEOF
- kStatNFuncSforw, //!< func SFORW
- kStatNFuncSback, //!< func SBACK
- kStatNFuncWrteg, //!< func WRTEG
- kStatNFuncRewind, //!< func REWIND
- kDimStat
- };
-
- protected:
- int AttnHandler(RlinkServer::AttnArgs& args);
- void RdmaPreExecCB(int stat, size_t nwdone, size_t nwnext,
- RlinkCommandList& clist);
- void RdmaPostExecCB(int stat, size_t ndone,
- RlinkCommandList& clist, size_t ncmd);
- void AddErrorExit(RlinkCommandList& clist, uint16_t tmcr);
- void AddFastExit(RlinkCommandList& clist, int opcode,
- size_t ndone);
- void AddNormalExit(RlinkCommandList& clist, size_t ndone,
- uint16_t tmcr=0);
- void WriteLog(const char* func, RerrMsg& emsg);
-
- protected:
- size_t fPC_tmcr; //!< PrimClist: tmcr index
- size_t fPC_tmsr; //!< PrimClist: tmsr index
- size_t fPC_tmbc; //!< PrimClist: tmbc index
- size_t fPC_tmba; //!< PrimClist: tmba index
-
- uint16_t fRd_tmcr; //!< Rdma: request tmcr
- uint16_t fRd_tmsr; //!< Rdma: request tmsr
- uint16_t fRd_tmbc; //!< Rdma: request tmbc
- uint16_t fRd_tmba; //!< Rdma: request tmba
- uint32_t fRd_bc; //!< Rdma: request bc
- uint32_t fRd_addr; //!< Rdma: current addr
- uint32_t fRd_nwrd; //!< Rdma: current nwrd
- uint16_t fRd_fu; //!< Rdma: request fu code
- int fRd_opcode; //!< Rdma: read opcode
- std::vector fBuf; //!< data buffer
- Rw11Rdma fRdma; //!< Rdma controller
- };
-
-} // end namespace Retro
-
-#include "Rw11CntlTM11.ipp"
-
-#endif
Index: trunk/tools/src/librw11/Rw11CntlTM11.ipp
===================================================================
--- trunk/tools/src/librw11/Rw11CntlTM11.ipp (revision 31)
+++ trunk/tools/src/librw11/Rw11CntlTM11.ipp (nonexistent)
@@ -1,55 +0,0 @@
-// $Id: Rw11CntlTM11.ipp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-05-17 683 1.0 Initial version
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11CntlTM11.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11CntlTM11.
-*/
-
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline void Rw11CntlTM11::SetChunkSize(size_t chunk)
-{
- fRdma.SetChunkSize(chunk);
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline size_t Rw11CntlTM11::ChunkSize() const
-{
- return fRdma.ChunkSize();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline const Rstats& Rw11CntlTM11::RdmaStats() const
-{
- return fRdma.Stats();
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11VirtTapeTap.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11VirtTapeTap.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11VirtTapeTap.hpp (nonexistent)
@@ -1,90 +0,0 @@
-// $Id: Rw11VirtTapeTap.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11VirtTapeTap.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11VirtTapeTap.
-*/
-
-#ifndef included_Retro_Rw11VirtTapeTap
-#define included_Retro_Rw11VirtTapeTap 1
-
-#include "Rw11VirtTape.hpp"
-
-namespace Retro {
-
- class Rw11VirtTapeTap : public Rw11VirtTape {
- public:
-
- explicit Rw11VirtTapeTap(Rw11Unit* punit);
- ~Rw11VirtTapeTap();
-
- bool Open(const std::string& url, RerrMsg& emsg);
-
- virtual bool ReadRecord(size_t nbyt, uint8_t* data, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- virtual bool WriteRecord(size_t nbyt, const uint8_t* data,
- int& opcode, RerrMsg& emsg);
- virtual bool WriteEof(RerrMsg& emsg);
- virtual bool SpaceForw(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- virtual bool SpaceBack(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- virtual bool Rewind(int& opcode, RerrMsg& emsg);
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- // some constants (also defined in cpp)
- static const uint32_t kMetaEof = 0x00000000; //!< EOF marker
- static const uint32_t kMetaEom = 0xffffffff; //!< EOM marker
- static const uint32_t kMeta_M_Perr = 0x80000000;
- static const uint32_t kMeta_M_Mbz = 0x7fff0000;
- static const uint32_t kMeta_B_Rlen = 0x0000ffff;
-
- protected:
- bool Seek(size_t seekpos, int dir, RerrMsg& emsg);
- bool Read(size_t nbyt, uint8_t* data, RerrMsg& emsg);
- bool Write(size_t nbyt, const uint8_t* data, bool back,
- RerrMsg& emsg);
- bool CheckSizeForw(size_t nbyt, const char* text, RerrMsg& emsg);
- bool CheckSizeBack(size_t nbyt, const char* text, RerrMsg& emsg);
- void UpdatePos(size_t nbyt, int dir);
- bool ParseMeta(uint32_t meta, size_t& rlen, bool& perr,
- RerrMsg& emsg);
- size_t BytePadding(size_t rlen);
- bool SetBad();
- bool BadTapeMsg(const char* meth, RerrMsg& emsg);
- void IncPosRecord(int delta);
-
- protected:
- int fFd; //!< file number
- size_t fSize; //!< file size
- size_t fPos; //!< file position
- bool fBad; //!< BAD file format flag
- bool fPadOdd; //!< do odd byte padding
- bool fTruncPend; //!< truncate on next write
- };
-
-} // end namespace Retro
-
-#include "Rw11VirtTapeTap.ipp"
-
-#endif
Index: trunk/tools/src/librw11/Rw11UnitTM11.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTM11.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTM11.cpp (nonexistent)
@@ -1,73 +0,0 @@
-// $Id: Rw11UnitTM11.cpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-05-17 683 1.0 Initial version
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11UnitTM11.cpp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation of Rw11UnitTM11.
-*/
-
-#include "boost/bind.hpp"
-
-#include "librtools/RosFill.hpp"
-#include "Rw11CntlTM11.hpp"
-
-#include "Rw11UnitTM11.hpp"
-
-using namespace std;
-
-/*!
- \class Retro::Rw11UnitTM11
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! Constructor
-
-Rw11UnitTM11::Rw11UnitTM11(Rw11CntlTM11* pcntl, size_t index)
- : Rw11UnitTapeBase(pcntl, index),
- fTmds(0)
-{
- // setup disk geometry: only rk05 supported, no rk05f !
- fType = "tu10";
- fEnabled = true;
-}
-
-//------------------------------------------+-----------------------------------
-//! Destructor
-
-Rw11UnitTM11::~Rw11UnitTM11()
-{}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTM11::Dump(std::ostream& os, int ind, const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11UnitTM11 @ " << this << endl;
- os << bl << " fTmds: " << fTmds << endl;
-
- Rw11UnitTapeBase::Dump(os, ind, " ^");
- return;
-}
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11UnitTM11.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTM11.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTM11.hpp (nonexistent)
@@ -1,53 +0,0 @@
-// $Id: Rw11UnitTM11.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-05-17 683 1.0 Initial version
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11UnitTM11.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11UnitTM11.
-*/
-
-#ifndef included_Retro_Rw11UnitTM11
-#define included_Retro_Rw11UnitTM11 1
-
-#include "Rw11UnitTapeBase.hpp"
-
-namespace Retro {
-
- class Rw11CntlTM11; // forw decl to avoid circular incl
-
- class Rw11UnitTM11 : public Rw11UnitTapeBase {
- public:
- Rw11UnitTM11(Rw11CntlTM11* pcntl, size_t index);
- ~Rw11UnitTM11();
-
- void SetTmds(uint16_t tmds);
- uint16_t Tmds() const;
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- protected:
- uint16_t fTmds;
- };
-
-} // end namespace Retro
-
-#include "Rw11UnitTM11.ipp"
-
-#endif
Index: trunk/tools/src/librw11/Rw11UnitTM11.ipp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTM11.ipp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTM11.ipp (nonexistent)
@@ -1,52 +0,0 @@
-// $Id: Rw11UnitTM11.ipp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-05-17 683 1.0 Initial version
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11UnitTM11.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11UnitTM11.
-*/
-
-#include "Rw11UnitTM11.hpp"
-
-/*!
- \class Retro::Rw11UnitTM11
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline void Rw11UnitTM11::SetTmds(uint16_t tmds)
-{
- fTmds = tmds;
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline uint16_t Rw11UnitTM11::Tmds() const
-{
- return fTmds;
-}
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11UnitTapeBase.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTapeBase.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTapeBase.hpp (nonexistent)
@@ -1,56 +0,0 @@
-// $Id: Rw11UnitTapeBase.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-05-17 683 1.0 Initial version
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11UnitTapeBase.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11UnitTapeBase.
-*/
-
-#ifndef included_Retro_Rw11UnitTapeBase
-#define included_Retro_Rw11UnitTapeBase 1
-
-#include "Rw11UnitTape.hpp"
-
-namespace Retro {
-
- template
- class Rw11UnitTapeBase : public Rw11UnitTape {
- public:
-
- Rw11UnitTapeBase(TC* pcntl, size_t index);
- ~Rw11UnitTapeBase();
-
- TC& Cntl() const;
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- protected:
- virtual void AttachDone();
- virtual void DetachDone();
-
- protected:
- TC* fpCntl;
- };
-
-} // end namespace Retro
-
-#include "Rw11UnitTapeBase.ipp"
-
-#endif
Index: trunk/tools/src/librw11/Rw11UnitTapeBase.ipp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTapeBase.ipp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTapeBase.ipp (nonexistent)
@@ -1,99 +0,0 @@
-// $Id: Rw11UnitTapeBase.ipp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11UnitTapeBase.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11UnitTapeBase.
-*/
-
-#include "Rw11UnitTapeBase.hpp"
-
-/*!
- \class Retro::Rw11UnitTapeBase
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! Default constructor
-
-template
-Rw11UnitTapeBase::Rw11UnitTapeBase(TC* pcntl, size_t index)
- : Rw11UnitTape(pcntl, index),
- fpCntl(pcntl)
-{}
-
-//------------------------------------------+-----------------------------------
-//! Destructor
-
-template
-Rw11UnitTapeBase::~Rw11UnitTapeBase()
-{}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-template
-inline TC& Rw11UnitTapeBase::Cntl() const
-{
- return *fpCntl;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-template
-void Rw11UnitTapeBase::Dump(std::ostream& os, int ind,
- const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11UnitTapeBase @ " << this << std::endl;
- os << bl << " fpCntl: " << fpCntl << std::endl;
- Rw11UnitTape::Dump(os, ind, " ^");
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-template
-void Rw11UnitTapeBase::AttachDone()
-{
- // transfer, if defined, wprot and capacity from unit to virt
- if (WProt()) Virt()->SetWProt(true);
- if (Capacity()!=0 && Virt()->Capacity()==0) Virt()->SetCapacity(Capacity());
- Cntl().UnitSetup(Index());
- return;
-}
-
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-template
-void Rw11UnitTapeBase::DetachDone()
-{
- Cntl().UnitSetup(Index());
- return;
-}
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11UnitTape.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTape.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTape.cpp (nonexistent)
@@ -1,249 +0,0 @@
-// $Id: Rw11UnitTape.cpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11UnitTape.cpp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation of Rw11UnitTape.
-*/
-
-#include "librtools/Rexception.hpp"
-
-#include "Rw11UnitTape.hpp"
-
-using namespace std;
-
-/*!
- \class Retro::Rw11UnitTape
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! Constructor
-
-Rw11UnitTape::Rw11UnitTape(Rw11Cntl* pcntl, size_t index)
- : Rw11UnitVirt(pcntl, index),
- fType(),
- fEnabled(false),
- fWProt(false),
- fCapacity(0)
-{}
-
-//------------------------------------------+-----------------------------------
-//! Destructor
-
-Rw11UnitTape::~Rw11UnitTape()
-{}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::SetType(const std::string& type)
-{
- throw Rexception("Rw11UnitTape::SetType",
- string("Bad args: only type '") + fType + "' supported");
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::SetWProt(bool wprot)
-{
- if (Virt()) throw Rexception("Rw11UnitTape::SetWProt",
- "not allowed when tape attached");
- fWProt = wprot;
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::SetCapacity(size_t nbyte)
-{
- if (Virt()) throw Rexception("Rw11UnitTape::SetCapacity",
- "not allowed when tape attached");
- fCapacity = nbyte;
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::SetPosFile(int posfile)
-{
- if (!Virt()) throw Rexception("Rw11UnitTape::SetPosFile",
- "no tape attached");
- Virt()->SetPosFile(posfile);
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::SetPosRecord(int posrec)
-{
- if (!Virt()) throw Rexception("Rw11UnitTape::SetPosRecord",
- "no tape attached");
- Virt()->SetPosRecord(posrec);
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::Bot() const
-{
- if (!Virt()) return false;
- return Virt()->Bot();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::Eot() const
-{
- if (!Virt()) return false;
- return Virt()->Eot();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::Eom() const
-{
- if (!Virt()) return false;
- return Virt()->Eom();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-int Rw11UnitTape::PosFile() const
-{
- if (!Virt()) return -1;
- return Virt()->PosFile();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-int Rw11UnitTape::PosRecord() const
-{
- if (!Virt()) return -1;
- return Virt()->PosRecord();
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtReadRecord(size_t nbyte, uint8_t* data, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtReadRecord", "no tape attached");
- return false;
- }
- return Virt()->ReadRecord(nbyte, data, ndone, opcode, emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtWriteRecord(size_t nbyte, const uint8_t* data,
- int& opcode, RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtWriteRecord", "no tape attached");
- return false;
- }
- return Virt()->WriteRecord(nbyte, data, opcode, emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtWriteEof(RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtWriteEof", "no tape attached");
- return false;
- }
- return Virt()->WriteEof(emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtSpaceForw(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtSpaceForw", "no tape attached");
- return false;
- }
- return Virt()->SpaceForw(nrec, ndone, opcode, emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtSpaceBack(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtSpaceBack", "no tape attached");
- return false;
- }
- return Virt()->SpaceBack(nrec, ndone, opcode, emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11UnitTape::VirtRewind(int& opcode, RerrMsg& emsg)
-{
- if (!Virt()) {
- emsg.Init("Rw11UnitTape::VirtRewind", "no tape attached");
- return false;
- }
- return Virt()->Rewind(opcode, emsg);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11UnitTape::Dump(std::ostream& os, int ind, const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11UnitTape @ " << this << endl;
- os << bl << " fType: " << fType << endl;
- os << bl << " fEnabled: " << fEnabled << endl;
- os << bl << " fWProt: " << fWProt << endl;
- os << bl << " fCapacity: " << fCapacity << endl;
-
- Rw11UnitVirt::Dump(os, ind, " ^");
- return;
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11UnitTape.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11UnitTape.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11UnitTape.hpp (nonexistent)
@@ -1,85 +0,0 @@
-// $Id: Rw11UnitTape.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11UnitTape.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11UnitTape.
-*/
-
-#ifndef included_Retro_Rw11UnitTape
-#define included_Retro_Rw11UnitTape 1
-
-#include "Rw11VirtTape.hpp"
-
-#include "Rw11UnitVirt.hpp"
-
-namespace Retro {
-
- class Rw11UnitTape : public Rw11UnitVirt {
- public:
- Rw11UnitTape(Rw11Cntl* pcntl, size_t index);
- ~Rw11UnitTape();
-
- virtual void SetType(const std::string& type);
-
- const std::string& Type() const;
- virtual bool Enabled() const;
-
- void SetWProt(bool wprot);
- void SetCapacity(size_t nbyte);
- bool WProt() const;
- size_t Capacity() const;
-
- void SetPosFile(int posfile);
- void SetPosRecord(int posrec);
-
- bool Bot() const;
- bool Eot() const;
- bool Eom() const;
-
- int PosFile() const;
- int PosRecord() const;
-
- bool VirtReadRecord(size_t nbyte, uint8_t* data, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- bool VirtWriteRecord(size_t nbyte, const uint8_t* data,
- int& opcode, RerrMsg& emsg);
- bool VirtWriteEof(RerrMsg& emsg);
- bool VirtSpaceForw(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- bool VirtSpaceBack(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg);
- bool VirtRewind(int& opcode, RerrMsg& emsg);
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- protected:
- std::string fType; //!< drive type
- bool fEnabled; //!< unit enabled
- bool fWProt; //!< unit write protected
- size_t fCapacity; //
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11UnitTape.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11UnitTape.
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline const std::string& Rw11UnitTape::Type() const
-{
- return fType;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11UnitTape::Enabled() const
-{
- return fEnabled;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11UnitTape::WProt() const
-{
- return Virt() ? Virt()->WProt() : fWProt;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline size_t Rw11UnitTape::Capacity() const
-{
- return Virt() ? Virt()->Capacity() : fCapacity;
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11VirtTape.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11VirtTape.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11VirtTape.cpp (nonexistent)
@@ -1,172 +0,0 @@
-// $Id: Rw11VirtTape.cpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11VirtTape.cpp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation of Rw11VirtTape.
-*/
-#include
-
-#include "librtools/RosFill.hpp"
-#include "librtools/RparseUrl.hpp"
-#include "librtools/Rexception.hpp"
-#include "Rw11VirtTapeTap.hpp"
-
-#include "Rw11VirtTape.hpp"
-
-using namespace std;
-
-/*!
- \class Retro::Rw11VirtTape
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! Default constructor
-
-Rw11VirtTape::Rw11VirtTape(Rw11Unit* punit)
- : Rw11Virt(punit),
- fWProt(false),
- fCapacity(0),
- fBot(false),
- fEot(false),
- fEom(true),
- fPosFile(-1),
- fPosRecord(-1)
-{
- fStats.Define(kStatNVTReadRec, "NVTReadRec", "ReadRecord() calls");
- fStats.Define(kStatNVTReadByt, "NVTReadByt", "bytes read");
- fStats.Define(kStatNVTReadEof, "NVTReadEof", "eof read");
- fStats.Define(kStatNVTReadEom, "NVTReadEom", "eom read");
- fStats.Define(kStatNVTReadPErr, "NVTReadPErr", "parity error read");
- fStats.Define(kStatNVTReadLErr, "NVTReadLErr", "length error read");
- fStats.Define(kStatNVTWriteRec, "NVTWriteRec", "WriteRecord() calls");
- fStats.Define(kStatNVTWriteByt, "NVTWriteByt", "bytes written");
- fStats.Define(kStatNVTWriteEof, "NVTWriteEof", "WriteEof() calls");
- fStats.Define(kStatNVTSpaForw, "NVTSpaForw", "SpaceForw() calls");
- fStats.Define(kStatNVTSpaBack, "NVTSpaBack", "SpaceBack() calls");
- fStats.Define(kStatNVTRewind, "NVTRewind", "Rewind() calls");
-}
-
-//------------------------------------------+-----------------------------------
-//! Destructor
-
-Rw11VirtTape::~Rw11VirtTape()
-{}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-Rw11VirtTape* Rw11VirtTape::New(const std::string& url, Rw11Unit* punit,
- RerrMsg& emsg)
-{
- string scheme = RparseUrl::FindScheme(url, "tap");
- unique_ptr p;
-
- if (scheme == "tap") { // scheme -> tap:
- p.reset(new Rw11VirtTapeTap(punit));
- if (p->Open(url, emsg)) return p.release();
-
- } else { // scheme -> no match
- emsg.Init("Rw11VirtTape::New", string("Scheme '") + scheme +
- "' is not supported");
- }
-
- return 0;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11VirtTape::SetPosFile(int posfile)
-{
- if (posfile < 0) posfile = 0;
-
- RerrMsg emsg;
- int opcode;
- size_t ndone;
- bool rc = Rewind(opcode, emsg);
-
- while (rc && posfile != fPosFile) {
- rc = SpaceForw(1000000000, ndone, opcode, emsg);
- if (rc && opcode == kOpCodeEom) return;
- }
-
- if (!rc) throw Rexception("Rw11VirtTape::SetPosFile", emsg.Text());
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11VirtTape::SetPosRecord(int posrec)
-{
- if (posrec < 0) posrec = 0;
-
- RerrMsg emsg;
- int opcode;
- size_t ndone;
-
- // space back to begin of current file (works even when fPosRecord is -1!)
- bool rc = SpaceBack(1000000000, ndone, opcode, emsg);
- // if eof was spaced over backwards, space forward over eof
- if (rc && opcode == kOpCodeEof) rc = SpaceForw(1, ndone, opcode, emsg);
- // now space forward to find record
- if (rc && posrec != 0) {
- rc = SpaceForw(posrec, ndone, opcode, emsg);
- // if eof was spaced over, space backward over eof to stay in file
- // the number of records spaced is used to setup fPosRecord
- if (rc && opcode == kOpCodeEof) {
- size_t ndoneeof;
- rc = SpaceBack(1, ndoneeof, opcode, emsg);
- if (rc) fPosRecord = ndone;
- }
- }
-
- if (!rc) throw Rexception("Rw11VirtTape::SetPosFile", emsg.Text());
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11VirtTape::Dump(std::ostream& os, int ind, const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11VirtTape @ " << this << endl;
-
- os << bl << " fWProt: " << fWProt << endl;
- os << bl << " fCapacity: " << fCapacity << endl;
- os << bl << " fBot: " << fBot << endl;
- os << bl << " fEot: " << fEot << endl;
- os << bl << " fEom: " << fEom << endl;
- os << bl << " fPosFile: " << fPosFile << endl;
- os << bl << " fPosRecord: " << fPosRecord << endl;
- Rw11Virt::Dump(os, ind, " ^");
- return;
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11VirtTape.hpp
===================================================================
--- trunk/tools/src/librw11/Rw11VirtTape.hpp (revision 31)
+++ trunk/tools/src/librw11/Rw11VirtTape.hpp (nonexistent)
@@ -1,112 +0,0 @@
-// $Id: Rw11VirtTape.hpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-
-/*!
- \file
- \version $Id: Rw11VirtTape.hpp 686 2015-06-04 21:08:08Z mueller $
- \brief Declaration of class Rw11VirtTape.
-*/
-
-#ifndef included_Retro_Rw11VirtTape
-#define included_Retro_Rw11VirtTape 1
-
-#include "Rw11Virt.hpp"
-
-namespace Retro {
-
- class Rw11VirtTape : public Rw11Virt {
- public:
- explicit Rw11VirtTape(Rw11Unit* punit);
- ~Rw11VirtTape();
-
- void SetWProt(bool wprot);
- void SetCapacity(size_t nbyte);
- bool WProt() const;
- size_t Capacity() const;
-
- virtual bool ReadRecord(size_t nbyte, uint8_t* data, size_t& ndone,
- int& opcode, RerrMsg& emsg) = 0;
- virtual bool WriteRecord(size_t nbyte, const uint8_t* data,
- int& opcode, RerrMsg& emsg) = 0;
- virtual bool WriteEof(RerrMsg& emsg) = 0;
- virtual bool SpaceForw(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg) = 0;
- virtual bool SpaceBack(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg) = 0;
- virtual bool Rewind(int& opcode, RerrMsg& emsg) = 0;
-
- void SetPosFile(int posfile);
- void SetPosRecord(int posrec);
-
- bool Bot() const;
- bool Eot() const;
- bool Eom() const;
-
- int PosFile() const;
- int PosRecord() const;
-
- virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
-
- static Rw11VirtTape* New(const std::string& url, Rw11Unit* punit,
- RerrMsg& emsg);
-
- // statistics counter indices
- enum stats {
- kStatNVTReadRec = Rw11Virt::kDimStat,
- kStatNVTReadByt,
- kStatNVTReadEof,
- kStatNVTReadEom,
- kStatNVTReadPErr,
- kStatNVTReadLErr,
- kStatNVTWriteRec,
- kStatNVTWriteByt,
- kStatNVTWriteEof,
- kStatNVTSpaForw,
- kStatNVTSpaBack,
- kStatNVTRewind,
- kDimStat
- };
-
- // operation code
- enum OpCode {
- kOpCodeOK = 0, //
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11VirtTape.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11VirtTape.
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline void Rw11VirtTape::SetWProt(bool wprot)
-{
- fWProt = wprot;
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline void Rw11VirtTape::SetCapacity(size_t nbyte)
-{
- fCapacity = nbyte;
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11VirtTape::WProt() const
-{
- return fWProt;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline size_t Rw11VirtTape::Capacity() const
-{
- return fCapacity;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11VirtTape::Bot() const
-{
- return fBot;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11VirtTape::Eot() const
-{
- return fEot;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11VirtTape::Eom() const
-{
- return fEom;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline int Rw11VirtTape::PosFile() const
-{
- return fPosFile;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline int Rw11VirtTape::PosRecord() const
-{
- return fPosRecord;
-}
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11VirtTapeTap.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11VirtTapeTap.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11VirtTapeTap.cpp (nonexistent)
@@ -1,589 +0,0 @@
-// $Id: Rw11VirtTapeTap.cpp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11VirtTapeTap.cpp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation of Rw11VirtTapeTap.
-*/
-
-#include
-#include
-#include
-#include
-
-#include "librtools/RosFill.hpp"
-#include "librtools/Rtools.hpp"
-
-#include "Rw11VirtTapeTap.hpp"
-
-using namespace std;
-
-/*!
- \class Retro::Rw11VirtTapeTap
- \brief FIXME_docs
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-// constants definitions
-
-const uint32_t Rw11VirtTapeTap::kMetaEof;
-const uint32_t Rw11VirtTapeTap::kMetaEom;
-const uint32_t Rw11VirtTapeTap::kMeta_M_Perr;
-const uint32_t Rw11VirtTapeTap::kMeta_M_Mbz;
-const uint32_t Rw11VirtTapeTap::kMeta_B_Rlen;
-
-//------------------------------------------+-----------------------------------
-//! Default constructor
-
-Rw11VirtTapeTap::Rw11VirtTapeTap(Rw11Unit* punit)
- : Rw11VirtTape(punit),
- fFd(0),
- fSize(0),
- fPos(0),
- fBad(true),
- fPadOdd(false),
- fTruncPend(false)
-{}
-
-//------------------------------------------+-----------------------------------
-//! Destructor
-
-Rw11VirtTapeTap::~Rw11VirtTapeTap()
-{
- if (fFd > 2) ::close(fFd);
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::Open(const std::string& url, RerrMsg& emsg)
-{
- if (!fUrl.Set(url, "|wpro|e11|cap=|", emsg)) return false;
-
- fWProt = fUrl.FindOpt("wpro");
- fPadOdd = fUrl.FindOpt("e11");
-
- string str_cap;
- unsigned long capacity=0;
- if (fUrl.FindOpt("cap",str_cap)) {
- if (str_cap.length() > 0) {
- unsigned long scale = 1;
- string str_conv = str_cap;
- char clast = str_cap[str_cap.length()-1];
- bool ok = true;
-
- if (! (clast >= '0' && clast <= '9') ) {
- str_conv = str_cap.substr(0,str_cap.length()-1);
- switch(str_cap[str_cap.length()-1]) {
- case 'k':
- case 'K':
- scale = 1024;
- break;
- case 'm':
- case 'M':
- scale = 1024*1024;
- break;
- default:
- ok = false;
- break;
- }
- }
- if (ok) {
- RerrMsg emsg_conv;
- ok = Rtools::String2Long(str_conv, capacity, emsg_conv);
- }
- if (!ok) {
- emsg.Init("Rw11VirtTapeTap::Open()",
- string("bad capacity option '")+str_cap+"'");
- return false;
- }
- capacity *= scale;
- }
- }
-
- int fd = ::open(fUrl.Path().c_str(), fWProt ? O_RDONLY : O_CREAT|O_RDWR,
- S_IRUSR|S_IWUSR|S_IRGRP);
- if (fd < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Open()",
- string("open() for '") + fUrl.Path() + "' failed: ", errno);
- return false;
- }
-
- struct stat sbuf;
- if (::fstat(fd, &sbuf) < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Open()",
- string("stat() for '") + fUrl.Path() + "' failed: ", errno);
- return false;
- }
-
- if ((sbuf.st_mode & S_IWUSR) == 0) fWProt = true;
-
- fFd = fd;
- fSize = sbuf.st_size;
- fPos = 0;
- fBad = false;
- fTruncPend = true;
-
- fCapacity = capacity;
- fBot = true;
- fEot = false;
- fEom = false;
- fPosFile = 0;
- fPosRecord = 0;
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::ReadRecord(size_t nbyt, uint8_t* data, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTReadRec);
-
- opcode = kOpCodeBadFormat;
- ndone = 0;
- if (fBad) return BadTapeMsg("ReadRecord()", emsg);
-
- if (fPos == fSize) {
- fEom = true;
- opcode = kOpCodeEom;
- return true;
- }
-
- uint32_t metabeg;
- uint32_t metaend;
-
- if (!CheckSizeForw(sizeof(metabeg), "missed metabeg", emsg)) return SetBad();
- if (!Read(sizeof(metabeg), reinterpret_cast(&metabeg),
- emsg)) return SetBad();
-
- if (metabeg == kMetaEof) {
- fStats.Inc(kStatNVTReadEof);
- opcode = kOpCodeEof;
- fPosFile += 1;
- fPosRecord = 0;
- return true;
- }
-
- if (metabeg == kMetaEom) {
- if (!Seek(sizeof(metabeg), -1, emsg)) return SetBad();
- fStats.Inc(kStatNVTReadEom);
- fEom = true;
- opcode = kOpCodeEom;
- return true;
- }
-
- size_t rlen;
- bool perr;
- if (!ParseMeta(metabeg, rlen, perr, emsg)) return SetBad();
- size_t rlenpad = BytePadding(rlen);
-
- if (!CheckSizeForw(rlenpad, "missed data", emsg)) return SetBad();
-
- ndone = (rlen <= nbyt) ? rlen : nbyt;
- if (!Read(ndone, data, emsg)) return SetBad();
- if (ndone < rlenpad) {
- if (!Seek(rlenpad, +1, emsg)) return SetBad();
- }
-
- if (!CheckSizeForw(sizeof(metaend), "missed metaend", emsg)) return SetBad();
- if (!Read(sizeof(metaend), reinterpret_cast(&metaend),
- emsg)) return SetBad();
-
- if (metabeg != metaend) {
- emsg.Init("Rw11VirtTapeTap::ReadRecord", "metabeg metaend mismatch");
- ndone = 0;
- return SetBad();
- }
-
- IncPosRecord(+1);
- opcode = kOpCodeOK;
- if (perr) {
- fStats.Inc(kStatNVTReadPErr);
- opcode = kOpCodeBadParity;
- }
- if (ndone < rlen) {
- fStats.Inc(kStatNVTReadLErr);
- opcode = kOpCodeRecLenErr;
- }
-
- fStats.Inc(kStatNVTReadByt, ndone);
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::WriteRecord(size_t nbyt, const uint8_t* data,
- int& opcode, RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTWriteRec);
- fStats.Inc(kStatNVTWriteByt, nbyt);
-
- opcode = kOpCodeBadFormat;
- if (fBad) return BadTapeMsg("WriteRecord()", emsg);
-
- fEom = false;
-
- uint32_t meta = nbyt;
- uint8_t zero = 0x00;
-
- if (!Write(sizeof(meta), reinterpret_cast(&meta),
- false, emsg)) return SetBad();
-
- if (!Write(nbyt, data,
- false, emsg)) return SetBad();
- if (fPadOdd && (nbyt&0x01)) {
- if (!Write(sizeof(zero), &zero, false, emsg)) return SetBad();
- }
-
- if (!Write(sizeof(meta), reinterpret_cast(&meta),
- false, emsg)) return SetBad();
- if (!Write(sizeof(kMetaEom), reinterpret_cast(&kMetaEom),
- true, emsg)) return SetBad();
-
- IncPosRecord(+1);
- opcode = kOpCodeOK;
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::WriteEof(RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTWriteEof);
-
- if (fBad) return BadTapeMsg("WriteEof()", emsg);
-
- fEom = false;
-
- if (!Write(sizeof(kMetaEof), reinterpret_cast(&kMetaEof),
- false, emsg)) return SetBad();
- if (!Write(sizeof(kMetaEom), reinterpret_cast(&kMetaEom),
- true, emsg)) return SetBad();
-
- fPosFile += 1;
- fPosRecord = 0;
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::SpaceForw(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTSpaForw);
-
- opcode = kOpCodeBadFormat;
- ndone = 0;
- if (fBad) return BadTapeMsg("SpaceForw()", emsg);
-
- while (nrec > 0) {
-
- if (fPos == fSize) {
- fEom = true;
- opcode = kOpCodeEom;
- return true;
- }
-
- uint32_t metabeg;
-
- if (!CheckSizeForw(sizeof(metabeg), "missed metabeg", emsg)) return SetBad();
- if (!Read(sizeof(metabeg), reinterpret_cast(&metabeg),
- emsg)) return SetBad();
-
- if (metabeg == kMetaEof) {
- opcode = kOpCodeEof;
- fPosFile += 1;
- fPosRecord = 0;
- return true;
- }
-
- if (metabeg == kMetaEom) {
- if (!Seek(sizeof(metabeg), -1, emsg)) return SetBad();
- fEom = true;
- opcode = kOpCodeEom;
- return true;
- }
-
- size_t rlen;
- bool perr;
- if (!ParseMeta(metabeg, rlen, perr, emsg)) return SetBad();
- size_t rlenpad = BytePadding(rlen);
-
- if (!CheckSizeForw(sizeof(metabeg)+rlenpad, "missed data or metaend", emsg))
- return SetBad();
- if (!Seek(sizeof(metabeg)+rlenpad, +1, emsg)) return SetBad();
-
- IncPosRecord(+1);
- nrec -= 1;
- ndone += 1;
- }
-
- opcode = kOpCodeOK;
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::SpaceBack(size_t nrec, size_t& ndone,
- int& opcode, RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTSpaBack);
-
- opcode = kOpCodeBadFormat;
- ndone = 0;
- if (fBad) return BadTapeMsg("SpaceBack()", emsg);
-
- fEom = false;
- fTruncPend = true;
-
- while (nrec > 0) {
-
- if (fPos == 0) {
- opcode = kOpCodeBot;
- fPosFile = 0;
- fPosRecord = 0;
- return true;
- }
-
- uint32_t metaend;
-
- if (!CheckSizeBack(sizeof(metaend), "missed metaend", emsg)) return SetBad();
- if (!Seek(sizeof(metaend), -1, emsg)) return SetBad();
- if (!Read(sizeof(metaend), reinterpret_cast(&metaend),
- emsg)) return SetBad();
-
- if (metaend == kMetaEof) {
- if (!Seek(sizeof(metaend), -1, emsg)) return SetBad();
- opcode = kOpCodeEof;
- fPosFile -= 1;
- fPosRecord = -1;
- return true;
- }
-
- if (metaend == kMetaEom) {
- emsg.Init("Rw11VirtTapeTap::SpaceBack()","unexpected EOM marker");
- return SetBad();
- }
-
- size_t rlen;
- bool perr;
- if (!ParseMeta(metaend, rlen, perr, emsg)) return SetBad();
- size_t rlenpad = BytePadding(rlen);
-
- if (!CheckSizeBack(2*sizeof(metaend)+rlenpad,
- "missed data or metabeg", emsg)) return SetBad();
- if (!Seek(2*sizeof(metaend)+rlenpad, -1, emsg)) return SetBad();
-
- IncPosRecord(-1);
- nrec -= 1;
- ndone += 1;
- }
-
- opcode = kOpCodeOK;
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::Rewind(int& opcode, RerrMsg& emsg)
-{
- fStats.Inc(kStatNVTRewind);
-
- opcode = kOpCodeBadFormat;
- if (Seek(0, 0, emsg) <0) return SetBad();
-
- fBot = true;
- fEot = false;
- fEom = false;
- fPosFile = 0;
- fPosRecord = 0;
- fBad = false;
- fTruncPend = true;
-
- opcode = kOpCodeOK;
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11VirtTapeTap::Dump(std::ostream& os, int ind, const char* text) const
-{
- RosFill bl(ind);
- os << bl << (text?text:"--") << "Rw11VirtTapeTap @ " << this << endl;
-
- os << bl << " fFd: " << fFd << endl;
- os << bl << " fSize: " << fSize << endl;
- os << bl << " fPos: " << fPos << endl;
- os << bl << " fBad: " << fBad << endl;
- os << bl << " fPadOdd: " << fPadOdd << endl;
- Rw11VirtTape::Dump(os, ind, " ^");
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::Seek(size_t seekpos, int dir, RerrMsg& emsg)
-{
- off_t offset = seekpos;
- int whence = SEEK_SET;
- if (dir > 0) {
- whence = SEEK_CUR;
- } else if (dir < 0) {
- whence = SEEK_CUR;
- offset = -offset;
- }
- if (::lseek(fFd, offset, whence) < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Seek()", "seek() failed: ", errno);
- return false;
- }
-
- UpdatePos(seekpos, dir);
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::Read(size_t nbyt, uint8_t* data, RerrMsg& emsg)
-{
- ssize_t irc = ::read(fFd, data, nbyt);
- if (irc < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Read()", "read() failed: ", errno);
- return false;
- }
- UpdatePos(nbyt, +1);
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::Write(size_t nbyt, const uint8_t* data, bool back,
- RerrMsg& emsg)
-{
- if (fTruncPend) {
- if (ftruncate(fFd, fPos) < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Write()", "ftruncate() failed: ", errno);
- return false;
- }
- fTruncPend = false;
- fSize = fPos;
- }
-
- ssize_t irc = ::write(fFd, data, nbyt);
- if (irc < 0) {
- emsg.InitErrno("Rw11VirtTapeTap::Write()", "write() failed: ", errno);
- return false;
- }
-
- UpdatePos(nbyt, +1);
- if (fPos > fSize) fSize = fPos;
-
- if (back) {
- if (!Seek(nbyt, -1, emsg)) return false;
- }
-
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::CheckSizeForw(size_t nbyt, const char* text,
- RerrMsg& emsg)
-{
- if (fPos+nbyt <= fSize) return true;
- emsg.Init("Rw11VirtTapeTap::CheckSizeForw()", text);
- return false;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::CheckSizeBack(size_t nbyt, const char* text,
- RerrMsg& emsg)
-{
- if (nbyt <= fPos) return true;
- emsg.Init("Rw11VirtTapeTap::CheckSizeBack()", text);
- return false;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-void Rw11VirtTapeTap::UpdatePos(size_t nbyt, int dir)
-{
- if (dir == 0) {
- fPos = nbyt;
- } else if (dir > 0) {
- fPos += nbyt;
- } else {
- fPos -= nbyt;
- }
-
- fBot = (fPos == 0);
- fEot = (fCapacity == 0) ? false : (fPos > fCapacity);
-
- return;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::ParseMeta(uint32_t meta, size_t& rlen, bool& perr,
- RerrMsg& emsg)
-{
- rlen = meta & kMeta_B_Rlen;
- perr = meta & kMeta_M_Perr;
- if (meta & kMeta_M_Mbz) {
- emsg.Init("Rw11VirtTapeTap::ParseMeta", "bad meta tag");
- return false;
- }
- return true;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-bool Rw11VirtTapeTap::BadTapeMsg(const char* meth, RerrMsg& emsg)
-{
- emsg.Init(string("Rw11VirtTapeTap::")+meth, "bad tape format");
- return false;
-}
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11VirtTapeTap.ipp
===================================================================
--- trunk/tools/src/librw11/Rw11VirtTapeTap.ipp (revision 31)
+++ trunk/tools/src/librw11/Rw11VirtTapeTap.ipp (nonexistent)
@@ -1,56 +0,0 @@
-// $Id: Rw11VirtTapeTap.ipp 686 2015-06-04 21:08:08Z mueller $
-//
-// Copyright 2015- by Walter F.J. Mueller
-//
-// This program is free software; you may redistribute and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, either version 2, 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 complete details.
-//
-// Revision History:
-// Date Rev Version Comment
-// 2015-06-04 686 1.0 Initial version
-// 2015-05-17 683 0.1 First draft
-// ---------------------------------------------------------------------------
-
-/*!
- \file
- \version $Id: Rw11VirtTapeTap.ipp 686 2015-06-04 21:08:08Z mueller $
- \brief Implemenation (inline) of Rw11VirtTapeTap.
-*/
-
-// all method definitions in namespace Retro
-namespace Retro {
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline size_t Rw11VirtTapeTap::BytePadding(size_t rlen)
-{
- return fPadOdd ? ((rlen+1) & 0xfffe) : rlen;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline bool Rw11VirtTapeTap::SetBad()
-{
- fBad = true;
- return false;
-}
-
-//------------------------------------------+-----------------------------------
-//! FIXME_docs
-
-inline void Rw11VirtTapeTap::IncPosRecord(int delta)
-{
- if (fPosRecord != -1) fPosRecord += delta;
- return;
-}
-
-
-} // end namespace Retro
Index: trunk/tools/src/librw11/Rw11CntlRK11.cpp
===================================================================
--- trunk/tools/src/librw11/Rw11CntlRK11.cpp (revision 31)
+++ trunk/tools/src/librw11/Rw11CntlRK11.cpp (revision 30)
@@ -1,4 +1,4 @@
-// $Id: Rw11CntlRK11.cpp 686 2015-06-04 21:08:08Z mueller $
+// $Id: Rw11CntlRK11.cpp 669 2015-04-26 21:20:32Z mueller $
//
// Copyright 2013-2015 by Walter F.J. Mueller
// Other credits:
@@ -15,7 +15,6 @@
//
// Revision History:
// Date Rev Version Comment
-// 2015-06-04 686 2.0.2 check for spurious lams
// 2015-02-17 647 2.0.1 use Nwrd2Nblk(); BUGFIX: revise RdmaPostExecCB()
// 2015-01-04 628 2.0 use Rw11RdmaDisk
// 2014-12-30 625 1.2 adopt to Rlink V4 attn logic
@@ -27,7 +26,7 @@
/*!
\file
- \version $Id: Rw11CntlRK11.cpp 686 2015-06-04 21:08:08Z mueller $
+ \version $Id: Rw11CntlRK11.cpp 669 2015-04-26 21:20:32Z mueller $
\brief Implemenation of Rw11CntlRK11.
*/
@@ -99,7 +98,6 @@
const uint16_t Rw11CntlRK11::kRKCS_M_FMT;
const uint16_t Rw11CntlRK11::kRKCS_M_RWA;
const uint16_t Rw11CntlRK11::kRKCS_M_SSE;
-const uint16_t Rw11CntlRK11::kRKCS_M_RDY;
const uint16_t Rw11CntlRK11::kRKCS_M_MEX;
const uint16_t Rw11CntlRK11::kRKCS_V_MEX;
const uint16_t Rw11CntlRK11::kRKCS_B_MEX;
@@ -374,16 +372,6 @@
<< "," << RosPrintf(nwrd,"d",5);
}
- // check for spurious interrupts (either RDY=1 or RDY=0 and rdma busy)
- if ((rkcs & kRKCS_M_RDY) || fRdma.IsActive()) {
- RlogMsg lmsg(LogFile());
- lmsg << "-E RK11 err "
- << " cr=" << RosPrintBvi(rkcs,8)
- << " spurious lam: "
- << (fRdma.IsActive() ? "RDY=0 and Rdma busy" : "RDY=1");
- return 0;
- }
-
// check for general abort conditions
if (fu != kFUNC_CRESET && // function not control reset
(!unit.Virt())) { // and drive not attached
/trunk/tools/src/librw11/Makefile
1,4 → 1,4
# $Id: Makefile 685 2015-05-25 12:18:36Z mueller $ |
# $Id: Makefile 664 2015-04-06 12:02:17Z mueller $ |
# |
# Revision History: |
# Date Rev Version Comment |
26,7 → 26,6
OBJ_all += Rw11Cntl.o Rw11Unit.o |
OBJ_all += Rw11UnitTerm.o |
OBJ_all += Rw11UnitDisk.o |
OBJ_all += Rw11UnitTape.o |
OBJ_all += Rw11UnitStream.o |
OBJ_all += Rw11CntlDL11.o Rw11UnitDL11.o |
OBJ_all += Rw11CntlLP11.o Rw11UnitLP11.o |
34,11 → 33,9
OBJ_all += Rw11CntlRL11.o Rw11UnitRL11.o |
OBJ_all += Rw11CntlRK11.o Rw11UnitRK11.o |
OBJ_all += Rw11CntlRHRP.o Rw11UnitRHRP.o |
OBJ_all += Rw11CntlTM11.o Rw11UnitTM11.o |
OBJ_all += Rw11Virt.o |
OBJ_all += Rw11VirtTerm.o Rw11VirtTermPty.o Rw11VirtTermTcp.o |
OBJ_all += Rw11VirtDisk.o Rw11VirtDiskFile.o |
OBJ_all += Rw11VirtTape.o Rw11VirtTapeTap.o |
OBJ_all += Rw11VirtStream.o |
OBJ_all += Rw11Rdma.o Rw11RdmaDisk.o |
# |
/trunk/tools/src/librw11/Rw11CntlRHRP.cpp
1,4 → 1,4
// $Id: Rw11CntlRHRP.cpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: Rw11CntlRHRP.cpp 680 2015-05-14 13:29:46Z mueller $ |
// |
// Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// Other credits: |
15,8 → 15,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-06-04 686 1.0.2 check for spurious lams |
// 2015-05-24 684 1.0.1 fixed rpcs2 update for wcheck and nem aborts |
// 2015-05-14 680 1.0 Initial version |
// 2015-03-21 659 0.1 First draft |
// --------------------------------------------------------------------------- |
23,7 → 21,7
|
/*! |
\file |
\version $Id: Rw11CntlRHRP.cpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: Rw11CntlRHRP.cpp 680 2015-05-14 13:29:46Z mueller $ |
\brief Implemenation of Rw11CntlRHRP. |
*/ |
|
459,16 → 457,6
if (rpcs3 & kRPCS3_M_RPACKDONE) fStats.Inc(kStatNFuncPack); |
if (rpcs3 & kRPCS3_M_RSEEKDONE) fStats.Inc(kStatNFuncSeek); |
|
// check for spurious interrupts (either RDY=1 or RDY=0 and rdma busy) |
if ((rpcs1 & kRPCS1_M_RDY) || fRdma.IsActive()) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-E RHRP err " |
<< " cs=" << RosPrintBvi(rpcs1,8) |
<< " spurious lam: " |
<< (fRdma.IsActive() ? "RDY=0 and Rdma busy" : "RDY=1"); |
return 0; |
} |
|
// check for overrun (read/write beyond last track |
// if found, truncate request length |
bool ovr = lba + nblk > unit.NBlock(); |
568,14 → 556,14
if (fRd_fu == kFUNC_WCD) { |
size_t nwcok = fRdma.WriteCheck(ndone); |
if (nwcok != ndone) { // if mismatch found |
rpcs2 |= kRPCS2_M_WCE; |
if (ndone & 0x1) rpcs2 |= kRPCS2_M_RWCO; // failed in odd word ! |
rpcs2 = kRPCS2_M_WCE; |
if (ndone & 0x1) rpcs2 = kRPCS2_M_RWCO; // failed in odd word ! |
ndone = nwcok; // truncate word count |
} |
} |
|
// handle Rdma aborts |
if (stat == Rw11Rdma::kStatusFailRdma) rpcs2 |= kRPCS2_M_NEM; |
if (stat == Rw11Rdma::kStatusFailRdma) rpcs2 = kRPCS2_M_NEM; |
|
// check for fused csr updates |
if (clist.Size() > ncmd) { |
/trunk/tools/src/librw11/Rw11Cpu.cpp
1,4 → 1,4
// $Id: Rw11Cpu.cpp 682 2015-05-15 18:35:29Z mueller $ |
// $Id: Rw11Cpu.cpp 675 2015-05-08 21:05:08Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
13,8 → 13,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-05-15 682 1.2.4 BUGFIX: Boot(): extract unit number properly |
// Boot(): stop cpu before load, check unit number |
// 2015-05-08 675 1.2.3 w11a start/stop/suspend overhaul |
// 2015-04-25 668 1.2.2 add AddRbibr(), AddWbibr() |
// 2015-04-03 661 1.2.1 add kStat_M_* defs |
29,7 → 27,7
|
/*! |
\file |
\version $Id: Rw11Cpu.cpp 682 2015-05-15 18:35:29Z mueller $ |
\version $Id: Rw11Cpu.cpp 675 2015-05-08 21:05:08Z mueller $ |
\brief Implemenation of Rw11Cpu. |
*/ |
#include <stdlib.h> |
680,7 → 678,7
for (size_t i=0; i<uname.length(); i++) { |
char c = uname[i]; |
if (c >= '0' && c <= '9') { |
string unum = uname.substr(i); |
string unum = cname.substr(i); |
uind = ::atoi(unum.c_str()); |
break; |
} else { |
693,11 → 691,9
return false; |
} |
|
// FIXME_code: unit number not checked. Cntl doesn't even know about ... |
|
Rw11Cntl& cntl = Cntl(cname); |
if (uind >= cntl.NUnit()) { |
emsg.Init("Rw11Cpu::Boot", string("unit number '") + uname + "' invalid"); |
return false; |
} |
|
vector<uint16_t> code; |
uint16_t aload = 0; |
709,17 → 705,11
return false; |
} |
|
// stop and reset cpu, just in case |
if (!MemWrite(aload, code, emsg)) return false; |
|
RlinkCommandList clist; |
clist.AddWreg(fBase+kCPCNTL, kCPFUNC_STOP); // stop cpu |
clist.AddWreg(fBase+kCPCNTL, kCPFUNC_STOP); // stop, just in case |
clist.AddWreg(fBase+kCPCNTL, kCPFUNC_CRESET); // init cpu and bus |
if (!Server().Exec(clist, emsg)) return false; |
|
// load boot code |
if (!MemWrite(aload, code, emsg)) return false; |
|
// and start cpu at boot loader start address |
clist.Clear(); |
clist.AddWreg(fBase+kCPPC, astart); // load PC |
clist.AddWreg(fBase+kCPCNTL, kCPFUNC_START); // and start |
SetCpuGoUp(); |
/trunk/tools/src/librw11/Rw11CntlRL11.cpp
1,4 → 1,4
// $Id: Rw11CntlRL11.cpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: Rw11CntlRL11.cpp 669 2015-04-26 21:20:32Z mueller $ |
// |
// Copyright 2014-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// Other credits: |
16,7 → 16,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-06-04 686 1.0.2 check for spurious lams |
// 2015-03-04 655 1.0.1 use original boot code again |
// 2015-03-01 653 1.0 Initial version |
// 2014-06-08 561 0.1 First draft |
24,7 → 23,7
|
/*! |
\file |
\version $Id: Rw11CntlRL11.cpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: Rw11CntlRL11.cpp 669 2015-04-26 21:20:32Z mueller $ |
\brief Implemenation of Rw11CntlRL11. |
*/ |
|
441,16 → 440,6
if (ovr) lmsg << "!"; |
} |
|
// check for spurious interrupts (either RDY=1 or RDY=0 and rdma busy) |
if ((rlcs & kRLCS_M_CRDY) || fRdma.IsActive()) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-E RL11 err " |
<< " cr=" << RosPrintBvi(rlcs,8) |
<< " spurious lam: " |
<< (fRdma.IsActive() ? "RDY=0 and Rdma busy" : "RDY=1"); |
return 0; |
} |
|
// remember request parameters for call back and error exit handling |
fRd_rlcs = rlcs; |
fRd_rlda = rlda; |
/trunk/tools/src/librw11/Rw11CntlRK11.hpp
1,4 → 1,4
// $Id: Rw11CntlRK11.hpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: Rw11CntlRK11.hpp 665 2015-04-07 07:13:49Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
23,7 → 23,7
|
/*! |
\file |
\version $Id: Rw11CntlRK11.hpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: Rw11CntlRK11.hpp 665 2015-04-07 07:13:49Z mueller $ |
\brief Declaration of class Rw11CntlRK11. |
*/ |
|
102,7 → 102,6
static const uint16_t kRKCS_M_FMT = kWBit10; |
static const uint16_t kRKCS_M_RWA = kWBit09; |
static const uint16_t kRKCS_M_SSE = kWBit08; |
static const uint16_t kRKCS_M_RDY = kWBit07; |
static const uint16_t kRKCS_M_MEX = 000060; |
static const uint16_t kRKCS_V_MEX = 4; |
static const uint16_t kRKCS_B_MEX = 0003; |
/trunk/tools/src/librw11/Rw11Cntl.cpp
1,4 → 1,4
// $Id: Rw11Cntl.cpp 682 2015-05-15 18:35:29Z mueller $ |
// $Id: Rw11Cntl.cpp 631 2015-01-09 21:36:51Z mueller $ |
// |
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
20,7 → 20,7
|
/*! |
\file |
\version $Id: Rw11Cntl.cpp 682 2015-05-15 18:35:29Z mueller $ |
\version $Id: Rw11Cntl.cpp 631 2015-01-09 21:36:51Z mueller $ |
\brief Implemenation of Rw11Cntl. |
*/ |
|
97,14 → 97,6
//------------------------------------------+----------------------------------- |
//! FIXME_docs |
|
size_t Rw11Cntl::NUnit() const |
{ |
return 0; // real values from devived classes |
} |
|
//------------------------------------------+----------------------------------- |
//! FIXME_docs |
|
bool Rw11Cntl::BootCode(size_t unit, std::vector<uint16_t>& code, |
uint16_t& aload, uint16_t& astart) |
{ |
/trunk/tools/src/librw11/Rw11Cntl.hpp
1,6 → 1,6
// $Id: Rw11Cntl.hpp 682 2015-05-15 18:35:29Z mueller $ |
// $Id: Rw11Cntl.hpp 625 2014-12-30 16:17:45Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
// This program is free software; you may redistribute and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
13,7 → 13,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-05-15 680 1.1.1 add NUnit() as virtual |
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic |
// 2013-03-06 495 1.0 Initial version |
// 2013-02-05 483 0.1 First draft |
22,7 → 21,7
|
/*! |
\file |
\version $Id: Rw11Cntl.hpp 682 2015-05-15 18:35:29Z mueller $ |
\version $Id: Rw11Cntl.hpp 625 2014-12-30 16:17:45Z mueller $ |
\brief Declaration of class Rw11Cntl. |
*/ |
|
70,7 → 69,6
virtual void Start(); |
bool IsStarted() const; |
|
virtual size_t NUnit() const; |
virtual bool BootCode(size_t unit, std::vector<uint16_t>& code, |
uint16_t& aload, uint16_t& astart); |
|
/trunk/tools/src/librw11/Rw11VirtDiskFile.cpp
1,4 → 1,4
// $Id: Rw11VirtDiskFile.cpp 684 2015-05-24 14:10:59Z mueller $ |
// $Id: Rw11VirtDiskFile.cpp 516 2013-05-05 21:24:52Z mueller $ |
// |
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
19,7 → 19,7
|
/*! |
\file |
\version $Id: Rw11VirtDiskFile.cpp 684 2015-05-24 14:10:59Z mueller $ |
\version $Id: Rw11VirtDiskFile.cpp 516 2013-05-05 21:24:52Z mueller $ |
\brief Implemenation of Rw11VirtDiskFile. |
*/ |
|
148,28 → 148,27
//------------------------------------------+----------------------------------- |
//! FIXME_docs |
|
void Rw11VirtDiskFile::Dump(std::ostream& os, int ind, const char* text) const |
bool Rw11VirtDiskFile::Seek(size_t seekpos, RerrMsg& emsg) |
{ |
RosFill bl(ind); |
os << bl << (text?text:"--") << "Rw11VirtDiskFile @ " << this << endl; |
if (::lseek(fFd, seekpos, SEEK_SET) < 0) { |
emsg.InitErrno("Rw11VirtDiskFile::Seek()", "seek() failed: ", errno); |
return false; |
} |
|
os << bl << " fFd: " << fFd << endl; |
os << bl << " fSize: " << fSize << endl; |
Rw11VirtDisk::Dump(os, ind, " ^"); |
return; |
return true; |
} |
|
//------------------------------------------+----------------------------------- |
//! FIXME_docs |
|
bool Rw11VirtDiskFile::Seek(size_t seekpos, RerrMsg& emsg) |
void Rw11VirtDiskFile::Dump(std::ostream& os, int ind, const char* text) const |
{ |
if (::lseek(fFd, seekpos, SEEK_SET) < 0) { |
emsg.InitErrno("Rw11VirtDiskFile::Seek()", "seek() failed: ", errno); |
return false; |
} |
RosFill bl(ind); |
os << bl << (text?text:"--") << "Rw11VirtDiskFile @ " << this << endl; |
|
return true; |
os << bl << " fFd: " << fFd << endl; |
Rw11VirtDisk::Dump(os, ind, " ^"); |
return; |
} |
|
} // end namespace Retro |
/trunk/tools/src/librw11/Rw11CntlBase.hpp
1,4 → 1,4
// $Id: Rw11CntlBase.hpp 682 2015-05-15 18:35:29Z mueller $ |
// $Id: Rw11CntlBase.hpp 495 2013-03-06 17:13:48Z mueller $ |
// |
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
20,7 → 20,7
|
/*! |
\file |
\version $Id: Rw11CntlBase.hpp 682 2015-05-15 18:35:29Z mueller $ |
\version $Id: Rw11CntlBase.hpp 495 2013-03-06 17:13:48Z mueller $ |
\brief Declaration of class Rw11CntlBase. |
*/ |
|
40,7 → 40,7
explicit Rw11CntlBase(const std::string& type); |
~Rw11CntlBase(); |
|
virtual size_t NUnit() const; |
size_t NUnit() const; |
TU& Unit(size_t index) const; |
const boost::shared_ptr<TU>& UnitSPtr(size_t index) const; |
|
/trunk/tools/src/librwxxtpp/RtclRw11UnitTM11.cpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11UnitTM11.hpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11UnitTape.cpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11UnitTape.hpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11CntlTM11.hpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11CntlTM11.cpp
File deleted
/trunk/tools/src/librwxxtpp/RtclRw11Cpu.cpp
1,4 → 1,4
// $Id: RtclRw11Cpu.cpp 682 2015-05-15 18:35:29Z mueller $ |
// $Id: RtclRw11Cpu.cpp 675 2015-05-08 21:05:08Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
33,7 → 33,7
|
/*! |
\file |
\version $Id: RtclRw11Cpu.cpp 682 2015-05-15 18:35:29Z mueller $ |
\version $Id: RtclRw11Cpu.cpp 675 2015-05-08 21:05:08Z mueller $ |
\brief Implemenation of RtclRw11Cpu. |
*/ |
|
1125,7 → 1125,7
if (!Rtcl::SetVar(interp, varlst, Rtcl::NewLinesObj(los))) return kERR; |
} |
|
// now, finally, iterate over cmap and write code to memory |
// now, finally, iterate of cmap and write code to memory |
|
vector<uint16_t> block; |
uint16_t base = 0; |
/trunk/tools/src/librwxxtpp/Makefile
1,4 → 1,4
# $Id: Makefile 683 2015-05-17 21:54:35Z mueller $ |
# $Id: Makefile 664 2015-04-06 12:02:17Z mueller $ |
# |
# Revision History: |
# Date Rev Version Comment |
31,7 → 31,6
OBJ_all += RtclRw11Unit.o |
OBJ_all += RtclRw11UnitTerm.o |
OBJ_all += RtclRw11UnitDisk.o |
OBJ_all += RtclRw11UnitTape.o |
OBJ_all += RtclRw11UnitStream.o |
OBJ_all += RtclRw11CntlDL11.o RtclRw11UnitDL11.o |
OBJ_all += RtclRw11CntlLP11.o RtclRw11UnitLP11.o |
39,8 → 38,7
OBJ_all += RtclRw11CntlRK11.o RtclRw11UnitRK11.o |
OBJ_all += RtclRw11CntlRL11.o RtclRw11UnitRL11.o |
OBJ_all += RtclRw11CntlRHRP.o RtclRw11UnitRHRP.o |
OBJ_all += RtclRw11CntlTM11.o RtclRw11UnitTM11.o |
# |
# |
DEP_all = $(OBJ_all:.o=.dep) |
# |
#- generic part ---------------------------------------------------------------- |
/trunk/tools/src/librwxxtpp/RtclRw11CntlFactory.cpp
1,4 → 1,4
// $Id: RtclRw11CntlFactory.cpp 683 2015-05-17 21:54:35Z mueller $ |
// $Id: RtclRw11CntlFactory.cpp 664 2015-04-06 12:02:17Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
24,7 → 24,7
|
/*! |
\file |
\version $Id: RtclRw11CntlFactory.cpp 683 2015-05-17 21:54:35Z mueller $ |
\version $Id: RtclRw11CntlFactory.cpp 664 2015-04-06 12:02:17Z mueller $ |
\brief Implemenation of global function RtclRw11CntlFactory. |
*/ |
|
36,7 → 36,6
#include "RtclRw11CntlRK11.hpp" |
#include "RtclRw11CntlRL11.hpp" |
#include "RtclRw11CntlRHRP.hpp" |
#include "RtclRw11CntlTM11.hpp" |
#include "RtclRw11CntlLP11.hpp" |
#include "RtclRw11CntlPC11.hpp" |
|
74,11 → 73,6
if(pobj->FactoryCmdConfig(args, cpu) != TCL_OK) return TCL_ERROR; |
pobj.release(); |
|
} else if (type == "tm11") { // tm11 -------------------------- |
unique_ptr<RtclRw11CntlTM11> pobj(new RtclRw11CntlTM11()); |
if(pobj->FactoryCmdConfig(args, cpu) != TCL_OK) return TCL_ERROR; |
pobj.release(); |
|
} else if (type == "lp11") { // lp11 -------------------------- |
unique_ptr<RtclRw11CntlLP11> pobj(new RtclRw11CntlLP11()); |
if(pobj->FactoryCmdConfig(args, cpu) != TCL_OK) return TCL_ERROR; |
/trunk/tools/src/librlink/ReventLoop.cpp
1,4 → 1,4
// $Id: ReventLoop.cpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: ReventLoop.cpp 662 2015-04-05 08:02:54Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
23,7 → 23,7
|
/*! |
\file |
\version $Id: ReventLoop.cpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: ReventLoop.cpp 662 2015-04-05 08:02:54Z mueller $ |
\brief Implemenation of class ReventLoop. |
*/ |
|
242,7 → 242,7
|
if (fspLog && fTraceLevel >= 2) { |
RlogMsg lmsg(*fspLog, 'I'); |
lmsg << "eloop: poll(): rc=" << irc; |
lmsg << "eloop: poll(): "; |
for (size_t i=0; i<fPollFd.size(); i++) { |
if (fPollFd[i].revents == 0) continue; |
lmsg << " (" << fPollFd[i].fd |
/trunk/tools/src/librlink/RlinkServer.cpp
1,4 → 1,4
// $Id: RlinkServer.cpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: RlinkServer.cpp 662 2015-04-05 08:02:54Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
13,7 → 13,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-06-05 686 1.2.1 BUGFIX: CallAttnHandler(): fix race in hnext |
// 2015-04-04 662 1.2 BUGFIX: fix race in Stop(), use UnStop() |
// 2015-01-10 632 2.2 Exec() without emsg now void, will throw |
// 2014-12-30 625 2.1 adopt to Rlink V4 attn logic |
27,7 → 26,7
|
/*! |
\file |
\version $Id: RlinkServer.cpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: RlinkServer.cpp 662 2015-04-05 08:02:54Z mueller $ |
\brief Implemenation of RlinkServer. |
*/ |
|
436,20 → 435,11
void RlinkServer::CallAttnHandler() |
{ |
fStats.Inc(kStatNAttnHdl); |
if (fTraceLevel>0) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-I attnhdl-beg: patt=" << RosPrintBvi(fAttnPatt,8); |
} |
|
// if notifier pending, transfer it to current attn pattern |
if (fAttnNotiPatt) { |
boost::lock_guard<RlinkConnect> lock(*fspConn); |
fStats.Inc(kStatNAttnNoti); |
if (fTraceLevel>0) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-I attnhdl-add: patt=" << RosPrintBvi(fAttnPatt,8) |
<< " noti=" << RosPrintBvi(fAttnNotiPatt,8); |
} |
fAttnPatt |= fAttnNotiPatt; |
fAttnNotiPatt = 0; |
} |
468,32 → 458,15
AttnArgs args(fAttnPatt, fAttnDsc[i].fId.fMask); |
boost::lock_guard<RlinkConnect> lock(*fspConn); |
|
if (fTraceLevel>0) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-I attnhdl-bef: patt=" << RosPrintBvi(fAttnPatt,8) |
<< " hmat=" << RosPrintBvi(hmatch,8); |
} |
|
// FIXME_code: return code not used, yet |
fAttnDsc[i].fHandler(args); |
if (!args.fHarvestDone) |
Rexception("RlinkServer::CallAttnHandler()", |
"Handler didn't set fHarvestDone"); |
"Handler didn't set fHarvestDone"); |
|
uint16_t hnew = args.fAttnHarvest & ~fAttnDsc[i].fId.fMask; |
hnext |= hnew; |
hnext &= ~hmatch; // FIXME_code: this is a patch |
// works for single lam handlers only |
// ok for now, but will not work in general !! |
hdone |= hmatch; |
|
if (fTraceLevel>0) { |
RlogMsg lmsg(LogFile()); |
lmsg << "-I attnhdl-aft: patt=" << RosPrintBvi(fAttnPatt,8) |
<< " done=" << RosPrintBvi(hdone,8) |
<< " next=" << RosPrintBvi(hnext,8); |
} |
|
hnext |= hnew; |
hdone |= hmatch; |
} |
} |
fAttnPatt &= ~hdone; // clear handled bits |
/trunk/tools/src/librtools/RparseUrl.cpp
1,6 → 1,6
// $Id: RparseUrl.cpp 686 2015-06-04 21:08:08Z mueller $ |
// $Id: RparseUrl.cpp 516 2013-05-05 21:24:52Z mueller $ |
// |
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
// |
// This program is free software; you may redistribute and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
13,7 → 13,6
// |
// Revision History: |
// Date Rev Version Comment |
// 2015-06-04 686 1.0.2 Set(): add check that optlist is enclosed by '|' |
// 2013-02-23 492 1.0.1 add static FindScheme(); allow no or empty scheme |
// 2013-02-03 481 1.0 Initial version, extracted from RlinkPort |
// --------------------------------------------------------------------------- |
20,7 → 19,7
|
/*! |
\file |
\version $Id: RparseUrl.cpp 686 2015-06-04 21:08:08Z mueller $ |
\version $Id: RparseUrl.cpp 516 2013-05-05 21:24:52Z mueller $ |
\brief Implemenation of RparseUrl. |
*/ |
|
68,15 → 67,6
fPath.clear(); |
fOptMap.clear(); |
|
// check that optlist is empty or starts and ends with '|' |
if (optlist.length() > 0 && |
(optlist.length()<2 || |
optlist[0]!='|' || optlist[optlist.length()-1]!='|') ) { |
emsg.Init("RparseUrl::Set()", string("optlist \"") + optlist + |
"\" not enclosed in '|'"); |
return false; |
} |
|
size_t pdel = fScheme.length(); |
if (pdel == 0 && url.length()>0 && url[0] != ':') pdel = -1; |
size_t odel = url.find_first_of('?', fScheme.length()); |
106,7 → 96,7
} else { |
if (c == '\\') { |
if (i+1 >= url.length()) { |
emsg.Init("RparseUrl::Set()", |
emsg.Init("RparseUrl::ParseUrl()", |
string("invalid trailing \\ in url '") + url + "'"); |
return false; |
} |
114,7 → 104,7
switch (url[i]) { |
case '\\' : c = '\\'; break; |
case ';' : c = ';'; break; |
default : emsg.Init("RparseUrl::Set()", |
default : emsg.Init("RparseUrl::ParseUrl()", |
string("invalid \\ escape in url '") + |
url + "'"); |
return false; |
/trunk/tools/bin/tap2file
File deleted
trunk/tools/bin/tap2file
Property changes :
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: trunk/tools/bin/file2tap
===================================================================
--- trunk/tools/bin/file2tap (revision 31)
+++ trunk/tools/bin/file2tap (nonexistent)
@@ -1,119 +0,0 @@
-#!/usr/bin/perl -w
-# $Id: file2tap 686 2015-06-04 21:08:08Z mueller $
-#
-# Copyright 2008-2015 by Walter F.J. Mueller
-#
-# This program is free software; you may redistribute and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation, either version 2, 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 complete details.
-#
-# Revision History:
-# Date Rev Version Comment
-# 2015-06-03 686 1.1 fix -a option; support eom at end
-# 2008-12-07 175 1.0.1 remove some upperfluous 'my'
-# 2008-11-29 174 1.0 Initial version (import from tbird backup)
-#
-#
-# Create a simh tape container file (.tap) from a set of files
-#
-# Usage: file2tap -c name -b n file1 ... filen
-#
-# if -c name is omitted, stdout is used
-#
-
-use strict;
-use Fcntl qw(:seek O_RDWR);
-
-my $arg;
-my $cdone;
-my $blocksize = 512;
-my $nfile = 0;
-
-while ($arg = shift) {
-
- if ($arg eq "-c") {
- if (@ARGV) {
- $arg = shift;
- open(OFILE, ">$arg") || die ("Can't open output file $arg: $!");
- $cdone = 1;
- }
-
- } elsif ($arg eq "-a") {
- if (@ARGV) {
- $arg = shift;
- sysopen OFILE, $arg, O_RDWR || die ("Can't open output file $arg: $!");
- my $buf;
- my $len;
-
- # check for EOM mark at end, if found, truncate it away
- sysseek OFILE, -4, SEEK_END;
- $len = sysread OFILE, $buf, 4;
- if ($buf eq "\xff\xff\xff\xff") {
- truncate OFILE, sysseek(OFILE, -4, SEEK_END);
- }
-
- # check for two EOF marks at end, if found, truncate 2nd away
- sysseek OFILE, -8, SEEK_END;
- $len = sysread OFILE, $buf, 8;
- if ($buf ne "\x00\x00\x00\x00\x00\x00\x00\x00") {
- die ("Didn't find double EOF at end of tap file");
- }
- truncate OFILE, sysseek(OFILE, -4, SEEK_END);
-
- close OFILE;
- open(OFILE, ">>$arg") || die ("Can't append to output file $arg: $!");
- $cdone = 1;
- }
-
- } elsif ($arg eq "-b") {
- if (@ARGV) {
- $arg = shift;
- $blocksize = 512 * int $arg;
- }
-
- } else {
- if (!$cdone) {
- open(OFILE, ">-") || die ("Can't open stdout: $!");
- }
-
- my @flist = split(",",$arg);
- my $file;
- foreach $file (@flist) {
- add_file($file, $blocksize);
- }
- $nfile += 1;
- end_file();
- }
-}
-end_file();
-
-# ----------------------------------------------------------------------------
-sub end_file {
- print OFILE "\x00\x00\x00\x00";
-}
-
-# ----------------------------------------------------------------------------
-sub add_file {
- my($filename, $blocksize) = @_;
- my($block, $bytes_read, $length, $nb);
-
- open(FILE, $filename) || die("Can't open $filename: $!");
- while($bytes_read = read(FILE, $block, $blocksize)) {
- if($bytes_read < $blocksize) {
- $block .= "\x00" x ($blocksize - $bytes_read);
- }
- $length = pack("V", $blocksize);
- print OFILE $length, $block, $length;
- $nb += 1;
- }
- close(FILE);
- if ($cdone) {
- printf "file: %3d records: %5d length: %5d file: $filename\n",
- $nfile, $nb, $blocksize;
- }
-}
trunk/tools/bin/file2tap
Property changes :
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: trunk/tools/bin/create_disk
===================================================================
--- trunk/tools/bin/create_disk (revision 31)
+++ trunk/tools/bin/create_disk (revision 30)
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# $Id: create_disk 686 2015-06-04 21:08:08Z mueller $
+# $Id: create_disk 679 2015-05-13 17:38:46Z mueller $
#
# Copyright 2013-2014 by Walter F.J. Mueller
#
@@ -14,7 +14,6 @@
#
# Revision History:
# Date Rev Version Comment
-# 2015-06-04 686 1.1.2 use sysseek rather seek; add RM80
# 2015-04-06 665 1.1.1 add alias RM03 (for RM02) and RP05 (for RP04)
# 2014-06-14 562 1.1 BUGFIX: repair --boot; add RM02,RM05,RP04,RP07
# 2013-05-20 521 1.0 First draft
@@ -45,7 +44,6 @@
RL02 => {cyl=> 512, hd=> 2, sec=> 40, bps=> 256, bad=>1},
RM02 => {cyl=> 823, hd=> 5, sec=> 32, bps=> 512, bad=>1},
RM05 => {cyl=> 823, hd=> 19, sec=> 32, bps=> 512, bad=>1},
- RM80 => {cyl=> 559, hd=> 14, sec=> 31, bps=> 512, bad=>1},
RP04 => {cyl=> 411, hd=> 19, sec=> 22, bps=> 512, bad=>1},
RP06 => {cyl=> 815, hd=> 19, sec=> 22, bps=> 512, bad=>1},
RP07 => {cyl=> 630, hd=> 32, sec=> 50, bps=> 512, bad=>1}
@@ -99,8 +97,8 @@
sysopen($fh, $fnam, O_RDWR|O_CREAT)
or die "failed to create '$fnam': $!";
-# seek to end, write 1 byte at end
-my $rc = sysseek($fh, $cap-1, SEEK_SET);
+# seek to end, wrte 1 byte at end
+my $rc = $fh->seek($cap-1, SEEK_SET);
if (not $rc) {die "seek failed: $!";}
my $buf = pack('C1',0);
$rc = syswrite($fh, $buf, length($buf));
@@ -120,7 +118,7 @@
sub do_inipatt {
my $ini = $opts{ini};
- if ($ini eq 'zero' || $ini eq 'ones' || $ini eq 'dead') {
+ if ($ini eq 'zero' ||$ini eq 'ones' || $ini eq 'dead') {
my @dat;
for (my $i=0; $i<$bps/4; $i++) {
push @dat, 0,0 if $ini eq 'zero';
@@ -273,7 +271,7 @@
print "\n";
print "currently supported initialization patterns:\n";
- print " zero all zero (will cause explicit disk space allocation)\n";
+ print " zero all zero (the default anyway if no -ini given)\n";
print " ones all ones\n";
print " dead alternating 0xdead 0xbeaf pattern\n";
print " test writes unique groups of 8 16bit words\n";
/trunk/tools/oskit/211bsd_tm/.cvsignore
File deleted
/trunk/tools/oskit/211bsd_tm/211bsd_tm_boot.tcl
File deleted
/trunk/tools/oskit/211bsd_tm/README_211bsd_tmset.txt
File deleted
/trunk/tools/oskit/211bsd_tm/211bsd_tm_boot.scmd
File deleted
trunk/tools/oskit/211bsd_tm
Property changes :
Deleted: svn:ignore
## -1,40 +0,0 ##
-*.dep_ghdl
-*.dep_isim
-*.dep_xst
-work-obj93.cf
-*.vcd
-*.ghw
-*.sav
-*.tmp
-*.exe
-ise
-xflow.his
-*.ngc
-*.ncd
-*.pcf
-*.bit
-*.msk
-isim
-isim.log
-isim.wdb
-fuse.log
-*_[sft]sim.vhd
-*_tsim.sdf
-*_xst.log
-*_tra.log
-*_twr.log
-*_map.log
-*_par.log
-*_tsi.log
-*_pad.log
-*_bgn.log
-*_svn.log
-*_sum.log
-*_[dsft]sim.log
-*.dat
-*.dsk
-*.log
-*.tap
-*.tgz
-*license.txt
-*license.pdf
Index: trunk/tools/oskit/211bsd_rk/README_211bsd_rkset.txt
===================================================================
--- trunk/tools/oskit/211bsd_rk/README_211bsd_rkset.txt (revision 31)
+++ trunk/tools/oskit/211bsd_rk/README_211bsd_rkset.txt (revision 30)
@@ -58,7 +58,7 @@
lp 0 csr 177514 vector 200 attached
rk 0 csr 177400 vector 220 attached
rl 0 csr 174400 vector 160 attached
- tm 0 csr 172520 vector 224 attached
+ tm ? csr 172520 vector 224 skipped: No CSR.
xp 0 csr 176700 vector 254 attached
cn 1 csr 176500 vector 300 attached
erase, kill ^U, intr ^C
Index: trunk/tools/oskit/211bsd_rl/README_211bsd_rlset.txt
===================================================================
--- trunk/tools/oskit/211bsd_rl/README_211bsd_rlset.txt (revision 31)
+++ trunk/tools/oskit/211bsd_rl/README_211bsd_rlset.txt (revision 30)
@@ -58,7 +58,7 @@
lp 0 csr 177514 vector 200 attached
rk 0 csr 177400 vector 220 attached
rl 0 csr 174400 vector 160 attached
- tm 0 csr 172520 vector 224 attached
+ tm ? csr 172520 vector 224 skipped: No CSR.
xp 0 csr 176700 vector 254 attached
cn 1 csr 176500 vector 300 attached
erase, kill ^U, intr ^C
Index: trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.tcl
===================================================================
--- trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.tcl (revision 31)
+++ trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.tcl (revision 30)
@@ -1,4 +1,4 @@
-# $Id: 211bsd_rp_boot.tcl 686 2015-06-04 21:08:08Z mueller $
+# $Id: 211bsd_rp_boot.tcl 679 2015-05-13 17:38:46Z mueller $
#
# Setup file for 211bsd RP06 based system
#
Index: trunk/tools/oskit/211bsd_rp/README_211bsd_rpset.txt
===================================================================
--- trunk/tools/oskit/211bsd_rp/README_211bsd_rpset.txt (revision 31)
+++ trunk/tools/oskit/211bsd_rp/README_211bsd_rpset.txt (revision 30)
@@ -60,7 +60,7 @@
lp 0 csr 177514 vector 200 attached
rk 0 csr 177400 vector 220 attached
rl 0 csr 174400 vector 160 attached
- tm 0 csr 172520 vector 224 attached
+ tm ? csr 172520 vector 224 skipped: No CSR.
xp 0 csr 176700 vector 254 attached
cn 1 csr 176500 vector 300 attached
erase, kill ^U, intr ^C
Index: trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.scmd
===================================================================
--- trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.scmd (revision 31)
+++ trunk/tools/oskit/211bsd_rp/211bsd_rp_boot.scmd (revision 30)
@@ -1,4 +1,4 @@
-; $Id: 211bsd_rp_boot.scmd 686 2015-06-04 21:08:08Z mueller $
+; $Id: 211bsd_rp_boot.scmd 666 2015-04-12 21:17:54Z mueller $
;
; Setup file for 211bsd RP06 based system
;
@@ -19,5 +19,6 @@
set rl3 rl02
;
att rp0 211bsd_rp.dsk
+att rk6 rk_home.dsk
;
boo rp0
Index: trunk/tools/oskit/211bsd_rp/.cvsignore
===================================================================
--- trunk/tools/oskit/211bsd_rp/.cvsignore (revision 31)
+++ trunk/tools/oskit/211bsd_rp/.cvsignore (revision 30)
@@ -1,6 +1,5 @@
*.dat
*.dsk
*.log
-*.tgz
*license.txt
*license.pdf
Index: trunk/tools/oskit/211bsd_rp
===================================================================
--- trunk/tools/oskit/211bsd_rp (revision 31)
+++ trunk/tools/oskit/211bsd_rp (revision 30)
trunk/tools/oskit/211bsd_rp
Property changes :
Modified: svn:ignore
## -34,6 +34,5 ##
*.dat
*.dsk
*.log
-*.tgz
*license.txt
*license.pdf
Index: trunk/tools/dox/w11_vhd_all.Doxyfile
===================================================================
--- trunk/tools/dox/w11_vhd_all.Doxyfile (revision 31)
+++ trunk/tools/dox/w11_vhd_all.Doxyfile (revision 30)
@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - vhd"
-PROJECT_NUMBER = 0.66
+PROJECT_NUMBER = 0.65
PROJECT_BRIEF = "W11 CPU core and support modules"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/vhd
Index: trunk/tools/dox/w11_cpp.Doxyfile
===================================================================
--- trunk/tools/dox/w11_cpp.Doxyfile (revision 31)
+++ trunk/tools/dox/w11_cpp.Doxyfile (revision 30)
@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - cpp"
-PROJECT_NUMBER = 0.66
+PROJECT_NUMBER = 0.65
PROJECT_BRIEF = "Backend server for Rlink and w11"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/cpp
Index: trunk/tools/dox/w11_tcl.Doxyfile
===================================================================
--- trunk/tools/dox/w11_tcl.Doxyfile (revision 31)
+++ trunk/tools/dox/w11_tcl.Doxyfile (revision 30)
@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - tcl"
-PROJECT_NUMBER = 0.66
+PROJECT_NUMBER = 0.65
PROJECT_BRIEF = "Backend server for Rlink and w11"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/tcl
Index: trunk/rtl/ibus/ibdr_tm11.vhd
===================================================================
--- trunk/rtl/ibus/ibdr_tm11.vhd (revision 31)
+++ trunk/rtl/ibus/ibdr_tm11.vhd (nonexistent)
@@ -1,423 +0,0 @@
--- $Id: ibdr_tm11.vhd 686 2015-06-04 21:08:08Z mueller $
---
--- Copyright 2015- by Walter F.J. Mueller
---
--- This program is free software; you may redistribute and/or modify it under
--- the terms of the GNU General Public License as published by the Free
--- Software Foundation, either version 2, 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 complete details.
---
-------------------------------------------------------------------------------
--- Module Name: ibdr_tm11 - syn
--- Description: ibus dev(rem): TM11
---
--- Dependencies: -
--- Test bench: -
--- Target Devices: generic
--- Tool versions: ise 14.7; viv 2014.4; ghdl 0.31
---
--- Synthesized (xst):
--- Date Rev ise Target flop lutl lutm slic t peri
--- 2015-06-04 686 14.7 131013 xc6slx16-2 79 144 0 53 s 4.4
--- 2015-05-15 682 14.7 131013 xc6slx16-2 117 209 0 76 s 3.7
---
--- Revision History:
--- Date Rev Version Comment
--- 2015-06-04 686 1.0 Initial version
--- 2015-05-15 682 0.1 First draft
-------------------------------------------------------------------------------
-
-library ieee;
-use ieee.std_logic_1164.all;
-use ieee.numeric_std.all;
-
-use work.slvtypes.all;
-use work.iblib.all;
-
--- ----------------------------------------------------------------------------
-entity ibdr_tm11 is -- ibus dev(rem): TM11
- -- fixed address: 172520
- port (
- CLK : in slbit; -- clock
- BRESET : in slbit; -- ibus reset
- RB_LAM : out slbit; -- remote attention
- IB_MREQ : in ib_mreq_type; -- ibus request
- IB_SRES : out ib_sres_type; -- ibus response
- EI_REQ : out slbit; -- interrupt request
- EI_ACK : in slbit -- interrupt acknowledge
- );
-end ibdr_tm11;
-
-architecture syn of ibdr_tm11 is
-
- constant ibaddr_tm11 : slv16 := slv(to_unsigned(8#172520#,16));
-
- constant ibaddr_sr : slv3 := "000"; -- sr address offset
- constant ibaddr_cr : slv3 := "001"; -- cr address offset
- constant ibaddr_bc : slv3 := "010"; -- bc address offset
- constant ibaddr_ba : slv3 := "011"; -- ba address offset
- constant ibaddr_db : slv3 := "100"; -- db address offset
- constant ibaddr_rl : slv3 := "101"; -- rl address offset
-
- constant sr_ibf_icmd : integer := 15;
- constant sr_ibf_eof : integer := 14;
- constant sr_ibf_pae : integer := 12;
- constant sr_ibf_eot : integer := 10;
- constant sr_ibf_rle : integer := 9;
- constant sr_ibf_bte : integer := 8;
- constant sr_ibf_nxm : integer := 7;
- constant sr_ibf_onl : integer := 6;
- constant sr_ibf_bot : integer := 5;
- constant sr_ibf_wrl : integer := 2;
- constant sr_ibf_rew : integer := 1;
- constant sr_ibf_tur : integer := 0;
-
- constant cr_ibf_err : integer := 15;
- subtype cr_ibf_den is integer range 14 downto 13;
- constant cr_ibf_ini : integer := 12;
- constant cr_ibf_pevn : integer := 11;
- constant cr_ibf_unit2 : integer := 10;
- subtype cr_ibf_unit is integer range 9 downto 8;
- constant cr_ibf_rdy : integer := 7;
- constant cr_ibf_ie : integer := 6;
- subtype cr_ibf_ea is integer range 5 downto 4;
- subtype cr_ibf_func is integer range 3 downto 1;
- constant cr_ibf_go : integer := 0;
-
- subtype ba_ibf_ba is integer range 15 downto 1;
- subtype db_ibf_db is integer range 7 downto 0;
-
- constant rl_ibf_reof : integer := 10;
- constant rl_ibf_reot : integer := 9;
- constant rl_ibf_ronl : integer := 8;
- constant rl_ibf_rbot : integer := 7;
- constant rl_ibf_rwrl : integer := 6;
- constant rl_ibf_rrew : integer := 5;
- subtype rl_ibf_runit is integer range 2 downto 1;
-
- constant func_unload : slv3 := "000"; -- func: unload
- constant func_read : slv3 := "001"; -- func: read
- constant func_write : slv3 := "010"; -- func: write
- constant func_weof : slv3 := "011"; -- func: write eof
- constant func_sforw : slv3 := "100"; -- func: space forward
- constant func_sback : slv3 := "101"; -- func: space backward
- constant func_wrteg : slv3 := "110"; -- func: write extend interrec gap
- constant func_rewind : slv3 := "111"; -- func: rewind
-
- constant rfunc_wunit : slv3 := "001"; -- rem func: write runit
- constant rfunc_done : slv3 := "010"; -- rem func: done (set rdy)
-
- -- cs1 usage for rem functions
- subtype cr_ibf_runit is integer range 5 downto 4; -- new runit (_wunit)
- constant cr_ibf_ricmd : integer := 15; -- new icmd (_done)
- constant cr_ibf_rpae : integer := 12; -- new pae (_done)
- constant cr_ibf_rrle : integer := 9; -- new rle (_done)
- constant cr_ibf_rbte : integer := 8; -- new bte (_done)
- constant cr_ibf_rnxm : integer := 7; -- new nxm (_done)
- constant cr_ibf_reaena : integer := 6; -- ena ea (_done)
- subtype cr_ibf_rea is integer range 5 downto 4; -- new ea (_done)
-
- type regs_type is record -- state registers
- ibsel : slbit; -- ibus select
- sricmd : slbit; -- sr: invalid command
- srpae: slbit; -- sr: parity error
- srrle: slbit; -- sr: record length error
- srbte: slbit; -- sr: bad tape error
- srnxm: slbit; -- sr: non-existant memory
- sreof: slv4; -- sr: eof-of-file
- sreot: slv4; -- sr: eof-of-tape
- sronl: slv4; -- sr: online
- srbot: slv4; -- sr: begin-of-tape
- srwrl: slv4; -- sr: write-locked
- srrew: slv4; -- sr: rewinding
- crden: slv2; -- cr: density
- crpevn: slbit; -- cr: even oarity
- crunit2: slbit; -- cr: unit[2]
- crunit: slv2; -- cr: unit[1:0]
- crrdy: slbit; -- cr: controller ready
- crie: slbit; -- cr: interrupt enable
- crea: slv2; -- cr: address extension
- crfunc: slv3; -- cr: func code
- bc : slv16; -- bc: byte count
- ba : slv16_1; -- ba: bus address
- runit : slv2; -- rem access unit
- resreq : slbit; -- reset requested
- ireq : slbit; -- interrupt request flag
- end record regs_type;
-
- constant regs_init : regs_type := (
- '0', -- ibsel
- '0','0','0','0','0', -- sricmd,srpae,srrle,srbte,srnxm
- (others=>'0'), -- sreof
- (others=>'0'), -- sreot
- (others=>'0'), -- sronl
- (others=>'0'), -- srbot
- (others=>'0'), -- srwrl
- (others=>'0'), -- srrew
- (others=>'0'), -- crden
- '0','0', -- crpevn,crunit2
- (others=>'0'), -- crunit
- '1','0', -- crrdy, crie
- (others=>'0'), -- crea
- (others=>'0'), -- crfunc
- (others=>'0'), -- bc
- (others=>'0'), -- ba
- (others=>'0'), -- runit
- '0', -- resreq
- '0' -- ireq
- );
-
- signal R_REGS : regs_type := regs_init;
- signal N_REGS : regs_type := regs_init;
-
-begin
-
- proc_regs: process (CLK)
- begin
- if rising_edge(CLK) then
- R_REGS <= N_REGS;
- end if;
- end process proc_regs;
-
- proc_next : process (R_REGS, IB_MREQ, EI_ACK)
- variable r : regs_type := regs_init;
- variable n : regs_type := regs_init;
- variable ibhold : slbit := '0';
- variable idout : slv16 := (others=>'0');
- variable ibrem : slbit := '0';
- variable ibreq : slbit := '0';
- variable ibrd : slbit := '0';
- variable ibw0 : slbit := '0';
- variable ibw1 : slbit := '0';
- variable ibwrem : slbit := '0';
- variable ilam : slbit := '0';
-
- begin
-
- r := R_REGS;
- n := R_REGS;
-
- ibhold := '0';
- idout := (others=>'0');
- ibrem := IB_MREQ.racc;
- ibreq := IB_MREQ.re or IB_MREQ.we;
- ibrd := IB_MREQ.re;
- ibw0 := IB_MREQ.we and IB_MREQ.be0;
- ibw1 := IB_MREQ.we and IB_MREQ.be1;
- ibwrem := IB_MREQ.we and ibrem;
- ilam := '0';
-
- -- ibus address decoder
- n.ibsel := '0';
- if IB_MREQ.aval = '1' and
- IB_MREQ.addr(12 downto 4)=ibaddr_tm11(12 downto 4) and
- unsigned(IB_MREQ.addr(3 downto 1)) <= unsigned(ibaddr_rl) then
- n.ibsel := '1';
- end if;
-
- -- ibus transactions
-
- if r.ibsel='1' then -- selected
-
- case IB_MREQ.addr(3 downto 1) is
-
- when ibaddr_sr => -- SR -- status register ----------
- idout(sr_ibf_icmd) := r.sricmd;
- idout(sr_ibf_pae) := r.srpae;
- idout(sr_ibf_rle) := r.srrle;
- idout(sr_ibf_bte) := r.srbte;
- idout(sr_ibf_nxm) := r.srnxm;
- idout(sr_ibf_tur) := r.crrdy; -- FIXME: is this correct ??
- -- only units 0,..3 supported, for unit 4,..,7 return 0 --> ONL=0
- if r.crunit2 = '0' then
- idout(sr_ibf_eof) := r.sreof(to_integer(unsigned(r.crunit)));
- idout(sr_ibf_eot) := r.sreot(to_integer(unsigned(r.crunit)));
- idout(sr_ibf_onl) := r.sronl(to_integer(unsigned(r.crunit)));
- idout(sr_ibf_bot) := r.srbot(to_integer(unsigned(r.crunit)));
- idout(sr_ibf_wrl) := r.srwrl(to_integer(unsigned(r.crunit)));
- idout(sr_ibf_rew) := r.srrew(to_integer(unsigned(r.crunit)));
- end if;
-
- when ibaddr_cr => -- CR -- control register ---------
- idout(cr_ibf_err) := r.sricmd or
- r.sreof(to_integer(unsigned(r.crunit))) or
- r.srpae or
- r.sreot(to_integer(unsigned(r.crunit))) or
- r.srrle or
- r.srnxm;
- idout(cr_ibf_den) := r.crden;
- idout(cr_ibf_pevn) := r.crpevn;
- idout(cr_ibf_unit2) := r.crunit2;
- idout(cr_ibf_unit) := r.crunit;
- idout(cr_ibf_rdy) := r.crrdy;
- idout(cr_ibf_ie) := r.crie;
- idout(cr_ibf_ea) := r.crea;
- idout(cr_ibf_func) := r.crfunc;
-
- if IB_MREQ.we = '1' then
- if ibrem = '0' then
-
- if r.crrdy = '1' then
- if IB_MREQ.be1 = '1' then
- n.crden := IB_MREQ.din(cr_ibf_den);
- if IB_MREQ.din(cr_ibf_ini) = '1' then
- n.resreq := '1';
- end if;
- n.crpevn := IB_MREQ.din(cr_ibf_pevn);
- n.crunit2 := IB_MREQ.din(cr_ibf_unit2);
- n.crunit := IB_MREQ.din(cr_ibf_unit);
- end if;
- if IB_MREQ.be0 = '1' then
- n.crie := IB_MREQ.din(cr_ibf_ie);
- if n.crie = '0' then -- if IE set to 0
- n.ireq := '0'; -- cancel pending interrupt
- end if;
- n.crea := IB_MREQ.din(cr_ibf_ea);
- n.crfunc := IB_MREQ.din(cr_ibf_func);
-
- if IB_MREQ.din(cr_ibf_go) = '1' then
- n.sricmd := '0'; -- clear errors
- n.srpae := '0';
- n.srrle := '0';
- n.srbte := '0';
- n.srnxm := '0';
- n.sreof := (others=>'0'); -- clear position status flags
- n.sreot := (others=>'0');
- n.srbot := (others=>'0');
- n.srrew := (others=>'0');
- n.crrdy := '0'; -- mark busy
- ilam := '1'; -- rri lam
- else
- if r.crie='0' and n.crie='1' then -- if IDE 0->1 transition
- n.ireq := '1'; -- issue software interrupt
- end if;
- end if;
- end if;
- else
- n.sricmd := '1';
- end if;
-
- else -- rem write access. GO not checked
- -- always treated as remote function
- case IB_MREQ.din(cr_ibf_func) is
- when rfunc_wunit => -- rfunc: wunit -----------------
- n.runit := IB_MREQ.din(cr_ibf_runit);
-
- when rfunc_done => -- rfunc: done ------------------
- n.sricmd := IB_MREQ.din(cr_ibf_ricmd);
- n.srpae := IB_MREQ.din(cr_ibf_rpae);
- n.srrle := IB_MREQ.din(cr_ibf_rrle);
- n.srbte := IB_MREQ.din(cr_ibf_rbte);
- n.srnxm := IB_MREQ.din(cr_ibf_rnxm);
- if IB_MREQ.din(cr_ibf_reaena) = '1' then
- n.crea := IB_MREQ.din(cr_ibf_rea);
- end if;
- n.crrdy := '1';
- if r.crie = '1' then
- n.ireq := '1';
- end if;
-
- when others => null; -- <>
- end case;
-
- end if; -- if ibrem
-
- end if; -- if IB_MREQ.we='1'
-
- when ibaddr_bc => -- BC -- byte count register -------
- idout := r.bc;
- if ibw1 = '1' then
- n.bc(15 downto 8) := IB_MREQ.din(15 downto 8);
- end if;
- if ibw0 = '1' then
- n.bc( 7 downto 0) := IB_MREQ.din( 7 downto 0);
- end if;
-
- when ibaddr_ba => -- BA -- bus address register ------
- idout(ba_ibf_ba) := r.ba;
- if ibw1 = '1' then
- n.ba(15 downto 8) := IB_MREQ.din(15 downto 8);
- end if;
- if ibw0 = '1' then
- n.ba( 7 downto 1) := IB_MREQ.din( 7 downto 1);
- end if;
-
- when ibaddr_db => -- DB -- data buffer ---------------
- null;
-
- when ibaddr_rl => -- RL -- read lines ----------------
- if ibrem = '0' then
- null;
- else
- idout(rl_ibf_reof) := r.sreof(to_integer(unsigned(r.runit)));
- idout(rl_ibf_reot) := r.sreot(to_integer(unsigned(r.runit)));
- idout(rl_ibf_ronl) := r.sronl(to_integer(unsigned(r.runit)));
- idout(rl_ibf_rbot) := r.srbot(to_integer(unsigned(r.runit)));
- idout(rl_ibf_rwrl) := r.srwrl(to_integer(unsigned(r.runit)));
- idout(rl_ibf_rrew) := r.srrew(to_integer(unsigned(r.runit)));
- idout(rl_ibf_runit) := r.runit;
- if IB_MREQ.we = '1' then
- n.sreof(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_reof);
- n.sreot(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_reot);
- n.sronl(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_ronl);
- n.srbot(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_rbot);
- n.srwrl(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_rwrl);
- n.srrew(to_integer(unsigned(r.runit))) := IB_MREQ.din(rl_ibf_rrew);
- end if;
- end if;
-
- when others => -- doesn't happen, ibsel only for
- -- subrange up to rl, and all regs are
- -- decoded above
- null;
-
- end case;
- end if;
-
- if BRESET = '1' then
- n.resreq := '1';
- end if;
-
- if r.resreq = '1' then
- n.sricmd := '0';
- n.srpae := '0';
- n.srrle := '0';
- n.srbte := '0';
- n.srnxm := '0';
- n.sreof := (others=>'0');
- n.sreot := (others=>'0');
- n.crden := (others=>'0');
- n.crpevn := '0';
- n.crunit2 := '0';
- n.crunit := (others=>'0');
- n.crrdy := '1';
- n.crie := '0';
- n.crea := (others=>'0');
- n.crfunc := (others=>'0');
- n.bc := (others=>'0');
- n.ba := (others=>'0');
- n.resreq := '0';
- n.ireq := '0';
- end if;
-
- if EI_ACK = '1' or n.crie = '0' then -- interrupt executed or ie disabled
- n.ireq := '0'; -- cancel request
- end if;
-
- N_REGS <= n;
-
- IB_SRES.dout <= idout;
- IB_SRES.ack <= r.ibsel and ibreq;
- IB_SRES.busy <= ibhold and ibreq;
-
- RB_LAM <= ilam;
- EI_REQ <= r.ireq;
-
- end process proc_next;
-
-
-end syn;
Index: trunk/rtl/ibus/ibdr_tm11.vbom
===================================================================
--- trunk/rtl/ibus/ibdr_tm11.vbom (revision 31)
+++ trunk/rtl/ibus/ibdr_tm11.vbom (nonexistent)
@@ -1,6 +0,0 @@
-# libs
-../vlib/slvtypes.vhd
-iblib.vhd
-# components
-# design
-ibdr_tm11.vhd
Index: trunk/rtl/ibus/ibdlib.vhd
===================================================================
--- trunk/rtl/ibus/ibdlib.vhd (revision 31)
+++ trunk/rtl/ibus/ibdlib.vhd (revision 30)
@@ -1,6 +1,6 @@
--- $Id: ibdlib.vhd 682 2015-05-15 18:35:29Z mueller $
+-- $Id: ibdlib.vhd 678 2015-05-10 16:23:02Z mueller $
--
--- Copyright 2008-2015 by Walter F.J. Mueller
+-- Copyright 2008-2014 by Walter F.J. Mueller
--
-- This program is free software; you may redistribute and/or modify it under
-- the terms of the GNU General Public License as published by the Free
Index: trunk/rtl/ibus/ibdr_maxisys.vhd
===================================================================
--- trunk/rtl/ibus/ibdr_maxisys.vhd (revision 31)
+++ trunk/rtl/ibus/ibdr_maxisys.vhd (revision 30)
@@ -1,4 +1,4 @@
--- $Id: ibdr_maxisys.vhd 683 2015-05-17 21:54:35Z mueller $
+-- $Id: ibdr_maxisys.vhd 679 2015-05-13 17:38:46Z mueller $
--
-- Copyright 2009-2015 by Walter F.J. Mueller
--
@@ -20,7 +20,6 @@
-- ibdr_rhrp
-- ibdr_rl11
-- ibdr_rk11
--- ibdr_tm11
-- ibdr_dl11
-- ibdr_pc11
-- ibdr_lp11
@@ -42,7 +41,6 @@
--
-- Revision History:
-- Date Rev Version Comment
--- 2015-05-15 683 1.3.1 add TM11
-- 2015-05-10 678 1.3 start/stop/suspend overhaul
-- 2015-04-06 664 1.2.3 rename RPRM to RHRP
-- 2015-03-14 658 1.2.2 add RPRM; rearrange intmap (+rhrp,tm11,-kw11-l)
@@ -296,20 +294,6 @@
);
end generate RK11;
- TM11: if sys_conf_ibd_tm11 generate
- begin
- I0 : ibdr_tm11
- port map (
- CLK => CLK,
- BRESET => BRESET,
- RB_LAM => RB_LAM_TM11,
- IB_MREQ => IB_MREQ,
- IB_SRES => IB_SRES_TM11,
- EI_REQ => EI_REQ_TM11,
- EI_ACK => EI_ACK_TM11
- );
- end generate TM11;
-
DL11_0 : ibdr_dl11
port map (
CLK => CLK,
/trunk/rtl/ibus/ibdr_rhrp.vhd
1,4 → 1,4
-- $Id: ibdr_rhrp.vhd 682 2015-05-15 18:35:29Z mueller $ |
-- $Id: ibdr_rhrp.vhd 680 2015-05-14 13:29:46Z mueller $ |
-- |
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
27,7 → 27,6
-- |
-- Revision History: |
-- Date Rev Version Comment |
-- 2015-05-15 682 1.0.1 correct ibsel range select logic |
-- 2015-05-14 680 1.0 Initial version |
-- 2015-03-15 658 0.1 First draft |
------------------------------------------------------------------------------ |
464,6 → 463,7
variable iomux : slv4 := (others=>'0'); -- omux select |
variable iamap : slv5 := (others=>'0'); -- mem mapped address |
variable imask : slv16 := (others=>'0'); -- implemented bits mask |
variable inxr : slbit := '0'; -- non-existent register |
variable imbreg : slbit := '0'; -- massbus register |
variable inormr : slbit := '0'; -- inhibit rmr protect |
|
506,6 → 506,7
iomux := (others=>'0'); |
iamap := (others=>'0'); |
imask := (others=>'1'); -- default: all bits ok |
inxr := '0'; |
imbreg := '0'; |
inormr := '0'; |
|
526,7 → 527,7
n.ibsel := '0'; |
if IB_MREQ.aval = '1' and |
IB_MREQ.addr(12 downto 6) = ibaddr_rhrp(12 downto 6) and |
unsigned(IB_MREQ.addr(5 downto 1)) <= unsigned(ibaddr_cs3) then |
unsigned(ibaddr_rhrp(5 downto 0)) <= unsigned(ibaddr_cs3) then |
n.ibsel := '1'; |
end if; |
|
709,9 → 710,8
when ibaddr_cs3 => -- RxCS3 control reg 3 |
iomux := omux_cs3; |
|
when others => null; -- doesn't happen, ibsel only for |
-- subrange up to cs3, and all |
-- 22 regs are decoded above |
when others => -- unknown register |
inxr := '1'; |
|
end case; -- case IB_MREQ.addr |
n.amap := iamap; |
767,11 → 767,15
end if; |
|
elsif IB_MREQ.re = '1' then -- read request |
if ibrem='0' and imbreg='1' and ined='1' then |
n.cs2ned := '1'; -- signal error |
if inxr = '1' then -- unknown register |
ibreq := '0'; -- suppress ack & hold --> ibus err |
else |
ibhold := '1'; |
n.state := s_read; |
if ibrem='0' and imbreg='1' and ined='1' then |
n.cs2ned := '1'; -- signal error |
else |
ibhold := '1'; |
n.state := s_read; |
end if; |
end if; |
|
end if; -- if IB_MREQ.we .. elsif IB_MREQ.re |
/trunk/rtl/ibus/ibdr_maxisys.vbom
9,7 → 9,6
ibdr_rhrp.vbom |
ibdr_rl11.vbom |
ibdr_rk11.vbom |
ibdr_tm11.vbom |
ibdr_dl11.vbom |
ibdr_pc11.vbom |
ibdr_lp11.vbom |
/trunk/rtl/sys_gen/w11a/basys3/sys_conf.vhd
1,4 → 1,4
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
70,7 → 70,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/basys3/tb/sys_conf_sim.vhd
1,4 → 1,4
-- $Id: sys_conf_sim.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf_sim.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
70,7 → 70,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/basys3/sys_w11a_b3.vhd
1,4 → 1,4
-- $Id: sys_w11a_b3.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- $Id: sys_w11a_b3.vhd 677 2015-05-09 21:52:32Z mueller $ |
-- |
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
34,8 → 34,6
-- |
-- Synthesized: |
-- Date Rev viv Target flop lutl lutm bram slic |
-- 2015-06-04 686 2014.4 xc7a35t-1 1919 4372 162 47.5 1408 +TM11 17% |
-- 2015-05-14 680 2014.4 xc7a35t-1 1837 4304 162 47.5 1354 +RHRP 17% |
-- 2015-02-21 649 2014.4 xc7a35t-1 1637 3767 146 47.5 1195 |
-- |
-- Revision History: |
/trunk/rtl/sys_gen/w11a/nexys2/sys_conf.vhd
1,4 → 1,4
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
78,7 → 78,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd
1,4 → 1,4
-- $Id: sys_conf_sim.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf_sim.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
73,7 → 73,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd
1,4 → 1,4
-- $Id: sys_w11a_n2.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- $Id: sys_w11a_n2.vhd 677 2015-05-09 21:52:32Z mueller $ |
-- |
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
34,8 → 34,6
-- |
-- Synthesized (xst): |
-- Date Rev ise Target flop lutl lutm slic t peri |
-- 2015-06-04 686 14.7 131013 xc3s1200e-4 2311 6725 414 4198 ok: +TM11 |
-- 2015-05-14 680 14.7 131013 xc3s1200e-4 2232 6547 414 4083 ok: +RHRP |
-- 2015-02-21 649 14.7 131013 xc3s1200e-4 1903 5512 382 3483 ok: +RL11 |
-- 2014-12-22 619 14.7 131013 xc3s1200e-4 1828 5131 366 3263 ok: +rbmon |
-- 2014-12-20 614 14.7 131013 xc3s1200e-4 1714 4896 366 3125 ok: -RL11,rlv4 |
/trunk/rtl/sys_gen/w11a/nexys3/sys_conf.vhd
1,4 → 1,4
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
85,7 → 85,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd
1,4 → 1,4
-- $Id: sys_conf_sim.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf_sim.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
72,7 → 72,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd
1,4 → 1,4
-- $Id: sys_w11a_n3.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- $Id: sys_w11a_n3.vhd 677 2015-05-09 21:52:32Z mueller $ |
-- |
-- Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
34,8 → 34,7
-- |
-- Synthesized (xst): |
-- Date Rev ise Target flop lutl lutm slic t peri |
-- 2015-06-04 686 14.7 131013 xc6slx16-2 2189 4492 161 1543 ok: +TM11 67% |
-- 2015-05-14 680 14.7 131013 xc6slx16-2 2120 4443 161 1546 ok: +ibmon 67% |
-- 2015-04-25 668 14.7 131013 xc6slx16-2 2101 4420 167 1520 ok: +ibmon 66% |
-- 2015-04-06 664 14.7 131013 xc6slx16-2 1991 4350 167 1489 ok: +RHRP 65% |
-- 2015-02-21 649 14.7 131013 xc6slx16-2 1819 3905 160 1380 ok: +RL11 |
-- 2014-12-22 619 14.7 131013 xc6slx16-2 1742 3767 150 1350 ok: +rbmon |
/trunk/rtl/sys_gen/w11a/nexys4/sys_conf.vhd
1,4 → 1,4
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
79,7 → 79,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys4/tb/sys_conf_sim.vhd
1,4 → 1,4
-- $Id: sys_conf_sim.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf_sim.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
70,7 → 70,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/nexys4/sys_w11a_n4.vhd
1,4 → 1,4
-- $Id: sys_w11a_n4.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- $Id: sys_w11a_n4.vhd 677 2015-05-09 21:52:32Z mueller $ |
-- |
-- Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
33,11 → 33,9
-- Tool versions: ise 14.5-14.7; viv 2014.4; ghdl 0.29-0.31 |
-- |
-- Synthesized: |
-- Date Rev viv Target flop lutl lutm bram slic MHz |
-- 2015-06-04 686 2014.4 xc7a100t-1 2111 4541 162 7.5 1469 80 +TM11 |
-- 2015-05-14 680 2014.4 xc7a100t-1 2030 4459 162 7.5 1427 80 |
-- 2015-02-22 650 2014.4 xc7a100t-1 1606 3652 146 3.5 1158 80 |
-- 2015-02-22 650 i 17.7 xc7a100t-1 1670 3564 124 1508 80 |
-- Date Rev viv Target flop lutl lutm bram slic |
-- 2015-02-22 650 2014.4 xc7a100t-1 1606 3652 146 3.5 1158 80 MHz |
-- 2015-02-22 650 i 17.7 xc7a100t-1 1670 3564 124 1508 80 MHz |
-- |
-- Revision History: |
-- Date Rev Version Comment |
/trunk/rtl/sys_gen/w11a/s3board/sys_conf.vhd
1,4 → 1,4
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf.vhd 673 2015-05-03 08:34:52Z mueller $ |
-- |
-- Copyright 2007-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
56,7 → 56,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd
1,4 → 1,4
-- $Id: sys_conf_sim.vhd 683 2015-05-17 21:54:35Z mueller $ |
-- $Id: sys_conf_sim.vhd 672 2015-05-02 21:58:28Z mueller $ |
-- |
-- Copyright 2007-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
63,7 → 63,6
constant sys_conf_ibd_rk11 : boolean := true; -- RK11 |
constant sys_conf_ibd_rl11 : boolean := true; -- RL11 |
constant sys_conf_ibd_rhrp : boolean := true; -- RHRP |
constant sys_conf_ibd_tm11 : boolean := true; -- TM11 |
|
-- configure other devices |
constant sys_conf_ibd_iist : boolean := true; -- IIST |
/trunk/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd
1,4 → 1,4
-- $Id: sys_w11a_s3.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- $Id: sys_w11a_s3.vhd 677 2015-05-09 21:52:32Z mueller $ |
-- |
-- Copyright 2007-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
33,8 → 33,7
-- |
-- Synthesized (xst): |
-- Date Rev ise Target flop lutl lutm slic t peri |
-- 2015-06-04 686 14.7 131013 xc3s1000-4 2158 6453 350 3975 OK: +TM11 51% |
-- 2015-05-14 680 14.7 131013 xc3s1000-4 2087 6316 350 3928 OK: +RHRP 51% |
-- 2015-05-02 673 14.7 131013 xc3s1000-4 2054 6196 350 3858 OK: +RHRP 50% |
-- 2015-02-21 649 14.7 131013 xc3s1000-4 1643 5124 318 3176 OK: +RL11 |
-- 2014-12-22 619 14.7 131013 xc3s1000-4 1569 4768 302 2994 OK: +rbmon |
-- 2014-12-20 614 14.7 131013 xc3s1000-4 1455 4523 302 2807 OK: -RL11,rlv4 |
/trunk/rtl/vlib/memlib/ram_2swsr_wfirst_gen.vhd
1,102 → 1,102
-- $Id: ram_2swsr_wfirst_gen.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_wfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-through' semantics (as block RAM). |
-- The code is inspired by Xilinx example rams_16.vhd. The |
-- 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_wfirst_gen is -- RAM, 2 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_wfirst_gen; |
|
|
architecture syn of ram_2swsr_wfirst_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DOA : slv(DWIDTH-1 downto 0) := datzero; |
signal R_DOB : slv(DWIDTH-1 downto 0) := datzero; |
begin |
|
proc_clka: process (CLKA) |
begin |
if rising_edge(CLKA) then |
if ENA = '1' then |
if WEA = '1' then |
sv_ram(to_integer(unsigned(ADDRA))) := DIA; |
end if; |
R_DOA <= sv_ram(to_integer(unsigned(ADDRA))); |
end if; |
end if; |
end process proc_clka; |
|
proc_clkb: process (CLKB) |
begin |
if rising_edge(CLKB) then |
if ENB = '1' then |
if WEB = '1' then |
sv_ram(to_integer(unsigned(ADDRB))) := DIB; |
end if; |
R_DOB <= sv_ram(to_integer(unsigned(ADDRB))); |
end if; |
end if; |
end process proc_clkb; |
|
DOA <= R_DOA; |
DOB <= R_DOB; |
|
end syn; |
-- $Id: ram_2swsr_wfirst_gen.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_wfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-through' semantics (as block RAM). |
-- The code is inspired by Xilinx example rams_16.vhd. The |
-- 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_wfirst_gen is -- RAM, 2 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_wfirst_gen; |
|
|
architecture syn of ram_2swsr_wfirst_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DOA : slv(DWIDTH-1 downto 0) := datzero; |
signal R_DOB : slv(DWIDTH-1 downto 0) := datzero; |
begin |
|
proc_clka: process (CLKA) |
begin |
if rising_edge(CLKA) then |
if ENA = '1' then |
if WEA = '1' then |
sv_ram(to_integer(unsigned(ADDRA))) := DIA; |
end if; |
R_DOA <= sv_ram(to_integer(unsigned(ADDRA))); |
end if; |
end if; |
end process proc_clka; |
|
proc_clkb: process (CLKB) |
begin |
if rising_edge(CLKB) then |
if ENB = '1' then |
if WEB = '1' then |
sv_ram(to_integer(unsigned(ADDRB))) := DIB; |
end if; |
R_DOB <= sv_ram(to_integer(unsigned(ADDRB))); |
end if; |
end if; |
end process proc_clkb; |
|
DOA <= R_DOA; |
DOB <= R_DOB; |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swar_gen.vhd
1,82 → 1,82
-- $Id: ram_1swar_gen.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_gen - syn |
-- Description: Single-Port RAM with with one synchronous write and one |
-- asynchronius read port (as distributed RAM). |
-- The code is inspired by Xilinx example rams_04.vhd. The |
-- 'ram_style' attribute is set to 'distributed', this will |
-- force in XST a synthesis as distributed RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.2 now numeric_std clean |
-- 2008-03-08 123 1.0.1 use std_..._arith, not _unsigned; use unsigned() |
-- 2007-06-03 45 1.0 Initial version |
-- |
-- Some synthesis results: |
-- - 2007-12-31 ise 8.2.03 for xc3s1000-ft256-4: |
-- AWIDTH DWIDTH LUTl LUTm Comments |
-- 4 16 - 16 16*RAM16X1S |
-- 5 16 - 32 16*RAM32X1S |
-- 6 16 18 64 32*RAM32X1S Note: A(4) via F5MUX, A(5) via LUT |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swar_gen is -- RAM, 1 sync w asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swar_gen; |
|
|
architecture syn of ram_1swar_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (memsize-1 downto 0) of slv (DWIDTH-1 downto 0); |
signal RAM : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of RAM : signal is "distributed"; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if WE = '1' then |
RAM(to_integer(unsigned(ADDR))) <= DI; |
end if; |
end if; |
end process proc_clk; |
|
DO <= RAM(to_integer(unsigned(ADDR))); |
|
end syn; |
-- $Id: ram_1swar_gen.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_gen - syn |
-- Description: Single-Port RAM with with one synchronous write and one |
-- asynchronius read port (as distributed RAM). |
-- The code is inspired by Xilinx example rams_04.vhd. The |
-- 'ram_style' attribute is set to 'distributed', this will |
-- force in XST a synthesis as distributed RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.2 now numeric_std clean |
-- 2008-03-08 123 1.0.1 use std_..._arith, not _unsigned; use unsigned() |
-- 2007-06-03 45 1.0 Initial version |
-- |
-- Some synthesis results: |
-- - 2007-12-31 ise 8.2.03 for xc3s1000-ft256-4: |
-- AWIDTH DWIDTH LUTl LUTm Comments |
-- 4 16 - 16 16*RAM16X1S |
-- 5 16 - 32 16*RAM32X1S |
-- 6 16 18 64 32*RAM32X1S Note: A(4) via F5MUX, A(5) via LUT |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swar_gen is -- RAM, 1 sync w asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swar_gen; |
|
|
architecture syn of ram_1swar_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (memsize-1 downto 0) of slv (DWIDTH-1 downto 0); |
signal RAM : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of RAM : signal is "distributed"; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if WE = '1' then |
RAM(to_integer(unsigned(ADDR))) <= DI; |
end if; |
end if; |
end process proc_clk; |
|
DO <= RAM(to_integer(unsigned(ADDR))); |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_2swsr_rfirst_gen.vhd
1,104 → 1,104
-- $Id: ram_2swsr_rfirst_gen.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_rfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-before-write' semantics (as block RAM). |
-- The code is inspired by Xilinx example rams_16.vhd. The |
-- 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- now initialize DO to all '0' at start |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_rfirst_gen is -- RAM, 2 sync r/w ports, read first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_rfirst_gen; |
|
|
architecture syn of ram_2swsr_rfirst_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DOA : slv(DWIDTH-1 downto 0) := datzero; |
signal R_DOB : slv(DWIDTH-1 downto 0) := datzero; |
|
begin |
|
proc_clka: process (CLKA) |
begin |
if rising_edge(CLKA) then |
if ENA = '1' then |
R_DOA <= sv_ram(to_integer(unsigned(ADDRA))); |
if WEA = '1' then |
sv_ram(to_integer(unsigned(ADDRA))) := DIA; |
end if; |
end if; |
end if; |
end process proc_clka; |
|
proc_clkb: process (CLKB) |
begin |
if rising_edge(CLKB) then |
if ENB = '1' then |
R_DOB <= sv_ram(to_integer(unsigned(ADDRB))); |
if WEB = '1' then |
sv_ram(to_integer(unsigned(ADDRB))) := DIB; |
end if; |
end if; |
end if; |
end process proc_clkb; |
|
DOA <= R_DOA; |
DOB <= R_DOB; |
|
end syn; |
-- $Id: ram_2swsr_rfirst_gen.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_rfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-before-write' semantics (as block RAM). |
-- The code is inspired by Xilinx example rams_16.vhd. The |
-- 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- now initialize DO to all '0' at start |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_rfirst_gen is -- RAM, 2 sync r/w ports, read first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_rfirst_gen; |
|
|
architecture syn of ram_2swsr_rfirst_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DOA : slv(DWIDTH-1 downto 0) := datzero; |
signal R_DOB : slv(DWIDTH-1 downto 0) := datzero; |
|
begin |
|
proc_clka: process (CLKA) |
begin |
if rising_edge(CLKA) then |
if ENA = '1' then |
R_DOA <= sv_ram(to_integer(unsigned(ADDRA))); |
if WEA = '1' then |
sv_ram(to_integer(unsigned(ADDRA))) := DIA; |
end if; |
end if; |
end if; |
end process proc_clka; |
|
proc_clkb: process (CLKB) |
begin |
if rising_edge(CLKB) then |
if ENB = '1' then |
R_DOB <= sv_ram(to_integer(unsigned(ADDRB))); |
if WEB = '1' then |
sv_ram(to_integer(unsigned(ADDRB))) := DIB; |
end if; |
end if; |
end if; |
end process proc_clkb; |
|
DOA <= R_DOA; |
DOB <= R_DOB; |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swsr_wfirst_gen.vhd
1,90 → 1,90
-- $Id: ram_1swsr_wfirst_gen.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_rfirst_gen - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- and 'read-through' semantics (as block RAM). |
-- The 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Notes: For xst 8.1.03i: can be written with a signal or a shared |
-- variable declared at the architecture level. Use variable |
-- because this seemed better for simulation. Using a simple |
-- variable declared at process level leads to an array of |
-- registers and a big mux. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swsr_wfirst_gen is -- RAM, 1 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swsr_wfirst_gen; |
|
|
architecture syn of ram_1swsr_wfirst_gen is |
|
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DO : slv(DWIDTH-1 downto 0) := datzero; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if EN = '1' then |
if WE = '1' then |
sv_ram(to_integer(unsigned(ADDR))) := DI; |
end if; |
R_DO <= sv_ram(to_integer(unsigned(ADDR))); |
end if; |
end if; |
end process proc_clk; |
|
DO <= R_DO; |
|
end syn; |
|
-- $Id: ram_1swsr_wfirst_gen.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_rfirst_gen - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- and 'read-through' semantics (as block RAM). |
-- The 'ram_style' attribute is set to 'block', this will |
-- force in XST a synthesis as block RAM. |
-- |
-- Notes: For xst 8.1.03i: can be written with a signal or a shared |
-- variable declared at the architecture level. Use variable |
-- because this seemed better for simulation. Using a simple |
-- variable declared at process level leads to an array of |
-- registers and a big mux. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.4 now numeric_std clean |
-- 2010-06-03 299 1.0.3 use sv_ prefix for shared variables |
-- 2008-03-08 123 1.0.2 use std_..._arith, not _unsigned; use unsigned(); |
-- 2008-03-02 122 1.0.1 change generic default for BRAM models |
-- 2007-06-03 45 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swsr_wfirst_gen is -- RAM, 1 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swsr_wfirst_gen; |
|
|
architecture syn of ram_1swsr_wfirst_gen is |
|
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (0 to memsize-1) of slv(DWIDTH-1 downto 0); |
shared variable sv_ram : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of sv_ram : variable is "block"; |
|
signal R_DO : slv(DWIDTH-1 downto 0) := datzero; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if EN = '1' then |
if WE = '1' then |
sv_ram(to_integer(unsigned(ADDR))) := DI; |
end if; |
R_DO <= sv_ram(to_integer(unsigned(ADDR))); |
end if; |
end if; |
end process proc_clk; |
|
DO <= R_DO; |
|
end syn; |
|
/trunk/rtl/vlib/memlib/ram_1swar_gen_unisim.vhd
1,118 → 1,118
-- $Id: ram_1swar_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_gen_unisim - syn |
-- Description: Single-Port RAM with with one synchronous write and one |
-- asynchronius read port (as distributed RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.0.1 use shorter label names |
-- 2008-03-02 122 1.0 Initial version |
-- |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swar_gen is -- RAM, 1 sync w asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swar_gen; |
|
|
architecture syn of ram_1swar_gen is |
|
begin |
|
assert AWIDTH>=4 and AWIDTH<=6 |
report "assert(AWIDTH>=4 and AWIDTH<=6): only 4..6 bit AWIDTH supported" |
severity failure; |
|
AW_4: if AWIDTH = 4 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM16X1S |
generic map ( |
INIT => X"0000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_4; |
|
AW_5: if AWIDTH = 5 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM32X1S |
generic map ( |
INIT => X"00000000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
A4 => ADDR(4), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_5; |
|
AW_6: if AWIDTH = 6 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM64X1S |
generic map ( |
INIT => X"0000000000000000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
A4 => ADDR(4), |
A5 => ADDR(5), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_6; |
|
end syn; |
-- $Id: ram_1swar_gen_unisim.vhd 641 2015-02-01 22:12:15Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_gen_unisim - syn |
-- Description: Single-Port RAM with with one synchronous write and one |
-- asynchronius read port (as distributed RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.0.1 use shorter label names |
-- 2008-03-02 122 1.0 Initial version |
-- |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swar_gen is -- RAM, 1 sync w asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address port |
DI : in slv(DWIDTH-1 downto 0); -- data in port |
DO : out slv(DWIDTH-1 downto 0) -- data out port |
); |
end ram_1swar_gen; |
|
|
architecture syn of ram_1swar_gen is |
|
begin |
|
assert AWIDTH>=4 and AWIDTH<=6 |
report "assert(AWIDTH>=4 and AWIDTH<=6): only 4..6 bit AWIDTH supported" |
severity failure; |
|
AW_4: if AWIDTH = 4 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM16X1S |
generic map ( |
INIT => X"0000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_4; |
|
AW_5: if AWIDTH = 5 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM32X1S |
generic map ( |
INIT => X"00000000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
A4 => ADDR(4), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_5; |
|
AW_6: if AWIDTH = 6 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM64X1S |
generic map ( |
INIT => X"0000000000000000") |
port map ( |
O => DO(i), |
A0 => ADDR(0), |
A1 => ADDR(1), |
A2 => ADDR(2), |
A3 => ADDR(3), |
A4 => ADDR(4), |
A5 => ADDR(5), |
D => DI(i), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_6; |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swar_1ar_gen_unisim.vhd
1,170 → 1,170
-- $Id: ram_1swar_1ar_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_1ar_gen - syn |
-- Description: Dual-Port RAM with with one synchronous write and two |
-- asynchronius read ports (as distributed RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2010-06-03 300 1.1 add hack for AW=5 for Spartan's |
-- 2008-03-08 123 1.0.1 use shorter label names |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swar_1ar_gen is -- RAM, 1 sync w asyn r + 1 asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable (port A) |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DI : in slv(DWIDTH-1 downto 0); -- data in (port A) |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_1swar_1ar_gen; |
|
|
architecture syn of ram_1swar_1ar_gen is |
|
begin |
|
assert AWIDTH>=4 and AWIDTH<=5 |
report "assert(AWIDTH>=4 and AWIDTH<=5): only 4..5 bit AWIDTH supported" |
severity failure; |
|
AW_4: if AWIDTH = 4 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB(i), |
SPO => DOA(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_4; |
|
-- Note: Spartan-3 doesn't support RAM32X1D, therefore this kludge.. |
AW_5: if AWIDTH = 5 generate |
signal WE0 : slbit := '0'; |
signal WE1 : slbit := '0'; |
signal DOA0 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOA1 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOB0 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOB1 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
begin |
WE0 <= WE and not ADDRA(4); |
WE1 <= WE and ADDRA(4); |
GL: for i in DWIDTH-1 downto 0 generate |
MEM0 : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB0(i), |
SPO => DOA0(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE0 |
); |
MEM1 : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB1(i), |
SPO => DOA1(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE1 |
); |
DOA <= DOA0 when ADDRA(4)='0' else DOA1; |
DOB <= DOB0 when ADDRB(4)='0' else DOB1; |
end generate GL; |
end generate AW_5; |
|
-- AW_6: if AWIDTH = 6 generate |
-- GL: for i in DWIDTH-1 downto 0 generate |
-- MEM : RAM64X1D |
-- generic map ( |
-- INIT => X"0000000000000000") |
-- port map ( |
-- DPO => DOB(i), |
-- SPO => DOA(i), |
-- A0 => ADDRA(0), |
-- A1 => ADDRA(1), |
-- A2 => ADDRA(2), |
-- A3 => ADDRA(3), |
-- A4 => ADDRA(4), |
-- A5 => ADDRA(5), |
-- D => DI(i), |
-- DPRA0 => ADDRB(0), |
-- DPRA1 => ADDRB(1), |
-- DPRA2 => ADDRB(2), |
-- DPRA3 => ADDRB(3), |
-- DPRA4 => ADDRB(4), |
-- DPRA5 => ADDRB(5), |
-- WCLK => CLK, |
-- WE => WE |
-- ); |
-- end generate GL; |
-- end generate AW_6; |
|
end syn; |
|
-- Note: The VHDL instantiation example in the 8.1i Librariers Guide is wrong. |
-- The annotation states that DPO is the port A output and SPO is port B |
-- output. The text before is correct, DPO is port B and SPO is port A. |
-- $Id: ram_1swar_1ar_gen_unisim.vhd 641 2015-02-01 22:12:15Z mueller $ |
-- |
-- Copyright 2008-2010 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_1ar_gen - syn |
-- Description: Dual-Port RAM with with one synchronous write and two |
-- asynchronius read ports (as distributed RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2010-06-03 300 1.1 add hack for AW=5 for Spartan's |
-- 2008-03-08 123 1.0.1 use shorter label names |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swar_1ar_gen is -- RAM, 1 sync w asyn r + 1 asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable (port A) |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DI : in slv(DWIDTH-1 downto 0); -- data in (port A) |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_1swar_1ar_gen; |
|
|
architecture syn of ram_1swar_1ar_gen is |
|
begin |
|
assert AWIDTH>=4 and AWIDTH<=5 |
report "assert(AWIDTH>=4 and AWIDTH<=5): only 4..5 bit AWIDTH supported" |
severity failure; |
|
AW_4: if AWIDTH = 4 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB(i), |
SPO => DOA(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE |
); |
end generate GL; |
end generate AW_4; |
|
-- Note: Spartan-3 doesn't support RAM32X1D, therefore this kludge.. |
AW_5: if AWIDTH = 5 generate |
signal WE0 : slbit := '0'; |
signal WE1 : slbit := '0'; |
signal DOA0 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOA1 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOB0 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
signal DOB1 : slv(DWIDTH-1 downto 0) := (others=>'0'); |
begin |
WE0 <= WE and not ADDRA(4); |
WE1 <= WE and ADDRA(4); |
GL: for i in DWIDTH-1 downto 0 generate |
MEM0 : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB0(i), |
SPO => DOA0(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE0 |
); |
MEM1 : RAM16X1D |
generic map ( |
INIT => X"0000") |
port map ( |
DPO => DOB1(i), |
SPO => DOA1(i), |
A0 => ADDRA(0), |
A1 => ADDRA(1), |
A2 => ADDRA(2), |
A3 => ADDRA(3), |
D => DI(i), |
DPRA0 => ADDRB(0), |
DPRA1 => ADDRB(1), |
DPRA2 => ADDRB(2), |
DPRA3 => ADDRB(3), |
WCLK => CLK, |
WE => WE1 |
); |
DOA <= DOA0 when ADDRA(4)='0' else DOA1; |
DOB <= DOB0 when ADDRB(4)='0' else DOB1; |
end generate GL; |
end generate AW_5; |
|
-- AW_6: if AWIDTH = 6 generate |
-- GL: for i in DWIDTH-1 downto 0 generate |
-- MEM : RAM64X1D |
-- generic map ( |
-- INIT => X"0000000000000000") |
-- port map ( |
-- DPO => DOB(i), |
-- SPO => DOA(i), |
-- A0 => ADDRA(0), |
-- A1 => ADDRA(1), |
-- A2 => ADDRA(2), |
-- A3 => ADDRA(3), |
-- A4 => ADDRA(4), |
-- A5 => ADDRA(5), |
-- D => DI(i), |
-- DPRA0 => ADDRB(0), |
-- DPRA1 => ADDRB(1), |
-- DPRA2 => ADDRB(2), |
-- DPRA3 => ADDRB(3), |
-- DPRA4 => ADDRB(4), |
-- DPRA5 => ADDRB(5), |
-- WCLK => CLK, |
-- WE => WE |
-- ); |
-- end generate GL; |
-- end generate AW_6; |
|
end syn; |
|
-- Note: The VHDL instantiation example in the 8.1i Librariers Guide is wrong. |
-- The annotation states that DPO is the port A output and SPO is port B |
-- output. The text before is correct, DPO is port B and SPO is port A. |
/trunk/rtl/vlib/memlib/ram_2swsr_rfirst_gen_unisim.vhd
1,83 → 1,83
-- $Id: ram_2swsr_rfirst_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_rfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-before-write' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.1 use now ram_2swsr_xfirst_gen_unisim |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_2swsr_rfirst_gen is -- RAM, 2 sync r/w ports, read first |
generic ( |
AWIDTH : positive := 13; -- address port width 11/9 or 13/8 |
DWIDTH : positive := 8); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_rfirst_gen; |
|
|
architecture syn of ram_2swsr_rfirst_gen is |
begin |
|
UMEM: ram_2swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "READ_FIRST") |
port map ( |
CLKA => CLKA, |
CLKB => CLKB, |
ENA => ENA, |
ENB => ENB, |
WEA => WEA, |
WEB => WEB, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
DIA => DIA, |
DIB => DIB, |
DOA => DOA, |
DOB => DOB |
); |
|
end syn; |
-- $Id: ram_2swsr_rfirst_gen_unisim.vhd 641 2015-02-01 22:12:15Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_rfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-before-write' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.1 use now ram_2swsr_xfirst_gen_unisim |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_2swsr_rfirst_gen is -- RAM, 2 sync r/w ports, read first |
generic ( |
AWIDTH : positive := 13; -- address port width 11/9 or 13/8 |
DWIDTH : positive := 8); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_rfirst_gen; |
|
|
architecture syn of ram_2swsr_rfirst_gen is |
begin |
|
UMEM: ram_2swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "READ_FIRST") |
port map ( |
CLKA => CLKA, |
CLKB => CLKB, |
ENA => ENA, |
ENB => ENB, |
WEA => WEA, |
WEB => WEB, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
DIA => DIA, |
DIB => DIB, |
DOA => DOA, |
DOB => DOB |
); |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swar_1ar_gen.vhd
1,89 → 1,89
-- $Id: ram_1swar_1ar_gen.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_1ar_gen - syn |
-- Description: Dual-Port RAM with with one synchronous write and two |
-- asynchronius read ports (as distributed RAM). |
-- The code is inspired by Xilinx example rams_09.vhd. The |
-- 'ram_style' attribute is set to 'distributed', this will |
-- force in XST a synthesis as distributed RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.2 now numeric_std clean |
-- 2008-03-08 123 1.0.1 use std_..._arith, not _unsigned; use unsigned() |
-- 2007-06-03 45 1.0 Initial version |
-- |
-- Some synthesis results: |
-- - 2010-06-03 ise 11.4 for xc3s1000-ft256-4: |
-- AWIDTH DWIDTH LUTl LUTm Comments |
-- 4 16 - 32 16*RAM16X1D |
-- 5 16 34 64 32*RAM16X1D |
-- 6 16 68 128 64*RAM16X1D, 32*MUXF5 |
-- 7 16 136 256 128*RAM16X1D, 64*MUXF5, 32*MUXF6 |
-- 8 16 292 512 256*RAM16X1D,144*MUXF5, 64*MUXF6, 32*MUXF7 |
-- - 2007-12-31 ise 8.2.03 for xc3s1000-ft256-4: |
-- {same results as above for AW=4 and 6} |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swar_1ar_gen is -- RAM, 1 sync w asyn r + 1 asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable (port A) |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DI : in slv(DWIDTH-1 downto 0); -- data in (port A) |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_1swar_1ar_gen; |
|
|
architecture syn of ram_1swar_1ar_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (memsize-1 downto 0) of slv (DWIDTH-1 downto 0); |
signal RAM : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of RAM : signal is "distributed"; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if WE = '1' then |
RAM(to_integer(unsigned(ADDRA))) <= DI; |
end if; |
end if; |
end process proc_clk; |
|
DOA <= RAM(to_integer(unsigned(ADDRA))); |
DOB <= RAM(to_integer(unsigned(ADDRB))); |
|
end syn; |
-- $Id: ram_1swar_1ar_gen.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swar_1ar_gen - syn |
-- Description: Dual-Port RAM with with one synchronous write and two |
-- asynchronius read ports (as distributed RAM). |
-- The code is inspired by Xilinx example rams_09.vhd. The |
-- 'ram_style' attribute is set to 'distributed', this will |
-- force in XST a synthesis as distributed RAM. |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: generic Spartan, Virtex |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-11-08 422 1.0.2 now numeric_std clean |
-- 2008-03-08 123 1.0.1 use std_..._arith, not _unsigned; use unsigned() |
-- 2007-06-03 45 1.0 Initial version |
-- |
-- Some synthesis results: |
-- - 2010-06-03 ise 11.4 for xc3s1000-ft256-4: |
-- AWIDTH DWIDTH LUTl LUTm Comments |
-- 4 16 - 32 16*RAM16X1D |
-- 5 16 34 64 32*RAM16X1D |
-- 6 16 68 128 64*RAM16X1D, 32*MUXF5 |
-- 7 16 136 256 128*RAM16X1D, 64*MUXF5, 32*MUXF6 |
-- 8 16 292 512 256*RAM16X1D,144*MUXF5, 64*MUXF6, 32*MUXF7 |
-- - 2007-12-31 ise 8.2.03 for xc3s1000-ft256-4: |
-- {same results as above for AW=4 and 6} |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
use work.slvtypes.all; |
|
entity ram_1swar_1ar_gen is -- RAM, 1 sync w asyn r + 1 asyn r port |
generic ( |
AWIDTH : positive := 4; -- address port width |
DWIDTH : positive := 16); -- data port width |
port ( |
CLK : in slbit; -- clock |
WE : in slbit; -- write enable (port A) |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DI : in slv(DWIDTH-1 downto 0); -- data in (port A) |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_1swar_1ar_gen; |
|
|
architecture syn of ram_1swar_1ar_gen is |
constant memsize : positive := 2**AWIDTH; |
constant datzero : slv(DWIDTH-1 downto 0) := (others=>'0'); |
type ram_type is array (memsize-1 downto 0) of slv (DWIDTH-1 downto 0); |
signal RAM : ram_type := (others=>datzero); |
|
attribute ram_style : string; |
attribute ram_style of RAM : signal is "distributed"; |
|
begin |
|
proc_clk: process (CLK) |
begin |
if rising_edge(CLK) then |
if WE = '1' then |
RAM(to_integer(unsigned(ADDRA))) <= DI; |
end if; |
end if; |
end process proc_clk; |
|
DOA <= RAM(to_integer(unsigned(ADDRA))); |
DOB <= RAM(to_integer(unsigned(ADDRB))); |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swsr_wfirst_gen_unisim.vhd
1,70 → 1,70
-- $Id: ram_1swsr_wfirst_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_wfirst_gen - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- and 'read-through' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_1swsr_wfirst_gen is -- RAM, 1 sync r/w port, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address |
DI : in slv(DWIDTH-1 downto 0); -- data in |
DO : out slv(DWIDTH-1 downto 0) -- data out |
); |
end ram_1swsr_wfirst_gen; |
|
|
architecture syn of ram_1swsr_wfirst_gen is |
begin |
|
UMEM: ram_1swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "WRITE_FIRST") |
port map ( |
CLK => CLK, |
EN => EN, |
WE => WE, |
ADDR => ADDR, |
DI => DI, |
DO => DO |
); |
|
end syn; |
-- $Id: ram_1swsr_wfirst_gen_unisim.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_wfirst_gen - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- and 'read-through' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_1swsr_wfirst_gen is -- RAM, 1 sync r/w port, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address |
DI : in slv(DWIDTH-1 downto 0); -- data in |
DO : out slv(DWIDTH-1 downto 0) -- data out |
); |
end ram_1swsr_wfirst_gen; |
|
|
architecture syn of ram_1swsr_wfirst_gen is |
begin |
|
UMEM: ram_1swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "WRITE_FIRST") |
port map ( |
CLK => CLK, |
EN => EN, |
WE => WE, |
ADDR => ADDR, |
DI => DI, |
DO => DO |
); |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_1swsr_xfirst_gen_unisim.vhd
1,323 → 1,323
-- $Id: ram_1swsr_xfirst_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_xfirst_gen_unisim - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-08-14 406 1.0.2 cleaner code for L_DI initialization |
-- 2008-04-13 135 1.0.1 fix range error for AW_14_S1 |
-- 2008-03-08 123 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swsr_xfirst_gen_unisim is -- RAM, 1 sync r/w ports |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9; -- data port width |
WRITE_MODE : string := "READ_FIRST"); -- write mode: (READ|WRITE)_FIRST |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address |
DI : in slv(DWIDTH-1 downto 0); -- data in |
DO : out slv(DWIDTH-1 downto 0) -- data out |
); |
end ram_1swsr_xfirst_gen_unisim; |
|
|
architecture syn of ram_1swsr_xfirst_gen_unisim is |
|
constant ok_mod32 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+35)/36)=((DWIDTH+31)/32); |
constant ok_mod16 : boolean := (DWIDTH mod 16)=0 and |
((DWIDTH+17)/18)=((DWIDTH+16)/16); |
constant ok_mod08 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+8)/9)=((DWIDTH+7)/8); |
|
begin |
|
assert AWIDTH>=9 and AWIDTH<=14 |
report "assert(AWIDTH>=9 and AWIDTH<=14): unsupported BRAM from factor" |
severity failure; |
|
AW_09_S36: if AWIDTH=9 and not ok_mod32 generate |
constant dw_mem : positive := ((DWIDTH+35)/36)*36; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/36-1 downto 0 generate |
MEM : RAMB16_S36 |
generic map ( |
INIT => O"000000000000", |
SRVAL => O"000000000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(36*i+31 downto 36*i), |
DOP => L_DO(36*i+35 downto 36*i+32), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(36*i+31 downto 36*i), |
DIP => L_DI(36*i+35 downto 36*i+32), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_09_S36; |
|
AW_09_S32: if AWIDTH=9 and ok_mod32 generate |
GL: for i in DWIDTH/32-1 downto 0 generate |
MEM : RAMB16_S36 |
generic map ( |
INIT => X"00000000", |
SRVAL => X"00000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(32*i+31 downto 32*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(32*i+31 downto 32*i), |
DIP => "0000", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_09_S32; |
|
AW_10_S18: if AWIDTH=10 and not ok_mod16 generate |
constant dw_mem : positive := ((DWIDTH+17)/18)*18; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/18-1 downto 0 generate |
MEM : RAMB16_S18 |
generic map ( |
INIT => O"000000", |
SRVAL => O"000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(18*i+15 downto 18*i), |
DOP => L_DO(18*i+17 downto 18*i+16), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(18*i+15 downto 18*i), |
DIP => L_DI(18*i+17 downto 18*i+16), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_10_S18; |
|
AW_10_S16: if AWIDTH=10 and ok_mod16 generate |
GL: for i in DWIDTH/16-1 downto 0 generate |
MEM : RAMB16_S18 |
generic map ( |
INIT => X"0000", |
SRVAL => X"0000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(16*i+15 downto 16*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(16*i+15 downto 16*i), |
DIP => "00", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_10_S16; |
|
AW_11_S9: if AWIDTH=11 and not ok_mod08 generate |
constant dw_mem : positive := ((DWIDTH+8)/9)*9; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/9-1 downto 0 generate |
MEM : RAMB16_S9 |
generic map ( |
INIT => O"000", |
SRVAL => O"000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(9*i+7 downto 9*i), |
DOP => L_DO(9*i+8 downto 9*i+8), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(9*i+7 downto 9*i), |
DIP => L_DI(9*i+8 downto 9*i+8), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_11_S9; |
|
AW_11_S8: if AWIDTH=11 and ok_mod08 generate |
GL: for i in DWIDTH/8-1 downto 0 generate |
MEM : RAMB16_S9 |
generic map ( |
INIT => X"00", |
SRVAL => X"00", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(8*i+7 downto 8*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(8*i+7 downto 8*i), |
DIP => "0", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_11_S8; |
|
AW_12_S4: if AWIDTH = 12 generate |
constant dw_mem : positive := ((DWIDTH+3)/4)*4; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/4-1 downto 0 generate |
MEM : RAMB16_S4 |
generic map ( |
INIT => X"0", |
SRVAL => X"0", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(4*i+3 downto 4*i), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(4*i+3 downto 4*i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_12_S4; |
|
AW_13_S2: if AWIDTH = 13 generate |
constant dw_mem : positive := ((DWIDTH+1)/2)*2; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/2-1 downto 0 generate |
MEM : RAMB16_S2 |
generic map ( |
INIT => "00", |
SRVAL => "00", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(2*i+1 downto 2*i), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(2*i+1 downto 2*i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_13_S2; |
|
AW_14_S1: if AWIDTH = 14 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAMB16_S1 |
generic map ( |
INIT => "0", |
SRVAL => "0", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(i downto i), |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(i downto i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_14_S1; |
|
|
end syn; |
|
-- Note: in XST 8.2 the defaults for INIT_(A|B) and SRVAL_(A|B) are |
-- nonsense: INIT_A : bit_vector := X"000"; |
-- This is a 12 bit value, while a 9 bit one is needed. Thus the |
-- explicit definition above. |
-- $Id: ram_1swsr_xfirst_gen_unisim.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2008-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_1swsr_xfirst_gen_unisim - syn |
-- Description: Single-Port RAM with with one synchronous read/write port |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-08-14 406 1.0.2 cleaner code for L_DI initialization |
-- 2008-04-13 135 1.0.1 fix range error for AW_14_S1 |
-- 2008-03-08 123 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_1swsr_xfirst_gen_unisim is -- RAM, 1 sync r/w ports |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9; -- data port width |
WRITE_MODE : string := "READ_FIRST"); -- write mode: (READ|WRITE)_FIRST |
port( |
CLK : in slbit; -- clock |
EN : in slbit; -- enable |
WE : in slbit; -- write enable |
ADDR : in slv(AWIDTH-1 downto 0); -- address |
DI : in slv(DWIDTH-1 downto 0); -- data in |
DO : out slv(DWIDTH-1 downto 0) -- data out |
); |
end ram_1swsr_xfirst_gen_unisim; |
|
|
architecture syn of ram_1swsr_xfirst_gen_unisim is |
|
constant ok_mod32 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+35)/36)=((DWIDTH+31)/32); |
constant ok_mod16 : boolean := (DWIDTH mod 16)=0 and |
((DWIDTH+17)/18)=((DWIDTH+16)/16); |
constant ok_mod08 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+8)/9)=((DWIDTH+7)/8); |
|
begin |
|
assert AWIDTH>=9 and AWIDTH<=14 |
report "assert(AWIDTH>=9 and AWIDTH<=14): unsupported BRAM from factor" |
severity failure; |
|
AW_09_S36: if AWIDTH=9 and not ok_mod32 generate |
constant dw_mem : positive := ((DWIDTH+35)/36)*36; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/36-1 downto 0 generate |
MEM : RAMB16_S36 |
generic map ( |
INIT => O"000000000000", |
SRVAL => O"000000000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(36*i+31 downto 36*i), |
DOP => L_DO(36*i+35 downto 36*i+32), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(36*i+31 downto 36*i), |
DIP => L_DI(36*i+35 downto 36*i+32), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_09_S36; |
|
AW_09_S32: if AWIDTH=9 and ok_mod32 generate |
GL: for i in DWIDTH/32-1 downto 0 generate |
MEM : RAMB16_S36 |
generic map ( |
INIT => X"00000000", |
SRVAL => X"00000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(32*i+31 downto 32*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(32*i+31 downto 32*i), |
DIP => "0000", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_09_S32; |
|
AW_10_S18: if AWIDTH=10 and not ok_mod16 generate |
constant dw_mem : positive := ((DWIDTH+17)/18)*18; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/18-1 downto 0 generate |
MEM : RAMB16_S18 |
generic map ( |
INIT => O"000000", |
SRVAL => O"000000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(18*i+15 downto 18*i), |
DOP => L_DO(18*i+17 downto 18*i+16), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(18*i+15 downto 18*i), |
DIP => L_DI(18*i+17 downto 18*i+16), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_10_S18; |
|
AW_10_S16: if AWIDTH=10 and ok_mod16 generate |
GL: for i in DWIDTH/16-1 downto 0 generate |
MEM : RAMB16_S18 |
generic map ( |
INIT => X"0000", |
SRVAL => X"0000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(16*i+15 downto 16*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(16*i+15 downto 16*i), |
DIP => "00", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_10_S16; |
|
AW_11_S9: if AWIDTH=11 and not ok_mod08 generate |
constant dw_mem : positive := ((DWIDTH+8)/9)*9; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/9-1 downto 0 generate |
MEM : RAMB16_S9 |
generic map ( |
INIT => O"000", |
SRVAL => O"000", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(9*i+7 downto 9*i), |
DOP => L_DO(9*i+8 downto 9*i+8), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(9*i+7 downto 9*i), |
DIP => L_DI(9*i+8 downto 9*i+8), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_11_S9; |
|
AW_11_S8: if AWIDTH=11 and ok_mod08 generate |
GL: for i in DWIDTH/8-1 downto 0 generate |
MEM : RAMB16_S9 |
generic map ( |
INIT => X"00", |
SRVAL => X"00", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(8*i+7 downto 8*i), |
DOP => open, |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(8*i+7 downto 8*i), |
DIP => "0", |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_11_S8; |
|
AW_12_S4: if AWIDTH = 12 generate |
constant dw_mem : positive := ((DWIDTH+3)/4)*4; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/4-1 downto 0 generate |
MEM : RAMB16_S4 |
generic map ( |
INIT => X"0", |
SRVAL => X"0", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(4*i+3 downto 4*i), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(4*i+3 downto 4*i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_12_S4; |
|
AW_13_S2: if AWIDTH = 13 generate |
constant dw_mem : positive := ((DWIDTH+1)/2)*2; |
signal L_DO : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DI : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DI(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DI(DI'range) <= DI; |
|
GL: for i in dw_mem/2-1 downto 0 generate |
MEM : RAMB16_S2 |
generic map ( |
INIT => "00", |
SRVAL => "00", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => L_DO(2*i+1 downto 2*i), |
ADDR => ADDR, |
CLK => CLK, |
DI => L_DI(2*i+1 downto 2*i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
|
DO <= L_DO(DO'range); |
|
end generate AW_13_S2; |
|
AW_14_S1: if AWIDTH = 14 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAMB16_S1 |
generic map ( |
INIT => "0", |
SRVAL => "0", |
WRITE_MODE => WRITE_MODE) |
port map ( |
DO => DO(i downto i), |
ADDR => ADDR, |
CLK => CLK, |
DI => DI(i downto i), |
EN => EN, |
SSR => '0', |
WE => WE |
); |
end generate GL; |
end generate AW_14_S1; |
|
|
end syn; |
|
-- Note: in XST 8.2 the defaults for INIT_(A|B) and SRVAL_(A|B) are |
-- nonsense: INIT_A : bit_vector := X"000"; |
-- This is a 12 bit value, while a 9 bit one is needed. Thus the |
-- explicit definition above. |
/trunk/rtl/vlib/memlib/ram_2swsr_wfirst_gen_unisim.vhd
1,83 → 1,83
-- $Id: ram_2swsr_wfirst_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_wfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-through' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.1 use now ram_2swsr_xfirst_gen_unisim |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_2swsr_wfirst_gen is -- RAM, 2 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_wfirst_gen; |
|
|
architecture syn of ram_2swsr_wfirst_gen is |
begin |
|
UMEM: ram_2swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "WRITE_FIRST") |
port map ( |
CLKA => CLKA, |
CLKB => CLKB, |
ENA => ENA, |
ENB => ENB, |
WEA => WEA, |
WEB => WEB, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
DIA => DIA, |
DIB => DIB, |
DOA => DOA, |
DOB => DOB |
); |
|
end syn; |
-- $Id: ram_2swsr_wfirst_gen_unisim.vhd 649 2015-02-21 21:10:16Z mueller $ |
-- |
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_wfirst_gen - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- and 'read-through' semantics (as block RAM). |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2008-03-08 123 1.1 use now ram_2swsr_xfirst_gen_unisim |
-- 2008-03-02 122 1.0 Initial version |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
use work.memlib.all; |
|
entity ram_2swsr_wfirst_gen is -- RAM, 2 sync r/w ports, write first |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9); -- data port width |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_wfirst_gen; |
|
|
architecture syn of ram_2swsr_wfirst_gen is |
begin |
|
UMEM: ram_2swsr_xfirst_gen_unisim |
generic map ( |
AWIDTH => AWIDTH, |
DWIDTH => DWIDTH, |
WRITE_MODE => "WRITE_FIRST") |
port map ( |
CLKA => CLKA, |
CLKB => CLKB, |
ENA => ENA, |
ENB => ENB, |
WEA => WEA, |
WEB => WEB, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
DIA => DIA, |
DIB => DIB, |
DOA => DOA, |
DOB => DOB |
); |
|
end syn; |
/trunk/rtl/vlib/memlib/ram_2swsr_xfirst_gen_unisim.vhd
1,456 → 1,456
-- $Id: ram_2swsr_xfirst_gen_unisim.vhd 686 2015-06-04 21:08:08Z mueller $ |
-- |
-- Copyright 2008-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_xfirst_gen_unisim - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-08-14 406 1.0.2 cleaner code for L_DI(A|B) initialization |
-- 2008-04-13 135 1.0.1 fix range error for AW_14_S1 |
-- 2008-03-08 123 1.0 Initial version (merged from _rfirst/_wfirst) |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_xfirst_gen_unisim is -- RAM, 2 sync r/w ports |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9; -- data port width |
WRITE_MODE : string := "READ_FIRST"); -- write mode: (READ|WRITE)_FIRST |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_xfirst_gen_unisim; |
|
|
architecture syn of ram_2swsr_xfirst_gen_unisim is |
|
constant ok_mod32 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+35)/36)=((DWIDTH+31)/32); |
constant ok_mod16 : boolean := (DWIDTH mod 16)=0 and |
((DWIDTH+17)/18)=((DWIDTH+16)/16); |
constant ok_mod08 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+8)/9)=((DWIDTH+7)/8); |
|
begin |
|
assert AWIDTH>=9 and AWIDTH<=14 |
report "assert(AWIDTH>=9 and AWIDTH<=14): unsupported BRAM from factor" |
severity failure; |
|
AW_09_S36: if AWIDTH=9 and not ok_mod32 generate |
constant dw_mem : positive := ((DWIDTH+35)/36)*36; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/36-1 downto 0 generate |
MEM : RAMB16_S36_S36 |
generic map ( |
INIT_A => O"000000000000", |
INIT_B => O"000000000000", |
SRVAL_A => O"000000000000", |
SRVAL_B => O"000000000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(36*i+31 downto 36*i), |
DOB => L_DOB(36*i+31 downto 36*i), |
DOPA => L_DOA(36*i+35 downto 36*i+32), |
DOPB => L_DOB(36*i+35 downto 36*i+32), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(36*i+31 downto 36*i), |
DIB => L_DIB(36*i+31 downto 36*i), |
DIPA => L_DIA(36*i+35 downto 36*i+32), |
DIPB => L_DIB(36*i+35 downto 36*i+32), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_09_S36; |
|
AW_09_S32: if AWIDTH=9 and ok_mod32 generate |
GL: for i in DWIDTH/32-1 downto 0 generate |
MEM : RAMB16_S36_S36 |
generic map ( |
INIT_A => X"00000000", |
INIT_B => X"00000000", |
SRVAL_A => X"00000000", |
SRVAL_B => X"00000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(32*i+31 downto 32*i), |
DOB => DOB(32*i+31 downto 32*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(32*i+31 downto 32*i), |
DIB => DIB(32*i+31 downto 32*i), |
DIPA => "0000", |
DIPB => "0000", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_09_S32; |
|
AW_10_S18: if AWIDTH=10 and not ok_mod16 generate |
constant dw_mem : positive := ((DWIDTH+17)/18)*18; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/18-1 downto 0 generate |
MEM : RAMB16_S18_S18 |
generic map ( |
INIT_A => O"000000", |
INIT_B => O"000000", |
SRVAL_A => O"000000", |
SRVAL_B => O"000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(18*i+15 downto 18*i), |
DOB => L_DOB(18*i+15 downto 18*i), |
DOPA => L_DOA(18*i+17 downto 18*i+16), |
DOPB => L_DOB(18*i+17 downto 18*i+16), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(18*i+15 downto 18*i), |
DIB => L_DIB(18*i+15 downto 18*i), |
DIPA => L_DIA(18*i+17 downto 18*i+16), |
DIPB => L_DIB(18*i+17 downto 18*i+16), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_10_S18; |
|
AW_10_S16: if AWIDTH=10 and ok_mod16 generate |
GL: for i in DWIDTH/16-1 downto 0 generate |
MEM : RAMB16_S18_S18 |
generic map ( |
INIT_A => X"0000", |
INIT_B => X"0000", |
SRVAL_A => X"0000", |
SRVAL_B => X"0000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(16*i+15 downto 16*i), |
DOB => DOB(16*i+15 downto 16*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(16*i+15 downto 16*i), |
DIB => DIB(16*i+15 downto 16*i), |
DIPA => "00", |
DIPB => "00", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_10_S16; |
|
AW_11_S9: if AWIDTH=11 and not ok_mod08 generate |
constant dw_mem : positive := ((DWIDTH+8)/9)*9; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/9-1 downto 0 generate |
MEM : RAMB16_S9_S9 |
generic map ( |
INIT_A => O"000", |
INIT_B => O"000", |
SRVAL_A => O"000", |
SRVAL_B => O"000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(9*i+7 downto 9*i), |
DOB => L_DOB(9*i+7 downto 9*i), |
DOPA => L_DOA(9*i+8 downto 9*i+8), |
DOPB => L_DOB(9*i+8 downto 9*i+8), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(9*i+7 downto 9*i), |
DIB => L_DIB(9*i+7 downto 9*i), |
DIPA => L_DIA(9*i+8 downto 9*i+8), |
DIPB => L_DIB(9*i+8 downto 9*i+8), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_11_S9; |
|
AW_11_S8: if AWIDTH=11 and ok_mod08 generate |
GL: for i in DWIDTH/8-1 downto 0 generate |
MEM : RAMB16_S9_S9 |
generic map ( |
INIT_A => X"00", |
INIT_B => X"00", |
SRVAL_A => X"00", |
SRVAL_B => X"00", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(8*i+7 downto 8*i), |
DOB => DOB(8*i+7 downto 8*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(8*i+7 downto 8*i), |
DIB => DIB(8*i+7 downto 8*i), |
DIPA => "0", |
DIPB => "0", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_11_S8; |
|
AW_12_S4: if AWIDTH = 12 generate |
constant dw_mem : positive := ((DWIDTH+3)/4)*4; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/4-1 downto 0 generate |
MEM : RAMB16_S4_S4 |
generic map ( |
INIT_A => X"0", |
INIT_B => X"0", |
SRVAL_A => X"0", |
SRVAL_B => X"0", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(4*i+3 downto 4*i), |
DOB => L_DOB(4*i+3 downto 4*i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(4*i+3 downto 4*i), |
DIB => L_DIB(4*i+3 downto 4*i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_12_S4; |
|
AW_13_S2: if AWIDTH = 13 generate |
constant dw_mem : positive := ((DWIDTH+1)/2)*2; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/2-1 downto 0 generate |
MEM : RAMB16_S2_S2 |
generic map ( |
INIT_A => "00", |
INIT_B => "00", |
SRVAL_A => "00", |
SRVAL_B => "00", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(2*i+1 downto 2*i), |
DOB => L_DOB(2*i+1 downto 2*i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(2*i+1 downto 2*i), |
DIB => L_DIB(2*i+1 downto 2*i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_13_S2; |
|
AW_14_S1: if AWIDTH = 14 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAMB16_S1_S1 |
generic map ( |
INIT_A => "0", |
INIT_B => "0", |
SRVAL_A => "0", |
SRVAL_B => "0", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(i downto i), |
DOB => DOB(i downto i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(i downto i), |
DIB => DIB(i downto i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_14_S1; |
|
|
end syn; |
|
-- Note: in XST 8.2 the defaults for INIT_(A|B) and SRVAL_(A|B) are |
-- nonsense: INIT_A : bit_vector := X"000"; |
-- This is a 12 bit value, while a 9 bit one is needed. Thus the |
-- explicit definition above. |
-- $Id: ram_2swsr_xfirst_gen_unisim.vhd 641 2015-02-01 22:12:15Z mueller $ |
-- |
-- Copyright 2008-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
-- |
-- This program is free software; you may redistribute and/or modify it under |
-- the terms of the GNU General Public License as published by the Free |
-- Software Foundation, either version 2, 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 complete details. |
-- |
------------------------------------------------------------------------------ |
-- Module Name: ram_2swsr_xfirst_gen_unisim - syn |
-- Description: Dual-Port RAM with with two synchronous read/write ports |
-- Direct instantiation of Xilinx UNISIM primitives |
-- |
-- Dependencies: - |
-- Test bench: - |
-- Target Devices: Spartan-3, Virtex-2,-4 |
-- Tool versions: ise 8.1-14.7; viv 2014.4; ghdl 0.18-0.31 |
-- Revision History: |
-- Date Rev Version Comment |
-- 2011-08-14 406 1.0.2 cleaner code for L_DI(A|B) initialization |
-- 2008-04-13 135 1.0.1 fix range error for AW_14_S1 |
-- 2008-03-08 123 1.0 Initial version (merged from _rfirst/_wfirst) |
------------------------------------------------------------------------------ |
|
library ieee; |
use ieee.std_logic_1164.all; |
|
library unisim; |
use unisim.vcomponents.ALL; |
|
use work.slvtypes.all; |
|
entity ram_2swsr_xfirst_gen_unisim is -- RAM, 2 sync r/w ports |
generic ( |
AWIDTH : positive := 11; -- address port width |
DWIDTH : positive := 9; -- data port width |
WRITE_MODE : string := "READ_FIRST"); -- write mode: (READ|WRITE)_FIRST |
port( |
CLKA : in slbit; -- clock port A |
CLKB : in slbit; -- clock port B |
ENA : in slbit; -- enable port A |
ENB : in slbit; -- enable port B |
WEA : in slbit; -- write enable port A |
WEB : in slbit; -- write enable port B |
ADDRA : in slv(AWIDTH-1 downto 0); -- address port A |
ADDRB : in slv(AWIDTH-1 downto 0); -- address port B |
DIA : in slv(DWIDTH-1 downto 0); -- data in port A |
DIB : in slv(DWIDTH-1 downto 0); -- data in port B |
DOA : out slv(DWIDTH-1 downto 0); -- data out port A |
DOB : out slv(DWIDTH-1 downto 0) -- data out port B |
); |
end ram_2swsr_xfirst_gen_unisim; |
|
|
architecture syn of ram_2swsr_xfirst_gen_unisim is |
|
constant ok_mod32 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+35)/36)=((DWIDTH+31)/32); |
constant ok_mod16 : boolean := (DWIDTH mod 16)=0 and |
((DWIDTH+17)/18)=((DWIDTH+16)/16); |
constant ok_mod08 : boolean := (DWIDTH mod 32)=0 and |
((DWIDTH+8)/9)=((DWIDTH+7)/8); |
|
begin |
|
assert AWIDTH>=9 and AWIDTH<=14 |
report "assert(AWIDTH>=9 and AWIDTH<=14): unsupported BRAM from factor" |
severity failure; |
|
AW_09_S36: if AWIDTH=9 and not ok_mod32 generate |
constant dw_mem : positive := ((DWIDTH+35)/36)*36; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/36-1 downto 0 generate |
MEM : RAMB16_S36_S36 |
generic map ( |
INIT_A => O"000000000000", |
INIT_B => O"000000000000", |
SRVAL_A => O"000000000000", |
SRVAL_B => O"000000000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(36*i+31 downto 36*i), |
DOB => L_DOB(36*i+31 downto 36*i), |
DOPA => L_DOA(36*i+35 downto 36*i+32), |
DOPB => L_DOB(36*i+35 downto 36*i+32), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(36*i+31 downto 36*i), |
DIB => L_DIB(36*i+31 downto 36*i), |
DIPA => L_DIA(36*i+35 downto 36*i+32), |
DIPB => L_DIB(36*i+35 downto 36*i+32), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_09_S36; |
|
AW_09_S32: if AWIDTH=9 and ok_mod32 generate |
GL: for i in DWIDTH/32-1 downto 0 generate |
MEM : RAMB16_S36_S36 |
generic map ( |
INIT_A => X"00000000", |
INIT_B => X"00000000", |
SRVAL_A => X"00000000", |
SRVAL_B => X"00000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(32*i+31 downto 32*i), |
DOB => DOB(32*i+31 downto 32*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(32*i+31 downto 32*i), |
DIB => DIB(32*i+31 downto 32*i), |
DIPA => "0000", |
DIPB => "0000", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_09_S32; |
|
AW_10_S18: if AWIDTH=10 and not ok_mod16 generate |
constant dw_mem : positive := ((DWIDTH+17)/18)*18; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/18-1 downto 0 generate |
MEM : RAMB16_S18_S18 |
generic map ( |
INIT_A => O"000000", |
INIT_B => O"000000", |
SRVAL_A => O"000000", |
SRVAL_B => O"000000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(18*i+15 downto 18*i), |
DOB => L_DOB(18*i+15 downto 18*i), |
DOPA => L_DOA(18*i+17 downto 18*i+16), |
DOPB => L_DOB(18*i+17 downto 18*i+16), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(18*i+15 downto 18*i), |
DIB => L_DIB(18*i+15 downto 18*i), |
DIPA => L_DIA(18*i+17 downto 18*i+16), |
DIPB => L_DIB(18*i+17 downto 18*i+16), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_10_S18; |
|
AW_10_S16: if AWIDTH=10 and ok_mod16 generate |
GL: for i in DWIDTH/16-1 downto 0 generate |
MEM : RAMB16_S18_S18 |
generic map ( |
INIT_A => X"0000", |
INIT_B => X"0000", |
SRVAL_A => X"0000", |
SRVAL_B => X"0000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(16*i+15 downto 16*i), |
DOB => DOB(16*i+15 downto 16*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(16*i+15 downto 16*i), |
DIB => DIB(16*i+15 downto 16*i), |
DIPA => "00", |
DIPB => "00", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_10_S16; |
|
AW_11_S9: if AWIDTH=11 and not ok_mod08 generate |
constant dw_mem : positive := ((DWIDTH+8)/9)*9; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/9-1 downto 0 generate |
MEM : RAMB16_S9_S9 |
generic map ( |
INIT_A => O"000", |
INIT_B => O"000", |
SRVAL_A => O"000", |
SRVAL_B => O"000", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(9*i+7 downto 9*i), |
DOB => L_DOB(9*i+7 downto 9*i), |
DOPA => L_DOA(9*i+8 downto 9*i+8), |
DOPB => L_DOB(9*i+8 downto 9*i+8), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(9*i+7 downto 9*i), |
DIB => L_DIB(9*i+7 downto 9*i), |
DIPA => L_DIA(9*i+8 downto 9*i+8), |
DIPB => L_DIB(9*i+8 downto 9*i+8), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_11_S9; |
|
AW_11_S8: if AWIDTH=11 and ok_mod08 generate |
GL: for i in DWIDTH/8-1 downto 0 generate |
MEM : RAMB16_S9_S9 |
generic map ( |
INIT_A => X"00", |
INIT_B => X"00", |
SRVAL_A => X"00", |
SRVAL_B => X"00", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(8*i+7 downto 8*i), |
DOB => DOB(8*i+7 downto 8*i), |
DOPA => open, |
DOPB => open, |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(8*i+7 downto 8*i), |
DIB => DIB(8*i+7 downto 8*i), |
DIPA => "0", |
DIPB => "0", |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_11_S8; |
|
AW_12_S4: if AWIDTH = 12 generate |
constant dw_mem : positive := ((DWIDTH+3)/4)*4; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/4-1 downto 0 generate |
MEM : RAMB16_S4_S4 |
generic map ( |
INIT_A => X"0", |
INIT_B => X"0", |
SRVAL_A => X"0", |
SRVAL_B => X"0", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(4*i+3 downto 4*i), |
DOB => L_DOB(4*i+3 downto 4*i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(4*i+3 downto 4*i), |
DIB => L_DIB(4*i+3 downto 4*i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_12_S4; |
|
AW_13_S2: if AWIDTH = 13 generate |
constant dw_mem : positive := ((DWIDTH+1)/2)*2; |
signal L_DOA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DOB : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIA : slv(dw_mem-1 downto 0) := (others=> '0'); |
signal L_DIB : slv(dw_mem-1 downto 0) := (others=> '0'); |
begin |
|
DI_PAD: if dw_mem>DWIDTH generate |
L_DIA(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
L_DIB(dw_mem-1 downto DWIDTH) <= (others=>'0'); |
end generate DI_PAD; |
L_DIA(DIA'range) <= DIA; |
L_DIB(DIB'range) <= DIB; |
|
GL: for i in dw_mem/2-1 downto 0 generate |
MEM : RAMB16_S2_S2 |
generic map ( |
INIT_A => "00", |
INIT_B => "00", |
SRVAL_A => "00", |
SRVAL_B => "00", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => L_DOA(2*i+1 downto 2*i), |
DOB => L_DOB(2*i+1 downto 2*i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => L_DIA(2*i+1 downto 2*i), |
DIB => L_DIB(2*i+1 downto 2*i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
|
DOA <= L_DOA(DOA'range); |
DOB <= L_DOB(DOB'range); |
|
end generate AW_13_S2; |
|
AW_14_S1: if AWIDTH = 14 generate |
GL: for i in DWIDTH-1 downto 0 generate |
MEM : RAMB16_S1_S1 |
generic map ( |
INIT_A => "0", |
INIT_B => "0", |
SRVAL_A => "0", |
SRVAL_B => "0", |
WRITE_MODE_A => WRITE_MODE, |
WRITE_MODE_B => WRITE_MODE) |
port map ( |
DOA => DOA(i downto i), |
DOB => DOB(i downto i), |
ADDRA => ADDRA, |
ADDRB => ADDRB, |
CLKA => CLKA, |
CLKB => CLKB, |
DIA => DIA(i downto i), |
DIB => DIB(i downto i), |
ENA => ENA, |
ENB => ENB, |
SSRA => '0', |
SSRB => '0', |
WEA => WEA, |
WEB => WEB |
); |
end generate GL; |
end generate AW_14_S1; |
|
|
end syn; |
|
-- Note: in XST 8.2 the defaults for INIT_(A|B) and SRVAL_(A|B) are |
-- nonsense: INIT_A : bit_vector := X"000"; |
-- This is a 12 bit value, while a 9 bit one is needed. Thus the |
-- explicit definition above. |
/trunk/doc/FILES.txt
1,4 → 1,4
$Id: FILES.txt 681 2015-05-14 17:37:00Z mueller $ |
$Id: FILES.txt 645 2015-02-13 21:44:03Z mueller $ |
|
Short description of the directory layout, what is where ? |
|
/trunk/doc/README_known_issues.txt
1,17 → 1,8
$Id: README_known_issues.txt 687 2015-06-05 09:03:34Z mueller $ |
$Id: README_known_issues.txt 680 2015-05-14 13:29:46Z mueller $ |
|
Known issues for this release. |
The case id indicates the release when the issue was first recognized. |
|
- V0.66-1: the TM11 controller transfers data byte wise (all disk do it 16bit |
word wise) and allows for odd byte length transfers. Odd length transfers |
are currently not supported and rejected as invalid command. Odd byte |
length records aren't used by OS, if at all, so in practice this limitation |
isn't relevant. |
- V0.66-2: using two RP06 drives in parallel under 211bsd leads to a hangup of |
the system after a short time. Currently only operation of a single drive |
works reliably. |
|
- V0.65-1: ti_rri sometimes crashes in normal rundown (exit or ^D) when |
a cuff: type rlink is active. One gets |
terminate called after throwing an instance of 'Retro::Rexception' |
31,7 → 22,7
- V0.64-4: No support for the Vivado simulator (xsim) yet. With ghdl only |
functional simulations, post synthesis (_ssim) fails to compile. |
- V0.64-3: Highest baud rate with basys3 and nexys4 is 10 MBaud. 10 MBaud is |
not supported according to FTDI, but works. 12 MBaud in an upcoming release. |
not supported according to FTDI, but works. 12 MBaud in next release. |
- V0.64-2: rlink throughput on basys3/nexys4 limited by serial port stack |
round trip times. Will be overcome by libusb based custom driver. |
- V0.64-1: The large default transfer size for disk accesses leads to bad |
/trunk/doc/w11a_tb_guide.txt
1,4 → 1,4
# $Id: w11a_tb_guide.txt 687 2015-06-05 09:03:34Z mueller $ |
# $Id: w11a_tb_guide.txt 660 2015-03-29 22:10:16Z mueller $ |
|
Note: Only ISE based test benches are currently documented ! |
The Vivado test environemnt is still in it's infancy ! |
259,12 → 259,7
|
cd $RETROBASE/rtl/sys_gen/w11a/nexys2/tb |
tbrun_tbwrri --lsuf tbench_dsim --pack rw11 --cuff tb_w11a_n2 \ |
"rw11::setup_cpu" "rw11::tbench @cpu_all.dat" |
-> 2847860.0 ns 142382: DONE |
-> real 0m33.013s user 0m31.870s sys 0m0.569s |
"rw11::setup_cpu" "rw11::tbench @w11a_all.dat" |
-> 2638820.0 ns 131930: DONE |
-> real 0m24.890s user 0m25.286s sys 0m0.439s |
|
tbrun_tbwrri --lsuf tbench_dsim --pack rw11 --cuff tb_w11a_n2 \ |
"rw11::setup_cpu" "rw11::tbench @dev_all.dat" |
-> 1058440.0 ns 52911: DONE |
-> real 0m15.249s user 0m15.195s sys 0m0.236s |
|
/trunk/doc/man/man1/tap2file.1
File deleted
/trunk/doc/man/man1/file2tap.1
File deleted
/trunk/doc/man/man1/create_disk.1
1,11 → 1,11
.\" -*- nroff -*- |
.\" $Id: create_disk.1 686 2015-06-04 21:08:08Z mueller $ |
.\" $Id: create_disk.1 622 2014-12-28 20:45:26Z mueller $ |
.\" |
.\" Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
.\" Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de> |
.\" |
.\" ------------------------------------------------------------------ |
. |
.TH CREATE_DISK 1 2015-06-04 "Retro Project" "Retro Project Manual" |
.TH CREATE_DISK 1 2013-05-20 "Retro Project" "Retro Project Manual" |
.\" ------------------------------------------------------------------ |
.SH NAME |
create_disk \- create disk container file for ti_w11 |
43,16 → 43,11
determines whether the container file will be initialized with specific |
data pattern. Note that the \fB\-\-bad\fP and \fB\-\-boot\fP options will |
overwrite the last track or the first sector(s) respectively. |
The default without \fB\-\-ini\fR is to create a container with all zero data. |
It is implemented by writing a single zero byte after positioning with |
\fBlseek\fR(2) to the desired end. This creates a file with 'holes' and defers |
the actual allocation of disk space to the point when sectors are written. |
Allowed values for \fIpat\fP are |
.RS |
.IP \fBzero\fP |
creates a disk with all sectors zero'ed. In this case zero's are explicitely |
written. The explicit allocation of disk space is the main effect of this |
option. |
creates a disk with all sectors zero'ed. This is the default when no |
\fB\-\-ini\fP option is given. |
.IP \fBones\fP |
creates a disk with all data bytes set to 0xff. |
.IP \fBdead\fP |
/trunk/doc/README.txt
1,4 → 1,4
$Id: README.txt 687 2015-06-05 09:03:34Z mueller $ |
$Id: README.txt 680 2015-05-14 13:29:46Z mueller $ |
|
Release notes for w11a |
|
22,77 → 22,6
|
2. Change Log ---------------------------------------------------------------- |
|
- trunk (2015-06-05: svn rev 31(oc) 687(wfjm); untagged w11a_V0.66) +++++++++ |
- Preface |
|
- Since the previous release a full set of small, medium and large sized |
disks (RK,RL,RP/RM) is available, covering all use cases. Still missing |
was a tape system, which allows to install systems from distribution tapes |
but is also very handy for data exchange. This release adds a TM11/TU10 |
tape controller emulation. This is much simpler to implement than a |
massbus based TU16 or TU78 controller. Because storage is emulated there |
is neither a speed nor a capacity advantage of 1600 or 6250 bpi drives, |
so for all practical purposes the simple 800 bpi TU10 drive emulation is |
fully adequate. |
The TM11/TU10 was tested under 211bsd with creating a tape distribution |
kit and building a RP06 based system from such a tape. A 211bsd_tm |
oskit is provided with a recipe to restore a RP06 from tape. |
|
- bug fixes |
- the ti_rri event loop aborted under heavy load with three devices, seen |
when RP disk, TM tape and DL11 run simultaneously. Was caused by a race |
condition in attention handling and dispatching. |
- the boot command failed when cpu was running and the unit not decoded |
properly, so boots from units other then 0 failed. |
|
- Summary |
- added TM11/TU10 tape support |
|
- New features |
- new modules |
- rtl/ibus/ibdr_rm11 - ibus controller for RM11 |
- tools/bin |
- file2tap - create a tap container from disk files |
- tap2file - split a tap container into disk files |
- tools/src/librw11 |
- Rw11(Cntl|Unit)TM11 - Controller/Unit for TM11 |
- Rw11UnitTape(|Base) - support for tape units |
- Rw11VirtTape(|Tap) - virtual tapes (generic and tap containers) |
- tools/tcl/rw11 |
- tbench.tcl - support sub directories and return in tests |
- new oskits |
- tools/oskit/211bsd_tm - 2.11BSD tape distribution kit (for RP06) |
|
- Changes |
- renames |
- tools/tbench - the text benches were re-organized and |
grouped now in sub directories: |
cp for w11a control port |
w11a for w11a CPU tests |
rhrp for RHRP device tests |
tm11 for TM11 device tests |
- functional changes |
- tools/bin/create_disk - add RM80 support |
|
- Bug fixes |
- tools/src/librlink |
- RlinkServer - fix race condition in attention handling |
- tools/src/librw11 |
- Rw11Cpu - stop cpu before load, proper unit handling |
|
- Known issues |
- all issues: see README_known_issues.txt |
- resolved issues: -- none -- |
- new issues: |
- V0.66-1: the TM11 controller transfers data byte wise (all disk do it |
16bit word wise) and allows for odd byte length transfers. Odd length |
transfers are currently not supported and rejected as invalid command. |
Odd byte length records aren't used by OS, if at all, so in practice |
this limitation isn't relevant. |
- V0.66-2: using two RP06 drives in parallel under 211bsd leads to a |
hangup of the system after a short time. Currently only operation |
of a single drive works reliably. |
|
- trunk (2015-05-14: svn rev 30(oc) 681(wfjm); untagged w11a_V0.65) +++++++++ |
- Preface |
|
150,7 → 79,6
- rtl/vlib/serport |
- serport_master - serial port module, master side |
- rtl/ibus/ibd_ibmon - ibus monitor |
- rtl/ibus/ibdr_rhrp - ibus controller for RH70 plus RP/RM drives |
- rtl/w11a/pdp11_sys70 - 11/70 system - single core +rbus,debug,cache |
- rtl/w11a/pdp11_hio70 - hio led and dsp for sys70 |
- tools/src/librw11 |
/trunk/Makefile
1,4 → 1,4
# $Id: Makefile 682 2015-05-15 18:35:29Z mueller $ |
# $Id: Makefile 650 2015-02-22 21:39:47Z mueller $ |
# |
# 'Meta Makefile' for whole retro project |
# allows to make all synthesis targets |
121,7 → 121,7
@echo " make -j `nproc` all_sim_ise" |
@echo " make -j `nproc` all_syn_ise" |
@echo " make -j `nproc` all_sim_viv" |
@echo " make -j 1 all_syn_viv" |
@echo " make -j `nproc` all_syn_viv" |
@echo " make clean" |
@echo " make clean_sim_ise" |
@echo " make clean_syn_ise" |