%TITLE "DIR2ATR - Convert pc directory into Atari XL/XE ATR disk image(s) - CHiPS bv 1998"
;**********************************************************************
;** **
;** Program : DIR2ATR v05.07.00 **
;** Purpose : Convert pc directory into **
;** Atari XL/XE ATR disk image(s) **
;** **
;** Author : B.F. Schreurs **
;** Computer High Performance Software (CHiPS) bv **
;** Date : May 19th, 1998 **
;** **
;** Calls : DC_DIRS - Determine Current Directories **
;** DC_DRV - Determine Current Drives **
;** DC_FILES - Determine Current Files **
;** D_FILDSK - Add current dir files to XL/XE ATR image **
;** FMSIO - File Management System Handler **
;** HEX2DIGI - Convert Hex Data To Digits (Text) **
;** TO_UPPER - Convert a string to uppercase **
;** WSIO - Screen Handler **
;** **
;** Language : Turbo Assembler **
;** Version : 3.00.00, added drive selection support in config. **
;** 4.00.00, FMSIO added. **
;** 5.00.00, Subdirectories support added. **
;** **
;** CLI syntax: DIR2ATR Indir Outdisk Medium Atrxfd Type Incldirs **
;** i.e. **
;** DIR2ATR C:\TEST\*.* C:\020.ATR S A S Y **
;** i.e. **
;** Indir = C:\TEST\*.* **
;** Outdisk = C:\020.ATR **
;** Medium = S = Single density disk **
;** M = Medium **
;** D = Double **
;** Q = Quad **
;** 7 = 720 KB **
;** 1 = 1.44 MB **
;** H = 16 MB **
;** Atrxfd = A = ATR disk image **
;** X = XFD **
;** Type = D = Dos 2.5 disk type **
;** M = MyDos 4.53 **
;** S = SpartaDos 3.3a **
;** X = SpartaDos/X **
;** B = BeweDos 1.30 **
;** O = Your own Dos **
;** Y = Your own SpartaDos **
;** Incldirs= Y = Include subdirectories **
;** N = Do NOT include subdirectories **
;** **
;**********************************************************************
IDEAL
JUMPS
;----------------------------------------------------------------------
;-- Equates --
;----------------------------------------------------------------------
include ".\equ\attrib.equ"
include ".\equ\dos.equ"
include ".\equ\equipmnt.equ"
include ".\equ\fmsio.equ"
include ".\equ\keyboard.equ"
include ".\equ\sysdep.equ"
include ".\equ\video.equ"
include ".\equ\wsio.equ"
EXTRA_TABLE_FIELDS EQU 16
DIR_MAP_LENGTH EQU (MAX_DIRS_AND_FILES + EXTRA_TABLE_FIELDS) * DIR_ENTRY_LENGTH
COMMENT_ROW EQU "#"
CONFIG_PARAMETERS EQU 9 ; Max 9 parameters
CONFIG_FILE_ROW_COUNT EQU 80
CONFIG_FILE_LINE_SIZE EQU 256
CLI_OFFSET_COMMAND_TAIL EQU 130
DISK_MEDIA_TYPE_SINGLE EQU "S"
DISK_MEDIA_TYPE_MEDIUM EQU "M"
DISK_MEDIA_TYPE_DOUBLE EQU "D"
DISK_MEDIA_TYPE_QUAD EQU "Q"
DISK_MEDIA_TYPE_720KB EQU "7"
DISK_MEDIA_TYPE_1440KB EQU "1"
DISK_MEDIA_TYPE_HARDDISK EQU "H"
DISK_FORMAT_TYPE_DOS25 EQU "D"
DISK_FORMAT_TYPE_MYDOS EQU "M"
DISK_FORMAT_TYPE_MYOWNDOS_MYDOS EQU "O"
DISK_FORMAT_TYPE_BEWEDOS EQU "B"
DISK_FORMAT_TYPE_SPARTADOS EQU "S"
DISK_FORMAT_TYPE_SPARTADOSX EQU "X"
DISK_FORMAT_TYPE_MYOWNDOS_SPARTADOS EQU "Y"
DISK_IMAGE_TYPE_ATR EQU "A"
DISK_IMAGE_TYPE_XFD EQU "X"
INCLUDE_SUBDIRS_YES EQU "Y"
INCLUDE_SUBDIRS_NO EQU "N"
;**********************************************************************
SEGMENT SSeg Para Stack 'STACK'
;**********************************************************************
db 128 dup (0) ; Stack
ENDS SSeg
;**********************************************************************
SEGMENT DSeg Word Public 'DATA'
;**********************************************************************
;----------------------------------------------------------------------
;-- Structures --
;----------------------------------------------------------------------
include ".\str\dta.str"
include ".\str\fmsio.str"
include ".\str\position.str"
include ".\str\psp.str"
include ".\str\wsio.str"
;----------------------------------------------------------------------
;-- SELECT and FD --
;----------------------------------------------------------------------
;
; Configuration File
;
CONFIG___File FMS_Area <>
CONFIG___Pathname DB "C:\DIR2ATR.CFG"
DB PATH_LENGTH - 14 dup (SPACE)
DB 1 dup (0)
CONFIG___Data_Buffer DB CONFIG_FILE_LINE_SIZE + 2 dup (NULL)
;----------------------------------------------------------------------
;-- Working Storage --
;----------------------------------------------------------------------
GLOBAL Return_Code:Byte:1
Return_Code DB 0
Allocation_Strategy_Old DW NULL
Allocation_Strategy_New DW NULL
;------------------------------
; Command Line Interface fields
;------------------------------
CLI_Used DB LOGIC_NO ; CLI interface not active
CLI_Command_Tail_Size DW 0
CLI_Command_Tail DB PATH_LENGTH dup (SPACE)
DB NULL
CLI_Indir DB PATH_LENGTH dup (SPACE)
DB NULL
CLI_Outdisk DB PATH_LENGTH dup (SPACE)
DB NULL
CLI_Disk_Density DB DISK_MEDIA_TYPE_SINGLE
CLI_Atr_Or_Xfd DB DISK_IMAGE_TYPE_ATR
CLI_Disk_Format DB DISK_FORMAT_TYPE_DOS25
CLI_Include_Subdirs DB INCLUDE_SUBDIRS_NO
CLI_Error DB LOGIC_NO ; 0=No Error
; 1=Error Encountered
Requested_Format_Drives DB "1" ; 1 = "ABCDEFGHIJKL " etc.
; 2 = "A: [Floppy ]"
; "C: [HARD_DRIVE ]" etc.
Requested_Format_LibFil DB "1" ; 1 = DIRENTRY format etc.
; 2 = "..
"
; "ATARI "
Hex2digi_Requested_Format DB "2" ; "1" = With thousand seperator
; "2" = Mo thousand seperator
Media_Id_Buffer DB 25 dup (NULL)
Available_Drives DB MAX_DRIVES dup (SPACE)
DB SPACE
Directories_File_Mask DB "*.* "
Search_Files_Path DB PATH_LENGTH dup (SPACE)
DB NULL ; To satisfy DOS find file
Search_Dirs_Path DB PATH_LENGTH dup (SPACE)
DB NULL
Search_Filemask DB FILE_NAME_LENGTH dup (SPACE)
Buffer_Sense_Media_Type DW 1 dup (NULL)
Save_cx DW ?
Dir_Memo_Occur_Curr DW MAX_DIRS dup (NULL) ; Remember from which dir we came
Dir_Memo_Occur_W_Curr DW MAX_DIRS dup (NULL) ; Remember from which dir we came
Dir_Memo_Pointer DB 0
Dir_Up DB 0 ; 0=Stay current
; 1=Go dir up
; 2=Go dir down
Disk_Present DB LOGIC_NO
Mouse_Pressed DB LOGIC_NO
Attrib_Non_modifiable DB ATTRIB_GREEN_WHITE
Parm_Being_Processed DB 0
Config_File_Bytes_Reserved DW 0
Old_Dta_Seg DW ? ; Old Dta Segment Address
Old_Dta_Ofs DW ? ; Old Dta Segment Offset
Own_Dta Dta <>
;----------------------------------------------------------------------
;-- --
;-- C O N F I G U R A T I O N F I L E F O R D I R 2 A T R --
;-- --
;----------------------------------------------------------------------
Config_Field_Filemask DB "*.* "
Default_Startup_Path DB "C:\"
DB PATH_LENGTH - 3 dup (SPACE)
DB NULL
Config_Startup_Path DB PATH_LENGTH dup (SPACE)
DB NULL
DB NULL
Config_Include_DOSFILES_YN DB 1 dup (LOGIC_YES)
Config_Include_DUP_SYS_YN DB 1 dup (LOGIC_YES)
Config_MAIN_YN DB 1 dup (LOGIC_YES)
;--------------
; Config Fields
;--------------
Config_Field_Read_From DB "*"
DB MAX_DRIVES - 1 dup (SPACE)
DB 1 dup (0)
Config_Field_Write_To DB "*"
DB PATH_LENGTH - 1 dup (SPACE)
DB NULL
Config_Field_Disk_Density DB "M"
DB 1 dup (0)
Config_Field_ATR_Or_XFD DB "A"
DB 1 dup (0)
Config_Field_DOS_Path DB "C:\DIR2ATR\"
DB PATH_LENGTH - 11 dup (SPACE)
DB NULL
Config_Field_Disk_Format DB "D"
DB 1 dup (0)
Config_Field_Include_DOS DB "Y"
DB 1 dup (0)
Config_Field_Include_DUP_SYS DB "Y"
DB 1 dup (0)
Config_Field_MAIN DB "Y"
DB 1 dup (0)
;----------------------------------------------------------------------
;-- --
;-- S C R E E N S S E C T I O N --
;-- --
;----------------------------------------------------------------------
Filler DB 64 dup (" ")
;**********************************************************************
; B a c k G r o u n d *
;**********************************************************************
Ws_BG DB WSIO_OPEN
DB 1 ; Start of screen ROW
DB 1 ; Start of screen COLUMN
DB 25 ; End of screen ROW
DB 80 ; End of screen COLUMN
DB ATTRIB_BLUE_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Input attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_BG_Name DB "BG "
Ws_BG_Keys DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_BG_Text DB "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;**********************************************************************
; F r e e W a r e *
;**********************************************************************
Ws_FW DB WSIO_DISPLAY_ONLY
DB 3 ; Start of screen ROW
DB 28 ; Start of screen COLUMN
DB 24 ; End of screen ROW
DB 79 ; End of screen COLUMN
DB ATTRIB_CYAN_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Input attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_FW_Name DB "FREEWARE"
Ws_FW_Keys DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_FW_Text DB " "
DB " "
DB " DIR2ATR - Convert pc dir into .ATRs - v05.07.00 "
DB " "
DB " by B.F. Schreurs, February 22nd, 1999, CHiPS bv "
DB " Computer High Performance Software - Freeware "
DB " Email: stack@xs4all.nl "
DB " Homepage: http:\\www.xs4all.nl\~stack "
DB " "
DB " Please select the appropiate Directory "
DB " (and Drive) to be converted into .ATR disks. "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB NULL
;**********************************************************************
; P A t h *
;**********************************************************************
Ws_PA DB WSIO_DISPLAY_ONLY
DB 2 ; Start of screen ROW
DB 2 ; Start of screen COLUMN
DB 2 ; End of screen ROW
DB 79 ; End of screen COLUMN
DB ATTRIB_BLUE_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Input attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_PA_Name DB "PATH "
Ws_PA_Keys DB KEY_ESC, KEY_ENTER, KEY_ARROW_LEFT, KEY_ARROW_RIGHT
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_PA_Text DB "Path: "
DB NULL
;------------
; F I E L D S
;------------
;
; Path Specification
;
Ws_PA_F_Path DB 1 ; Relative ROW, NULL=End
DB 7 ; Relative COLUMN
DB 72 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Protected
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_PA_No_More_Fields DB NULL
;--------
; D A T A
;--------
; See Search Files Path
;**********************************************************************
; D R i v e S e l e c t i o n *
;**********************************************************************
Ws_DR DB WSIO_DISPLAY_ONLY
DB 3 ; Start of screen ROW
DB 2 ; Start of screen COLUMN
DB 24 ; End of screen ROW
DB 27 ; End of screen COLUMN
DB ATTRIB_BLUE_WHITE ; Screen attribute
DB ATTRIB_BLUE_WHITE ; Field attribute
DB ATTRIB_GREEN_WHITE ; Select attribute
DB 0 ; Error attribute
DB 1 ; Mouse support
DB 1 ; Locate cursor at field
DB 1 ; Locate cursor at occurrence
DB 1 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_DR_Name DB "DRIVES "
Ws_DR_Keys DB KEY_ESC, KEY_ENTER
DB KEY_HELP, KEY_F4
DB KEY_ARROW_UP, KEY_ARROW_DOWN
DB KEY_PAGE_UP, KEY_PAGE_DOWN
DB KEY_HOME, KEY_END
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_DR_Text DB "ÉÍÍÍÍÍ[Select Drive]ÍÍÍÍÍ»"
DB "º A: [FLOPPYDRIVE] º"
DB "º C: [MY_VOLUME ] º"
DB "º D: [MY_CDROM ] º"
DB "º E: [NET_DRIVE ] º"
DB "º Z: [RAM_DISK ] º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "ºENTER=Select Esc=Cancel º"
DB "ºF1=Help F4=Cfg º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;------------
; F I E L D S
;------------
;
; Drive Table
;
Ws_DR_F_Drive DB 2 ; Relative ROW, NULL=End
DB 6 ; Relative COLUMN
DB 16 ; Field Size
DB 17 ; Nr of occurrences
DW 0 ; This is a table, not part of a table
DB 0 ; Protected
DB KEY_ENTER ; Mouse sensitive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_DR_F_Key_Enter DB 20 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 12 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ENTER ; Emulate Key Esc
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_DR_F_Key_Esc DB 20 ; Relative ROW, NULL=End
DB 15 ; Relative COLUMN
DB 10 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ESC ; Emulate Key Esc
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_DR_F_Key_Help DB 21 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 7 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_HELP ; Emulate Key F1
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_DR_F_Key_Cfg DB 21 ; Relative ROW, NULL=End
DB 11 ; Relative COLUMN
DB 6 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_F4 ; Emulate Key F4
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_DR_No_More_Fields DB NULL
;--------
; D A T A
;--------
;
; Drive Table
;
Ws_DR_D_Drive DB MAX_DRIVES + EXTRA_TABLE_FIELDS dup (" ")
;--------------------
; W O R K F I E L D S
;--------------------
Ws_DR_Occur_Curr DW ?
Ws_DR_Occur_Max DW ? ; Maximum nr of drives present
Ws_DR_Occur_W_Curr DW ?
WS_DR_OCCUR_W_CURR_MAX DW 17 ; Maximum occurrences per window
Ws_DR_D_Key_Enter DB "Enter=Select"
Ws_DR_D_Key_Esc DB "Esc=Cancel"
Ws_DR_D_Key_Help DB "F1=Help"
Ws_DR_D_Key_Cfg DB "F4=Cfg"
;**********************************************************************
; D r i v e H e l p S c r e e n *
;**********************************************************************
Ws_DH DB WSIO_DISPLAY_ONLY
DB 3 ; Start of screen ROW
DB 2 ; Start of screen COLUMN
DB 24 ; End of screen ROW
DB 27 ; End of screen COLUMN
DB ATTRIB_GREEN_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Select attribute
DB 0 ; Error attribute
DB 1 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW NULL ; Field Area Address HIGH
DW NULL ; Field Area Address LOW
Ws_DH_Name DB "DRIVEHLP"
Ws_DH_Keys DB KEY_ANY
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_DH_Text DB "ÉÍÍÍÍÍÍ[Drive Help]ÍÍÍÍÍÍ»"
DB "º º"
DB "ºENTER = Select drive º"
DB "º", ARROW_UP, " = Previous drive º"
DB "º", ARROW_DOWN, " = Next drive º"
DB "ºHome = First drive º"
DB "ºEnd = Last drive º"
DB "ºPg Up = Previous drives º"
DB "ºPg Dn = Next drives º"
DB "ºF1 = This screen º"
DB "ºF4 = Config setup º"
DB "ºEsc = Cancel º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "ºPress any key to exit º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;**********************************************************************
; L i b r a r y F i l e S e l e c t i o n *
;**********************************************************************
Ws_LF DB WSIO_DISPLAY_ONLY
DB 3 ; Start of screen ROW
DB 2 ; Start of screen COLUMN
DB 24 ; End of screen ROW
DB 27 ; End of screen COLUMN
DB ATTRIB_BLUE_WHITE ; Screen attribute
DB ATTRIB_BLUE_WHITE ; Field attribute
DB ATTRIB_GREEN_WHITE ; Select attribute
DB 0 ; Error attribute
DB 1 ; Mouse support
DB 1 ; Locate cursor at field
DB 1 ; Locate cursor at occurrence
DB 1 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_LF_Name DB "LIBFILES"
Ws_LF_Keys DB KEY_ESC, KEY_ENTER
DB KEY_HELP, KEY_F2, KEY_F3, KEY_F4
DB KEY_ARROW_UP, KEY_ARROW_DOWN
DB KEY_PAGE_UP, KEY_PAGE_DOWN
DB KEY_HOME, KEY_END
DB KEY_CTL_A_Z
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_LF_Text DB "ÉÍÍÍ[Select Dir/Image]Í", ARROW_UP, ARROW_DOWN, "»"
DB "º.. º"
DB "ºASM º"
DB "ºEQUAL º"
DB "ºMYDIR º"
DB "ºPROJECT .TOO º"
DB "ºATARI .ATR 123,456,789º"
DB "ºMY .ATR 12,345,678º"
DB "ºYOUR .ATR 1,234,567º"
DB "ºZZZZZZZZ.ATR 123,456º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "ºENTER=Select Esc=Cancel º"
DB "ºF1=Help F2=CurDir F3=Drvº"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;------------
; F I E L D S
;------------
;
; Directories/Images Table
;
Ws_LF_F_Dir_Fil DB 2 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 24 ; Field Size
DB 17 ; Nr of occurrences
DW 0 ; This is a table, not part of a table
DB 0 ; Protected
DB KEY_ENTER ; Mouse sensitive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Page_Up DB 1 ; Relative ROW, NULL=End
DB 24 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is a table, not part of a table
DB 0 ; Protected
DB KEY_PAGE_UP ; Mouse sensitive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW NULL ; Source Hi
DW NULL ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Page_Down DB 1 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is a table, not part of a table
DB 0 ; Protected
DB KEY_PAGE_DOWN ; Mouse sensitive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW NULL ; Source Hi
DW NULL ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Key_Enter DB 20 ; Relative ROW, NULL=End
DB 02 ; Relative COLUMN
DB 12 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ENTER ; Emulate Enter
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Key_Esc DB 20 ; Relative ROW, NULL=End
DB 15 ; Relative COLUMN
DB 10 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ESC ; Emulate Enter
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Key_Help DB 21 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 7 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_HELP ; Emulate Key F1
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Key_CurDir DB 21 ; Relative ROW, NULL=End
DB 10 ; Relative COLUMN
DB 9 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_F2 ; Emulate Key F2
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_F_Key_Drv DB 21 ; Relative ROW, NULL=End
DB 20 ; Relative COLUMN
DB 6 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_F3 ; Emulate Key F3
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_LF_No_More_Fields DB NULL
;--------
; D A T A
;--------
;
; Dir / Fil Table
;
Dir_Map_ptr_es DW 1 dup (NULL) ; Segment 1
Dir_Map_ptr_di DW 1 dup (NULL)
Ws_LF_D_Key_Enter DB "Enter=Select"
Ws_LF_D_Key_Esc DB "Esc=Cancel"
Ws_LF_D_Key_Help DB "F1=Help"
Ws_LF_D_Key_CurDir DB "F2=CurDir"
Ws_LF_D_Key_Drv DB "F3=Drv"
;--------------------
; W O R K F I E L D S
;--------------------
Ws_LF_Occur_Curr DW ?
Ws_LF_Occur_Max DW ? ; Maximum nr of entries present
Ws_LF_Occur_W_Curr DW ?
WS_LF_OCCUR_W_CURR_MAX DW 17 ; Maximum occurrences per window
;**********************************************************************
; L i b r a r y F i l e H e l p S c r e e n *
;**********************************************************************
Ws_LH DB WSIO_DISPLAY_ONLY
DB 3 ; Start of screen ROW
DB 2 ; Start of screen COLUMN
DB 24 ; End of screen ROW
DB 27 ; End of screen COLUMN
DB ATTRIB_GREEN_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Select attribute
DB 0 ; Error attribute
DB 1 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW NULL ; Field Area Address HIGH
DW NULL ; Field Area Address LOW
Ws_LH_Name DB "LIBHELP "
Ws_LH_Keys DB KEY_ANY
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_LH_Text DB "ÉÍÍÍÍ[Dir/Image Help]ÍÍÍÍ»"
DB "º º"
DB "ºENTER = Select Dir/Imageº"
DB "º", ARROW_UP, " = Prev Dir/Image º"
DB "º", ARROW_DOWN, " = Next Dir/Image º"
DB "ºHome = First Dir/Image º"
DB "ºEnd = Last Dir/Image º"
DB "ºPg Up = Prev Dirs/Imagesº"
DB "ºPg Dn = Next Dirs/Imagesº"
DB "ºF1 = This screen º"
DB "ºF2 = Select Curr Dir º"
DB "ºF3 = Go to drive scrnº"
DB "ºF4 = Config setup º"
DB "ºEsc = Exit Program º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "º º"
DB "ºPress any key to exit º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;**********************************************************************
; C o n f i g u r a t i o n F I l e S p e c i f i c a t i o n *
;**********************************************************************
Ws_CF DB WSIO_DISPLAY_AND_READ
DB 1 ; Start of screen ROW
DB 1 ; Start of screen COLUMN
DB 25 ; End of screen ROW
DB 80 ; End of screen COLUMN
DB ATTRIB_CYAN_WHITE ; Screen attribute
DB ATTRIB_BLUE_WHITE ; Field attribute
DB ATTRIB_BLUE_WHITE ; Input attribute
DB 0 ; Error attribute
DB 1 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB 0 ; Go to first
DB 0 ; modifiable field
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW ? ; Field Area Address HIGH
DW ? ; Field Area Address LOW
Ws_CF_Name DB "CONFIG "
Ws_CF_Keys_No_Config DB KEY_F2
DB NULL
Ws_CF_Keys DB KEY_ESC, KEY_ENTER, KEY_F2
DB NULL
Ws_CF_Enter_Keys DB KEY_F2
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_CF_Text DB "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ[Configuration Setup]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"
DB "ºStartup Drives : xxxxxxxxxxxxxxxxxxxxxxxxxx º"
DB "º Use a '*' to scan all available drives, º"
DB "º or specify the dirve letters to scan, i.e. 'CDE'. º"
DB "ºCurrently Active : xxxxxxxxxxxxxxxxxxxxxxxxxx º"
DB "º Shows the drives who are currently available, º"
DB "º and is always a subset of the Startup Drives specified.º"
DB "ºDisk Images Location : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx º"
DB "º Use a '*' to use the current drive/directory, º"
DB "º or specify the drive/directory, i.e. 'C:\MYDIR\'. º"
DB "ºDisk Density to use : x º"
DB "º S=Single, M=Medium, D=Double, Q=Quad, º"
DB "º 7=720 KB disk, 1=1.44 MB disk, H=16 MB harddisk º"
DB "ºCreate ATR/XFD disks : x [A=.ATR disks, X=.XFD disks] º"
DB "ºSpecify DOS File path: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx º"
DB "º I.e 'C:\DIR2ATR\', the program will add 'DOS25\' etc. º"
DB "ºDisk Format to use : x º"
DB "º D=DOS 2.5, M=MYDOS 4.53, B=BEWEDOS, O=MY OWN DOS (DOS),º"
DB "º S=SPARTADOS 3.3a, X=SPARTADOS/X, Y=MY OWN DOS (SPARTA) º"
DB "ºWrite DOS Files : x [Y=Yes, N=No] º"
DB "º Write DUP.SYS file: x [Y=Yes, N=No] º"
DB "ºUse SpartaDos 'MAIN' : x [Y=Yes, N=No, use Pc directory name] º"
DB "º º"
DB "ºENTER=Save F2=Update Configuration File C:\DIR2ATR.CFG Esc=Cancel º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;------------
; F I E L D S
;------------
;
; Startup Drives
;
Ws_CF_F_Read_From DB 2 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 26 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Actives Drives
;
Ws_CF_F_Active DB 5 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 26 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Non-modifiable
DB 0 ; Not mouse sensitive
DB 3 ; Edit Letters
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Source Path
;
Ws_CF_F_Write_To DB 8 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 54 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 6 ; Edit Filemask
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Disk density to use
;
Ws_CF_F_Disk_Density DB 11 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Create .ATR or XFD disk images
;
Ws_CF_F_ATR_Or_XFD DB 14 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; DOS path location, i.e. C:\DIR2ATR\
;
Ws_CF_F_DOS_Path DB 15 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 54 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 6 ; Edit Filemask
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Disk Format?
;
Ws_CF_F_Disk_Format DB 17 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Include DOS?
;
Ws_CF_F_Include_DOS DB 20 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Include DUP.SYS file?
;
Ws_CF_F_Include_DUP_SYS DB 21 ; Relative ROW, NULL=End
DB 45 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
;
; Use SpartaDos "MAIN" dir
;
Ws_CF_F_MAIN DB 22 ; Relative ROW, NULL=End
DB 25 ; Relative COLUMN
DB 1 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 1 ; Modifiable
DB 0 ; Not mouse sensitive
DB 0 ; Edit External
DB 1 ; Blanks Trailing
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_CF_F_Key_Enter DB 24 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 10 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ENTER ; Emulate Enter
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_CF_F_Key_Update DB 24 ; Relative ROW, NULL=End
DB 15 ; Relative COLUMN
DB 43 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_F2 ; Emulate Key F2
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_CF_F_Key_Esc DB 24 ; Relative ROW, NULL=End
DB 61 ; Relative COLUMN
DB 10 ; Field Size
DB 1 ; Nr of occurrences
DW 0 ; This is not a table
DB 0 ; Protected
DB KEY_ESC ; Emulate Enter
DB 0 ; Edit External
DB 0 ; Blanks Anywhere
DB 0 ; Uppercase
DB 0 ; Backspace destructive
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;
DW NULL ; <...... Lo>
DW ? ;
DW ? ; <...... Lo>
DW NULL ;
DW NULL ; <.... Lo>
Ws_CF_No_More_Fields DB NULL
;--------
; D A T A
;--------
; See Configuration File Fields
Disk_Density_Field DB "SMDQ71H"
DB NULL
Disk_Format_Field DB "DMBOSXY"
DB NULL
ATR_Or_XFD_Field DB "AX"
DB NULL
Yes_No_Field DB "YN"
DB NULL
Drives_Field DB "*ABCDEFGHIJKLMNOPQRSTUVWXYZ"
DB NULL
Ws_CF_D_Key_Enter DB "ENTER=Save"
Ws_CF_D_Key_Esc DB "Esc=Cancel"
Ws_CF_D_Key_Update DB "F2=Update Configuration File C:\DIR2ATR.CFG"
;**********************************************************************
; E R R O R - D R I V E N O T R E A D Y *
;**********************************************************************
Ws_E1 DB WSIO_DISPLAY_ONLY
DB 10 ; Start of screen ROW
DB 41 ; Start of screen COLUMN
DB 16 ; End of screen ROW
DB 66 ; End of screen COLUMN
DB ATTRIB_RED_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Select attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW NULL ; Field Area Address HIGH
DW NULL ; Field Area Address LOW
Ws_E1_Name DB "ERROR1 "
Ws_E1_Keys DB KEY_ANY
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_E1_Text DB "ÉÍÍÍ[Drive Not Ready]ÍÍÍÍ»"
DB "º º"
DB "º There is NO media in º"
DB "º the requested drive! º"
DB "º º"
DB "ºPress any key to confirmº"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;**********************************************************************
; E R R O R - N O V A L I D D R I V E P R E S E N T *
;**********************************************************************
Ws_E2 DB WSIO_DISPLAY_ONLY
DB 10 ; Start of screen ROW
DB 41 ; Start of screen COLUMN
DB 16 ; End of screen ROW
DB 66 ; End of screen COLUMN
DB ATTRIB_RED_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Select attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW NULL ; Field Area Address HIGH
DW NULL ; Field Area Address LOW
Ws_E2_Name DB "ERROR2 "
Ws_E2_Keys DB KEY_ANY
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_E2_Text DB "ÉÍÍÍ[Drive Not Present]ÍÍ»"
DB "º º"
DB "º There is NO valid º"
DB "º disk drive present! º"
DB "º º"
DB "ºPress any key to confirmº"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
;**********************************************************************
; E R R O R - C O M M A N D L I N E I N T E R F A C E E R R O R *
;**********************************************************************
Ws_E3 DB WSIO_OPEN
DB 9 ; Start of screen ROW
DB 18 ; Start of screen COLUMN
DB 17 ; End of screen ROW
DB 63 ; End of screen COLUMN
DB ATTRIB_RED_WHITE ; Screen attribute
DB 0 ; Field attribute
DB 0 ; Select attribute
DB 0 ; Error attribute
DB 0 ; Mouse support
DB 0 ; Locate cursor at field
DB 0 ; Locate cursor at occurrence
DB 0 ; Locate cursor at position
DB LOGIC_NO ; Screen not changed
DB CURSOR_OFF_SCREEN ; Cursor Position Row
DB CURSOR_OFF_SCREEN ; Cursor Position Col
DW ? ; Screen Name Address HIGH
DW ? ; Screen Name Address LOW
DW ? ; Text Address HIGH
DW ? ; Text Address LOW
DW NULL ; Attribute Address HIGH
DW NULL ; Attribute Address LOW
DW ? ; Valid Keys Address HIGH
DW ? ; Valid Keys Address LOW
DW ? ; Enter Keys Address HIGH
DW ? ; Enter Keys Address LOW
DW NULL ; Field Area Address HIGH
DW NULL ; Field Area Address LOW
Ws_E3_Name DB "ERROR3 "
Ws_E3_Keys DB KEY_ANY
DB NULL
; 1 2 3 4 5 6 7 8
; ....5....0....5....0....5....0....5....0....5....0....5....0....5....0....5....0
Ws_E3_Text DB "ÉÍÍÍÍÍÍÍ[Command Line Interface Error]ÍÍÍÍÍÍÍ»"
DB "º º"
DB "º The number of specified CLI parameters is º"
DB "º incorrect, or the parameters themselves º"
DB "º are incorrectly specified. Please refer º"
DB "º to the documentation file DIR2ATR.TXT. º"
DB "º º"
DB "ºPress any key to confirm º"
DB "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
DB NULL
ENDS DSeg
;**********************************************************************
; Extended Segments
;**********************************************************************
SEGMENT DSeg1 Word Public 'LIBFILES'
Dir_Map DB DIR_MAP_LENGTH dup ("E")
ENDS DSeg1
;**********************************************************************
SEGMENT CSeg Word Public 'CODE'
;**********************************************************************
;----------------------------------------------------------------------
;-- External Variables --
;----------------------------------------------------------------------
EXTRN DC_DIRS:proc ; Determine Current Directories
EXTRN DC_DRV:proc ; Determine Current Drives
EXTRN DC_FILES:proc ; Determine Current Files
EXTRN D_FILDSK:proc ; Add current directory files to XL/XE ATR image
EXTRN FMSIO:proc ; File Management System Handler
EXTRN HEX2DIGI:proc ; Convert Hex Data To Digits (Text)
EXTRN TO_UPPER:proc ; Convert string to uppercase
EXTRN WSIO:proc ; Screen Handler
;**********************************************************************
Main:
;**********************************************************************
ASSUME cs:CSeg
ASSUME ds:DSeg
mov ax, DSeg ; Initialize DS to address
mov ds, ax ; of data segment
call Init_Program
call Init_Files
call Init_Screens
call CLI_Check
cmp [CLI_Error], LOGIC_YES ; Error encounterd?
je @@99 ; Yes
; No, so
call Read_Dir2atr_Config_File
call Parameter_Processing
cmp [CLI_Used], LOGIC_YES ; Command Line Interface used?
je @@30 ; Yes
; No, so
call Read_VTOC_Drives
cmp [Ws_DR_Occur_Max], 0 ; Any valid drive present?
je @@99 ; No
; Yes, so
call Open_Ws_BG
call Display_Ws_BG ; Display background
call Display_Ws_FW ; Display freeware message
@@20:
call Display_and_Read_Ws_LF ; Let user select library
call Close_Ws_BG
jmp @@99
@@30:
call Add_DirFiles_To_ATR_Image
@@99:
call Exit_Program
;**********************************************************************
PROC Init_Program
;**********************************************************************
push es ; Save Psp
xor ax, ax
mov ah, DOS_SET_MEMORY_BLOCK_SIZE ; resize the psp memory
xor bx, bx
int DOS_SERVICE
pop es ; Restore Psp
mov di, CLI_OFFSET_COMMAND_TAIL
xor cx, cx ; Reset cx
mov cl, [es:Psp.LengthByte] ; Check if command line is empty
mov [CLI_Command_Tail_Size], cx ; Save size of command tail
cmp cx, NULL ; Parameter(s) specified?
je @@10 ; No
; Yes, so
;
; Copy Command Line To File Specification Buffer
;
push ds si ; Save program entry
push es di ; Save cli data
mov si, offset CLI_Command_Tail
push ds si
pop di es
pop si ds ; Restore cli data
rep movsb ; Copy Command_Tail
pop si ds ; Restore program entry
@@10:
;
; Segment Addressing
;
ASSUME ds:DSeg1
mov ax, DSeg1 ; Initialize ds to address
mov ds, ax ; of data segment
mov si, offset Dir_Map
push ds si
pop di es
ASSUME ds:DSeg
mov ax, DSeg ; Initialize ds to address
mov ds, ax ; of data segment
mov [Dir_Map_ptr_es], es
mov [Dir_Map_ptr_di], di
@@99:
ret
ENDP Init_Program
;**********************************************************************
PROC Init_Files
;**********************************************************************
mov si, offset CONFIG___File
push ds si
pop di es
mov si, offset CONFIG___Pathname
mov [(FMS_Area ptr di).Path_Address_Hi], ds
mov [(FMS_Area ptr di).Path_Address_Lo], si
ret
ENDP Init_Files
;**********************************************************************
PROC Init_Screens
;**********************************************************************
;
; Init screen BG=Background
;
mov si, offset Ws_BG
push ds si
pop di es
mov si, offset Ws_BG_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_BG_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_BG_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen FW=FreeWare
;
mov si, offset Ws_FW
push ds si
pop di es
mov si, offset Ws_FW_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_FW_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_FW_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen PA=Path
;
mov si, offset Ws_PA
push ds si
pop di es
mov si, offset Ws_PA_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_PA_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_PA_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
mov si, offset Ws_PA_F_Path
mov [(Wsio_Area ptr di).Field_Address_Hi], ds
mov [(WSio_Area ptr di).Field_Address_Lo], si
push ds si
pop di es
mov si, offset Search_Files_Path
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
;
; Init screen DR=Drives
;
mov si, offset Ws_DR
push ds si
pop di es
mov si, offset Ws_DR_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_DR_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_DR_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
mov si, offset Ws_DR_F_Drive
mov [(Wsio_Area ptr di).Field_Address_Hi], ds
mov [(WSio_Area ptr di).Field_Address_Lo], si
push ds si
pop di es
mov si, offset Ws_DR_D_Drive
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_DR_F_Key_Enter
push ds si
pop di es
mov si, offset Ws_DR_D_Key_Enter
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_DR_F_Key_Esc
push ds si
pop di es
mov si, offset Ws_DR_D_Key_Esc
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_DR_F_Key_Help
push ds si
pop di es
mov si, offset Ws_DR_D_Key_Help
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_DR_F_Key_Cfg
push ds si
pop di es
mov si, offset Ws_DR_D_Key_Cfg
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
;
; Init screen DH=Drive Help Screen
;
mov si, offset Ws_DH
push ds si
pop di es
mov si, offset Ws_DH_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_DH_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_DH_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen LF=Directories/Images
;
mov si, offset Ws_LF
push ds si
pop di es
mov si, offset Ws_LF_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_LF_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_LF_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
mov si, offset Ws_LF_F_Dir_Fil
mov [(Wsio_Area ptr di).Field_Address_Hi], ds
mov [(WSio_Area ptr di).Field_Address_Lo], si
mov si, offset Ws_LF_F_Dir_Fil
push ds si
pop di es
mov ax, [Dir_Map_ptr_es]
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ax
mov ax, [Dir_Map_ptr_di]
mov [(WSio_Field ptr di).Data_Address_Src_Lo], ax
mov si, offset Ws_LF_F_Key_Enter
push ds si
pop di es
mov si, offset Ws_LF_D_Key_Enter
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_LF_F_Key_Esc
push ds si
pop di es
mov si, offset Ws_LF_D_Key_Esc
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_LF_F_Key_Help
push ds si
pop di es
mov si, offset Ws_LF_D_Key_Help
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_LF_F_Key_CurDir
push ds si
pop di es
mov si, offset Ws_LF_D_Key_CurDir
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_LF_F_Key_Drv
push ds si
pop di es
mov si, offset Ws_LF_D_Key_Drv
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
;
; Init screen LH=Directory/Image Help Screen
;
mov si, offset Ws_LH
push ds si
pop di es
mov si, offset Ws_LH_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_LH_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_LH_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen CF=Configuration File
;
mov si, offset Ws_CF
push ds si
pop di es
mov si, offset Ws_CF_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_CF_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_Enter_Keys
mov [(Wsio_Area ptr di).Enter_Address_Hi], ds
mov [(WSio_Area ptr di).Enter_Address_Lo], si
mov si, offset Ws_CF_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
mov si, offset Ws_CF_F_Read_From
mov [(Wsio_Area ptr di).Field_Address_Hi], ds
mov [(WSio_Area ptr di).Field_Address_Lo], si
push ds si
pop di es
mov si, offset Config_Field_Read_From
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Drives_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_Active
push ds si
pop di es
mov si, offset Available_Drives
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Attrib_Non_Modifiable
mov [(Wsio_Field ptr di).Attrib_Address_Hi], ds
mov [(WSio_Field ptr di).Attrib_Address_Lo], si
mov si, offset Ws_CF_F_Write_To
push ds si
pop di es
mov si, offset Config_Field_Write_To
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_CF_F_Disk_Density
push ds si
pop di es
mov si, offset Config_Field_Disk_Density
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Disk_Density_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_ATR_Or_XFD
push ds si
pop di es
mov si, offset Config_Field_ATR_Or_XFD
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset ATR_Or_XFD_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_DOS_Path
push ds si
pop di es
mov si, offset Config_Field_DOS_Path
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_CF_F_Disk_Format
push ds si
pop di es
mov si, offset Config_Field_Disk_Format
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Disk_Format_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_Include_DOS
push ds si
pop di es
mov si, offset Config_Field_Include_DOS
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Yes_No_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_Include_DUP_SYS
push ds si
pop di es
mov si, offset Config_Field_Include_DUP_SYS
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Yes_No_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_MAIN
push ds si
pop di es
mov si, offset Config_Field_MAIN
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Yes_No_Field
mov [(Wsio_Field ptr di).Keys_Address_Hi], ds
mov [(WSio_Field ptr di).Keys_Address_Lo], si
mov si, offset Ws_CF_F_Key_Enter
push ds si
pop di es
mov si, offset Ws_CF_D_Key_Enter
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_CF_F_Key_Update
push ds si
pop di es
mov si, offset Ws_CF_D_Key_Update
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
mov si, offset Ws_CF_F_Key_Esc
push ds si
pop di es
mov si, offset Ws_CF_D_Key_Esc
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
;
; Init screen E1=Error Screen - Drive Not Ready
;
mov si, offset Ws_E1
push ds si
pop di es
mov si, offset Ws_E1_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_E1_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_E1_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen E2=Error Screen - No valid drives present
;
mov si, offset Ws_E2
push ds si
pop di es
mov si, offset Ws_E2_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_E2_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_E2_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
;
; Init screen E3=Error Screen - Command Line Interface Error
;
mov si, offset Ws_E3
push ds si
pop di es
mov si, offset Ws_E3_Name
mov [(Wsio_Area ptr di).Name_Address_Hi], ds
mov [(WSio_Area ptr di).Name_Address_Lo], si
mov si, offset Ws_E3_Keys
mov [(Wsio_Area ptr di).Keys_Address_Hi], ds
mov [(WSio_Area ptr di).Keys_Address_Lo], si
mov si, offset Ws_E3_Text
mov [(Wsio_Area ptr di).Text_Address_Hi], ds
mov [(WSio_Area ptr di).Text_Address_Lo], si
@@99:
ret
ENDP Init_Screens
;**********************************************************************
PROC CLI_Check
;**********************************************************************
mov [CLI_Used], LOGIC_NO ; Assume interactive usage
mov cx, [CLI_Command_Tail_Size] ; Check if command line is empty
cmp cx, NULL ; Parameter(s) specified?
je @@99 ; No
; Yes, so
;
; Use CLI interface
;
mov [CLI_Used], LOGIC_YES
mov si, offset CLI_Command_Tail
push ds si
call TO_UPPER ; Make it uppercase
pop si ds
mov si, offset CLI_Command_Tail
push ds si
pop di es
xor ax, ax ; Reset ax
mov al, CR ; Search for Carriage Return
repne scasb ; Search equal CR, uses es:di
dec di ; Adjust start position after scan
mov [byte es:di], SPACE ; Remove return character here
mov [byte es:di + 1], CR ; Place it here
@@10:
mov [CLI_Error], LOGIC_NO
;-----------------------------------------------------
; Split Command Tail into the different CLI parameters
;-----------------------------------------------------
mov cx, [CLI_Command_Tail_Size]
inc cx ; Because of CR replacement by space
mov si, offset CLI_Command_Tail
push ds si
pop di es
mov si, offset CLI_Indir ; CLI Indir
call CLI_Process_Parameter
mov si, offset CLI_Outdisk ; CLI Outdisk
call CLI_Process_Parameter
mov si, offset CLI_Disk_Density ; CLI Disk Density
call CLI_Process_Parameter
mov si, offset CLI_Atr_Or_Xfd ; CLI Atrxfd
call CLI_Process_Parameter
mov si, offset CLI_Disk_Format ; CLI Disk Format
call CLI_Process_Parameter
mov si, offset CLI_Include_Subdirs ; CLI Include subdirs
call CLI_Process_Parameter
@@20:
cmp [CLI_Error], LOGIC_NO ; CLI specs ok?
je @@99 ; Yes
; No, so
;-------------------------------------
; ERROR - COMMAND LINE INTERFACE ERROR
;-------------------------------------
mov si, offset Ws_E3
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
mov si, offset Ws_E3
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
mov si, offset Ws_E3
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
@@99:
ret
ENDP CLI_Check
;**********************************************************************
PROC CLI_Process_Parameter
;**********************************************************************
cmp [CLI_Error], LOGIC_YES ; Already error encounterd?
je @@99 ; Yes
; No, so
@@00:
mov al, [byte es:di] ; Get character
cmp al, SPACE ; End of parameter?
je @@90 ; Yes
; No, so
mov [byte ds:si], al ; Move character
inc si
inc di
dec cx ; Byte count of Command Tail
jnz @@00 ; Next character
mov [CLI_Error], LOGIC_YES
jmp @@99
@@90:
cmp [byte es:di], SPACE ; Still SPACE?
jne @@99 ; No
; Yes, so
inc di
dec cx
jnz @@90 ; Next character
mov [CLI_Error], LOGIC_YES
@@99:
ret
ENDP CLI_Process_Parameter
;**********************************************************************
PROC Read_Dir2atr_Config_File
;**********************************************************************
mov si, offset CONFIG___File
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov [(FMS_Area ptr di).Data_Address_Hi], ds
mov [(FMS_Area ptr di).Data_Address_Lo], si
mov [(FMS_Area ptr di).Request], CMD_OPEN_INPUT
push es di
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@99 ; Error!
mov [(FMS_Area ptr di).Request], CMD_ACCESS_GET
; Retrieve READ from
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Read_From
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, MAX_DRIVES
rep movsb
; Retrieve WRITE to
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Write_To
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, PATH_LENGTH
rep movsb
; Retrieve Disk Density
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Disk_Density
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
; Retrieve Disk Creation Type ATR Or XFD
call Get_Parameter_From_Config_File
mov si, offset Config_Field_ATR_Or_XFD
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
; Retrieve DOS Path
call Get_Parameter_From_Config_File
mov si, offset Config_Field_DOS_Path
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, PATH_LENGTH
rep movsb
; Retrieve Disk Format
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Disk_Format
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
; Retrieve Include DOS
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Include_DOS
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
mov [Config_Include_DOSFILES_YN], LOGIC_NO
mov si, offset CONFIG___Data_Buffer
cmp [byte ds:si], "N" ; Check if No is specified
je @@80 ; No is specified
; Include DUP_SYS
mov [Config_Include_DOSFILES_YN], LOGIC_YES
@@80:
; Retrieve Include DUP_SYS
call Get_Parameter_From_Config_File
mov si, offset Config_Field_Include_DUP_SYS
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
mov [Config_Include_DUP_SYS_YN], LOGIC_NO
mov si, offset CONFIG___Data_Buffer
cmp [byte ds:si], "N" ; Check if No is specified
je @@85 ; No is specified
; Include DUP_SYS
mov [Config_Include_DUP_SYS_YN], LOGIC_YES
@@85:
; Retrieve Use MAIN dir for spartaDos
call Get_Parameter_From_Config_File
mov si, offset Config_Field_MAIN
push ds si
pop di es
mov si, offset CONFIG___Data_Buffer
mov cx, 1
rep movsb
mov [Config_MAIN_YN], LOGIC_NO
mov si, offset CONFIG___Data_Buffer
cmp [byte ds:si], "N" ; Check if No is specified
je @@90 ; No is specified
; Use MAIN dir
mov [Config_MAIN_YN], LOGIC_YES
@@90:
; Close config file
mov si, offset CONFIG___File
push ds si
pop di es
mov [(FMS_Area ptr di).Request], CMD_OPEN_CLOSE
push es di
call FMSIO
pop di es
@@99:
ret
ENDP Read_Dir2atr_Config_File
;**********************************************************************
PROC Get_Parameter_From_Config_File
;**********************************************************************
@@00:
; Clear parameter
mov si, offset CONFIG___Data_Buffer
push ds si
pop di es
mov cx, CONFIG_FILE_LINE_SIZE
xor ax, ax ; Reset ax
mov al, SPACE
rep stosb ; Clear parameter
; Get line from config file
mov si, offset CONFIG___File
push ds si
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@99 ; Error!
mov si, offset CONFIG___Data_Buffer
cmp [byte ds:si], COMMENT_ROW ; Comment "line"?
je @@00 ; Yes
; No, so
cmp [byte ds:si], SPACE ; Empty "line"?
je @@00 ; Yes
; No, so
cmp [byte ds:si], NULL ; "line" starts with space?
je @@00 ; Yes
; No, so
@@99:
ret
ENDP Get_Parameter_From_Config_File
;**********************************************************************
PROC Parameter_Processing
;**********************************************************************
;----------------------
; Use current directory
;----------------------
@@10:
mov si, offset Config_Startup_Path
push ds si
pop di es
mov cx, PATH_LENGTH
xor ax, ax ; Reset ax
mov al, SPACE
rep stosb ; Clear parameter
; Get default drive
xor ax, ax ; Reset ax
mov ah, DOS_GET_DEFAULT_DRIVE ; Get Default Drive
int DOS_SERVICE
add al, 041h ; Because of 0-based stuff
; Process Drive
mov si, offset Config_Startup_Path
mov [byte ds:si], al ; Process Drive letter
mov [byte ds:si + 1], COLON
mov [byte ds:si + 2], BACKSLASH
add si, 3 ; Locating at directory stuff
; Get current directory
xor ax, ax ; Reset ax
mov ah, DOS_GET_CURRENT_DIRECTORY
xor dx, dx ; Reset dx
mov dl, DOS_DEFAULT_DRIVE
int DOS_SERVICE
; Terminate it with a backslash "\"
mov si, offset Config_Startup_Path
push ds si
pop di es
mov cx, PATH_LENGTH
dec cx ; To go to the last character
add di, cx ; Go to end of path
std ; Search direction is down
mov ax, SPACE ; Search for non space
repe scasb ; Search uses es:di
cld ; Cancel the std setting
mov cl, BACKSLASH ; Assume adding a backslash
cmp [byte es:di], BACKSLASH ; Are we in the root?
jne @@15 ; No
; Yes, so
mov cl, SPACE ; Replace 000h by SPACE
@@15:
inc di ; Pointer adjustment after search
mov [byte es:di], cl
;---------------------------------
; Copy Startup path to search path
;---------------------------------
@@20:
mov si, offset Search_Dirs_Path
push ds si
pop di es
mov si, offset Config_Startup_Path
mov cx, PATH_LENGTH
rep movsb
;----------------------------------------
; Copy Config Filemask to Search Filemask
;----------------------------------------
mov si, offset Search_Filemask
push ds si
pop di es
mov si, offset Config_Field_Filemask
mov cx, FILE_NAME_LENGTH
rep movsb
@@99:
ret
ENDP Parameter_Processing
;**********************************************************************
PROC Read_VTOC_Drives
;**********************************************************************
;
; Get drives in format: ACDE etc.
;
mov si, offset Config_Field_Read_From
cmp [byte ds:si], ASTERISK ; Use available drives?
je @@20 ; Yes
; No, so
mov si, offset Available_Drives
push ds si
pop di es
mov si, offset Config_Field_Read_From
mov cx, MAX_DRIVES
rep movsb
mov si, offset Available_Drives
mov cx, MAX_DRIVES
;
; Check existence of specified drives
;
@@00:
cmp [byte ds:si], SPACE ; End of drive list?
je @@10 ; Yes
; No, so
cmp [byte ds:si], "A" ; A drive?
je @@01 ; Yes
; No, so
cmp [byte ds:si], "B" ; B drive?
je @@01 ; Yes
; No, so
jmp @@04
@@01:
;
; Check available diskette drives A and B
;
push ds si cx
int EQUIPMENT_SERVICE ; Get equipment info
mov cx, ax
and cx, 00001h ; Check nr of floppy drives
cmp cl, 001h ; Floppy drives present?
jne @@06 ; No
; Yes, so
and ax, 000C0h ; Check nr of floppy drives present
cmp al, 000h ; 1 floppy drive present?
jne @@08 ; No
; Yes, so
;
; Just 1 floppy drive present
;
push es di
mov ax, 00050h
mov es, ax
mov di, 00004h
mov al, [byte es:di] ; 0050:0004 shows which drive is
; emulated with 1 floppy drive
; 000h = drive A 0001h = drive B
pop di es
;
; Determine which floppy drive is being emulated, assume drive A
;
cmp al, 000h ; Emulating drive A?
je @@02 ; Yes
; No, so
; Emulating drive B
cmp [byte ds:si], "B" ; B drive?
je @@08 ; Yes
; No, so
jmp @@06
@@02:
cmp [byte ds:si], "A" ; A drive?
je @@08 ; Yes
; No, so
jmp @@06
;
; Check drive presence
;
@@04:
mov bl, [ds:si]
push ds si cx
mov ax, DOS_SENSE_MEDIA_TYPE
mov cx, DOS_SENSE_MEDIA_TYPE_CX
sub bl, 64 ; Turn drive into DOS drive
mov si, offset Buffer_Sense_Media_Type
mov dx, si
int DOS_SERVICE ; Check Drive Presence
cmp ax, DOS_DRIVE_NOT_AVAILABLE ; Drive available?
jne @@08 ; Yes
; No, so
@@06:
pop cx si ds
dec si
push ds si cx
inc si
push ds si
pop di es
inc si
rep movsb
@@08:
pop cx si ds
inc si
loop @@00
@@10:
mov si, offset Ws_DR_D_Drive
push ds si
pop di es
;
; Init Drives descriptions
;
push es di
mov cx, ((MAX_DRIVES + EXTRA_TABLE_FIELDS) * 16)
mov ax, SPACE
rep stosb
pop di es
mov si, offset Available_Drives
mov cx, MAX_DRIVES
rep movsb
mov [Requested_Format_Drives], "3" ; Format [A: Myvolume ]
mov si, offset Requested_Format_Drives ; Parameter 1
push ds si
mov si, offset Ws_DR_D_Drive ; Parameter 2
push ds si
call DC_DRV
pop ax ax ax ax
jmp @@30
@@20:
mov [Requested_Format_Drives], "1" ; Format ABCDE
mov si, offset Requested_Format_Drives ; Parameter 1
push ds si
mov si, offset Available_Drives ; Parameter 2
push ds si
call DC_DRV
pop ax ax ax ax
;
; Get drives in format: [A: Myvolume ]
; [C: Yourvolume ] etc.
;
mov [Requested_Format_Drives], "2" ; Format [A: Myvolume ]
mov si, offset Requested_Format_Drives ; Parameter 1
push ds si
mov si, offset Ws_DR_D_Drive ; Parameter 2
push ds si
call DC_DRV
pop ax ax ax ax
@@30:
;-----------------------
; Specify start of table
;-----------------------
mov [Ws_DR_Occur_Curr], 0
@@40:
;-----------------------------------
; Determine which drive to highlight
;-----------------------------------
mov [Ws_DR_Occur_W_Curr], 0
mov si, offset Search_Dirs_Path
mov bl, [byte ds:si] ; Config path drive
;-------------------------------------------
; Determine maximum number of drives present
;-------------------------------------------
mov si, offset Ws_DR_F_Drive
push ds si
pop di es
xor ax, ax
mov al, [(Wsio_Field ptr di).Size]
mov cx, MAX_DRIVES
mov [Ws_DR_Occur_Max], 0
mov si, offset Ws_DR_D_Drive
@@50:
cmp [byte ds:si], SPACE
je @@80
inc [Ws_DR_Occur_Max]
cmp [byte ds:si], bl ; Selected drive found?
jne @@70 ; No
; Yes, so
mov dx, [Ws_DR_Occur_Max]
mov [Ws_DR_Occur_Curr], dx
@@60:
mov [Ws_DR_Occur_W_Curr], dx
cmp dx, [WS_DR_OCCUR_W_CURR_MAX] ; dx > Max occur of window?
jle @@70 ; No
; Yes, so
sub dx, [WS_DR_OCCUR_W_CURR_MAX] ; Move 1 window up
jmp @@60
@@70:
add si, ax
loop @@50
@@80:
cmp [Ws_DR_Occur_Max], 0 ; Any valid drive present?
je @@95 ; No
; Yes, so
cmp [Ws_DR_Occur_W_Curr], 0 ; Invalid drive specified?
jne @@90 ; No
; Yes, so
mov [Ws_DR_Occur_Curr], 1 ; Assume first drive
mov [Ws_DR_Occur_W_Curr], 1 ; Assume first drive
mov si, offset Config_Startup_Path
push ds si
pop di es
mov si, offset Default_Startup_Path
mov cx, PATH_LENGTH
rep movsb
mov si, offset Config_Startup_Path
push ds si
pop di es
mov si, offset Ws_DR_D_Drive
mov cx, 1
rep movsb
;---------------------------------
; Copy Startup path to search path
;---------------------------------
mov si, offset Search_Dirs_Path
push ds si
pop di es
mov si, offset Config_Startup_Path
mov cx, PATH_LENGTH
rep movsb
;----------------------------------------
; Copy Config Filemask to Search Filemask
;----------------------------------------
mov si, offset Search_Filemask
push ds si
pop di es
mov si, offset Config_Field_Filemask
mov cx, FILE_NAME_LENGTH
rep movsb
;----------------------------------------
; Retrieve files from new drive/directory
;----------------------------------------
mov [Dir_Up], 0 ; We stay in the current dir
call Read_VTOC_Directories_Files ; Retrieve directories/files
jmp @@30
@@90:
;------------------------------------
; Pass offset address of drives table
;------------------------------------
mov si, offset Ws_DR_D_Drive
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
jmp @@99
@@95:
;---------------------------------------------------
; ERROR - NO DRIVE FROM SPECIFIED DRIVE LIST PRESENT
;---------------------------------------------------
mov si, offset Ws_E2
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
mov si, offset Ws_E2
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
mov si, offset Ws_E2
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
@@99:
ret
ENDP Read_VTOC_Drives
;**********************************************************************
PROC Open_Ws_BG
;**********************************************************************
mov si, offset Ws_BG
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
cmp ax, NULL ; Error?
jz @@99 ; No
; Yes, so
;
; Error
;
@@99:
ret
ENDP Open_Ws_BG
;**********************************************************************
PROC Display_Ws_BG
;**********************************************************************
mov si, offset Ws_BG
mov [byte ds:si], WSIO_DISPLAY_ONLY
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_BG
;**********************************************************************
PROC Display_Ws_FW
;**********************************************************************
mov si, offset Ws_FW
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_FW
;**********************************************************************
PROC Display_Ws_PA
;**********************************************************************
mov si, offset Ws_PA
mov [byte ds:si], WSIO_DISPLAY_ONLY
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_PA
;**********************************************************************
PROC Display_Ws_DR
;**********************************************************************
mov si, offset Ws_DR
mov [byte ds:si], WSIO_DISPLAY_ONLY
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_DR
;**********************************************************************
PROC Display_and_Read_Ws_DR
;**********************************************************************
;----------
; Init Path
;----------
;
; Reset Search Dirs Path
;
mov si, offset Search_Dirs_Path ; Clear path
push ds si
pop di es
inc di
mov cx, PATH_LENGTH - 1
mov ax, SPACE
rep stosb
call Display_Ws_DR
jmp @@10
;---------------------------------
; Show fields only of Drives Table
;---------------------------------
@@05:
mov si, offset Ws_DR
mov [byte ds:si], WSIO_DISPLAY_FIELDS_ONLY
push ds si
call WSIO
pop si ds
@@10:
;
; Make current occurrence Green/White
;
mov si, offset Ws_DR
push ds si
pop di es
mov cl, ATTRIB_GREEN_WHITE
mov [(Wsio_Area ptr di).Input_Select_Attrib], cl
mov [(Wsio_Area ptr di).Select_Field_Nr], 1
mov cx, [Ws_DR_Occur_W_Curr]
mov [(Wsio_Area ptr di).Select_Field_Occur_Nr], cl
mov [(Wsio_Area ptr di).Cursor_Position_Row], CURSOR_OFF_SCREEN
mov [(Wsio_Area ptr di).Cursor_Position_Col], CURSOR_OFF_SCREEN
;
; Display current occurrence
;
mov si, offset Ws_DR
mov [byte ds:si], WSIO_SELECT_DESELECT
push ds si
call WSIO
pop si ds
mov si, offset Ws_DR
mov [byte ds:si], WSIO_READ_ONLY
push ds si
call WSIO
pop si ds
;
; Save pressed key
;
push ax
;
; Reset current occurrence
;
mov si, offset Ws_DR
push ds si
pop di es
mov cl, [(Wsio_Area ptr di).Field_Attrib]
mov [(Wsio_Area ptr di).Input_Select_Attrib], cl
mov [(Wsio_Area ptr di).Select_Field_Nr], 1
mov cx, [Ws_DR_Occur_W_Curr]
mov [(Wsio_Area ptr di).Select_Field_Occur_Nr], cl
mov si, offset Ws_DR
mov [byte ds:si], WSIO_SELECT_DESELECT
push ds si
call WSIO
pop si ds
;
; Restore pressed key
;
pop ax
;--------------------------------
; Determine which key was pressed
;--------------------------------
cmp al, KEY_ARROW_UP
je @@20
cmp al, KEY_ARROW_DOWN
je @@25
cmp al, KEY_PAGE_UP
je @@30
cmp al, KEY_PAGE_DOWN
je @@35
cmp al, KEY_HOME
je @@40
cmp al, KEY_END
je @@45
cmp al, KEY_ENTER
je @@60
cmp al, KEY_F4 ; Configuration setup
je @@80
cmp al, KEY_HELP
je @@90
;
; Assume the Esc(ape) key
;
jmp @@99
;-------------
; KEY ARROW UP
;-------------
@@20:
cmp [Ws_DR_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
;
; Move "up" to previous occurrence
;
dec [Ws_DR_Occur_Curr]
;
; Are we still in the current "window"?
;
cmp [Ws_DR_Occur_W_Curr], 1
je @@21
dec [Ws_DR_Occur_W_Curr]
jmp @@10
@@21:
;
; Move occurrence down
;
mov cx, [Ws_DR_Occur_Curr] ; Get current occurrence
jmp @@50
;---------------
; KEY ARROW DOWN
;---------------
@@25:
mov dx, [Ws_DR_Occur_Max] ; Max nr of available occurrences
cmp dx, [Ws_DR_Occur_Curr] ; Current occurr = max?
je @@10 ; Yes
; No, so
;
; Move "down" to next occurrence
;
inc [Ws_DR_Occur_Curr]
;
; Are we still in the current "window"?
;
mov dx, [WS_DR_OCCUR_W_CURR_MAX] ; Max occurrence of window
cmp [Ws_DR_Occur_W_Curr], dx ; Current occurr = max window?
je @@26 ; Yes
; No, so
inc [Ws_DR_Occur_W_Curr]
jmp @@10
@@26:
;
; Move occurrences up
;
mov cx, [Ws_DR_Occur_Curr] ; Get current occurrence
sub cx, [WS_DR_OCCUR_W_CURR_MAX] ; Calculate window size
inc cx
jmp @@50
;------------
; KEY PAGE UP
;------------
@@30:
cmp [Ws_DR_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
;
; Move up to previous window
;
mov cx, [Ws_DR_Occur_Curr] ; Current occurrence
sub cx, [Ws_DR_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
cmp cx, [WS_DR_OCCUR_W_CURR_MAX] ; Can we subtract 1 page?
jl @@31 ; No
; Yes, so
sub cx, [WS_DR_OCCUR_W_CURR_MAX] ; Subtract size of 1 page
jmp @@32
@@31:
mov cx, 1 ; Go to beginning of occur
@@32:
;
; Determine Window occurrence
;
mov dx, cx
add dx, [Ws_DR_Occur_W_Curr]
dec dx
mov [Ws_DR_Occur_Curr], dx
jmp @@50
;--------------
; KEY PAGE DOWN
;--------------
@@35:
mov cx, [Ws_DR_Occur_Curr] ; Current occurrence
sub cx, [Ws_DR_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
add cx, [WS_DR_OCCUR_W_CURR_MAX] ; Add size of 1 page
cmp cx, [Ws_DR_Occur_Max] ; Is there a next window?
jnle @@10 ; No
; Yes, so
;
; Determine window occurrence
;
mov dx, cx
add dx, [Ws_DR_Occur_W_Curr] ; Go to same window occurrence
dec dx ; Which is done now
cmp dx, [Ws_DR_Occur_Max] ; Does it exist?
jle @@36 ; Yes
; No, so
mov bx, dx ; bx = dx
sub bx, [Ws_DR_Occur_Max] ; Determine difference
sub [Ws_DR_Occur_W_Curr], bx ; Go to last occurrence
mov dx, [Ws_DR_Occur_Max]
@@36:
mov [Ws_DR_Occur_Curr], dx
jmp @@50
;---------
; KEY HOME
;---------
@@40:
cmp [Ws_DR_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
mov cx, [Ws_DR_Occur_Curr] ; Current occurrence
sub cx, [Ws_DR_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
cmp cx, 1 ; Showing from 1st already?
jne @@41 ; No
; Yes, so
cmp [Ws_DR_Occur_W_Curr], 1 ; At top of window?
je @@10 ; Yes
; No, so
@@41:
mov cx, 1 ; Go to beginning of screen
mov [Ws_DR_Occur_W_Curr], 1
mov [Ws_DR_Occur_Curr], 1
jmp @@50
;--------
; KEY END
;--------
@@45:
mov cx, [Ws_DR_Occur_Curr] ; Current occurrence
cmp cx, [Ws_DR_Occur_Max] ; Can we go "down" anyhow?
je @@10 ; No
; Yes, so
mov cx, [Ws_DR_Occur_Max] ; Go to last occurrence
mov [Ws_DR_Occur_Curr], cx ; Go to last occurrence in table
cmp cx, [WS_DR_OCCUR_W_CURR_MAX] ; Does it all fit in 1 window?
jnle @@46 ; No
; Yes, so
mov [Ws_DR_Occur_W_Curr], cx ; Go to last entry in window
jmp @@50
@@46:
;
; Determine window occurrence
;
sub cx, [WS_DR_OCCUR_W_CURR_MAX] ; Subtract 1 page
inc cx ; We are at the last page now
mov dx, [WS_DR_OCCUR_W_CURR_MAX] ; Get last window occurrence
mov [Ws_DR_Occur_W_Curr], dx ; Move to last window occurrence
jmp @@50
;----------------------------------------
; Set up drive window data and attributes
;----------------------------------------
@@50:
mov si, offset Ws_DR_F_Drive
push ds si
pop di es
xor ax, ax
mov al, [(Wsio_Field ptr di).Size]
mov si, offset Ws_DR_D_Drive
jmp @@52
@@51:
add si, ax
@@52:
loop @@51
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ds
mov [(WSio_Field ptr di).Data_Address_Src_Lo], si
jmp @@05
;----------
; KEY ENTER
;----------
@@60:
mov si, offset Ws_DR
push ds si
pop di es
xor bx, bx
mov bl, [(Wsio_Area ptr di).Select_Field_Occur_Nr]
mov [Mouse_Pressed], LOGIC_NO
xor cx, cx
mov cl, [(Wsio_Area ptr di).Cursor_Position_Row]
cmp cl, CURSOR_OFF_SCREEN ; Enter by mouse press?
je @@61 ; No
; Yes, so
mov [Mouse_Pressed], LOGIC_YES
;
; Mouse pressed Enter, is it valid?
;
cmp cl, 22 ; Enter pressed?
je @@61 ; Yes
; No, so
cmp cl, 4 ; Valid occurrence?
jl @@10 ; No
; Maybe
cmp cl, 20 ; Valid occurrence?
jnle @@10 ; No
; Maybe
sub cl, 3 ; Determine occurrence
mov dx, [Ws_DR_Occur_Curr] ; Current occurrence
sub dx, bx
add dx, cx
cmp dx, [Ws_DR_Occur_Max] ; Valid occurrence?
jnle @@10 ; No
; Yes, so
mov [Ws_DR_Occur_Curr], dx ; Set occurrence
mov [Ws_DR_Occur_W_Curr], cx
@@61:
;
; Copy selected drive to path
;
mov si, offset Search_Dirs_Path ; 73 chars for Path
push ds si
pop di es
mov si, offset Available_Drives
add si, [Ws_DR_Occur_Curr]
dec si
movsb
mov [byte es:di], COLON
mov [byte es:di + 1], BACKSLASH
;
; Show new path to user
;
mov si, offset Ws_PA
mov [byte ds:si], WSIO_DISPLAY_FIELDS_ONLY
push ds si
call WSIO
pop si ds
mov [Dir_Memo_Pointer], 0 ; Reset directory memo pointer
jmp @@99
;----------------------
; KEY F4 - Config setup
;----------------------
@@80:
call Display_and_Read_Ws_CF
jmp @@05
;---------
; KEY HELP
;---------
@@90:
call Display_Ws_DH
jmp @@10
;-------
; Return
;-------
@@99:
ret
ENDP Display_and_Read_Ws_DR
;**********************************************************************
PROC Display_Ws_DH
;**********************************************************************
mov si, offset Ws_DH
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
mov si, offset Ws_DH
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
mov si, offset Ws_DH
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_DH
;**********************************************************************
PROC Read_VTOC_Directories_Files
;**********************************************************************
cmp [Dir_Up], 2 ; Do we have to remember from which directory we came from?
jne @@05 ; No
; Yes, so
mov cx, [Ws_LF_Occur_Curr]
mov dx, [Ws_LF_Occur_W_Curr]
xor ax, ax
mov al, [Dir_Memo_Pointer] ; Get current occurrence
rol ax, 1 ; Multiply by 2
mov si, offset Dir_Memo_Occur_Curr
add si, ax ; Move to empty spot
mov [ds:si], cx
mov si, offset Dir_Memo_Occur_W_Curr
add si, ax ; Move to empty spot
mov [ds:si], dx
inc [Dir_Memo_Pointer]
@@05:
mov [Ws_LF_Occur_Max], 0
;---------------------------------------------
; Get field size of Libraries/Files Table item
;---------------------------------------------
mov si, offset Ws_LF_F_Dir_Fil
push ds si
pop di es
mov ax, MAX_DIRS_AND_FILES + EXTRA_TABLE_FIELDS
xor bx, bx
xor cx, cx
mov cl, [byte (Wsio_Field ptr di).Size]
xor dx, dx
mul cx
;----------------------------
; Clear Libraries/Files Table
;----------------------------
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di]
mov cx, ax
xor ax, ax ; Reset ax
mov al, NULL ; Fill character
rep stosb
;----------------------------------------------
; Check if drive we have to access drive A or B
;----------------------------------------------
call Verify_Disk_Presence_Drive_A_Or_B ; If were reading drive A or B
cmp [Disk_Present], LOGIC_YES ; Diskette present
jne @@99 ; No
; Yes, so
@@20:
;-------------------------------
; Set up Search path - Libraries
;-------------------------------
;
; Copy shown path to search path first
;
mov si, offset Search_Files_Path
push ds si
pop di es
mov si, offset Search_Dirs_Path
mov cx, PATH_LENGTH
rep movsb
;
; Find first non blank character in the Search path
;
mov si, offset Search_Files_Path
push ds si
pop di es
xor ax, ax
mov al, SPACE ; Search the first space
mov cx, PATH_LENGTH
repne scasb ; Search
dec di ; Pointer correction after search
;
; Add "*.*" to the Search path
;
mov si, offset Directories_File_Mask
mov cx, FILE_NAME_LENGTH
rep movsb
;
; Terminate it with a null
;
mov [byte es:di], NULL
;
; Set up parameters for Directory search
;
mov [Requested_Format_LibFil], "2" ; Format ".. "
; "ATARI "
mov si, offset Requested_Format_LibFil ; Parameter 1
push ds si
mov si, offset Search_Files_Path ; Parameter 2
push ds si
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di] ; Parameter 3
push es di
;-----------------------------------------
; Now retrieve Directory Map - Directories
;-----------------------------------------
call DC_DIRS
pop ax ax ax ax ax ax
;---------------------------
; Set up Search path - Files
;---------------------------
;
; Copy shown path to search path first
;
mov si, offset Search_Files_Path
push ds si
pop di es
mov si, offset Search_Dirs_Path
mov cx, PATH_LENGTH
rep movsb
;
; Find first non blank character in the Search path
;
mov si, offset Search_Files_Path
push ds si
pop di es
xor ax, ax
mov al, SPACE ; Search the first space
mov cx, PATH_LENGTH
repne scasb ; Search
dec di ; Pointer correction after search
;
; Add FileMask to the Search path
;
mov si, offset Search_Filemask
mov cx, FILE_NAME_LENGTH
rep movsb
;
; Terminate it with a null
;
mov [byte es:di], NULL
;
; Set up parameters for Directory search
;
mov [Requested_Format_LibFil], "2" ; Format ".. "
; "ATARI "
mov si, offset Requested_Format_LibFil ; Parameter 1
push ds si
mov si, offset Search_Files_Path ; Parameter 2
push ds si
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di] ; Parameter 3
;
; Search null terminator
;
xor ax, ax
mov al, NULL ; Search the first null
mov cx, DIR_MAP_LENGTH
repne scasb ; Search
dec di ; Pointer correction after search
push es di
;-----------------------------------
; Now retrieve Directory Map - Files
;-----------------------------------
call DC_FILES
pop ax ax ax ax ax ax
;------------------------------------------------------
; After reading the VTOC we are at the first occurrence
;------------------------------------------------------
mov cx, 1 ; To satisfy loop condition
mov [Ws_LF_Occur_Curr], 1
mov [Ws_LF_Occur_W_Curr], 1
cmp [Dir_Up], 1 ; Did we go up a dir?
jne @@50 ; No
; Yes, so
cmp [Dir_Memo_Pointer], 0 ; Did we have save info of previous dirs?
je @@50 ; No
; Yes, so
dec [Dir_Memo_Pointer]
xor ax, ax
mov al, [Dir_Memo_Pointer] ; Get current occurrence
rol ax, 1 ; Multiply by 2
mov si, offset Dir_Memo_Occur_Curr
add si, ax ; Move to occupied spot
mov cx, [ds:si]
mov si, offset Dir_Memo_Occur_W_Curr
add si, ax ; Move to occupied spot
mov dx, [ds:si]
mov [Ws_LF_Occur_Curr], cx
mov [Ws_LF_Occur_W_Curr], dx
sub cx, [Ws_LF_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
@@50:
mov si, offset Ws_LF_F_Dir_Fil
push ds si
pop di es
xor ax, ax
mov al, [(Wsio_Field ptr di).Size]
push es di
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di]
jmp @@52
@@51:
add di, ax
@@52:
loop @@51
mov ax, es
mov bx, di
pop di es
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ax
mov [(WSio_Field ptr di).Data_Address_Src_Lo], bx
;------------------------------------
; Determine MAXimum nr of occurrences
;------------------------------------
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di]
mov cx, DIR_MAP_LENGTH ; Search length
xor ax, ax ; Search for null character
repne scasb ; Search uses es:di
mov ax, DIR_MAP_LENGTH
sub ax, cx ; Nr of entries in size determined
xor dx, dx
xor cx, cx
mov bx, DIR_ENTRY_LENGTH ; Determine nr of occurs
div bx
mov [Ws_LF_Occur_Max], ax
@@99:
call Display_Ws_PA ; Display path
ret
ENDP Read_VTOC_Directories_Files
;**********************************************************************
PROC Verify_Disk_Presence_Drive_A_Or_B
;**********************************************************************
mov [Disk_Present], LOGIC_YES
;----------------------------------------------
; Check if drive we have to access drive A or B
;----------------------------------------------
mov si, offset Search_Dirs_Path
cmp [byte ds:si], "A" ; Access drive A?
je @@10 ; Yes
; No, so
cmp [byte ds:si], "B" ; Access drive B?
jne @@99 ; No
; Yes, so
@@10:
xor bx, bx ; Reset dx
mov bl, [byte ds:si] ; Copy selected drive to path
sub bl, 64 ; Turn drive into DOS drive
mov ax, DOS_SENSE_MEDIA_TYPE
mov al, 00Dh ; subfunction code
mov cx, DOS_GET_MEDIA_ID_CX
mov dx, offset Media_ID_Buffer
int DOS_SERVICE ; Check Drive Presence
cmp ax, DOS_DRIVE_NOT_READY ; Drive ready?
jne @@99 ; Yes
; No, so
mov [Disk_Present], LOGIC_NO
;------------------------
; ERROR - DRIVE NOT READY
;------------------------
mov si, offset Ws_E1
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
mov si, offset Ws_E1
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
mov si, offset Ws_E1
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
@@99:
ret
ENDP Verify_Disk_Presence_Drive_A_Or_B
;**********************************************************************
PROC Display_and_Read_Ws_LF
;**********************************************************************
jmp @@61 ; Because of startup path
;------------------------------------------
; Show fields only of Libraries/Files Table
;------------------------------------------
@@00:
mov si, offset Ws_LF
mov [byte ds:si], WSIO_DISPLAY_FIELDS_ONLY
push ds si
call WSIO
pop si ds
@@05:
;------------------------------------------
; Show Freeware Text or Disk Image contents
;------------------------------------------
call Display_Ws_FW ; Show Freeware Text
;------------------------------------
; Make current occurrence Green/White
;------------------------------------
@@10:
mov si, offset Ws_LF
push ds si
pop di es
mov cl, ATTRIB_GREEN_WHITE
mov [(Wsio_Area ptr di).Input_Select_Attrib], cl
mov [(Wsio_Area ptr di).Select_Field_Nr], 1
mov cx, [Ws_LF_Occur_W_Curr]
mov [(Wsio_Area ptr di).Select_Field_Occur_Nr], cl
mov [(Wsio_Area ptr di).Cursor_Position_Row], CURSOR_OFF_SCREEN
mov [(Wsio_Area ptr di).Cursor_Position_Col], CURSOR_OFF_SCREEN
;
; Display current occurrence
;
mov si, offset Ws_LF
mov [byte ds:si], WSIO_SELECT_DESELECT
push ds si
call WSIO
pop si ds
;----------
; Get input
;----------
mov si, offset Ws_LF
mov [byte ds:si], WSIO_READ_ONLY
push ds si
call WSIO
pop si ds
;
; Save pressed key
;
push ax
;
; Reset current occurrence
;
mov si, offset Ws_LF
push ds si
pop di es
mov cl, [(Wsio_Area ptr di).Field_Attrib]
mov [(Wsio_Area ptr di).Input_Select_Attrib], cl
mov [(Wsio_Area ptr di).Select_Field_Nr], 1
mov cx, [Ws_LF_Occur_W_Curr]
mov [(Wsio_Area ptr di).Select_Field_Occur_Nr], cl
mov si, offset Ws_LF
mov [byte ds:si], WSIO_SELECT_DESELECT
push ds si
call WSIO
pop si ds
;
; Restore pressed key
;
pop ax
;--------------------------------
; Determine which key was pressed
;--------------------------------
cmp al, KEY_ARROW_UP
je @@15
cmp al, KEY_ARROW_DOWN
je @@20
cmp al, KEY_PAGE_UP
je @@25
cmp al, KEY_PAGE_DOWN
je @@30
cmp al, KEY_HOME
je @@35
cmp al, KEY_END
je @@40
cmp al, KEY_ENTER
je @@50
cmp al, KEY_F2 ; Select current directory
je @@55
cmp al, KEY_F3 ; Back to drives
je @@60
cmp al, KEY_F4 ; Configuration setup
je @@65
;
; Check for control key + drive letter
;
mov cx, MAX_DRIVES ; Drive A thru Z
mov bx, 1 ; Start at drive A
@@11:
cmp al, bl
je @@70
inc bx ; Try next drive
loop @@11
cmp al, KEY_HELP
je @@90
;
; Assume the Esc(ape) key
;
jmp @@99
;-------------
; KEY ARROW UP
;-------------
@@15:
cmp [Ws_LF_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
;
; Move "up" to previous occurrence
;
dec [Ws_LF_Occur_Curr]
;
; Are we still in the current "window"?
;
cmp [Ws_LF_Occur_W_Curr], 1
je @@16
dec [Ws_LF_Occur_W_Curr]
jmp @@05
@@16:
;
; Move occurrence down
;
mov cx, [Ws_LF_Occur_Curr] ; Get current occurrence
jmp @@45
;---------------
; KEY ARROW DOWN
;---------------
@@20:
mov dx, [Ws_LF_Occur_Max] ; Max nr of available occurrences
cmp dx, [Ws_LF_Occur_Curr] ; Current occurr = max?
je @@10 ; Yes
; No, so
;
; Move "down" to next occurrence
;
inc [Ws_LF_Occur_Curr]
;
; Are we still in the current "window"?
;
mov dx, [WS_LF_OCCUR_W_CURR_MAX] ; Max occurrence of window
cmp [Ws_LF_Occur_W_Curr], dx ; Current occurr = max window?
je @@21 ; Yes
; No, so
inc [Ws_LF_Occur_W_Curr]
jmp @@05
@@21:
;
; Move occurrences up
;
mov cx, [Ws_LF_Occur_Curr] ; Get current occurrence
sub cx, [WS_LF_OCCUR_W_CURR_MAX] ; Calculate window size
inc cx
jmp @@45
;------------
; KEY PAGE UP
;------------
@@25:
cmp [Ws_LF_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
;
; Move up to previous window
;
mov cx, [Ws_LF_Occur_Curr] ; Current occurrence
sub cx, [Ws_LF_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
cmp cx, [WS_LF_OCCUR_W_CURR_MAX] ; Can we subtract 1 page?
jl @@26 ; No
; Yes, so
sub cx, [WS_LF_OCCUR_W_CURR_MAX] ; Subtract size of 1 page
jmp @@27
@@26:
mov cx, 1 ; Go to beginning of occur
@@27:
;
; Determine Window occurrence
;
mov dx, cx
add dx, [Ws_LF_Occur_W_Curr]
dec dx
mov [Ws_LF_Occur_Curr], dx
jmp @@45
;--------------
; KEY PAGE DOWN
;--------------
@@30:
mov cx, [Ws_LF_Occur_Curr] ; Can we go "down" anyhow?
sub cx, [Ws_LF_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
add cx, [WS_LF_OCCUR_W_CURR_MAX] ; Add size of 1 page
cmp cx, [Ws_LF_Occur_Max] ; Is there a next window?
jnle @@10 ; No
; Yes, so
;
; Determine window occurrence
;
mov dx, cx
add dx, [Ws_LF_Occur_W_Curr] ; Go to same window occurrence
dec dx ; Which is done now
cmp dx, [Ws_LF_Occur_Max] ; Does it exist?
jle @@31 ; Yes
; No, so
mov bx, dx ; bx = dx
sub bx, [Ws_LF_Occur_Max] ; Determine difference
sub [Ws_LF_Occur_W_Curr], bx ; Go to last occurrence
mov dx, [Ws_LF_Occur_Max]
@@31:
mov [Ws_LF_Occur_Curr], dx
jmp @@45
;---------
; KEY HOME
;---------
@@35:
cmp [Ws_LF_Occur_Curr], 1 ; Can we go "up" anyhow?
je @@10 ; No
; Yes, so
mov cx, [Ws_LF_Occur_Curr] ; Current occurrence
sub cx, [Ws_LF_Occur_W_Curr] ; Determine begin of window
inc cx ; Which is done now
cmp cx, 1 ; Showing from 1st already?
jne @@36 ; No
; Yes, so
cmp [Ws_LF_Occur_W_Curr], 1 ; At top of window?
je @@10 ; Yes
; No, so
@@36:
mov cx, 1 ; Go to beginning of screen
mov [Ws_LF_Occur_W_Curr], 1
mov [Ws_LF_Occur_Curr], 1
jmp @@45
;--------
; KEY END
;--------
@@40:
mov cx, [Ws_LF_Occur_Curr] ; Current occurrence
cmp cx, [Ws_LF_Occur_Max] ; Can we go "down" anyhow?
je @@10 ; No
; Yes, so
mov cx, [Ws_LF_Occur_Max] ; Go to last occurrence
mov [Ws_LF_Occur_Curr], cx ; Go to last occurrence in table
cmp cx, [WS_LF_OCCUR_W_CURR_MAX] ; Does it all fit in 1 window?
jnle @@41 ; No
; Yes, so
mov [Ws_LF_Occur_W_Curr], cx ; Go to last entry in window
mov cx, 1 ; Start from first occurrence
jmp @@45
@@41:
;
; Determine window occurrence
;
sub cx, [WS_LF_OCCUR_W_CURR_MAX] ; Subtract 1 page
inc cx ; We are at the last page now
mov dx, [WS_LF_OCCUR_W_CURR_MAX] ; Get last window occurrence
mov [Ws_LF_Occur_W_Curr], dx ; Move to last window occurrence
jmp @@45
;--------------------------------------------
; Set up dir/image window data and attributes
;--------------------------------------------
@@45:
mov si, offset Ws_LF_F_Dir_Fil
push ds si
pop di es
xor ax, ax
mov al, [(Wsio_Field ptr di).Size]
push es di
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di]
jmp @@47
@@46:
add di, ax
@@47:
loop @@46
mov ax, es
mov bx, di
pop di es
mov [(Wsio_Field ptr di).Data_Address_Src_Hi], ax
mov [(WSio_Field ptr di).Data_Address_Src_Lo], bx
jmp @@00
;----------
; KEY ENTER
;----------
@@50:
mov si, offset Ws_LF
push ds si
pop di es
xor bx, bx
mov bl, [(Wsio_Area ptr di).Select_Field_Occur_Nr]
mov [Mouse_Pressed], LOGIC_NO
xor cx, cx
mov cl, [(Wsio_Area ptr di).Cursor_Position_Row]
cmp cl, CURSOR_OFF_SCREEN ; Enter by mouse press?
je @@51 ; No
; Yes, so
mov [Mouse_Pressed], LOGIC_YES
;
; Mouse pressed Enter, is it valid?
;
cmp cl, 22 ; ENTER pressed?
je @@51 ; Yes
; No, so
cmp cl, 4 ; Valid occurrence?
jl @@10 ; No
; Maybe
cmp cl, 20 ; Valid occurrence?
jnle @@10 ; No
; Maybe
sub cl, 3 ; Determine occurrence
mov dx, [Ws_LF_Occur_Curr] ; Current occurrence
sub dx, bx
add dx, cx
cmp dx, [Ws_LF_Occur_Max] ; Valid occurrence?
jnle @@10 ; No
; Yes, so
mov [Ws_LF_Occur_Curr], dx ; Set occurrence
mov [Ws_LF_Occur_W_Curr], cx
@@51:
push ds si
;
; Go to end of path
;
mov si, offset Search_Dirs_Path ; 73 chars for Path
push ds si
pop di es
mov cx, PATH_LENGTH
dec cx ; To go to the last character
add di, cx ; Go to end of path
std ; Search direction is down
mov ax, BACKSLASH ; Search for "\"
repne scasb ; Search uses es:di
cld ; Cancel the std setting
inc di ; Pointer adjustment after search
inc di ; To postion after the "\"
;
; Determine selected directory/file
;
mov ax, [Ws_LF_Occur_Curr]
dec ax ; Because of offset reasons
xor bx, bx
mov cx, DIR_ENTRY_LENGTH
xor dx, dx
mul cx
;
; Go to drive selection or dirs?
;
push es di
mov es, [Dir_Map_ptr_es]
mov di, [Dir_Map_ptr_di]
add di, ax
cmp [byte es:di], DOT ; Go to drive selection/dirs?
jne @@63 ; No
; Yes, so
pop di es ; Check path
pop si ds
cmp [byte es:di - 2], COLON ; Go to drive selection?
jne @@62 ; No
; Yes, so
jmp @@60 ; Go to drive selection
;---------------------------------------------------
; KEY F2 - Acceptance current directory to be ATR-ed
;---------------------------------------------------
@@55:
call Add_DirFiles_To_ATR_Image
jmp @@00
;------------------------------
; KEY F3 - Select another drive
;------------------------------
@@60:
;
; Select another drive
;
;
; Reset Search Files Path
;
mov si, offset Search_Files_Path
push ds si
pop di es
mov cx, PATH_LENGTH
mov ax, SPACE
rep stosb ; Clear path
call Display_Ws_PA ; Display path
call Display_and_Read_Ws_DR ; Let user select drive
cmp al, KEY_ESC ; Cancel pressed?
je @@99 ; Yes
; No, so
@@61:
mov [Dir_Up], 0 ; We stay in the current dir
call Read_VTOC_Directories_Files ; Retrieve directories/files
cmp [Ws_LF_Occur_Max], 0 ; Drive not ready?
je @@60 ; Yes
; No, so
mov si, offset Ws_LF
mov [byte ds:si], WSIO_DISPLAY_ONLY
push ds si
call WSIO
pop si ds
jmp @@05
@@62:
;
; Go to previous dir
;
dec di ; Position on the "\"
dec di ; Position before the "\"
std ; Search direction is down
mov cx, DIR_NAME_LENGTH + 1
mov ax, BACKSLASH ; Search for "\"
repne scasb ; Search uses es:di
cld ; Cancel the std setting
inc di ; Pointer adjustment after search
inc di ; To postion after the "\"
mov cx, DIR_NAME_LENGTH + 1 ; Because of "\"
add cx, FILE_NAME_LENGTH ; Because of *.ATR
mov ax, SPACE
rep stosb
mov [Dir_Up], 1 ; We go to previous dir
call Read_VTOC_Directories_Files ; Retrieve directories/files
cmp [Ws_LF_Occur_Max], 0 ; Drive ready?
je @@60 ; No
; Yes, so
jmp @@00
@@63:
;
; Go to subdir OR do nothing
;
push es di
add di, FILE_NAME_LENGTH + 1 ; Go to file size
cmp [byte es:di], "<" ; Directory indicator
pop si ds ; From -> Dir/File table
pop di es ; To -> Path
jne @@64 ; It's a file!
; It's a directory, so
mov cx, DIR_NAME_LENGTH
rep movsb
pop si ds
dec di
std ; Search direction is down
mov cx, DIR_NAME_LENGTH + 1
mov ax, SPACE ; Search for not equal " "
repe scasb ; Search uses es:di
cld ; Cancel the std setting
inc di ; Pointer adjustment after search
inc di ; To position after the " "
mov [byte es:di], BACKSLASH
mov [Dir_Up], 2 ; We go to a subdir
call Read_VTOC_Directories_Files ; Retrieve directories/files
cmp [Ws_LF_Occur_Max], 0 ; Drive not ready?
je @@60 ; Yes
; No, so
jmp @@00
@@64:
pop si ds
jmp @@10
;----------------------
; KEY F4 - Config setup
;----------------------
@@65:
call Display_and_Read_Ws_CF
jmp @@00
;---------------------------
; Control Key + Drive Letter
;---------------------------
@@70:
add ax, 040h ; Turn drive into letter
mov cx, MAX_DRIVES ; Drives A thru Z
mov si, offset Available_Drives ; Available drives
@@71:
cmp al, [byte ds:si] ; Selected drive present in table?
je @@72 ; Yes
; No, so
inc si ; Next drive from table
loop @@71 ; Check next drive
jmp @@60 ; Invalid drive, let user choose correct one
@@72:
push ax ; Save drive letter
mov si, offset Search_Files_Path ; Reset Search Files Path
push ds si
pop di es
mov cx, PATH_LENGTH
mov ax, SPACE
rep stosb
mov si, offset Search_Dirs_Path ; Reset Search Dirs Path
push ds si
pop di es
inc di
mov cx, PATH_LENGTH - 1
mov ax, SPACE
rep stosb
mov si, offset Search_Dirs_Path ; Copy selected drive to path
push ds si
pop di es
pop ax ; Restore drive letter
mov [byte es:di], al
mov [byte es:di + 1], COLON
mov [byte es:di + 2], BACKSLASH
jmp @@61 ; Retrieve directories/files of selected drive
;---------
; KEY HELP
;---------
@@90:
call Display_Ws_LH
jmp @@05
;-------
; Return
;-------
@@99:
ret
ENDP Display_and_Read_Ws_LF
;**********************************************************************
PROC Display_Ws_LH
;**********************************************************************
mov si, offset Ws_LH
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
mov si, offset Ws_LH
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
mov si, offset Ws_LH
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
ret
ENDP Display_Ws_LH
;**********************************************************************
PROC Display_and_Read_Ws_CF
;**********************************************************************
mov si, offset Ws_CF
mov [byte ds:si], WSIO_OPEN
push ds si
call WSIO
pop si ds
@@00:
mov si, offset Ws_CF
mov [byte ds:si], WSIO_DISPLAY_AND_READ
push ds si
call WSIO
pop si ds
cmp al, KEY_ESC ; Cancel pressed?
je @@99 ; Yes
; No, so
;
; Filemask
;
mov si, offset Search_Filemask
push ds si
pop di es
mov si, offset Config_Field_Filemask
mov cx, FILE_NAME_LENGTH
rep movsb
;
; Include DOS Files
;
mov [Config_Include_DOSFILES_YN], LOGIC_NO
mov si, offset Config_Field_Include_DOS
cmp [byte ds:si], "N" ; Check if No is specified
je @@01 ; No is specified
; Include DOS_SYS
mov [Config_Include_DOSFILES_YN], LOGIC_YES
@@01:
;
; Include DOS Files
;
mov [Config_Include_DUP_SYS_YN], LOGIC_NO
mov si, offset Config_Field_Include_DUP_SYS
cmp [byte ds:si], "N" ; Check if No is specified
je @@02 ; No is specified
; Include DUP_SYS
mov [Config_Include_DUP_SYS_YN], LOGIC_YES
@@02:
;
; Include MAIN
;
mov [Config_MAIN_YN], LOGIC_NO
mov si, offset Config_Field_MAIN
cmp [byte ds:si], "N" ; Check if No is specified
je @@03 ; No is specified
; Use MAIN
mov [Config_MAIN_YN], LOGIC_YES
@@03:
;
; Get "new" list of drives
;
push ax ; Save pressed key
call Read_VTOC_Drives
pop ax ; Restore pressed key
cmp [Ws_DR_Occur_Max], 0 ; Any valid drive present?
je @@00 ; No
; Yes, so
;
; Check for update of configuration file
;
cmp al, KEY_F2 ; Update config file
jne @@99 ; No
; Yes, so
;
; Update DIR2ATR.CFG configuration file
;
@@05:
;
; Allocate Memory (15KB) to store old configuration file information
;
mov ax, DOS_GET_ALLOCATION_STRATEGY
int DOS_SERVICE
mov [Allocation_Strategy_Old], ax
mov [Allocation_Strategy_New], ax
mov bx, [Allocation_Strategy_New]
or bx, DOS_STRATEGY_MEM_UMB_CONV
or bx, DOS_STRATEGY_MEM_BEST_FIT
mov [Allocation_Strategy_New], bx
mov ax, DOS_SET_ALLOCATION_STRATEGY
mov bx, [Allocation_Strategy_New]
int DOS_SERVICE ; Set new strategy
jnc @@10 ; Failed?
; Yes, so
mov ax, DOS_SET_ALLOCATION_STRATEGY
mov bx, [Allocation_Strategy_Old]
int DOS_SERVICE ; Reset to old strategy
@@10:
;
; Allocate Memory now for 80 rows of config file data
;
mov ax, CONFIG_FILE_ROW_COUNT ; 80 lines of data
xor bx, bx
mov cx, CONFIG_FILE_LINE_SIZE ; 128 bytes line size
xor dx, dx
mul cx ; 80 x 128 bytes
mov [Config_File_Bytes_Reserved], ax
xor ax, ax ; Reset ax
mov ah, DOS_ALLOCATE_MEMORY
mov bx, [Config_File_Bytes_Reserved] ; Reserve 10 KB
xor cx, cx ; Reset cx
xor dx, dx ; Reset dx
int DOS_SERVICE ; Allocate Memory in paragraphs (= 16 bytes)
mov cx, ax
jnc @@15
;
; Error, Memory Allocation
;
mov ax, DOS_SET_ALLOCATION_STRATEGY
mov bx, [Allocation_Strategy_Old]
int DOS_SERVICE ; Reset to old strategy
jmp @@99
@@15:
mov ax, DOS_SET_ALLOCATION_STRATEGY
mov bx, [Allocation_Strategy_Old]
int DOS_SERVICE ; Reset to old strategy
push cx ; Determine address of allocated memory block
pop es
xor di, di
push es di ; Save address of memory block
;
; Clear memory block
;
mov cx, [Config_File_Bytes_Reserved]
xor ax, ax
mov al, SPACE ; Fill character
rep stosb ; Initialize
;
; Read Dir2atr.cfg configuration file
;
pop bx ax
push ax bx
mov si, offset CONFIG___File
push ds si
pop di es
mov [(FMS_Area ptr di).Data_Address_Hi], ax
mov [(FMS_Area ptr di).Data_Address_Lo], bx
mov [(FMS_Area ptr di).Request], CMD_OPEN_INPUT
push es di
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@40 ; Error!
mov [(FMS_Area ptr di).Request], CMD_ACCESS_GET
;
; Read Dir2atr.cfg file into allocated memory block
;
@@20:
;
; Get line from config file
;
mov si, offset CONFIG___File
push ds si
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@30 ; No
; Yes, so
adc [(FMS_Area ptr di).Data_Address_Lo], CONFIG_FILE_LINE_SIZE
jnc @@20
inc [(FMS_Area ptr di).Data_Address_Hi]
jmp @@20
@@30:
;
; Indicate input termination in memory file
;
cmp [(FMS_Area ptr di).Record_Size], 0 ; EOF found at end of line?
je @@35 ; No
; Yes, so
adc [(FMS_Area ptr di).Data_Address_Lo], CONFIG_FILE_LINE_SIZE
jnc @@35
inc [(FMS_Area ptr di).Data_Address_Hi]
@@35:
push es di
mov ax, [(FMS_Area ptr di).Data_Address_Hi]
mov di, [(FMS_Area ptr di).Data_Address_Lo]
mov es, ax
mov [byte es:di], NULL
pop di es
;
; Close configuration file
;
mov [(FMS_Area ptr di).Request], CMD_OPEN_CLOSE
push es di
call FMSIO
pop di es
jmp @@45
@@40:
pop di es
push es di
mov cx, CONFIG_PARAMETERS + 1
@@41:
mov [byte es:di], NULL
add di, CONFIG_FILE_LINE_SIZE
loop @@41
mov si, offset CONFIG___File
push ds si
pop di es
;
; Create Dir2atr.cfg configuration file
;
@@45:
pop bx ax
push ax bx
mov [(FMS_Area ptr di).Data_Address_Hi], ax
mov [(FMS_Area ptr di).Data_Address_Lo], bx
mov [(FMS_Area ptr di).Request], CMD_OPEN_OUTPUT
push es di
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@90 ; Error!
mov [(FMS_Area ptr di).Request], CMD_ACCESS_PUT
mov [Parm_Being_Processed], 0
@@50:
;
; Prepare config "line" to be written
;
push es di
mov [(FMS_Area ptr di).Record_Size], CONFIG_FILE_LINE_SIZE
mov ax, [(FMS_Area ptr di).Data_Address_Hi]
mov di, [(FMS_Area ptr di).Data_Address_Lo]
mov es, ax
mov al, [byte es:di]
pop di es
cmp al, NULL ; Last line processed
je @@70 ; Yes
; No, so
cmp al, COMMENT_ROW ; Comment "line"?
je @@60 ; Yes
; No, so
cmp al, SPACE ; Empty "line"?
jne @@70 ; No
; Yes, so
@@60:
;
; Write config "line" (comment, etc.)
;
push es di
call FMSIO
pop di es
cmp [(FMS_Area ptr di).Status], STATUS_OK
jne @@80 ; Error!
adc [(FMS_Area ptr di).Data_Address_Lo], CONFIG_FILE_LINE_SIZE
jnc @@50
inc [(FMS_Area ptr di).Data_Address_Hi]
jmp @@50
@@70:
;
; Write config "line" (parameter)
;
push es di
mov bx, [(FMS_Area ptr di).Data_Address_Hi]
mov di, [(FMS_Area ptr di).Data_Address_Lo]
mov es, bx
inc [Parm_Being_Processed]
;
; Which parameter to process?
;
mov bx, MAX_DRIVES ; Field Size
mov si, offset Config_Field_Read_From
cmp [Parm_Being_Processed], 1 ; Parm Drives?
je @@75 ; Yes
; No, so
mov bx, PATH_LENGTH ; Field Size
mov si, offset Config_Field_Write_To
cmp [Parm_Being_Processed], 2 ; Parm Filemask?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_DIsk_Density
cmp [Parm_Being_Processed], 3 ; Disk Density?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_ATR_Or_XFD
cmp [Parm_Being_Processed], 4 ; ATR or XFD?
je @@75 ; Yes
; No, so
mov bx, PATH_LENGTH ; Field Size
mov si, offset Config_Field_DOS_Path
cmp [Parm_Being_Processed], 5 ; DOS Path?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_Disk_Format
cmp [Parm_Being_Processed], 6 ; Disk Format?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_Include_DOS
cmp [Parm_Being_Processed], 7 ; Include DOS?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_Include_DUP_SYS
cmp [Parm_Being_Processed], 8 ; Include DUP.SYS?
je @@75 ; Yes
; No, so
mov bx, 1 ; Field Size
mov si, offset Config_Field_MAIN
cmp [Parm_Being_Processed], 9 ; Use MAIN SpartaDos dir?
je @@75 ; Yes
; No, so
pop di es
cmp al, NULL ; Last line processed
jne @@50 ; No
; Yes, so
jmp @@80
@@75:
mov cx, CONFIG_FILE_LINE_SIZE
rep movsb
pop di es
mov [(FMS_Area ptr di).Record_Size], bx
jmp @@60
@@80:
;
; Close config file
;
mov [(FMS_Area ptr di).Request], CMD_OPEN_CLOSE
push es di
call FMSIO
pop di es
@@90:
;
; Release Allocated Memory
;
pop di es
xor ax, ax
mov ah, DOS_FREE_ALLOCATED_MEMORY
int DOS_SERVICE ; Release Allocated Memory
@@99:
mov si, offset Ws_CF
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
ret
ENDP Display_and_Read_Ws_CF
;**********************************************************************
PROC Add_DirFiles_To_ATR_Image
;**********************************************************************
cmp [CLI_Used], LOGIC_YES ; Command Line Interface used?
je @@10 ; Yes
; No, so
;--------
; Use GUI
;--------
mov si, offset Search_Files_Path ; Parameter 1
push ds si
mov si, offset Config_Field_Write_To ; Parameter 2
push ds si
mov si, offset Config_Field_Disk_Density ; Parameter 3
push ds si
mov si, offset Config_Field_ATR_Or_XFD ; Parameter 4
push ds si
mov si, offset Config_Field_DOS_Path ; Parameter 5
push ds si
mov si, offset Config_Field_Disk_Format ; Parameter 6
push ds si
mov si, offset Config_Include_DOSFILES_YN ; Parameter 7
push ds si
mov si, offset Config_Include_DUP_SYS_YN ; Parameter 8
push ds si
mov si, offset Config_MAIN_YN ; Parameter 9
push ds si
mov si, offset Available_Drives ; Parameter 10
push ds si
mov si, offset Ws_DR_D_Drive ; Parameter 11
push ds si
mov si, offset CLI_used ; Parameter 12
push ds si
jmp @@20
@@10:
;--------
; Use CLI
;--------
mov si, offset CLI_Indir ; Parameter 1
push ds si
mov si, offset CLI_Outdisk ; Parameter 2
push ds si
mov si, offset CLI_Disk_Density ; Parameter 3
push ds si
mov si, offset CLI_Atr_Or_Xfd ; Parameter 4
push ds si
mov si, offset Config_Field_DOS_Path ; Parameter 5
push ds si
mov si, offset CLI_Disk_Format ; Parameter 6
push ds si
mov si, offset Config_Include_DOSFILES_YN ; Parameter 7
push ds si
mov si, offset Config_Include_DUP_SYS_YN ; Parameter 8
push ds si
mov si, offset Config_MAIN_YN ; Parameter 9
push ds si
mov si, offset CLI_Include_Subdirs ; Parameter 10
push ds si
mov si, offset CLI_Include_Subdirs ; Parameter 11
push ds si
mov si, offset CLI_used ; Parameter 12
push ds si
@@20:
call D_FILDSK
mov cx, 24 ; Pop 12 parameters
@@30:
pop ax
loop @@30
ret
ENDP Add_DirFiles_To_ATR_Image
;**********************************************************************
PROC Close_Ws_BG
;**********************************************************************
mov si, offset Ws_BG
mov [byte ds:si], WSIO_CLOSE
push ds si
call WSIO
pop si ds
ret
ENDP Close_Ws_BG
;**********************************************************************
PROC Exit_Program
;**********************************************************************
mov ah, DOS_TERMINATE_EXE
mov al, [Return_Code] ; Return code value
int DOS_SERVICE
ENDP Exit_Program
ENDS CSeg ; End of Code segment
END Main