; This is a code skeleton for a sublibrary for the
; rtgmaster.library ... no guarantie that it is bugfree :)
; I extracted it out of an existing library source of
; mine ... Sometimes you will have toi exchange CGX
; by the name of YOUR sublibrary in this code !!!
; Also, this code may be incomplete...

; Code provided by you HAS to be 100% in Assembly language.
; You will have to write all needed include files, too...
; (look at the include files of the other sublibs for
; examples and for learning what structures exist...
; study the autodocs, too...)
; so the files that have to be done by you to do a sublibrary
; for the XYZ-GFX Board would be (note, that the short name
; for the Board has to be three letters + blank or four letters) :
; rtgXYZ.i
; rtgXYZ.h
; rtgXYZ.library.asm
; rtgXYZ.library


LibVersion      EQU     2
LibRevision     EQU     0

; Look at rtgmaster.guide to get explained which version number has to
; feature which functions

LibName MACRO
        Dc.b    "rtgXYZ"

        ; INSERT LIBNAME HERE !!!
        ; LIBNAME HAS TO BE rtg and UP TO
        ; FOUR LETTERS !!! (or three letters + Blank)

        ENDM

LibVersion      MACRO
        Dc.b    "2"
        Dc.b    ".","0"
        ENDM

; Look at rtgmaster.guide to get the version numbers explained...

XYZ_ID  EQU     "XYZ "

        ; PUT HERE THE NAME OF THE LIB WITHPOUT rtg
        ; AND FILL IN BLANKS, IF NEEDED...

        incdir  "INCLUDE:"

        include "exec/initializers.i"
        include "exec/libraries.i"
        include "exec/types.i"
        include "exec/funcdef.i"
        include "exec/memory.i"
        include "utility/tagitem.i"
        include "rtgmaster/rtgsublibs.i"
        include "rtgmaster/rtgmaster.i"
        include "rtgmaster/rtgXYZ.i"
        include "cybergraphics/cybergraphics.i"
        include "intuition/screens.i"
        include "include:utility/utility_lib.i"

; INCLUDES AND DEFINES HERE...

_LVOAllocMem EQU -198
_LVOFreeMem EQU -210

LibraryExecuteCode      Moveq   #0,d0
        Rts

        CNOP    0,4

rt_MatchTag     Dc.w    $4afc
rt_ROMTag       Dc.l    rt_MatchTag
rt_EndSkip      Dc.l    lib_EndCode
rt_Flags        Dc.b    128     ; RTG_AUTOINIT
rt_Version      Dc.b    LibVersion
rt_Type Dc.b    NT_LIBRARY
rt_Pri  Dc.b    0
rt_Name Dc.l    Text_Library
rt_IDString     Dc.l    Text_Library_ID
rt_Init Dc.l    InitTable

Text_Library    LibName
        Dc.b    ".library",0

Text_Library_ID LibName
        Dc.b    " "
        LibVersion
        Dc.b    " (16.2.95)",10,0
        Dc.b    "Created by Steffen Häuser",10,0

; Put here your copyright...

        CNOP    0,4

InitTable       Dc.l    rbXYZ_SIZEOF

; HERE rbXYZ_SIZEOF with appropriate name has to be
; put in...

        Dc.l    FunctionTable
        Dc.l    DataTable       ;something like primary init
        Dc.l    InitRtgLibrary


FunctionTable   ;OS functions
        Dc.l    lib.Open
        Dc.l    lib.Close
        Dc.l    lib.ExpungeLib
        Dc.l    lib.ExtFunc

        ;public functions
        ; *************************************************
        ; ** Don't change the order of these function !! **
        ; *************************************************
        ;
        Dc.l    _OpenRtgScreen
        Dc.l    _CloseRtgScreen
        Dc.l    _GetRtgScreenData
        Dc.l    _GetScreenModes
        Dc.l    _FreeScreenModes
        Dc.l    _LockRtgScreen
        Dc.l    _UnlockRtgScreen
        Dc.l    _GetBufAdr
        Dc.l    _GetSegment
        Dc.l    _SetSegment
        Dc.l    _LoadRGBRtg
        Dc.l    _RtgScreenAtFront
        Dc.l    _SwitchScreens
        Dc.l    _WriteRtgPixel
        Dc.l    _WriteRtgPixelRGB
        Dc.l    _FillRtgRect
        Dc.l    _FillRtgRectRGB
        Dc.l    _WriteRtgPixelArray
        Dc.l    _WriteRtgPixelRGBArray
        dc.l    _CopyRtgPixelArray
        dc.l    _Private1 ; DO NOT USE THIS... ONLY FOR compatibility to older betas of the library...
        dc.l    _DrawRtgLine
        dc.l    _DrawRtgLineRGB
        dc.l    _WaitRtgSwitch
        dc.l    _WaitRtgBlit
        dc.l    _RtgWaitTOF
        dc.l    _RtgBlit
        dc.l    _RtgBltClear
        dc.l    _CallRtgC2P
        dc.l    _RtgText
        dc.l    _RtgSetFont
        dc.l    _RtgClearPointer
        dc.l    _RtgSetPointer
        dc.l    _RtgSetTextMode
        dc.l    _RtgOpenFont
        dc.l    _RtgCloseFont
        dc.l    _RtgSetTextModeRGB
        dc.l    _RtgInitRDCMP
        dc.l    _RtgWaitRDCMP
        dc.l    _RtgGetMsg
        dc.l    _RtgReplyMsg
        Dc.l    -1

