; This File defines the exec, dos, intuition and graphics offsets, and
; offers the following Macros:
; Macro  CALLSYS  execoffset           CALLSYS  AllocAbs
; Macro  LINKSYS  offset,library       LINKSYS  Open,dos
; Macro  OPENLIB  libraryname          OPENLIB  icon
; Macro  STO      <ea>,labelname       STO      D0,test / ... test: DS.L 1
; Macro  RCL      labelname,<ea>       RCL      test,A0
; Macro  INIT_AMIGA                    call this at the start of your prog
; Macro  EXIT_AMIGA                    call this only once !!
; Macro  MSG      text                 MSG      this_is_a_test
; Subr   PRINT                         BSR PRINT / DC.B "trallala",10,0

; -------------------------------------------
;                exec offsets
; -------------------------------------------
_LVOSupervisor  EQU  -30
_LVOExitIntr  EQU  -36
_LVOSchedule  EQU  -42
_LVOReschedule  EQU  -48
_LVOSwitch  EQU  -54
_LVODispatch  EQU  -60
_LVOException  EQU  -66
_LVOInitCode  EQU  -72
_LVOInitStruct  EQU  -78
_LVOMakeLibrary  EQU  -84
_LVOMakeFunctions  EQU  -90
_LVOFindResident  EQU  -96
_LVOInitResident  EQU  -102
_LVOAlert  EQU  -108
_LVODebug  EQU  -114
_LVODisable  EQU  -120
_LVOEnable  EQU  -126
_LVOForbid  EQU  -132
_LVOPermit  EQU  -138
_LVOSetSR  EQU  -144
_LVOSuperState  EQU  -150
_LVOUserState  EQU  -156
_LVOSetIntVector  EQU  -162
_LVOAddIntServer  EQU  -168
_LVORemIntServer  EQU  -174
_LVOCause  EQU  -180
_LVOAllocate  EQU  -186
_LVODeallocate  EQU  -192
_LVOAllocMem  EQU  -198
_LVOAllocAbs  EQU  -204
_LVOFreeMem  EQU  -210
_LVOAvailMem  EQU  -216
_LVOAllocEntry  EQU  -222
_LVOFreeEntry  EQU  -228
_LVOInsert  EQU  -234
_LVOAddHead  EQU  -240
_LVOAddTail  EQU  -246
_LVORemove  EQU  -252
_LVORemHead  EQU  -258
_LVORemTail  EQU  -264
_LVOEnqueue  EQU  -270
_LVOFindName  EQU  -276
_LVOAddTask  EQU  -282
_LVORemTask  EQU  -288
_LVOFindTask  EQU  -294
_LVOSetTaskPri  EQU  -300
_LVOSetSignal  EQU  -306
_LVOSetExcept  EQU  -312
_LVOWait  EQU  -318
_LVOSignal  EQU  -324
_LVOAllocSignal  EQU  -330
_LVOFreeSignal  EQU  -336
_LVOAllocTrap  EQU  -342
_LVOFreeTrap  EQU  -348
_LVOAddPort  EQU  -354
_LVORemPort  EQU  -360
_LVOPutMsg  EQU  -366
_LVOGetMsg  EQU  -372
_LVOReplyMsg  EQU  -378
_LVOWaitPort  EQU  -384
_LVOFindPort  EQU  -390
_LVOAddLibrary  EQU  -396
_LVORemLibrary  EQU  -402
_LVOOldOpenLibrary  EQU  -408
_LVOCloseLibrary  EQU  -414
_LVOSetFunction  EQU  -420
_LVOSumLibrary  EQU  -426
_LVOAddDevice  EQU  -432
_LVORemDevice  EQU  -438
_LVOOpenDevice  EQU  -444
_LVOCloseDevice  EQU  -450
_LVODoIO  EQU  -456
_LVOSendIO  EQU  -462
_LVOCheckIO  EQU  -468
_LVOWaitIO  EQU  -474
_LVOAbortIO  EQU  -480
_LVOAddResource  EQU  -486
_LVORemResource  EQU  -492
_LVOOpenResource  EQU  -498
_LVORawIOInit  EQU  -504
_LVORawMayGetChar  EQU  -510
_LVORawPutChar  EQU  -516
_LVORawDoFmt  EQU  -522
_LVOGetCC  EQU  -528
_LVOTypeOfMem  EQU  -534
_LVOProcure  EQU  -540
_LVOVacate  EQU  -546
_LVOOpenLibrary  EQU  -552
_LVOInitSemaphore  EQU  -558
_LVOObtainSemaphore  EQU  -564
_LVOReleaseSemaphore  EQU  -570
_LVOAttemptSemaphore  EQU  -576
_LVOObtainSemaphoreList  EQU  -582
_LVOReleaseSemaphoreList  EQU  -588
_LVOFindSemaphore  EQU  -594
_LVOAddSemaphore  EQU  -600
_LVORemSemaphore  EQU  -606
_LVOSumKickData  EQU  -612
_LVOAddMemList  EQU  -618
_LVOCopyMem  EQU  -624
_LVOCopyMemQuick  EQU  -630
; ------------------------------------------
;        DOS offsets
; ------------------------------------------

