org $3000 START pstr MACRO lea \1,a1 move.l #13,d0 trap #15 ENDM print MACRO move.l #3,d0 ; print long trap #15 move.l #0,d0 ; print newline move.w #0,d1 trap #15 ENDM _main: pstr NAME move.w #N,-(sp) pea RNAME pea NAME jsr _reverse_string adda.w #10,sp pstr RNAME move.w #N1,-(sp) pea T1 jsr _cycle adda.w #6,sp clr.l d1 move.w d0,d1 print move.w #N2,-(sp) pea T2 jsr _cycle adda.w #6,sp clr.l d1 move.w d0,d1 print move.l #9,d0 trap #15 ******************************************************************************* _reverse_string: link a6,#0 movem.l a2,-(sp) move.l 8(a6),a0 ; source move.l 12(a6),a1 ; dest move.w 16(a6),d0 ; n subi.w #1,d0 ; for dbeq loop0 tst.b (a0)+ ; locate null-terminator dbeq d0,loop0 cmp.w #-1,d0 beq exit0 ; error (return -1) clr.w d0 ; no error suba.l #1,a0 ; go back one (null-terminator) move.l 8(a6),a2 ; reload source loop1 move.b -(a0),(a1)+ ; write reverse cmpa a0,a2 bne loop1 clr.b (a1) ; write null terminator exit0 movem.l (sp)+,a2 unlk a6 rts ******************************************************************************* _cycle: link a6,#0 movem.l d2,-(sp) move.l 8(a6),a0 ; table move.w 12(a6),d1 ; n (assume n > 0) move.w d1,d2 ; save n subi.w #1,d1 ; for dbeq clr.w d0 ; first index loop2 lsl.w #1,d0 ; x2 because table of shorts move.w (a0,d0),d0 ; get entry cmp.w d0,d2 ; if entry == n, done dbeq d1,loop2 clr.w d0 cmp.w #-1,d1 ; cycle? bne exit1 move.w #1,d0 ; cycle exit1 movem.l (sp)+,d2 unlk a6 rts ******************************************************************************* NAME dc.b 'Aaron Bradley',0 E_NAME N equ E_NAME-NAME RNAME ds.b N T1 dc.w 3,4,1,2 E_T1 N1 equ (E_T1-T1)/2 T2 dc.w 3,2,1,2 E_T2 N2 equ (E_T2-T2)/2 ******************************************************************************* end START