1
0
mirror of https://github.com/livingcomputermuseum/UniBone.git synced 2026-02-11 18:45:47 +00:00
Files
livingcomputermuseum.UniBone/10.01_base/3_test/multiarb/multiarb.mac

236 lines
3.7 KiB
Plaintext

.title Multi Arbitration DMA/INTR test
; *************************************************
; Exercises several devices in parallel,
; each with INTR and DMA
; For a device XX we have
; XXENAB - flag to enable device
; XXBASE - base address of device
; XXVEC - the INTR vector
; XXISR - Interrupt Service
; XXIFLG - flag which is incremented in ISR
; XXBUF - data buffer for DMA transfer
; XXINIT - Initialize device after RESET
; XXGO - subroutine to initiate DMA and INTR
; XXECNT - event counter, indicates activity
; XXLABL - single char label to print activity
;
; Devices are
; CO - serial console
; RK - RK11/RK05 disk
; RL - RL11/RL02 disk
; RY - Serial RX211 Floppy,
; DU - MSCP disk drive on UDA controller
; enable tests
kwenab = 1
rkenab = 1
rlenab = 1
ryenab = 0 ; not yet tested
duenab = 0 ; not yet implemeneted
.enable AMA
.asect
; *************************************************
; Vectors ; UniBone emulated CPU start
. = 0
jmp @#start
; Emulated CPU: restart on pwoer event
. = 24 ; Power ON/OFF
.word start ; PC
.word 340 ; PSW priority level 7
. = corvec
.word corisr ; RCV interrupt
.word 340
. = coxvec
.word coxisr ; XMT interrupt
.word 340
.if ne kwenab
. = kwvect
.word kwisr ; periodic interrupt
.word 340
.endc
.if ne rlenab
. = rlvect ; RL11
.word rlisr
.word 340
.endc
.if ne rkenab
. = rkvect ; RK11
.word rkisr
.word 340
.endc
.if ne ryenab
. = ryvect ; RX211
.word ryisr
.word 340
.endc
.if ne duenab
. = duvect ; UDA MSCP controller
.word duisr
.word 340
.endc
psw = 177776
monitr = 165020 ; Monitor addr for back jump
; *************************************************
; Main
. = 1000
stack = .-2
start:
mov #stack,sp
clr @#psw ; priorty level 0, allow INTR
; Initialize devices
reset
call corini
call coxini
.if ne kwenab
call kwinit
.endc
.if ne rkenab
call rkinit
.endc
.if ne rlenab
call rlinit
.endc
.if ne ryenab
call ryinit
.endc
.if ne duenab
call duinit
.endc
mov #shello,r1 ; Print "Hello" message
call puts
; main loop: check interrupt flags, restart DMA
; process serial input
loop:
call dokbd ; check keyboard input
call dodev ; check device activities
br loop
; --- check keyboard input
dokbd:
call getc
bcc 9$ ; nothing received
; process char in r0
cmpb r0,#3
bne 1$
mov #sbye,r1 ; ^C: print "Bye", back to monitor
call puts
reset ; stop devices
jmp monitr
1$:
; echo chars without special meaning
call putc
9$:
return
; -- check device activities
dodev:
; For all devices: restart device DMA if Interrupt received
.if ne kwenab
tst kwiflg
beq 1$
clr kwiflg
call kwgo
mov #kwlabl,r0 ; progress printout
mov #kwecnt,r1
call progrs
1$:
.endc
.if ne rkenab
tst rkiflg
beq 2$
clr rkiflg
call rkgo
mov #rklabl,r0 ; progress printout
mov #rkecnt,r1
call progrs
2$:
.endc
.if ne rlenab
tst rliflg
beq 3$
clr rliflg
call rlgo
mov #rllabl,r0 ; progress printout
mov #rlecnt,r1
call progrs
3$:
.endc
.if ne ryenab
tst ryiflg
beq 4$
clr ryiflg
call rygo
mov #rylabl,r0 ; progress printout
mov #ryecnt,r1
call progrs
4$:
.endc
.if ne duenab
tst duiflg
beq 5$
clr duiflg
call dugo
mov #dulabl,r0 ; progress printout
mov #duecnt,r1
call progrs
5$:
.endc
return
; progress
; check if the counter with address in r1 is at
; 1024. if yes, print the char in r0
progrs:
; bic #777700,(r1) ; mask counter to 0..63
bic #777400,(r1) ; mask counter to 0..255
; bic #776000,(r1) ; mask counter to 0..1023
bne 9$
call putc ; is at 0: print label character
9$:
return
.include ma_cons.mac
.if ne kwenab
.include ma_kw.mac
.endc
.if ne rkenab
.include ma_rk.mac
.endc
.if ne rlenab
.include ma_rl.mac
.endc
.if ne ryenab
.include ma_ry.mac
.endc
.if ne duenab
.include ma_du.mac
.endc
.include ma_strings.mac
.end