         ttl    Boot Processor Initial Test Program.
******************************************          
*                                        *
*  Boot Processor Initial Test Program.  *
*                                        *
*  Checks programmed IO from keyboard.   *
*  Checks mains switch sensing           *
*  Checks Local Ram.                     *
*  Copied from fred:prt.asm 6/12/84 JHB  *
*                                        *
******************************************
         bin
readsym  macro
\*       ds.w     0
\@       btst     #0,acias
         beq      \@
         move.b   aciad,\1
         endm

gethex   macro
         readsym  \2
         printsym \2
         cmp.b    #$40,\2
         bls.s    \@na
         or.b     #$20,\2
\@na     sub.b    #'0',\2
         bmi.s    \1
         cmp.b    #9,\2
         bls.s    \@got
         sub.b    #'a'-'0'-10,\2
         cmp.b    #10,\2
         blo.s    \1
         cmp.b    #15,\2
         bhi.s    \1
\@got    equ      *
         endm

readhex  macro
\@a      clr.l    \1
         gethex   \@a,\2
\@b      lsl.l    #4,\1
         or.b     \2,\1
         gethex   \@c,\2
         bra      \@b
\@c      equ      *
         endm

printsym macro
\*       ds.w     0
\@       btst     #1,acias
         beq      \@
         move.b   \1,aciad
         endm

printstr macro
\*       clr.w    d7
         lea      s\@,a6
         move.b   (a6)+,d7
         sub.w    #1,d7
         bmi.s    n\@
l\@      printsym (a6)+
         dbra     d7,l\@
         bra.s    n\@
s\@      dc.b     e\@-*-1,\1
e\@      equ      *
n\@      ds.w     0
         endm

check    macro
         eor      d0,d1
         beq.s    \@
*        move.b   #$51,acias
*        move.b   #$11,acias
         move     a0,d2
         swap     d3
         or       d2,d3
         swap     d3
         not      d2
         or       d2,d3
         move     d0,d2
         not      d2
         and      d1,d2
         and      d0,d1
         swap     d1
         or       d2,d1
         swap     d1
         swap     d2
         or       d1,d2
         swap     d2
\@       equ      *
         endm

printbin macro
         swap     \1
         move     #15,d7
\@l      rol      #1,\1
         bcc.s    \@z
         printsym #'1'
         bra.s    \@o
\@z      printsym #'0'
\@o      dbra     d7,\@l
         swap     \1
         endm

printhex macro
\*       swap     \1
         move     #3,d7
l\@      rol      #4,\1
         move.b   \1,d6
         and.b    #$0F,d6
         add.b    #'0',d6
         cmp.b    #'9',d6
         bls.s    d\@
         add.b    #'A'-'9'-1,d6
d\@      printsym d6
         dbra     d7,l\@
         swap     \1
         endm

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

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


memlimit equ      $600000
         org      $1000
resetsp  dc.l     $4000
resetpc  dc.l     start
berr     dc.l     berrhand
addrerr  dc.l     addrhand
illinst  dc.l     illihand
zerodiv  dc.l     zdivhand
chkfail  dc.l     chkfhand
trapoflo dc.l     trpvhand
priviol  dc.l     privhand
trace    dc.l     trachand
emul1010 dc.l     illihand
emul1111 dc.l     illihand
         ds.l     12
spurious dc.l     intrhand
auto1    dc.l     int1hand
auto2    dc.l     int2hand
auto3    dc.l     int3hand
auto4    dc.l     int4hand
auto5    dc.l     int5hand
auto6    dc.l     int6hand
auto7    dc.l     int7hand
trap0    dc.l     illihand
trap1    dc.l     illihand
trap2    dc.l     illihand
trap3    dc.l     illihand
trap4    dc.l     illihand
trap5    dc.l     illihand
trap6    dc.l     illihand
trap7    dc.l     illihand
trap8    dc.l     illihand
trap9    dc.l     illihand
trapA    dc.l     illihand
trapB    dc.l     illihand
trapC    dc.l     illihand
trapD    dc.l     illihand
trapE    dc.l     illihand
trapF    dc.l     illihand
         ds.l     16

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

*************************************************
*                                               *
*      System initialisation                    *
*      ------ --------------                    *
*                                               *
*************************************************

berrhand printstr <cr,lf,'Bus'>
callstop printstr <' Error',cr,lf>
stop     bra      stop
addrhand printstr <cr,lf,'Address'>
         bra      callstop
illihand printstr <cr,lf,'Illegal Instruction'>
         bra      callstop
