fifo equ #$60000 * Address of the interprocess fifo sdaddr equ $30000 * Source and destination address of Cent. Packet dataMW equ $40000 * Most significant 16bits of the data field. dataLW equ $50000 * Least significant 16 bits of the data fields. cntfd equ $70000 * Control field of the centrenet packet. led equ $70000 * LED address cntrl2 equ $10000 cntrl equ $10001 * Holding space for the packet which has just sdadd equ $10002 * been read. data1 equ $10004 data2 equ $10006 save equ $11002 evmode equ $12000 * Flag to indicate which mode, event or centrenet pkt. ct equ $18000 sd equ $19000 dt equ $1a000 bhead equ #$af * centrenet control field values to identify bhack equ #$ae * packet type. dtpk equ #$bf ltpk equ #$1f dtack equ #$be off equ #$ffff * values for the LED operation green equ #$fffe red equ #$fffd both equ #$fffc pkreq equ #$fffb * Initiate a packet request from the fifo. greq equ #$fffa ld2req equ #$fff8 ack equ #$fff7 ackreq equ #$fff3 all equ #$fff0 * * org $01000 * * clrled: move.l led,a2 move.w off,(a2) rts * * grnled: move.l led,a2 move.w green,(a2) rts redled: move.l led,a2 move.w red,(a2) rts bothled: move.l led,a2 move.w both,(a2) rts *readpk: movem.l d0/d1/a0/a1,-(a7) * simulates the fifo by providing * move.l ct,a1 * a packet and placing it in the * move.l (a1),a0 * holding ram space * move.w (a0)+,d0 * move.l a0,(a1) * move.l cntrl2,a1 * move.w d0,(a1) * * move.l sd,a1 * move.l (a1),a0 * move.w (a0)+,d0 * move.l a0,(a1) * move.l sdadd,a1 * move.w d0,(a1) * * move.l dt,a1 * move.l (a1),a0 * move.l (a0)+,d0 * move.l a0,(a1) * move.l data1,a1 * move.l d0,(a1) * movem.l (a7)+,d0/d1/a0/a1 * rts * * getpk: movem.l d7/d0,-(a7) move.b #1,d7 move.w ld2req,led gpwait: cmp.b #0,d7 beq gpclr move.w ld2req,led move.w evmode,d0 cmp.w #0,d0 beq gpwait movem.l (a7)+,d7/d0 or.b #$01,ccr * set carry, mode change taken place rts gpclr: movem.l (a7)+,d7/d0 and.b #$fe,ccr * clear carry, packet available rts centpk: movem.l a0/d0,-(a7) move.l fifo,a0 move.w cntfd,d0 or.w #$ff00,d0 move.w d0,(a0) move.w sdaddr,(a0) move.w dataMW,(a0) move.w dataLW,(a0) movem.l (a7)+,a0/d0 rts cmode: move.w evmode,d0 cmp.w #0,d0 bne cmend move.w both,led jsr getpk bcs cmend jsr centpk cmp.w #10,save beq wait bra cmode cmend: rts eventid:move.w (a1),d5 * extract the event id and.w #$0f0f,d5 move.w d5,d4 lsl.w #4,d4 add.w d4,d5 and.l #$00000ff0,d5 move.l data1,a3 move.l (a3),d4 and.l #$fffff00f,d4 add.w d5,d4 rts * * tmstmp: move.l data1,a3 * get the timestamp move.l (a3),d3 rts * * sendev: move.l a0,-(a7) move.l fifo,a0 move.l d3,(a0) move.l d4,(a0) move.l (a7)+,a0 rts dbase: dc.l $5,$1fef6c41 dc.l $7,$1fef6c4b dc.l $19,$2f9f34c1 dc.l $40,$1fef6c49 dc.l $40,$2f9f34ca dc.l $103,$251f37c1 dc.l $257,$251f37c6 dc.l $290,$2f9f34c2 dc.l $596,$251f37c7 dc.l $1214,$251f37cb dc.l $5681,$251f37c9 dc.l $5681,$1fe50c7a dc.l $12143,$2f9f34c4 dc.l $22772,$1fe50c75 dc.l $22772,$251f37c5 dc.l $79abcd,$1fe50c72 txdb: move.l #16,d5 lea dbase,a1 bra chk more: move.l (a1)+,d3 move.l (a1)+,d4 jsr sendev chk: dbra d5,more move.w off,led rts * * * ctserv: move.w #0,evmode scont: cmp.b #0,d7 * beq nord * move.w ackreq,led * rte nord: move.w ack,led rte evserv: move.w #$ffff,evmode bra scont rfserv: move.w off,led * clear interupt move.b #$00,d7 * clear flag * move fields to holding ram space * move.w sdaddr,sdadd * move.w dataMW,data1 * move.w dataLW,data2 * move.w cntfd,cntrl2 * incr interrupt counter add.w #1,save rte org $003000 init: move.w green,led * Turn on the green LED move.w #00,save * A counter for number of Centrenet pk processed. and.w #$f8ff,sr * move.w #$ff,evmode * current mode default is EVENT MONIT. mode rts start: jsr init move.w off,led * the main part is to check for correct jsr txdb p1cont: move.w evmode,d0 cmp.w #0,d0 bne ntest jsr cmode bra p1cont ntest: move.w off,led * extract event packet information bra p1cont wait: move.w green,led wait2: jmp wait2 * * handshake *nobhd: jsr readpk * read next centrenet packet * move.l cntrl,a0 * get control field * move.b (a0),d0 * cmp.b bhead,d0 * is packet a burst header? * bne halt *nobhd * no ! * move.l sdadd,a1 * get source & dest processor addresses * move.w (a1),d1 * rol.w #8,d1 * swap addresses *nohack: jsr readpk * move.b (a0),d2 * cmp.b bhack,d2 * is packet burst header ack? * bne halt *nohack * No! * move.w (a1),d2 * cmp.b d2,d1 * Do source & dest address match * bne halt *nohack * No! *nodtpk: jsr readpk * read next centrenet packet * move.b (a0),d0 * cmp.b dtpk,d0 * Is this packet a data packet * bne halt *nodtpk * jsr eventid * Generate event identifaction *notmsp: jsr readpk * move.b (a0),d0 ** cmp.b enddt,d0 ** beq endpk * cmp.b dtpk,d0 * bne halt *notmsp * jsr tmstmp * Generate time stamp *moredt jsr readpk * move.b (a0),d0 * cmp.b ltpk,d0 * Last data packet ? * bne halt *moredt *nopack: jsr readpk * cmp.b dtack,(a0) * Burst data ack ? * bne halt *nopack * cmp.w (a1),d1 * source & dest match ? * bne nopack * jsr sendev * pass on event log ** * move.w green,led *halt: trap #0 * * bra nobhd * repeat berr: move.w red,led berr1 jmp berr1 *IN CASE OF BUSERROR adderr: move.w red,led aderr1: jmp aderr1 *IN CASE OF ADDRERROR org $0 dc.l $1fffe *SETUP STACK POINTER dc.l start *START OF PROGRAM dc.l berr *BUSERROR VECTOR dc.l adderr *ADDRERROR VECTOR org $68 dc.l ctserv * Clear event flag to false org $6c dc.l evserv * set event flag to true org $78 dc.l rfserv * storage fifo read service routine. * END