_LVOOpen  EQU  -30
_LVOClose  EQU  -36
_LVORead  EQU  -42
_LVOWrite  EQU  -48
_LVOInput  EQU  -54
_LVOOutput  EQU  -60
_LVOSeek  EQU  -66
_LVODeleteFile  EQU  -72
_LVORename  EQU  -78
_LVOLock  EQU  -84
_LVOUnLock  EQU  -90
_LVODupLock  EQU  -96
_LVOExamine  EQU  -102
_LVOExNext  EQU  -108
_LVOInfo  EQU  -114
_LVOCreateDir  EQU  -120
_LVOCurrentDir  EQU  -126
_LVOIoErr  EQU  -132
_LVOCreateProc  EQU  -138
_LVOExit  EQU  -144
_LVOLoadSeg  EQU  -150
_LVOUnLoadSeg  EQU  -156
_LVOGetPacket  EQU  -162
_LVOQueuePacket  EQU  -168
_LVODeviceProc  EQU  -174
_LVOSetComment  EQU  -180
_LVOSetProtection  EQU  -186
_LVODateStamp  EQU  -192
_LVODelay  EQU  -198
_LVOWaitForChar  EQU  -204
_LVOParentDir  EQU  -210
_LVOIsInteractive  EQU  -216
_LVOExecute  EQU  -222
; --------------------------------------------------------
;           Intuition offsets
; --------------------------------------------------------
_LVOOpenIntuition  EQU  -30 
_LVOIntuition  EQU  -36 
_LVOAddGadget  EQU  -42 
_LVOClearDMRequest  EQU  -48 
_LVOClearMenuStrip  EQU  -54 
_LVOClearPointer  EQU  -60 
_LVOCloseScreen  EQU  -66 
_LVOCloseWindow  EQU  -72 
_LVOCloseWorkBench  EQU  -78 
_LVOCurrentTime  EQU  -84 
_LVODisplayAlert  EQU  -90 
_LVODisplayBeep  EQU  -96 
_LVODoubleClick  EQU  -102 
_LVODrawBorder  EQU  -108 
_LVODrawImage  EQU  -114 
_LVOEndRequest  EQU  -120 
_LVOGetDefPrefs  EQU  -126 
_LVOGetPrefs  EQU  -132 
_LVOInitRequester  EQU  -138 
_LVOItemAddress  EQU  -144 
_LVOModifyIDCMP  EQU  -150 
_LVOModifyProp  EQU  -156 
_LVOMoveScreen  EQU  -162 
_LVOMoveWindow  EQU  -168 
_LVOOffGadget  EQU  -174 
_LVOOffMenu  EQU  -180 
_LVOOnGadget  EQU  -186 
_LVOOnMenu  EQU  -192 
_LVOOpenScreen  EQU  -198 
_LVOOpenWindow  EQU  -204 
_LVOOpenWorkBench  EQU  -210 
_LVOPrintIText  EQU  -216 
_LVORefreshGadgets  EQU  -222 
_LVORemoveGadget  EQU  -228 
_LVOReportMouse  EQU  -234 
_LVORequest  EQU  -240 
_LVOScreenToBack  EQU  -246 
_LVOScreenToFront  EQU  -252 
_LVOSetDMRequest  EQU  -258 
_LVOSetMenuStrip  EQU  -264 
_LVOSetPointer  EQU  -270 
_LVOSetWindowTitles  EQU  -276 
_LVOShowTitle  EQU  -282 
_LVOSizeWindow  EQU  -288 
_LVOViewAddress  EQU  -294 
_LVOViewPortAddress  EQU  -300 
_LVOWindowToBack  EQU  -306 
_LVOWindowToFront  EQU  -312 
_LVOWindowLimits  EQU  -318 
_LVOSetPrefs  EQU  -324 
_LVOIntuiTextLength  EQU  -330 
_LVOWBenchToBack  EQU  -336 
_LVOWBenchToFront  EQU  -342 
_LVOAutoRequest  EQU  -348 
_LVOBeginRefresh  EQU  -354 
_LVOBuildSysRequest  EQU  -360 
_LVOEndRefresh  EQU  -366 
_LVOFreeSysRequest  EQU  -372 
_LVOMakeScreen  EQU  -378 
_LVORemakeDisplay  EQU  -384 
_LVORethinkDisplay  EQU  -390 
_LVOAllocRemember  EQU  -396 
_LVOAlohaWorkbench  EQU  -402 
_LVOFreeRemember  EQU  -408 
_LVOLockIBase  EQU  -414 
_LVOUnlockIBase  EQU  -420 
_LVOGetScreenData  EQU  -426 
_LVORefreshGList  EQU  -432 
_LVOAddGList  EQU  -438 
_LVORemoveGList  EQU  -444 
_LVOActivateWindow  EQU  -450 
_LVORefreshWindowFrame  EQU  -456 
_LVOActivateGadget  EQU  -462 
_LVONewModifyProp  EQU  -468 
; ---------------------------------------------------------
;           graphics offsets
; ---------------------------------------------------------
_LVOBltBitMap  EQU  -30 
_LVOBltTemplate  EQU  -36 
_LVOClearEOL  EQU  -42 
_LVOClearScreen  EQU  -48 
_LVOTextLength  EQU  -54 
_LVOText  EQU  -60 
_LVOSetFont  EQU  -66 
_LVOOpenFont  EQU  -72 
_LVOCloseFont  EQU  -78 
_LVOAskSoftStyle  EQU  -84 
_LVOSetSoftStyle  EQU  -90 
_LVOAddBob  EQU  -96 
_LVOAddVSprite  EQU  -102 
_LVODoCollision  EQU  -108 
_LVODrawGList  EQU  -114 
_LVOInitGels  EQU  -120 
_LVOInitMasks  EQU  -126 
_LVORemIBob  EQU  -132 
_LVORemVSprite  EQU  -138 
_LVOSetCollision  EQU  -144 
_LVOSortGList  EQU  -150 
_LVOAddAnimOb  EQU  -156 
_LVOAnimate  EQU  -162 
_LVOGetGBuffers  EQU  -168 
_LVOInitGMasks  EQU  -174 
_LVODrawEllipse  EQU  -180 
_LVOAreaEllipse  EQU  -186 
_LVOLoadRGB4  EQU  -192 
_LVOInitRastPort  EQU  -198 
_LVOInitVPort  EQU  -204 
_LVOMrgCop  EQU  -210 
_LVOMakeVPort  EQU  -216 
_LVOLoadView  EQU  -222 
_LVOWaitBlit  EQU  -228 
_LVOSetRast  EQU  -234 
_LVOMove  EQU  -240 
_LVODraw  EQU  -246 
_LVOAreaMove  EQU  -252 
_LVOAreaDraw  EQU  -258 
_LVOAreaEnd  EQU  -264 
_LVOWaitTOF  EQU  -270 
_LVOQBlit  EQU  -276 
_LVOInitArea  EQU  -282 
_LVOSetRGB4  EQU  -288 
_LVOQBSBlit  EQU  -294 
_LVOBltClear  EQU  -300 
_LVORectFill  EQU  -306 
_LVOBltPattern  EQU  -312 
_LVOReadPixel  EQU  -318 
_LVOWritePixel  EQU  -324 
_LVOFlood  EQU  -330 
_LVOPolyDraw  EQU  -336 
_LVOSetAPen  EQU  -342 
_LVOSetBPen  EQU  -348 
_LVOSetDrMd  EQU  -354 
_LVOInitView  EQU  -360 
_LVOCBump  EQU  -366 
_LVOCMove  EQU  -372 
_LVOCWait  EQU  -378 
_LVOVBeamPos  EQU  -384 
_LVOInitBitMap  EQU  -390 
_LVOScrollRaster  EQU  -396 
_LVOWaitBOVP  EQU  -402 
_LVOGetSprite  EQU  -408 
_LVOFreeSprite  EQU  -414 
_LVOChangeSprite  EQU  -420 
_LVOMoveSprite  EQU  -426 
_LVOLockLayerROM  EQU  -432
_LVOUnLockLayerROM  EQU  -438
_LVOSyncSBitMap  EQU  -444 
_LVOCopySBitMap  EQU  -450 
_LVOOwnBlitter  EQU  -456 
_LVODisownBlitter  EQU  -462 
_LVOInitTmpRas  EQU  -468 
_LVOAskFont  EQU  -474 
_LVOAddFont  EQU  -480 
_LVORemFont  EQU  -486 
_LVOAllocRaster  EQU  -492 
_LVOFreeRaster  EQU  -498 
_LVOAndRectRegion  EQU  -504 
_LVOOrRectRegion  EQU  -510 
_LVONewRegion  EQU  -516 
_LVOClearRectRegion  EQU  -522 
_LVOClearRegion  EQU  -528 
_LVODisposeRegion  EQU  -534 
_LVOFreeVPortCopLists  EQU  -540 
_LVOFreeCopList  EQU  -546 
_LVOClipBlit  EQU  -552 
_LVOXorRectRegion  EQU  -558 
_LVOFreeCprList  EQU  -564 
_LVOGetColorMap  EQU  -570 
_LVOFreeColorMap  EQU  -576 
_LVOGetRGB4  EQU  -582 
_LVOScrollVPort  EQU  -588 
_LVOUCopperListInit  EQU  -594 
_LVOFreeGBuffers  EQU  -600 
_LVOBltBitMapRastPort  EQU  -606 
_LVOOrRegionRegion  EQU  -612 
_LVOXorRegionRegion  EQU  -618 
_LVOAndRegionRegion  EQU  -624 
_LVOSetRGB4CM  EQU  -630 
_LVOBltMaskBitMapRastPort  EQU  -636 
_LVOGraphicsReserved1  EQU  -642 
_LVOGraphicsReserved2  EQU  -648 
_LVOAttempLockLayerROM  EQU  -654
; ---------------------------------------------
;               console offsets
; ---------------------------------------------
_LVOCDInputHandler  EQU  -42 
_LVORawKeyConvert  EQU  -48 
; --- IDCMP Classes ------------------------------------------------------ 
SIZEVERIFY      EQU     $00000001 
NEWSIZE         EQU     $00000002 
REFRESHWINDOW   EQU     $00000004 
MOUSEBUTTONS    EQU     $00000008 
MOUSEMOVE       EQU     $00000010  
GADGETDOWN      EQU     $00000020 
GADGETUP        EQU     $00000040  
REQSET          EQU     $00000080 
MENUPICK        EQU     $00000100  
CLOSEWINDOW     EQU     $00000200 
RAWKEY          EQU     $00000400  
REQVERIFY       EQU     $00000800 
REQCLEAR        EQU     $00001000  
MENUVERIFY      EQU     $00002000 
NEWPREFS        EQU     $00004000  
DISKINSERTED    EQU     $00008000 
DISKREMOVED     EQU     $00010000  
WBENCHMESSAGE   EQU     $00020000 
ACTIVEWINDOW    EQU     $00040000 
INACTIVEWINDOW  EQU     $00080000 
DELTAMOVE       EQU     $00100000 
VANILLAKEY      EQU     $00200000 
INTUITICKS      EQU     $00400000 
; NOTEZ-BIEN:           $80000000 is reserved for internal use by IDCMP


