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 scanmess string gropmess string waitmess string syncmess string copymess string 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 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 vdustr string '.' sizemess string 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 dropmess string ds.w 0 progsize equ *-print end