;************************************************************************** ; REVUE.SYS ; ; last update: 10/30/87 ;************************************************************************** OBJNAM REVUE.SYS SEARCH SYS ;search normals plus AAA SEARCH SYSSYM SEARCH TRM SEARCH AAA ;define a verion number ; VMAJOR=3. ;version 3.1 VMINOR=1. ;define a program header ; PHDR -1,0,PH$REE!PH$REU ;now get the input from user input buffer (bootstrap OR from VUE) ; TIN ;instruction overwritten by RVINI ;perform the instruction here ;puts input character into D1 ;now save everything and see if RV was entered by searching for ; REVUE.MOD in the user's Memory Partition. If not there, the user ; must have entered "VUE..", not "RV..". If just "VUE..", then don't ; journal. ; SAVE D0,D2-D7,A0-A6 ;save all registers except D1 PUSH D1 ;save the input character LEA A4,RVMOD ;point A4 to "REVUE.MOD" SRCH @A4,A1,F.USR ;is it in the user's memory partition? BEQ 10$ ;yup, user entered "RV...", A1 pointer ; to REVUE.MOD JMP VUEA ;nope, just return like normal ;User entered "RV...". See the status of REVUE.MOD. ; if INIT flag is 321, then simply back to VUE ; if INIT flag is 123, then INIT already done for "*.RV" ; if REVUE in progress flag = 123, then TRMICP next character ; 10$: CMPB @A1,#321 ;if just done with RESTORE JEQ VUEA ; then back to VUE CMPB @A1,#123 ;if INIT flag is not 123 JNE VUEA ; then something is wrong CMPB 1(A1),#123 ;if not in RESTORE mode BNE SAVCHR ; then save the character entered CALL RESTOR ; else restore next keystroke JMP VUEA ; and return to VUE ;Initialize all pointers before saving the keystroke ; SAVCHR: LEA A4,2(A1) ;point A4 to DDB in REVUE.MOD LEA A0,1152(A1) ;point A0 to block buffer pointer LEA A2,1152(A1) ;same goes for A2 LEA A3,1162(A1) ;point A3 to character count LEA A5,1166(A1) ;point A5 to total character count ;Now save the keystroke in the 512. byte block buffer area. This ; will overwrite the initial -1's in the buffer area. ; MOV @A0,A0 ;A0 points to space in 512. buffer MOVB D1,(A0)+ ;move in character, increment pointer MOV A0,@A2 ;save pointer in block buffer pointer INC @A3 ;increment character count CMP @A3,#16. ;16 characters processed since WRITE? JNE VUEA ;nope, do not perform a WRITE, return ;If 16 characters have been queued, it is time for a WRITE ; MOV #0,@A3 ;clear character count ADD #16.,@A5 ;add 16 to total character count WRITE @A4 ;and record the changes on the disk ;If all 512. bytes have been recorded, time for a new block in the ; buffer area. All pointers need to be reset. ; CMP @A5,#512. ;all 512. bytes written? JNE VUEA ;nope, return to VUE INC 1156(A1) ;yup, increment block count MOV #0,1162(A1) ; clear character count MOV #0,1166(A1) ; clear total character count LEA A2,152(A1) ; point A2 to block buffer area LEA A3,1152(A1) ; point A3 to pointer storage area MOV A2,@A3 ; save the buffer pointer INCW D.REC+2(A4) ; increment block number ;If we are on the last block of "*.RV", warn the user that their ; keystroke file is getting full. ; CMP 1156(A1),#19. ;on the last block of "*.RV"? JNE 50$ ;nope, do not warn user CALL WARNIN ;yup, warn user of "fill" ;Read in a "new" block. Fill the block with -1's and WRITE this ; update out before continuing with the program. ; 50$: READ @A4 ;read in the "new" block LEA A2,152(A1) ;point to block just read in MOV #-1,D3 ;D3 will hold the -1's MOV #128.,D2 ;D2 holds total number of lwords 60$: MOV D3,(A2)+ ;initialize the lword to -1 DEC D2 ;one less lword to init BNE 60$ ;but still more to do WRITE @A4 ;all done, WRITE changes ;Jump back to VUE here (first TIN replacement). Notice the NOPs. These ; will be "filled in" by RVINI with the exact instructions overwritten ; by RVINI, plus the return address where the program should jump back ; to VUE. ; VUEA: POP D1 REST D0,D2-D7,A0-A6 NOP NOP NOP NOP NOP ;************************************************************************* ;now get the input from user input buffer (bootstrap OR from VUE) ; XXXXXX: TIN ;instruction overwritten by RVINI ;perform the instruction here ;puts input character into D1 ;now save everything and see if RV was entered by searching for ; REVUE.MOD in the user's Memory Partition. If not there, the user ; must have entered "VUE..", not "RV..". If just "VUE..", then don't ; journal. ; SAVE D0,D2-D7,A0-A6 ;save all registers except D1 PUSH D1 ;save the input character LEA A4,RVMOD ;point A4 to "REVUE.MOD" SRCH @A4,A1,F.USR ;is it in the user's memory partition? BEQ 10$ ;yup, user entered "RV...", A1 pointer ; to REVUE.MOD JMP VUEB ;nope, just return like normal ;User entered "RV...". See the status of REVUE.MOD. ; if INIT flag is 321, then simply back to VUE ; if INIT flag is 123, then INIT already done for "*.RV" ; if REVUE in progress flag = 123, then TRMICP next character ; 10$: CMPB @A1,#321 ;if just done with RESTORE JEQ VUEB ; then back to VUE CMPB @A1,#123 ;if INIT flag is not 123 JNE VUEB ; then something is wrong CMPB 1(A1),#123 ;if not in RESTORE mode BNE CHRSAV ; then save the character entered CALL RESTOR ; else restore next keystroke JMP VUEB ; and return to VUE ;Initialize all pointers before saving the keystroke ; CHRSAV: LEA A4,2(A1) ;point A4 to DDB in REVUE.MOD LEA A0,1152(A1) ;point A0 to block buffer pointer LEA A2,1152(A1) ;same goes for A2 LEA A3,1162(A1) ;point A3 to character count LEA A5,1166(A1) ;point A5 to total character count ;Now save the keystroke in the 512. byte block buffer area. This ; will overwrite the initial -1's in the buffer area. ; MOV @A0,A0 ;A0 points to space in 512. buffer MOVB D1,(A0)+ ;move in character, increment pointer MOV A0,@A2 ;save pointer in block buffer pointer INC @A3 ;increment character count CMP @A3,#16. ;16 characters processed since WRITE? JNE VUEB ;nope, do not perform a WRITE, return ;If 16 characters have been queued, it is time for a WRITE ; MOV #0,@A3 ;clear character count ADD #16.,@A5 ;add 16 to total character count WRITE @A4 ;and record the changes on the disk ;If all 512. bytes have been recorded, time for a new block in the ; buffer area. All pointers need to be reset. ; CMP @A5,#512. ;all 512. bytes written? JNE VUEB ;nope, return to VUE INC 1156(A1) ;yup, increment block count MOV #0,1162(A1) ; clear character count MOV #0,1166(A1) ; clear total character count LEA A2,152(A1) ; point A2 to block buffer area LEA A3,1152(A1) ; point A3 to pointer storage area MOV A2,@A3 ; save the buffer pointer INCW D.REC+2(A4) ; increment block number ;If we are on the last block of "*.RV", warn the user that their ; keystroke file is getting full. ; CMP 1156(A1),#19. ;on the last block of "*.RV"? JNE 50$ ;nope, do not warn user CALL WARNIN ;yup, warn user of "fill" ;Read in a "new" block. Fill the block with -1's and WRITE this ; update out before continuing with the program. ; 50$: READ @A4 ;read in the "new" block LEA A2,152(A1) ;point to block just read in MOV #-1,D3 ;D3 will hold the -1's MOV #128.,D2 ;D2 holds total number of lwords 60$: MOV D3,(A2)+ ;initialize the lword to -1 DEC D2 ;one less lword to init BNE 60$ ;but still more to do WRITE @A4 ;all done, WRITE changes ;Jump back to VUE here (first TIN replacement). Notice the NOPs. These ; will be "filled in" by RVINI with the exact instructions overwritten ; by RVINI, plus the return address where the program should jump back ; to VUE. ; VUEB: POP D1 REST D0,D2-D7,A0-A6 NOP NOP NOP NOP NOP ;WARNIN Subroutine. Called when user is about to fill the keystroke ; file. Byte 1172 in REVUE.MOD is set to 123 once the warning has ; been made to insure only 1 warning will be given. ; WARNIN: CMP 1172(A1),#123 ;WARNIN already presented to user? JEQ 10$ ;yup, do not execute the rest... MOV #123,1172(A1) ;nope, set the WARNIN flag ;Now place the cursor at 20,1 and present message and bell ; PRTTAB 20.,1 ;TAB to 20,1 MOV #7,D1 ;get a bell TTY ;"beep" TYPE < WARNING - your keystroke buffer is getting full.> PRTTAB 21.,1 ;tab down 1 row TYPE < Please FINISH from VUE as soon as possible.> PRTTAB 22.,1 ;tab down 1 row TYPE < (Hit ESC to clear this message)... > 10$: RTN ;end of WARNIN Subroutine ;RAD50 value of REVUE.MOD ; RVMOD: RAD50 /REVUE MOD/ ;bootstrap restore, or just restore? RESTOR: CMP 1206(A1),#123 ;bootstrap flag set? BEQ 10$ ;yup, need to parse etc... CMP 1176(A1),#123 ;parsed a block yet? BNE PRSCHK ;nope, see if block parsed JMP TRMIC ;yup, time for a new character 10$: CLR 1206(A1) ;clear bootstrap flag ;Read the "new" block and make sure there are ; some keystrokes available. ; FIRST: LEA A4,2(A1) ;point A4 to *.RV that exists READ @A4 ;read in first block (keystrokes) LEA A3,152(A1) ;point A3 to block buffer area CMPB @A3,#-1 ;if -1 JEQ NOCRS ;then done with "RESTORE" ;Find out if this is the last block in the file marked by "-1". ;If it is, we need to look for a "Q,15,-1" combination.... ; PRSCHK: CLR D1 ;clear character register MOV #512.,D4 ;set byte count register 10$: CMPB @A3,#-1 ;if block buffer area has a -1 BEQ GOT1 ;then we found a "-1" INC A3 ;else point to next character DEC D4 ;one less byte to check BNE 10$ ;and still more to check SETPRS: MOV #123,1176(A1) ;done, all ok, set PARSED flag BR TRMIC ;and get a character from the file ;Found a "-1", now look for "Q,15,-1" and change to "Q,-1" if found. ; GOT1: DEC A3 ;repoint back one character CMPB @A3,#15 ;looking for a "Q,15" sequence BNE SETPRS ;no 15, so no need to check further DEC A3 ;15 found, point back another char. CMPB @A3,#'Q ;looking for a "Q" BEQ 10$ ;found one, eliminate this character CMPB @A3,#'q ;or looking for a "q" BNE SETPRS ;not there, no need to overwrite 10$: INC A3 ;point to the 15 MOVB #-1,@A3 ;overwrite the 15 with a -1 MOV #123,1176(A1) ;and set PARSED flag ;Block all parsed and ready to get next character from *.RV. ;First see if we are on the "bootstrap" sequence.... ; TRMIC: MOV D.BUF+2(A1),A3 ;A3 points to block of *.RV CMP 1156(A1),#0 ;are we on the first block? BNE POISE ;nope, bypass below CMP 1166(A1),#0 ;yup. Are we on the first character? BNE POISE ;nope, bypass below MOV 4(SP),D1 ;yup. Get saved TIN character CLR D1 ;wipe it out MOVB @A3,D1 ;get "real" character from *.RV MOV D1,4(SP) ;and replace the character on stack INC 1162(A1) ;increment character count INC 1166(a1) ;increment total count ;Get a character ready and poised in D1 ; POISE: MOV #350.,D6 ;sleep for just a bit SLEEP ;like so CLR D1 ;clear D1 JOBIDX A4 ;A4 points to your IDX MOV 1166(A1),D4 ;get character count into D4 ADD D4,A3 ;point to "next character" in *.RV CMPB @A3,#-1 ;is it a "-1"? BEQ DONE ;yup, DONE! MOVB @A3,D1 ;nope, poise it into D1 MOV JOBTRM(A4),A5 ;get the JOBTRM pointer into A5 TRMICP ;place "new" character into Input Buff INC 1162(A1) ;increment "write" count CMP 1162(A1),#16. ;if 16 then needs to be 0 BNE 10$ ;it's not 16 CLR 1162(a1) ;here it gets zero'd 10$: INC 1166(a1) ;increment total block count CMP 1166(a1),#512. ;done with the block? BNE NOCRS ;nope, just return ;All done with the current block - get a new block into the buffer ; INCW D.REC+4(A1) ;increment the block number of *.RV READ 2(A1) ;read in the new block INC 1156(A1) ;increment the block count CMP 1156(A1),#014 ;all done with the file? BEQ DONE ;yup, DONE! CLR 1176(A1) ;else clear the PARSEd flag CLR 1166(A1) ;and clear the character count NOCRS: RTN ;and return from RESTOR ;All through restoring the VUE file - let em know you're done. ; DONE: MOV A3,1152(A1) ;set current block pointer CLR 1206(A1) ;clear bootstrap CLR 1176(A1) ;clear parse CMP 1156(a1),#014 ;keystroke file full? BNE 10$ ;nope MOV #7,D1 ;get a bell TTY ;BEEP! PRTTAB 20.,9. ;yup, type warning message TYPE MOVB #321,@a1 ;set don't save flag RTN ;and return 10$: MOVB #123,@A1 ;set INIT flag CLRB 1(A1) ;clear REVUE IN PROGRESS flag MOV #7,D1 ;get a bell TTY ;beep! RTN ;and return END .