; --- FLAGS REQUESTED (NOT DIRECTLY SET THOUGH) BY THE APPLIPROG -------------
WINDOWSIZING    EQU $0001       ; include sizing system-gadget? 
WINDOWDRAG      EQU $0002       ; include dragging system-gadget? 
WINDOWDEPTH     EQU $0004       ; include depth arrangement gadget? 
WINDOWCLOSE     EQU $0008       ; include close-box system-gadget? 

SIZEBRIGHT      EQU $0010       ; size gadget uses right border 
SIZEBBOTTOM     EQU $0020       ; size gadget uses bottom border 

; --- refresh modes ----------------------------------------------------------
; combinations of the REFRESHBITS select the refresh type 
REFRESHBITS     EQU $00C0
SMART_REFRESH   EQU $0000
SIMPLE_REFRESH  EQU $0040
SUPER_BITMAP    EQU $0080
OTHER_REFRESH   EQU $00C0

BACKDROP        EQU $0100       ; this is an ever-popular BACKDROP window 

REPORTMOUSE     EQU $0200       ; set this to hear about every mouse move 

GIMMEZEROZERO   EQU $0400       ; make extra border stuff 

BORDERLESS      EQU $0800       ; set this to get a Window sans border 

ACTIVATE        EQU $1000       ; when Window opens, it's the Active one 

