
   XDEF KernelAsm.Copy
   XDEF KernelAsm.PutCh
   XDEF KernelAsm.SortL
   XDEF KernelAsm.SortI

   SECTION "KernelAsm_CODE",CODE

; SortL, SortI

KernelAsm.SortL:
   move.l (a1),d0
   cmp.l  (a0),d0
   bge.s  return    ; (a1) >= (a0) --> done
   move.l (a0),(a1)
   move.l d0,(a0)

return
   rts

KernelAsm.SortI:
   move.w (a1),d0
   cmp.w  (a0),d0
   bge.s  return    ; (a1) >= (a0) --> done
   move.w (a0),(a1)
   move.w d0,(a0)
   bra.s  return

; -------------

; PutChar für RawDoFmt()

; d0 - neues Zeichen
; a3 - Zeiger auf Puffer

KernelAsm.PutCh:
   move.b d0,(a3)+
   rts

; --------------

; Exec.CopyMem() für überlappende Speicherbereiche

; a0 - source
; a1 - target
; d0 - length
; d1 - a0 start
; d2 - a1 start

KernelAsm.Copy:
   tst.l  d0
   beq    \return1
   cmp.l  a0,a1
   beq.s  \overlap
   add.l  d1,a0
   add.l  d2,a1
   move.l 4,a6
   jmp    -624(a6)	; Exec.CopyMem()

\overlap:
   add.l  d1,a0
   add.l  d2,a1
   cmp.l  a0,a1
   bgt.s  \overlap2

; ------------------ source > target

\overlap1:
   moveq  #12,d1
   cmp.l  d1,d0
   bcs.s  \bCopy1
   move.l a0,d1
   btst   #0,d1
   beq.s  \alignD1

\alignS1:
   move.b (a0)+,(a1)+
   subq.l #1,d0

\alignD1:
   move.l a1,d1
   btst   #0,d1
   bne.s  \bCopy1

\copy1:
   move.l d0,d1
   and.w #%11,d1
   move.w d1,-(sp)
   moveq  #96,d1
   cmp.l  d1,d0
   bcs.s  \lCopy1
   movem.l d1-d7/a2-a6,-(sp)

\cqLoop1:
   movem.l (a0)+,d1-d7/a2-a6
   movem.l d1-d7/a2-a6,(a1)
   moveq   #48,d1
   add.l   d1,a1
   sub.l   d1,d0
   cmp.l   d1,d0
   bcc.s   \cqLoop1
   movem.l (sp)+,d1-d7/a2-a6

\lCopy1:
   lsr.l  #2,d0
   beq.s  \rest1
   subq.l #1,d0
   move.l d0,d1
   swap   d0

\lcLoop1:
   move.l (a0)+,(a1)+
   dbra.s d1,\lcLoop1
   dbra.s d0,\lcLoop1

\rest1:
   move.w (sp)+,d1
   beq.s  \return1
   moveq  #0,d0
   bra.s  \entry1

\bCopy1:
   move.w d0,d1
   swap   d0
   bra.s  \entry1

\bcLoop1:
   move.b (a0)+,(a1)+
\entry1:
   dbra.s d1,\bcLoop1
   dbra.s d0,\bcLoop1

\return1:
   rts

; ------------------------- source < target

\overlap2:
   add.l  d0,a0
   add.l  d0,a1
   moveq  #12,d1
   cmp.l  d1,d0
   bcs.s  \bCopy2
   move.l a0,d1
   btst   #0,d1
   beq.s  \alignD2

\alignS2:
   move.b -(a0),-(a1)
   subq.l #1,d0

\alignD2:
   move.l a1,d1
   btst   #0,d1
   bne.s  \bCopy2

\copy2:
   move.l d0,d1
   and.w  #%11,d1
   move.w d1,-(sp)
   moveq  #96,d1
   cmp.l  d1,d0
   bcs.s  \lCopy2
   moveq  #48,d1
   movem.l d1-d7/a2-a6,-(sp)

\cqLoop2:
   sub.l   d1,a0
   movem.l (a0),d1-d7/a2-a6
   movem.l d1-d7/a2-a6,-(a1)
   moveq   #48,d1
   sub.l   d1,d0
   cmp.l   d1,d0
   bcc.s   \cqLoop2
   movem.l (sp)+,d1-d7/a2-a6

\lCopy2:
   lsr.l  #2,d0
   beq.s  \rest2
   subq.l #1,d0
   move.l d0,d1
   swap   d0

\lcLoop2:
   move.l -(a0),-(a1)
   dbra.s d1,\lcLoop2
   dbra.s d0,\lcLoop2

\rest2:
   move.w (sp)+,d1
   beq.s  \return2
   moveq  #0,d0
   bra.s  \entry2

\bCopy2:
   move.w d0,d1
   swap   d0
   bra.s  \entry2

\bcLoop2:
   move.b -(a0),-(a1)
\entry2:
   dbra.s d1,\bcLoop2
   dbra.s d0,\bcLoop2

\return2:
   rts

   END