view level1/cmds/backup.asm @ 2758:e4a0f58a5f9b

Found that people who do not have the envirornment variable NITROS9DIR set before building the project get a error missing file "/rules.mak". Found this is caused do to the fact that the code to set this envirornment variable is in the rules.mak which can't get loaded. To fix this the code needed to set the envirornment variable that is in the rules.mak is now in the makefile(s) right before the include for the rules.mak file. This should fix the problem for those who do not have the NITROS9DIR envirornment variable preset.
author drencor-xeen
date Mon, 14 Jan 2013 14:37:46 -0600
parents ab8593f90f03
children
line wrap: on
line source

********************************************************************
* Backup - Make a backup copy of a disk
*
* $Id$
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   8      ????/??/??
* From Tandy OS-9 Level Two VR 02.00.01.
*
*   9      2005/05/03  Robert Gault
* Folded in a new option F to permit a .dsk image file to be used
* instead of dev1. Full path or local file can be used. There is
* still a comparison of LSN0 to make sure that a disk actually has
* been formatted for the correct number of sides and tracks.
* 10     2008/11/12 Robert Gault
* Removed what seemed unnecessary Close and reOpen lines.
* Relocated verification turn off routine.
* Preservation of new disk ID is now possible per Gene's idea.
* SAVEID is a switch to select save/no_save of ID on destination disk.
* Copy and Verification start at LSN1 since LSN0 gets checked several times anyway.

         nam   Backup
         ttl   Make a backup copy of a disk

* Disassembled 02/04/03 23:08:04 by Disasm v1.6 (C) 1988 by RML

         ifp1
         use   defsfile
         endc

DOHELP   set   1
* Default 0 means do not save destination disk ID. 1 means save it. RG
SAVEID    set   0

tylg     set   Prgrm+Objct   
atrv     set   ReEnt+rev
rev      set   $00
edition  set   10

         mod   eom,name,tylg,atrv,start,size