; FLAGS SET BY INTUITION 
WINDOWACTIVE    EQU $2000       ; this window is the active one 
INREQUEST       EQU $4000       ; this window is in request mode 
MENUSTATE       EQU $8000       ; this Window is active with its Menus on 

; --- Other User Flags -------------------------------------------------------
RMBTRAP         EQU $00010000   ; Catch RMB events for your own 
NOCAREREFRESH   EQU $00020000   ; not to be bothered with REFRESH

; --- Other Intuition Flags ----------------------------------------------
WINDOWREFRESH   EQU $01000000   ; Window is currently refreshing
WBENCHWINDOW    EQU $02000000   ; WorkBench Window
WINDOWTICKED    EQU $04000000   ; only one timer tick at a time

SUPER_UNUSED    EQU $FCFC0000   ;bits of Flag unused yet


; --- FLAGS SET BY INTUITION -------------------------------------------------
; The SCREENTYPE bits are reserved for describing various Screen types
; available under Intuition.  
SCREENTYPE      EQU     $000F   ; all the screens types available 
; --- the definitions for the Screen Type ------------------------------------
WBENCHSCREEN    EQU     $0001   ; Ta Da|  The Workbench
CUSTOMSCREEN    EQU     $000F   ; for that special look

SHOWTITLE       EQU     $0010   ; this gets set by a call to ShowTitle() 

