home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / discs / f / mapmanager / s_MapTools < prev    next >
Encoding:
Text File  |  1994-03-13  |  11.7 KB  |  666 lines

  1. ;> s.MapTools
  2. ;
  3. ; 21 Nov 1993
  4. ; 11 Dec 1993    read drive no from command line
  5. ; 12 Dec 1993    removed minor debug2 bug
  6. ;        added SaveDiscMap
  7. ; 19 Dec 1993    print long disc names correctly
  8. ; 22 Dec 1993    added code for directory creation
  9. ;        ensured that ClaimMapSpace claims at least 2048 bytes (for dir caching)
  10. ; 13 Mar 1994    CreateLostFoundDir commented out
  11.  
  12.     AREA    MapTools,CODE,READONLY
  13.  
  14.     GET    ^.h.RegNames
  15.     GET    ^.h.Macros
  16.     GET    ^.h.Reasons
  17.     GET    ^.h.SWIs
  18.     GET    h.Head
  19.     GET    h.Macros
  20.  
  21.     IMPORT    DisplayShortInfo
  22.     IMPORT    StrCopyZ
  23.     IMPORT    XFS_DescribeDisc
  24.     IMPORT    XFS_DiscOp
  25.     IMPORT    XFS_Drives
  26.     IMPORT    MWriteText
  27.     IMPORT    TrimPath
  28.     IMPORT    FindChar
  29.  
  30.     EXPORT    ReadMap
  31.     EXPORT    SaveDiscMap
  32.     EXPORT    GetPath
  33.     EXPORT    DiscardMapSpace
  34.     EXPORT    ClaimMapSpace
  35.     EXPORT    StartZone
  36.  
  37.     GBLL    debug2
  38. debug2    SETL    {FALSE} ; {TRUE} ; 
  39.  
  40. ;******************************************************************************
  41. ;
  42. ;ReadMap                                ; -----
  43. ;-------
  44. ; on entry:
  45. ; r0    pointer to command tail
  46. ; r1    no. of params
  47. ; on exit:
  48. ; r0,r1    updated
  49. ;
  50. ; • tries to convert the first word in the environment string (if present) 
  51. ;   to a filing system & drive name
  52.  
  53.     Routine    ReadMap,"r0-r2,r8-r11"
  54.     BL    DiscardMapSpace
  55.     MOV    r11,r0
  56.     MOV    r8,r1
  57.     BLVC    GetTempFS            ;    read FS::drive name into path & set tempFS
  58.     STMVCIA    sp,{r0-r1}
  59.     MOV    r9,r1
  60.     BLVC    ReadTempFS            ;    read FS private word
  61.     BVS    exitRM
  62.     MOV    r10,r0
  63.  
  64.     ADR    r1,Path
  65. findDiscLoop
  66.     LDRB    r2,[r1],#1
  67.     TEQ    r2,#':'
  68.     BNE    findDiscLoop
  69.  
  70.     ADR    r0,DiscName
  71. findDotLoop
  72.     LDRB    r2,[r1],#1
  73.     CMP    r2,#'.'
  74.     MOVEQ    r2,#0
  75.     STRB    r2,[r0],#1
  76.     BNE    findDotLoop
  77.  
  78.     [    debug
  79.     SWI    XOS_NewLine
  80.     PrintR    r8
  81.     PrintR    r9
  82.     ]
  83.     CMP    r8,r9                ;    was disc spec. present?
  84.     MOVNE    r0,r11
  85.     BLNE    ReadDrive
  86.     LDRNEB    r0,DriveNumber
  87.     BLEQ    XFS_Drives
  88.     STREQB    r0,DriveNumber
  89.     ADD    r0,r0,#'0'
  90.     STRB    r0,DiscName
  91.     MOV    r0,#0
  92.     STRB    r0,DiscName+1
  93.  
  94. discNamed
  95.     ADRVC    r0,DiscName
  96.     ADRVC    r1,DiscRecord
  97.     BLVC    XFS_DescribeDisc
  98.     BLVC    InterpretDiscDesc
  99.     BLVC    TrimPath
  100. ;    BLVC    CreateLostFoundDir
  101.     BLVC    LoadDiscMap
  102.     BLVC    DisplayShortInfo
  103.     BVS    exitRM
  104.  
  105. exitRM
  106.     MOVVC    r0,#OS_FSControl_RestoreFS
  107.     SWIVC    XOS_FSControl
  108.     RoutineEnd
  109.  
  110. ;******************************************************************************
  111. ;
  112. ;CreateLostFoundDir
  113. ;-----------------
  114. ; on entry:
  115. ; [Path]
  116. ; on exit:
  117. ; [Buffer] corrupt
  118. ; V    set if dircouldn't be created
  119.  
  120.     Routine    CreateLostFoundDir,"r0-r5"
  121.     ADR    r0,Path
  122.     ADR    r1,Buffer
  123.     MOV    r2,#BufferSize
  124.     BL    StrCopyZ
  125.     Exit VS
  126.     Write    ".Lost+Found"
  127.     Exit VS
  128.     MOV    r0,#OS_File_ReadCatInfo
  129.     ADR    r1,Buffer
  130.     SWI    XOS_File
  131.     Exit VS
  132.     TEQ    r0,#0
  133.     BEQ    createIt
  134.     TEQ    r0,#2                ;    must be directory
  135.     SETV NE
  136.     ADRVS    r0,badLostFoundDirError
  137.     Exit
  138.     
  139. createIt
  140.     MOV    r0,#OS_File_CreateDir
  141.     ADR    r1,Buffer
  142.     MOV    r4,#0
  143.     SWI    XOS_File
  144.     LDRVC    r14,Flags
  145.     ORRVC    r14,r14,#Flag_CDir
  146.     STRVC    r14,Flags
  147.     RoutineEnd
  148.  
  149. badLostFoundDirError
  150.     &    &00600F
  151.     =    "Can't create $.Lost+Found directory.",0
  152.     ALIGN
  153. ;******************************************************************************
  154. ;
  155. ;GetPath
  156. ;-------
  157. ;
  158. ; on entry:
  159. ; r0    -> candidate for disc spec.
  160. ; r1    number of params
  161. ; on exit:
  162. ; r0    updated        } if string in r0 could be used
  163. ; r1    decremented     }
  164. ; [Path]    contains pathname
  165.  
  166.     Routine    GetPath,r0-r5
  167.     [    debug
  168.     PrintR    r0
  169.     PrintR    r1
  170.     ]
  171.     CMP    r1,#1
  172.     ADR    r3,RootDir
  173.     BLT    paramsCheckedGP
  174. findColonLoop
  175.     LDRB    r2,[r0],#1
  176.     TEQ    r2,#':'
  177.     LDREQ    r3,[sp]                    ;    parameter seems ok, so use it
  178.     CMP    r2,#32
  179.     BGT    findColonLoop
  180.     SUBLT    r0,r0,#1
  181.     ADR    r2,RootDir
  182.     TEQ    r2,r3
  183.     SUBNE    r1,r1,#1
  184.     STMNEIA    sp,{r0-r1}                ;    advance pointer if used
  185.     [    debug
  186.     PrintR    r0
  187.     PrintR    r1
  188.     ]
  189. paramsCheckedGP
  190.     MOV    r0,#OS_FSControl_CanonicalizePath
  191.     MOV    r1,r3
  192.     ADR    r2,Path
  193.     MOV    r5,#PathSize
  194.     MOV    r3,#0
  195.     MOV    r4,#0
  196.     SWI    XOS_FSControl
  197.     BVS    getPathExit
  198.     MOVS    r0,#OS_FSControl_SetTempFSFromPrefix
  199.     ADR    r1,Path
  200.     SWI    XOS_FSControl
  201. getPathExit
  202.     RoutineEnd
  203.  
  204.  
  205. RootDir    =    "$",0
  206.     ALIGN
  207.  
  208. ;******************************************************************************
  209. ;
  210. ;ReadDrive
  211. ;---------
  212. ;
  213. ; on entry:
  214. ; r0    pointer to command tail
  215. ; on exit:
  216. ; [DriveNumber]
  217.  
  218.     Routine    ReadDrive,r0-r1
  219.     [    debug
  220.     PrintR    r0
  221.     ]
  222. findDriveLoop
  223.     LDRB    r1,[r0],#1
  224.     CMP    r1,#32
  225.     BGT    findDriveLoop
  226.  
  227.     LDRB    r1,[r0,#-2]
  228.     SUB    r1,r1,#'0'
  229.     [    debug
  230.     PrintR    r1
  231.     ]
  232.     STRB    r1,DriveNumber
  233.     RoutineEnd
  234.  
  235. ;******************************************************************************
  236. ;
  237. ;CalcDrive
  238. ;---------
  239. ;
  240. ; on entry:
  241. ; [Path]
  242. ; on exit:
  243. ; [DriveNumber]
  244.  
  245.     Routine    CalcDrive,"r0-r5,r8"
  246.     Exit            ;;;;;!!!!!!!!!!!
  247.  
  248.  
  249.     MOV    r8,#7            ; r8    drive number
  250. loopCD
  251.     ADR    r0,Path
  252.     ADR    r1,Buffer
  253.     MOV    r2,#BufferSize
  254.     BL    StrCopyZ
  255.     BVS    exitCD
  256.     ADR    r1,Buffer
  257.     MOV    r0,#':'
  258.     BL    FindChar
  259.     ADD    r0,r8,#'0'        ;    store guessed drive no in tmp. path
  260.     STRB    r0,[r1,#2]
  261.     MOV    r0,#0
  262.     STRB    r0,[r1,#3]
  263.     MOV    r0,#OS_FSControl_CanonicalizePath
  264.     ADR    r1,Buffer
  265.     ADD    r2,r1,#256
  266.     MOV    r3,#0
  267.     MOV    r4,#0
  268.     MOV    r5,#BufferSize-256
  269.     SWI    XOS_FSControl
  270.     [    debug
  271.     STMFD    sp!,{r0}
  272.     SWI    XOS_WriteS
  273.     =    10,13,"r1: '"
  274.     ALIGN
  275.     MOV    r0,r1
  276.     SWI    XOS_Write0
  277.     SWI    XOS_WriteS
  278.     =    "         r2: "
  279.     ALIGN
  280.     MOV    r0,r2
  281.     SWI    XOS_Write0
  282.     LDMFD    sp!,{r0}
  283.     ]
  284.     BVS    exitCD
  285.     MOV    r0,#':'
  286.     BL    FindChar
  287.     ADD    r6,r1,#2        ; r6    real disc name
  288.     MOV    r1,r2
  289.     BL    FindChar
  290.     ADD    r7,r1,#2        ; r7    found disc name
  291. compareLoop
  292.     LDRB    r0,[r6],#1
  293.     CMP    r0,#32
  294.     BLE    foundDrive
  295.     LDRB    r1,[r7],#1
  296.     TEQ    r0,r1
  297.     BEQ    compareLoop
  298.     
  299.     SUBS    r8,r8,#1
  300.     BPL    loopCD
  301.  
  302.     ADR    r0,badDriveError
  303.     SETV
  304.     B    exitCD
  305. badDriveError
  306.     &    &006005
  307.     =    "Bad disc reference.",0
  308.     ALIGN
  309.  
  310. foundDrive
  311.     STRB    r8,DriveNumber
  312. exitCD
  313.     RoutineEnd
  314.  
  315. ;******************************************************************************
  316. ;
  317. ;GetTempFS                                ; -----
  318. ;----------
  319. ; on entry:
  320. ; r0    pointer to string
  321. ; r1    # of parameters in command line
  322. ;
  323. ; on exit:
  324. ; r0    points to part past FS specifier if found, or preserved if not
  325. ; r1    decremented by 1 if FS specifier found
  326. ; Path    contains FS and drive in the form "YourFS::Disc.<anything>"
  327. ;
  328. ; • sets the temporary FS
  329.  
  330.     Routine    GetTempFS,r0-r5
  331.     BLVC    GetPath
  332.     STMVCIA    sp,{r0-r1}
  333.     BLVC    CalcDrive
  334.     BVS    getTempExit
  335.     CMN    r2,#1
  336.     ADREQ    r0,tempFsUnsetError
  337.     SETV EQ
  338.  
  339.     [    debug
  340.     BVS    getTempExit
  341.     SWI    XOS_NewLine
  342.     SWI    XOS_WriteS
  343.     =    "Path found: ",0
  344.     ALIGN
  345.     ADR    r0,Path
  346.     SWI    XOS_Write0
  347.     SWI    XOS_NewLine
  348.     ]
  349. getTempExit
  350.     RoutineEnd
  351.     
  352. ;******************************************************************************
  353. ;
  354. ;ReadTempFS
  355. ;----------
  356. ;
  357. ; on entry:
  358. ;
  359. ; on exit:
  360. ; V,r0  set if not found
  361. ;
  362. ; • gets the 'filing system private word' from the temporary set FS
  363. ;   for direct calls to FileCore; no messy self-modifying code
  364.  
  365.     Routine    ReadTempFS,r0-r4
  366.     MOVS    r0,#OS_FSControl_ReadTempFSLocation
  367.     SWI    XOS_FSControl
  368.     BVS    exitRTFS
  369.     TEQ    r1,#0
  370.     ADREQ    r0,tempFsUnsetError
  371.     SETV EQ
  372. exitRTFS
  373.     MVNVS    r2,#0
  374.     STR    r2,FSPrivateWord
  375.     RoutineEnd
  376.  
  377. tempFsUnsetError
  378.     &    &006000
  379.     =    "Unknown filing system.",0
  380.     ALIGN
  381.  
  382. ;******************************************************************************
  383. ;
  384. ;DiscardMapSpace
  385. ;---------------
  386. ;
  387. ; on entry:
  388. ;
  389. ; on exit:
  390. ;
  391. ; can be called even when no map is in memory
  392.  
  393.     Routine    DiscardMapSpace,r0-r2
  394.     LDR    r2,MapClaimedSpace
  395.     TEQ    r2,#0
  396.     BEQ    mapDiscarded
  397.     [    debug2
  398.     SWI    XOS_WriteS
  399.     =    "Discarding loaded map...",10,13,0
  400.     ALIGN
  401.     ]
  402.     MOVVC    r0,#OS_Module_Free
  403.     SWIVC    XOS_Module
  404.     MOVVC    r0,#0
  405.     STRVC    r0,MapLocation
  406.     STRVC    r0,MapClaimedSpace
  407. mapDiscarded
  408.     RoutineEnd
  409.         
  410. ;******************************************************************************
  411. ;
  412. ;ClaimMapSpace
  413. ;-------------
  414. ;
  415. ; on entry:
  416. ; MapSize,SectorSize set
  417. ;
  418. ; on exit:
  419. ;
  420. ; • can be called even when a map is already in memory
  421.  
  422.     Routine    ClaimMapSpace,r0-r3
  423.     LDR    r2,MapClaimedSpace            ;    first get rid of old map
  424.     TEQ    r2,#0
  425.     BLNE    DiscardMapSpace
  426.     BVS    exitClMSp
  427.  
  428.     MOV    r0,#OS_Module_Claim
  429.     LDR    r1,SectorSize
  430.      MOV r1,#4096        ;!!!!!!!!!!!!!!!!!!    ;    'nicer' start mem address
  431.     SUB    r1,r1,#1                ; r4    sectorsize-1 (i.e., 511 etc)
  432.     LDR    r3,MapSize
  433.     CMP    r3,#2048                ;    the map space also acts as an
  434.     MOVLT    r3,#2048                ;    temporary dir buffer
  435.     ADD    r3,r1,r3
  436.     SWI    XOS_Module
  437.     MOVVS    r2,#0
  438.     STR    r2,MapClaimedSpace
  439.     BVS    exitClMSp
  440.     ADD    r2,r2,r1
  441.     BIC    r2,r2,r1                ; r2 := (r2+r4) AND (NOT r4)
  442.     STR    r2,MapLocation
  443.  
  444. exitClMSp
  445.     RoutineEnd
  446.  
  447. ;;******************************************************************************
  448. ;;
  449. ;CleanTable
  450. ;;---------
  451. ;    STMFD    sp!,{r0-r1,lr}
  452. ;    Routine    "CleanTable"
  453. ;    MOV    r0,#0
  454. ;    LDR    r1,Table
  455. ;cleanLoop
  456. ;    LDR    lr,[r1],#12
  457. ;    CMN    lr,#1            ;    end of table ?
  458. ;    STRNE    r0,[r1],#4
  459. ;    BNE    cleanLoop
  460. ;exitCT
  461. ;    RoutineEnd
  462. ;
  463. ;******************************************************************************
  464. ;
  465. ;LoadDiscMap                                ; -----
  466. ;-----------
  467. ;
  468. ; on entry:
  469. ;
  470. ; on exit:
  471. ;
  472. ; • reads the disc map
  473. ; • expects MapSize, MapLocation, MapDAd to be set correctly
  474.  
  475.     Routine    LoadDiscMap,r0-r4
  476.  
  477.     BL    ClaimMapSpace
  478.  
  479.     MOV    r1,#FileCore_DiscOp_Read
  480.     LDR    r2,MapDAd
  481.     LDR    r3,MapLocation
  482.     LDR    r4,MapSize
  483.     BLVC    XFS_DiscOp
  484.  
  485.     [    debug2
  486.     Exit VS
  487.     MOV    r4,r2
  488.     ADR    r1,Buffer
  489.     MOV    r2,#BufferSize
  490.     Write    "Map loaded at &"
  491.     LDR    r0,MapLocation
  492.     SWIVC    XOS_ConvertHex8
  493.     Exit VS
  494.     WriteB    """, "",27,4,32"
  495.     LDRVC    r0,MapSize
  496.     SWIVC    XOS_ConvertFileSize
  497.     ADRVC    r0,Buffer
  498.     LDRVC    r1,Dictionary
  499.     SWIVC    XOS_PrettyPrint
  500.     SWIVC    XOS_NewLine
  501.     ]
  502.     RoutineEnd
  503.  
  504. ;******************************************************************************
  505. ;
  506. ;SaveDiscMap
  507. ;-----------
  508. ; on entry:
  509. ; on exit:
  510. ;
  511. ; • reads the disc map
  512. ; • expects MapSize, MapLocation, MapDAd to be set correctly
  513.  
  514.     Routine    SaveDiscMap,r0-r2
  515.     BL    DismountDisc
  516.  
  517.     MOV    r1,#FileCore_DiscOp_Write
  518.     LDR    r2,MapDAd
  519.     LDR    r3,MapLocation
  520.     LDR    r4,MapSize
  521.     BLVC    XFS_DiscOp
  522.  
  523.     MOV    r1,#FileCore_DiscOp_Write
  524.     LDR    r2,MapDAd
  525.     LDR    r3,MapLocation
  526.     LDR    r4,MapSize
  527.     ADD    r2,r2,r4
  528.     BLVC    XFS_DiscOp
  529.  
  530.     RoutineEnd
  531. ;******************************************************************************
  532. ;
  533. ;DismountDisc
  534. ;------------
  535. ; on entry:
  536. ; [Path]
  537. ; on exit:
  538. ;
  539.  
  540.     Routine    "DismountDisc",r0-r3
  541.     ADR    r1,Buffer
  542.     MOV    r2,#BufferSize
  543.     ADR    r3,Path
  544. copyFS
  545.     LDRB    r0,[r3],#1
  546.     SUB    r2,r2,#1
  547.     STRB    r0,[r1],#1
  548.     TEQ    r0,#':'
  549.     BNE    copyFS
  550.     Write    "Dismount "
  551. copyDrive
  552.     LDRB    r0,[r3],#1
  553.     SUB    r2,r2,#1
  554.     CMP    r0,#32
  555.     TEQGT    r0,#'.'
  556.     MOVLE    r0,#0
  557.     STRB    r0,[r1],#1
  558.     BGT    copyDrive
  559.  
  560.     [    debug
  561.     SWIVC    XOS_WriteI+"'"
  562.     ADRVC    r0,Buffer
  563.     SWIVC    XOS_Write0
  564.     SWIVC    XOS_WriteI+"'"
  565.     ]
  566.     ADR    r0,Buffer
  567.     SWI    XOS_CLI
  568.     RoutineEnd
  569.  
  570. ;******************************************************************************
  571. ;
  572. ;InterpretDiscDesc                            ; -----
  573. ;-----------------
  574. ;
  575. ; on entry:
  576. ;
  577. ; on exit:
  578. ;
  579. ; • extracts ZoneSize etc from disc record
  580.  
  581.     Routine    InterpretDiscDesc,r0-r11
  582.     MOV    r11,#1
  583.     LDRB    r3,LogSectorSize
  584.     MOV    r0,r11,ASL r3
  585.     STR    r0,SectorSize
  586.  
  587.     LDR    r1,UnusedBits16
  588.     BIC    r1,r1,#&FF000000
  589.     BIC    r1,r1,#&00FF0000
  590.     STR    r1,UnusedBits
  591.     RSB    r6,r1,r0,ASL #3                         ;    ZoneSize%=(SectorSize%*8-UnusedBits%)...
  592.     LDRB    r2,LogBitSize
  593.     MOV    r7,r6,ASL r2                            ;           ...*BitSize%
  594.     STR    r6,ZoneSize
  595.     
  596.     SUB    r4,r6,#60*8                             ;    Zone0Size%=(SectorSize%*8-UnusedBits%)-60*8...
  597.     MOV    r8,r4,ASL r2                            ;           ...*BitSize%
  598.     STR    r4,Zone0Size
  599.  
  600.     LDRB    r5,Zones
  601.     MOVS    r4,r5,ASR #1                            ;    map start at zone=#zones div 2
  602.     SUBNE    r4,r4,#1                                ;    allow for zone 0
  603.     MLANE    r4,r7,r4,r8
  604.     LDRB    r9,DriveNumber                ;    ORR drive number
  605.     ORR    r4,r4,r9,ASL #29
  606.     STR    r4,MapDAd
  607.  
  608.     MOV    r4,r5,ASL r3
  609.     STR    r4,MapSize
  610.  
  611.     LDRB    r4,IDFieldLength
  612.     MOV    r7,#1
  613.     MOV    r7,r7,ASL r4
  614.     SUB    r7,r7,#1
  615.     STR    r7,IDFieldMask
  616.     ADD    r4,r4,#1
  617.     uDivMod r8,r6,r4,r7
  618.     STR    r8,IDsPerZone
  619.  
  620.     MOV    r4,r11,ASL r2
  621.     STR    r4,BitSize
  622.  
  623.     CMP    r0,r4
  624.     STRGT    r0,Granularity
  625.     STRLE    r4,Granularity
  626.  
  627.         LDR    r0,DiscSize
  628.         LDRB    r1,LogBitSize
  629.         MOV    r0,r0,ASR r1
  630.         ADD    r0,r0,#512-32            ;    disc record
  631.         LDRB    r1,Zones
  632.         ADD    r0,r0,r1,ASL #5            ;    32 bits per zone
  633.         STR    r0,MapEnd
  634.         
  635.     ADR    r0,DiscName            ;    zero-termonate disc name
  636. DNloop
  637.     LDRB    r3,[r0],#1
  638.     CMP    r3,#32
  639.     BGT    DNloop
  640.     MOV    r3,#0
  641.     STRB    r3,[r0,#-1]
  642.     STRB    r3,DiscName+10
  643.  
  644.     RoutineEnd
  645.  
  646. ;******************************************************************************
  647. ;
  648. StartZone                                ; -----
  649. ;--------
  650. ; on entry:
  651. ;
  652. ; r0    filenumber
  653. ; on exit:
  654. ; r0    first zone
  655. ; Z    set if start zone = 0
  656. ; • can't coppe with ID #2
  657.  
  658.     STMFD    sp!,{r1,r10,lr}
  659.     LDR    r1,IDsPerZone
  660.     uDivMod    r10,r0,r1,r14            ;    zone = file number DIV IDs per zone
  661.     MOVS    r0,r10
  662.     LDMFD    sp!,{r1,r10,pc}
  663.  
  664.  
  665.     END
  666.