;==============================================================================
;### 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