DataTable       INITBYTE        LN_TYPE,NT_LIBRARY
        INITLONG        LN_NAME,Text_Library

        INITBYTE        LIB_FLAGS,LIBF_CHANGED|LIBF_SUMUSED
        ;something has changed the library since last sum;
        ;indicates if the library allows checksumming

        INITWORD        LIB_VERSION,LibVersion
        INITWORD        LIB_REVISION,LibRevision
        INITLONG        LIB_IDSTRING,Text_Library_ID
        dc.l    0



lib.Open        ; IN: d0 = version
        ; IN: a6 = *library base
        ;OUT: d0 = *library base, if successful, 0 otherwise

        Addq.w  #1,LIB_OPENCNT(a6)
        Bclr    #LIBB_DELEXP,LIB_FLAGS(a6)

        Move.l  a6,d0
        Rts

lib.Close       ; IN: a6 = *library base
        ;OUT: d0 = *SegList, if no longer open and delayed expunge,
        ;          0 otherwise

        Moveq   #0,d0

        Subq.w  #1,LIB_OPENCNT(a6)
        Bne.s   .OpenCountNot0

        Btst    #LIBB_DELEXP,LIB_FLAGS(a6)
        Beq.s   .DontExpungeLibrary

        Bsr.s   lib.ExpungeLib

.OpenCountNot0
.DontExpungeLibrary     Rts




lib.ExpungeLib

;according  to Autodocs/RemLibrary a Forbid/Permit pair MUST be placed around
;RemLibrary  to  be  secure.  This should be granted, for ROM code calls this
;typically.  If not called from ROM, there MUST be Forbid/Permit.

        ; IN: a6 = *library base
        ;OUT: d0 = *SegList, if no longer open and delayed expunge,
        ;          0 otherwise

        Tst.w   LIB_OPENCNT(a6)
        Bne.s   .OpenCountNot0

;free   all   resources  (fi  close  libraries)  here  that  were  opened  in
;Init_xpkHUFFLibrary

;xpkHUFF_EL_RemoveLibraryNode:

        Movem.l d1-d7/a0-a6,-(sp)

        Move.l  a6,a5

        Bsr     SmartFree

        Move.l  a6,a5

        Move.l  a6,a1
        Move.l  4.w,a6
        Jsr     -252(a6)

        Move.l  rbXYZ_SegList(a5),d7

        ; THE SEGLIST !!!

        Move.l  a5,a1   *xpkHUFF library base
        Moveq   #0,d0
        Move.w  LIB_NEGSIZE(a5),d0
        Sub.l   d0,a1   equ *memory to free
        Add.w   LIB_POSSIZE(a5),d0      equ size of memory to free

        Move.l  4.w,a6
        Jsr     -198(a6)

        Move.l  d7,d0   return SegList

        Movem.l (sp)+,d1-d7/a0-a6
        Rts


.OpenCountNot0  Bset    #LIBB_DELEXP,LIB_FLAGS(a6)      ;next CloseLib will expunge
                        ;the library if OpenCount = 0
        Moveq   #0,d0
        Rts


lib.ExtFunc     Moveq   #0,d0
        Rts

