1
0
mirror of https://github.com/wfjm/w11.git synced 2026-01-27 12:52:27 +00:00

mcode: use call/return; fix (lp11|pc11)write; add scmd

- tools/mcode
  - *.mac: use call/return
  - (lp11|pc11)write: check line count after last char is accepted
  - pc11copy: kw11-p: use 100 kHz/13.; ensure last puncher interrupt
  - *.scmd: add SimH startup files when reasonable
- tools/simh/setup_w11a_(max|min).scmd: enable pclk
This commit is contained in:
wfjm
2022-08-13 07:45:28 +02:00
parent bc0a9907df
commit 13a72d1b4b
19 changed files with 370 additions and 168 deletions

View File

@@ -1,5 +1,11 @@
*.cof
*.lda
*.lst
# simulation stuff
rlink_cext_*
sysmon_stim
tmu_ofile
# Simh stuff
simh_*.dat

View File

@@ -1,9 +1,10 @@
; $Id: dl11echo.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: dl11echo.mac 1275 2022-08-10 08:10:40Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-09 1275 1.0.1 use call/return
; 2019-04-21 1134 1.0 Initial version
;
; DL11 echo
@@ -82,8 +83,8 @@ nultsk: mov #pat,r0
;
vh.tti: mov @#ti.buf,r0 ; read char
movb r0,curchr ; and remember
jsr pc,@curhdl ; call handler
jsr pc,chkesc ; check for ESC
call @curhdl ; call handler
call chkesc ; check for ESC
cmp nfree,#6. ; enough buffer ?
bgt 100$ ; if <= 6
bic #ti.ie,@#ti.csr ; disable ti irupt
@@ -124,16 +125,16 @@ wchar: tst nfree ; free buffer
1$: mov r1,wptr ; store pointer
bis #to.ie,@#to.csr ; enable to irupt
dec nfree
100$: rts pc
100$: return
;
; write CR/LF ------------------------------------
; use r0
;
wcrlf: mov #CR,r0
jsr pc,wchar
call wchar
wlf: mov #LF,r0
jsr pc,wchar
rts pc
call wchar
return
;
; escape detection -------------------------------
@@ -143,7 +144,7 @@ chkesc: movb curchr,r0
cmpb #ESC,r0
bne 1$
incb esccnt
rts pc
return
1$: cmpb esccnt,#2 ; 2 ESC seen ?
blt 200$
cmpb #'u,r0 ; u -> hdluc
@@ -161,20 +162,20 @@ chkesc: movb curchr,r0
120$: cmpb #'o,r0 ; o -> hdloct
bne 200$
mov #hdloct,curhdl
jsr pc,wcrlf ; force new line
call wcrlf ; force new line
clrb octcnt
200$: clrb esccnt
rts pc
return
;
; character handler ------------------------------
; in r0 current character
; use r1,r2
;
hdldir: jsr pc,wchar ; direct mode
hdldir: call wchar ; direct mode
cmpb #CR,r0 ; CR seen
bne 100$
jsr pc,wlf ; then add LF
100$: rts pc
call wlf ; then add LF
100$: return
hdllc: cmpb r0,#'A ; lower case mode
blt hdldir
@@ -192,22 +193,22 @@ hdluc: cmpb r0,#'a ; upper case mode
hdloct: mov r0,r2 ; octal mode
ash #-6.,r0
jsr pc,woct
call woct
mov r2,r0
ash #-3.,r0
jsr pc,woct
call woct
mov r2,r0
jsr pc,woct
call woct
mov #SPC,r0
jsr pc,wchar
call wchar
cmpb #CR,curchr
beq 10$
incb octcnt
cmpb octcnt,#16.
blt 100$
10$: jsr pc,wcrlf
10$: call wcrlf
clrb octcnt
100$: rts pc
100$: return
;
; print octal digit ------------------------------
; in r0 current character

View File

@@ -0,0 +1,13 @@
; $Id: dl11echo.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for dl11echo
;
! make dl11echo.lda
;
do ../../simh/setup_w11a_mcode.scmd
;
; attach console to telnet
set cons telnet=5670
;
load dl11echo.lda
cont

View File

