home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / filemanager / imageprot_1 / Extras / Source093 / bin,FFF
Text File  |  1995-01-27  |  7KB  |  254 lines

  1. \ >Source94
  2. \
  3. \ SAsm source file for ImageProtect
  4.  
  5.  
  6. \ history:
  7.  
  8. \ 1.00 • first working version (at last!)
  9. \        (Source094)
  10.  
  11. \ 1.01 • now I can’t get rid of my archives!
  12. \        --> added check on CMOS to see if ‘force’ flag is set; if so, allow deletion
  13.  
  14.  
  15.  
  16. #vers$                ="1.01"        \ version number
  17.  
  18. \ Service calls
  19.  
  20. #Service_Reset            =&27
  21.  
  22. \ Software vectors
  23.  
  24. #FileV                =&08        \ OS_File vector
  25.  
  26.  
  27.  
  28.         \ *************
  29.         \ MODULE HEADER
  30.         \ *************
  31.  
  32.         dd 0                \ start code
  33.         dd init                \ initialise
  34.         dd final            \ finalise
  35.         dd service            \ service calls
  36.         dd title            \ module title string
  37.         dd help                \ module help string
  38.         dd 0                \ command/keyword table
  39.         dd 0                \ SWI chunk base
  40.         dd 0                \ SWI handler code
  41.         dd 0                \ SWI decoding table
  42.         dd 0                \ SWI decoding code
  43.  
  44.  
  45.  
  46.         \ ******************
  47.         \ TITLE/HELP STRINGS (PRM 1-212)
  48.         \ ******************
  49.         \
  50.         \ NB. Longest ROM module title is 21 chars
  51.         \     Longest ROM module name is 15 chars
  52.  
  53. .title        db "ImageProtect",0
  54.  
  55. .help        db "Image Protector",9,""+vers$+module$,0
  56.         @align
  57.  
  58.  
  59.  
  60.         \ **********
  61.         \ INITIALISE (SVC mode) (PRM 1-207)
  62.         \ **********
  63.         \
  64.         \ Entry: R10 ................. environment string (command tail) pointer
  65.         \        R11 ................. I/O base / instantiation number
  66.         \        R12 ................. private word pointer
  67.         \        R13 ................. supervisor stack pointer
  68.         \        R14 ................. return address
  69.         \
  70.         \ Exit:
  71.         \        R0 .................. error pointer (else corrupted)
  72.         \        R1-R6,R12,R14,flags . corrupted
  73.         \        R7-R11,R13 .......... preserved
  74.  
  75. .init        stmfd (sp)!,{lr}        \ save r14_svc
  76.         mov r0,#FileV
  77.         adr r1,filev_handler
  78.         mov r2,#0
  79.         swi "XOS_Claim"            \ PRM 1-66
  80.         ldmfd (sp)!,{pc}
  81.  
  82.  
  83.  
  84.         \ ********
  85.         \ FINALISE (SVC mode) (PRM 1-209)
  86.         \ ********
  87.         \
  88.         \ Entry: R10 ........ fatality (0=non-fatal, 1=fatal)
  89.         \        R11 ........ instantiation number
  90.         \        R12 ........ private word pointer
  91.         \        R13 ........ supervisor stack pointer
  92.         \        R14 ........ return address
  93.         \
  94.         \ Exit:  R0 .................. error pointer (else corrupted)
  95.         \        R1-R6,R12,R14,flags . corrupted
  96.         \        R7-R11,R13 .......... preserved
  97.  
  98. .final        stmfd (sp)!,{lr}        \ save r14_svc
  99.         mov r0,#FileV
  100.         adr r1,filev_handler
  101.         mov r2,#0
  102.         swi "XOS_Release"        \ PRM 1-68
  103.         ldmfd (sp)!,{pc}
  104.  
  105.  
  106.  
  107.         \ ********************
  108.         \ SERVICE CALL HANDLER (SVC/IRQ mode) (PRM 1-210; see 1-251)
  109.         \ ********************
  110.         \
  111.         \ Entry: R1 ................... service number
  112.         \        R12 .................. private word pointer
  113.         \        R13 .................. supervisor stack pointer
  114.         \        R14 .................. return address
  115.         \
  116.         \ Exit:   >> If claimed <<
  117.         \        R1 ................... 0
  118.         \        R0,R2-R8 ............. results (else preserved)
  119.         \        R9-R11,R13,R14,flags . preserved
  120.         \        R12 .................. corrupted
  121.         \         >> Otherwise <<
  122.         \        R0-R11,R13,R14,flags . preserved
  123.         \        R12 .................. corrupted
  124.  
  125. .service    teq r1,#Service_Reset
  126.         movnes pc,lr            \ reject unrecognised calls asap
  127.  
  128.         \ relink to vectors after reset (see PRM 1-80)
  129.  
  130.         stmfd (sp)!,{r0-r2,lr}
  131.         mov r0,#FileV
  132.         adr r1,filev_handler
  133.         mov r2,#0
  134.         swi "XOS_Claim"            \ PRM 1-66
  135.         ldmfd (sp)!,{r0-r2,pc}
  136.  
  137.  
  138.  
  139.         \ ***************
  140.         \ VECTOR HANDLERS (SVC mode) (PRM 1-77)
  141.         \ ***************
  142.  
  143.         \ FileV - OS_File 6 (PRM 2-37)
  144.  
  145. .filev_handler    teq r0,#6            \ is it delete?
  146.         movnes pc,lr            \ if not, return to next claimant
  147.  
  148.         bic lr,lr,#v            \ clear v flag (see PRM 1-32)
  149.         stmfd (sp)!,{r1-r6,lr}        \ save registers on stack
  150.  
  151.         mov r12,r1            \ save r1 in r12
  152.         mov r0,#161            \ read cmos ram
  153.         mov r1,#198            \ location 198
  154.         swi "XOS_Byte"            \ PRM 1-363
  155.         tst r2,#b4
  156.         movne r0,#6            \ if force=1 (on) then restore registers
  157.         ldmnefd (sp)!,{r1-r6,pc}^    \  (incl. r0) and return to next claimant
  158.         mov r1,r12            \ else, restore r1 and continue
  159.  
  160.         \ to allow the returning of errors, r0 IS NOT saved on the stack; this
  161.         \ may safely be reset manually since it always contains the number 6
  162.  
  163.         mov r0,#23            \ read catalogue info
  164.         swi "XOS_File"            \ PRM 2-43
  165.         ldmvsfd (sp)!,{r1-r6,lr,pc}    \ if error, return to caller
  166.  
  167.         teq r6,#&1000            \ is it a directory?
  168.         teqne r6,#&2000            \ else, is it an app. directory?
  169.         teqeq r0,#3            \ if it's either, is it an image file?
  170.         movne r0,#6            \ if not, restore registers (including
  171.         ldmnefd (sp)!,{r1-r6,pc}^    \  r0) and return to next claimant
  172.  
  173.         \ find out if there are any files inside image file
  174.  
  175.         \   • find length of image filename
  176.  
  177.         mov r2,#0            \ init counter
  178. .00        ldrb r0,[r1,r2]            \ get char
  179.         cmp r0,#32
  180.         addge r2,r2,#1            \ if not control character, increment
  181.         bge 00                \  counter and loop
  182.  
  183.         \   • claim temporary workspace for image path
  184.  
  185.         mov r0,#6            \ claim heap block
  186.         add r3,r2,#4            \ length is string_length+4
  187.         swi "XOS_Module"        \ PRM 1-233 (r1 preserved)
  188.         ldmvsfd (sp)!,{r1-r6,lr,pc}    \ if error, return to caller
  189.         mov r6,r2            \ save workspace address in r6
  190.  
  191.         \   • copy image filename into workspace
  192.  
  193.         mov r2,#0            \ init counter
  194. .00        ldrb r0,[r1,r2]            \ get char
  195.         cmp r0,#32
  196.         strgeb r0,[r6,r2]        \ if not control char, put char
  197.         addge r2,r2,#1            \  increment counter
  198.         bge 00                \  and loop
  199.  
  200.         \   • write ‘.*’ suffix and null terminator to string
  201.  
  202.         add r2,r6,r2
  203.         mov r0,#ASC"."
  204.         strb r0,[r2]
  205.         mov r0,#ASC"*"
  206.         strb r0,[r2,#1]
  207.         mov r0,#0
  208.         strb r0,[r2,#2]
  209.  
  210.         \   • read catalogue information for <image_pathname>.*
  211.  
  212.         mov r0,#17            \ no path
  213.         mov r1,r6            \ wildcarded path in workspace
  214.         swi "XOS_File"            \ PRM 2-35 (r6 preserved)
  215.         bvs unreadable
  216.         mov r1,r0            \ save r0 (object type) in r1
  217.  
  218.         \   • give back my workspace whether or not there's an error
  219.  
  220.         mov r0,#7            \ free workspace
  221.         mov r2,r6            \ workspace ptr
  222.         swi "XOS_Module"        \ PRM 1-234 (r1 preserved)
  223.         ldmvsfd (sp)!,{r1-r6,lr,pc}    \ if error, return to caller
  224.  
  225.         \ now what do I do..?
  226.  
  227.         teq r1,#0            \ was anything found?
  228.         moveq r0,#6            \ if not, restore registers (including
  229.         ldmeqfd (sp)!,{r1-r6,pc}^    \  r0) and return to next claimant
  230.  
  231.         \ if file is an image file which contains further files... complain!
  232.  
  233.         ldmfd (sp)!,{r1-r6,r12,lr}    \ load registers from stack (where r12 is
  234.                         \  my lr, and lr is pc of caller)
  235.         orr lr,lr,#v            \ set v flag
  236.         adr r0,nodel            \ setup error pointer
  237.         movs pc,lr            \ return to caller with my error
  238.  
  239.         \ if error occurred when trying to read <image_pathname>.*
  240.  
  241. .unreadable    mov r1,r0            \ save error pointer in r1
  242.         mov r0,#7            \ free workspace
  243.         mov r2,r6            \ workspace ptr
  244.         swi "XOS_Module"        \ PRM 1-234 (r1 preserved)
  245.         mov r0,r1            \ restore error pointer
  246.         ldmfd (sp)!,{r1-r6,r12,lr}
  247.         orr lr,lr,#v
  248.         movs pc,lr
  249.  
  250. .nodel        dd 1
  251.         db "Image not empty",0
  252.  
  253. #end
  254.