%TITLE "XDIR - Atari XL/XE DIsk manageR - CHiPS bv 1997"
;**********************************************************************
;** **
;** Program : XDIR v10.05.00 **
;** Purpose : Atari XL/XE Disk Manager **
;** **
;** Author : B.F. Schreurs **
;** Computer High Performance Software (CHiPS) bv **
;** Date : November 19th, 1997 **
;** **
;** Calls : DC_DIRS - Determine Current Directories **
;** DC_DRV - Determine Current Drives **
;** DC_FILES - Determine Current Files **
;** 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 **
;** **
;** CLI syntax: XDIR Indisk Outlib **
;** i.e. **
;** XDIR C:\XLDISKS\020.ATR C:\XLFILES\ **
;** i.e. **
;** Indisk = C:\XLDISKS\020.ATR **
;** Outlib = C:\XLFILES\ **
;** **
;**********************************************************************
IDEAL
JUMPS
;----------------------------------------------------------------------
;-- Equates --
;----------------------------------------------------------------------
include ".\equ\attrib.equ"
include ".\equ\dos.equ"
include ".\equ\equipmnt.equ"
include ".\equ\fmsio.equ"
include ".\equ\keyboard.equ"
include ".\str\psp.str"
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 7 ; Max 7 parameters
CLI_OFFSET_COMMAND_TAIL EQU 130
DISK_SIZE EQU 11
DISK_MEDIA_TYPE_UNKNOWN_DENSITY EQU "U"
DISK_MEDIA_TYPE_SINGLE_DENSITY EQU "S"
DISK_MEDIA_TYPE_MEDIUM_DENSITY EQU "M"
DISK_MEDIA_TYPE_ENHANCED_DENSITY EQU "E"
DISK_MEDIA_TYPE_DOUBLE_DENSITY EQU "D"
DISK_MEDIA_TYPE_QUAD_DENSITY EQU "Q"
DISK_MEDIA_TYPE_720KB_DENSITY EQU "7"
DISK_MEDIA_TYPE_1440KB_DENSITY EQU "1"
DISK_MEDIA_TYPE_MEGADISK_DENSITY EQU "G"
DISK_MEDIA_TYPE_HARDDISK_DENSITY EQU "H"
ATR_HEADER_SIZE EQU 16
ATR_HEADER_SIZE_COMPARE EQU 8
EIGHTBIT_VTOC_FILES_MAX EQU 64
EIGHTBIT_BOOT_SECTOR EQU 1
EIGHTBIT_VTOC_SECTOR EQU 361
EIGHTBIT_VTOC_SIZE EQU 1024
EIGHTBIT_FILE_ENTRY_SIZE EQU 16
SPARTADOS_FILE_ENTRY_SIZE EQU 23
EIGHTBIT_SECTOR_SIZE EQU 128
EIGHTBIT_SECTOR_SIZE_DOUBLE EQU 256
EIGHTBIT_BOOT_SECTOR_SIZE EQU 384
EIGHTBIT_BOOT_SECTORS EQU 3
PC_DATE_YEAR_OFFSET EQU 80 ; Year 1980 for Pc date
DISK_BLOCK_SIZE EQU 1024
SPARTADOS_VTOC_BUFFER_SIZE EQU 2048
SPARTADOS_DIRECTORY EQU 32
; Sectors Free
XDISK_SECTORS_SINGLE EQU 707
XDISK_SECTORS_MEDIUM EQU 1010
XDISK_SECTORS_ENHANCED EQU 1120
XDISK_SECTORS_DOUBLE EQU 1437
XDISK_SECTORS_QUAD EQU 2877
XDISK_SECTORS_720KB EQU 2877
XDISK_SECTORS_1440KB EQU 5757
XDISK_SECTORS_MEGADISK EQU 8192
XDISK_SECTORS_HARDDISK EQU 65532
XFILE_SIZE_LENGTH EQU 4
;**********************************************************************
SEGMENT SSeg Para Stack 'STACK'
;**********************************************************************
db 64 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\wsio.str"
;----------------------------------------------------------------------
;-- SELECT and FD --
;----------------------------------------------------------------------
;
; Configuration File
;
CONFIG___File FMS_Area <>
CONFIG___Pathname DB "C:\XDIR.CFG"
DB PATH_LENGTH - 11 dup (SPACE)
DB 1 dup (0)
CONFIG___Data_Buffer DB PATH_LENGTH + 2 dup (NULL)
;
; Atari Disk Image
;
ATARI____File FMS_Area <>
ATARI____Pathname DB PATH_LENGTH dup (SPACE)
DB 1 dup (0)
;
; Extracted Atari Disk Image (pc) File
;
PC_ATARI_File FMS_Area <>
PC_ATARI_Pathname DB PATH_LENGTH dup (SPACE)
DB 1 dup (0)
;----------------------------------------------------------------------
;-- 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_Indisk DB PATH_LENGTH dup (SPACE)
DB NULL
CLI_Outdir DB PATH_LENGTH dup (SPACE)
DB NULL
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" = No 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)
Search_Filemask DB FILE_NAME_LENGTH dup (SPACE)
Buffer_Sense_Media_Type DW 1 dup (NULL)
Save_cx DW ?
XL_VTOC_File_Nr DB 0
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
SpartaDos_Disk DB LOGIC_NO
SpartaDos_Last_Sector DB LOGIC_NO
SpartaDos_Filesize_Hi DW 0
SpartaDos_Filesize_Lo DW 0
SpartaDos_Next_Link_Sector DW 0
SpartaDos_Link_Sector_Offset DB 0
SpartaDos_Date_YY DB 0
SpartaDos_Date_MM DB 0
SpartaDos_Date_DD DB 0
SpartaDos_Time_HH DB 0
SpartaDos_Time_MM DB 0
Attrib_Non_modifiable DB ATTRIB_GREEN_WHITE
Parm_Being_Processed DB 0
Pc_Date_YY DB 0
Pc_Date_MM DB 0
Pc_Date_DD DB 0
Pc_Time_HH DB 0
Pc_Time_MM DB 0
Old_Dta_Seg DW ? ; Old Dta Segment Address
Old_Dta_Ofs DW ? ; Old Dta Segment Offset
Own_Dta Dta <>
Disk_VTOC_Buffer DB DISK_BLOCK_SIZE dup (0)
DB DISK_BLOCK_SIZE dup (0) ; SpartaDos overflow buffer
Disk_I_O_Buffer DB EIGHTBIT_SECTOR_SIZE_DOUBLE dup (0)
Disk_Link_Sector_Buffer DB EIGHTBIT_SECTOR_SIZE_DOUBLE dup (0)
DB 0
;----------------------------------------------------------------------
;-- --
;-- C O N F I G U R A T I O N F I L E F O R X D I R --
;-- --
;----------------------------------------------------------------------
Default_Startup_Path DB "C:\"
DB PATH_LENGTH - 3 dup (SPACE)
DB NULL
Config_Startup_Path DB PATH_LENGTH dup (SPACE)
DB 1 dup (0)
Config_Deleted_YN DB 1 dup (LOGIC_YES)
;--------------
; Config Fields
;--------------
Config_Field_Drives DB "* "
DB 1 dup (0)
Config_Field_Filemask DB "*.ATR "
DB 1 dup (0)
Config_Field_Startup_Path DB "\"
DB PATH_LENGTH - 1 dup (SPACE)
DB 1 dup (0)
Config_Field_Extract_To_Path DB "C:\XIN\"
DB PATH_LENGTH - 7 dup (SPACE)
DB 1 dup (0)
Config_Field_Deleted_Extract DB "Y"
DB 1 dup (0)
Config_Field_Deleted_Path DB "C:\XDEL\"
DB PATH_LENGTH - 8 dup (SPACE)
DB 1 dup (0)
Config_Field_Add_Path DB PATH_LENGTH dup (SPACE)
DB 1 dup (0)
;----------------------------------------------------------------------
;-- --
;-- A T A R I 8 B I T D I S K I N F O --
;-- --
;----------------------------------------------------------------------
Disk_Sector_Size DW 0
Disk_Media_Type DB DISK_MEDIA_TYPE_SINGLE_DENSITY
Disk_Image_Shown DB LOGIC_NO
Disk_Image_ATR DB LOGIC_NO
Disk_XFD_Single DB " 92,160"
Disk_XFD_Medium DB " 133,120"
Disk_XFD_Enhanced DB " 143,360"
Disk_XFD_Double DB " 183,936"
Disk_XFD_Quad DB " 368,256"
Disk_XFD_720KB DB " 736,896"
Disk_XFD_Megadisk DB " 1,048,576"
Disk_XFD_1440KB DB " 1,474,176"
Disk_XFD_Harddisk DB " 16,776,576"
Disk_ATR_Single DB " 92,176"
Disk_ATR_Medium DB " 133,136"
Disk_ATR_Enhanced DB " 143,376"
Disk_ATR_Double DB " 183,952"
Disk_ATR_Quad DB " 368,272"
Disk_ATR_720KB DB " 736,912"
Disk_ATR_Megadisk DB " 1,048,592"
Disk_ATR_1440KB DB " 1,474,192"
Disk_ATR_Harddisk DB " 16,776,592"
Disk_ATR_Single_Header DB 096h,002h,080h,016h,080h,000h,000h,000h
Disk_ATR_Medium_Header DB 096h,002h,080h,020h,080h,000h,000h,000h
Disk_ATR_Enhanced_Header DB 096h,002h,000h,023h,080h,000h,000h,000h
Disk_ATR_Double_Header DB 096h,002h,0E8h,02Ch,000h,001h,000h,000h
Disk_ATR_Quad_Header DB 096h,002h,0E8h,059h,000h,001h,000h,000h
Disk_ATR_720KB_Header DB 096h,002h,000h,0B4h,000h,001h,000h,000h
Disk_ATR_Megadisk_Header DB 096h,002h,000h,000h,080h,000h,001h,000h
Disk_ATR_1440KB_Header DB 096h,002h,000h,068h,000h,001h,001h,000h
Disk_ATR_Harddisk_Header DB 096h,002h,0F0h,0FFh,000h,001h,00Fh,000h
XFile_Size_Text DB "000,000,000"
XFile_Deleted DB 1 dup (LOGIC_NO)
XFile_Locked DB 1 dup (LOGIC_NO)
XFile_Extended DB 1 dup (LOGIC_NO)
XFile_Inverse DB 1 dup (LOGIC_NO)
XDisk_Sectors_Free DW XDISK_SECTORS_SINGLE
XDisk_File_Info_1 DB 22 dup ("xxxxxxxx.xxx9999")
XDisk_File_Info_2 DB 22 dup ("xxxxxxxx.xxx9999")
XDisk_File_Info_3 DB 20 dup ("xxxxxxxx.xxx9999")
; --
; 64 files
;
XDisk_Free_Sectors DB "0000"
XDisk_Attrib_Info_1 DB 22 dup (ATTRIB_CYAN_WHITE)
XDisk_Attrib_Info_2 DB 22 dup (ATTRIB_CYAN_WHITE)
XDisk_Attrib_Info_3 DB 20 dup (ATTRIB_CYAN_WHITE)
XDisk_Attrib_Size_1 DB 22 dup (ATTRIB_CYAN_WHITE)
XDisk_Attrib_Size_2 DB 22 dup (ATTRIB_CYAN_WHITE)
XDisk_Attrib_Size_3 DB 20 dup (ATTRIB_CYAN_WHITE)
XDisk_Progress_Cnt_Prev DB 0
XDisk_Progress_Cnt_Max DB 32
XDisk_Progress_Bar DB 32 dup (0B0h)
XDisk_Progress_Bar_Attr DB ATTRIB_CYAN_WHITE
XDisk_Extract_File DB 12 dup (SPACE)
XDisk_Next_Sector DW 0
Sectors_To_Extract DW ?
Sectors_Extracted DW ?
Sectors_For_This_File DW ?
XDisk_Image_Is_Bootdisk DB "Bootdisk "
;-------------------------------------------------------------------
; Directory/Folder structure for SpartaDos disks
; Assume a maximum of 64 displayable folders/directories on the disk
;-------------------------------------------------------------------
; Sector hi byte
; ³ Sector lo byte
; ³ ³ Position in sector hi byte
; ³ ³ ³ Position in sector lo byte
; ³ ³ ³ ³
Folder_Pointer DB 256 dup (000000000h) ; 00 00 00 00
Folder_Counter DW 0
Folder_Indicator DB LOGIC_NO
Process_Files DB LOGIC_NO
;-----------------------------------------------------
; When extracting the files (from within directories),
; we need the folder path (i.e. to create directories)
;-----------------------------------------------------
Folder_Path DB PATH_LENGTH dup (SPACE)
;----------------------------------------------------------------------
;-- --
;-- 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
Ws_BG_Fields 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 " XDIR - Atari XL/XE Directory Lister - v10.05.00 "
DB " "
DB " by B.F. Schreurs, February 2nd, 1999, CHiPS bv "
DB " Computer High Performance Software - Freeware "
DB " Email: stack@xs4all.nl "
DB " Homepage: http:\\www.xs4all.nl\~stack "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB " "
DB NULL
Ws_FW_Fields DB NULL
;**********************************************************************
; X L d i s k i m a g e v t o c *
;**********************************************************************
Ws_XL 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_XL_Name DB "XLDISK "
Ws_XL_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_XL_Text DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³ ³"
DB "³ ³ ³Free Sectors ³"
DB NULL
;
; VTOC Files Specification
;
Ws_XL_F_XL_File_1 DB 1 ; Relative ROW, NULL=End
DB 2 ; Relative COLUMN
DB 12 ; Field Size
DB 22 ; Nr of occurrences
DW 4 ; Offset to next field
DB 0 ;
DB 0 ;
DB 0 ;
DB 1 ; Protected
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ;
DB 0 ; <.... Lo>
DB 0 ;
DB LOGIC_NO ; Field changed indicator
DW ? ; Source Hi
DW ? ; ...... Lo
DW NULL ;