@@ -1,9 +1,10 @@
; $Id: dz11echo.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: dz11echo.mac 1275 2022-08-10 08:10:40Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-09 1275 1.1 use call/return; better ? text, startup message
; 2019-05-25 1152 1.0 Initial version
; 2019-05-05 1147 0.1 First draft
;
@@ -104,6 +105,9 @@ start: mov #stack,sp ; setup stack
mov #kl.ie,@#kl.csr ; activate clock
mov #<dz.tie!dz.rie!dz.mse>,@#dz.csr
spl 0 ; allow interrupts
;
mov #msgsta,r1 ; print startup message
call dlwstr
;
; blinking lights null task (pattern setup in clock handler)
;
@@ -126,12 +130,12 @@ start: mov #stack,sp ; setup stack
blt 150$ ;;; if lt not
mov gentbl(r2),r1 ;;;
add #3,r1 ;;; point to last digit of count
jsr pc,incnum ;;; increment line counter
call incnum ;;; increment line counter
mov gentbl(r2),r1 ;;;
movb tgline,cline ;;;
jsr pc,dzwstr ;;; write head part
call dzwstr ;;; write head part
mov #gentxt,r1 ;;;
jsr pc,dzwstr ;;; write body part
call dzwstr ;;; write body part
spl 0
br 120$
150$: spl 0
@@ -150,7 +154,7 @@ incnum: mov #4,r0 ; max 4 digits
movb #'0,(r1) ; if yes, restore 0
dec r1 ; and go for next digit
sob r0,1$
100$: rts pc
100$: return
;
; cons rx interrupt handler ----------------------
;
@@ -160,7 +164,7 @@ vh.tti: mov @#ti.buf,r0
beq 2$ ; end of list ?
cmp r0,(r1)+ ; char match ?
bne 1$ ; if not try next
jsr pc,(r2) ; else call handler
call (r2) ; else call handler
rti
;
2$: sub #'0,r0 ; look for octal digit
@@ -172,7 +176,7 @@ vh.tti: mov @#ti.buf,r0
rti
;
3$: mov #msgerr,r1 ; otherwise complain
jsr pc,dlwstr
call dlwstr
rti
;
; cons tx interrupt handler ----------------------
@@ -192,45 +196,45 @@ vh.tto: mov dlrptr,r1 ; load pointer
; handler for '?': print help ---------------
;
conhlp: mov #msghlp,r1
jsr pc,dlwstr
rts pc
call dlwstr
return
;
; handler for 'c': char mode; disable silo --
;
conchr: bic #dz.sae,@#dz.csr
movb #-1,smode
rts pc
return
;
; handler for 's': silo mode ----------------
;
consil: bis #dz.sae,@#dz.csr
movb #1,smode
rts pc
return
;
; handler for 'a': auto mode for silo -------
;
conaut: bic #dz.sae,@#dz.csr
clrb smode
rts pc
return
;
; handler for 'i': print status info --------
;
coninf: mov #msginf,r1 ; print info header
jsr pc,dlwstr
call dlwstr
clr r3 ; loop over lines
1$: mov #msg3b,r1
jsr pc,dlwstr ; print 3 blank
call dlwstr ; print 3 blank
mov r3,r0
add #'0,r0
jsr pc,dlwchr ; print line number
call dlwchr ; print line number
movb @#dz.co,r4 ; print co
jsr pc,prtinf
call prtinf
movb @#dz.rin,r4 ; print ring
jsr pc,prtinf
call prtinf
movb @#dz.dtr,r4 ; print dtr
jsr pc,prtinf
call prtinf
movb curbrk,r4 ; print brk
jsr pc,prtinf
call prtinf
mov r3,r4
asl r4 ; word offset
@@ -248,27 +252,27 @@ coninf: mov #msginf,r1 ; print info header
cmp #hdloct,r4
beq 2$
mov #msgerr,r1
2$: jsr pc,dlwstr ; print mode
2$: call dlwstr ; print mode
inc r3
cmp r3,#7
ble 1$
rts pc
return
;
; handler for 'h': hangup line (dtr=0) ------
;
conhup: jsr pc,getcli
conhup: call getcli
bicb bitmsk(r2),@#dz.dtr ; clear dtr bit
rts pc
return
;
; handler for 'r': line ready (dtr=1) -------
;
conrdy: jsr pc,getcli
conrdy: call getcli
bisb bitmsk(r2),@#dz.dtr ; set dtr bit
rts pc
return
;
; handler for 'b': break line (brk=1) -------
;
conbrk: jsr pc,getcli
conbrk: call getcli
bisb bitmsk(r2),curbrk ; set brk bit
movb curbrk,@#dz.brk ; set brk register
movb r2,cline ; setup line for dzwchr
@@ -277,22 +281,22 @@ conbrk: jsr pc,getcli
;
; handler for 'a': unbreak line (brk=0) -----
;
conubr: jsr pc,getcli
conubr: call getcli
bicb bitmsk(r2),curbrk ; clear brk bit
movb curbrk,@#dz.brk ; set brk register
rts pc
return
;
; handler for 'g': generate: start traffic generator
;
contgg: jsr pc,getcli
contgg: call getcli
bisb bitmsk(r2),curgen ; set gen bit
rts pc
return
;
; handler for 'q': quit: stop traffic generator
;
contgq: jsr pc,getcli
contgq: call getcli
bicb bitmsk(r2),curgen ; clear gen bit
rts pc
return
;
; helper for coninf --------------------
; in r3 line number
@@ -300,7 +304,7 @@ contgq: jsr pc,getcli
; use r0
;
prtinf: mov #msg3b,r1
jsr pc,dlwstr ; print 3 blank
call dlwstr ; print 3 blank
movb #'0,r0 ; assume 0
bitb bitmsk(r3),r4 ; test bit
beq 1$
@@ -311,7 +315,7 @@ prtinf: mov #msg3b,r1
;
getcli: movb clnum,r2 ; load line number
blt 1$ ; if lt not valid
rts pc ; if yes return
return ; if yes return
1$: tst (sp)+ ; else pop return address
mov #msgerr,r1 ; load error message
jmp dlwstr ; execute dlwstr instead of handler
@@ -325,7 +329,7 @@ vh.kwl:
;
bit #dz.sae,@#dz.csr ; silo enabled ?
beq 10$
jsr pc,dzread
call dzread
;
; determine sae when automatic mode
;
@@ -354,7 +358,7 @@ vh.kwl:
beq 100$
mov #curco,r5 ; print change messages
mov #txtco,msgpre
jsr pc,msgpat
call msgpat
mov #atim,timco ; if yes, setup co timer
clr timint ; expire interval timer
;
@@ -366,7 +370,7 @@ vh.kwl:
beq 200$
mov #currin,r5 ; print change messages
mov #txtrin,msgpre
jsr pc,msgpat
call msgpat
mov #atim,timrin ; if yes, setup ring timer
clr timint ; expire interval timer
bisb currin,dsprin ; accumulate ring bits
@@ -425,7 +429,7 @@ vh.kwl:
;
; dz11 rx interrupt handler ----------------------
;
vh.dzr: jsr pc,dzread
vh.dzr: call dzread
rti
;
dzread: mov @#dz.rbu,r0 ; read rbuf
@@ -440,11 +444,11 @@ dzread: mov @#dz.rbu,r0 ; read rbuf
movb r2,cline ; save line
asl r2 ; word offset
bic #^c377,r0 ; get char
jsr pc,@lhdl(r2) ; call char handler
jsr pc,chkesc ; check for ESC
call @lhdl(r2) ; call char handler
call chkesc ; check for ESC
; FIXME: ?? disable rie when nfree<=6 ?
br dzread ; and go for next
999$: rts pc
999$: return
;
; dz11 tx interrupt handler ----------------------
;
@@ -473,12 +477,12 @@ vh.dzt: movb @#dz.csr+1,r2 ; get tline
msgpat: movb (r5)+,r4 ; get cur
bicb (r5),r4 ; cur and not lst -> new bits
mov #txton,msgsuf
jsr pc,msgbit
call msgbit
movb (r5),r4 ; get lst
bicb -(r5),r4 ; lst and not cur -> old bits
mov #txtoff,msgsuf
jsr pc,msgbit
rts pc
call msgbit
return
;
; dl11 co/ring change message print --------------
; in r4 changed bits
@@ -488,15 +492,15 @@ msgbit: mov #7,r3
1$: rolb r4 ; probe lsb
bcc 2$
mov msgpre,r1 ; write prefix (line or ring)
jsr pc,dlwstr
call dlwstr
mov r3,r0
add #'0,r0 ; write line number
jsr pc,dlwchr
call dlwchr
mov msgsuf,r1 ; write suffix (on or off)
jsr pc,dlwstr
call dlwstr
2$: dec r3
bge 1$
rts pc
return
;
; dl11 ring buffer write char routine ------------
; in r0 current character
@@ -512,7 +516,7 @@ dlwchr: tst dlnfre ; free buffer
1$: mov r2,dlwptr ; store pointer
bis #to.ie,@#to.csr ; enable to irupt
dec dlnfre
100$: rts pc
100$: return
;
; dl11 ring buffer write asciz routine -----------
; in r1 asciz string pointer
@@ -520,9 +524,9 @@ dlwchr: tst dlnfre ; free buffer
;
dlwstr: movb (r1)+,r0 ; get next char
beq 100$ ; end ?
jsr pc,dlwchr
call dlwchr
br dlwstr
100$: rts pc
100$: return
;
; dz11 ring buffer write char routine ------------
; in r0 current character
@@ -543,25 +547,25 @@ dzwchr: movb cline,r2 ; line number
bne 100$
asr r2 ; byte offset
bisb bitmsk(r2),@#dz.len ; and enable line
100$: rts pc
100$: return
;
; dz11 ring buffer write string routine ----------
; in r1 pointer to asciz string
; use r0,r2,r3
dzwstr: movb (r1)+,r0 ; get next char
beq 100$ ; end ?
jsr pc,dzwchr
call dzwchr
br dzwstr
100$: rts pc
100$: return
;
; dz11 write CR/LF -------------------------------
; use r0
;
dzcrlf: mov #CR,r0
jsr pc,dzwchr
call dzwchr
dzlf: mov #LF,r0
jsr pc,dzwchr
rts pc
call dzwchr
return
;
; escape detection -------------------------------
; use r0,r2
@@ -571,7 +575,7 @@ chkesc: movb cchar,r0
cmpb #ESC,r0 ; ESC seen ?
bne 1$
incb ecnt(r2)
rts pc
return
;
1$: cmpb ecnt(r2),#2 ; 2 ESC seen ?
blt 200$
@@ -592,23 +596,23 @@ chkesc: movb cchar,r0
120$: cmpb #'o,r0 ; o -> hdloct
bne 200$
mov #hdloct,lhdl(r2)
jsr pc,dzcrlf ; force new line
call dzcrlf ; force new line
movb cline,r2
clrb ocnt(r2)
;
200$: movb cline,r2
clrb ecnt(r2)
rts pc
return
;
; character handler ------------------------------
; in r0 current character
; use r2
;
hdldir: jsr pc,dzwchr ; direct mode
cmpb #CR,r0 ; CR seen
hdldir: call dzwchr ; direct mode
cmpb #CR,r0 ; CR seen
bne 100$
jsr pc,dzlf ; then add LF
100$: rts pc
call dzlf ; then add LF
100$: return
hdllc: cmpb r0,#'A ; lower case mode
blt hdldir
@@ -625,24 +629,24 @@ hdluc: cmpb r0,#'a ; upper case mode
br hdldir
hdloct: ash #-6.,r0
jsr pc,dzoct
call dzoct
movb cchar,r0
ash #-3.,r0
jsr pc,dzoct
call dzoct
movb cchar,r0
jsr pc,dzoct
call dzoct
mov #SPC,r0
jsr pc,dzwchr
call dzwchr
cmpb #CR,cchar
beq 10$
movb cline,r2
incb ocnt(r2)
cmpb ocnt(r2),#16.
blt 100$
10$: jsr pc,dzcrlf
10$: call dzcrlf
movb cline,r2
clrb ocnt(r2)
100$: rts pc
100$: return
;
; print octal digit ------------------------------
; in r0 current character
@@ -705,6 +709,7 @@ conhdl: .word conhlp,'?
.word 0 ; end-of-list
;
msgerr: .asciz /?/<CR><LF>
msgsta: .asciz /dz11echo DZ11 tester. For help type '?'/<CR><LF>
msghlp: .ascii /dz11echo console commands:/<CR><LF>
.ascii / ? help text/<CR><LF>
.ascii / c char: only rie/<CR><LF>
@@ -718,6 +723,11 @@ msghlp: .ascii /dz11echo console commands:/<CR><LF>
.ascii / u unbreak: set brk=1/<CR><LF>
.ascii / g generate test output on line/<CR><LF>
.ascii / q quit generating test output/<CR><LF>
.ascii /DZ line commands:/<CR><LF>
.ascii / ESC + ESC + u -> uppercase/<CR><LF>
.ascii / ESC + ESC + l -> lowercase/<CR><LF>
.ascii / ESC + ESC + o -> octal echo (16 per line)/<CR><LF>
.ascii / ESC + ESC + a -> direct echo/<CR><LF>
.byte 0
;
msginf: .asciz /line co rin dtr brk mode/<CR><LF>

