qdosmsq:traps:trap_3:load

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

qdosmsq:traps:trap_3:load [2009/02/21 17:38] (current)
george.gwilt created
Line 1: Line 1:
 +====== FS_LOAD/​IOF_LOAD ======
 +
 +This trap loads a file into memory.
 +
 +^Call Parameters^^Return Parameters^^
 +|D0.B|$48|D0.L|Error code.|
 +|D1.L| |D1.L|Corrupted.|
 +|D2.L|Length of file. |D2.L|Preserved.|
 +|D3.W|Timeout.|D3.L|Preserved.|
 +|A0.L|Channel ID. |A0.L|Preserved.|
 +|A1.L|Address for load.|A1.L|1 past the location of the last byte.|
 +
 +===== Errors =====
 +
 +|ERR_NO|Channel not open.|
 +
 +
 +
 +===== Notes =====
 +  * All registers not shown above are not used on entry and are preserved on exit.
 +  * The space to which the file is loaded would normally have been allocated by Trap #1 MT_ALCHP/​SMS_ACHP.
 +  * D3.W should always be set to -1 for a successful load.
 +  * The loading is done by "​random access"​ not serially as with IO_FSTRG/​IOB_FMUL. Perhaps for this reason it appears that if D2.L is set to a number not equal to the file length the whole file is nevertheless loaded.
 +
 +===== Example =====
 +The example shows how to load a file called WIN1_FILE. There are two error exits, error and error1. The first does not have to tidy the stack; the second does.
 +<​code>​
 +fl      dc.w    fl_e-2 ​         ; Length of filename
 +        dc.b    "​win1_file" ​    ; Name
 +fl_e    ds.b    0               ; Label at end of name
 +        ds.w    0               ; Set to even byte
 +
 +load_f ​ moveq   #​0,​d3 ​          ; OPEN
 +        lea     ​fl,​a0 ​          ; Filename to A0
 +        moveq   #​-1,​d1 ​         ; This job
 +        moveq   #​IO_OPEN,​d0
 +        trap    #2              ; Open the file
 +        tst.l   ​d0 ​             ; OK? . .
 +        bne     error ----> ​    ; . . no!
 +        movea.l a0,a5           ; Keep the ID in A5
 +; A0 now has the file ID.
 +; We now look at the header to get the length of the file.
 +        lea     ​-64(a7),​a7 ​     ; Space for the header.
 +        moveq   #​64,​d2 ​         ; Length of space for header.
 +        movea.l a7,a1           ; Address for header.
 +        moveq   #​-1,​d3 ​         ; Timeout.
 +        moveq   #​FS_HEADR,​d0
 +        trap    #3              ; Read the header.
 +        tst.l   ​d0 ​             ; OK? . .
 +        bne     ​error1 ----> ​   ; . . no!
 +; The header is now on the stack.
 +        move.l ​ (a7),​d1 ​        ; File's length.
 +        moveq   #​-1,​d2 ​         ; This job
 +        moveq   #​MT_ALCHP,​d0
 +        trap    #1              ; Get the space.
 +        tst.l   ​d0 ​             ; OK? . .
 +        bne     ​error1 ----> ​   ; . . no!
 +; Now A0 points to the allocated space and A5 to the file's ID
 +; We will now load the file.
 +        move.l ​ (a7),​d2 ​        ; File's length
 +        lea     ​64(a7),​a7 ​      ; Tidy the stack
 +        moveq   #​-1,​d3 ​         ; Timeout.
 +        movea.l a0,a1           ; Address for loading.
 +        movea.l a5,a0           ; Replace the ID
 +        moveq   #​FS_LOAD,​d0
 +        trap    #3              ; Load the file.
 +        tst.l   ​d0 ​             ; OK? . .
 +        bne     error ----> ​    ; . . no!
 +        moveq   #​IO_CLOSE,​d0
 +        tst.l   ​d0 ​             ; OK? . .
 +        bne     error ----> ​    ; . . no!
 +
 +; There should be no error here, but it it JUST possible that
 +; someone else has closed the file before our attempt to do so!
 +; The file is now loaded. ​                 ​
 +
 +</​code>​
 +
  
  • qdosmsq/traps/trap_3/load.txt
  • Last modified: 2009/02/21 17:38
  • by george.gwilt