;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
;@                                                                            @
 
;@                 S Y M B O S   S Y S T E M   L I B R A R Y                  @
 
;@                        - SYSTEM MANAGER FUNCTIONS -                        @
 
;@                                                                            @
 
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 
 
;Author     Prodatron / Symbiosis
 
;Date       28.03.2015
 
 
 
;The system manager is responsible for starting and stopping applications and
 
;it also provides several dialogue services.
 
;This library supports you in using the system manager functions.
 
 
 
;The existance of
 
;- "App_PrcID" (a byte, where the ID of the applications process is stored)
 
;- "App_MsgBuf" (the message buffer, 14 bytes, which are placed in the transfer
 
;  ram area)
 
;is required.
 
 
 
 
 
;### SUMMARY ##################################################################
 
 
 
;use_SySystem_PRGRUN     equ 0   ;Starts an application or opens a document
 
;use_SySystem_PRGEND     equ 0   ;Stops an application and frees its resources
 
;use_SySystem_PRGSRV     equ 0   ;Manages shared services or finds applications
 
;use_SySystem_SYSWRN     equ 0   ;Opens an info, warning or confirm box
 
;use_SySystem_SELOPN     equ 0   ;Opens the file selection dialogue
 
;use_SySystem_HLPOPN     equ 0   ;Opens the help file for this application (##!!## missing doc)
 
 
 
 
 
;### MAIN FUNCTIONS ###########################################################
 
 
 
if use_SySystem_PRGRUN=1
 
SySystem_PRGRUN
 
;******************************************************************************
 
;*** Name           Program_Run_Command
 
;*** Input          HL = File path and name address
 
;***                A  = [Bit0-3] File path and name ram bank (0-15)
 
;***                     [Bit7  ] Flag, if system error message should be
 
;***                              suppressed
 
;*** Output         A  = Success status
 
;***                     0 = OK
 
;***                     1 = File does not exist
 
;***                     2 = File is not an executable and its type is not
 
;***                         associated with an application
 
;***                     3 = Error while loading (see P8 for error code)
 
;***                     4 = Memory full
 
;***                - If success status is 0:
 
;***                L  = Application ID
 
;***                H  = Process ID (the applications main process)
 
;***                - If success status is 3:
 
;***                L  = File manager error code
 
;*** Destroyed      F,BC,DE,IX,IY
 
;*** Description    Loads and starts an application or opens a document with a
 
;***                known type by loading the associated application first.
 
;***                If Bit7 of A is not set, the system will open a message box,
 
;***                if an error occurs during the loading process.
 
;***                If the operation was successful, you will find the
 
;***                application ID and the process ID in L and H. If it failed
 
;***                because of loading problems L contains the file manager
 
;***                error code.
 
;******************************************************************************
 
        ld c,MSC_SYS_PRGRUN
 
        call SySystem_SendMessage
 
SySPRn1 call SySystem_WaitMessage
 
        cp MSR_SYS_PRGRUN
 
        jr nz,SySPRn1
 
        ld a,(App_MsgBuf+1)
 
        ld hl,(App_MsgBuf+8)
 
        ret
 
endif
 
 
 
if use_SySystem_PRGEND=1
 
SySystem_PRGEND
 
;******************************************************************************
 
;*** Name           Program_End_Command
 
;*** Input          L  = Application ID
 
;*** Output         -
 
;*** Destroyed      AF,BC,DE,HL,IX,IY
 
;*** Description    Stops an application and releases all its used system
 
;***                resources. This command first stops all processes of the
 
;***                application. After this all open windows will be closed and the
 
;***                reserved memory will be released.
 
;***                Please note, that this command can't release memory, stop
 
;***                processes and timers or close windows, which are not
 
;***                registered for the application. Such resources first have
 
;***                to be released by the application itself.
 
;******************************************************************************
 
        ld c,MSC_SYS_PRGEND
 
        jp SySystem_SendMessage
 
endif
 
 
 
if use_SySystem_PRGSRV=1
 
SySystem_PRGSRV
 
;******************************************************************************
 
;*** Name           Program_SharedService_Command
 
;*** Input          E  = Command type
 
;***                     0 = search application or shared service
 
;***                     1 = search, start and use shared service
 
;***                     2 = release shared service
 
;***                - if E is 0 or 1:
 
;***                HL = Address of the 12byte application ID string
 
;***                - if E is 0 or 1:
 
;***                A  = Ram bank (0-15) of the 12byte application ID string
 
;***                - if E is 2:
 
;*** Output         A  = Result status
 
;***                     0 = OK
 
;***                     5 = application or shared service not found (can only
 
;***                         occur on command type 0)
 
;***                     1-4=error while starting shared service; same codes
 
;***                         like in MSR_SYS_PRGRUN, please read there for a
 
;***                         detailed description
 
;***                - If command type was 0 or 1, and result status is 0:
 
;***                L  = Application ID
 
;***                H  = Process ID (the applications main process)
 
;***                - If result status is 3:
 
;***                L  = File manager error code
 
;*** Destroyed      F,BC,DE,IX,IY
 
;*** Description    This function can be used to find, start and release shared
 
;***                services or to find applications.
 
;***                For a detailed description please read chapter "System
 
;***                Manager", "Program_SharedService_Command" in the SymbOS
 
;***                Developer Documentation.
 
;******************************************************************************
 
        ld c,MSC_SYS_PRGSRV
 
        call SySystem_SendMessage
 
SySPSr1 call SySystem_WaitMessage
 
        cp MSR_SYS_PRGSRV
 
        jr nz,SySPSr1
 
        ld a,(App_MsgBuf+1)
 
        ld hl,(App_MsgBuf+8)
 
        ret
 
endif
 
 
 
if use_SySystem_SYSWRN=1
 
SySystem_SYSWRN
 
;******************************************************************************
 
;*** Name           Dialogue_Infobox_Command
 
;*** Input          HL = Content data address (#C000-#FFFF)
 
;***                A  = Content data ram bank (0-15)
 
;***                B  = [Bit0-2] Number of buttons (1-3)
 
;***                              1 = "OK" button
 
;***                              2 = "Yes", "No" buttons
 
;***                              3 = "Yes", "No", "Cancel" buttons
 
;***                     [Bit3-5] Titletext
 
;***                              0 = default (bit7=[0]"Error!"/[1]"Info")
 
;***                              1 = "Error!"
 
;***                              2 = "Info"
 
;***                              3 = "Warning"
 
;***                              4 = "Confirmation"
 
;***                     [Bit6  ] Flag, if window should be modal window
 
;***                     [Bit7  ] Box type
 
;***                              0 = default (warning [!] symbol)
 
;***                              1 = info (own symbol will be used)
 
;***                DE = 0 or data record of the caller window; the dialogue
 
;***                     window will be a modal window of it, during its open
 
;*** Content data   00  1W  Address of text line 1
 
;***                02  1W  4 * [text line 1 pen] + 2
 
;***                04  1W  Address of text line 2
 
;***                06  1W  4 * [text line 2 pen] + 2
 
;***                08  1W  Address of text line 3
 
;***                10  1W  4 * [text line 3 pen] + 2
 
;***                - if E[bit7] is 1:
 
;***                12  1W  Address of symbol (24x24 pixel SymbOS graphic format)
 
;*** Output         A  = Result status
 
;***                     0 -> The infobox is currently used by another
 
;***                          application. It can only be opened once at the
 
;***                          same time, if it's not a pure info message (one
 
;***                          button, not a modal window). The user should
 
;***                          close the other infobox first before it can be
 
;***                          opened again by the application.
 
;***                     2 -> The user clicked "OK".
 
;***                     3 -> The user clicked "Yes".
 
;***                     4 -> The user clicked "No".
 
;***                     5 -> The user clicked "Cancel" or the close button.
 
;*** Destroyed      F,BC,DE,HL,IX,IY
 
;*** Description    Opens an info, warning or confirm box and displays three line
 
;***                of text and up to three click buttons.
 
;***                If Bit7 of B is set to 1, you can specify an own symbol, which
 
;***                will be showed left to the text. If this bit is not set, a "!"-
 
;***                warning symbol will be displayed.
 
;***                If Bit6 of B is set to 1, the window will be opened as a modal
 
;***                window, and you will receive a message with its window number
 
;***                (see MSR_SYS_SYSWRN).
 
;***                Please note, that the content data must always be placed in the
 
;***                transfer ram area (#C000-#FFFF). The texts itself and the
 
;***                optional graphic must always be placed inside a 16K (data ram
 
;***                area).
 
;***                As the text line pen, you should choose 1, so 6 would be the
 
;***                correct value.
 
;***                For more information about the mentioned memory types (data,
 
;***                transfer) see the "applications" chapter.
 
;***                For more information about the SymbOS graphic format see the
 
;***                "desktop manager data records" chapter.
 
;******************************************************************************
 
        ld (SySWrnW),de
 
        ld e,b
 
        ld c,MSC_SYS_SYSWRN
 
        push bc
 
        call SySystem_SendMessage
 
        pop af
 
        and 7+64
 
        dec a
 
        ret z
 
SySWrn1 call SySystem_WaitMessage
 
        cp MSR_SYS_SYSWRN
 
        jr nz,SySWrn1
 
        ld ix,(SySWrnW)
 
        db #dd:ld a,l
 
        db #dd:or h
 
        ld c,0
 
        jr z,SySWrn2
 
        ld (ix+51),c
 
        inc c
 
SySWrn2 ld a,(App_MsgBuf+1)
 
        cp 1
 
        ret nz
 
        dec c
 
        jr nz,SySWrn1
 
        ld a,(App_MsgBuf+2)
 
        ld (ix+51),a
 
        jr SySWrn1
 
SySWrnW dw 0
 
endif
 
 
 
if use_SySystem_SELOPN=1
 
SySystem_SELOPN
 
;******************************************************************************
 
;*** Name           Dialogue_FileSelector_Command
 
;*** Input          HL = File mask, path and name address (#C000-#FFFF)
 
;***                     00  3B  File extension filter (e.g. "*  ")
 
;***                     03  1B  0
 
;***                     04 256B path and filename
 
;***                A  = [Bit0-3] File mask, path and name ram bank (0-15)
 
;***                     [Bit6  ] Flag, if "open" (0) or "save" (1) dialogue
 
;***                     [Bit7  ] Flag, if file (0) or directory (1) selection
 
;***                C  = Attribute filter
 
;***                     Bit0 = 1 -> don't show read only files
 
;***                     Bit1 = 1 -> don't show hidden files
 
;***                     Bit2 = 1 -> don't show system files
 
;***                     Bit3 = 1 -> don't show volume ID entries
 
;***                     Bit4 = 1 -> don't show directories
 
;***                     Bit5 = 1 -> don't show archive files
 
;***                IX = Maximum number of directory entries
 
;***                IY = Maximum size of directory data buffer
 
;***                DE = Data record of the caller window; the file selector
 
;***                     window will be a modal window of it, during its open)
 
;*** Output         A  = Success status
 
;***                     0 -> The user choosed a file and closed the dialogue
 
;***                          with "OK". The complete file path and name can be
 
;***                          found in the filepath buffer of the application.
 
;***                     1 -> The user aborted the file selection. The content
 
;***                          of the applications filepath buffer is unchanged.
 
;***                     2 -> The file selection dialogue is currently used by
 
;***                          another application. It can only be opened once
 
;***                          at the same time. The user should close the
 
;***                          dialogue first before it can be opened again by
 
;***                          the application.
 
;***                     3 -> Memory full. There was not enough memory
 
;***                          available for the directory buffer and/or the
 
;***                          list data structure.
 
;***                     4 -> No window available. The desktop manager couldn't
 
;***                          open a new window for the dialogue, as the
 
;***                          maximum number of windows (32) has already been
 
;***                          reached.
 
;*** Destroyed      F,BC,DE,HL,IX,IY
 
;*** Description    Opens the file selection dialogue. In this dialogue the user
 
;***                can move through the directory structure, change the drive and
 
;***                search and select a file or a directory for opening or saving.
 
;***                If you specify a path, the dialogue will start directly in the
 
;***                directory. If you append a filename, too, it will be used as
 
;***                the preselected file.
 
;***                You can filter the entries of the directory by attributes and
 
;***                filename extension. We recommend always to set Bit3 of the
 
;***                attribute filter byte.
 
;***                The File mask/path/name string (260 bytes) must always be
 
;***                placed in the transfer ram area (#C000-#FFFF). For more
 
;***                information about this memory types see the "applications"
 
;***                chapter.
 
;***                Please note, that the system will reserve memory to store the
 
;***                listed directory entries and the data structure of the list.
 
;***                With IX and IY you can choose, how much memory should be used.
 
;***                We recommend to set the number of entries between 100 and 200
 
;***                (Amsdos supports a maximum amount of 64 entries) and to set the
 
;***                data buffer between 5000 and 10000.
 
;******************************************************************************
 
        ld (SySSOpW+2),de
 
        push iy
 
        ld iy,App_MsgBuf
 
        ld (App_MsgBuf+6),a
 
        ld (iy+7),c
 
        ld (App_MsgBuf+8),hl
 
        db #dd:ld a,l
 
        ld (App_MsgBuf+10),a
 
        db #dd:ld a,h
 
        ld (App_MsgBuf+11),a
 
        pop de
 
        ld (App_MsgBuf+12),de
 
        ld c,MSC_SYS_SELOPN
 
        call SySystem_SendMessage
 
SySSOp1 call SySystem_WaitMessage
 
        cp MSR_SYS_SELOPN
 
        jr nz,SySSOp1
 
SySSOpW ld ix,0
 
        ld (ix+51),0
 
        ld a,(App_MsgBuf+1)
 
        cp -1
 
        ret nz
 
        ld a,(App_MsgBuf+2)
 
        ld (ix+51),a
 
        jr SySSOp1
 
endif
 
 
 
if use_SySystem_HLPOPN=1
 
SySystem_HLPFLG db 0    ;flag, if HLP-path is valid
 
SySystem_HLPPTH db "%help.exe "
 
SySystem_HLPPTH1 ds 128
 
SySHInX db ".HLP",0
 
 
 
SySystem_HLPINI
 
        ld hl,(App_BegCode)
 
        ld de,App_BegCode
 
        dec h
 
        add hl,de                   ;HL = CodeEnd = Command line
 
        ld de,SySystem_HLPPTH1
 
        ld bc,0
 
        db #dd:ld l,128
 
SySHIn1 ld a,(hl)
 
        or a
 
        jr z,SySHIn3
 
        cp " "
 
        jr z,SySHIn3
 
        cp "."
 
        jr nz,SySHIn2
 
        ld c,e
 
        ld b,d
 
SySHIn2 ld (de),a
 
        inc hl
 
        inc de
 
        db #dd:dec l
 
        ret z
 
        jr SySHIn1
 
SySHIn3 ld a,c
 
        or b
 
        ret z
 
        ld e,c
 
        ld d,b
 
        ld hl,SySHInX
 
        ld bc,5
 
        ldir
 
        ld a,1
 
        ld (SySystem_HLPFLG),a
 
        ret
 
 
 
SySystem_HLPOPN
 
        ld a,(SySystem_HLPFLG)
 
        or a
 
        ret z
 
        ld hl,SySystem_HLPPTH
 
        ld a,(App_BnkNum)
 
        jp SySystem_PRGRUN
 
endif
 
 
 
 
 
;### SUB ROUTINES #############################################################
 
 
 
SySystem_SendMessage
 
;******************************************************************************
 
;*** Input          C       = Command
 
;***                HL,A,DE = additional Parameters
 
;*** Output         -
 
;*** Destroyed      AF,BC,DE,HL,IX,IY
 
;*** Description    Sends a message to the system manager
 
;******************************************************************************
 
        ld iy,App_MsgBuf
 
        ld (iy+0),c
 
        ld (App_MsgBuf+1),hl
 
        ld (App_MsgBuf+3),a
 
        ld (App_MsgBuf+4),de
 
        db #dd:ld h,PRC_ID_SYSTEM
 
        ld a,(App_PrcID)
 
        db #dd:ld l,a
 
        rst #10
 
        ret
 
 
 
SySystem_WaitMessage
 
;******************************************************************************
 
;*** Input          -
 
;*** Output         IY = message buffer
 
;***                A  = first byte in the Message buffer (IY+0)
 
;*** Destroyed      AF,BC,DE,HL,IX,IY
 
;*** Description    Sends a message to the desktop manager, which includes the
 
;***                window ID and additional parameters
 
;******************************************************************************
 
        ld iy,App_MsgBuf
 
SySWMs1 db #dd:ld h,PRC_ID_SYSTEM
 
        ld a,(App_PrcID)
 
        db #dd:ld l,a
 
        rst #08             ;wait for a system manager message
 
        db #dd:dec l
 
        jr nz,SySWMs1
 
        ld a,(App_MsgBuf+0)
 
        ret