View File

@@ -0,0 +1,13 @@
; $Id: dz11echo.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for dz11echo
;
! make dz11echo.lda
;
do ../../simh/setup_w11a_mcode.scmd
; attach console and DZ11 to telnet
set cons telnet=5670
att dz -m 5672
;
load dz11echo.lda
cont

View File

@@ -1,9 +1,11 @@
; $Id: lp11write.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: lp11write.mac 1276 2022-08-12 10:25:13Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-10 1276 1.0.2 check line count after last char is accepted
; 2022-08-09 1275 1.0.1 use call/return
; 2019-04-21 1134 1.0 Initial version
;
; write test output
@@ -65,9 +67,12 @@ start1: mov #stack,sp ; setup stack
br 3$
;
; printer interrupt handler -----------------------
; the line count stop is checked after the last char is accepted by LP11
;
vh.lp: tst @#lp.csr ; printer offline ?
bmi perr ; if mi yes, error halt
cmp r0,#lcnt ; enough lines send ?
beq 200$
1$: movb (r1)+,@#lp.buf ; send byte
cmp r1,#bend ; end of buffer ?
bhis 100$ ; if his yes, handle new line
@@ -76,10 +81,8 @@ vh.lp: tst @#lp.csr ; printer offline ?
rti ; else quit irupt
100$: mov #bnum+3,r1 ; if yes, increment number
jsr pc,incnum
call incnum
inc r0 ; inc line counter
cmp r0,#lcnt ; enough lines send ?
beq 200$
mov #bnum,r1 ; ready for next line
rti
@@ -97,7 +100,7 @@ incnum: mov #4,r5 ; max 4 digits
movb #'0,(r1) ; if yes, restore 0
dec r1 ; and go for next digit
sob r5,1$
100$: rts pc
100$: return
;
; data area ------------------------------------------------
;