zdivhand printstr <cr,lf,'Zero Divide'>
         bra      callstop
chkfhand printstr <cr,lf,'Bound Check'>
         bra      callstop
trpvhand printstr <cr,lf,'Overflow'>
         bra      callstop
privhand printstr <cr,lf,'Privilege'>
         bra      callstop
trachand printstr <cr,lf,'Trace'>
         bra      callstop
intrhand printstr <cr,lf,'Interrupt'>
         bra      callstop
intrmess string   <cr,lf,'Bus interrupt test, any key terminates'>
intrban  string   <cr,lf,'Patt Lost Spur Pick Drop',cr,lf>
int1hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #1,d0
         bne      chkstate
         swap     d0
         bset     #1,d0
         swap     d0
         bra      chkstate
int2hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #2,d0
         bne      chkstate
         swap     d0
         bset     #2,d0
         swap     d0
         bra      chkstate
int3hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #3,d0
         bne      chkstate
         swap     d0
         bset     #3,d0
         swap     d0
         bra      chkstate
int4hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #4,d0
         bne      chkstate
         swap     d0
         bset     #4,d0
         swap     d0
         bra      chkstate
int5hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #5,d0
         bne      chkstate
         swap     d0
         bset     #5,d0
         swap     d0
         bra      chkstate
int6hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #6,d0
         bne      chkstate
         swap     d0
         bset     #6,d0
         swap     d0
         bra      chkstate
int7hand cmp.l    #intstart,2(sp)
         bls      intrhand
         cmp.l    #intend,2(sp)
         bhi      intrhand
         bclr.l   #7,d0
         bne      chkstate
         swap     d0
         bset     #7,d0
         swap     d0
chkstate move.w   d0,d1
         lsl.w    #8,d1
         move.w   d0,d3
         lsr.w    #1,d3
         swap     d2
         move.w   #7,d2
         move.b   #$A3,d1
         move.l   #$FF0002,a1
         bra.s    chkstlps
chkstlp  clr.b    d1
         lsr.w    #1,d3
         roxr.b   #1,d1
chkstlps move.w   (a1),d4
         eor.w    d1,d4
         move.w   d1,d5
         not.w    d5
         and.w    d4,d5
         and.w    d1,d4
         swap     d5
         or.w     d4,d5
         swap     d5
         swap     d4
         or.w     d5,d4
         swap     d4
         add.l    #$2000,a1
         dbra     d2,chkstlp
         swap     d2
         rte
start    reset
         move.b   #$03,acias   Initialise RS232
         move.b   #$11,acias   port.

*************************************************
*                                               *
*  Test 1                                       *
*                                               *
*  Send Barber Pole Pattern to Screen.          *
*  Continue until any Key is depressed.         *
*                                               *
*************************************************
again    move.b   #' ',d2
newlne   printsym #cr
         printsym #lf
         btst     #0,acias
         bne      part2
         move     #79,d1
         move.b   d2,d0
         add.b    #1,d2
         cmp.b    #$7F,d2
         bne      loop
         move.b   #' ',d2
loop     printsym d0
         add.b    #1,d0
         cmp.b    #$7F,d0
         bne.s    looptst
         move.b   #' ',d0
looptst  dbra     d1,loop
         bra      newlne

******************************************
*                                        *
*  Test 2                                *
*                                        *
*  Check characters are echoed from      *
*  Keyboard correctly.                   *
*  Continue until blank line is entered. *
*                                        *
******************************************

part2    move.b   aciad,d0  Throw away character.
         printstr <cr,lf,lf,'Keyboard Echo Test. Blank line terminates.',cr,lf>
echoloop readsym  d0
         cmp.b    #' ',d0
         blo.s    gotconch
contecho printsym d0
         bra      echoloop
gotconch printsym #cr
         printsym #lf
         readsym  d0
         cmp.b    #' ',d0
         bhs      contecho
         printstr <cr,lf,'Key Switch Test. Any key terminates.',cr,lf>
         clr.w    d0
putswit  swap     d0
         printhex d0
         swap     d0
         printsym #cr
readswit btst.b   #0,acias
         bne.s    part4
         move.b   switches,d1
         and.w    #$000F,d1
         cmp.w    d0,d1
         beq      readswit
         move.w   d1,d0
         bra      putswit
part4    printstr <cr,lf,lf,'Local Memory Test, Any key restarts.'>
         printstr <' Equal limits terminates.',cr,lf>
