        mc68040
        XDEF    _AmigaCC040
        XDEF _MyCopy8
    XDEF _MyCopyBack8
    XDEF _MyCopy16
    XDEF _MyCopyBack16
    XDEF _MyCopy24
    XDEF _MyCopyBack24
    XDEF _MyCopy32
    XDEF _MyCopyBack32
    XDEF _RTGM8_BeginDirectRect
    XDEF _RTGM8_EndDirectRect
    XDEF _RTGM16_BeginDirectRect
    XDEF _RTGM16_EndDirectRect
    XDEF _RTGM24_BeginDirectRect
    XDEF _RTGM24_EndDirectRect
    XDEF _RTGM32_BeginDirectRect
    XDEF _RTGM32_EndDirectRect
    XDEF _TheMap
    XDEF _rtgm_backingbuf
    XDEF _rtgm_scr
    XDEF _RTGMasterBase
    XDEF _Sys_SendKeyEvents
    XDEF _RTGM8_SwapBuffers
    XDEF _RTGM16_SwapBuffers
    XDEF _RTGM24_SwapBuffers
    XDEF _RTGM32_SwapBuffers
    XDEF _currentbuffer
    XDEF _proc_type
    XDEF _rtgmtype
    XDEF _extravram
    XDEF _rtgport

    IncDir "include:"
    Include "include:rtgmaster/rtgmaster_lib.i"
    Include "include:exec/types.i"
    Include "include:intuition/intuition.i"
    Include "include:rtgmaster/rtgmaster.i"

 STRUCTURE vid,0
  APTR  vd_buffer
  APTR  vd_colormap
  ULONG vd_rowbytes
  ULONG vd_width
  ULONG vd_height
  ULONG vd_numpages
  APTR  vd_direct
  LABEL vid_SIZEOF

 STRUCTURE vrect,0
  ULONG vr_x
  ULONG vr_y
  ULONG vr_width
  ULONG vr_height
  APTR  vr_pnext
  LABEL vrect_SIZEOF

MOVEM EQU 4
RTGMASTER EQU 3
DOUBLEBUFFER EQU 2
BLITTER EQU 1

VID_WAIT_NONE EQU 0
VID_WAIT_VSYNC EQU 1

_AmigaCC040     ;IN: D0 - X
        ;    D1 - Y
        ;    D2 - BYTESPERLINE
        ;    D3 - WIDTH
        ;    D4 - HEIGHT
        ;    A0 - SOURCE BUFFER
        ;    A1 - DESTINATION BUFFER
        ;NOTES: X MUST BE DIVISIBLE BY 16
        ;       A0 and A1 MUST BE DIVISIBLE BY 16 (MOVE16 restriction)
        ;       This routine is for 8Bit copy and must no be used
        ;       to copy rectangles in 16/24/32 bits
        ;       BYTESPERLINE MUST BE DIVISIBLE BY 16
        ;       MAXIMUN WIDTH = 2048 pixels

        

        MOVEM.L D0-D7/A0-A1,-(A7)
        SUBQ.W  #1,D4
        TST.W   D1
        BEQ.S   .NOD1
        MOVE.W  D1,D5
        MULU.W  D2,D5
        ADD.L   D5,A0
        ADD.L   D5,A1
.NOD1   CMP.W   D2,D3
        BEQ     .VERYFAST
        ADD.W   D0,A0
        ADD.W   D0,A1
        SUB.W   D3,D2
        MOVE.W  D3,D0
        LSR.W   #4,D0
        EOR.W   #$7F,D0
        LSL.W   #2,D0
        LSR.W   #1,D3
        AND.W   #$7,D3
.BIGLOOP        MOVE.W  D3,D1
        JMP     .LOOP(PC,D0.W)
.LOOP   MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        DBF     D1,.LOOP2
        BRA.S   .DH
.LOOP2  MOVE.W  (A0)+,(A1)+
        DBF     D1,.LOOP2
.DH     ADD.W   D2,A0
        ADD.W   D2,A1
        DBF     D4,.BIGLOOP
        MOVEM.L (A7)+,D0-D7/A0-A1
        RTS
.VERYFAST       LSR.W   #4,D3
        EOR.W   #$7F,D3
        LSL.W   #2,D3
.BIGGEST        JMP     .LOOP3(PC,D3.W)
.LOOP3  MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        DBF     D4,.BIGGEST
        MOVEM.L (A7)+,D0-D7/A0-A1
        RTS