View File

@@ -0,0 +1,14 @@
; $Id: lp11write.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for lp11write
;
! make lp11write.lda
;
do ../../simh/setup_w11a_mcode.scmd
;
; attach lp11 output, ensure fresh file
! rm -f simh_lp11write.dat
att lpt simh_lp11write.dat
;
load lp11write.lda
cont

View File

@@ -1,9 +1,10 @@
; $Id: bootw11.mac 1237 2022-05-15 07:51:47Z mueller $
; $Id: bootw11.mac 1275 2022-08-10 08:10:40Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-09 1275 1.0.2 use call/return
; 2022-05-14 1237 1.0.1 BUGFIX: proper init of unit number in getnam
; 2019-05-01 1143 1.0 Initial version
; 2019-04-19 1133 0.1 First draft
@@ -40,19 +41,19 @@ start: spl 7
; print prompt
;
mov #strpro,r1
nxtpro: jsr pc,prtstr
nxtpro: call prtstr
;
; read boot device name and unit
; out r2 device name
; out r3 unit number
;
getnam: jsr pc,getlet ; get 1st char
getnam: call getlet ; get 1st char
mov r0,r2 ; move into low byte
jsr pc,getlet ; get 2nd char
call getlet ; get 2nd char
swab r0
bis r0,r2 ; move into high byte
clr r3 ; default unit is 0
jsr pc,getchr ; get unit number or <CR>
call getchr ; get unit number or <CR>
cmp #CR,r0 ; is <CR> ?
beq fnddev ; if eq yes, done
mov r0,r3
@@ -60,8 +61,8 @@ getnam: jsr pc,getlet ; get 1st char
blt errpro ; below 0, error quit
cmp r3,#7 ; check 0-7 range
bgt errpro ; above 7, error quit
jsr pc,prtchr ; echo character
jsr pc,getchr ; get <CR>
call prtchr ; echo character
call getchr ; get <CR>
cmp #CR,r0 ; is <CR> ?
bne errpro
;
@@ -80,7 +81,7 @@ fnddev: mov #devtbl,r4
2$: cmp r3,(r4)+ ; is unit number in range ?
bgt errpro ; if gt not, error quit
mov #strnl,r1 ; print <CR><LF>
jsr pc,prtstr
call prtstr
mov r3,r0 ; get unit to r0
jmp @(r4)+ ; and execute boot code
@@ -91,7 +92,7 @@ errpro: mov #strerr,r1 ; point to error string
; getlet: read drive name letter ---------------------------
; out r0 character (only A-Z, other error quit)
;
getlet: jsr pc,getchr
getlet: call getchr
cmp r0,#'Z ; above Z ?
ble 1$ ; if le not
sub #<'a-'A>,r0 ; otherwise convert to upper
@@ -99,8 +100,8 @@ getlet: jsr pc,getchr
blt 2$ ; if lt yes, error quit
cmp r0,#'Z ; above Z ?
bgt 2$ ; if gt yes, error quit
jsr pc,prtchr ; echo character
rts pc
call prtchr ; echo character
return
2$: tst (sp)+ ; drop return address
br errpro ; error quit
;
@@ -110,7 +111,7 @@ getlet: jsr pc,getchr
getchr: tstb @#ti.csr ; wait ti ready
bpl getchr
mov @#ti.buf,r0 ; and read character
rts pc
return
;
; prtstr: print string routine -----------------------------
; in r1 pointer to zero terminated string
@@ -118,7 +119,7 @@ getchr: tstb @#ti.csr ; wait ti ready
;
prtstr: movb (r1)+,r0 ; get next char
beq prtrts ; if eq return
jsr pc,prtchr ; else print char
call prtchr ; else print char
br prtstr ; and go for next
;
; prtchr: print character routine --------------------------
@@ -127,7 +128,7 @@ prtstr: movb (r1)+,r0 ; get next char
prtchr: tstb @#to.csr ; wait to ready
bpl prtchr
movb r0,@#to.buf ; and print
prtrts: rts pc
prtrts: return
;
; rstoff: reset/restart after unit offline detected --------
;
@@ -304,22 +305,22 @@ bootpc: mov #pr.csr,r5
jmp rstoff ; otherwise quit offline
;
pcrec: clr r2 ; clear checksum
1$: jsr pc,pcbyte ; read 000 prefix or 001
1$: call pcbyte ; read 000 prefix or 001
tstb r0 ; is zero ?
beq 1$ ; if eq yes, keep trying
dec r0 ; decrement to test for 001
bne pcerr1 ; if ne, quit
jsr pc,pcbyte ; read 000 after 001
call pcbyte ; read 000 after 001
tstb r0 ; is zero ?
bne pcerr1 ; if ne fail
jsr pc,pcword ; read count
call pcword ; read count
mov r1,r4 ; store count
jsr pc,pcword ; read addr
call pcword ; read addr
mov r1,r3 ; store addr
sub #6,r4 ; subtract 6 from count
blt pcerr2 ; if <6 fail
bgt pcdata ; if >6 read data
jsr pc,pcbyte ; read checksum
call pcbyte ; read checksum
tstb r2 ; test checksum
bne pcerr3 ; if ne bad, fail
bit #1,r3 ; address odd ?
@@ -332,20 +333,20 @@ pcerr2: halt ; halt: bad count
pcerr3: halt ; halt: bad checksum
pcerr4: halt ; halt: error bit set
;
pcdata: jsr pc,pcbyte ; read byte
pcdata: call pcbyte ; read byte
movb r0,(r3)+ ; store byte
sob r4,pcdata ; dec count and loop if >0
jsr pc,pcbyte ; get checksum
call pcbyte ; get checksum
tstb r2 ; test checksum
bne pcerr3 ; if ne bad, fail
br pcrec ; otherwise next record
pcword: jsr pc,pcbyte ; read low byte
pcword: call pcbyte ; read low byte
mov r0,r1 ; low byte to r1
jsr pc,pcbyte ; read high byte
call pcbyte ; read high byte
swab r0
bis r0,r1 ; high byte to r1
rts pc
return
pcbyte: inc (r5) ; set enable
1$: tst (r5) ; error set ?
@@ -354,6 +355,6 @@ pcbyte: inc (r5) ; set enable
bpl 1$ ; if pl not yet
mov 2(r5),r0 ; read byte
add r0,r2 ; accumulate checksum
rts pc
return
;
.end start

