         ttl    ROM Based Multi-Processor Test Program.

string   macro
\*       dc.b   \@-*-1,\1
\@       equ    *
         endm

version  equ     10
bs       equ     $08
lf       equ     $0A
ff       equ     $0B
cr       equ     $0D
can      equ     $18
esc      equ     $1B
del      equ     $7F

         org     $1000
readlog  ds.l    64
writelog ds.l    64
nobytes  ds.l    1
nocrash  ds.l    1
writberr ds.l    1
readberr ds.l    1
noprocs  ds.b    1
procno   ds.b    1
         org     0
storesem ds.b    1
procnos  ds.b    1
membase  ds.l    1
progbase equ     *
         org     0
resetsp  dc.l    $4000
resetpc  dc.l    start
berr     dc.l    berrindh
addrerr  dc.l    addrhand
illinst  dc.l    illihand
zerodiv  dc.l    zdivhand
chkfail  dc.l    chckhand
trapoflo dc.l    oflohand
priviol  dc.l    privhand
trace    dc.l    trachand
emul1010 dc.l    hand1010
emul1111 dc.l    hand1111
         ds.l    12
spurious dc.l    int0hand
auto1    dc.l    int1hand
auto2    dc.l    int2hand
auto3    dc.l    int3hand
auto4    dc.l    int4hand
auto5    dc.l    intrind5
auto6    dc.l    intrind6
auto7    dc.l    int7hand
trap0    dc.l    traphand
trap1    dc.l    traphand
trap2    dc.l    traphand
trap3    dc.l    traphand
trap4    dc.l    traphand
trap5    dc.l    traphand
trap6    dc.l    traphand
trap7    dc.l    traphand
trap8    dc.l    traphand
trap9    dc.l    traphand
trapA    dc.l    traphand
trapB    dc.l    traphand
trapC    dc.l    traphand
trapD    dc.l    traphand
trapE    dc.l    traphand
trapF    dc.l    traphand
         ds.l    16

mapreg0  equ     $080000
mapreg1  equ     $180000
mapreg2  equ     $280000
mapreg3  equ     $380000
mapreg4  equ     $480000
mapreg5  equ     $580000
mapreg6  equ     $680000
mapreg7  equ     $780000
acias    equ     $4000C1
aciad    equ     $4000C3

*************************************************
*                                               *
*      System initialasion                      *
*      ------ ------------                      *
*                                               *
*************************************************

         rorg    *

divl     move.w  ccr,-(sp)
         movem.l d2-d4,-(sp)
         clr     d4
         move.l  d1,d2
         beq.s   zerodivl
         bpl.s   divpos1
         neg.l   d2
         or      #2,d4
divpos1  move.l  d0,d1
         bpl.s   divpos2
         neg.l   d1
         eor.l   #3,d4
divpos2  clr.l   d0
         move.l  #1,d3
         bra.s   divsulps
divsulp  lsl.l   #1,d2
         lsl.l   #1,d3
divsulps cmp.l   d2,d1
         bcc     divsulp
         bra.s   divnosub
divlp    cmp.l   d2,d1
         bcs.s   divnosub
         add.l   d3,d0
         sub.l   d2,d1
divnosub lsr.l   #1,d2
         lsr.l   #1,d3
         bne     divlp
         lsr     #1,d4
         bcc.s   nonegrem
         neg.l   d1
nonegrem tst     d4
         beq.s   nonegquo
         neg.l   d0
nonegquo movem.l (sp)+,d2-d4
         move.w  (sp)+,ccr
         tst.l   d0
         rts
zerodivl movem.l (sp)+,d2-d4
         move.l  zerodiv,-(sp)
         rts

berrindh jmp     (a2)
intrind5 jmp     (a3)
intrind6 jmp     (a4)
berrhand equ     *
         ifeq    version
         move.w  (sp),d7
         else
         move.w  8(sp),d7
         endc
         lsr.w   #2,d7
         and.w   #4,d7
         lea     writberr,a0
         add.l   #1,0(a0,d7.w)
         ifeq    version
         add.l   #8,sp
         endc
         lea     berrmess,a0
         bra     crash
addrhand lea     addrmess,a0
         ifeq    version
         add.l   #8,sp
         endc
         bra     crash
illihand lea     illimess,a0
         bra     crash
zdivhand lea     zdivmess,a0
         bra     crash
chckhand lea     chckmess,a0
         bra     crash
