;**************************************************************************** ; RV.M68 ; ; last update: 10/29/87 - worked on DISM68 version, changed to normal ;**************************************************************************** ;search UNV files in MAC: account, PLUS AAA.UNV (AMUS Network) ; SEARCH SYS SEARCH SYSSYM SEARCH TRM SEARCH AAA ;my personal UNV file ;define a version number ; VMAJOR=3. ;Version 3.0(101) VMINOR=1. ;define user variables: ; .OFINI ;initialize offset space .OFDEF FNAME,10 ;filename packed RAD50 .OFDEF RVMOD,4 ;pointer to REVUE.MOD .OFDEF BUFFER,20. ;misc. buffer .OFDEF SLPFLG,4. ;flag set to #123 if REVUEing .OFSIZ IMPSIZ ;IMPSIZ contains final # of var. bytes ;define extra useful MACROs ; DEFINE BRIGHT=PRTTAB -1,12. DEFINE DIM=PRTTAB -1,11. ;define a program header ; L0: PHDR -1,0,PH$REE!PH$REU ;define user variable workspace, have A3 point to the base of them ; GETIMP IMPSIZ,A3 ;A3 points to all user variables ;process input line ; BYP ;bypass whitespace after ".RV.." LIN ;just ".RV" ? JNE FILEIN ;nope, must be ".RV file" ;user just entered in ".RV", give user instructions ; CRLF ;first output a CRLF TYPE ;type how to user the program DIM ;dim the next part of the output TYPECR < (i.e., just like VUE)> ;rest of output line BRIGHT ;back to "bright" terminal output CRLF ;output a CRLF TYPECR TYPECR TYPECR TYPECR TYPECR CRLF TYPECR TYPECR CRLF DIM TYPECR BRIGHT CRLF EXIT ;parse filespec and make sure extension is NOT ".RV" !!! ; FILEIN: FILNAM FNAME(A3),ZQL ;get input filename into FNAME ;use "ZQL" for special bogus ext. ;if user just says RV_FILE CMPW FNAME+4(A3),#[RV ] ;is extension ".RV"? JNE GOODEX ;nope, looking good! ;user entered in ".RV" as an extension. This is a no-no. ; MOV #7,D1 ;get a bell TTY ;"beep"! CRLF ;output CRLF TYPECR CRLF ;plus a message EXIT ;and return user to the dot. ;filespec looks good, make a permanent memory module in their user ;memory called REVUE.MOD. This module is used to maintain all nec. ;variables used while REVUE.SYS is running (concurrently with VUE). ;The layout of REVUE.MOD is as follows (offsets in OCTAL) ; ; 0: flag for "INIT already done". off = 0 on = 123 ; 1: flag for "REVUE in progress" off = 0 on = 123 ; 2-151: DDB for "*.RV" file ; 152-1151 512. byte block buffer area for "*.RV" file blocks ; 1152: Pointer into Block Buffer where character should go ; 1156: Block Count - # of blocks into "*.RV" file ; 1162: Character Count - # characters entered in from VUE ; 1166: Total Count - total # characters (up to 512) ; 1172: ; 1176: Parsing flag in *.RV disk block set after q,CR,-1 chkd ; 1202: ; 1206: bootstrap flag - set on LF TRMICP ; GOODEX: PUSH #1024. ;size of the memory module (1K) PUSH ;this PUSH is part of GETMEM GETMEM @SP ;room for the module? BEQ ROOM ;yup, make it. Else: ;no room for REVUE.MOD, so don't run the program. ; TYPECR EXIT ;get the user back to the dot ;create a memory module in the User's Memory Partition called ;REVUE.MOD. ; ROOM: POP A1 ;A1 points to REVUE.MOD POP ;part of the GETMEM call PUSH A1 ;save pointer to REVUE.MOD MOV A1,RVMOD(A3) ;save pointer in variable RVMOD CLRW @A1 ;clear first word in REVUE.MOD MOVW #[MOD],-(A1) ;move in RAD50 "REVUE.MOD" MOVW #[UE ],-(A1) ; (standard module setup) MOVW #[REV],-(A1) POP A1 ;repoint to REVUE.MOD LEA A4,2(A1) ;A4 points to DDB in REUVE.MOD ;create "Dev#:FILENAME.RV[P,PN]" in DDB within REVUE.MOD ; LEA A5,D.FIL(A4) ;point to D.FIL in REVUE.MOD MOV FNAME(A3),@A5 ;move in RAD50 filename MOVW #[RV ],D.EXT(A4) ;move in RAD50 ".RV" in extension JOBIDX A6 ;point to user MOVW JOBDEV(A6),D.DEV(A4) ;move in device MOVW JOBDRV(A6),D.DRV(A4) ;move in drive number MOVW JOBUSR(A6),D.PPN(A4) ;move in user's PPN ;now INIT the DDB ourselves (instead of calling the INIT routine) ; First set the D$INI flag within the DDB and set INIT in .MOD. ; Then establish the 512. byte buffer in the DDB by setting D.REC ; and D.SIZ. Finally, set 1st byte in REVUE.MOD to #123. ; CLR D.DVR(A4) ;this is so LOOKUP will find DSK.DVR LEA A0,D.FLG(A4) ;point A0 to D.FLG MOVB @A0,D4 ;move the flag value into D4 ORB #D$INI,D4 ;set D$INI within the flag MOVB D4,@A0 ;replace the flag value LEA A0,152(A1) ;point A0 to block buffer area in DDB MOV A0,D.BUF(A4) ;move this pointer to D.REC MOV #512.,D.SIZ(A4) ;set the buffer size MOVB #123,@A1 ;set INIT flag in REVUE.MOD ;now see if "*.RV" exists in the user PPN (LOOKUP will grab DSK.DVR ; since D.DVR was cleared to "0") ; MAKE: LOOKUP @A4 ;FILENAME.RV in user's PPN? JEQ FNDRV ;yup, found *.RV ;didn't find *.RV, so make one! MOV #20.,D.ARG(A4) ;establish a 20 block random file DSKCTG @A4 ;allocate the file MOV #0,1156(A1) ;clear block count MOV #0,1162(A1) ;clear character count MOV #0,1166(A1) ;clear total character count ;Setup all pointers. Buffer pointer inside the block buffer is stored ; at 1152. ; LEA A2,152(A1) ;A2 points to block buffer area LEA A6,1152(A1) ;A6 points to "variable" space for A2 MOV A2,@A6 ;save current block buffer pointer ;Now open the random file, read in the first block, initialize the ; entire block to "-1's" to help REVUE know when a restore is complete ; OPENR @A4 ;open "*.RV" READ @A4 ;read in the first block MOV #-1,D3 ;get the "-1's" MOV #128.,D2 ;set the total number of lwords to set 10$: MOV D3,(A2)+ ;move in a -1 DEC D2 ;one less lword to set BNE 10$ ;but still more to do WRITE @A4 ;all done, write the -1's back out JMP MSG ;and display journaling message ;found FILENAME.RV in user's PPN - ask them if they want it REVUEd ; FNDRV: CRLF ;screen format MOV #7,D1 ;get a bell TTY ;"beep" TAB ;tab over PRNAM D.FIL(A4) ;type out filespec TYPECR < that was created by REVUE has been found in this PPN.> TYPESP < Would you like this file REVUEd? > ONEKEY ;set KBD to "one key" input mode KBD ;get "Y" or ????? CTRLC EXIT ;if ^C, then EXIT ;user entered in responce, see if it is a "Y" or ??? ; UCS ;uppercase the input CMPB D1,#'Y ;"Y"? ; BNE NORV ;nope, don't revue the file ; MOV #123,SLPFLG(A3) ;yes, set sleep flag BEQ REVUE ;yes, revue the file ;user did NOT respond with the "Y" - erase the FILENAME.RV file ; NORV: LEA A4,2(A1) ;point to DDB in REVUE.MOD DSKDEL @A4 ;delete "*.RV" in user's PPN JMP MAKE ;and then make one ;user wants a file restored. Set REVUE flag in REVUE.MOD ;and clear all counters. Open the random file. ; REVUE: CRLF ;for user's terminal MOV RVMOD(A3),A1 ;point A1 to REVUE.MOD MOVB #123,1(A1) ;set REVUE flag CLR 1156(A1) ;clear Block Count CLR 1162(A1) ;clear Character Count CLR 1166(A1) ;clear Total Character Count MOV #123,1206(A1) ;set Bootstrap flag OPENR 2(A1) ;open *.RV for random file i/o ;here's a fancy part: start REVUE by placing a LF in the user's input ;buffer. When VUE is called, it will automatically start REVUEing! ; CLR D1 ;clear character register MOVB #12,D1 ;move in a LF to D1 (req. by TRMICP) JOBIDX A6 ;A6 points to your JCB MOV JOBTRM(A6),A5 ;A5 points to JOBTRM (req. by TRMICP) TRMICP ;place LF in input buffer ;whether or not restoring a file via REVUE, all users come here for ;fancy terminal screen output, indicating REVUE has been init for ;the JOB ; MSG: CRLF ;start of Fancy! BRIGHT ;bright output TYPESP ;fancy message LEA A2,BUFFER(A3) ;use BUFFER for JOBNAM buffer JOBIDX ;point A6 to JCB LEA A1,JOBNAM(A6) ;A1 points to RAD50 JOB name PUSH A2 ;save A2 pointer on stack UNPACK ;create ASCII "JOBNAME" UNPACK CLRB @A2 ;end string w/ null POP A2 ;point to start of JOBNAME TTYL @A2 ;type it out TYPECR < - keystrokes will be recorded.> ; more message DIM ;dim output TYPECR ;more fancy stuff BRIGHT ;back to bright output CRLF ;final screen output ; CMP SLPFLG(A3),#123 ;sleep flag set? ; BNE VUELIN ;nope SLEEP #10000. ;yes, let em see advertizement ;now create "VUE filename.ext" on an A2 command line. ; VUELIN: LEA A2,BUFFER(A3) ;point A2 to BUFFER variable MOVB #'V,(A2)+ ;create VUE.... MOVB #'U,(A2)+ MOVB #'E,(A2)+ MOVB #'L,(A2)+ MOVB #'I,(A2)+ MOVB #'T,(A2)+ MOVB #40,(A2)+ ;space LEA A1,FNAME(A3) ;point A1 to RAD50 filename UNPACK ;create filename UNPACK CMPW FNAME+4(A3),#[ZQL] ;no extension entered by user? BEQ GETEND ;nope, so just get CRLF. EOFN: CMPB -1(A2),#40 ;end of filename? BNE GETEXT ;yup, get extension on command line DEC A2 ;else decrement A2 BR EOFN ;and check again GETEXT: MOVB #'.,(A2)+ ;so far, it's "VUE filename." LEA A1,FNAME+4(A3) ;point to "ext" UNPACK ;create extension EOEXT: CMPB -1(A2),#40 ;end of filename? BNE GETEND ;yup, get extension on command line DEC A2 ;else decrement A2 BR EOEXT ;and check again ;finish the command line, then use AMOS to VUE the file ; GETEND: MOVB #15,(A2)+ ;append CR MOVB #12,(A2)+ ;append LF MOVB #0,(A2)+ ;end command line with a null LEA A2,BUFFER(A3) ;repoint to start PUSH A3 ;SAVE POINTER TO VARIABLES! AMOS ;"VUE_filename.ext" ;when the user is finished with VUE, see if "*.RV" was created ; POP A3 ;A3 points to variables MOV RVMOD(A3),A4 ;A4 points to REVUE.MOD MOV A4,A1 ;make a copy into A1 LEA A4,2(A4) ;A4 points to DDB inside REVUE.MOD ;found a "*.RV" file. See if user wants to delete the file ; FORG: LEA A0,152(A1) ;move buffer index into A0 CMPB @A0,#-1 ;nothing in the file? JEQ DEL ;yup, nothing - erase it CLR D4 ;counter 10$: INC D4 ;increment counter CMPB (A0)+,#-1 ;find end of characters BEQ 20$ ;found it CMP D4,#512. ;not yet, done with block? BEQ CONFIR ;yup, better confirm BR 10$ ;nope, still look 20$: DEC A0 ;repoint to character "-1" CMPB -1(A0),#15 ;a CR? BNE CONFIR ;nope CMPB -2(A0),#'f ;yes, F,CR? JEQ DEL ;yes, delete the file no questions CMPB -2(A0),#'F ; similar....... JEQ DEL CMPB -2(A0),#'g JEQ DEL CMPB -2(A0),#'G JEQ DEL CONFIR: CRLF ;for screen effects TYPESP ;ask 'em PRNAM D.FIL(A4) TYPESP < by entering in a 'Y':> ONEKEY ;set KBD to one key input mode KBD ;get Y or ??? CTRLC EXIT MLTKEY ;back to multiple key input UCS ;upper case the responce CMPB D1,#'Y ;"Y"? JNE EXIT ;nope, leave file in PPN ;user wants "*.RV" deleted. Delete the file from the PPN ; DEL: DSKDEL @A4 ;delete the file EXIT: CRLF EXIT END .