View File

@@ -1,13 +1,15 @@
; $Id: pc11copy.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: pc11copy.mac 1277 2022-08-12 15:00:20Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-10 1276 1.2 kw11-p: use 100 kHz/13.; ensure last puncher irupt
; 2019-04-25 1138 1.1 add kw11-l/p stress
; 2019-04-21 1134 1.0 Initial version
;
; copy input to output tape
; Copy input to output tape
; Interrupt stress test with KW11-P (four interrupt sources in parallel)
;
; definitions ----------------------------------------------
;
@@ -17,7 +19,7 @@
.include |lib/defs_pc.mac|
bsize = 256. ; elasticity ring buffer size
kpwait = 997. ; kp wait (in cycles, intentionally prime)
kpwait = 17. ; kp wait (in 100kHz, intentionally prime)
cbsize = 250. ; kp-per-kl trace buffer size (for last 5 sec)
;
; vector area ----------------------------------------------
@@ -85,7 +87,7 @@ start1: mov #stack,sp ; setup stack
spl 7
mov #kl.ie,@#kl.csr ; start kw11-l
mov #kpwait,@#kp.csb ; load kw11-p counter
mov #<kp.ie!kp.rep!kp.rex!kp.run>,@#kp.csr ; kw11-p: ext down repeat
mov #<kp.ie!kp.rep!kp.rhk!kp.run>,@#kp.csr ; kw11-p: 100k down repeat
mov #<pr.ie!pr.ena>,@#pr.csr ; start reader
spl 0 ; allow interrupts
3$: wait ; and idle
@@ -119,7 +121,15 @@ vh.ptr: tst @#pr.csr ; at eof ?
200$: bic #pr.ie,@#pr.csr ; stop reader
rti
300$: jmp stop
; eof detected. ensure program halts after the final puncher interupt is taken
; do a wait loop while puncher active, puncher will end program (Simh compat)
300$: cmp (sp)+,(sp)+ ; drop vector
spl 0 ; allow interrupts
310$: bit #pp.ie,@#pp.csr ; puncher still active ?
beq 320$ ; if not stop
wait ; if yes wait
br 310$
320$: jmp stop
rerr: halt ; reader error halt
br rerr
@@ -128,6 +138,8 @@ rerr: halt ; reader error halt
;
vh.ptp: tst @#pp.csr ; punch error
bmi perr ; if mi yes, error halt
tstb r3 ; eof seen ?
bne 200$ ; if yes, all done
tstb @#pp.csr ; ready ?
bpl perr ; if pl no, error halt
tst r2 ; test buffer count
@@ -143,11 +155,12 @@ vh.ptp: tst @#pp.csr ; punch error
mov #<pr.ie!pr.ena>,@#pr.csr ; if not, start reader
2$: rti
100$: bic #pp.ie,@#pp.csr ; stop punch
tstb r3 ; eof seen ?
bne 200$ ; if yes, all done
rti
; eof detected. ensure that final puncher interrupt is taken (Simh compat)
100$: tstb r3 ; eof seen ?
bne 110$ ; if yes, go for final interrupt
bic #pp.ie,@#pp.csr ; otherwise stop punch
110$: rti
200$: jmp stop
perr: halt ; puncher error halt