oflohand lea     oflomess,a0
         bra     crash
privhand lea     privmess,a0
         bra     crash
trachand lea     tracmess,a0
         bra     crash
hand1010 lea     mess1010,a0
         bra     crash
hand1111 lea     mess1111,a0
         bra     crash
int0hand lea     int0mess,a0
         bra     crash
int1hand lea     int1mess,a0
         bra     crash
int2hand lea     int2mess,a0
         bra     crash
int3hand lea     int3mess,a0
         bra     crash
int4hand lea     int4mess,a0
         bra     crash
int5hand lea     int5mess,a0
         bra     crash
int6hand lea     int6mess,a0
         bra     crash2
int7hand lea     int7mess,a0
         bra     crash
traphand lea     trapmess,a0
         bra     crash
berrmess string  <'Bus error'>
addrmess string  <'Address'>
illimess string  <'Illegal instruction'>
zdivmess string  <'Zero divide'>
chckmess string  <'Check'>
oflomess string  <'Overflow'>
privmess string  <'Privilege'>
tracmess string  <'Trace'>
mess1010 string  <'1010 emulator'>
mess1111 string  <'1111 emulator'>
int0mess string  <'Spurious'>
int1mess string  <'Interrupt 1'>
int2mess string  <'Interrupt 2'>
int3mess string  <'Interrupt 3'>
int4mess string  <'Interrupt 4'>
int5mess string  <'Interrupt 5'>
int6mess string  <'Interrupt 6'>
int7mess string  <'Interrupt 7'>
trapmess string  <'Trap'>
initmess string  <cr,lf,'Initializing local memory.'>
scanmess string  <cr,lf,'Clearing main memory.'>
gropmess string  <cr,lf,'Counting processors'.>
waitmess string  <cr,lf,'Waiting to synchronise.'>
syncmess string  <cr,lf,'Synchronising.'>
copymess string  <cr,lf,'Copying code.'>
         ds.w    0
start    lea     berrhand,a2
         lea     int5hand,a3
         lea     int6hand,a4
         move.b  #$03,acias   Initialise RS232
         move.b  #$11,acias   port.
         lea     initmess,a0
         bsr     printstr
         lea     readlog,a0
         move    #255,d7
         clr.l   d4
         clr.l   d5
initloop move.l  d4,(a0)+
         dbra    d7,initloop
restart  move.w  #$2500,sr
         reset
         move.w  #$FFFF,d6
         move.w  #$0004,d7
rwait    dbra    d6,rwait
         dbra    d7,rwait
         move    #$0080,mapreg0
         move    #$0090,mapreg1
         move    #$00A0,mapreg2
         move    #$00B0,mapreg3
         move    #$00C0,mapreg4
         move    #$00D0,mapreg5
         move    #$00E0,mapreg6
         move    #$00F0,mapreg7
         move.l  #$800000,a6
         clr.l   d2
         clr.l   d3
         lea     scanmess,a0
         bsr     printstr
huntloop lea     sizexit,a2
         move.l  a6,a0
clrloop  move.l  d2,(a0)+
         bra     clrloop
sizexit  lea     berrhand,a2
         ifeq    version
         move.l  2(sp),d0
         else
         move.l  10(sp),d0
         endc
         sub.l   a6,d0
         bne.s   firstok
         add.l   #$80000,a6
         cmp.l   #$C00000,a6
         bne     huntloop
nomemory lea     nomemess,a0
         bsr     printstr
         stop    #$2700
firstok  move.l  d0,nobytes
         sub.l   #progsize+progbase,d0
         bmi     nomemory
         lea     gropmess,a0
         bsr     printstr
         move.l  #$FF0003,a0
         lea     procexit,a2
procloop move.b  (a0),d1
         sub.l   #$10000,a0
         bra     procloop
procexit lea     berrhand,a2
         move.l  #$FF0003,d1
         ifeq    version
         sub.l   2(sp),d1
         else
         sub.l   10(sp),d1
         endc
         clr.w   d1
         swap    d1
         move.b  d1,noprocs
         bsr     divl
         and.l   #$FFFFFFFC,d0
         lea     waitmess,a0
         bsr     printstr
         move.w  #$FFFF,d6
         move.w  #$0004,d7
wait     dbra    d6,wait
         dbra    d7,wait
         lea     syncmess,a0
