.MCALL .MODULE .MODULE UHANDL,VERSION=16,COMMENT=,IDENT=NO,LIB=YES,AUDIT=NO,TITLE=NO ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL Conditional Summary .NLIST CND ;+ ;COND ; ; OVR$DK 0 No /O overlays ; (1) Support /O overlays ; OVR$MP 0 No /V overlays ; (1) Support /V overlays ; OVR$ID 0 Support I=D environment ; (1) Support I<>D & Supy environments ; OVR$XH (0) Support multiple overlays ; 1 Support just 1 overlay ((X|Y)HANDL) ; OVR$LO 0 Overlay handler inits /O area ; 1 Loader inits /O area ; (OVR$ID) defaults to same as I&D support ; ; ; OVR$DK or OVR$MP must be on (or both) ; OVR$XH forces not OVR$DK ; OVR$XH forces OVR$MP ; OVR$ID forces OVR$MP ;- ; MAS,SHD,LCP,DBB,JFW,DBB,JFW .IIF NDF OVR$DK OVR$DK=1 .IIF NDF OVR$MP OVR$MP=1 .IIF NDF OVR$ID OVR$ID=1 .IIF NDF OVR$UM OVR$UM=1 .IIF NDF OVR$XH OVR$XH=0 .IIF NDF OVR$LO OVR$LO=OVR$ID .IIF NE OVR$XH OVR$DK=0 .IIF NE OVR$XH OVR$MP=1 .IIF NE OVR$ID OVR$MP=1 .IIF EQ OVR$DK!OVR$MP .ERROR;both /O and /V NOT supported .ASECT .=32 ;second word of EMT vector in IMAGE .BYTE OVR$DK+<2*OVR$MP>+<4*OVR$ID>+<10*OVR$XH>+<20*OVR$LO> .BYTE .UHAND .IF NE OVR$XH .IF NE OVR$ID .YHAND == .UHAND .IFF;NE OVR$ID .XHAND == .UHAND .ENDC;NE OVR$ID .IFF;NE OVR$XH .IF NE OVR$MP .OHAND == .UHAND .IFF;NE OVR$MP .IF NE OVR$ID .ZHAND == .UHAND .IFF;NE OVR$ID .VHAND == .UHAND .ENDC;NE OVR$ID .ENDC;NE OVR$MP .ENDC;NE OVR$XH .SBTTL THE RUN-TIME OVERLAY HANDLER .DSABL GBL .IF NE OVR$XH ;++ ; This version of the overlay handler can be used only for jobs that have ; a dummy root and exactly one virtual overlay. ;-- .ENDC;NE OVR$XH .IF EQ OVR$XH ;+ ; The following code is included in the user's program by the ; linker whenever low memory overlays are requested by the user. ; The run-time low memory overlay handler is called by a dummy ; subroutine of the following form: ; .IF EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; JSR R5,$OVRH ;Call to common code for low memory overlays ; .WORD ;# of desired segment ; .WORD ;Actual core address (virtual address) .IFF;EQ OVR$ID ; .PSECT $ZTABL,I,GBL,OVR ; JSR R5,$OVRH ;Call to common code for low memory overlays ; .PSECT $OTABL,D,GBL,OVR ; .WORD ;# of desired segment ; .WORD ;Actual core address (virtual address) .ENDC;EQ OVR$ID ; ; One dummy routine of the above form is stored in the resident portion ; of the user's program for each entry point to a low memory overlay segment. ; All references to the entry point are modified by the linker to be ; references to the appropriate dummy routine. Each overlay segment ; is called into core as a unit and must be contiguous in core. An ; overlay segment may have any number of entry points, to the limits ; of core memory. Only one segment at a time may occupy an overlay region. ; .ENDC;EQ OVR$XH .IF NE OVR$MP ; If overlays in extended memory are specified, the following dummy subroutine ; is used as the entry point to the extended memory overlay handler. ; .IF EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; JSR R5,$OVRHV ;Call to common code for low memory overlays ; .WORD ;# of desired segment ; .WORD ;Virtual address of segment .IFF;EQ OVR$ID ; .PSECT $ZTABL,I,GBL,OVR ; JSR R5,$OVRHV ;Call to common code for low memory overlays ; .PSECT $OTABL,D,GBL,OVR ; .WORD ;# of desired segment ; .WORD ;Virtual address of segment .ENDC;EQ OVR$ID .ENDC;NE OVR$MP .IF EQ OVR$XH ; ; The segment number is an index into a table of overlay loading blocks. ; The entries for the /O form of overlays contain the following: ; .IF EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; .WORD Segment start address ; .WORD File block number ; .WORD Word count .IFF;EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; .WORD I-Segment start address ; .WORD I-File block number ; .WORD I-Word count ; .WORD D-Segment start address ; .WORD D-File block number ; .WORD D-Word count ; .Page ; The "I-" indicates I space and "D-" D space. If there is no D space ; associated with the I space segment, the three D space words are present ; but contain zeros. .ENDC;EQ OVR$ID .ENDC;EQ OVR$XH ; .IF NE OVR$MP .Page ; The entries for the /V form of overlays contain the following: ; .IF EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; .WORD WDB address ; .WORD File block number ; .WORD Word count .IFF;EQ OVR$ID ; .PSECT $OTABL,D,GBL,OVR ; .WORD I-WDB address ; .WORD I-File block number ; .WORD I-Word count ; .WORD D-WDB address ; .WORD D-File block number ; .WORD D-Word count ; ; The "I-" indicates I space and "D-" D space. If there is no D space ; associated with the I space segment, the three D space words are present ; but contain zeros. .ENDC;EQ OVR$ID ; ; Additional data structures in the extended memory overlay handler and the ; overlay table permit use of extended memory. One region definition ; block is defined in the handler and XM EMTs are also included. Window ; definition blocks for the extended memory partitions follow the dummy ; subroutines in the overlay table. ; .ENDC;NE OVR$MP .IF EQ OVR$ID ; There is one word prefixed to every overlay region that identifies the ; segment currently resident in that overlay region. This word is an index ; into the overlay table and points at the overlay segment information. .IFF;EQ OVR$ID ; There is a three word subroutine prefixed to every I space overlay region ; that returns the segment number of the currently resident segment in R0. ; This value is an index into the overlay table and points at the overlay ; segment information. Since all D space overlay segments are associated ; with a corresponding I space overlay segment, they contain no prefix. .ENDC;EQ OVR$ID ; ; Undefined globals in the overlay handler must be named "$OVDF1" to ; "$OVDFn" such that a range check may be done by LINK to determine if ; the undefined global name is from the overlay handler. A check is ; done on the .RAD50 characters "$OV", and then a range check is done on ; the .RAD50 charaters "DF1" to "DFn". These global symbols do not appear ; on link maps, since their value is not known until after the map has been ; printed. Currently $OVDF1 to $OVDF6 are in use. ; ; Global symbols O$READ and O$DONE are useful when debugging overlaid ; programs. ; ; O$READ will appear in the LINK map and locates the .READW ; statement in the overlay handler. ; ; O$DONE will appear in the LINK map and locates the first ; instruction after the .READW in the overlay handler. ; .IF NE OVR$XH ; To use (X|Y)HANDL, create a root module of the form ; ;NOTE: YHANDL is not (yet) implemented ; ; JSW = 44 ;Job Status Word ; VIRT$ = 2000 ;Virtual bit in JSW ; .ASECT ; .=JSW ;Set location counter to JSW ; .WORD VIRT$ ;Set virtual bit in JSW ; .PSECT ; .GLOBL start ;Start address in overlay ; .END ; ; ; Then use the following LINK command ; LINK root/INCLUDE/PROMPT ; overlay(s)/V:1:1// ; Library search? $OVRH(X|Y) ; Library search? .ENDC;NE OVR$XH ;- .MCALL .READW ..V1.. .IF NE OVR$MP .MCALL .WDBDF .RDBDF .PRINT .EXIT .CRAW .ENDC;NE OVR$MP .MCALL .CKXX .ASSUME .BR ..V1.. ;V1 format .IF NE OVR$MP .WDBDF ;Define WDB offsets .RDBDF ;Define RDB offsets .ENDC;NE OVR$MP .CKXX C.WDB=1234 ;check value for WDB address C.OVR=2234 ;check value for overlay address C.ONUM=60 ;check value for overlay number .LIBRARY "SRC:SYSTEM" .MCALL .EMTDF .ERRDF ..READ .MCALL .OTBDF .OTJDF .OVRDF .SYCDF .UEBDF .VTBDF .IF NE OVR$MP .MCALL ..CRAW ..CRAW ;.CRAW request offsets and values .ENDC;NE OVR$MP .IF NE OVR$ID ..READ .ENDC;NE OVR$ID .EMTDF ;define EMT request numbers .ERRDF ;define error numbers .OTBDF ;overlay table entry definitions (/O) .OTJDF ;overlay jump entry .OVRDF ;overlay handle -- SIPP communications .SYCDF ;SYSCOM area .UEBDF ;user error bit masks .VTBDF ;overlay table entry definitions (/V) OVRCHN =: 17 ;overlay channel number .GLOBL $OVDF1 .GLOBL $OVDF2 .IF NE OVR$MP .GLOBL $OVDF3 .GLOBL $OVDF4 .GLOBL $OVDF5 .IFF;NE OVR$MP .GLOBL $OVTAB .ENDC;NE OVR$MP .IF NE OVR$ID .GLOBL $OVDF6 .ENDC;NE OVR$ID .WEAK $OVTAB .WEAK O$READ .WEAK O$DONE .WEAK $ODF1 .WEAK $ODF2 .IF NE OVR$MP .WEAK $ODF4 .WEAK $ODF5 .ENDC;NE OVR$MP .SBTTL OVERLAY HANDLER CODE .PSECT $OHAND,I,GBL,CON .IF NE OVR$ID .PSECT $ODATA,D,GBL,OVR .IFTF;NE OVR$ID .PSECT $OTABL,D,GBL,OVR .IFT;NE OVR$ID .PSECT $ZTABL,I,GBL,OVR .IFTF;NE OVR$ID .PSECT $OHAND .ENABL LSB .IFT;NE OVR$ID $OVRHZ:: ;Global used to load this variant from library .WEAK $OVRHV .WEAK $OVRH .ENDC;NE OVR$ID .IF NE OVR$XH .IF NE OVR$ID $OVRHY:: ;Global used to load this variant from library .WEAK $OVRHZ .IFF;NE OVR$ID $OVRHX:: ;Global used to load this variant from library .ENDC;NE OVR$ID .WEAK $OVRHV $OVRHV:: ;/V overlay entry point .IFF;NE OVR$XH CK.R5=OTJ.JS+4 .IF NE OVR$MP ;+ ; There are two entry points to the overlay handler: $OVRHV for /V ; (extended memory) overlays, and $OVRH for /O (low memory) overlays. ;- $OVRHV:: ;/V overlay entry point .IF NE OVR$ID INCB VFLAG ;Set /V overlay entry switch .IFF;NE OVR$ID INCB (PC)+ ;Set /V overlay entry switch VFLAG: .WORD 0 ;=0 IF /O ; =1 if /V overlay entry .ENDC;NE OVR$ID .IFF;NE OVR$MP ;+ ; There is one entry point $OVRH for /O (low memory) overlays. ;- .ENDC;NE OVR$MP $OVRH:: ;/O overlay entry point CK.R5A=OTJ.JS+4 MOV R0,-(SP) ;Save registers MOV R1,-(SP) MOV R2,-(SP) .IF NE OVR$ID MOV R3,-(SP) .ENDC;NE OVR$ID .IF EQ OVR$LO .IF EQ OVR$ID ASRB #1 ;First call? .IFF;EQ OVR$ID ASRB OFLAG ;First call? .ENDC;EQ OVR$ID BCC 20$ ;No ;Yes, (and flag is cleared now) MOV $ODF1,R1 ;Start address for clear operation 10$: CMP R1,$ODF2 ;Are we done? BHIS 20$ ;HIS -> done, or no /O overlays CLR (R1)+ ;Clear all low memory overlay regions BR 10$ 20$: .ENDC;EQ OVR$LO .IF NE OVR$ID ADD #$OVDF6-$OVJSR-4,R5 ;Find "inline" parameters ;-4 represents length of JSR R5,X MOV @R5,R1 ;Pickup overlay number ADD #$OVTAB-,R1 ;Calculate table address ;Adjusting for index value CK.R1=VTB.WD .IF NE OVR$DK CK.R1A=OTB.AD .ENDC;NE OVR$DK .IFF;NE OVR$ID .IF NE OVR$MP CK.R5 OTJ.OV .ENDC;NE OVR$MP CK.R5A OTJ.OV MOV @R5,R1 ;Pick up overlay number ADD #$OVTAB-OTB.ES,R1 ;Calculate table address ;Adjusting for index value CK.R1=VTB.WD .IF NE OVR$DK CK.R1A=OTB.AD .ENDC;NE OVR$DK .ENDC;NE OVR$ID CK.R1 VTB.WD,+2 .IF NE OVR$DK CK.R1A OTB.AD,+2 .ENDC;NE OVR$DK MOV (R1)+,R2 ;Get first arg. of overlay seg. entry CK.R2=C.WDB CK.R2A=C.OVR .IF NE OVR$MP TSTB VFLAG ;Is this /V entry? BEQ 60$ ;If non-zero then no .Page ;+ ; Virtual overlay segments in the same region but in different partitions ; use different WDBs. Only one of these windows exists at any time. ; This is because when a new window in a virtual overlay region is created, ; the monitor implicitly eliminates any window that exists in that ; virtual overlay region. Thus, if the called overlay segment is not ; currently mapped, its window must be re-created (.CRAWed) besides ; being mapped. The mapping is done implicitly in the following code ; since the WS.MAP bit is set in all of the virtual overlay segments' ; WDBs. ;- CK.R2 C.WDB .Assume W.NID EQ 0 TSTB @R2 ;Do we need to create a window (.CRAW)? BEQ 30$ ;Yes CK.R2 C.WDB .IF NE OVR$ID CLR R0 CALL @W.NBAS(R2) ;Get index of segment now mapped CK.R0=C.ONUM .IFF;NE OVR$ID MOV @W.NBAS(R2),R0 ;Get index of segment now mapped CK.R0=C.ONUM .ENDC;NE OVR$ID BEQ 30$ ;There isn't one; we must .CRAW CK.R0 C.ONUM .Assume VTB.WD EQ 0 CK.R2 C.WDB .IF NE OVR$ID CMP $OVTAB-(R0),R2 ;Is overlay region same as this one? .IFF;NE OVR$ID CMP $OVTAB-OTB.ES(R0),R2 ;Is overlay region same as this one? .ENDC;NE OVR$ID BEQ 50$ ;If equal, just worry about disk I/O 30$: .IF EQ OVR$ID .CRAW #AREA,R2,CODE=NOSET ;Do the EMT for .CRAW BCS 100$ ;Carry set means error! 50$: .IFF;EQ OVR$ID MOV R2,AREA+A.WDB ;Set pointer to WDB for .CRAW request CALL O$CRAW ;Do the EMT for .CRAW CK.R1 VTB.BK .IF NE OVR$DK CK.R1A OTB.BK .ENDC;NE OVR$DK MOV VTB.ES-VTB.BK(R1),AREA+A.WDB ;Point to D-space WDB (if any) BEQ 50$ ;Branch if no D-space WDB CALL O$CRAW ;Do the EMT for .CRAW 50$: .ENDC;EQ OVR$ID .ENDC;NE OVR$MP .IFT;NE OVR$XH .CRAW #AREA,CODE=NOSET;Do the EMT for .CRAW BCS 90$ ;Carry set means error! .IF NE OVR$ID MOV $OVTAB+VTB.ES,AREA+A.WDB ;Point to D-space WDB (if any) BEQ 50$ ;Branch if no D-space WDB .CRAW #AREA,CODE=NOSET;Do the EMT for .CRAW BCS 90$ ;Carry set means error! 50$: .ENDC;NE OVR$ID MOV #$OVTAB,R1 ;Load table address CK.R1=VTB.WD CK.R1 VTB.WD,+2 MOV (R1)+,R2 ;Get first arg. of overlay seg. entry CK.R2=C.WDB .IFTF;NE OVR$XH .IF NE OVR$MP CK.R2 C.WDB MOV W.NBAS(R2),R2 ;Get memory address of overlay CK.R2=C.OVR .ENDC;NE OVR$MP 60$: .IFF;NE OVR$XH CK.R2A C.OVR ;@R2 is first word in overlay .IF NE OVR$ID CLR R0 ;Return 0 if no overlay present CALL @R2 ;ask for overlay number (returned in R0) CK.R5 OTJ.OV,+2 CK.R5A OTJ.OV,+2 CMP (R5)+,R0 ;Is overlay already resident? .IFF;NE OVR$ID .IF NE OVR$MP CK.R5 OTJ.OV,+2 .ENDC;NE OVR$MP CK.R5A OTJ.OV,+2 CMP (R5)+,@R2 ;Is overlay already resident? .ENDC;NE OVR$ID BEQ 80$ ;Yes, branch to it .ENDC;NE OVR$XH .IF NE OVR$ID MOV #<..ISPA!..CURR!..EMIO>,R3 ;Set current mode / I space CALL O$READ ;Do a mapping-specified read MOV (R1)+,R2 ;Get address of D-space segment or WDB BEQ 80$ ;Branch if there isn't a D-space segment .IF EQ OVR$XH TSTB VFLAG ;Is this /V entry? BEQ 70$ ;If zero then no .ENDC;EQ OVR$XH MOV W.NBAS(R2),R2 ;Get address of D space segment from WDB 70$: MOV #<..DSPA!..CURR!..EMIO>,R3 ;Set current mode / D space CALL O$READ ;Do a mapping-specified read .IFF;NE OVR$ID ;+ ; The .READW arguments are as follows: ; channel number, core address, length to read, relative block on disk. ; These are used in reverse order from that specified in the call. ;- CK.R1 VTB.BK,+2 CK.R1 VTB.SZ .IF NE OVR$DK CK.R1A OTB.BK,+2 CK.R1A OTB.SZ .ENDC;NE OVR$DK O$READ:: .READW OVRCHN,R2,@R1,(R1)+ ;Read from overlay file O$DONE::BCS 90$ ;Branch on error .ENDC;NE OVR$ID .IF NE OVR$XH ;>>>number? 80$: JMP @$OVTAB+14 ;go to first entry address .IFF;NE OVR$XH 80$: ;Restore users registers .IF NE OVR$MP CLRB VFLAG ;Clear /V flag .ENDC;NE OVR$MP .IF NE OVR$ID MOV (SP)+,R3 .ENDC;NE OVR$ID MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .IF NE OVR$MP CK.R5 OTJ.AD .ENDC;NE OVR$MP CK.R5A OTJ.AD MOV @R5,R5 ;Get entry address RTS R5 ;Enter overlay routine and restore user's R5 .ENDC;NE OVR$XH 90$: .IF NE OVR$XH 100$: .ENDC;NE OVR$XH ;+ ;ERROR EMT ...ERR ;System error 10 (OVERLAY I/O) .BYTE 0,ER.OVE ;This get converted by the monitor into SERR -5 "Error reading an overlay" ;- .IF NE OVR$ID O$CRAW: .CRAW #AREA,CODE=NOSET;Do the EMT for .CRAW BCS 100$ ;Carry set means error! RETURN O$READ:: MOV #RAREA+A.BLK,R0 ;Point to request area CK.R0=RAREA+A.BLK CK.R1 VTB.BK,+2 .IF NE OVR$DK CK.R1A OTB.BK,+2 .ENDC;NE OVR$DK CK.R0 RAREA+A.BLK,+2 MOV (R1)+,(R0)+ ;Set block number ;>>> CK.R2 CK.R0 RAREA+A.BUF,+2 MOV R2,(R0)+ ;Set buffer address CK.R1 VTB.SZ,+2 .IF NE OVR$DK CK.R1A OTB.SZ,+2 .ENDC;NE OVR$DK CK.R0 RAREA+A.WCNT,+2 MOV (R1)+,(R0)+ ;Set word count CK.R0 RAREA+A.TYPE,+2 MOV R3,@R0 ;Set current mode / I space MOV #RAREA,R0 ;Point to beginning of request again CK.R0=RAREA CK.R0 RAREA EMT ...REA ;Issue a mapping read request O$DONE::BCS 90$ ;Error (stack alignment NOT required) RETURN .ENDC;NE OVR$ID .IF EQ OVR$XH .IF NE OVR$MP ; ERROR MESSAGE 100$: MOV #MSG2,R0 ;Otherwise error .PRINT ;And print message BISB #,@#$USRRB ;Set error byte .EXIT ;And exit .ENDC;NE OVR$MP .ENDC;EQ OVR$XH .DSABL LSB .IF NE OVR$XH .SBTTL IMPURE AREA .ENDC;NE OVR$XH .IF NE OVR$ID .PSECT $ODATA .ENDC;NE OVR$ID .IF NE OVR$MP .IF EQ OVR$XH .Page .ENABL LC .NLIST BEX ;+ ;ERROR .IF EQ OVR$ID MSG2: .ASCIZ /?VHANDL-F-Window error/ .IFF;EQ OVR$ID MSG2: .ASCIZ /?ZHANDL-F-Window error/ .ENDC;EQ OVR$ID ;- .EVEN .LIST BEX .ENDC;EQ OVR$XH .ENDC;NE OVR$MP .IF NE OVR$ID RAREA: .BYTE OVRCHN,.READ .BLKW /2 .WORD ..WTIO .IF EQ OVR$XH VFLAG: .BYTE 0 ;/V flag, initially zero OFLAG: .BYTE 1 ;One-time flag, initially one .ENDC; EQ OVR$XH .ENDC;NE OVR$ID .IF NE OVR$MP AREA: .WORD .CRAW*^O400+..CRAW,$OVDF4 ;EMT area block for .CRAW .Assume .-AREA GE L.CRAW $ODF5:: .WORD $OVDF5 ;Pointer to word after WDBs in overlay table $ODF4:: .WORD $OVDF4 ;Pointer to start of WDBs in overlay table RGADR: .WORD 0 ;Three word region definition block RGSIZ: .WORD $OVDF3,0 ;$OVDF3 set by LINK = size of region .Assume RGADR+R.GSIZ EQ RGSIZ .ENDC;NE OVR$MP $ODF1:: .WORD $OVDF1 ;High addr root segment + 2 (nxt avail) $ODF2:: .WORD $OVDF2 ;High addr /O overlays + 2 (nxt avail) OVTAB: ;The following are required by SIPP .IF NE OVR$MP!OVR$XH .Assume $ODF5 EQ OVTAB+OVR.EW .Assume $ODF4 EQ OVTAB+OVR.SW .Assume RGSIZ EQ OVTAB+OVR.RS .ENDC;NE OVR$MP!OVR$XH .Assume $ODF1 EQ OVTAB+OVR.ER .Assume $ODF2 EQ OVTAB+OVR.EO .SBTTL $OVTAB OVERLAY TABLE ;+ ; OVERLAY TABLE STRUCTURE: ; ; LOC 64 -> $OVTAB: ; .WORD ,, /O overlays ; LOC 66 -> .WORD ,, /V overlays ; Dummy subroutines for all overlay segments ; $ODF4 -> Window definition blocks for extended memory overlays (/V) ; $ODF5 -> Word after the end of the window definition blocks (/V) ; ;NOTE: description incomplete ;- .PSECT $OTABL $OVTAB:: ;first argument block if I-D version .IF NE OVR$ID .PSECT $ZTABL $OVJSR:: ;first JSR in table if I-D version .ENDC;NE OVR$ID .REM % NOTE: applies to VHANDL only Typical pointer layout for the example program Link/prompt/map ovra/XM ovrb/o:1 ovrc/o:1 ovrd/v:2 ovre/v:2 // OVRA:: CALL OVRB CALL OVRC CALL OVRD CALL OVRE .end OVRA OVR(B,C,D,E):: Call OVRA .end 0064 SV.OVR: [001252]---+ 0066 SV.SEG: [001266]---)-+ | | 1230 AREA: [??????] | | 1232 [??????] | | | | 1234 $ODF5: [$OVDF5]---)-)-+ WDB 1236 $ODF4: [$OVDF4]---)-)-)------>+---------->[000400] 1342 RDB | | | | [000000] 1344 1240 RGADR: [??????] | | | | [000001] 1346 1242 RGSIZ: [$OVDF3] | | | | [177777] 1350 1244 [??????] | | | | [000000] 1352 | | | | [000001] 1354 1246 $ODF1: [$OVDF1]---)-)-)-+ | [000400] 1356 1250 $ODF2: [$OVDF2]---)-)-)-)-+ | WDB <--+ | | | | | +-------->[000400] 1360 1252 $OVTBV: [001416]-----)-)-)-)-+ | | [000000] 1362 1254 [000002] | | | | | | | [000001] 1364 1256 [000003] | | | | | | | [177777] 1366 | | | | v | | [000000] 1370 1260 [001416]-----)-)-)-)-+ | | [000001] 1372 1262 [000003] | | | | | | | [000400] 1374 1264 [000003] | +-)-)-)-)-)--------> ROOT <----+ | | | | | [ CALL ] 1376 OVRA: 1266 [001342]---------)-)-)-+ | +-------[ OVRB ] 1400 1270 [000004] +-----)-)-)---+ | [ CALL ] 1402 1272 [000040] | | | | | +-----[ OVRC ] 1404 | | | | +---+ | [ CALL ] 1406 1274 [001360]---+ | | | | | +---[ OVRD ] 1410 1276 [000005] +-----)-)-)-+ +---+ | [ CALL ] 1412 1300 [000040] | +-)-)-)---)-----)---[ OVRE ] 1414 | | +-)-)---)-----)-->/O region 1302 [JSR,R5]<--+ | | +---)-----)-->[??????] 1416 1304 [$OVRH ] | +-)-----)-----)-->[ CALL ] 1420 OVR(B,C: 1306 [000006] | | | | | [ OVRA ] 1422 1310 [001420]-------)-+ | | | | ^ | | | 1312 [JSR,R5]<------)-)-)-----+ | 1314 [$OVRH ] | | | | 1316 [000014] | | | | 1320 [001420]-------)-+ | | | | | 1322 [JSR,R5]<------)---)-----------+ 1324 [$OVRHV] | +-------------->/V region 1326 [000022] | [??????]20000 1330 [020002]-------)>+---------------->[ CALL ]20002 OVR(D,E: | | [ OVRA ]20004 1332 [JSR,R5]<------+ | [??????]20006 1334 [$OVRHV] | : : 1336 [000030] | 1340 [020002]---------+ % .IIF EQ OVR$XH .END .IIF EQ OVR$ID .END $OVRHX .IIF NE OVR$ID .END $OVRHY