- ;============================================================================== 
- ;### SYSTEM-LIBRARY-ROUTINES ################################################## 
- ;============================================================================== 
-   
- SyDesktop_WINOPN 
- ;****************************************************************************** 
- ;*** Name           Window_Open_Command 
- ;*** Input          A  = Window data record ram bank (0-15) 
- ;***                DE = Window data record address (#C000-#FFFF) 
- ;*** Output         A  = Window ID (only, if CF=0) 
- ;***                CF = Success status 
- ;***                     0 = OK 
- ;***                     1 = window couldn't be opened, as the maximum number 
- ;***                         of windows (32) has been reached 
- ;*** Destroyed      BC,DE,HL,IX,IY 
- ;*** Description    Opens a new window. Its data record must be placed in the 
- ;***                transfer ram area (between #c000 and #ffff). 
- ;***                For more information about the window data record see the 
- ;***                chapter "desktop manager data records". 
- ;***                For more information about the transfer ram memory types see 
- ;***                the "applications" chapter. 
- ;****************************************************************************** 
-         ld b,a 
-         db #dd:ld l,e 
-         db #dd:ld h,d 
-         ld a,(AppPrzN)      ;register window for the application process 
-         ld (ix+3),a 
-         ld a,b 
-         ld c,MSC_DSK_WINOPN 
-         call SyDesktop_SendMessage 
- SyWOpn1 call SyDesktop_WaitMessage 
-         cp MSR_DSK_WOPNER 
-         scf 
-         ret z               ;return with set carry flag, if window couldn't be opened 
-         cp MSR_DSK_WOPNOK 
-         jr nz,SyWOpn1       ;different message than "open ok" -> continue waiting 
-         ld a,(iy+4)         ;get window ID and return with cleared carry flag 
-         ret 
-   
- SyDesktop_WINCLS 
- ;****************************************************************************** 
- ;*** Name           Window_Close_Command 
- ;*** Input          A  = Window ID 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works always 
- ;*** Description    Closes the window. The desktop manager will remove it from the 
- ;***                screen. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINCLS 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_WINDIN 
- ;****************************************************************************** 
- ;*** Name           Window_Redraw_ContentExtended_Command 
- ;*** Input          A  = Window ID 
- ;***                E  = -1, control ID or negative number of controls 
- ;***                     000 - 239 -> the control with the specified ID will be 
- ;***                                  redrawed. 
- ;***                     240 - 254 -> redraws -P2 controls, starting from 
- ;***                                  control P3. As an example, if P2 is -3 
- ;***                                  (253) and P3 is 5, the controls 5, 6 and 7 
- ;***                                  will be redrawed. 
- ;***                     255       -> redraws all controls inside the window 
- ;***                                  content. 
- ;***                - if E is between 240 and 254: 
- ;***                D = ID of the first control, which should be redrawed. 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works always 
- ;*** Description    Redraws one, all or a specified number of controls inside the 
- ;***                window content. This command is identical with MSC_DSK_WININH 
- ;***                with the exception, that it always works but with less speed. 
- ;***                For more information see MSC_DSK_WININH. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINDIN 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_WINTIT 
- ;****************************************************************************** 
- ;*** Name           Window_Redraw_Title_Command 
- ;*** Input          A  = Window ID 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works only, if window has focus 
- ;*** Description    Redraws the title bar of a window. Use this command to update 
- ;***                the screen display, if you changed the text of the window 
- ;***                title. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINTIT 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_WINSTA 
- ;****************************************************************************** 
- ;*** Name           Window_Redraw_Statusbar_Command 
- ;*** Input          A  = Window ID 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works only, if window has focus 
- ;*** Description    Redraws the status bar of a window. Use this command to update 
- ;***                the screen display, if you changed the text of the status bar. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINSTA 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_WINMAX 
- ;****************************************************************************** 
- ;*** Name           Window_Size_Maximize_Command 
- ;*** Input          A  = Window ID 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works only, if the window is minimized or restored 
- ;*** Description    Maximizes a window. A maximized window has a special status, 
- ;***                where it can't be moved to another screen position. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINMAX 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_WINMID 
- ;****************************************************************************** 
- ;*** Name           Window_Size_Restore_Command 
- ;*** Input          A  = Window ID 
- ;*** Output         - 
- ;*** Destroyed      AF,BC,DE,HL,IX,IY 
- ;*** Limitation     works only, if the window is maximized or minimized 
- ;*** Description    Restores the window or the size of the window, if it was 
- ;***                minimized or maximized before. 
- ;****************************************************************************** 
-         ld c,MSC_DSK_WINMID 
-         jp SyDesktop_SendMessage 
-   
- SyDesktop_SendMessage 
- ;****************************************************************************** 
- ;*** Input          C  = Command 
- ;***                A  = Window ID 
- ;***                DE,HL = additional parameters 
- ;*** Output         - 
- ;*** 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,AppMsgB 
-         ld (iy+0),c 
-         ld (iy+1),a 
-         ld (iy+2),e 
-         ld (iy+3),d 
-         ld (iy+4),l 
-         ld (iy+5),h 
-         db #dd:ld h,2       ;2 is the number of the desktop manager process 
-         ld a,(AppPrzN) 
-         db #dd:ld l,a 
-         rst #10 
-         ret 
- EndLib 
-   
- SyDesktop_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,AppMsgB 
- SyDWMs1 db #dd:ld h,2       ;2 is the number of the desktop manager process 
-         ld a,(AppPrzN) 
-         db #dd:ld l,a 
-         rst #08             ;wait for a desktop manager message 
-         db #dd:dec l 
-         jr nz,SyDWMs1 
-         ld a,(iy+0) 
-         ret 
-   
- 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,(AppMsgB+1) 
-         ld hl,(AppMsgB+8) 
-         ret 
-   
- 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 
-   
- 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 
- ;***                     [Bit7  ] Box type 
- ;***                              0 = default (warning [!] symbol) 
- ;***                              1 = info (own symbol will be used) 
- ;***                DE = Data record of the caller window; the dialogue window 
- ;***                     will be the 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 modal). 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,(SySSOpW) 
-         ld (ix+51),0 
-         ld a,(iy+1) 
-         cp 1 
-         ret nz 
-         ld a,(iy+2) 
-         ld (ix+51),a 
-         jr SySWrn1 
- SySWrnW dw 0 
-   
- 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),de 
-         push iy 
-         ld iy,AppMsgB 
-         ld (iy+6),a 
-         ld (iy+7),c 
-         ld (iy+8),l 
-         ld (iy+9),h 
-         db #dd:ld a,l 
-         ld (iy+10),a 
-         db #dd:ld a,h 
-         ld (iy+11),a 
-         pop de 
-         ld (iy+12),e 
-         ld (iy+13),d 
-         ld c,MSC_SYS_SELOPN 
-         call SySystem_SendMessage 
- SySSOp1 call SySystem_WaitMessage 
-         cp MSR_SYS_SELOPN 
-         jr nz,SySSOp1 
-         ld ix,(SySSOpW) 
-         ld (ix+51),0 
-         ld a,(iy+1) 
-         cp -1 
-         ret nz 
-         ld a,(iy+2) 
-         ld (ix+51),a 
-         jr SySSOp1 
- SySSOpW dw 0 
-   
- 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,AppMsgB 
-         ld (iy+0),c 
-         ld (iy+1),l 
-         ld (iy+2),h 
-         ld (iy+3),a 
-         ld (iy+4),e 
-         ld (iy+5),d 
-         db #dd:ld h,3       ;3 is the number of the system manager process 
-         ld a,(AppPrzN) 
-         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,AppMsgB 
- SySWMs1 db #dd:ld h,3       ;3 is the number of the system manager process 
-         ld a,(AppPrzN) 
-         db #dd:ld l,a 
-         rst #08             ;wait for a system manager message 
-         db #dd:dec l 
-         jr nz,SySWMs1 
-         ld a,(iy+0) 
-         ret 
-   
- SySystem_CallFunction 
- ;****************************************************************************** 
- ;*** Name           System_CallFunction 
- ;*** Input          ((SP+0)) = System manager command 
- ;***                ((SP+1)) = Function ID 
- ;***                AF,BC,DE,HL,IX,IY = Input for the function 
- ;*** Output         AF,BC,DE,HL,IX,IY = Output from the function 
- ;*** Destroyed      - 
- ;*** Description    Calls a function via the system manager. This function is 
- ;***                needed to have access to the file manager. 
- ;****************************************************************************** 
-         ld (AppMsgB+04),bc      ;copy registers into the message buffer 
-         ld (AppMsgB+06),de 
-         ld (AppMsgB+08),hl 
-         ld (AppMsgB+10),ix 
-         ld (AppMsgB+12),iy 
-         push af 
-         pop hl 
-         ld (AppMsgB+02),hl 
-         pop hl 
-         ld e,(hl) 
-         inc hl 
-         ld d,(hl) 
-         inc hl 
-         push hl 
-         ld (AppMsgB+00),de      ;module und funktion number 
-         ld a,e 
-         ld (SyCallN),a 
-         ld iy,AppMsgB 
-         ld a,(AppPrzN) 
-         db #dd:ld l,a 
-         ld a,3 
-         db #dd:ld h,a 
-         rst #10                 ;send message 
- SyCall1 rst #30 
-         ld iy,AppMsgB 
-         ld a,(AppPrzN) 
-         db #dd:ld l,a 
-         ld a,3 
-         db #dd:ld h,a 
-         rst #18                 ;wait for answer 
-         db #dd:dec l 
-         jr nz,SyCall1 
-         ld a,(AppMsgB) 
-         sub 128 
-         ld e,a 
-         ld a,(SyCallN) 
-         cp e 
-         jr nz,SyCall1 
-         ld hl,(AppMsgB+02)      ;get registers out of the message buffer 
-         push hl 
-         pop af 
-         ld bc,(AppMsgB+04) 
-         ld de,(AppMsgB+06) 
-         ld hl,(AppMsgB+08) 
-         ld ix,(AppMsgB+10) 
-         ld iy,(AppMsgB+12) 
-         ret 
- SyCallN db 0 
-