; The stuff below is some pretty basic support and initialization, and
; should be replaced easily with the includes and macros used in your
; assembly system. I don't think you'll encounter many problems when
; trying to assemble this.

       OPT     A-,M-,O+,O3-,OW-,I+,P+,S-,T+,W+,D-,X-

; Define global variable structure pointer

GP     EQUR    A5

; Equs private to initialization code

InitError      EQU     100
NormError      EQU     20

; Some LVOs & equates (can be gotten by including dos*.i & arpbase.i etc.)

_LVOArpAlloc   EQU     -384
_LVOArpAllocMem        EQU     -390
_LVOArpLock    EQU     -408
_LVOArpOpen    EQU     -396
_LVOAtol       EQU     -258
_LVOCheckAbort EQU     -270
_LVOClose      EQU     -36
_LVOCloseDevice        EQU     -450
_LVOCloseLibrary EQU   -414
_LVODoIO       EQU     -456
_LVODelay      EQU     -198
_LVODeleteFile EQU     -72
_LVOExamine    EQU     -102
_LVOForbid     EQU     -132
_LVOFindPort   EQU     -390
_LVOFindTask   EQU     -294
_LVOGADS       EQU     -252
_LVOInput      EQU     -54
_LVOLock       EQU     -84
_LVOOpen       EQU     -30
_LVOOpenDevice EQU     -444
_LVOOpenLibrary        EQU     -552
_LVOOpenWorkBench EQU  -210
_LVOOutput     EQU     -60
_LVOPermit     EQU     -138
_LVOPuts       EQU     -240
_LVORawDoFmt   EQU     -522
_LVORead       EQU     -42
_LVOSeek       EQU     -66
_LVOSetProtection EQU  -186
_LVOStamptoStr EQU     -564
_LVOStrcmp     EQU     -522
_LVOUnLock     EQU     -90
_LVOWBenchToFront EQU  -342
_LVOWrite      EQU     -48

ACCESS_READ    EQU     -2
ACCESS_WRITE   EQU     -1
ArpVersion     EQU     39
ds_Days                EQU     0
ds_Minute      EQU     4
ds_Tick                EQU     8
fib_DateStamp  EQU     $84
fib_SIZEOF     EQU     $104
FORMAT_DOS     EQU     0
IO_COMMAND     EQU     $1C
IOTV_SIZE      EQU     $28
IOTV_TIME      EQU     $20
LEN_DATSTRING  EQU     10
LN_NAME                EQU     $A
MEMF_CLEAR     EQU     $10000
MEMF_PUBLIC    EQU     1
MN_REPLYPORT   EQU     $E
MODE_NEWFILE   EQU     $3EE
MODE_OLDFILE   EQU     $3ED
OFFSET_END     EQU     1
pr_MsgPort     EQU     $5C
pr_WindowPtr   EQU     $B8
RESIDENT_MAGIC EQU     $4AFC
ThisTask       EQU     $114
TR_SETSYSTIME  EQU     $B
TV_SECS                EQU     0

; Negative structure building macros

ALIGN  MACRO
soff   SET     soff-(soff&1)
       ENDM

STRUCT MACRO
soff   SET     soff-\2
       ALIGN
\1     EQU     soff
       ENDM

LONG   MACRO
       ALIGN
soff   SET     soff-4
\1     EQU     soff
       ENDM

WORD   MACRO
       ALIGN
soff   SET     soff-2
\1     EQU     soff
       ENDM

BYTE   MACRO
soff   SET     soff-1
\1     EQU     soff
       ENDM

SIZE   MACRO
       ALIGN
StrcSize EQU   soff
       ENDM

; Define default variables.

soff   SET     0
       LONG    ComLineBase
       LONG    ComLineSize
       WORD    ReturnCode

; This requires A6 to be set properly! Keep track carefully or reload A6

CALL   MACRO
       JSR     _LVO\1(A6)
       ENDM

; This tells ARP's shell and resident how large a stack we require.

STACK  MACRO
       BRA.S   ResStart
       DC.W    RESIDENT_MAGIC
       DC.L    \1
       DC.L    0
ResStart:
       ENDM

; The big one.

INIT   MACRO

; Setup the stack structure (on stack for reentrability) (GP=A5, do not modify)

       LINK    GP,#StrcSize
       MOVE.L  SP,A1
ClearStackStruct:
       CLR.W   (A1)+
       CMP.L   A1,GP
       BNE     ClearStackStruct

; Initialize default variables

       MOVE.W  #InitError,ReturnCode(GP)
       MOVE.L  A0,ComLineBase(GP)
       MOVE.L  D0,ComLineSize(GP)

; Try to open ARP

       MOVE.L  $4.W,A6
       LEA     ArpName(PC),A1
       MOVEQ   #ArpVersion,D0
       CALL    OpenLibrary
       TST.L   D0
       BNE.S   OpenedOK

; Report that the ARP library could not be opened.

;      MOVEQ   #0,D0           ; Already 0
       LEA     DosName(PC),A1
       CALL    OpenLibrary
       TST.L   D0
       BEQ.S   ThisIsHorrible
       MOVE.L  D0,A6
       CALL    Output
       MOVE.L  D0,D1
       BEQ.S   BackToDOS
       LEA     LibErr(PC),A0
       MOVE.L  A0,D2
       MOVEQ   #StringEnd-LibErr,D3
       CALL    Write

; Return to DOS

BackToDOS:
       MOVE.L  A6,A1
       MOVE.L  $4.W,A6
       CALL    CloseLibrary
ThisIsHorrible:
       MOVE.W  ReturnCode(GP),D0
       EXT.W   D0
       UNLK    GP
       RTS

; Support strings

       IFGE    ArpVersion-100
       FAIL "Version > 3 digits"
       ENDC

TMP      SET   ArpVersion/10
DosName          DC.B  'dos.library',0
LibErr   DC.B  'you need '
ArpName          DC.B  'arp.library',0,' V',TMP+'0',(ArpVersion-(TMP*10))+'0','+',10
StringEnd:
       CNOP    0,2

; A6 = ARP base (Do not modify A6 if you use CALL), lower error level, call user.

OpenedOK:
       MOVE.L  D0,A6
       MOVE.W  #NormError,ReturnCode(GP)
       BSR.S   UserCode
       BRA     BackToDOS
UserCode:
       ENDM
