Mercurial > hg > Members > kono > os9 > sbc09
diff CoCoOS9/level2v3/CMDS/copy.asm @ 31:bd2b07db8917 cocoos9lv2v3
CoCoOS9 version
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Jul 2018 15:16:13 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CoCoOS9/level2v3/CMDS/copy.asm Sat Jul 14 15:16:13 2018 +0900 @@ -0,0 +1,320 @@ +******************************************************************** +* Copy - File copy utility +* +* $Id: copy.asm,v 1.1.1.1 2001/02/21 23:30:54 boisy Exp $ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 10 Reworked RML + + nam Copy + ttl File copy utility + +* Edition 10 rewrite 10/28/88 - RML + + ifp1 + use defsfile + endc + +tylg set Prgrm+Objct +atrv set ReEnt+rev +rev set $01 +edition set 10 + + mod eom,name,tylg,atrv,start,size + +inpath rmb 1 input path number +outpath rmb 1 output path number +indevtyp rmb 1 input device type (1 = RBF) +verify rmb 1 verify on/off (1=on) +bufsize rmb 2 read/write buffer size +fsizemsb rmb 2 msb's of file size +fsizelsb rmb 2 lsb's of file size +writemsb rmb 2 msb's of bytes written to output +writelsb rmb 2 lsb's of bytes written to output +single rmb 1 single drive copy flag (1=yes) +attribs rmb 1 file attributes +fdbuff rmb 16 File Descriptor buffer +optbuff rmb 32 Path Descriptor Options Buffer +stack rmb 448 stack storage +vfybuff rmb 256 verify buffer +buffer rmb $2000-. read/write buffer (minimum..will expand with mem mod) +size equ . + +name fcs /Copy/ + fcb edition + +start leas vfybuff,u set stack pointer to 512 + pshs u save u reg + leau <optbuff,u point u to 20th byte + +clearit clr ,-u clear byte + cmpu ,s done ? + bhi clearit loop back + tfr y,d move in top of mem (after param area) + subd ,s++ subtract current stack + subd #$0300 and back off variable storage + clrb round off to page bondary + std <bufsize buffer size + pshs x save x register + +getopt lda ,x+ get a char + cmpa #'- was it a '-'?? + beq chkopt yes..go check opt + cmpa #C$CR was it a <cr>?? + bne getopt no..check next char + bra openin else done..go finish processing + +chkopt ldd ,x+ get next 2 chars + eora #'S check if its an S + anda #$DF make upper case + lbne sndinstr not an s.. send instructions + cmpb #$30 else check if next char is number or letter + lbhs sndinstr yup...send instructions + inc <single set s option + bra getopt and check next char + +openin puls x restore line pointer + lda #READ. open first file + os9 I$Open + lbcs chkerr error..go see what it was + sta <inpath save path number + pshs x save second path name start + leax <fdbuff,u point to FD buffer + ldy #16 bytes to read + ldb #SS.FD get file descriptor + os9 I$GetStt + puls x restore line pointer + bcs getintyp skip this on eror + tst <single single drive copy ? + beq getintyp no..skip this stuff + lda ,x get first char of path name + ldb #E$BPNam load bad path name error message + cmpa #'/ was it a path separaor ? + bne errjump nope..error + +getintyp pshs x save out path name start + lda <inpath get path number + bsr getopts get option section + lda ,x get device type + sta <indevtyp save it + ldb #$0F default attributes...read,write,execute,public + cmpa #DT.RBF was device type RBF ? + bne openout nope...don't get file size/attributes + pshs u,x save registers + lda <inpath get path number + ldb #SS.Size Get File size + bsr getstat do the GetStt call..exit on error + stx <fsizemsb save 2 msb's of file size + stu <fsizelsb save 2 lsb's of file size + puls u,x restore registers + ldb <$13,x get file attributes + +openout stb <attribs save attributes + ldx ,s get start of second path name + lbsr destsnd send destination msg + lda #UPDAT. open file for update + ldb <attribs get attributes + os9 I$Create create the file + puls x restore x register + bcc open010 no error..skip this + inc <verify set verify off + lda #WRITE. open filein write only mode + ldb <attribs get atributes + os9 I$Create create the file + bcs errjump exit on error + +open010 sta <outpath save second path number + bsr getopts get option section + ldb ,x get device type + cmpb #DT.RBF was it RBF + beq setvfy yup...skip this + inc <verify set verify off + bra mainloop and skip all this + +errjump lbra errexit nope....error + +getopts leax <optbuff,u point to buffer + ldb #SS.Opt get option section of path descritor + +getstat os9 I$GetStt + bcs errjump exit on error + rts + +setvfy tst <verify do we want verify on + bne setsiz nope...dont set driver verify on + ldb #1 verify + stb 8,x turn verify on + ldb #SS.OPT set options + os9 I$SetStt + bcs errjump exit on error + +setsiz lda <indevtyp get device type + cmpa #DT.RBF is it an RBF file + bne mainloop nope...dont preset file size + pshs u save register + lda <outpath get out path number + ldb #SS.Size set file size + ldx <fsizemsb get 2 msb's of in file size + ldu <fsizelsb get 2 lsb's of in file size + os9 I$SetStt set the size + bcs errjump exit on error + puls u restore register + lda <outpath get out path number + leax <fdbuff,u point to FD buffer + ldy #16 number of bytes to write + ldb #SS.FD write out the FD (for dates,etc.) + os9 I$SetStt + +mainloop leax buffer,u point to buffer + clra source drive code + lbsr chkdrive send source switch msg + lda <inpath get in path number + ldy <bufsize get buffer size + os9 I$Read read a block + bcs chkeof2 if error..go check which one + lbsr destsnd send destination switch msg + lda <outpath get out path number + os9 I$Write write the block out + bcs errjump exit on error + tst <verify are we verifying ? + bne chkeof skip this + pshs u,y save registers + ldx <writemsb get 2 msb's of last write + ldu <writelsb get 2 lsb's of last write + lda <outpath get out path number + os9 I$Seek + bcs errjump exit on error + ldu 2,s get original u back + leau buffer,u point to buffer start + ldd ,s get bytes written + addd <writelsb add on to current 2 lsb positions + std <writelsb save them + ldd ,s get bytes written + bcc vfy000 skip if no carry + leax 1,x bump up 2 msb's + stx <writemsb and save them + +vfy000 ldy #$0100 chars to read for verify + std ,s save it + tsta did we write more than 255 bytes ? + bne vfy010 yes...only read 256 + tfr d,y else xfer amount we did write + +vfy010 ldx 2,s get u register + leax $200,x point to start of verify buffer + lda <outpath get output path number + os9 I$Read read a block in + bcs errexit exit on error + +vfy020 lda ,u+ get char from in buffer + cmpa ,x+ get char from out buffer + bne snderr1 not equal...send write verfiy msg + leay -1,y decrement read count + bne vfy020 if more..loop back + ldd ,s get write count back + subd #$0100 subtract verify buffer size + bhi vfy000 if more left...loop back + puls u,y else restore registers + +chkeof lda <inpath get in path number + ldb #SS.EOF check for end of file + os9 I$GetStt + bcc mainloop nope...loop back + cmpb #E$EOF are we at end of file ? + beq closeout yes...close file + + +chkeof2 cmpb #E$EOF check for end of file + bne errexit nope...error exit + bsr destsnd send msg for disk switch + +closeout lda <outpath get out path number + os9 I$Close close the file + bcc exitok exit w/o error if o.k. + bra errexit else error exit + +errmsg1 fcb $07 + fcc /Error - write verification failed./ + fcb $0D + +snderr1 leax errmsg1,pcr address of 'write verify failed' msg + bsr sndline send it + comb set carry + ldb #$01 set error + bra errexit exit + +chkerr cmpb #E$BPNam was it bad path name + bne errexit error exit + +sndinstr leax Help,pcr get instructions + bsr sndline send them +exitok clrb +errexit os9 F$Exit + +sndline ldy #256 max chars to send + lda #1 std out + os9 I$WritLn write the line + rts + +* Send message and wait for disk switch for single drive copy + +destsnd lda #1 set flag for destination message + +chkdrive tst <single are we doing single drive copy + beq msgrts nope..just exit + pshs y,x else save registers + +sndsrc pshs a save drive flag + tsta do we want source drive ? + bne snddst nope..do destination message + leax srcmsg,pcr point to 'source' msg + ldy #srcmsgsz chars to send + bra msgsnd go send it + +srcmsg fcc /Ready SOURCE/ +srcmsgsz equ *-srcmsg + +dstmsg fcc /Ready DESTINATION/ +dstmsgsz equ *-dstmsg + +cntmsg fcc /, hit C to continue: / +cntmsgsz equ *-cntmsg + + +snddst leax dstmsg,pcr point to 'destination' msg + ldy #dstmsgsz chars to send + +msgsnd lda #1 std out + os9 I$Write write it + leax cntmsg,pcr point to 'hit C ...' + ldy #cntmsgsz get size of message + os9 I$Write write it + leax ,-s back up for dummy buffer + ldy #1 chars to read + clra std in + os9 I$Read read one char + lda ,s+ + pshs y,x,a save registers + leax crmsg,pcr point to <cr> + bsr sndline write it + puls y,x,a restore registers + eora #'C check if its a C + anda #$DF make it upper case + puls a restore drive status + bne sndsrc loop back & send message + puls y,x restore registers +msgrts rts + +Help fcc /Use: Copy <Path1> <Path2> [-s]/ + fcb C$LF + fcc / -s = single drive copy/ + fcc / (Path2 must be complete pathlist)/ + fcb C$CR + +crmsg + fcb C$CR + + emod +eom equ * + end