home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-01-27 | 30.4 KB | 1,003 lines |
- *****************************************************************************
- * *
- * PROGRAM: Image2Disk *
- * VERSION: 1.0 *
- * SOURCE CODE: 7 *
- * DATE: 13.01. - 20.01.1998 *
- * LANGUAGE: Assembler (DevPac V3.14) *
- * SYSTEM: A1200 KS 40.68 WB 40.42 2MB chip 8MB fast 68030/50mhz *
- * *
- * AUTHOR: Joerg Riemer 14167 Berlin/SchottmuellerStr.107/Germany *
- * EMAIL: mission@cs.tu-berlin.de *
- * *
- * COMMENT: there are two assembler conditions. *
- * *
- * 1.) BSS_Section: To get a shorter File, don't assemble *
- * with BSS-section. Use StripHunk instead to generate *
- * a Code_BSS-segment. it spares some bytes! but for *
- * anybody don't know what this means: "leave it as it is" *
- * *
- * StripHunk is available at AmiNet util/misc/... *
- * *
- * 2.) Verify_On: image2disk has an option to verify *
- * written tracks when using [image --> disk]. if *
- * this condition is set, track-verifying will be *
- * executed by default. otherwise the flag must be *
- * set by user. *
- * *
- * for suggestions, hints/tips, and/or questions *
- * send me an email to: mission@cs.tu-berlin.de *
- * *
- *****************************************************************************
-
- BSS_Section set 1
- Verify_On set 0
-
- *****************************************************************************
-
- output ram:Image2Disk
-
- ************************************************ exec definitions ***********
-
- _LVOWaitPort equ -384
- _LVOGetMsg equ -372
- _LVOForbid equ -132
- _LVOReplyMsg equ -378
- _LVOOpenLibrary equ -552
- _LVOCloseLibrary equ -414
- _LVOOpenDevice equ -444
- _LVOCloseDevice equ -450
- _LVODoIO equ -456
- _LVOCreateIORequest equ -654
- _LVODeleteIORequest equ -660
- _LVOCreateMsgPort equ -666
- _LVODeleteMsgPort equ -672
-
- pr_CLI equ $0AC
- pr_MsgPort equ $05C
-
- IOSTD_SIZE equ $030
-
- ************************************************ dos definitions ************
-
- _LVOOpen equ -030
- _LVOClose equ -036
- _LVORead equ -042
- _LVOWrite equ -048
- _LVOSeek equ -066
- _LVODeleteFile equ -072
- _LVOLock equ -084
- _LVOUnLock equ -090
- _LVOCurrentDir equ -126
- _LVOLockDosList equ -654
- _LVOUnLockDosList equ -660
- _LVOFindDosEntry equ -684
- _LVOInhibit equ -726
-
- OFFSET_END equ 001
- OFFSET_BEGINNING equ -001
- ACCESS_READ equ -002
-
- LDF_READ equ $001
- LDF_DEVICES equ $004
-
- MODE_NEWFILE equ $3EE
- MODE_OLDFILE equ $3ED
-
- ************************************************ reqtools definitions *******
-
- _LVOrtAllocRequestA equ -030
- _LVOrtFreeRequest equ -036
- _LVOrtChangeReqAttrA equ -048
- _LVOrtFileRequestA equ -054
- _LVOrtEZRequestA equ -066
-
-
- EZREQF_NORETURNKEY equ $001
- EZREQF_CENTERTEXT equ $004
- FREQF_PATGAD equ $010
- FREQF_SAVE equ $002
-
- rtfi_Dir equ $010
-
- RT_TagBase equ $80000000
-
- RTEZ_ReqTitle equ RT_TagBase+20
- RTEZ_Flags equ RT_TagBase+22
-
- RTFI_Flags equ RT_TagBase+40
- RTFI_Dir equ RT_TagBase+50
- RTFI_MatchPat equ RT_TagBase+51
-
- ************************************************ bss datas ******************
-
- WBMsg rs.l 1 ;workbench message
- DOSBase rs.l 1 ;ptr. base of dos
- REQBase rs.l 1 ;ptr. base of reqtools
- RCode rs.l 1 ;buffer for returncode
- DLock rs.l 1 ;buffer (returned dir.-lock)
- FLock rs.l 1 ;buffer (opened file_lock)
- ToDo rs.l 1 ;ptr. (subroutine to do)
- TList rs.l 1 ;ptr. taglist
- ReqTitle rs.l 1 ;ptr. (title for filereq.)
- MessagePort rs.l 1 ;ptr. msgport for doio()
- IORequest rs.l 1 ;ptr. iorequest for doio()
-
- FReqBase rs.l 1 ;ptr. (base of filerequester)
- ArgArray1 rs.l 1 ;reqtools argarray
- ArgArray2 rs.l 0 ;ptr. to devicename
- Device rs.l 1 ;sometimes used for argarray
- FileName rs.b 108 :room for filename
-
- EFlag rs.b 1 ;error flag
- DriveNum rs.b 1 ;buffer (unit number)
- DriveChr rs.b 1 ;buffer for "D","F","H","V"
- RWSwitch rs.b 1 ;flag (read or write track)
-
- VFlag rs.b 1 ;verify-switch
- rs.b 1 ;unused (for longword align)
- rs.b 1 ;unused (for longword align)
- rs.b 1 ;unused (for longword align)
-
- TrackBuffer1 rs.b 512*11*2 ;for read/write tracks
- TrackBuffer2 rs.b 512*11*2 ;for verify written tracks
-
- BSS_Size rs.b 0 ;bss_size over all
-
- OneTrack set BSS_Size-TrackBuffer2 ;standard track_size
-
- ************************************************ workbench startup **********
-
- Start movem.l D1-D7/A0-A6,-(SP) ;save registers
-
- if BSS_Section ;check assembler condition
-
- movea.l Start-4(pc),A5 ;get bss_section
- addq.l #1,A5 ;skip pointer (next segment)
- adda.l A5,A5 ;convert bpcl_pointer
- adda.l A5,A5 ;to real_address
-
- elseif ;otherwise
-
- lea DataBase(pc),A5 ;set working area
-
- endc ;end condition
-
- *****************************************************************************
-
- movea.l 4.w,A6 ;set execbase
- movea.l $114(A6),A2 ;find own task
- tst.l pr_CLI(A2) ;we are from cli?
- bne.b FromCLI ;branch if so
-
- lea pr_MsgPort(A2),A0 ;set message port
- jsr _LVOWaitPort(A6) ;wait for
- lea pr_MsgPort(A2),A0 ;set message port
- jsr _LVOGetMsg(A6) ;get wb_message
- move.l D0,(A5) ;and save for later return
-
- *****************************************************************************
-
- FromCLI bsr.b OpenLibs
-
- *****************************************************************************
-
- tst.l (A5) ;launched from wb?
- beq.b ExitDOS ;branch if not
-
- movea.l 4.w,A6 ;set execbase
- jsr _LVOForbid(A6) ;use exec to (forbid) tasks
- movea.l (A5),A1 ;set wb_message
- jsr _LVOReplyMsg(A6) ;use EXEC to (replymsg)
-
- ExitDOS move.l RCode(A5),D0 ;set returncode
- movem.l (SP)+,D1-D7/A0-A6 ;restore registers
- rts ;go back (shell/wb)
-
- *****************************************************************************
-
- version dc.b "$VER: image2disk 1.0 (20.1.98) by joerg riemer jan'98",0
-
- ************************************************ open libraries *************
-
- OpenLibs moveq #20,D0 ;preset returncode
- move.l D0,RCode(A5) ;20 - library not found!
-
- moveq #37,D0 ;required library version
- lea DOSName(pc),A1 ;set library name
- jsr _LVOOpenLibrary(A6) ;use EXEC to (openlibrary)
- move.l D0,DOSBase(A5) ;save base
-
- beq.b CloseLibs ;branch if not open
-
- moveq #38,D0 ;required library version
- lea REQName(pc),A1 ;set library name
- jsr _LVOOpenLibrary(A6) ;use EXEC to (openlibrary)
- move.l D0,REQBase(A5) ;save base
-
- beq.b CloseLibs ;branch if not open
-
- *****************************************************************************
-
- bsr.b Main
-
- ************************************************ close libraries ************
-
- CloseLibs movea.l 4.w,A6 ;set EXEC to call a function
-
- move.l REQBase(A5),D1 ;get base_ptr
- beq.b CloseDOS ;branch when not open
- movea.l D1,A1 ;set base_ptr
- jsr _LVOCloseLibrary(A6) ;use EXEC to (closelibrary)
-
- CloseDOS move.l DOSBase(A5),D1 ;get base_ptr
- beq.b QuitClose ;branch when not open
- movea.l D1,A1 ;set base_ptr
- jsr _LVOCloseLibrary(A6) ;use EXEC to (closelibrary)
-
- QuitClose rts ;back to DOS
-
- *****************************************************************************
-
- DOSName dc.b "dos.library",0
- REQName dc.b "reqtools.library",0,0
-
- *****************************************************************************
-
- Main moveq #0,D0 ;preset returncode
- move.l D0,RCode(A5) ;00 - everything ok!
-
- bsr AllocReq ;allocate file_requester
- bsr InitReq ;change some attributes
- bsr.b SetDevChr ;set device_characters
-
- ************************************************
-
- if Verify_On ;check assembler condition
- bsr.b Verify ;verify -> default = vflag on
- elseif ;otherwise
- bsr.b Loop ;loop -> default = vflag off
- endc ;end condition
-
- ************************************************
-
- bsr FreeReq ;free file_requester
- rts ;go back
-
- ************************************************ edit main requester text ***
-
- SetDevChr moveq #3,D0 ;set loop_counter
- lea ChrTable(pc),A0 ;set character table
- lea Text22(pc),A1 ;set text to edit
- SetChr move.l D0,D1 ;prepare text_offset
- lsl #3,D1 ;prepare text_offset
- add D0,D1 ;prepare text_offset
- move.b 1(A0,D0.w),(A1,D1.w) ;edit requester text
- dbra D0,SetChr ;do it 4 times
- rts ;go back
-
- *****************************************************************************
-
- ChrTable dc.b 0,"DFHV",0 ;device_characters
-
- *****************************************************************************
-
- Verify eor.b #$1,VFlag(A5) ;change verify_flag
- lea Text13(pc),A0 ;get text
- eor.b #$A,$A(A0) ;change text also
-
- *********************** print main request *****
-
- Loop lea TList1(pc),A0 ;set taglist
- lea Text12(pc),A1 ;set requester_text
- lea Text13(pc),A2 ;set gadget_text
- bsr REQuest0 ;and request by reqtools
- tst.b D0 ;test for [quit] by user
- beq Quit ;branch if so
-
- subq #1,D0 ;check for verify
- beq.b Verify ;branch if so
-
- lea ReadFile(pc),A0 ;get read file / write disk
- lea TList3(pc),A1 ;get filerequester taglist
- lea Text03(pc),A2 ;get filerequester title
-
- subq.l #1,D0 ;want to write a disk?
- sne RWSwitch(A5) ;set switch (read or write)
- beq.b SetToDo ;branch if so
-
- lea WriteFile(pc),A0 ;get write file / read disk
- lea TList4(pc),A1 ;get filerequester taglist
- lea Text04(pc),A2 ;get filerequester title
-
- SetToDo move.l A0,ToDo(A5) ;save jump_in
- move.l A1,TList(A5) ;save taglist
- move.l A2,ReqTitle(A5) ;save title
-
- *********************** ask for device *********
-
- lea TList1(pc),A0 ;set taglist
- lea Text21(pc),A1 ;set requester_text
- lea Text22(pc),A2 ;set gadget_text
- bsr REQuest0 ;and request by reqtools
-
- move.b ChrTable(pc,D0),DriveChr(A5) ;get drive_character
- beq.b Loop ;branch if canceled
-
- lea Device1(pc),A0 ;get fmsdisk.device
-
- subq #1,D0 ;check for trackdisk
- bne.b GetDrive ;or fmsdisk.device
-
- lea Device0(pc),A0 ;get trackdisk.device
-
- GetDrive move.l A0,Device(A5) ;save devicename
-
- *********************** ask for unit ***********
-
- lea Text24(pc),A2 ;set gadget_text
-
- moveq #3,D0 ;set loop_counter
- SetChar move.l D0,D1 ;prepare offset
- lsl.l #2,D1 ;prepare offset
- move.b DriveChr(A5),(A2,D1.W) ;edit text
- dbra D0,SetChar ;do it 4 times
-
- lea TList1(pc),A0 ;set taglist
- lea Text23(pc),A1 ;set requester_text
- bsr REQuest0 ;ask user for drive_number
- subq.l #1,D0 ;prepare drive_number
- bmi Loop ;branch if canceled
-
- move.b D0,DriveNum(A5) ;save drive_number
-
- lea Text99(pc),A0 ;get text to prepare
- move.b DriveChr(A5),(A0) ;edit text
- addi.b #$30,D0 ;drive_number -> ASCII
- move.b D0,2(A0) ;edit text
-
- ************************************************
-
- st EFlag(A5) ;preset error_flag
-
- moveq #0,D0 ;preset returncode
- move.l D0,RCode(A5) ;00 - everything ok!
-
- ************************************************
-
- bsr.b CreateIOReq ;create msgport/iorequest
- bsr OpenDevice ;open required device
- bsr GetFileName ;get image_filename
- bsr GetCDir ;change currentdir
-
- movea.l ToDo(A5),A0 ;get subroutine
- jsr (A0) ;read disk / write disk
-
- bsr ResetCDir ;restore previous path
- ReqFail0 bsr CloseDevice ;close track./fmsdisk.device
- ReqFail1 bsr.b DeleteIOReq ;remove iorequest/msgport
-
- ************************************************
-
- ReqFail2 lea Text94(pc),A4 ;set insert = successful
-
- tst.b EFlag(A5) ;test error_flag
- beq.b .Ready ;branch if ok
-
- lea Text96(pc),A4 ;set insert = canceled
-
- tst.l RCode(A5) ;test returncode
- beq.b .Ready ;branch if ok
-
- lea Text95(pc),A4 ;set insert = failed
-
- .Ready move.l A4,ArgArray1(A5) ;save ptr.
- lea ArgArray1(A5),A4 ;set argarray
-
- lea TList0(pc),A0 ;set taglist
- lea Text41(pc),A1 ;set requester_text
- lea Text42(pc),A2 ;set gadget_text
- bsr REQuest0 ;ask user for [quit]
- tst.l D0 ;another image_transfer?
- bne Loop ;branch if so
-
- Quit rts ;else, go back (quit program)
-
- ************************************************ create msgeport/iorequest **
-
- CreateIOReq movea.l 4.w,A6 ;set EXEC to use a function
- jsr _LVOCreateMsgPort(A6) ;use EXEC to (createport)
- move.l D0,MessagePort(A5) ;save ptr.
- beq Error09 ;branch when failed
-
- moveq #IOSTD_SIZE,D0 ;iorequest size
- movea.l MessagePort(A5),A0 ;set msgport
- jsr _LVOCreateIORequest(A6) ;use EXEC to (createrequest)
- move.l D0,IORequest(A5) ;save ptr.
- beq Error10 ;branch when failed
- rts ;go back
-
- ************************************************ delete iorequest/msgport ***
-
- DeleteIOReq movea.l 4.w,A6 ;set EXEC to use a function
-
- movea.l IORequest(A5),A0 ;set iorequest
- jsr _LVODeleteIORequest(A6) ;use EXEC to (deleterequest)
-
- movea.l MessagePort(A5),A0 ;set msgport
- jsr _LVODeleteMsgPort(A6) ;use EXEC to (deletemsgport)
- rts ;go back
-
- ************************************************ finddosentry / opendevice **
-
- OpenDevice moveq #5,D1 ;flags (ldf_devices|ldf_read)
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOLockDosList(A6) ;use DOS to (lockdoslist)
-
- move.l D0,D1 ;set dlist
- lea Text99(pc),A2 ;get drivename
- move.b #0,3(A2) ;prepare drivename
- move.l A2,D2 ;set drivename
- moveq #LDF_DEVICES,D3 ;control flag (devices only)
- jsr _LVOFindDosEntry(A6) ;use DOS to (finddosentry)
-
- move.l D0,D2 ;save entry
- move.b #":",3(A2) ;reset drivename
-
- moveq #5,D1 ;flags (ldf_devices|ldf_read)
- jsr _LVOUnLockDosList(A6) ;use DOS to (unlockdoslist)
-
- tst.l D2 ;device_node found ?
- beq Error11 ;branch if not
-
- *********************** compare devicename *****
-
- move.l D2,A2 ;set node
- move.l $1C(A2),A2 ;get dn_startup
- add.l A2,A2 ;convert bcpl_ptr.
- add.l A2,A2 ;to real address
- move.l 4(A2),A0 ;get fssm_device
- add.l A0,A0 ;convert bcpl_ptr.
- add.l A0,A0 ;to real address
- move.b (A0)+,D0 ;set string_length
- ext.w D0 ;prepare loop_counter
- subq #1,D0 ;prepare loop_counter
- move.l Device(A5),A1 ;set expected device
- CheckDevice cmp.b (A0)+,(A1)+ ;compare device_name
- bne Error12 ;branch on error
- dbra D0,CheckDevice ;do for all characters
-
- *********************** check drivegeometry ****
-
- lea DriveGeometry(pc),A0 ;get drive geometry
- move.l 8(A2),A1 ;get fssm_environ
- add.l A1,A1 ;convert bcpl_ptr.
- add.l A1,A1 ;to real address
- move.l (A0)+,D0 ;get bytes per block
- cmp.l $04(A1),D0 ;check for
- bne Error13 ;branch if not equal
- move.l (A0)+,D0 ;get surfaces
- cmp.l $0C(A1),D0 ;check for
- bne Error13 ;branch if not equal
- move.l (A0)+,D0 ;get blocks per track
- cmp.l $14(A1),D0 ;check for
- bne Error13 ;branch if not equal
- move.l (A0)+,D0 ;get first track
- cmp.l $24(A1),D0 ;check for
- bne Error13 ;branch if not equal
- move.l (A0)+,D0 ;get last track
- cmp.l $28(A1),D0 ;check for
- bne Error13 ;branch if not equal
-
- *********************** open device ************
-
- moveq #0,D0 ;prepare register
- moveq #0,D1 ;set flags
- move.b DriveNum(A5),D0 ;set drive_number
- movea.l Device(A5),A0 ;set devicename
- movea.l IORequest(A5),A1 ;set iorequest
- movea.l 4.w,A6 ;set EXEC to call a function
- jsr _LVOOpenDevice(A6) ;use EXEC to (opendevice)
- tst.l D0 ;everything ok?
- bne Error05 ;branch if not
- rts ;go back
-
- *****************************************************************************
-
- DriveGeometry dc.l $00000080 ;longs per block
- dc.l $00000002 ;surfaces per disk
- dc.l $0000000B ;blocks per track
- dc.l $00000000 ;first cylinder
- dc.l $0000004F ;last cylinder
-
- ************************************************ close device / remove port *
-
- CloseDevice movea.l 4.w,A6 ;set EXEC to call a function
- movea.l IORequest(A5),A1 ;set iorequest
- jsr _LVOCloseDevice(A6) ;use EXEC to (closedevice)
- rts ;go back
-
- ************************************************ read disk / write image ****
-
- WriteFile lea FileName(A5),A1 ;get filename
- move.l A1,D1 ;set filename
- move.l #MODE_NEWFILE,D2 ;set options
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOOpen(A6) ;use DOS to (open) file
- move.l D0,FLock(A5) ;save lock
- beq Error06 ;branch when failed
-
- *********************** read tracks ************
-
- bsr Inhibit ;inhibit drive
- bsr REQInsert ;request (insert disk)
-
- move.l #OneTrack,D5 ;set track length
- moveq #00000000,D6 ;prepare track_offset
-
- moveq #79,D7 ;prepare loop_counter
-
- ReadTracks lea TrackBuffer1(A5),A2 ;get track_buffer
- movea.l IORequest(A5),A1 ;get io_request
- move.w #2,$1C(A1) ;set io_command (cmd_read)
- move.l D5,$24(A1) ;set io_length
- move.l A2,$28(A1) ;set buffer
- move.l D6,$2C(A1) ;set track_offset
-
- movea.l 4.w,A6 ;set EXEC to call a function
- jsr _LVODoIO(A6) ;use EXEC for (doio)
- tst.l D0 ;check for success
- bne Error07 ;branch if not
-
- move.l FLock(A5),D1 ;set file_lock
- move.l A2,D2 ;set buffer
- move.l D5,D3 ;set length to write
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOWrite(A6) ;use DOS to (write) bytes
- cmp.l D0,D3 ;something wrong?
- bne Error08 ;branch if so
-
- add.l D5,D6 ;add track
- dbra D7,ReadTracks ;and do the next one
-
- sf EFlag(A5) ;clear error_flag (ok)
-
- bra InitDrive ;close file / reset drive
-
- ************************************************ read image / write disk ****
-
- ReadFile lea FileName(A5),A1 ;get filename
- move.l A1,D1 ;set filename
- move.l #MODE_OLDFILE,D2 ;set options
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOOpen(A6) ;use DOS to (open) file
- move.l D0,FLock(A5) ;save lock
- beq Error00 ;branch if not found
-
- move.l FLock(A5),D1 ;set file_lock
- moveq #0,D2 ;set position
- moveq #OFFSET_END,D3 ;set mode
- jsr _LVOSeek(A6) ;use DOS to (seek) in file
-
- move.l FLock(A5),D1 ;set file_lock
- moveq #0,D2 ;set position
- moveq #OFFSET_BEGINNING,D3 ;set mode
- jsr _LVOSeek(A6) ;use DOS to (seek) in file
-
- cmpi.l #$DC000,D0 ;must be the file_length!!
- bne Error01 ;branch if not
-
- ************************ write tracks **********
-
- bsr Inhibit ;inhibit drive
- bsr REQInsert ;request (insert disk)
-
- move.l #OneTrack,D5 ;set track length
- moveq #00000000,D6 ;prepare track_offset
-
- moveq #79,D7 ;prepare loop_counter
-
- WriteTracks lea TrackBuffer1(A5),A2 ;get track_buffer
- move.l FLock(A5),D1 ;set file_lock
- move.l A2,D2 ;set buffer
- move.l D5,D3 ;set length to read
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVORead(A6) ;use DOS to (read) some bytes
- cmp.l D0,D3 ;something wrong?
- bne Error02 ;branch if so
-
- movea.l IORequest(A5),A1 ;get io_request
- move.w #$B,$1C(A1) ;set io_command (cmd_format)
- move.l D5,$24(A1) ;set io_length
- move.l A2,$28(A1) ;set buffer
- move.l D6,$2C(A1) ;set track_offset
-
- movea.l 4.w,A6 ;set EXEC to call a function
- jsr _LVODoIO(A6) ;use EXEC for (doio)
- tst.l D0 ;check for success
- bne Error03 ;branch if not
-
- ************************ verify track **********
-
- tst.b VFlag(A5) ;want to verify ?
- beq.b WriteNext ;branch if not
-
- lea TrackBuffer2(A5),A2 ;get track_buffer
- movea.l IORequest(A5),A1 ;get io_request
- move.w #2,$1C(A1) ;set io_command (cmd_read)
- move.l D5,$24(A1) ;set io_length
- move.l A2,$28(A1) ;set buffer
- move.l D6,$2C(A1) ;set track_offset
-
- movea.l 4.w,A6 ;set EXEC to call a function
- jsr _LVODoIO(A6) ;use EXEC for (doio)
- tst.l D0 ;check for success
- bne Error04 ;branch if not
-
- lea TrackBuffer1(A5),A0 ;get track_buffer
- lea TrackBuffer2(A5),A1 ;get track_buffer
- move.l #OneTrack/4-1,D0 ;set loop_counter
- VerifyTrack cmpm.l (A0)+,(A1)+ ;compare buffers
- bne Error04 ;branch if fails
- dbra D0,VerifyTrack ;do it sometimes
-
- ************************************************
-
- WriteNext add.l D5,D6 ;add track
- dbra D7,WriteTracks ;and do the next one
-
- sf EFlag(A5) ;clear error_flag (ok)
-
- ************************************************ init. drive / close file ***
-
- InitDrive lea Text99(pc),A1 ;get drive
- move.l A1,D1 ;set drive
- moveq #0,D2 ;set flag (uninhibit)
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOInhibit(A6) ;use DOS to (inhibit)
-
- ************************************************
-
- CloseFile move.l FLock(A5),D1 ;set file_lock
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOClose(A6) ;use DOS to (close) file
-
- ************************************************
-
- tst.b RWSwitch(A5) ;read file ?
- beq.b QuitTrans ;branch if so
- tst.b EFlag(A5) ;test for error
- beq.b QuitTrans ;branch if not
-
- lea FileName(A5),A1 ;get filename
- move.l A1,D1 ;set filename
- jsr _LVODeleteFile(A6) ;use DOS to (deletefile)
-
- ************************************************
-
- QuitTrans rts ;go back
-
- *****************************************************************************
-
- Inhibit lea Text99(pc),A1 ;get drive
- move.l A1,D1 ;set drive
- moveq #-1,D2 ;set flag (inhibit)
- movea.l DOSBase(A5),A6 ;set DOS to call a function
- jsr _LVOInhibit(A6) ;use DOS to (inhibit)
- tst.l D0 ;check for inhibit
- bne.b .Ready ;branch if so
-
- lea TList0(pc),A0 ;set taglist
- lea Text53(pc),A1 ;set requester_text
- lea Text54(pc),A2 ;set gadget_text
-
- lea Text99(pc),A3 ;get drivename
- lea Text31(pc),A4 ;get req_title #2
- move.l A4,ArgArray1(A5) ;save ptr.
- move.l A3,ArgArray2(A5) ;save ptr.
- lea ArgArray1(A5),A4 ;set argarray
-
- bsr REQuest0 ;and request by reqtools
- tst.l D0 ;check for [retry]
- bne.b Inhibit ;branch if so
-
- moveq #1,D0 ;set returncode
- move.l D0,RCode(A5) ;01 - drive in use
-
- addq #4,SP ;clear return_address
- pea CloseFile(pc) ;set new one
-
- .Ready rts ;go back / go loop
-
- ************************************************ request (insert disk) ******
-
- REQInsert lea TList0(pc),A0 ;set taglist
- lea Text51(pc),A1 ;set requester_text
- lea Text52(pc),A2 ;set gadget_text
-
- lea Text99(pc),A4 ;get string
- move.l A4,ArgArray1(A5) ;save ptr.
- lea ArgArray1(A5),A4 ;set argarray
-
- bsr REQuest0 ;and request by reqtools
- tst.l D0 ;check for [cancel]
- bne.b .Ready ;branch if so
-
- addq #4,SP ;clear return_address
- pea InitDrive(pc) ;set new one
-
- .Ready rts ;go back
-
- ************************************************ error report (createport) **
-
- Error10 movea.l MessagePort(A5),A0 ;set msgport
- jsr _LVODeleteMsgPort(A6) ;use EXEC to (deleteport)
-
- Error09 moveq #9,D0 ;set returncode - noport
- lea Text37(pc),A1 ;set requester_text
-
- addq #4,SP ;clear return_address
- pea ReqFail2(pc) ;set new one
- bra REQuest1 ;request error
-
- ************************************************ error report (writefile) ***
-
- Error06 moveq #4,D0 ;set returncode - open()
- lea Text34(pc),A1 ;set requester_text
- bra REQuest1 ;request error
-
- Error07 moveq #3,D0 ;set returncode - doio()
- lea Text36(pc),A1 ;set requester_text
- lea Text91(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra REQuest2 ;request error
-
- Error08 moveq #2,D0 ;set returncode - write()
- lea Text35(pc),A1 ;set requester_text
- lea Text92(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra REQuest2 ;request error
-
- ************************************************ error report (opendevice) **
-
- Error11 moveq #11,D0 ;set rcode - no dosentry
- lea Text61(pc),A1 ;set requester_text
- lea Text99(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra.b REQuest3 ;request error
-
- Error12 moveq #12,D0 ;set rcode - unexpected dev.
- lea Text62(pc),A1 ;set requester_text
- lea Text99(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra.b REQuest3 ;request error
-
- Error13 moveq #13,D0 ;set rcode - wrong geometry
- lea Text63(pc),A1 ;set requester_text
- lea Text99(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra.b REQuest3 ;request error
-
- Error05 moveq #10,D0 ;set rcode - opendevice()
- lea Text32(pc),A1 ;set requester_text
- * bra.b REQuest3 ;request error
-
- REQuest3 addq #4,SP ;clear return_address
- pea ReqFail1(pc) ;set new one
- bra.b REQuest1 ;request error
-
- ************************************************ error report (readfile) ****
-
- Error00 moveq #5,D0 ;set returncode - open()
- lea Text34(pc),A1 ;set requester_text
- bra.b REQuest1 ;request error
-
- Error01 moveq #6,D0 ;set returncode - seek()
- lea Text33(pc),A1 ;set requester_text
- pea CloseFile(pc) ;set return_address
- bra.b REQuest1 ;request error
-
- Error02 moveq #7,D0 ;set returncode - read()
- lea Text35(pc),A1 ;set requester_text
- lea Text91(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra.b REQuest2 ;request error
-
- Error03 moveq #8,D0 ;set returncode - doio()
- lea Text36(pc),A1 ;set requester_text
- lea Text92(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- bra.b REQuest2 ;request error
-
- Error04 moveq #8,D0 ;set returncode - doio()
- lea Text36(pc),A1 ;set requester_text
- lea Text93(pc),A3 ;set insert_text
- move.l A3,ArgArray2(A5) ;save ptr. (insert #2)
- * bra.b REQuest2 ;request error
-
- ************************************************ open error requester *******
-
- REQuest2 pea InitDrive(pc) ;set return_address
-
- REQuest1 move.l D0,RCode(A5) ;set returncode
- lea TList0(pc),A0 ;set taglist
- lea Text39(pc),A2 ;set gadget_text
-
- lea Text31(pc),A4 ;get req_title #2
- move.l A4,ArgArray1(A5) ;save ptr.
- lea ArgArray1(A5),A4 ;set argarray
-
- REQuest0 suba.l A3,A3 ;no reqinfo
- movea.l REQBase(A5),A6 ;set REQ to call a function
- jsr _LVOrtEZRequestA(A6) ;use REQ for (easyrequest)
- rts ;go back
-
- ************************************************ alloc file_requester *******
-
- AllocReq moveq #0,D0 ;want file_requester
- suba.l A0,A0 ;no tags yet
- movea.l REQBase(A5),A6 ;set REQ to call a function
- jsr _LVOrtAllocRequestA(A6) ;use REQ to (allocrequest)
- move.l D0,FReqBase(A5) ;save base
- bne.b .Ready ;branch if ok
-
- moveq #15,D0 ;set returncode
- move.l D0,RCode(A5) ;15 - no file_requester
-
- addq #4,SP ;clear return_address
-
- .Ready rts ;go back / quit program
-
- ************************************************ change request attributes **
-
- InitReq lea TList0(pc),A0 ;for pos. independent code
- lea Text11(pc),A1 ;for pos. independent code
- move.l A1,4(A0) ;for pos. independent code
-
- lea TList1(pc),A0 ;for pos. independent code
- move.l A1,4(A0) ;for pos. independent code
-
- lea TList2(pc),A0 ;for pos. independent code
- lea Text01(pc),A1 ;for pos. independent code
- move.l A1,4(A0) ;for pos. independent code
- lea Text02(pc),A1 ;for pos. independent code
- move.l A1,12(A0) ;for pos. independent code
-
- movea.l FReqBase(A5),A1 ;set file_requester
- movea.l REQBase(A5),A6 ;set REQ to call a function
- jsr _LVOrtChangeReqAttrA(A6) use REQ to (changereqattr)
- rts ;go back
-
- ************************************************ close file_requester *******
-
- FreeReq movea.l FReqBase(A5),A1 ;set file_requester
- movea.l REQBase(A5),A6 ;set REQ to call a function
- jsr _LVOrtFreeRequest(A6) ;use REQ to (freerequest)
- rts ;go back
-
- ************************************************ open file_requester ********
-
- GetFileName movea.l TList(A5),A0 ;set taglist
- movea.l FReqBase(A5),A1 ;set file_requester
- lea FileName(A5),A2 ;set buffer for filename
- movea.l ReqTitle(A5),A3 ;set requester_title
- movea.l REQBase(A5),A6 ;set REQ to call a function
- jsr _LVOrtFileRequestA(A6) ;use REQ for (filerequest)
- tst.l D0 ;check for user input
- bne.b .Ready ;branch if set
-
- addq #4,SP ;clear return_address
- pea ReqFail0(pc) ;set new one
-
- .Ready rts ;go back
-
- ************************************************ set and reset current dir **
-
- GetCDir movea.l FReqBase(A5),A1 ; get FREQBase
- move.l rtfi_Dir(A1),D1 ; set pathname
- moveq #ACCESS_READ,D2 ; set mode
- movea.l DOSBase(A5),A6 ; set DOS to use a function
- jsr _LVOLock(A6) ; use DOS to (lock) directory
- move.l D0,D1 ; set directory lock
- jsr _LVOCurrentDir(A6) ; use DOS to set (currentdir)
- move.l D0,DLock(A5) ; save prev. directory lock
- rts ; go back
-
- ************************************************
-
- ResetCDir move.l DLock(A5),D1 ; set prev. directory lock
- movea.l DOSBase(A5),A6 ; set DOS to use a function
- jsr _LVOCurrentDir(A6) ; use DOS to set (currentdir)
- move.l D0,D1 ; set returned lock
- jsr _LVOUnLock(A6) ; use DOS to (unlock) dir.
- rts ; go back
-
- *****************************************************************************
-
- TList0 dc.l RTEZ_ReqTitle,0,RTEZ_Flags,EZREQF_CENTERTEXT,0
- TList1 dc.l RTEZ_ReqTitle,0,RTEZ_Flags,EZREQF_CENTERTEXT!EZREQF_NORETURNKEY,0
- TList2 dc.l RTFI_Dir,0,RTFI_MatchPat,0,0
- TList3 dc.l RTFI_Flags,FREQF_PATGAD,0
- TList4 dc.l RTFI_Flags,FREQF_PATGAD!FREQF_SAVE,0
-
- *****************************************************************************
-
- Device0 dc.b "trackdisk.device",0
- Device1 dc.b "fmsdisk.device",0
-
- Text01 dc.b "RAM:",0
- Text02 dc.b "(#?.dim|#?.adf|#?)",0
- Text03 dc.b "Read Image from...",0
- Text04 dc.b "Save Image as...",0
-
- Text11 dc.b "Image2Disk V1.0",0
-
- Text12 dc.b "IMAGE-FILE --> DISK --> IMAGE-FILE",$A
- dc.b "----------------------------------------------",$A
- dc.b "for all standard diskdrives 880/KB",$A
- dc.b "controlled either by the trackdisk.- or fmsdisk.device",$A
- dc.b "--------------------------------------------------------",$A
- dc.b "written by Joerg Riemer jan'98",$A
- dc.b "email: mission@cs.tu-berlin.de",0
-
- Text13 dc.b " Verify [ ] |Image --> Disk|Disk --> Image| Quit ",0
-
- Text21 dc.b "Select Device",0
- Text22 dc.b "DFx Unit|DFx Unit|DFx Unit|DFx Unit| Cancel ",0
-
- Text23 dc.b "Select Unit",0
- Text24 dc.b "DF0|DF1|DF2|DF3|Cancel",0
-
- Text31 dc.b "ERROR!!!",0
-
- Text32 dc.b "%s",$A,"Can't open %s for suggested drive.",0
- Text33 dc.b "%s",$A,"Required length of Image-File is wrong.",0
- Text34 dc.b "%s",$A,"Can't open suggested Image-File.",0
- Text35 dc.b "%s",$A,"While %s Image-File.",0
- Text36 dc.b "%s",$A,"While %s track.",0
- Text37 dc.b "%s",$A,"Can't create MsgPort/IORequest!!",$A,"Please, try to free some memory.",0
-
- Text61 dc.b "%s",$A,"Can't find %s",$A,"(suggested drive not mounted)",0
- Text62 dc.b "%s",$A,"%s controlled by an unexpected device.",0
- Text63 dc.b "%s",$A,"Drive-Geometry used by %s not supported.",0
-
- Text39 dc.b " Cancel ",0
-
- Text41 dc.b "Image-File transfer %s",0
- Text42 dc.b " Get another one | Quit ",0
-
- Text51 dc.b "Insert disk in drive %s",$A
- dc.b "Click [Ok] or press <RETURN> to continue...",0
- Text52 dc.b " Ok | Cancel ",0
-
- Text53 dc.b "%s",$A,"Can't access %s",$A,"(suggested drive in use)",0
- Text54 dc.b " Retry | Cancel ",0
-
- Text91 dc.b "reading",0
- Text92 dc.b "writing",0
- Text93 dc.b "verifying",0
-
- Text94 dc.b "successful!!!",0
- Text95 dc.b "failed!!!",0
- Text96 dc.b "canceled by user!!!",0
-
- Text99 dc.b "DF0:",0
-
- *****************************************************************************
-
- if BSS_Section
-
- SECTION Image2Disk_bss,BSS
-
- elseif
-
- cnop 0,4
-
- endc
-
- *****************************************************************************
-
- DataBase ds.b BSS_Size
-
- end of source **************************************************************
-