home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
392.lha
/
ReDate_v1.1
/
ReDate.asm
< prev
next >
Wrap
Assembly Source File
|
1990-07-03
|
14KB
|
448 lines
; ReDate 1.1/ SetDate DIRs according to contents
; - Jim Butterfield. April 7/90.
; Exec library calls
_LVOAllocMem EQU -$C6
_LVOFreeMem EQU -$D2
_LVOFindTask EQU -$126
_LVOSetSignal EQU -$132
_LVOAllocSignal EQU -$14A
_LVOFreeSignal EQU -$150
_LVOPutMsg EQU -$16E
_LVOGetMsg EQU -$174
_LVOWaitPort EQU -$180
_LVOCloseLibrary EQU -$19E
_LVOOpenLibrary EQU -$228
; DOS library calls
_LVOOpen EQU -$1E
_LVOClose EQU -$24
_LVORead EQU -$2A
_LVOWrite EQU -$30
_LVOOutput EQU -$3C
_LVOLock EQU -$54
_LVOUnLock EQU -$5A
_LVOExamine EQU -$66
_LVOExNext EQU -$6C
_LVOCurrentDir EQU -$7E
_LVOIoErr EQU -$84
_LVODeviceProc EQU -$AE
;
ACCESS_READ equ -2
MODE_OLDFILE equ 1005
INFOSIZE equ 260
; sizeof (struct MsgPort+struct Message+struct DosPacket+108+4)
DATASIZE equ $24+$14+$30+112
; FileInfoBlock items
fib_FileName equ 8
fib_EntryType equ 120
fib_Date equ 132
; IO Error Type
NO_MORE_ENTRIES equ 232
;
;-- Initial setup:
; offsets from A5 (Globals)
FileErr equ -4
; Level not needed this version, but might be useful for expansion
Level equ -8
DevProc equ -12
dosBase equ -16
argv equ -20
OutHandle equ -24
DataBlk equ -28 ;Mport/Msg/dos packet/Name block
message equ -32
DosPkt equ -36
Nope equ -37 ;byte .. update didn't work
Yup equ -38 ;byte .. update worked
Mebbe equ -39 ;byte .. update tried
Abort equ -40 ;byte
go link a5,#-40 ; common work area
moveq #0,d1
move.l d1,Abort(a5) ; four bytes
move.b d1,-1(a0,d0) ; c style string
spdump move.b (a0)+,d0 ; skip init spaces
cmp.b #$20,d0
beq.s spdump
move.b -(a0),d7 ; grab first char
move.l a0,argv(a5)
;** Level=0;
move.l d1,Level(a5)
; set up dos, DevProc, output, here
moveq #1,d0
move.l d0,FileErr(a5)
moveq #20,d6 ; return FAIL
lea dosname(pc),a1 ; Name 'dos.library'.
moveq #33,d0 ; 1.2 or later
move.l $4,a6 ; Using Exec library
jsr _LVOOpenLibrary(a6) ; Open Dos library.
move.l d0,dosBase(a5) ; Remember DosBase ptr.
beq StartupQuit ; dos not opened
move.l d0,a6 ; set Dos library
jsr _LVOOutput(a6) ; get CLI outhandle,
move.l d0,OutHandle(a5) ; & then remember it.
tst.b d7 ; no file name?
beq Prompt
move.l argv(a5),d1 ; file name
jsr _LVODeviceProc(A6)
move.l d0,DevProc(a5) ; device handler
beq DosQuit
; MakePort(Az=0,D7=0)
move.l 4,a6 ; exec library
move.l #DATASIZE,d0
move.l #$10001,d1 ;public|clear
jsr _LVOAllocMem(a6)
move.l d0,a3
move.l a3,DataBlk(a5)
beq DosQuit
lea $24(a3),a0 ;keep longword alignment!
move.l a0,message(a5)
lea $14(a0),a0
move.l a0,DosPkt(a5)
; make the port .. alloc signal
moveq #-1,d0
jsr _LVOAllocSignal(a6)
cmp.b #$FF,d0
beq.s _NoSignal ;couldn't get signal
move.b d0,15(a3) ;mp_SigBit
move.b #4,8(a3) ;mp_Node.ln_Type=NT_MSGPORT
clr.b 14(a3) ;mp_Flags=PA_SIGNAL
sub.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,$10(a3) ;*mp_SigTask
; construct empty MsgList
lea $18(a3),a0 ;mp_MsgList.lh_Tail (contns 0)
move.l a0,$14(a3) ; to mp_MsgList.lh_Head
lea $14(a3),A0 ;mp_MsgList.lh_Head
move.l a0,$1C(a3) ; to mp_MsgList.lhTailPred
clr.l $18(a3) ;mp_MsgList.lh_Tail
move.b #2,$20(a3) ;mp_MsgList.lh_type
;** GetToWork(argv[1]);
move.l argv(a5),a0
bsr GetToWork
; Wind up port here; Scrap(A3=address)
move.l DataBlk(a5),a3
MOVE.B #$FF,8(A3)
MOVEQ #-1,D0
MOVE.L D0,$14(A3)
MOVEQ #0,D0
MOVE.B 15(A3),D0
MOVE.L 4,A6
JSR _LVOFreeSignal(A6)
; Can't get the signal
_NoSignal MOVE.L A3,A1
MOVE.L #DATASIZE,D0
JSR _LVOFreeMem(A6)
; Can't get the allocate
DosQuit move.l dosBase(a5),a6 ; set Dos Library
;** switch (FileErr)
move.l argv(a5),a0
move.l FileErr(a5),d0
;** {
;** case 0:
bne.s Ncase0
tst.b Yup(a5)
beq.s NotYup
moveq #0,d6 ; return OK
move.l OutHandle(a5),d1 ; file handle
lea SDupMsg(pc),a1
move.l a1,d2 ; outbuffer
moveq #SDupLen,d3 ; length
jsr _LVOWrite(A6)
NotYup tst.b Nope(a5)
beq.s NotNo
moveq #5,d6 ; return WARN
move.l OutHandle(a5),d1 ; file handle
lea SDnupMsg(pc),a1
move.l a1,d2 ; outbuffer
moveq #SDnupLen,d3 ; length
jsr _LVOWrite(A6)
NotNo tst.b Mebbe(a5)
bne.s endSwitch
moveq #10,d6 ; return ERROR
move.l OutHandle(a5),d1 ; file handle
lea SDnfMsg(pc),a1
move.l a1,d2 ; outbuffer
moveq #SDnfLen,d3 ; length
jsr _LVOWrite(A6)
;** break;
bra.s endSwitch
;** case 1:
;** printf("Out of Memory\n");
Ncase0 cmp.l #1,d0
bne.s Ncase1
move.l OutHandle(a5),d1 ;file handle
lea NoMemMsg(pc),a1
move.l a1,d2 ;outbuffer
moveq #NoMemLen,d3 ;length
jsr _LVOWrite(A6)
;** break;
bra.s endSwitch
;** case 2:
;** printf("Can't find directory.\n");
Ncase1 cmp.l #2,d0
bne.s endSwitch
move.l OutHandle(a5),d1 ;file handle
lea NoFileMsg(pc),a1
move.l a1,d2 ;outbuffer
moveq #NoFileLen,d3 ;length
jsr _LVOWrite(A6)
endSwitch bra.s LastGasp
;** }
;** }
;** else printf("FORMAT: ReDate <DirectoryName>\n");
Prompt move.l OutHandle(a5),d1
lea PromptMsg(pc),a1
move.l a1,d2
moveq #PromptLen,d3
jsr _LVOWrite(A6)
moveq #0,d6 ; return OK
;** }
LastGasp: move.l dosBase(a5),a1 ; DosBase to a1;
move.l $4,a6 ; using Exec library,
jsr _LVOCloseLibrary(a6) ; close Dos library.
StartupQuit unlk a5
move.l d6,d0 ; return code
rts ; End of Program
;** *struct DateStamp GetToWork(char * Name)
;** {
;** unsigned long newLock, oldLock;
;** struct FileInfoBlock *fibb;
;** char *NameSave;
; offsets from A4
Days equ -4
Minutes equ -8
Ticks equ -12
newLock equ -16
oldLock equ -20
fibb equ -24
NameSave equ -28
GetToWork link A4,#-28
move.l a0,NameSave(a4)
;** Date[]=0;
moveq #90,d0 ;for April 1 1978
move.l d0,Days(a4)
move.l d0,Minutes(a4)
move.l d0,Ticks(a4)
;** FileErr =1; /* Alloc error */
moveq #1,d0
move.l d0,FileErr(a5)
;** if ((fibb = AllocMem(INFOSIZE,0)) != 0)
move.l $4,a6 ; this calls for Exec
moveq #0,d1 ; any type of memory
move.l #INFOSIZE,d0 ; size of block needed
jsr _LVOAllocMem(a6) ; go get it
move.l dosBase(a5),a6 ; restore Dos Library
move.l d0,fibb(a4) ; save the block address
beq GDExit ; quit if no memory
;** {
;** FileErr =2; /* file unreadable */
moveq #2,d0
move.l d0,FileErr(a5)
;** if ((newLock = Lock(Name,ACCESS_READ)) != 0)
move.l NameSave(a4),d1
moveq #ACCESS_READ,D2 ; get a read lock
jsr _LVOLock(a6)
move.l d0,newLock(a4) ; store the lock pointer
beq DropMem ; couldn't get lock
;** { if ((Examine(newLock,fibb)) != 0)
move.l d0,d1 ; lock
move.l fibb(a4),d2 ; file info block address
jsr _LVOExamine(a6) ; go for the data
; Assume Examine never fails. Go for the data.
;** {
;** FileErr =0; /* got file, normal error sequence */
moveq #0,d0
move.l d0,FileErr(a5)
;** if (fibb->fib_EntryType < 0)
move.l fibb(a4),a3 ; file info block address
move.l fib_EntryType(a3),d0
bpl.s DirLoop
;** {
;** printf(" Not a Directory!/n");
move.l OutHandle(a5),d1
lea NotDirMsg(pc),a1
move.l a1,d2
moveq #NotDirLen,d3
jsr _LVOWrite(A6)
bra DropLock
;** else
DirLoop:
;** {
;** if ((ExNext(newLock,fibb)) == 0)
move.l newLock(a4),d1 ; lock
move.l fibb(a4),d2 ; file info block address
jsr _LVOExNext(a6) ; go for the data
tst.l d0
beq DropLock
;** {
;** if (fibb->fib_EntryType < 0)
tst.l fib_EntryType(a3)
bmi TypeFile
;** We found a directory .. we got work.
;** {
;** oldLock = CurrentDir(newLock);
move.l newLock(a4),d1
jsr _LVOCurrentDir(a6)
move.l d0,oldLock(a4)
;** Level += 1;
addq #1,Level(a5)
;** GetDir(fibb->fib_FileName);
lea fib_FileName(a3),a0
bsr GetToWork
move.l fibb(a4),a3 ; file info block address
move.l d0,fib_Date(a3)
move.l d1,fib_Date+4(a3)
move.l d2,fib_Date+8(a3)
;** Level -= 1;
subq #1,Level(a5)
;** newLock = CurrentDir(oldLock);
move.l oldLock(a4),d1
jsr _LVOCurrentDir(a6)
move.l d0,newLock(a4)
;** This is where we build the packet. Ouch.
; sendpkt(a3=struct MsgPort *pid,a2=LONG args)
move.l DosPkt(a5),a0
lea $30(a0),a0 ;BSTR site
lea fib_FileName(a3),a1 ;name
moveq #0,d0
NmLp move.b 0(a1,d0.w),1(a0,d0.w)
beq.s NmEnd
addq.w #1,d0
cmp.w #108,d0
bne.s NmLp
NmEnd move.b d0,(a0) ;len
move.l a0,d7
lsr.l #2,d7 ;BSTR address
; message.mn_Node.ln_Name = &(dosPacket);
MOVE.L DosPkt(A5),A0
MOVE.L message(A5),A1
MOVE.L A0,10(A1)
; dosPacket.dp_Link = &(message);
MOVE.L A1,0(A0)
; dosPacket.dp_Port = replyport;
MOVE.L DataBlk(A5),$18(A1)
; dosPacket.dp_Type = action;
MOVE.L #34,$1C(A1)
; dosPacket.dp_Arg1 = 0;
LEA $28(A1),A0 ;arg1
; arg1=NULL MOVE.L #0,0(A0)
; dosPacket.dp_Arg2 = parentlock;
move.l newLock(a4),4(a0) ; lock
; dosPacket.dp_Arg3 = BSTR(filename);
move.l d7,8(A0) ; BSTR
; dosPacket.dp_Arg4 = &datestamp;
lea fib_Date(a3),a1
move.l a1,12(A0) ; Ptr to datestamp
; PutMsg(pid,message);
move.l DevProc(A5),A0
MOVE.L message(A5),A1
MOVE.L 4,A6
JSR _LVOPutMsg(A6)
; WaitPort(replyport); GetMsg(replyport);
MOVE.L DataBlk(A5),A0
JSR _LVOWaitPort(A6)
MOVE.L DataBlk(A5),A0
JSR _LVOGetMsg(A6)
; res1 = dosPacket.dp_Res1;
moveq #1,d1
lea Nope(a5),a1
move.l message(A5),A0
move.l $20(A0),D0
; $FFFFF is success
beq.s NGood
lea Yup(a5),a1
NGood move.b d1,(a1)
move.b d1,Mebbe(a5)
;** } /* dir */
TypeFile:
; if FileName <> #?.info
lea fib_FileName(a3),a0
TryChx move.b (a0)+,d0
bne.s TryChx
lea -6(a0),a0
lea InfoLine(pc),a1
InfLp cmp.b (a0)+,(a1)+
beq.s InfLp
tst.b -1(a0)
beq.s Rejoin2
;** {
move.l fib_Date(a3),d0
move.l fib_Date+4(a3),d1
move.l fib_Date+8(a3),d2
cmp.l Days(a4),d0
bne.s ckDate
cmp.l Minutes(a4),d1
bne.s ckDate
cmp.l Ticks(a4),d2
ckDate bcs.s Rejoin2
move.l d0,Days(a4)
move.l d1,Minutes(a4)
move.l d2,Ticks(a4)
;** } /* file */
Rejoin2:
tst.b Abort(a5)
bne.s DropLock
moveq #0,d0
move.l #$1000,d1
move.l $4,a6
jsr _LVOSetSignal(a6)
move.l dosBase(a5),a6 ; restore Dos Library
and.l #$1000,d0
beq.s NotCtrlC
move.b #1,Abort(a5)
NotCtrlC: tst.b Abort(a5)
beq DirLoop
; print Ctrl-C signal
move.l OutHandle(a5),d1
lea CtrlCMsg(pc),a1
move.l a1,d2
moveq #CtrlCLen,d3
jsr _LVOWrite(A6)
;** } /* primary dir not file */
;** } /* Examine OK */
;** UnLock(newLock);
DropLock move.l dosBase(a5),a6 ; set Dos Library
move.l newLock(a4),d1 ; take off the lock
jsr _LVOUnLock(a6)
;** } /* Lock OK */
;** FreeMem(fibb,INFOSIZE);
DropMem: move.l $4,a6 ; set Exec library
move.l fibb(a4),a1 ; memory block address
move.l #INFOSIZE,d0 ; size of block
jsr _LVOFreeMem(a6) ; release this memory
move.l dosBase(a5),a6 ; set Dos Library
;** } /* Alloc OK */
move.l Days(a4),d0
move.l Minutes(a4),d1
move.l Ticks(a4),d2
GDExit: unlk A4
rts
;** }
NotDirMsg dc.b 'Not a directory!',$a
NotDirLen equ *-NotDirMsg
PromptMsg dc.b 'ReDate (by Jim Butterfield) V1.0',$0a
dc.b 'FORMAT: ReDate <directory>',$0a
PromptLen equ *-PromptMsg
SDupMsg dc.b 'Subdirectories updated.',$a
SDupLen equ *-SDupMsg
SDnupMsg dc.b 'Subdirectories not updated.',$a
SDnupLen equ *-SDnupMsg
SDnfMsg dc.b 'No subdirectories seen.',$a
SDnfLen equ *-SDnfMsg
NoMemMsg dc.b 'Out of Memory',$0a
NoMemLen equ *-NoMemMsg
NoFileMsg dc.b 'Can t find file.',$0a
NoFileLen equ *-NoFileMsg
CtrlCMsg dc.b '^C',$0a
CtrlCLen equ *-CtrlCMsg
InfoLine dc.b '.info'
dosname dc.b 'dos.library',0
end