part4a   move.b   aciad,d0
         clr.l    d4
         clr.l    d5
         printstr <cr,lf,'Starting memory address : '>
         readhex  d4,d0
         printstr <cr,lf,'Ending memory address : '>
         readhex  d5,d0
         sub.l    d4,d5
         beq      part5
         bmi      part4a
         lsr.w    #1,d5
         printstr <cr,lf,'Pat  Drop Pick High Low',cr,lf>
         clr.l    d0
         clr.l    d1
         clr.l    d2
         clr.l    d3
         move.l   d4,a0
         move     d5,d7
lclrloop move     d0,(a0)+
         dbra     d7,lclrloop
         bra      lprint
mainloop move.l   d4,a0
         move     d5,d7
lscnloop swap     d0
         move     (a0),d1
         check
         swap     d0
         move     d0,(a0)
         move     (a0),d1
         check
         add.l    #2,a0
         dbra     d7,lscnloop
lprint   printsym #cr
         printhex d0
         printsym <#' '>
         printhex d1
         printsym <#' '>
         printhex d2
         printsym <#' '>
         printhex d3
         printsym <#' '>
         swap     d3
         printhex d3
         swap     d3
         move     d0,d1
         swap     d0
         move     d1,d0
         swap     d0
         add      #$100,d0
         add.b    #1,d0
         btst.b   #0,acias
         bne      part4a
         bra      mainloop
part5    lea      intrmess,a0
         bsr      printstr
         lea      intrban,a0
         bsr      printstr
         move.w   #$0080,mapreg0
         move.w   #$0090,mapreg1
         move.w   #$00A0,mapreg2
         move.w   #$00B0,mapreg3
         move.w   #$00C0,mapreg4
         move.w   #$00D0,mapreg5
         move.w   #$00E0,mapreg6
         move.w   #$00F0,mapreg7
         clr.l    d0
         clr.l    d4
         clr.l    d5
         clr.l    d6
         clr.l    d7
intrloop move.w   d7,d0
         move.w   d0,d1
         move.l   #$FF0003,a0
         move.w   #7,d2
intrsulp lsr.w    #1,d1
         bcc.s    nointr
intstart move.b   #0,(a0)
nointr   lea      $2000(a0),a0
         dbra     d2,intrsulp
         move.w   #$2000,sr
intend   move.w   #$2700,sr
         or.w     d0,d6
         move.b   #cr,d0
         bsr      printsym
         move.w   d7,d0
         bsr      prthexw
         move.w   d6,d0
         bsr      prtshexw
         swap     d0
         bsr      prtshexw
         swap     d0
         swap     d4
         move.w   d4,d0
         bsr      prtshexw
         swap     d4
         swap     d5
         move.w   d5,d0
         bsr      prtshexw
         swap     d5
         add.b    #2,d7
         btst.b   #0,acias
         beq      intrloop
         move.b   aciad,d0
         move.w   #0,waitsize
         lea      readlog,a0
         move     #143,d7
         clr.l    d4
         clr.l    d5
initloop move.l   d4,(a0)+
         dbra     d7,initloop
         lea      gropexit,a0
         move.l   a0,berr
         move.l   #$800000,a0
         lea      lowacc,a2
         move.w   #$FFFF,d7
         move.w   #(memlimit-1)>>18,d6
         clr.l    d2
         move.l   d2,(a2)
         move.l   d2,4(a2)
         clr.l    d3
rclrloop move.l   d2,(a0)+
         dbra     d7,rclrloop
         dbra     d6,rclrloop
gropexit move.l   resetsp,sp
         move.l   #(memlimit-1)>>18,d7
         sub.l    d6,d7
         lsl.l    #2,d7
         sub.l    #1,d7
         lea      memsize,a0
         move.l   d7,(a0)
*         lea      rprint,a0
*         move.l   #$800000,a1
*         move     #(progsize>>1)-1,d7
*moveloop move.w   (a0)+,(a1)+
*         dbra     d7,moveloop
         lea      clrscrn,a0
         bsr      printstr
         lea      parehand,a0
         move.l   a0,berr
*         jmp      $800000

rprint   move.l   d2,-(sp)
         btst.b   #2,acias
         bne      noprint
         lea      patmess,a0
         bsr      printstr
         move.l   (sp),d0
         bsr      prtbinw
         lea      pickmess,a0
         bsr      printstr
         move.l   d4,d0
         bsr      prtbinw
         lea      dropmess,a0
         bsr      printstr
         move.l   d5,d0
         bsr      prtbinw
         lea      lowmess,a0
         bsr      printstr
         move.l   lowacc,d0
         bsr      prtbinl
         lea      highmess,a0
         bsr      printstr
         move.l   highacc,d0
         bsr      prtbinl
         lea      readlog+576,a6
         move     #1,d3