View File

@@ -0,0 +1,15 @@
; $Id: pc11copy.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for pc11copy
;
! make pc11copy.lda
;
do ../../simh/setup_w11a_mcode.scmd
;
; attach PC11, ensure new file written
! rm -f simh_pc11copy.dat
att ptr simh_pc11write.dat
att ptp simh_pc11copy.dat
;
load pc11copy.lda
cont

View File

@@ -1,9 +1,10 @@
; $Id: pc11read.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: pc11read.mac 1275 2022-08-10 08:10:40Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-09 1275 1.0.1 use call/return
; 2019-04-21 1134 1.0 Initial version
;
; write test tape
@@ -79,7 +80,7 @@ vh.ptr: tst @#pr.csr ; reader error
cmp r1,#bend ; end of buffer ?
blo 100$
mov #bnum+3,r1 ; if yes, increment number
jsr pc,incnum
call incnum
inc r0 ; inc line counter
mov #bnum,r1 ; ready for next line
100$: inc @#pr.csr ; go for next char
@@ -103,7 +104,7 @@ incnum: mov #4,r5 ; max 4 digits
movb #'0,(r1) ; if yes, restore 0
dec r1 ; and go for next digit
sob r5,1$
100$: rts pc
100$: return
;
; data area ------------------------------------------------
;