BEEPING         EQU     $0020   ; set when Screen is beeping 

CUSTOMBITMAP    EQU     $0040   ; if you are supplying your own BitMap

SCREENBEHIND    EQU     $0080   ; if you want your screen to open behind
                                ; already open screens

SCREENQUIET     EQU     $0100   ; if you do not want Intuition to render
                                ; into your screen (gadgets, title)

STDSCREENHEIGHT EQU     -1      ; supply in NewScreen.Height

PFBA           EQU     $40
DUALPF         EQU     $400
HIRES          EQU     $8000
INTERLACE      EQU     4
HAM            EQU     $800
SPRITES        EQU     $4000
GENLOCK_VIDEO  EQU     2

; --------------------------------------------------
; some usefull macros
; --------------------------------------------------

STO:  MACRO $\1,$\2   ; Store Register to Memorylocation
      LEA   \2,A6
      MOVE.L   \1,(A6)
      ENDM

RCL:  MACRO $\1,$\2  ; recall register from Memorylocation
      MOVE.L   \1(PC),\2
      ENDM

PR_CLI     EQU 172
PR_MsgPort EQU 92

OPENLIB: MACRO $\1
      LEA      \1_txt,A1
      MOVE.L   4,A6
      JSR      -408(A6) ; OldOpenLibrary
      LEA      \1,A6
      MOVE.L   D0,(A6)
      BRA.S    \1_c