bwait1   tas     storesem(a6)
         bsr     printstr
         bne     bwait1
         add.b   #1,procnos(a6)
         move.b  procnos(a6),procno
         move.l  membase(a6),a5
         move.l  a5,d1            test a5!
         beq.s   master
         add.l   d0,membase(a6)
         clr.b   storesem(a6)
         lea     final,a3
         stop    #$2400
master   lea     progsize+progbase(a6),a5
         move.l  a5,membase(a6)
         add.l   d0,membase(a6)
         clr.b   storesem(a6)
         lea     copymess,a0
         bsr     printstr
         lea     print,a0
         lea     progbase(a6),a1
         move    #(progsize>>1)-1,d7
moveloop move.w  (a0)+,(a1)+
         dbra    d7,moveloop
         lea     final,a2
         lea     continue,a3
         move.w  #$2400,sr
         move.l  #$FFA003,a0
masterl  move.b  #0,(a0)
continue sub.l   #$10000,a0
         bra     masterl
final    lea     berrhand,a2
         lea     int5hand,a3
         lea     clrscrn,a0
         bsr     printstr
         move.l  0,sp
         lea     -$1000(sp),a0
         move.l  a0,usp
         lsr.l   #2,d0
         sub.l   #1,d0
         bmi     nomemory
         move.l  d0,a1
         move.w  #$0000,sr
         jmp     progbase(a6)

crash    move.l  #cr,d0
         bsr     printsym
         move.l  #lf,d0
         bsr     printsym
         bsr     printstr
         lea     bnagmess,a0
         bsr     printstr
         move.l  2(sp),d0
         move.l  0,sp
         bsr     prthexl
         move.l  #$FFC003,a0
         move.w  #$2500,sr
         lea     crashrst,a2
         lea     crashcon,a4
crashl   move.b  #$0,(a0)
crashcon sub.l   #$10000,a0
         bra.s   crashl
crash2   move.l  #cr,d0
         bsr     printsym
         move.l  #lf,d0
         bsr     printsym
         bsr     printstr
         lea     bnagmess,a0
         bsr     printstr
         move.l  2(sp),d0
         move.l  0,sp
         bsr     prthexl
crashrst lea     berrhand,a2
         lea     int6hand,a4
         add.l   #1,nocrash
         bra     restart

nomemess string  <cr,lf,'No Memory.'>
bnagmess string  <' exception at '>
         ds.w    0
print    move.l  d2,-(sp)
         btst.b  #2,acias
         bne     noprint
         lea     sizemess,a0
         bsr     printstr
         move.l  nobytes,d0
         bsr     prthexl
         lea     procmess,a0
         bsr     printstr
         move.b  noprocs,d0
         add.b   #'0',d0
         bsr     printsym
         lea     crshmess,a0
         bsr     printstr
         move.l  nocrash,d0
         bsr     prthexl
         lea     wrbemess,a0
         bsr     printstr
         move.l  writberr,d0
         bsr     prthexl
         lea     rdbemess,a0
         bsr     printstr
         move.l  readberr,d0
         bsr     prthexl
         lea     patmess,a0
         bsr     printstr
         move.l  (sp),d0
         bsr     prtbinl
         lea     pickmess,a0
         bsr     printstr
         move.l  d4,d0
         bsr     prtbinl
         lea     dropmess,a0
         bsr     printstr
         move.l  d5,d0
         bsr     prtbinl
         lea     readlog+512,a6
         move    #1,d3
plogl0   move    #7,d7
         bsr     newline
plogl1   move    #7,d6
         bsr     newline
         bra.s   plogl2e
plogl2   bsr     space
plogl2e  move.l  -(a6),d0
         bsr     prthexl
         dbra    d6,plogl2
         dbra    d7,plogl1
         dbra    d3,plogl0
         bra     commonpr
noprint  move.b  #$03,acias
         move.b  #$11,acias
commonpr move.l  (sp)+,d3
         move.l  d3,d2
         clr.w   d7
         move.b  procno,d7
         sub.w   #1,d7
         lsl.w   d7
shloop   rol.l   d2
         bcc.s   setones
         and.l   #$FFFFFFFE,d2
         bra     mainpart
setones  or.l    #$00000001,d2
         dbra    d7,shloop
mainpart move.l  a5,a6
         move.l  a1,d6
         move.w  d6,d7
         swap    d6