View File

@@ -0,0 +1,14 @@
; $Id: pc11read.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for pc11read
;
! make pc11read.lda
;
do ../../simh/setup_w11a_mcode.scmd
;
; attach PC11
att ptr simh_pc11write.dat
det ptp
;
load pc11read.lda
cont

View File

@@ -1,9 +1,11 @@
; $Id: pc11write.mac 1174 2019-06-29 18:00:47Z mueller $
; $Id: pc11write.mac 1276 2022-08-12 10:25:13Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-10 1276 1.0.2 check line count after last char is accepted
; 2022-08-09 1275 1.0.1 use call/return
; 2019-04-21 1134 1.0 Initial version
;
; write test tape
@@ -65,17 +67,18 @@ start1: mov #stack,sp ; setup stack
br 3$
;
; puncher interrupt handler -----------------------
; the line count stop is checked after the last char is accepted by PC11
;
vh.ptp: tst @#pp.csr ; punch error
bmi perr ; if mi yes, error halt
cmp r0,#lcnt ; enough lines send ?
beq 200$
movb (r1)+,@#pp.buf ; send byte
cmp r1,#bend ; end of buffer ?
blo 100$
mov #bnum+3,r1 ; if yes, increment number
jsr pc,incnum
call incnum
inc r0 ; inc line counter
cmp r0,#lcnt ; enough lines send ?
beq 200$
mov #bnum,r1 ; ready for next line
100$: rti
@@ -93,7 +96,7 @@ incnum: mov #4,r5 ; max 4 digits
movb #'0,(r1) ; if yes, restore 0
dec r1 ; and go for next digit
sob r5,1$
100$: rts pc
100$: return
;
; data area ------------------------------------------------
;