\1:   DS.L     1
\1_txt:  DC.B  '\1.library',0
      NOP
\1_c:
      ENDM

CALLSYS: MACRO $\1
       MOVE.L 4,A6
       JSR _LVO\1(A6)
       ENDM

LINKSYS: MACRO $\1,$\2
       LEA \2,A6
       MOVE.L (A6),A6
       JSR _LVO\1(A6)
       ENDM

INIT_AMIGA: MACRO
       STO     SP,Initial_SP
       STO     D0,CmdLen
       STO     A0,CmdString
       SUBA.L  A1,A1
       CALLSYS FindTask
       STO     D0,Own_Task

; Start from Workbench ?

       MOVE.L  D0,A4
       TST.L   PR_CLI(A4)
       BNE.S   MacCont1

; Hole Message

       LEA     PR_MsgPort(A4),A0
       CALLSYS WaitPort
       LEA     PR_MsgPort(A4),A0
       CALLSYS GetMsg
       STO     A5,WBenchMsg

MacCont1:
; Open relevant libraries
       OPENLIB dos
       OPENLIB intuition
       OPENLIB graphics

; find standard input and output
      LINKSYS  Input,dos
      STO      D0,StdIn
      LINKSYS  Output,dos
      STO      D0,StdOut

; restore commandstring parameters
      RCL      CmdString,A0
      RCL      CmdLen,D0
      MOVE.B   #0,1(A0,D0)    ; little service, I hope this makes no CRASH

 ENDM


EXIT_AMIGA: MACRO
      MOVE.L   D0,D7
      LEA      WBenchMsg,A5
      TST.L    (A5)
      BEQ.S    MACcont2
      MOVE.L   4,A6
      JSR      _LVOForbid(A6)
      LEA      WBenchMsg,A5
      MOVE.L   (A5),A1
      JSR      _LVOReplyMsg(A6)

MACcont2:
      LEA      Initial_SP,A5
      MOVE.L   (A5),SP
      MOVE.L   D7,D0
      RTS


WBenchMsg:  DS.L 1
CmdString:  DS.L 1
CmdLen:     DS.L 1
Own_Task:   DS.L 1
Initial_SP: DS.L 1
StdIn:      DS.L 1
StdOut:     DS.L 1

       ENDM


MSG:  MACRO $\1
      BSR   PRINT
      DC.B  '\1',10,0
      NOP
      ENDM
; --------------------------------------------------------------
; some usefull subroutines (call with BSR)
; --------------------------------------------------------------

; --------------------------------------------------------------
;      Print text after BSR instruction up to 0
; --------------------------------------------------------------

      BRA   _End_of_sbrs

PRINT: ; Call like : BSR PRINT / DC.B 'Dies ist ein Text',0
      MOVEM.L  D0-D4/A0,-(A7)
      MOVE.L   24(A7),D2 ; get start of text
      MOVEQ    #0,D3     ; D3 will contain the length of the text
      MOVE.L   D2,A0
_Find_EOT:
      ADDQ.L   #1,D3
      TST.B    0(A0,D3.L)
      BNE.S    _Find_EOT
      ADD.L    D3,A0     ; point to zero byte
      ADDQ.L   #1,A0     ; point to next instruction
      BTST     #0,D3     ; even or odd address ?
      BNE.S    _even_ok
      ADDQ.L   #1,A0     ; align to even address
_even_ok:
      MOVE.L   A0,24(A7) ; store return address
       RCL  StdOut,D1
       LINKSYS Write,dos
      MOVEM.L  (A7)+,D0-D4/A0
      RTS

_End_of_sbrs:
      NOP