scanloop exg     d2,d3
         lea     readlog,a0
         move.l  (a6),d1
         eor.l   d2,d1
         beq.s   finea
         move.b  #$51,acias
         move.b  #$11,acias
         bsr     check
finea    exg     d2,d3
         lea     writelog,a0
         move.l  d2,(a6)
         move.l  (a6),d1
         eor.l   d2,d1
         beq.s   fineb
         move.b  #$51,acias
         move.b  #$11,acias
         bsr     check
fineb    add.l   #4,a6
         dbra    d7,scanloop
         dbra    d6,scanloop
         bra     print

check    move.l  d2,d0
         not.l   d0
         and.l   d1,d0
         or.l    d0,d4
         move.l  d2,d0
         and.l   d1,d0
         or.l    d0,d5
         move    a6,d0
         lsl     #5,d0
         and     #$0080,d0
         lea     0(a0,d0),a0
         move    #31,d0
logloop  lsr.l   d1
         bcc.s   noerror
         add.l   #1,(a0)
noerror  add.l   #4,a0
         dbra    d0,logloop
         rts

printsym move    ccr,-(sp)
printsyl btst    #1,acias
         beq     printsyl
         move.b  d0,aciad
         rtr

printstr move    ccr,-(sp)
         movem.l d0-d1/a0,-(sp)
         clr.w   d1
         move.b  (a0)+,d1
         bra.s   printsts
printstl move.b  (a0)+,d0
         bsr     printsym
printsts dbra    d1,printstl
         movem.l (sp)+,d0-d1/a0
         rtr

newline  move    ccr,-(sp)
         move    d0,-(sp)
         move.b  #cr,d0
         bsr     printsym
         move.b  #lf,d0
         bsr     printsym
         move    (sp)+,d0
         rtr

space    move    ccr,-(sp)
         move    d0,-(sp)
         move.b  #' ',d0
         bsr     printsym
         move    (sp)+,d0
         rtr

puthexn  and.b   #$0F,d0
         add.b   #'0',d0
         cmp.b   #'9',d0
         bls     putdig
         add.b   #'A'-'9'-1,d0
putdig   jmp     printsym
prthexn  move    ccr,-(sp)
         move    d0,-(sp)
         bra.s   nentry
prtshexb bsr     space
prthexb  move    ccr,-(sp)
         move    d0,-(sp)
wentry   ror.b   #4,d0
         bsr     puthexn
         move    (sp),d0
nentry   bsr     puthexn
         move    (sp)+,d0
         rtr
prtshexw bsr     space
prthexw  move    ccr,-(sp)
lentry   move    d0,-(sp)
         rol     #8,d0
         bsr     prthexb
         move    (sp),d0
         bra     wentry
prtshexl bsr     space
prthexl  move    ccr,-(sp)
         swap    d0
         bsr     prthexw
         swap    d0
         bra     lentry
prtcarry bcc.s   prtzero
         move    d0,-(sp)
         move.b  #'1',d0
         bra     prtcarrr
prtzero  move    d0,-(sp)
         move.b  #'0',d0
prtcarrr bsr     printsym
         move    (sp)+,d0
         rts
prtsbinl bsr     space
prtbinl  move    ccr,-(sp)
         move    d1,-(sp)
         move    #31,d1
prtbllp  rol.l   #1,d0
         bsr     prtcarry
         dbra    d1,prtbllp
         move    (sp)+,d1
         rtr
prtsbinw bsr     space
prtbinw  move    ccr,-(sp)
         move    d1,-(sp)
         move    #15,d1
prtbwlp  rol     #1,d0
         bsr     prtcarry
         dbra    d1,prtbwlp
         move    (sp)+,d1
         rtr
prtsbinb bsr     space
prtbinb  move    ccr,-(sp)
         move    d1,-(sp)
         move    #7,d1
prtbblp  rol.b   #1,d0
         bsr.s   prtcarry
         dbra    d1,prtbblp
         move    (sp)+,d1
         rtr
clrscrn  string  <esc,'v',cr,lf>
vdustr   string  '.'
sizemess string  <esc,'H'>
procmess string  <' bytes, '>
crshmess string  <' processors, '>
wrbemess string  <' crashes',cr,lf>
rdbemess string  <' write bus errors, '>
patmess  string  <' read bus errors',cr,lf,'pattern '>
pickmess string  <cr,lf,'pick    '>
dropmess string  <cr,lf,'drop    '>
         ds.w    0
progsize equ     *-print
         end