InitRtgLibrary

 ; IN: d0 = *library base
        ; IN: a0 = *segment list
        ; IN: a6 = *execbase
        ;OUT: d0 = *librarybase, if succesfull, 0 otherwise

        Movem.l a0-a1/d0-d1/d6/a5,-(sp)

        Move.l  d0,a5
        Move.l  a0,rbXYZ_SegList(a5)

        Move.l  a6,rbXYZ_ExecBase(a5)

        ; Insert XYZ...

        ; PUT LIBRARY INIT CODE HERE... especially
        ; open all needed libraries...

        Move.l  a5,d0
        Bra.s   .Ok

        ; You should only jump to .Ok if the graphics
        ; board intended for the use of this sublibrary
        ; was FOUND (you have to provide some code for
        ; this), if this is possible for the Board...
        ; Do not only check for the libraries being
        ; installed, check for Screenmodes or Board
        ; Drivers... (if possible...) If no board was
        found, jump to .Error

.Ok     Movem.l (sp)+,a0-a1/d0-d1/d6/a5
        Rts
.Error  movem.l (sp)+,a0-a1/d0-d1/d6/a5
        move.l #0,d0
        rts

SmartFree

        ; Close the Libraries again here...
        ; if they are not already close... will
        ; be used in errorcase, too...



; And now include all the functions HERE... you should
; at LEAST support all V1.0 functions... you do not need
; to support 2.0 functions up to now, if you have not
; the time to implement all this stuff... As far as i got
; it from John Hendrikx, rtgmaster.library does not support
; all rtg 2.0 functions anyways, up to now ...

_GetScreenmodes

; IN: a6.l = rtgXYZ.library base
        ;OUT: d0.l = List of ScreenModes or zero
        ;COM: you may destroy d0-d1,a0-a1

; This function will be called by rtgmaster.library
; and will return a list of Screenmodes available on
; this Board. Be sure it returns 0, if the Board is not
; available, and that it does not return Screenmodes
; that do not belong to the Board... You will have
; to save the Screenmodes in the RTGScreenmode format
; that is described in the Includes... you will also
; have to write a rtgXXX.h and a rtgXXX.i file, look
; at the includes for examples... Stuff in these two
; files is considered private for your sublibrary...
; If it happens, that your board has a Video RAM organisation
; that currently is not supported by rtgsublibs.i,
; please inform me, so that i can
; modify the Include file...

_FreeScreenModes        ; IN: a0.l = List of ScreenModes or zero
        ; IN: a6.l = rtgCGX.library base
        ;COM: you may destroy d0-d1,a0-a1

; Free the Screenmodelist again...

Insert the functions HERE :

_OpenRtgScreen:
_CloseRtgScreen:
_GetRtgScreenData:
_LockRtgScreen:
_UnlockRtgScreen:
_GetBufAdr:
_GetSegment:
_SetSegment:
_LoadRGBRtg:
_RtgScreenAtFront:
_SwitchScreens:
_WriteRtgPixel:
_WriteRtgPixelRGB:
_FillRtgRect:
_FillRtgRectRGB:
_WriteRtgPixelArray:
_WriteRtgPixelRGBArray:
_CopyRtgPixelArray:
_DrawRtgLine:
_DrawRtgLineRGB:
_WaitRtgSwitch:
_WaitRtgBlit:
_RtgWaitTOF:
_RtgBlit:
_RtgBltClear:
_CallRtgC2P:
_RtgText:
_RtgSetFont:
_RtgClearPointer:
_RtgSetPointer:
_RtgSetTextMode:
_RtgOpenFont:
_RtgCloseFont:
_RtgSetTextModeRGB:
_RtgInitRDCMP
_RtgWaitRDCMP
_RtgGetMsg
_RtgReplyMsg

; Some last notes :
; 1. For the blitting functions use the GFX Board Blitter
; 2. If the Board can't do the blitting functions without
;    waiting on the Blitter, well, then do them WITH waiting
;    and let WaitRtgBlit do simply nothing
; 3. CopyRtgPixelArray and CallRtgC2P have to be implemented
;    in a way that they directly access the Video RAM. *NO*
;    OS functions allowed !!!
; 4. For the Write...Pixel... functions OS functions are
;    allowed... those color conversion stuff with the RGB ones
;    is slow anyways...
; 5. The Draw and Fill Functions have to use the GFX Board
;    blitter if this is possible
; 6. If the board does not need segmented memory, GetSegment
;    and SetSegment simply do nothing (GetSegment returns 0
;    in this case)
; 7. Your code should be 68020-optimized.
; 8. If some functions are NOT possible to be implemented on
;    your board (like for example Pointer stuff for Picasso
;    WB Emulation), simply let the functions do NOTHING. Do
;    NOT simply leave them out, else applications that  use
;    them might crash. Also, send me a note about the fact,
;    that certain functions can't be supported, and i will add
;    something to the docs+autodocs

        END