srcpath  rmb   1        path of source disk
dstpath  rmb   1        path of destination disk
u0002    rmb   2
u0004    rmb   5
u0009    rmb   1
errabrt  rmb   1        abort if read error flag (1 = abort, 0 = don't)
pmptsng  rmb   1        single disk copy prompt flag (1 = prompt for single, 0 = don't)
dontvfy  rmb   1        don't verify backup (1 = Don't!, 0 = do)
fileflg  rmb   1        0 = disk, 1 = file (.dsk) to disk; RG
noprompt rmb   1        0 = prompt user, 1 = do not prompt user
srcerr   rmb   1		source disk error code on I$Read
curlsn   rmb   3        current 24-bit LSN counter used while backing up
sctbuf   rmb   2		sector buffer pointer
numpages rmb   1		number of 256 byte pages we can use for backup buffer
pagcntr  rmb   1        256 byte page counter (for backup buffer)
dstdev   rmb   32
optbuf   rmb   32		SS/GS OPT buffer
bufptr   rmb   2        buffer pointer
strbuf   rmb   424      buffer
stack    rmb   80
* Important, the next two lines MUST STAY TOGETHER because of assumptions
* about their location in the code.
dstlsn0  rmb   256
srclsn0  rmb   256
backbuff rmb   14*256	reserve pages for backup buffer
size     equ   .

name     fcs   /Backup/
         fcb   edition

defparms fcc   "/d0 /d1"
         fcb   C$CR
         IFNE  DOHELP
* Added F option; RG
HelpMsg  fcb   C$LF
         fcc   "Use: Backup [e] [f] [s] [-v]"
         fcb   C$LF
         fcc   "            [/dev1 [/dev2]]"
         fcb   C$LF
         fcc   "  e - abort if read error"
         fcb   C$LF
         fcc   "  f - replace dev1 with .dsk image file"
         fcb   C$LF
         fcc   "  p - do not prompt user"
         fcb   C$LF
         fcc   "  s - single drive prompts"
         fcb   C$LF
         fcc   " -v - inhibit verify pass"
         ENDC
L00A0    fcb   $80+C$CR
L00A1    fcc   "Ready to backup from"
L00B5    fcb   $80+C$SPAC
to       fcs   " to "
ok       fcc   "Ok"
ask      fcs   " ?: "
rdysrc   fcs   "Ready Source, hit a key: "
rdydst   fcs   "Ready Destination, hit a key: "
L00F7    fcs   "Sector $"
sctscpd  fcs   "Sectors   copied: $"
vfypass  fcb   C$LF
         fcc   "Verify pass"
         fcb   $80+C$CR
sctvfd   fcs   "Sectors verified: $"
scratch  fcb   C$LF
         fcc   " is being scratched"
         fcb   $80+C$CR
notsame  fcc   "Disks not formatted identically"
         fcb   C$LF
bkabort  fcc   "Backup Aborted"
         fcb   $80+C$CR

* Here's how registers are set when this process is forked:
*
*   +-----------------+  <--  Y          (highest address)
*   !   Parameter     !
*   !     Area        !
*   +-----------------+  <-- X, SP
*   !   Data Area     !
*   +-----------------+
*   !   Direct Page   !
*   +-----------------+  <-- U, DP       (lowest address)
*
*   D = parameter area size
*  PC = module entry point abs. address
*  CC = F=0, I=0, others undefined

* The start of the program is here.
start    leas  >stack,u		move stack pointer to here
         pshs  b,a		    save parameter area size
         pshs  u			save lowest addr
         tfr   y,d          move top of parameter area to Y
         subd  ,s++         D=Y-U
		 subd  #backbuff-stack
* A = number of 256 byte pages that are available for backup buffer
         sta   <numpages
         clr   <pmptsng
         clr   <fileflg
         clr   <errabrt
         clr   <dontvfy
         clr   <srcerr
         leay  <strbuf,u      get address of our buffer
         sty   <bufptr        and save its pointer here
         ldd   ,s++           get parameter length
         beq   L01E3		  if parameter length is 0, use defaults
L0199    ldd   ,x+            get two bytes of command line prompt
         cmpa  #C$SPAC        space?
         beq   L0199          continue if so
         cmpa  #C$COMA        comma?
         beq   L0199          continue if so
         eora  #'E            check for "abort if read error" flag
         anda  #$DF           mask it
         bne   Chk4P          branch if not option
         cmpb  #'0
         bcc   Chk4P          branch if char after option is > $30
         inc   <errabrt       else set flag
         bra   L0199          and continue parsing
Chk4P    lda   -$01,x         load A with prev char and backup X one byte
         eora  #'P            check for "do not prompt user" flag
         anda  #$DF           mask it
         bne   Chk4S          branch if not option
         inc   <noprompt
		 bra   L0199
Chk4S    lda   -$01,x         load A with prev char and backup X one byte
         eora  #'S            check for "single drive prompts" flag
         anda  #$DF           mask it
         bne   Chkimg         branch if not option
         cmpb  #'0
         bcc   L01C1          branch if char after option is > $30
         inc   <pmptsng       else set flag
         bra   L0199          and continue parsing
* New routine to check for new option F; RG
Chkimg   lda   -1,x           get prev char
         eora  #'F            test for disk image to drive
         anda  #$DF
         bne   L01C1
         cmpb  #'0
         bcc   L01C1
         inc   <fileflg       update flag
         bra   L0199          keep reading
* End of new routine
L01C1    ldd   -$01,x         load A with prev char and backup X one byte
         cmpa  #'-            dash?
         bne   L01D7          branch if not
         eorb  #'V
         andb  #$DF
         bne   L01D7
         ldd   ,x+
         cmpb  #'0
         bcc   L01D7
         inc   <dontvfy
         bra   L0199
L01D7    lda   ,-x
         tst   <fileflg       don't look for / if image file, take anything; RG
         bne   L01E7
         cmpa  #PDELIM        path delimiter?
         beq   L01E7          branch if so
         cmpa  #C$CR          carriage return?
         lbne  ShowHelp       if not, show some help
L01E3    leax  >defparms,pcr
L01E7    leay  >L00A1,pcr     ready to backup
         lbsr  L044B          ready message
         ldy   <bufptr
         sty   <u0002
         tst   <fileflg       don't use F$PrsNam if an image file;RG
         bne   L01F7a
         lbsr  L043A          parse name
         bra   L01F7
L01F7a   lbsr  getnm          look for space or comma if file instead of device; RG
L01F7    lda   ,x+
         cmpa  #C$SPAC
         beq   L01F7
         cmpa  #C$COMA
         beq   L01F7
         cmpa  #C$CR
         bne   L020B
         inc   <pmptsng
         ldx   <u0002
         lda   ,x+
L020B    cmpa  #PDELIM        path delimiter?
         lbne  ShowHelp       if not, show some help
         leax  -$01,x
         leay  >to,pcr        "to"
         lbsr  L044B          print
         ldy   <bufptr
         sty   <u0004
         lbsr  L043A          parse path
         leay  >ask,pcr
         lbsr  getkey
         comb  
         eora  #'Y
         anda  #$DF
         lbne  exit
         tst   <fileflg
         bne   L0238b         if file instead of device don't add @
         ldx   <u0002
         ldd   #'@*256+C$SPAC
L0238    cmpb  ,x+
         bne   L0238
         std   -$01,x
L0238b   ldx   <u0002
         lda   #READ.
         os9   I$Open         open source device (the one we're backing up)
         bcs   L027C          branch if error
* Relocated since Close Open is removed. RG
         sta   <srcpath      save path to source
         leax  >srclsn0,u
         ldy   #256
         os9   I$Read         read LSN 0 of source
         bcs   L027C
         ldx   <u0004
         leay  <dstdev,u
L0267    ldb   ,x+
         stb   ,y+
         cmpb  #C$SPAC
         bne   L0267
         ldd   #'@*256+C$SPAC
         std   -$01,y
         leax  <dstdev,u
         lda   #READ.+WRITE.
         os9   I$Open        open destination device (the one we're writing to)
L027C    lbcs  L03AF
         sta   <dstpath      save destination path
* Relocated so that Close Open can be removed. RG
         leax  <optbuf,u
         ldb   #SS.OPT
         os9   I$GetStt 
         ldb   #$01
         stb   PD.VFY,x     turn off verify
         ldb   #SS.OPT
         os9   I$SetStt 
         lbcs  L03AF
*
         clr   <curlsn
         clr   <curlsn+1
         clr   <curlsn+2
* This starts copy routine at LSN1 instead of LSN0. RG
         inc  <curlsn+2
         lbsr  L0419
         lda   <dstpath      get destination path
         leax  >dstlsn0,u
         ldy   #256
         os9   I$Read        read LSN0 of destination
         pshs  u,x
         ldx   #$0000
         leau  ,x
         os9   I$Seek        reseek to start of disk
         puls  u,x
         bcs   L027C         branch if error
         ldd   >256,x        check for source/dest disk having same number of sectors
         cmpd  ,x
         bne   DsksNOk       branch if different
         ldb   >$0102,x
         cmpb  $02,x
         beq   DsksOk
DsksNOk  leay  >notsame,pcr
         lbra  L03B6
DsksOk   leax  >dstlsn0,u    X now points to source LSN0
         lda   #$BF
         sta   <DD.OPT,x
         leay  <DD.NAM,x
         lbsr  L044B
         leay  >scratch,pcr
         lbsr  L0456
         leay  >ok,pcr
         lbsr  getkey		get a key from the stdin
         comb  
         eora  #'Y
         anda  #$DF
         lbne  exit 		exit if not ok to scratch
         lda   <dstpath     get destination path
         leax  >srclsn0,u   get src LSN0 read earlier
         ifne   SAVEID
* New routine to preserved destination disk ID. Gene's idea. RG
         pshs d
         leay >dstlsn0,u
         ldd <DD.DSK,y
         std <DD.DSK,x
         puls d
         endif
*
         ldy   #256
         os9   I$Write		write it to destination
		 lbcs  L03AF
         pshs  u
         ldx   #$0000
         leau  ,x
         os9   I$Seek       seek to LSN0
         puls  u
		 lbcs  L03AF		added Feb 8, 2008 BGP
         leax  >srclsn0,u
         os9   I$Read   
         lbcs  L03AF
copyloop leay  >rdysrc,pcr
         lbsr  doprompt		possibly show "ready source" message
         lda   <numpages
         sta   <pagcntr
         leax  >dstlsn0,u
         lbsr  L0403
         lbsr  L0419
         ldd   <sctbuf
         leax  >dstlsn0,u
         stx   <sctbuf
         subd  <sctbuf
         beq   L035C
         tfr   d,y
         lda   <dstpath
* DriveWire Note: backup /x1 /d1 returns error 247 at this I$Write!
         os9   I$Write  
         bcs   L03AF
L035C    lda   <srcerr
         cmpa  #E$EOF
         bne   copyloop
         leay  >sctscpd,pcr
         lbsr  L0470
         tst   <dontvfy
         bne   exit
* Verification code
         leay  >vfypass,pcr
         lbsr  L0456
         lda   <dstpath
         sta   <srcpath       save newly acquired path number
         pshs  u
         ldx   #$0000
         leau  1,x
         os9   I$Seek       seek to LSN0
         puls  u
         clr   <curlsn
         clr   <curlsn+1
         clr   <curlsn+2
         clr   <srcerr
L0396    lda   <numpages
         sta   <pagcntr
         leax  >dstlsn0,u
         lbsr   L0403
         lda   <srcerr
         cmpa  #E$EOF
         bne   L0396
         leay  >sctvfd,pcr
         lbsr  L0470
         bra   exit
L03AF    os9   F$PErr   
         leay  >bkabort,pcr
L03B6    lbsr  L0456
         comb  
exit    ldb   #$00
         os9   F$Exit   
L03BF    ldy   #256
         lda   <srcpath
         os9   I$Read   
         bcc   L03DC
         stb   <srcerr
         cmpb  #E$EOF
         beq   L040D
         lbsr  L046C
         ldb   <srcerr
         tst   <errabrt
         bne   L03AF
         os9   F$PErr   
L03DC    ldd   <curlsn+1		get lower 16 bits of current LSN
         addd  #$0001			increment
         std   <curlsn+1		and save back
         bcc   L03E7			branch if no carry
         inc   <curlsn			else increment bits 23-16 of LSN
L03E7    tst   <srcerr
         beq   L03FD
         pshs  u
         ldx   <curlsn			get curlsn in X
         tfr   b,a			put bits 7-0 of LSN into bits 15-8
         clrb                   and clear B
         tfr   d,u              transfer to U
         lda   <srcpath
         os9   I$Seek   
         puls  u
         clr   <srcerr
L03FD    ldx   <sctbuf
         leax  >256,x
L0403    stx   <sctbuf
         lda   <pagcntr
         suba  #$01
         sta   <pagcntr
         bcc   L03BF
L040D    rts   

ShowHelp equ   *
         IFNE  DOHELP
         leax  <strbuf,u     get address of buffer
         stx   <bufptr       store as current buffer pointer
         leay  >HelpMsg,pcr  point to help message data
         lbra   L03B6
         ELSE
         bra   exit
         ENDC
L0419    leay  >rdydst,pcr
doprompt tst   <pmptsng		single disk backup prompt?
         beq   L0439		if not, just return
getkey   bsr   L0456
         pshs  y,x,b,a
         leax  ,s
         ldy   #$0001
         clra  
         os9   I$Read       read byte from stdin
         leay  >L00A0,pcr
         bsr   L0456
         puls  y,x,b,a
         anda  #$7F         clear hi bit
L0439    rts
* New routine needed as F$PrsNam will stop at the second "/";RG   
getnm    pshs  x            skip to end of file name;RG
         ldb   #-1
gtnm2    lda   ,x+
         incb
         cmpa  #C$SPAC
         beq   gtnm3
         cmpa  #C$COMA
         bne   gtnm2
gtnm3    puls  x
         bra   L0443
* End of new routine;RG
L043A    pshs  x
         os9   F$PrsNam 
         puls  x
         bcs   ShowHelp
L0443    lda   ,x+
         bsr   L04A5
         decb  
         bpl   L0443
         rts   

L044B    lda   ,y          get char at Y
         anda  #$7F        strip off hi bit
         bsr   L04A5
         lda   ,y+
         bpl   L044B
L0455    rts   
L0456    bsr   L044B
         pshs  y,x,a
         ldd   <bufptr
         leax  <strbuf,u
         stx   <bufptr
         subd  <bufptr
         tfr   d,y
         lda   #$02
         os9   I$WritLn 
         puls  pc,y,x,a
L046C    leay  >L00F7,pcr
L0470    bsr   L044B
         lda   <curlsn
         bsr   L0486
         inc   <u0009
         lda   <curlsn+1
         bsr   L0488
         lda   <curlsn+2
         bsr   L0488
         leay  >L00B5,pcr
         bra   L0456
L0486    clr   <u0009
L0488    pshs  a
         lsra  
         lsra  
         lsra  
         lsra  
         bsr   L0494
         puls  a
         anda  #$0F
L0494    tsta  
         beq   L0499
         sta   <u0009
L0499    tst   <u0009
         beq   L0455
         adda  #$30
         cmpa  #$39
         bls   L04A5
         adda  #$07
L04A5    pshs  x            save X on stack
         ldx   <bufptr      load 'next' ptr
         sta   ,x+          save A at location and inc ptr
         stx   <bufptr      save 'next' ptr
         puls  pc,x

         emod
eom      equ   *
         end