View File

@@ -0,0 +1,15 @@
; $Id: pc11write.scmd 1275 2022-08-10 08:10:40Z mueller $
;
; Setup file for pc11write
;
! make pc11write.lda
;
do ../../simh/setup_w11a_mcode.scmd
;
; attach PC11, ensure fresh file
! rm -f simh_pc11write.dat
det ptr
att ptp simh_pc11write.dat
;
load pc11write.lda
cont

View File

@@ -1,9 +1,10 @@
; $Id: blink.mac 1237 2022-05-15 07:51:47Z mueller $
; $Id: blink.mac 1275 2022-08-10 08:10:40Z mueller $
; SPDX-License-Identifier: GPL-3.0-or-later
; Copyright 2019-2022 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
;
; Revision History:
; Date Rev Version Comment
; 2022-08-09 1275 1.0.1 use call/return
; 2019-04-22 1135 1.0 Initial version
;
; Show different 'blinking lights' patterns
@@ -54,7 +55,7 @@ stack:
; main program -----------------------------------
;
start: mov #stack,sp ; setup stack
jsr pc,inir ; setup 'f' mode
call inir ; setup 'f' mode
spl 7
mov #ti.ie,@#ti.csr ; activate input
mov #kl.ie,@#kl.csr
@@ -66,7 +67,7 @@ nultsk: mov curspd,r5 ; load speed
1$: mov pat,r0 ; load pattern
wait ; and proudly show it
sob r5,1$ ; wait for interrupt
jsr pc,@curhdl ; update pattern
call @curhdl ; update pattern
;
tst smode ; static mode ?
beq nultsk ; if eq yes, no action
@@ -83,18 +84,18 @@ nultsk: mov curspd,r5 ; load speed
clr r0
2$: mov r0,cursty
asl r0 ; index to offset
jsr pc,@initbl(r0) ; call initializer
call @initbl(r0) ; call initializer
br nultsk
;
100$: cmp smode,#smrand ; random mode ?
bne nultsk
jsr pc,randzp ; get random number
call randzp ; get random number
mov r0,r1
clr r0
div #nstyle,r0 ; calculate: rand % nstyle
mov r1,cursty ; reminder is new style index
asl r1 ; index to offset
jsr pc,@initbl(r1) ; call initializer
call @initbl(r1) ; call initializer
br nultsk
;
; receive interrupt handler ----------------------
@@ -115,8 +116,8 @@ vh.tti: mov @#ti.buf,r0 ; read char
beq 102$
cmp (r1)+,(r1)+ ; if not, try next
br 101$
102$: jsr pc,@(r1)+ ; if yes: call action
jsr pc,@(r1)+ ; call initializer
102$: call @(r1)+ ; if yes: call action
call @(r1)+ ; call initializer
999$: rti
;
@@ -130,13 +131,13 @@ vh.kwl: inc styage
; style switch
;
actsty: clr smode ; use static styles
actnop: rts pc
actnop: return
;
acta: mov #smauto,smode
br actem
acts: mov #smrand,smode
actem: mov #smtime,styage ; expire timer
rts pc
return
;
; other control actions
;
@@ -146,26 +147,26 @@ actem: mov #smtime,styage ; expire timer
inir: mov #170017,pat
mov #4,defspd
mov #hdlr,curhdl
rts pc
return
;
inib: mov #000377,pat
mov #2,defspd
mov #hdlb,curhdl
rts pc
return
;
inif: mov #000001,pat
mov #2,defspd
mov #hdlf,curhdl
rts pc
return
;
inic: clr pat
mov #1,defspd
mov #hdlc,curhdl
rts pc
return
;
inirr: mov #hdlrr,curhdl
mov #6,defspd
ininop: rts pc
ininop: return
;
;
; display pattern handlers -----------------------
@@ -178,7 +179,7 @@ hdlr: mov #pat,r1
aslb (r1)+
rorb (r1)
adcb -(r1)
rts pc
return
;
; 2.11BSD style ------------------------
; code from 2.11BSD mch_xxx.s
@@ -188,7 +189,7 @@ hdlb: clc
rol pat
bpl 1$
bis #1,pat
1$: rts pc
1$: return
;
; flipper style ------------------------
;
@@ -208,16 +209,16 @@ hdlf: mov #pat,r0
rol (r0) ; and shift
20$: neg fdir ; and switch direction
100$: rts pc
100$: return
;
; counter style ------------------------
;
hdlc: inc pat
rts pc
return
;
; random pattern style -----------------
;
hdlrr: jsr pc,randzp
hdlrr: call randzp
mov r0,pat
rts pc
;