home *** CD-ROM | disk | FTP | other *** search
- ;> s.MapTools
- ;
- ; 21 Nov 1993
- ; 11 Dec 1993 read drive no from command line
- ; 12 Dec 1993 removed minor debug2 bug
- ; added SaveDiscMap
- ; 19 Dec 1993 print long disc names correctly
- ; 22 Dec 1993 added code for directory creation
- ; ensured that ClaimMapSpace claims at least 2048 bytes (for dir caching)
- ; 13 Mar 1994 CreateLostFoundDir commented out
-
- AREA MapTools,CODE,READONLY
-
- GET ^.h.RegNames
- GET ^.h.Macros
- GET ^.h.Reasons
- GET ^.h.SWIs
- GET h.Head
- GET h.Macros
-
- IMPORT DisplayShortInfo
- IMPORT StrCopyZ
- IMPORT XFS_DescribeDisc
- IMPORT XFS_DiscOp
- IMPORT XFS_Drives
- IMPORT MWriteText
- IMPORT TrimPath
- IMPORT FindChar
-
- EXPORT ReadMap
- EXPORT SaveDiscMap
- EXPORT GetPath
- EXPORT DiscardMapSpace
- EXPORT ClaimMapSpace
- EXPORT StartZone
-
- GBLL debug2
- debug2 SETL {FALSE} ; {TRUE} ;
-
- ;******************************************************************************
- ;
- ;ReadMap ; -----
- ;-------
- ; on entry:
- ; r0 pointer to command tail
- ; r1 no. of params
- ; on exit:
- ; r0,r1 updated
- ;
- ; • tries to convert the first word in the environment string (if present)
- ; to a filing system & drive name
-
- Routine ReadMap,"r0-r2,r8-r11"
- BL DiscardMapSpace
- MOV r11,r0
- MOV r8,r1
- BLVC GetTempFS ; read FS::drive name into path & set tempFS
- STMVCIA sp,{r0-r1}
- MOV r9,r1
- BLVC ReadTempFS ; read FS private word
- BVS exitRM
- MOV r10,r0
-
- ADR r1,Path
- findDiscLoop
- LDRB r2,[r1],#1
- TEQ r2,#':'
- BNE findDiscLoop
-
- ADR r0,DiscName
- findDotLoop
- LDRB r2,[r1],#1
- CMP r2,#'.'
- MOVEQ r2,#0
- STRB r2,[r0],#1
- BNE findDotLoop
-
- [ debug
- SWI XOS_NewLine
- PrintR r8
- PrintR r9
- ]
- CMP r8,r9 ; was disc spec. present?
- MOVNE r0,r11
- BLNE ReadDrive
- LDRNEB r0,DriveNumber
- BLEQ XFS_Drives
- STREQB r0,DriveNumber
- ADD r0,r0,#'0'
- STRB r0,DiscName
- MOV r0,#0
- STRB r0,DiscName+1
-
- discNamed
- ADRVC r0,DiscName
- ADRVC r1,DiscRecord
- BLVC XFS_DescribeDisc
- BLVC InterpretDiscDesc
- BLVC TrimPath
- ; BLVC CreateLostFoundDir
- BLVC LoadDiscMap
- BLVC DisplayShortInfo
- BVS exitRM
-
- exitRM
- MOVVC r0,#OS_FSControl_RestoreFS
- SWIVC XOS_FSControl
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;CreateLostFoundDir
- ;-----------------
- ; on entry:
- ; [Path]
- ; on exit:
- ; [Buffer] corrupt
- ; V set if dircouldn't be created
-
- Routine CreateLostFoundDir,"r0-r5"
- ADR r0,Path
- ADR r1,Buffer
- MOV r2,#BufferSize
- BL StrCopyZ
- Exit VS
- Write ".Lost+Found"
- Exit VS
- MOV r0,#OS_File_ReadCatInfo
- ADR r1,Buffer
- SWI XOS_File
- Exit VS
- TEQ r0,#0
- BEQ createIt
- TEQ r0,#2 ; must be directory
- SETV NE
- ADRVS r0,badLostFoundDirError
- Exit
-
- createIt
- MOV r0,#OS_File_CreateDir
- ADR r1,Buffer
- MOV r4,#0
- SWI XOS_File
- LDRVC r14,Flags
- ORRVC r14,r14,#Flag_CDir
- STRVC r14,Flags
- RoutineEnd
-
- badLostFoundDirError
- & &00600F
- = "Can't create $.Lost+Found directory.",0
- ALIGN
- ;******************************************************************************
- ;
- ;GetPath
- ;-------
- ;
- ; on entry:
- ; r0 -> candidate for disc spec.
- ; r1 number of params
- ; on exit:
- ; r0 updated } if string in r0 could be used
- ; r1 decremented }
- ; [Path] contains pathname
-
- Routine GetPath,r0-r5
- [ debug
- PrintR r0
- PrintR r1
- ]
- CMP r1,#1
- ADR r3,RootDir
- BLT paramsCheckedGP
- findColonLoop
- LDRB r2,[r0],#1
- TEQ r2,#':'
- LDREQ r3,[sp] ; parameter seems ok, so use it
- CMP r2,#32
- BGT findColonLoop
- SUBLT r0,r0,#1
- ADR r2,RootDir
- TEQ r2,r3
- SUBNE r1,r1,#1
- STMNEIA sp,{r0-r1} ; advance pointer if used
- [ debug
- PrintR r0
- PrintR r1
- ]
- paramsCheckedGP
- MOV r0,#OS_FSControl_CanonicalizePath
- MOV r1,r3
- ADR r2,Path
- MOV r5,#PathSize
- MOV r3,#0
- MOV r4,#0
- SWI XOS_FSControl
- BVS getPathExit
- MOVS r0,#OS_FSControl_SetTempFSFromPrefix
- ADR r1,Path
- SWI XOS_FSControl
- getPathExit
- RoutineEnd
-
-
- RootDir = "$",0
- ALIGN
-
- ;******************************************************************************
- ;
- ;ReadDrive
- ;---------
- ;
- ; on entry:
- ; r0 pointer to command tail
- ; on exit:
- ; [DriveNumber]
-
- Routine ReadDrive,r0-r1
- [ debug
- PrintR r0
- ]
- findDriveLoop
- LDRB r1,[r0],#1
- CMP r1,#32
- BGT findDriveLoop
-
- LDRB r1,[r0,#-2]
- SUB r1,r1,#'0'
- [ debug
- PrintR r1
- ]
- STRB r1,DriveNumber
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;CalcDrive
- ;---------
- ;
- ; on entry:
- ; [Path]
- ; on exit:
- ; [DriveNumber]
-
- Routine CalcDrive,"r0-r5,r8"
- Exit ;;;;;!!!!!!!!!!!
-
-
- MOV r8,#7 ; r8 drive number
- loopCD
- ADR r0,Path
- ADR r1,Buffer
- MOV r2,#BufferSize
- BL StrCopyZ
- BVS exitCD
- ADR r1,Buffer
- MOV r0,#':'
- BL FindChar
- ADD r0,r8,#'0' ; store guessed drive no in tmp. path
- STRB r0,[r1,#2]
- MOV r0,#0
- STRB r0,[r1,#3]
- MOV r0,#OS_FSControl_CanonicalizePath
- ADR r1,Buffer
- ADD r2,r1,#256
- MOV r3,#0
- MOV r4,#0
- MOV r5,#BufferSize-256
- SWI XOS_FSControl
- [ debug
- STMFD sp!,{r0}
- SWI XOS_WriteS
- = 10,13,"r1: '"
- ALIGN
- MOV r0,r1
- SWI XOS_Write0
- SWI XOS_WriteS
- = " r2: "
- ALIGN
- MOV r0,r2
- SWI XOS_Write0
- LDMFD sp!,{r0}
- ]
- BVS exitCD
- MOV r0,#':'
- BL FindChar
- ADD r6,r1,#2 ; r6 real disc name
- MOV r1,r2
- BL FindChar
- ADD r7,r1,#2 ; r7 found disc name
- compareLoop
- LDRB r0,[r6],#1
- CMP r0,#32
- BLE foundDrive
- LDRB r1,[r7],#1
- TEQ r0,r1
- BEQ compareLoop
-
- SUBS r8,r8,#1
- BPL loopCD
-
- ADR r0,badDriveError
- SETV
- B exitCD
- badDriveError
- & &006005
- = "Bad disc reference.",0
- ALIGN
-
- foundDrive
- STRB r8,DriveNumber
- exitCD
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;GetTempFS ; -----
- ;----------
- ; on entry:
- ; r0 pointer to string
- ; r1 # of parameters in command line
- ;
- ; on exit:
- ; r0 points to part past FS specifier if found, or preserved if not
- ; r1 decremented by 1 if FS specifier found
- ; Path contains FS and drive in the form "YourFS::Disc.<anything>"
- ;
- ; • sets the temporary FS
-
- Routine GetTempFS,r0-r5
- BLVC GetPath
- STMVCIA sp,{r0-r1}
- BLVC CalcDrive
- BVS getTempExit
- CMN r2,#1
- ADREQ r0,tempFsUnsetError
- SETV EQ
-
- [ debug
- BVS getTempExit
- SWI XOS_NewLine
- SWI XOS_WriteS
- = "Path found: ",0
- ALIGN
- ADR r0,Path
- SWI XOS_Write0
- SWI XOS_NewLine
- ]
- getTempExit
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;ReadTempFS
- ;----------
- ;
- ; on entry:
- ;
- ; on exit:
- ; V,r0 set if not found
- ;
- ; • gets the 'filing system private word' from the temporary set FS
- ; for direct calls to FileCore; no messy self-modifying code
-
- Routine ReadTempFS,r0-r4
- MOVS r0,#OS_FSControl_ReadTempFSLocation
- SWI XOS_FSControl
- BVS exitRTFS
- TEQ r1,#0
- ADREQ r0,tempFsUnsetError
- SETV EQ
- exitRTFS
- MVNVS r2,#0
- STR r2,FSPrivateWord
- RoutineEnd
-
- tempFsUnsetError
- & &006000
- = "Unknown filing system.",0
- ALIGN
-
- ;******************************************************************************
- ;
- ;DiscardMapSpace
- ;---------------
- ;
- ; on entry:
- ;
- ; on exit:
- ;
- ; can be called even when no map is in memory
-
- Routine DiscardMapSpace,r0-r2
- LDR r2,MapClaimedSpace
- TEQ r2,#0
- BEQ mapDiscarded
- [ debug2
- SWI XOS_WriteS
- = "Discarding loaded map...",10,13,0
- ALIGN
- ]
- MOVVC r0,#OS_Module_Free
- SWIVC XOS_Module
- MOVVC r0,#0
- STRVC r0,MapLocation
- STRVC r0,MapClaimedSpace
- mapDiscarded
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;ClaimMapSpace
- ;-------------
- ;
- ; on entry:
- ; MapSize,SectorSize set
- ;
- ; on exit:
- ;
- ; • can be called even when a map is already in memory
-
- Routine ClaimMapSpace,r0-r3
- LDR r2,MapClaimedSpace ; first get rid of old map
- TEQ r2,#0
- BLNE DiscardMapSpace
- BVS exitClMSp
-
- MOV r0,#OS_Module_Claim
- LDR r1,SectorSize
- MOV r1,#4096 ;!!!!!!!!!!!!!!!!!! ; 'nicer' start mem address
- SUB r1,r1,#1 ; r4 sectorsize-1 (i.e., 511 etc)
- LDR r3,MapSize
- CMP r3,#2048 ; the map space also acts as an
- MOVLT r3,#2048 ; temporary dir buffer
- ADD r3,r1,r3
- SWI XOS_Module
- MOVVS r2,#0
- STR r2,MapClaimedSpace
- BVS exitClMSp
- ADD r2,r2,r1
- BIC r2,r2,r1 ; r2 := (r2+r4) AND (NOT r4)
- STR r2,MapLocation
-
- exitClMSp
- RoutineEnd
-
- ;;******************************************************************************
- ;;
- ;CleanTable
- ;;---------
- ; STMFD sp!,{r0-r1,lr}
- ; Routine "CleanTable"
- ; MOV r0,#0
- ; LDR r1,Table
- ;cleanLoop
- ; LDR lr,[r1],#12
- ; CMN lr,#1 ; end of table ?
- ; STRNE r0,[r1],#4
- ; BNE cleanLoop
- ;exitCT
- ; RoutineEnd
- ;
- ;******************************************************************************
- ;
- ;LoadDiscMap ; -----
- ;-----------
- ;
- ; on entry:
- ;
- ; on exit:
- ;
- ; • reads the disc map
- ; • expects MapSize, MapLocation, MapDAd to be set correctly
-
- Routine LoadDiscMap,r0-r4
-
- BL ClaimMapSpace
-
- MOV r1,#FileCore_DiscOp_Read
- LDR r2,MapDAd
- LDR r3,MapLocation
- LDR r4,MapSize
- BLVC XFS_DiscOp
-
- [ debug2
- Exit VS
- MOV r4,r2
- ADR r1,Buffer
- MOV r2,#BufferSize
- Write "Map loaded at &"
- LDR r0,MapLocation
- SWIVC XOS_ConvertHex8
- Exit VS
- WriteB """, "",27,4,32"
- LDRVC r0,MapSize
- SWIVC XOS_ConvertFileSize
- ADRVC r0,Buffer
- LDRVC r1,Dictionary
- SWIVC XOS_PrettyPrint
- SWIVC XOS_NewLine
- ]
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;SaveDiscMap
- ;-----------
- ; on entry:
- ; on exit:
- ;
- ; • reads the disc map
- ; • expects MapSize, MapLocation, MapDAd to be set correctly
-
- Routine SaveDiscMap,r0-r2
- BL DismountDisc
-
- MOV r1,#FileCore_DiscOp_Write
- LDR r2,MapDAd
- LDR r3,MapLocation
- LDR r4,MapSize
- BLVC XFS_DiscOp
-
- MOV r1,#FileCore_DiscOp_Write
- LDR r2,MapDAd
- LDR r3,MapLocation
- LDR r4,MapSize
- ADD r2,r2,r4
- BLVC XFS_DiscOp
-
- RoutineEnd
- ;******************************************************************************
- ;
- ;DismountDisc
- ;------------
- ; on entry:
- ; [Path]
- ; on exit:
- ;
-
- Routine "DismountDisc",r0-r3
- ADR r1,Buffer
- MOV r2,#BufferSize
- ADR r3,Path
- copyFS
- LDRB r0,[r3],#1
- SUB r2,r2,#1
- STRB r0,[r1],#1
- TEQ r0,#':'
- BNE copyFS
- Write "Dismount "
- copyDrive
- LDRB r0,[r3],#1
- SUB r2,r2,#1
- CMP r0,#32
- TEQGT r0,#'.'
- MOVLE r0,#0
- STRB r0,[r1],#1
- BGT copyDrive
-
- [ debug
- SWIVC XOS_WriteI+"'"
- ADRVC r0,Buffer
- SWIVC XOS_Write0
- SWIVC XOS_WriteI+"'"
- ]
- ADR r0,Buffer
- SWI XOS_CLI
- RoutineEnd
-
- ;******************************************************************************
- ;
- ;InterpretDiscDesc ; -----
- ;-----------------
- ;
- ; on entry:
- ;
- ; on exit:
- ;
- ; • extracts ZoneSize etc from disc record
-
- Routine InterpretDiscDesc,r0-r11
- MOV r11,#1
- LDRB r3,LogSectorSize
- MOV r0,r11,ASL r3
- STR r0,SectorSize
-
- LDR r1,UnusedBits16
- BIC r1,r1,#&FF000000
- BIC r1,r1,#&00FF0000
- STR r1,UnusedBits
- RSB r6,r1,r0,ASL #3 ; ZoneSize%=(SectorSize%*8-UnusedBits%)...
- LDRB r2,LogBitSize
- MOV r7,r6,ASL r2 ; ...*BitSize%
- STR r6,ZoneSize
-
- SUB r4,r6,#60*8 ; Zone0Size%=(SectorSize%*8-UnusedBits%)-60*8...
- MOV r8,r4,ASL r2 ; ...*BitSize%
- STR r4,Zone0Size
-
- LDRB r5,Zones
- MOVS r4,r5,ASR #1 ; map start at zone=#zones div 2
- SUBNE r4,r4,#1 ; allow for zone 0
- MLANE r4,r7,r4,r8
- LDRB r9,DriveNumber ; ORR drive number
- ORR r4,r4,r9,ASL #29
- STR r4,MapDAd
-
- MOV r4,r5,ASL r3
- STR r4,MapSize
-
- LDRB r4,IDFieldLength
- MOV r7,#1
- MOV r7,r7,ASL r4
- SUB r7,r7,#1
- STR r7,IDFieldMask
- ADD r4,r4,#1
- uDivMod r8,r6,r4,r7
- STR r8,IDsPerZone
-
- MOV r4,r11,ASL r2
- STR r4,BitSize
-
- CMP r0,r4
- STRGT r0,Granularity
- STRLE r4,Granularity
-
- LDR r0,DiscSize
- LDRB r1,LogBitSize
- MOV r0,r0,ASR r1
- ADD r0,r0,#512-32 ; disc record
- LDRB r1,Zones
- ADD r0,r0,r1,ASL #5 ; 32 bits per zone
- STR r0,MapEnd
-
- ADR r0,DiscName ; zero-termonate disc name
- DNloop
- LDRB r3,[r0],#1
- CMP r3,#32
- BGT DNloop
- MOV r3,#0
- STRB r3,[r0,#-1]
- STRB r3,DiscName+10
-
- RoutineEnd
-
- ;******************************************************************************
- ;
- StartZone ; -----
- ;--------
- ; on entry:
- ;
- ; r0 filenumber
- ; on exit:
- ; r0 first zone
- ; Z set if start zone = 0
- ; • can't coppe with ID #2
-
- STMFD sp!,{r1,r10,lr}
- LDR r1,IDsPerZone
- uDivMod r10,r0,r1,r14 ; zone = file number DIV IDs per zone
- MOVS r0,r10
- LDMFD sp!,{r1,r10,pc}
-
-
- END
-