plogl0   move     #7,d7
         bsr      newline
plogl1   move     #8,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
         btst.b   #0,acias
         beq.s    commonpr
         move.b   aciad,d0
         cmp.b    #$7F,d0
         bne.s    commonpr
         move.l   #0,d0
         move.l   #0,d4
         move.l   #0,d5
         move.l   #143,d6
         lea      readlog,a6
tclrlp   move.l   d0,(a6)+
         dbra     d6,tclrlp
         bra.s    commonpr
noprint  move.b   #$03,acias
         move.b   #$11,acias
commonpr move.l   (sp)+,d3
         move.l   d3,d2
shloop   add.b    #1,d2
         bne.s    mainpart
         move.w   waitsize,d6
         bne.s    waitnotz
         move.l   #$20,d6
waitnotz lsl.w    d6
         move.w   d6,waitsize
*mainpart move.l   #$800000+progsize,a6
*         move.w   #$FFFF-progsize>>2,d7
mainpart move.l   #$800000,a6
         move.b   d2,d0
         and.w    #$00FF,d2
parsetlp lsr.b    d0
         bcc.s    noparinv
         eor.w    #$0100,d2
noparinv dbra     d6,parsetlp
         move.w   #$FFFF,d7
         move.w   waitsize,d6
memtstwt dbra     d7,memtstwt
         dbra     d6,memtstwt
         move.l   #$FFFF,d7
         move.l   memsize,d6
rscnloop exg      d2,d3
         lea      readlog,a0
         move.b   (a6),d1
         eor.b    d2,d1
         beq.s    finea
*        move.b   #$51,acias
*        move.b   #$11,acias
         bsr      check
finea    exg      d2,d3
         lea      writelog,a0
         move.b   d2,(a6)
         move.b   (a6),d1
         eor.b    d2,d1
         beq.s    fineb
*        move.b   #$51,acias
*        move.b   #$11,acias
         bsr      check
fineb    add.l    #1,a6
         dbra     d7,rscnloop
         dbra     d6,rscnloop
         bra      rprint

check    move.b   d2,d0
         not.b    d0
         and.b    d1,d0
         or.b     d0,d4
         move.b   d2,d0
         and.b    d1,d0
         or.b     d0,d5
         move.l   a6,d0
         not.l    d0
         or.l     d0,(a2)
         move.l   a6,d0
         or.l     d0,4(a2)
         and.w    #7,d0
         mulu.w   #36,d0
         lea      4(a0,d0),a0
         move     #7,d0
logloop  lsr.l    d1
         bcc.s    noerror
         add.l    #1,(a0)
noerror  add.l    #4,a0
         dbra     d0,logloop
         rts

parehand move.l   10(sp),d0
         and.w    #7,d0
         mulu.w   #36,d0
         add.l    #1,0(a0,d0)
         move.w   d2,d0
         and.w    #$0100,d0
         or.w     d0,d4
         eor.w    #$0100,d0
         or.w     d0,d5
         add.l    #58,sp
         lea      readlog,a1
         cmp.l    a0,a1
         beq      finea
         bra      fineb

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

printstr move     sr,-(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     sr,-(sp)
         move     d0,-(sp)
         move.b   #cr,d0
         bsr      printsym
         move.b   #lf,d0
         bsr      printsym
         move     (sp)+,d0
         rtr

space    move     sr,-(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     sr,-(sp)
         move     d0,-(sp)
         bra.s    nentry
prtshexb bsr      space
prthexb  move     sr,-(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     sr,-(sp)
lentry   move     d0,-(sp)
         rol      #8,d0
         bsr      prthexb
         move     (sp),d0
         bra      wentry
prtshexl bsr      space
prthexl  move     sr,-(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     sr,-(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     sr,-(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     sr,-(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>
patmess  string   <esc,'Hpattern '>
pickmess string   <cr,lf,'pick    '>
dropmess string   <cr,lf,'drop    '>
lowmess  string   <cr,lf,'low     '>
highmess string   <cr,lf,'high    '>
         ds.w     0
progsize equ      *-rprint
waitsize ds.w     1
memsize  ds.l     1
lowacc   ds.l     1
highacc  ds.l     1
readlog  ds.l     72
writelog ds.l     72
         end