_MyCopy8:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Source X Offset
    ; D3 - Source Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu d0,d3
    add d3,a0
    add d2,a0
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.b (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts

_MyCopyBack8:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Destination X Offset
    ; D3 - Destination Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu d1,d3
    add d3,a1
    add d2,a1
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.b (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts
_MyCopy16:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Source X Offset
    ; D3 - Source Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #2,d2
    mulu.l d0,d3
    add d3,a0
    add d2,a0
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.w (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d1,a3
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts

_MyCopyBack16:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Destination X Offset
    ; D3 - Destination Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #2,d2
    mulu.l d1,d3
    add.l d3,a1
    add.l d2,a1
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.w (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d0,a2
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts
_MyCopy24:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Source X Offset
    ; D3 - Source Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #3,d2
    mulu.l d0,d3
    add.l d3,a0
    add.l d2,a0
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.w (a0)+,(a1)+
    move.b (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d1,a3
    add.l d1,a3
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts

_MyCopyBack24:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Destination X Offset
    ; D3 - Destination Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #3,d2
    mulu.l d1,d3
    add.l d3,a1
    add.l d2,a1
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.w (a0)+,(a1)+
    move.b (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d0,a2
    add.l d0,a2
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts
_MyCopy32:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Source X Offset
    ; D3 - Source Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #4,d2
    mulu.l d0,d3
    add.l d3,a0
    add.l d2,a0
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.l (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d1,a3
    add.l d1,a3
    add.l d1,a3
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts

_MyCopyBack32:

    ; A0 - Source Buffer
    ; A1 - Destination Buffer
    ; D0 - Source Buffer RowBytes
    ; D1 - Destination Buffer RowBytes
    ; D2 - Destination X Offset
    ; D3 - Destination Y Offset
    ; D4 - Width
    ; D5 - Height


    movem.l d0-d5/a0-a3,-(sp)
    mulu.l #4,d2
    mulu.l d1,d3
    add.l d3,a1
    add.l d2,a1
    move.l d4,d2
    move.l d5,d3
    sub.l #1,d2
    sub.l #1,d3
    sub.l #1,d4
    move.l a0,a2
    move.l a1,a3
.loop1:
    move.l (a0)+,(a1)+
    dbra d2,.loop1
    add.l d0,a2
    add.l d0,a2
    add.l d0,a2
    add.l d0,a2
    add.l d1,a3
    move.l a2,a0
    move.l a3,a1
    move.l d4,d2
    dbra d3,.loop1
    movem.l (sp)+,d0-d5/a0-a3
    rts

_RTGM8_BeginDirectRect:
    movem.l a0-a3/a6/d0-d5,-(sp)
    move.l a0,a3
    move.l _TheMap,a0
    move.l _rtgm_backingbuf,a1
    movem.l d0/d1/d2/d3,-(sp)
    movem.l d0/d1,-(sp)
    move.l vd_rowbytes(a3),d0
    move.l d2,d1
    move.l d2,d4
    move.l d3,d5
    movem.l (sp)+,d2/d3
    jsr _MyCopy8
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    movem.l (sp)+,d0/d1/d2/d3
    xor.l d4,d4
    xor.l d5,d5
    move.l _RTGMasterBase,a6
    jsr _LVOCopyRtgPixelArray(a6)
    movem.l (sp)+,a0-a3/a6/d0-d5
    rts

_RTGM8_EndDirectRect:
    movem.l a0-a3/d0-d5,-(sp)
    move.l a0,a3
    move.l _rtgm_backingbuf,a0
    move.l _TheMap,a1
    move.l d2,d4
    move.l d3,d5
    move.l d0,d2
    move.l d1,d3
    move.l d2,d0
    move.l vd_rowbytes(a3),d1
    jsr _MyCopyBack8
    movem.l (sp)+,a0-a3/d0-d5
    rts

_RTGM16_BeginDirectRect:
    movem.l a0-a3/a6/d0-d5,-(sp)
    move.l a0,a3
    move.l _TheMap,a0
    move.l _rtgm_backingbuf,a1 
    movem.l d0/d1/d2/d3,-(sp)
    movem.l d0/d1,-(sp)
    move.l vd_rowbytes(a3),d0
    move.l d2,d1
    move.l d2,d4
    move.l d3,d5
    movem.l (sp)+,d2/d3
    jsr _MyCopy16
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    movem.l (sp)+,d0/d1/d2/d3
    xor.l d4,d4
    xor.l d5,d5
    move.l _RTGMasterBase,a6
    jsr _LVOCopyRtgPixelArray(a6)
    movem.l (sp)+,a0-a3/a6/d0-d5
    rts

_RTGM16_EndDirectRect:
    movem.l a0-a3/d0-d5,-(sp)
    move.l a0,a3
    move.l _rtgm_backingbuf,a0
    move.l _TheMap,a1
    move.l d2,d4
    move.l d3,d5
    move.l d0,d2
    move.l d1,d3
    move.l d2,d0
    move.l vd_rowbytes(a3),d1
    jsr _MyCopyBack16
    movem.l (sp)+,a0-a3/d0-d5
    rts

_RTGM24_BeginDirectRect:
    movem.l a0-a3/a6/d0-d5,-(sp)
    move.l a0,a3
    move.l _TheMap,a0
    move.l _rtgm_backingbuf,a1
    movem.l d0/d1/d2/d3,-(sp)
    movem.l d0/d1,-(sp)
    move.l vd_rowbytes(a3),d0
    move.l d2,d1
    move.l d2,d4
    move.l d3,d5
    movem.l (sp)+,d2/d3
    jsr _MyCopy24
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    movem.l (sp)+,d0/d1/d2/d3
    xor.l d4,d4
    xor.l d5,d5
    move.l _RTGMasterBase,a6
    jsr _LVOCopyRtgPixelArray(a6)
    movem.l (sp)+,a0-a3/a6/d0-d5
    rts

_RTGM24_EndDirectRect:
    movem.l a0-a3/d0-d5,-(sp)
    move.l a0,a3
    move.l _rtgm_backingbuf,a0
    move.l _TheMap,a1
    move.l d2,d4
    move.l d3,d5
    move.l d0,d2
    move.l d1,d3
    move.l d2,d0
    move.l vd_rowbytes(a3),d1
    jsr _MyCopyBack24
    movem.l (sp)+,a0-a3/d0-d5
    rts

_RTGM32_BeginDirectRect:
    movem.l a0-a3/a6/d0-d5,-(sp)
    move.l a0,a3
    move.l _TheMap,a0
    move.l _rtgm_backingbuf,a1
    movem.l d0/d1/d2/d3,-(sp)
    movem.l d0/d1,-(sp)
    move.l vd_rowbytes(a3),d0
    move.l d2,d1
    move.l d2,d4
    move.l d3,d5
    movem.l (sp)+,d2/d3
    jsr _MyCopy32
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    movem.l (sp)+,d0/d1/d2/d3
    xor.l d4,d4
    xor.l d5,d5
    move.l _RTGMasterBase,a6
    jsr _LVOCopyRtgPixelArray(a6)
    movem.l (sp)+,a0-a3/a6/d0-d5
    rts

_RTGM32_EndDirectRect:
    movem.l a0-a3/d0-d5,-(sp)
    move.l a0,a3
    move.l _rtgm_backingbuf,a0
    move.l _TheMap,a1
    move.l d2,d4
    move.l d3,d5
    move.l d0,d2
    move.l d1,d3
    move.l d2,d0
    move.l vd_rowbytes(a3),d1
    jsr _MyCopyBack32
    movem.l (sp)+,a0-a3/d0-d5
    rts

_Sys_SendKeyEvents:
    movem.l a0-a1/a6/d1,-(sp)
    move.l _rtgm_scr,a0
    move.l _RTGMasterBase,a6
    jsr _LVORtgGetMsg(a6)
    cmp.l #0,d0
    beq .quit
    move.l d0,a0
    move.l im_Class(a0),d0
    xor.l d1,d1
    move.w im_Code(a0),d1
    lea events,a1
    move.l #0,(a1)
    move.l #0,4(a1)
    move.w #0,8(a1)
    move.w im_Qualifier(a0),4(a1)
    move.w im_MouseX(a0),6(a1)
    move.w im_MouseY(a0),8(a1)
    move.l a0,a1
    move.l _rtgm_scr,a0
    movem.l d0/d1,-(sp)
    jsr _LVORtgReplyMsg(a6)
    movem.l (sp)+,d0/d1
    move.l d0,-(sp)
    and.l #IDCMP_RAWKEY+IDCMP_MOUSEBUTTONS,d0
    cmp.l #0,d0
    beq .quit2
    move.l (sp)+,d0
    and.l #IDCMP_MOUSEBUTTONS,d0
    cmp.l #0,d0
    bne .mouse
    lea events,a0
    move.w d1,(a0)
    move.l a0,d0
    movem.l (sp)+,a0-a1/a6/d1
    rts
.mouse:
   lea events,a0
   move.w d1,2(a0)
   move.l a0,d0
   movem.l (sp)+,a0-a1/a6/d1
   rts
.quit2:
    move.l (sp)+,d0
.quit:
    lea events,a0
    move.l _rtgport,a1
    move.l a2,-(sp)
    move.l rdcmp_MouseY(a1),a2
    move.l rdcmp_MouseX(a1),a1
    move.w (a1),6(a0)
    move.w (a2),8(a0)
    move.l (sp)+,a2
    move.l a0,d0
    movem.l (sp)+,a0-a1/a6/d1
    rts
events:
    dc.w 0
    dc.w 0,0
    dc.w 0,0

_RTGM8_SwapBuffers:
    movem.l a0-a3/a6/d0-d2,-(sp)
    cmp.l #VID_WAIT_VSYNC,d0
    bne .nowait
    movem.l a0-a2,-(sp)
    move.l _rtgm_scr,a0
    move.l _RTGMasterBase,a6 
    jsr _LVOWaitTOF(a6)
    movem.l (sp)+,a0-a2
.nowait:
    move.l _rtgmtype,d0
    cmp.l #DOUBLEBUFFER,d0
    beq .DBuffer
    cmp.l #BLITTER,d0
    beq .Blit
    cmp.l #RTGMASTER,d0
    beq .Rtgmaster
    beq .Movem
    cmp.l #MOVEM,d0
    beq .Movem
    move.l _proc_type,d0
    cmp.l #1,d0
    beq .FCopy
.Rtgmaster:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    move.l vr_x(a2),d0
    move.l vr_y(a2),d1
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    move.l vd_buffer(a3),a2
    move.l #0,d4
    move.l #0,d5
    jsr _LVOCopyRtgPixelArray(a6)
    jmp .quit
.Movem:
    movem.l d3-d7,-(sp)
    move.l a0,a3
    move.l vd_buffer(a3),a0
    move.l vr_y(a2),d1
    mulu.l vd_rowbytes(a3),d1
    move.l _TheMap,a1
    add.l d1,a1
    add.l d1,a0
    move.l vr_x(a2),d0
    add.l d0,a1
    add.l d0,a0
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    move.l vd_rowbytes(a3),d0
    sub.l d2,d0
    lsr.l #6,d2 
    sub.l #1,d2
    sub.l #1,d3
    move.l d2,d1
.loop:
    Movem.l (A0)+,d4-d7
    Movem.l d4-d7,(A1)
    Movem.l (A0)+,d4-d7
    Movem.l d4-d7,16*1(A1)
    Movem.l (A0)+,d4-d7
    Movem.l d4-d7,16*2(A1)
    Movem.l (A0)+,d4-d7
    Movem.l d4-d7,16*3(A1)
    lea 64(a1),a1
    dbra d1,.loop
    move.l d2,d1
    add.l d0,a0
    add.l d0,a1
    dbra d3,.loop
    movem.l (sp)+,d3-d7
    jmp .quit

.DBuffer:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l #1,d0
    sub.l _currentbuffer,d0
    jsr _LVOSwitchScreens(a6)
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,vd_buffer(a3)
    move.l #1,d0
    sub.l _currentbuffer,d0
    move.l d0,_currentbuffer
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,_TheMap
    jmp .quit
.Blit:
    move.l _rtgm_scr,a0
    move.l #1,a1
    move.l vr_x(a2),d2
    move.l vr_y(a2),d3
    move.l vr_width(a2),d4
    move.l vr_height(a2),d5
    move.l #0,a2
    move.l #0,d0
    move.l #0,d1
    move.l #$C0,d6
    jsr _LVORtgBlit(a6)
    jmp .quit
.FCopy:
    move.l vd_rowbytes(a0),d2
    move.l vd_buffer(a0),a0
    move.l vr_x(a2),d0
    move.l vr_y(a2),d1
    move.l _TheMap,a1
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    jsr _AmigaCC040
.quit:
    movem.l (sp)+,a0-a3/a6/d0-d2
    rts

_RTGM16_SwapBuffers:
    movem.l a0-a3/a6/d0-d2,-(sp)
    cmp.l #VID_WAIT_VSYNC,d0
    bne .nowait
    movem.l a0-a2,-(sp)
    move.l _rtgm_scr,a0
    move.l _RTGMasterBase,a6
    jsr _LVOWaitTOF(a6)
    movem.l (sp)+,a0-a2
.nowait:
    move.l _rtgmtype,d0
    cmp.l #DOUBLEBUFFER,d0
    beq .DBuffer
    cmp.l #BLITTER,d0
    beq .Blit
.Rtgmaster:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    move.l vr_x(a2),d0
    move.l vr_y(a2),d1
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    move.l vd_buffer(a3),a2
    move.l #0,d4
    move.l #0,d5
    jsr _LVOCopyRtgPixelArray(a6)
    jmp .quit
.DBuffer:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l #1,d0
    sub.l _currentbuffer,d0
    jsr _LVOSwitchScreens(a6)
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,vd_buffer(a3)
    move.l #1,d0
    sub.l _currentbuffer,d0
    move.l d0,_currentbuffer
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,_TheMap
    jmp .quit
.Blit:
    move.l _rtgm_scr,a0
    move.l #1,a1
    move.l vr_x(a2),d2
    move.l vr_y(a2),d3
    move.l vr_width(a2),d4
    move.l vr_height(a2),d5
    move.l #0,a2
    move.l #0,d0
    move.l #0,d1
    move.l #$C0,d6
    jsr _LVORtgBlit(a6)
    jmp .quit
.quit:
    movem.l (sp)+,a0-a3/a6/d0-d2
    rts

_RTGM24_SwapBuffers:
    movem.l a0-a3/a6/d0-d2,-(sp)
    cmp.l #VID_WAIT_VSYNC,d0
    bne .nowait
    movem.l a0-a2,-(sp)
    move.l _rtgm_scr,a0
    move.l _RTGMasterBase,a6
    jsr _LVOWaitTOF(a6)
    movem.l (sp)+,a0-a2
.nowait:
    move.l _rtgmtype,d0
    cmp.l #DOUBLEBUFFER,d0
    beq .DBuffer
    cmp.l #BLITTER,d0
    beq .Blit
.Rtgmaster:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    move.l vr_x(a2),d0
    move.l vr_y(a2),d1
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    move.l vd_buffer(a3),a2
    move.l #0,d4
    move.l #0,d5
    jsr _LVOCopyRtgPixelArray(a6)
    jmp .quit
.DBuffer:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l #1,d0
    sub.l _currentbuffer,d0
    jsr _LVOSwitchScreens(a6)
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,vd_buffer(a3)
    move.l #1,d0
    sub.l _currentbuffer,d0
    move.l d0,_currentbuffer
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,_TheMap
    jmp .quit
.Blit:
    move.l _rtgm_scr,a0
    move.l #1,a1
    move.l vr_x(a2),d2
    move.l vr_y(a2),d3
    move.l vr_width(a2),d4
    move.l vr_height(a2),d5
    move.l #0,a2
    move.l #0,d0
    move.l #0,d1
    move.l #$C0,d6
    jsr _LVORtgBlit(a6)
    jmp .quit
.quit:
    movem.l (sp)+,a0-a3/a6/d0-d2
    rts

_RTGM32_SwapBuffers:
    movem.l a0-a3/a6/d0-d2,-(sp)
    cmp.l #VID_WAIT_VSYNC,d0
    bne .nowait
    movem.l a0-a2,-(sp)
    move.l _rtgm_scr,a0
    move.l _RTGMasterBase,a6
    jsr _LVOWaitTOF(a6)
    movem.l (sp)+,a0-a2
.nowait:
    move.l _rtgmtype,d0
    cmp.l #DOUBLEBUFFER,d0
    beq .DBuffer
    cmp.l #BLITTER,d0
    beq .Blit
.Rtgmaster:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l _TheMap,a1
    move.l vr_x(a2),d0
    move.l vr_y(a2),d1
    move.l vr_width(a2),d2
    move.l vr_height(a2),d3
    move.l vd_buffer(a3),a2
    move.l #0,d4
    move.l #0,d5
    jsr _LVOCopyRtgPixelArray(a6)
    jmp .quit
.DBuffer:
    move.l a0,a3
    move.l _rtgm_scr,a0
    move.l #1,d0
    sub.l _currentbuffer,d0
    jsr _LVOSwitchScreens(a6)
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,vd_buffer(a3)
    move.l #1,d0
    sub.l _currentbuffer,d0
    move.l d0,_currentbuffer
    move.l _rtgm_scr,a0
    move.l _currentbuffer,d0
    jsr _LVOGetBufAdr(a6)
    move.l d0,_TheMap
    jmp .quit
.Blit:
    move.l _rtgm_scr,a0
    move.l #1,a1
    move.l vr_x(a2),d2
    move.l vr_y(a2),d3
    move.l vr_width(a2),d4
    move.l vr_height(a2),d5
    move.l #0,a2
    move.l #0,d0
    move.l #0,d1
    move.l #$C0,d6
    jsr _LVORtgBlit(a6)
    jmp .quit
.quit:
    movem.l (sp)+,a0-a3/a6/d0-d2
    rts

_TheMap: dc.l 0
_rtgm_scr: dc.l 0
_rtgm_backingbuf: dc.l 0
_RTGMasterBase: dc.l 0
_currentbuffer: dc.l 0
_proc_type: dc.l 0
_rtgmtype: dc.l 0
_extravram: dc.l 0
_rtgport: dc.l 0
    END

