

.macro print arg1
  move.l %d0,-(%a7)
  move.l %a0,-(%a7)
  bsr AsmPrintString
 .asciz "\arg1"
 .balign 2
  move.l (%a7)+,%a0
  move.l (%a7)+,%d0
.endm

.macro dumpregisters arg1
   move.l %d0,-(%a7)
   
   move.l %a0,-(%a7)
   bsr AsmPrintString 
  .asciz "\arg1"
  .balign 2
   move.l (%a7)+,%a0
  
  move.l #0x0D,%d0
  jsr rputchar_asm
  move.l #0x0A,%d0
  jsr rputchar_asm
  move.l #0x44,%d0
  jsr rputchar_asm
  move.l #0x3A,%d0
  jsr rputchar_asm
  move.l (%a7),%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm
  
  move.l %d1,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %d2,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %d3,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %d4,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %d5,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm
  
  move.l %d6,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %d7,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm
  move.l #0x0D,%d0
  jsr rputchar_asm
  move.l #0x0A,%d0
  jsr rputchar_asm
  move.l #0x41,%d0
  jsr rputchar_asm
  move.l #0x3A,%d0
  jsr rputchar_asm
 
  move.l %a0,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm
  
  move.l %a1,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a2,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a3,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a4,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a5,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a6,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm

  move.l %a7,%d0
  addq.l #4,%d0
  jsr rputhex_long_asm
  move.l #0x20,%d0
  jsr rputchar_asm
  
  move.l #0x0D,%d0
  jsr rputchar_asm
  move.l #0x0A,%d0
  jsr rputchar_asm
 
  move.l (%a7)+,%d0
.endm                
                

.macro ShowStack arg1 
   move.l %d0,-(%a7) /* We have now eaten 8 bytes of the stack */
   move.l %a0,-(%a7)
   bsr AsmPrintString 
   .asciz "\arg1"
   .balign 2
   move.l %a7,%a0
   addq.l #8,%a0
   move.l #32,%d0
   jsr  rshowmem_blk
   move.l #0x0d,%d0
   jsr rputchar_asm
   move.l #0x0a,%d0
   jsr rputchar_asm
   move.l (%a7)+,%a0
   move.l (%a7)+,%d0
.endm
 

.text
.global TestASMFunction


/* The function all outchars will be written to... */
.extern CLocalOutByte


/* Put the char in D0 out the serial port */
rputchar_asm:
     move.l %a0,-(%a7)
     move.l %a1,-(%a7)
     move.l %d1,-(%a7)
     move.l %d0,-(%a7)
     jsr CLocalOutByte
     move.l (%a7)+,%d0
     move.l (%a7)+,%d1
     move.l (%a7)+,%a1
     move.l (%a7)+,%a0
     rts
     
     
     
rputhexnib:
   and.l #0x0F,%d0
   cmp.l #0x0a,%d0
   blt risnum
   add.l #0x37,%d0   
   bra rputchar_asm
risnum:  add.l #0x30,%d0
   bra rputchar_asm



rputhexbyte_asm:
    move.l %d0,-(%a7)
    asr.l #4,%d0
    bsr rputhexnib;
    move.l (%a7),%d0
    bsr rputhexnib
    move.l (%a7)+,%d0
    rts


rputhexword_asm:
  move.l %d0,-(%a7)
  asr.l #8,%d0
  bsr rputhexbyte_asm;
  move.l (%a7),%d0
  bsr rputhexbyte_asm
  move.l (%a7)+,%d0
  rts


     
rputhex_long_asm:
    swap %d0
    bsr rputhexword_asm;
    swap %d0
    bsr rputhexword_asm
    rts

                      
                                


AsmPrintString:
   move.l %a7@,%a0
AsmPrintStringLoop:
   move.b %a0@+,%d0
   beq AsmPrintDone
   bsr rputchar_asm
   bra AsmPrintStringLoop
AsmPrintDone:
   move.l %a0,%d0
   addql #1,%d0
   and.l #0xFFFFFFFE,%d0
   movel %d0,%a7@
   rts

                    
rshowmem_blk: /* dump (a0) for %d0 words of data...*/
   move.l %d1,-(%a7)
   move.l %d0,-(%a7)
   move.l %d0,%d1
rshowloop:   
    movel (%a0)+,%d0
    jsr rputhex_long_asm
    move.l %d1,%d0
    andi.l #0x07,%d0
    beq rskip_space
    move.l #0x20,%d0
    jsr rputchar_asm
    bra rnext_test
rskip_space:
    move.l #0x0d,%d0
    jsr rputchar_asm
     move.l #0x0a,%d0
    jsr rputchar_asm
rnext_test:
    sub.l #1,%d1
    bne rshowloop
    move.l (%a7)+,%d0
    move.l (%a7)+,%d1
   rts                    


TestASMFunction:
   move.l #0xCAFEDEAD,%d0
   dumpregisters "Reg dump 0"
   print "This is test number 1\r\n"
   nop
   print "This is test number 2\r\n"
   dumpregisters "Reg dump 1"
   move.l #0xDEADBEEF,%d0
   move.l #0x12345678,%d1
   dumpregisters "Reg dump 2"
   ShowStack "Stack:\r\n"
   dumpregisters "Reg dump 3"
   rts



      
   
 