changeset 1082:e9d22ef95f34

Cleaned up code a bit
author boisy
date Tue, 01 Apr 2003 05:24:24 +0000
parents 4e78dd135898
children dc5269071859
files 3rdparty/packages/sierra/objs/sierra.asm
diffstat 1 files changed, 1209 insertions(+), 1215 deletions(-) [+]
line wrap: on
line diff
--- a/3rdparty/packages/sierra/objs/sierra.asm	Tue Apr 01 05:20:45 2003 +0000
+++ b/3rdparty/packages/sierra/objs/sierra.asm	Tue Apr 01 05:24:24 2003 +0000
@@ -1,1215 +1,1209 @@
-********************************************************************
-* SIERRA - Kings Quest III set up module
-*
-* $Id$
-*
-* Ed.    Comments                                       Who YY/MM/DD
-* ------------------------------------------------------------------
-*   0    Disassembly of original distribution and       PWZ 03/01/31
-*        merged in comments from disasm dated 1992
-*   1    Monitor type bug now fixed                     BGP 03/03/10
-
-*Monitor defs
-COMP    equ   0
-RGB     equ   1
-MONO    equ   2
-
-
-* I/O path definitions
-StdIn    equ   0
-StdOut   equ   1
-StdErr   equ   2
-
-         nam   sierra
-         ttl   program module       
-
-* Disassembled 03/01/29 23:22:42 by Disasm v1.6 (C) 1988 by RML
-
-         ifp1
-         use   defsfile
-         use   scfdefs
-         endc
-
-tylg     set   Prgrm+Objct   
-atrv     set   ReEnt+rev
-rev      set   $01
-
-         mod   eom,name,tylg,atrv,start,size
-
-         org   0
-u0000    rmb   2   holds size of data area
-u0002    rmb   1   MMU block # mapped into block #2 -org
-u0003    rmb   1   MMU block # mapped into block #3 -org
-u0004    rmb   2   Hi res screen start address
-u0006    rmb   2   Hi res screen end address  ?????
-u0008    rmb   1   disasm as u0008 rmb 2
-u0009    rmb   1   MMU Block # SIERRA is in  -org
-u000A    rmb   1   double byte MMU Task 1 block 1   
-u000B    rmb   1   value actually resides here
-u000C    rmb   1
-u000D    rmb   1
-u000E    rmb   1
-u000F    rmb   1
-u0010    rmb   1
-u0011    rmb   3
-u0014    rmb   2   Hi res screen start address
-u0016    rmb   2   Hi res screen end address ???
-u0017    rmb   4
-u001C    rmb   2
-u001E    rmb   4
-u0022    rmb   1
-u0023    rmb   1
-u0024    rmb   2   mnln remap value holder
-u0026    rmb   2   scrn remap value holder
-u0028    rmb   2   shdw remap value holder
-u002A    rmb   2   saves stack pointer of caller to sub659
-u002C    rmb   2
-u002E    rmb   16
-u003E    rmb   1
-u003F    rmb   2
-u0041    rmb   1
-u0042    rmb   1   MMU Block # of SIERRA's dsc.
-
-u0043    rmb   2
-u0045    rmb   1   flag after color table sets
-u0046    rmb   2
-u0048    rmb   2
-u004A    rmb   5
-u004F    rmb   4
-u0053    rmb   2   
-u0055    rmb   10
-u005F    rmb   163
-
-*u0102   rmb   327  ---disassembly
-
-u0102    rmb  113
-mtf173   rmb   1    multitasking flag
-scr174   rmb   1    screen number?
-x01076   rmb   212 
-u0249    rmb   1
-u024A    rmb   1
-u024B    rmb   1
-u024C    rmb   497
-
-*u043D   rmb   7106 ---disassembly
-
-u043D    rmb   245
-u0532    rmb   16   vol_handle_table (pointer to file structures)
-u0542    rmb   15  
-u0551    rmb   2    given_pic_data (pointer)
-u0553    rmb   1    monitor type V26_MONITORTYPE
-u0554    rmb   154
-int5EE   rmb   107  Signal Intercept routine from 452 - 4BD
-sub659   rmb   116  Slot to hold subroutine for others uses at 4DA - 54F
-u0xxx    rmb   6450
-size     equ   .
-name     equ   *
-         fcs   /sierra/
-         fcb   $01 
-
-start    equ   *
-L0014   lbra L007D  branch to entry process params
-L0017   lbra L00DB  branch to clean up routines
-
-
-*                   Multi-tasking flag (0=No multitask, 1=multitask) 
-L001A    fcb   $00  we store a value here
-*                   the "old self modifying code" trick
-
-
-* Text strings think this was probably an Info thing
-L001B    fcc   'AGI (c) copyright 1988 SIERRA On-Line'
-         fcc   'CoCo3 version by Chris Iden'
-         fcb   $00
-Infosz   equ   *-L001B
-
-
-* Useage text string
-L005C    fcc   'Usage: Sierra -Rgb -Multitasking'
-         fcb   C$CR
-Usgsz    equ   *-L005C
-
-
-L007D    tfr   s,d     save stack ptr / start of param ptr into d
-*              
-         subd  #$04FF     start of stack/end of data mem ptr
-         std   <u0000     store this value in user var
-         bsr   L009C      branch to input processer routine
-
-L0086    lbsr  L011A      relay call to L0140
-
-L0089    ldd   <u0000     load the data pointer
-         beq   L00DF      if it is zero we have a problem
-         ldd   >$FFA9     ??? MMU task 1 block 1 ???
-         std   <u000A     save the task 1 block one value
-         lda   #$00       clear a to zero 
-         sta   <u0011     save that value
-         ldx   <u0024     set up to jump to mnln and go for it
-         jsr   sub659     code at L04DA plays with mmu blocks
-         rts   
-
-* Process any command line args
-* See F$Fork description 8-15 for entry conditions
-
-L009C    lda   ,x+         get next char after name string
-         cmpa  #C$CR       is it a CR?
-         beq   L00DA       yes exit from routine
-         cmpa  #$2D        is it a dash '-
-         bne   L009C       not a dash go look again
-
-         lda   ,x+         was as dash get the next char
-         ora   #$20        apply mask to lower case
-         cmpa  #$72        is it a 'r ?
-         beq   L00C2       yep go set up for RGB monitor
-         cmpa  #$6D        is it an 'm ? 
-         beq   L00D2       if so go store a flag and continue
-
-*  We've found something other than Mm or Rr after a dash
-*  write usage message and Exit program
-
-         lda   #StdOut     load path std out
-         leax  >L005C,pcr  load address of message
-         ldy   #Usgsz      $0021  load the size of the message
-         os9   I$WritLn    write it
-         clrb              clear the error code (unneeded branch to L00DE) 
-         bra   L00DF       and branch to exit!
-
-* found a "-r"
-L00C2    pshs  x           save x-reg since set stat call uses it
-         lda   #StdOut     $01  set the path number
-         ldb   #SS.Montr   code #$92 sets the monitor type
-         ldx   #RGB        monitor type code $0001
-         os9   I$SetStt    set it up
-         puls  x           fetch our x back assumes call doesn't fail
-         bra   L009C       go process the rest of the parms
-
-* found an "-m"
-L00D2    lda   #$01        we have found a -m and load a flag
-         sta   >L001A,pcr  and stow it in our code area  (SELF MODIFYING)
-         bra   L009C       check for next param
-
-L00DA    rts               return
-
-
-*  This is just a relay call to L0336
-L00DB    lbsr  L0133
-
-L00DE    clrb              NOBODY USES ME ? 
-L00DF    os9   F$Exit      time to check out
-
-* disassembler had a little problem here
-L00E2    fdb   $000C  another prog internal var  
-
-* Are these all data bytes of some kind ???
-* quirky assemblage of bytes
-L00E4    fcb   $02,$2E,$06,$09,$04,$20,$10,$1B
-         fcb   $11,$3D,$17,$29,$33,$3F,$00,$08
-         fcb   $14,$18,$20,$28,$22,$38,$07,$0B
-         fcb   $16,$1F,$27,$2D,$37,$3F
-
-* The disassembly gets confused here with text and the nulls
-*  according to the partial disassembly I recieved these hold
-*  Original MMU block image of second and third blocks of SIERRA  
-*  MORE SELF MODIFYING CODE
-
-L0102    fdb   $0000 Orig MMU block image of 2nd blk of sierra
-L0104    fdb   $0000 Orig MMU block image of 3nd blk of sierra
-
-* Name strings of other modules to load.
-
-L0106    fcc   'Shdw'
-         fcb   C$CR
-
-L010B    fcc   'Scrn'
-         fcb   C$CR
-
-L0110    fcc   'MnLn'
-         fcb   C$CR
-
-
-* Internal variables for self modifying code
-L0115    fcb   $00  Echo
-L0116    fcb   $00  EOF
-L0117    fcb   $00  INTerupt
-L0118    fcb   $00  Quit
-L0119    fcb   $00  Monitor type Coco set to when Sierra ran
-
-
-* L011A called by L0086
-L011A    lbsr  L0140  Clears data area, sets up vars and saves montype
-
-         lbsr  L01AF  Change our process image to dupe block 0 to 1-2
-L0120    lbsr  L01FA  copies two subs to data area so others can use them
-
-         lbsr  L0419  load intercept routine and open /VI and allocate Ram
-         bcs   L0139  if errors occured  close VIRQ device
-
-         lbsr  L0229  NMLoads the three other modules and sets up vals
-         bcs   L0136  problems then unload them
-
-         lbsr  L026B  go set up screens
-         bcs   L0133  problems deallocate them
-         rts   
-
-* clean up and shut down
-L0133    lbsr  L0336  go deallocate hi res screens 
-L0136    lbsr  L0370  unloads the three other modules
-L0139    lbsr  L04BD  Close VIRQ device
-         lbsr  L0388  restore the MMU blocks
-         rts   
-
-* at this point u0000 contains the value of s on entry minus $04FF
-* which should be the size of our initialized data
-* so we don't over write it but clear the rest of the data area
-
-L0140    ldx   #$0002 Init data area from 2-end with 0's
-         ldd   #$0000
-L0146    std   ,x++
-         cmpx  <u0000  should have the value $04FF
-         bcs   L0146   appears this zeros out memory somewhere
-
-* initialize some variables
-         lda   >L001A,pcr  multitasking flag from startup parms
-         sta   mtf173      >$0173       store it
-
-         ldd   #$06CE   why twice
-         std   <u0053
-         std   <u0055
-
-         lda   #$5C
-         sta   >$0101
-
-         lda   #$17
-         sta   >$01D8
-
-         lda   #$0F
-         sta   >$023F
-
-         ldd   #$0000
-         std   <u004F
-
-*  get current montype
-*  GetStat Function Code $92 
-*          Allocates and maps high res screen 
-*          into application address space
-* entry:
-*       a -> path number 
-*       b -> function code $92 (SS.Montr)
-*
-* exit:
-*       x -> monitor type
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-* 
-         lda   #StdOut     $01 path number
-         ldb   #SS.Montr   monitor type code (not listed for getstat $92  
-         os9   I$GetStt    make the call
-         tfr   x,d         save in d appears he expects montype returned
-         stb   >L0119,pcr  trim it to a byte and save it 
-         andb  #$01        mask out mono type only RGB or COMP
-         stb   >$0553      save that value off 
-
-*  set current montype
-*  SetStat Function Code $92 
-*          Allocates and maps high res screen 
-*          into application address space
-* entry:
-*       a -> path number 
-*       b -> function code $92 (SS.Montr)
-*       x -> momitor type
-*            0 = color composite
-*            1 = analog RGB
-*            2 = monochrome composite
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-* 
-         ldx   #RGB        $0001 set type to RGB again as in L00C2
-         lda   #StdOut     $01 set the path
-         ldb   #SS.Montr   Monitor type code $92
-         os9   I$SetStt    make the call
-
-* initialize more variables
-
-         lda   #$32
-         sta   >$0246
-
-         ldd   #$6000   This is the start of high res screen memory
-         std   <u0046
-
-         lda   #$15
-         sta   >$0248
-
-         lda   #$FF   Init 15 bytes at u0532 to $FF 
-         ldb   #$0F
-         ldx   #$0532
-         bsr   L01A3
-         rts   
-
-* Fill routine-one byte pattern
-* Entry: A=Byte to fill with
-*        B=# bytes to fill
-*        X=Start address of fill
-
-L01A3    sta   ,x+
-         decb  
-         bne   L01A3
-         rts   
-
-* Fill routine-two byte pattern
-* Entry: U=2-Byte pattern to fill with
-*        B=# bytes to fill
-*        X=Start address of fill
-*                                     NO BODY CALLS HERE ??
-L01A9    stu   ,x++
-         decb  
-         bne   L01A9
-         rts   
-
-*  Raw disassembly of followin code
-*L01AF    orcc  #$50
-*         ldx   #$0002
-*         stx   <u0022
-*         lda   >$FFAF
-*         sta   <u0008
-*         clr   >$FFA9
-*         ldd   >$2050
-*         anda  #$1F
-*         addd  #$2043
-*         std   <u0043
-*         ldb   >$2050
-*         andb  #$E0
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         ldx   #$FFA0
-*         lda   b,x
-*         sta   <u0042
-*         sta   >$FFA9
-*         ldx   <u0043
-*         ldd   -$01,x
-*         std   >L0102,pcr
-*         ldd   $01,x
-*         std   >L0104,pcr
-*         ldd   -$03,x
-*         std   -$01,x
-*         std   $01,x
-*         tfr   b,a
-*         std   >$FFA9
-*         std   <u0002
-*         andcc #$AF
-*         rts   
-
-**********************************************************
-* COMMENTS FROM CODE RECIEVED
-* Change our process map: 
-*         Blocks 1-2 become duplicates of block 0 (data area... 
-*         changes actual MMU regs themselves & 
-*         changes them in our process descriptor
-*
-* NOTE: SHOULD CHANGE SO IT MAPS IN BLOCK 0 IN AN UNUSED BLOCK 1ST 
-*       TO GET PROCESS DESCRIPTOR DAT IMAGE FOR SIERRA. 
-*       THEN, CAN BUMP BLOCKS AROUND WITH THE ACTUAL BLOCK # 
-*       IN FULL 2 MB RANGE, INSTEAD OF JUST GIME 512K RANGE.
-
-L01AF    orcc  #IntMasks    Shut interrupts off
-         ldx   #$0002       ???
-         stx   <u0022
-
-*        As per above NOTE, should postpone this until we have DAT image 
-*        available for Sierra process
-
-         lda   >$FFAF         Get MMU block # SIERRA is in
-         sta   <u0008         Save it
-         clr   >$FFA9         Map system block 0 into $2000-$3FFF
-         ldd   >D.Proc+$2000  Get SIERRA's process dsc. ptr
-         anda  #$1F           Keep non-MMU dependent address
-
-* NOTE: OFFSET IS STUPID, SHOULD USE EVEN BYTE SO LDD'S BELOW 
-*       CAN USE FASTER LDD ,X INSTEAD OF OFFSET,X
-
-         addd  #$2000+P$DATImg+3  Set up ptr for what we want out of it
-         std   <u0043             Save it
-         ldb   >D.Proc+$2000      Get MSB of SIERRA's process dsc. ptr
-         andb  #$E0               Calculate which 8K block within 
-*                                 system task it's in
-         lsrb  
-         lsrb  
-         lsrb  
-         lsrb  
-         lsrb  
-
-* NOTE: HAVE TO CHANGE THIS TO GET BLOCK #'S FROM SYSTEM DAT IMAGE, 
-*       NOT RAW GIME REGS (TO WORK WITH >512K MACHINES)
-         ldx   #$FFA0       Point to base of System task DAT register set block 0 task 0
-         lda   b,x          Get block # that has process desc. for SIERRA
-         sta   <u0042       Save it
-         sta   >$FFA9       Map in block with process dsc. to $2000-$3FFF
-         ldx   <u0043       Get offset to 2nd 8K block in DAT map for SIERRA
-         ldd   -1,x         Get MMU block # of current 2nd 8k block in SIERRA
-         std   >L0102,pc    Save it
-         ldd   1,x          Get MMU block # of current 3rd 8k block in SIERRA
-         std   >L0104,pc    Save it
-         ldd   -3,x         Get data area block 3 from sierra (1st block)
-         std   -1,x         Move 8k data area to 2nd block
-         std   1,x          And to 3rd block
-         tfr   b,a          D=Raw MMU block # for both
-
-* HAVE TO CHANGE TO ALLOW FOR DISTO DAT EXTENSION
-         std   >$FFA9       Map data area block into both blocks 2&3
-         std   <u0002       Save both block #'s
-         andcc #^IntMasks   Turn interrupts back on
-         rts   
-
-
-* NOTE: 6809/6309 MOD: STUPID. DO LEAX, AND THEN PSHS X
-
-* load first routine
-L01FA    leas  -2,s         Make 2 word buffer on stack
-         leax  >L054F,pc    Point to end of routine
-         stx   ,s           Save ptr
-         leax  >L04DA,pc    Point to routine
-*         ldu   #$0659      Point to place in data area to copy it
-         ldu   #sub659
-L0209    lda   ,x+          Copy routine
-         sta   ,u+
-         cmpx  ,s           Done whole routine yet?
-         blo   L0209        No, keep going
-
-* get next routine interrupt intecept routine
-         leax  >L04BD,pcr   point to end of routine
-         stx   ,s           save pointer
-         leax  >L0452,pcr   point to routine
-         ldu   #int5EE      point to place in data area to copy it
-L021E    lda   ,x+          copy routine
-         sta   ,u+
-         cmpx  ,s           Done whole routine yet?
-         blo   L021E        No, keep going
-         leas  $02,s        clean up stack
-         rts                return
-
-* Called from dispatch table at L0120
-* The last op in the subroutine before this one
-* was a puls a,b after a puhs x and a setsatt call for process+path to VIRQ
-
-L0229    tfr   b,a          don't see what's going on here
-         incb  
-         std   <u001C       but we save off a bunch of values
-
-         addd  #$0202
-         std   <u001E
-
-         addd  #$0202
-         sta   <u005F
-         std   <u000C
-         std   <u000E
-
-         ldu   #$001A
-         stu   <u0028       
-         leax  >L0106,pcr   shdw
-         lbsr  L03D0        NMLoads named module
-         bcs   L026A        return on error
-
-         ldu   #$0012
-         stu   <u0026
-         leax  >L010B,pcr    scrn
-         lbsr  L03D0        NMLoads named module
-         bcs   L026A        return on error
-
-         ldu   #$000A
-         stu   <u0024
-         leax  >L0110,pcr    mnln
-         lbsr  L03D0        NMLoads named module
-
-         leau  >$2000,u
-         stu   <u002E
-L026A    rts   
-
-*****************************************************
-* 
-*  Set up screens 
-*  SetStat Function Code $8B 
-*          Allocates and maps high res screen 
-*          into application address space
-* entry:
-*       a -> path number 
-*       b -> function code $8B (SS.AScrn)
-*       x -> screen type 
-*            0 = 640 x 192 x 2 colors (16K)
-*            1 = 320 x 192 x 4 colors (16K)
-*            2 = 160 x 192 x 16 colors (16K)
-*            3 = 640 x 192 x 4 colors (32K)
-*            4 = 320 x 192 x 16 colors (32K)
-*
-* exit:
-*       x -> application address space of screen
-*       y -> screen number (1-3)
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-* 
-*  Call use VDGINT allocates high res graphics for use with screens 
-*  updated by the process, does not clear the screens only allocates
-*  See OS-9 Technical Reference 8-142 for more details
-*
-
-L026B    leas  -$04,s       mamke room om stack 2 words
-         lda   #$01         Std out
-         ldb   #SS.AScrn    Allocate & map in hi-res screen (VDGINT)
-         ldx   #$0004       320x192x16 screen
-         os9   I$SetStt     Map it in
-         bcs   L02E6        Error, Restore stack & exit
-         tfr   y,d          Move screen # returned to D
-*         stb   >$0174      Save screen #
-         stb   scr174       Save screen #
-
-* call with application address of screen in x
-* returns with values in u
-         lbsr  L03B6        twiddle addresses
-         stu   <u0004       stow it two places
-         stu   <u0014
-
-         leax  >$4000,x     end address ???
-         lbsr  L03B6        twiddle addresses
-         stu   <u0006       stow it in two places
-         stu   <u0016
-
-* TFM for 6309
-         ldu   #$D800       Clear hi-res screen to color 0
-         ldx   #$7800       Screen is from $6000 to $D800
-         ldd   #$0000       (U will end up pointing to beginning of screen)
-L0299    std   ,--u         writes 0000 to screen address and decrements
-         leax  -2,x         decrement x loop counter
-         bne   L0299        keep going till all of screen is cleared
-
-*  Display a screen allocated by SS.AScrn
-*  SetStat Function Code $8C
-*
-* entry:
-*       a -> path number 
-*       b -> function code $8C (SS.DScrn)
-*       y -> screen numbe
-*            0 = text screen (32 x 16)
-*            1-3 = high resolution screen
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-
-         clra               Get screen # to display
-         ldb   scr174
-         tfr   d,y          Y=screen # to display
-         lda   #StdOut      $01  Std out path
-         ldb   #SS.DScrn    Display 320x192x16 screen
-         os9   I$SetStt     make the call
-         bcs   L02E6
-
-         leax  >L00E2,pc   values initialized to is $000C
-         ldb   >$0553      monitor type
-         lda   #$10
-         mul
-         abx               add b to x and stow at x
-
-
-* This loads up the control sequence to set the pallete 1B 31 PRN CTN
-*  PRN palette register 0 - 15, CTN color table 0 - 63
-         lda   #$1B      Escape code
-         sta   ,s        push on stack
-         lda   #$31      Palette code
-         sta   $01,s     push on stack
-         clra            make a zero palette reg value
-         sta   $02,s     push it `
-         ldy   #$0004    sets up # of bytes to write
-L02C8    ldb   ,x+       get value computed above for color table and bump it
-         stb   $03,s     push it
-         pshs  x         save it
-         lda   #StdOut   $01      Std Out path
-         leax  $02,s     start of data to write
-         os9   I$Write   write it
-         bcs   L02E6     error during write clean up stack and leave
-         puls  x         retrieve our x
-         inc   $02,s     this is our palette register value
-         lda   $02,s     we bumped it by one 
-         cmpa  #$10      we loop 15 times to set them all
-         bcs   L02C8     loop
-
-         clr   <u0045    clear a flag in memory
-         lbsr  L02E9     go disable keyboard interrupts
-L02E6    leas  $04,s     clean up stack
-         rts             return
-
-
-*  Raw disassembly of following section
-*L02E9    leas  <-$20,s
-*         lda   #$00
-*         ldb   #$00
-*         leax  ,s
-*         os9   I$GetStt 
-*         bcs   L0332
-*         lda   >L0115,pcr
-*         ldb   $04,x
-*         sta   $04,x
-*         stb   >L0115,pcr
-*         lda   >L0116,pcr
-*         ldb   $0C,x
-*         sta   $0C,x
-*         stb   >L0116,pcr
-*         lda   >L0117,pcr
-*         ldb   <$10,x
-*         sta   <$10,x
-*         stb   >L0117,pcr
-*         lda   >L0118,pcr
-*         ldb   <$11,x
-*         sta   <$11,x
-*         stb   >L0118,pcr
-*         lda   #$00
-*         ldb   #$00
-*         os9   I$SetStt 
-*L0332    leas  <$20,s
-*         rts   
-
-* Kills the echo, eof, int and quit signals
-*  get current options packet
-*  GetStat Function Code $00 
-*          Reads the options section of the path descriptor and
-*          copies it into the 32 byte area pointed to by reg X`
-* entry:
-*       a -> path number 
-*       b -> function code $00 (SS.OPT)
-*       x -> address to recieve status packet
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-* 
-
-L02E9    leas  <-$20,s           Make temp buffer to hold PD.OPT data
-         lda   #StdIn            $00 Get 32 byte PD.OPT from Std In
-         ldb   #SS.OPT           $00
-         leax  ,s                point to our temp buffer
-         os9   I$GetStt          make the call
-         bcs   L0332             error goto exit sub
-
-* NOTE: make sure following lines assemble into 5 bit, not 8 bit
-*       These appear to be loading the  echo EOF, INT and QUIT with 
-*       null values and saving the original ones back to vars
-*       since L0115 - L0118 were initialized with $00
-
-         lda   >L0115,pc
-         ldb   PD.EKO-PD.OPT,x   Get echo option
-         sta   PD.EKO-PD.OPT,x   change echo option no echo
-         stb   >L0115,pc         Save original echo option
-
-         lda   >L0116,pc
-         ldb   PD.EOF-PD.OPT,x   Change EOF char 
-         sta   PD.EOF-PD.OPT,x
-         stb   >L0116,pc
-
-         lda   >L0117,pc
-         ldb   <PD.INT-PD.OPT,x  Change INTerrupt char (normally CTRL-C)
-         sta   <PD.INT-PD.OPT,x
-         stb   >L0117,pc
-
-         lda   >L0118,pc
-         ldb   <PD.QUT-PD.OPT,x  Change QUIT char (normally CTRL-E)
-         sta   <PD.QUT-PD.OPT,x
-         stb   >L0118,pc
-
-*  set current options packet
-*  SetStat Function Code $00 
-*          Writes the options section of the path descriptor 
-*          from the 32 byte area pointed to by reg X`
-* entry:
-*       a -> path number 
-*       b -> function code $00 (SS.OPT)
-*       x -> address holding the status packet
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-* 
-
-*                                x is still pointing to our temp buff
-         lda   #StdIn            $00 Set VDG screen to new options
-         ldb   #SS.OPT           $00
-         os9   I$SetStt          set them to be our new values
-
-L0332    leas  <$20,s            Eat temp stack & return
-         rts   
-
-* raw disassembly
-*L0336    leas  -$02,s
-*         tst   >$0174
-*         beq   L036D
-*         lbsr  L02E9
-*         bcs   L036D
-**         lda   #$1B
-*         sta   ,s
-*         lda   #$30
-*         sta   $01,s
-*         ldy   #$0002
-*         lda   #$01
-*         leax  ,s
-*         os9   I$Write  
-*         bcs   L036D
-*         ldb   #$8C
-*         ldy   #$0000
-*         os9   I$SetStt 
-*         clra  
-*         ldb   >$0174
-*         tfr   d,y
-*         lda   #$01
-*         ldb   #$8D
-*         os9   I$SetStt 
-*L036D    leas  $02,s
-*         rts   
-
-
-*  Return the screen to default text sreen and its values
-*  deallocate and free memory of high res screen created
-
-L0336    leas  -2,s         Make temp buffer to hold write data
-*         tst   >$0174       Any hi-res screen # allocated?
-         tst   scr174       Any hi-res screen # allocated?
-         beq   L036D        No, restore stack & return
-         lbsr  L02E9        go change the echo,eof,int and quit settings
-         bcs   L036D        had an error restore stack and return
-         lda   #$1B         Setup DefColr sequence in temp buffer
-         sta   ,s
-         lda   #$30         Sets palettes back to default color
-         sta   1,s
-         ldy   #$0002       number of bytes to write 
-         lda   #StdOut      path to write to $01
-         leax  ,s           point x a buffer
-         os9   I$Write      write
-         bcs   L036D        we have an error clean stack and leave
-
-*  Display a screen allocated by SS.AScrn
-*  SetStat Function Code $8C
-*
-* entry:
-*       a -> path number 
-*       b -> function code $8C (SS.DScrn)
-*       y -> screen numbe
-*            0 = text screen (32 x 16)
-*            1-3 = high resolution screen
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-
-*                           a is still set to stdout from above
-         ldb   #SS.DScrn   Display screen function code
-         ldy   #$0000      Display screen #0 (lo-res or 32x16 text)
-         os9   I$SetStt    make the call
-
-*  Frees the memory of a screen allocated by SS.AScrn
-*  SetStat Function Code $8C
-*
-* entry:
-*       a -> path number 
-*       b -> function code $8D (SS.FScrn)
-*       y -> screen number 1-3 = high resolution screen
-*
-* error:
-*       CC -> Carry set on error
-*       b  -> error code (if any)
-
-         clra               clear high byte
-         ldb   scr174       Get hi-res screen # again
-         tfr   d,y          move it to Y=screen #
-         lda   #StdOut      set the path $01
-         ldb   #SS.FSCrn    Return screen memory to system
-         os9   I$SetStt     amke the call
-
-L036D    leas  2,s          Eat stack & return
-         rts   
-
-
-
-*  Unload the other modules
-L0370    leax  >L0106,pcr    shdw name string
-         lda   #Prgrm+Objct  #$11        module type
-         lbsr  L040B         unload it
-         leax  >L010B,pcr    scrn name string
-         lbsr  L040B         unload it
-         leax  >L0110,pcr    mnln name string
-         lbsr  L040B         unload it 
-         rts   
-
-*L0388    orcc  #$50
-*         lda   <u0042
-*         sta   >$FFA9
-*         ldx   <u0043
-*         ldd   >L0104,pcr
-*         std   $01,x
-*         stb   >$FFAA
-*         ldd   >L0102,pcr
-*         std   -$01,x
-*         stb   >$FFA9
-*         andcc #$AF
-*         clra  
-*         ldb   >L0119,pcr
-*         andb  #$03
-*         tfr   d,x
-*         lda   #$01
-*         ldb   #$92
-*         os9   I$SetStt 
-*         rts   
-**
-*L03B6    tfr   x,d
-*         exg   a,b
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         lsrb  
-*         pshs  b
-*         ldu   #$FFA8
-*         lda   b,u
-*         incb  
-*         andb  #$07
-*         ldb   b,u
-*         tfr   d,u
-*         puls  a
-*         rts   
-
-
-* Restore original MMU block numbers
-L0388    orcc  #IntMasks    Shut off interrupts
-         lda   <u0042       get MMU Block #
-         sta   >$FFA9       Restore original block 0 onto MMU
-         ldx   <u0043
-         ldd   >L0104,pc    Origanl 3rd block of MMU
-         std   1,x
-         stb   >$FFAA       Restore original block 1 onto MMU
-         ldd   >L0102,pc    Original 2nd block of MMU
-         std   -1,x
-         stb   >$FFA9       Restore block 0 again
-         andcc #^IntMasks   Turn interrupts back on
-
-*  return monitor type to original value
-         clra  
-         ldb   >L0119,pc    Get original monitor type
-         andb  #$03         Force to only legit values
-         tfr   d,x          Move to proper register
-         lda   #StdOut      set path $01
-         ldb   #SS.Montr    Restore original monitor type
-         os9   I$SetStt     make the call
-         rts   
-
-* twiddles address 
-* called with value to be twiddled in X
-* returns block # in a 
-*         ?????   in u
-L03B6    tfr   x,d          Move address to D
-         exg   a,b          Swap MSB/LSB
-         lsrb               Divide MSB by 32 (calculate 8k block # in proc map)
-         lsrb  
-         lsrb  
-         lsrb  
-         lsrb  
-         pshs  b            Save block # in process map
-         ldu   #$FFA8       Point to start of user DAT image
-         lda   b,u
-         incb  
-         andb  #$07
-         ldb   b,u
-         tfr   d,u
-         puls  a
-         rts   
-
-
-
-*************************************************************
-*  Called from  within sub at L0229
-*  entry:
-*	x -> is loaded with the address of the name string to load
-*       u -> contains some arbitrary value
-*
-
-L03D0    leas  -$08,s       Make a little scratch on the stack
-         stu   ,s           pointer to our buffer
-
-* Loads one or more modules from a file but does not map the module
-* into user's address space F$NMLoad
-* entry:
-*      a -> type/language byte
-*      x -> address of the path list
-*           with out path list default path is current execution dir
-*
-* exit:
-*      a -> type/language
-*      b -> module revision
-*      x -> address of the last byte in the pathlist + 1
-*      y -> storageb requirements of the module
-*
-* error:
-*      b  -> error code if any
-*      cc -> carry set on error
-
-         stx   $02,s        pointer module name
-         lda   #Prgrm+Objct $11      module type
-         os9   F$NMLoad     Load it but don't map it in
-         bcs   L0408        exit on error
-
-* Links to a memory module that has the specified name, language and type
-* entry:
-*      a -> type/language byte
-*      x -> address of the module name
-*
-* exit:
-*      a -> type/language
-*      b -> attributes/module revision
-*      x -> address of the last byte in the modulename + 1
-*      y -> module entry point absolute address
-*      u -> module header abosolute address
-*
-* error:
-*     cc -> set on error
-
-         ldx   $02,s        get our name string again
-         os9   F$Link       link it
-         bcs   L0408        exit on error
-         stu   $06,s        store module header address
-         tfr   u,x
-L03E8    stx   $04,s
-         lbsr  L03B6        Go twiddle with address`
-         ldx   ,s
-         leax  a,x
-         exg   d,u
-         sta   ,x
-         exg   d,u
-         cmpa  #$06
-         beq   L0403
-         ldx   $04,s
-         leax  >$2000,x
-         bra   L03E8
-
-L0403    ldu   $06,s
-         os9   F$UnLink 
-L0408    leas  $08,s
-         rts   
-
-L040B    os9   F$UnLoad  Unlink a module by name
-         bcc   L040B
-         clrb  
-         rts   
-
-L0412    fcc   '/VI'
-L0415    fcb   C$CR
-L0416    fdb   $0000  address of the device table entry
-L0418    fcb   $00    path number to device
-
-**************************************************************
-*
-*   subroutine entry is L0419 
-*   sets up Sig Intercept 
-*   verifies /VI device is loaded links to it 
-*   and allocates ram for it
-*   called from dispatch table around L0120
-
-
-* Set signal intercept trap
-*  entry: 
-*        x -> address of intercept routine
-*        u -> starting adress of routines memory area
-*  exit:
-*       Signals sent to the process cause the intercept to be
-*       called instead of the process being killed
-
-L0419    ldu   #$0000     start of Sierra memory area
-         ldx   #int5EE    Intercept rourtine copied to mem area
-         os9   F$Icpt     install the trap
-
-* Attach to the vrt memory descriptor
-* Attaches and verifies loaded the VI descriptor
-* entry:
-*      a -> access mode
-*          0 = use any special device capabilities
-*          1 = read only
-*          2 = write only
-*          3 = update (read and write)
-*      x -> address of device name string
-*
-* exit:
-*      x -> updated past device name
-*      u -> address of device table entry
-*
-* error:
-*      b  -> error code (if any)
-*      cc -> carry set on error
-
-         lda   #$01          attach for read
-         leax  >L0412+1,pcr  skip the slash Load VI only
-         os9   I$Attach      make the call
-         bcs   L0451         didn't work exit
-         stu   >L0416,pcr    did work save address 
-
-* Open a path to the device /VI
-* entry:
-*       a -> access mode (D S PE PW PR E W R)
-*       x -> address of the path list
-*
-* exit:
-*       a -> path number
-*       x -> address of the last byte if the pathlist + 1
-*
-* error:
-*       b  -> error code(if any)
-*       cc -> carry set on error
-*
-*                            a still contains $01 read
-         leax  >L0412,pcr    load with device name including /
-         os9   I$Open        make the call
-         bcs   L0451         didn't work exit
-         sta   >L0418,pcr    did work save path #
-
-* Allocate process+path RAM blocks
-
-         ldb   #SS.ARAM      $CA function code for VIRQ
-         ldx   #$000C
-         os9   I$SetStt      make the call
-         bcs   L0451
-         pshs  x
-
-* Set process+path VIRQ KQ3
-         ldb   #SS.KSet     $C8 function code for VIRQ
-         os9   I$SetStt 
-         puls  b,a
-L0451    rts   
-
-* Signal Intercept processing gets copied to int5EE mem slot
-L0452    cmpb  #$80     b gets the signal code if not $80 ignore
-         bne   L0464    $80 is user defined
-         tfr   u,d
-         tfr   a,dp
-         dec   <u004A
-         bne   L0464
-         bsr   L0465
-         lda   #$03
-         sta   <u004A
-L0464    rti   
-
-L0465    inc   >u024C,u
-         bne   L047B
-         inc   >u024B,u
-         bne   L047B
-         inc   >u024A,u
-         bne   L047B
-         inc   >u0249,u
-L047B    tst   >u0102,u
-         bne   L04BC
-         inc   <u003F
-         bne   L0487
-         inc   <u003E
-L0487    ldd   <u0048
-         addd  #$0001
-         std   <u0048
-         cmpd  #$0014
-         bcs   L04BC
-         subd  #$0014
-         std   <u0048
-         ldd   #$003C
-         leax  >u043D,u
-         inc   ,x
-         cmpb  ,x
-         bhi   L04BC
-         sta   ,x+
-         inc   ,x
-         cmpb  ,x
-         bhi   L04BC
-         sta   ,x+
-         inc   ,x
-         ldb   #$18
-         cmpb  ,x
-         bhi   L04BC
-         sta   ,x+
-         inc   ,x
-L04BC    rts   
-
-* deallocates the VIRQ device
-L04BD    lda   >L0418,pcr  load path number to /VI device
-         beq   L04D0       no path open check for device table addr
-         ldb   #SS.KClr    $C9 Clear KQ3 VIRQ       
-         os9   I$SetStt    make the call
-         ldb   #SS.DRAM    $CB deallocate the ram    
-         os9   I$SetStt    make the call
-         os9   I$Close     close the path to /VI
-L04D0    ldu   >L0416,pcr  load device table address for VI
-         beq   L04D9       don't have one leave now
-         os9   I$Detach    else detach it
-L04D9    rts   
-
-*  Twiddles with MMU blocks for us
-*  This sub gets copied into $0659 and executed there from this and
-*  the other modules this one loads (sub659)
-*
-*  s and x loaded by calling routine
-
-L04DA    ldd   ,s++       load d with current stack pointer and bump it
-*                         from mnln we come in with $4040
-         std   <u002A     save the calling stack pointer in u002A
-         orcc  #IntMasks  mask the interrupts
-         lda   <u0042
-         sta   ,x         x is loaded with value from u0028 in mnln
-         sta   >$FFA9  task 1 block 2 x2000 - x3FFF
-         ldu   <u0043
-         lda   $06,x
-         sta   u000C,u
-         sta   >$FFAF  task 1 block 8 xE000 - xFFFF
-         lda   $05,x
-         sta   u000A,u
-         sta   >$FFAE  task 1 block 7 xC000 - xDFFF
-         lda   $04,x
-         sta   u0008,u
-         sta   >$FFAD  task 1 block 6 xA000 - xBFFF
-         lda   $03,x
-         sta   u0006,u
-         sta   >$FFAC  task 1 block 5 x8000 - x9FFF
-         lda   $02,x
-         sta   u0004,u
-         sta   >$FFAB  task 1 block 4 x6000 - x7FFF
-         andcc #^IntMasks   unmask interrupts  
-
-         lda   $07,x
-         ldu   <u002E
-         adda  u000A,u
-         jsr   a,u
-
-         orcc  #IntMasks
-         lda   <u0042
-         sta   >$FFA9
-         ldu   <u0043
-         lda   <u0010
-         sta   u000C,u
-         sta   >$FFAF
-         lda   <u000F
-         sta   u000A,u
-         sta   >$FFAE
-         lda   <u000E
-         sta   u0008,u
-         sta   >$FFAD
-         lda   <u000D
-         sta   u0006,u
-         sta   >$FFAC
-         lda   <u000B
-         sta   u0002,u
-         sta   >$FFAA
-         lda   <u000A
-         sta   ,u
-         sta   >$FFA9
-         andcc #^IntMasks
-
-         jmp   [>$002A]
-
-L054F    fcb   $00,$00,$00,$00,$00,$00,$00,$00   ........
-L0557    fcb   $73,$69,$65,$72,$72,$61,$00       sierra.
-         emod
-eom      equ   *
+********************************************************************
+* sierra - King's Quest III setup module
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*   0    Disassembly of original distribution and       PWZ 03/01/31
+*        merged in comments from disasm dated 1992
+*   1    Monitor type bug now fixed                     BGP 03/03/10
+
+*Monitor defs
+COMP    equ   0
+RGB     equ   1
+MONO    equ   2
+
+
+* I/O path definitions
+StdIn    equ   0
+StdOut   equ   1
+StdErr   equ   2
+
+         nam   sierra
+         ttl   King's Quest III setup module
+
+         ifp1
+         use   defsfile
+         use   scfdefs
+         endc
+
+tylg     set   Prgrm+Objct   
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   1
+
+         mod   eom,name,tylg,atrv,start,size
+
+         org   0
+u0000    rmb   2   holds size of data area
+u0002    rmb   1   MMU block # mapped into block #2 -org
+u0003    rmb   1   MMU block # mapped into block #3 -org
+u0004    rmb   2   Hi res screen start address
+u0006    rmb   2   Hi res screen end address  ?????
+u0008    rmb   1   disasm as u0008 rmb 2
+u0009    rmb   1   MMU Block # SIERRA is in  -org
+u000A    rmb   1   double byte MMU Task 1 block 1   
+u000B    rmb   1   value actually resides here
+u000C    rmb   1
+u000D    rmb   1
+u000E    rmb   1
+u000F    rmb   1
+u0010    rmb   1
+u0011    rmb   3
+u0014    rmb   2   Hi res screen start address
+u0016    rmb   2   Hi res screen end address ???
+u0017    rmb   4
+u001C    rmb   2
+u001E    rmb   4
+u0022    rmb   1
+u0023    rmb   1
+u0024    rmb   2   mnln remap value holder
+u0026    rmb   2   scrn remap value holder
+u0028    rmb   2   shdw remap value holder
+u002A    rmb   2   saves stack pointer of caller to sub659
+u002C    rmb   2
+u002E    rmb   16
+u003E    rmb   1
+u003F    rmb   2
+u0041    rmb   1
+u0042    rmb   1   MMU Block # of SIERRA's dsc.
+u0043    rmb   2
+u0045    rmb   1   flag after color table sets
+u0046    rmb   2
+u0048    rmb   2
+u004A    rmb   5
+u004F    rmb   4
+u0053    rmb   2   
+u0055    rmb   10
+u005F    rmb   163
+u0102    rmb   113
+mtf173   rmb   1    multitasking flag
+scr174   rmb   1    screen number?
+x01076   rmb   212 
+u0249    rmb   1
+u024A    rmb   1
+u024B    rmb   1
+u024C    rmb   497
+u043D    rmb   245
+u0532    rmb   16   vol_handle_table (pointer to file structures)
+u0542    rmb   15  
+u0551    rmb   2    given_pic_data (pointer)
+u0553    rmb   1    monitor type V26_MONITORTYPE
+u0554    rmb   154
+int5EE   rmb   107  Signal Intercept routine from 452 - 4BD
+sub659   rmb   116  Slot to hold subroutine for others uses at 4DA - 54F
+u0xxx    rmb   6450
+size     equ   .
+
+name     fcs   /sierra/
+         fcb   edition
+
+start    equ   *
+L0014   lbra L007D  branch to entry process params
+L0017   lbra L00DB  branch to clean up routines
+
+
+*                   Multi-tasking flag (0=No multitask, 1=multitask) 
+L001A    fcb   $00  we store a value here
+*                   the "old self modifying code" trick
+
+
+* Text strings think this was probably an Info thing
+L001B    fcc   'AGI (c) copyright 1988 SIERRA On-Line'
+         fcc   'CoCo3 version by Chris Iden'
+         fcb   $00
+Infosz   equ   *-L001B
+
+
+* Useage text string
+L005C    fcc   'Usage: Sierra -Rgb -Multitasking'
+         fcb   C$CR
+Usgsz    equ   *-L005C
+
+
+L007D    tfr   s,d     save stack ptr / start of param ptr into d
+*              
+         subd  #$04FF     start of stack/end of data mem ptr
+         std   <u0000     store this value in user var
+         bsr   L009C      branch to input processer routine
+
+L0086    lbsr  L011A      relay call to L0140
+
+L0089    ldd   <u0000     load the data pointer
+         beq   L00DF      if it is zero we have a problem
+         ldd   >$FFA9     ??? MMU task 1 block 1 ???
+         std   <u000A     save the task 1 block one value
+         lda   #$00       clear a to zero 
+         sta   <u0011     save that value
+         ldx   <u0024     set up to jump to mnln and go for it
+         jsr   sub659     code at L04DA plays with mmu blocks
+         rts   
+
+* Process any command line args
+* See F$Fork description 8-15 for entry conditions
+
+L009C    lda   ,x+         get next char after name string
+         cmpa  #C$CR       is it a CR?
+         beq   L00DA       yes exit from routine
+         cmpa  #$2D        is it a dash '-
+         bne   L009C       not a dash go look again
+
+         lda   ,x+         was as dash get the next char
+         ora   #$20        apply mask to lower case
+         cmpa  #$72        is it a 'r ?
+         beq   L00C2       yep go set up for RGB monitor
+         cmpa  #$6D        is it an 'm ? 
+         beq   L00D2       if so go store a flag and continue
+
+*  We've found something other than Mm or Rr after a dash
+*  write usage message and Exit program
+
+         lda   #StdOut     load path std out
+         leax  >L005C,pcr  load address of message
+         ldy   #Usgsz      $0021  load the size of the message
+         os9   I$WritLn    write it
+         clrb              clear the error code (unneeded branch to L00DE) 
+         bra   L00DF       and branch to exit!
+
+* found a "-r"
+L00C2    pshs  x           save x-reg since set stat call uses it
+         lda   #StdOut     $01  set the path number
+         ldb   #SS.Montr   code #$92 sets the monitor type
+         ldx   #RGB        monitor type code $0001
+         os9   I$SetStt    set it up
+         puls  x           fetch our x back assumes call doesn't fail
+         bra   L009C       go process the rest of the parms
+
+* found an "-m"
+L00D2    lda   #$01        we have found a -m and load a flag
+         sta   >L001A,pcr  and stow it in our code area  (SELF MODIFYING)
+         bra   L009C       check for next param
+
+L00DA    rts               return
+
+
+*  This is just a relay call to L0336
+L00DB    lbsr  L0133
+
+L00DE    clrb              NOBODY USES ME ? 
+L00DF    os9   F$Exit      time to check out
+
+* disassembler had a little problem here
+L00E2    fdb   $000C  another prog internal var  
+
+* Are these all data bytes of some kind ???
+* quirky assemblage of bytes
+L00E4    fcb   $02,$2E,$06,$09,$04,$20,$10,$1B
+         fcb   $11,$3D,$17,$29,$33,$3F,$00,$08
+         fcb   $14,$18,$20,$28,$22,$38,$07,$0B
+         fcb   $16,$1F,$27,$2D,$37,$3F
+
+* The disassembly gets confused here with text and the nulls
+*  according to the partial disassembly I recieved these hold
+*  Original MMU block image of second and third blocks of SIERRA  
+*  MORE SELF MODIFYING CODE
+
+L0102    fdb   $0000 Orig MMU block image of 2nd blk of sierra
+L0104    fdb   $0000 Orig MMU block image of 3nd blk of sierra
+
+* Name strings of other modules to load.
+
+L0106    fcc   'Shdw'
+         fcb   C$CR
+
+L010B    fcc   'Scrn'
+         fcb   C$CR
+
+L0110    fcc   'MnLn'
+         fcb   C$CR
+
+
+* Internal variables for self modifying code
+L0115    fcb   $00  Echo
+L0116    fcb   $00  EOF
+L0117    fcb   $00  INTerupt
+L0118    fcb   $00  Quit
+L0119    fcb   $00  Monitor type Coco set to when Sierra ran
+
+
+* L011A called by L0086
+L011A    lbsr  L0140  Clears data area, sets up vars and saves montype
+
+         lbsr  L01AF  Change our process image to dupe block 0 to 1-2
+L0120    lbsr  L01FA  copies two subs to data area so others can use them
+
+         lbsr  L0419  load intercept routine and open /VI and allocate Ram
+         bcs   L0139  if errors occured  close VIRQ device
+
+         lbsr  L0229  NMLoads the three other modules and sets up vals
+         bcs   L0136  problems then unload them
+
+         lbsr  L026B  go set up screens
+         bcs   L0133  problems deallocate them
+         rts   
+
+* clean up and shut down
+L0133    lbsr  L0336  go deallocate hi res screens 
+L0136    lbsr  L0370  unloads the three other modules
+L0139    lbsr  L04BD  Close VIRQ device
+         lbsr  L0388  restore the MMU blocks
+         rts   
+
+* at this point u0000 contains the value of s on entry minus $04FF
+* which should be the size of our initialized data
+* so we don't over write it but clear the rest of the data area
+
+L0140    ldx   #$0002 Init data area from 2-end with 0's
+         ldd   #$0000
+L0146    std   ,x++
+         cmpx  <u0000  should have the value $04FF
+         bcs   L0146   appears this zeros out memory somewhere
+
+* initialize some variables
+         lda   >L001A,pcr  multitasking flag from startup parms
+         sta   mtf173      >$0173       store it
+
+         ldd   #$06CE   why twice
+         std   <u0053
+         std   <u0055
+
+         lda   #$5C
+         sta   >$0101
+
+         lda   #$17
+         sta   >$01D8
+
+         lda   #$0F
+         sta   >$023F
+
+         ldd   #$0000
+         std   <u004F
+
+*  get current montype
+*  GetStat Function Code $92 
+*          Allocates and maps high res screen 
+*          into application address space
+* entry:
+*       a -> path number 
+*       b -> function code $92 (SS.Montr)
+*
+* exit:
+*       x -> monitor type
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+* 
+         lda   #StdOut     $01 path number
+         ldb   #SS.Montr   monitor type code (not listed for getstat $92  
+         os9   I$GetStt    make the call
+         tfr   x,d         save in d appears he expects montype returned
+         stb   >L0119,pcr  trim it to a byte and save it 
+         andb  #$01        mask out mono type only RGB or COMP
+         stb   >$0553      save that value off 
+
+*  set current montype
+*  SetStat Function Code $92 
+*          Allocates and maps high res screen 
+*          into application address space
+* entry:
+*       a -> path number 
+*       b -> function code $92 (SS.Montr)
+*       x -> momitor type
+*            0 = color composite
+*            1 = analog RGB
+*            2 = monochrome composite
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+* 
+         ldx   #RGB        $0001 set type to RGB again as in L00C2
+         lda   #StdOut     $01 set the path
+         ldb   #SS.Montr   Monitor type code $92
+         os9   I$SetStt    make the call
+
+* initialize more variables
+
+         lda   #$32
+         sta   >$0246
+
+         ldd   #$6000   This is the start of high res screen memory
+         std   <u0046
+
+         lda   #$15
+         sta   >$0248
+
+         lda   #$FF   Init 15 bytes at u0532 to $FF 
+         ldb   #$0F
+         ldx   #$0532
+         bsr   L01A3
+         rts   
+
+* Fill routine-one byte pattern
+* Entry: A=Byte to fill with
+*        B=# bytes to fill
+*        X=Start address of fill
+
+L01A3    sta   ,x+
+         decb  
+         bne   L01A3
+         rts   
+
+* Fill routine-two byte pattern
+* Entry: U=2-Byte pattern to fill with
+*        B=# bytes to fill
+*        X=Start address of fill
+*                                     NO BODY CALLS HERE ??
+L01A9    stu   ,x++
+         decb  
+         bne   L01A9
+         rts   
+
+*  Raw disassembly of followin code
+*L01AF    orcc  #$50
+*         ldx   #$0002
+*         stx   <u0022
+*         lda   >$FFAF
+*         sta   <u0008
+*         clr   >$FFA9
+*         ldd   >$2050
+*         anda  #$1F
+*         addd  #$2043
+*         std   <u0043
+*         ldb   >$2050
+*         andb  #$E0
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         ldx   #$FFA0
+*         lda   b,x
+*         sta   <u0042
+*         sta   >$FFA9
+*         ldx   <u0043
+*         ldd   -$01,x
+*         std   >L0102,pcr
+*         ldd   $01,x
+*         std   >L0104,pcr
+*         ldd   -$03,x
+*         std   -$01,x
+*         std   $01,x
+*         tfr   b,a
+*         std   >$FFA9
+*         std   <u0002
+*         andcc #$AF
+*         rts   
+
+**********************************************************
+* COMMENTS FROM CODE RECIEVED
+* Change our process map: 
+*         Blocks 1-2 become duplicates of block 0 (data area... 
+*         changes actual MMU regs themselves & 
+*         changes them in our process descriptor
+*
+* NOTE: SHOULD CHANGE SO IT MAPS IN BLOCK 0 IN AN UNUSED BLOCK 1ST 
+*       TO GET PROCESS DESCRIPTOR DAT IMAGE FOR SIERRA. 
+*       THEN, CAN BUMP BLOCKS AROUND WITH THE ACTUAL BLOCK # 
+*       IN FULL 2 MB RANGE, INSTEAD OF JUST GIME 512K RANGE.
+
+L01AF    orcc  #IntMasks    Shut interrupts off
+         ldx   #$0002       ???
+         stx   <u0022
+
+*        As per above NOTE, should postpone this until we have DAT image 
+*        available for Sierra process
+
+         lda   >$FFAF         Get MMU block # SIERRA is in
+         sta   <u0008         Save it
+         clr   >$FFA9         Map system block 0 into $2000-$3FFF
+         ldd   >D.Proc+$2000  Get SIERRA's process dsc. ptr
+         anda  #$1F           Keep non-MMU dependent address
+
+* NOTE: OFFSET IS STUPID, SHOULD USE EVEN BYTE SO LDD'S BELOW 
+*       CAN USE FASTER LDD ,X INSTEAD OF OFFSET,X
+
+         addd  #$2000+P$DATImg+3  Set up ptr for what we want out of it
+         std   <u0043             Save it
+         ldb   >D.Proc+$2000      Get MSB of SIERRA's process dsc. ptr
+         andb  #$E0               Calculate which 8K block within 
+*                                 system task it's in
+         lsrb  
+         lsrb  
+         lsrb  
+         lsrb  
+         lsrb  
+
+* NOTE: HAVE TO CHANGE THIS TO GET BLOCK #'S FROM SYSTEM DAT IMAGE, 
+*       NOT RAW GIME REGS (TO WORK WITH >512K MACHINES)
+         ldx   #$FFA0       Point to base of System task DAT register set block 0 task 0
+         lda   b,x          Get block # that has process desc. for SIERRA
+         sta   <u0042       Save it
+         sta   >$FFA9       Map in block with process dsc. to $2000-$3FFF
+         ldx   <u0043       Get offset to 2nd 8K block in DAT map for SIERRA
+         ldd   -1,x         Get MMU block # of current 2nd 8k block in SIERRA
+         std   >L0102,pc    Save it
+         ldd   1,x          Get MMU block # of current 3rd 8k block in SIERRA
+         std   >L0104,pc    Save it
+         ldd   -3,x         Get data area block 3 from sierra (1st block)
+         std   -1,x         Move 8k data area to 2nd block
+         std   1,x          And to 3rd block
+         tfr   b,a          D=Raw MMU block # for both
+
+* HAVE TO CHANGE TO ALLOW FOR DISTO DAT EXTENSION
+         std   >$FFA9       Map data area block into both blocks 2&3
+         std   <u0002       Save both block #'s
+         andcc #^IntMasks   Turn interrupts back on
+         rts   
+
+
+* NOTE: 6809/6309 MOD: STUPID. DO LEAX, AND THEN PSHS X
+
+* load first routine
+L01FA    leas  -2,s         Make 2 word buffer on stack
+         leax  >L054F,pc    Point to end of routine
+         stx   ,s           Save ptr
+         leax  >L04DA,pc    Point to routine
+*         ldu   #$0659      Point to place in data area to copy it
+         ldu   #sub659
+L0209    lda   ,x+          Copy routine
+         sta   ,u+
+         cmpx  ,s           Done whole routine yet?
+         blo   L0209        No, keep going
+
+* get next routine interrupt intecept routine
+         leax  >L04BD,pcr   point to end of routine
+         stx   ,s           save pointer
+         leax  >L0452,pcr   point to routine
+         ldu   #int5EE      point to place in data area to copy it
+L021E    lda   ,x+          copy routine
+         sta   ,u+
+         cmpx  ,s           Done whole routine yet?
+         blo   L021E        No, keep going
+         leas  $02,s        clean up stack
+         rts                return
+
+* Called from dispatch table at L0120
+* The last op in the subroutine before this one
+* was a puls a,b after a puhs x and a setsatt call for process+path to VIRQ
+
+L0229    tfr   b,a          don't see what's going on here
+         incb  
+         std   <u001C       but we save off a bunch of values
+
+         addd  #$0202
+         std   <u001E
+
+         addd  #$0202
+         sta   <u005F
+         std   <u000C
+         std   <u000E
+
+         ldu   #$001A
+         stu   <u0028       
+         leax  >L0106,pcr   shdw
+         lbsr  L03D0        NMLoads named module
+         bcs   L026A        return on error
+
+         ldu   #$0012
+         stu   <u0026
+         leax  >L010B,pcr    scrn
+         lbsr  L03D0        NMLoads named module
+         bcs   L026A        return on error
+
+         ldu   #$000A
+         stu   <u0024
+         leax  >L0110,pcr    mnln
+         lbsr  L03D0        NMLoads named module
+
+         leau  >$2000,u
+         stu   <u002E
+L026A    rts   
+
+*****************************************************
+* 
+*  Set up screens 
+*  SetStat Function Code $8B 
+*          Allocates and maps high res screen 
+*          into application address space
+* entry:
+*       a -> path number 
+*       b -> function code $8B (SS.AScrn)
+*       x -> screen type 
+*            0 = 640 x 192 x 2 colors (16K)
+*            1 = 320 x 192 x 4 colors (16K)
+*            2 = 160 x 192 x 16 colors (16K)
+*            3 = 640 x 192 x 4 colors (32K)
+*            4 = 320 x 192 x 16 colors (32K)
+*
+* exit:
+*       x -> application address space of screen
+*       y -> screen number (1-3)
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+* 
+*  Call use VDGINT allocates high res graphics for use with screens 
+*  updated by the process, does not clear the screens only allocates
+*  See OS-9 Technical Reference 8-142 for more details
+*
+
+L026B    leas  -$04,s       mamke room om stack 2 words
+         lda   #$01         Std out
+         ldb   #SS.AScrn    Allocate & map in hi-res screen (VDGINT)
+         ldx   #$0004       320x192x16 screen
+         os9   I$SetStt     Map it in
+         bcs   L02E6        Error, Restore stack & exit
+         tfr   y,d          Move screen # returned to D
+*         stb   >$0174      Save screen #
+         stb   scr174       Save screen #
+
+* call with application address of screen in x
+* returns with values in u
+         lbsr  L03B6        twiddle addresses
+         stu   <u0004       stow it two places
+         stu   <u0014
+
+         leax  >$4000,x     end address ???
+         lbsr  L03B6        twiddle addresses
+         stu   <u0006       stow it in two places
+         stu   <u0016
+
+* TFM for 6309
+         ldu   #$D800       Clear hi-res screen to color 0
+         ldx   #$7800       Screen is from $6000 to $D800
+         ldd   #$0000       (U will end up pointing to beginning of screen)
+L0299    std   ,--u         writes 0000 to screen address and decrements
+         leax  -2,x         decrement x loop counter
+         bne   L0299        keep going till all of screen is cleared
+
+*  Display a screen allocated by SS.AScrn
+*  SetStat Function Code $8C
+*
+* entry:
+*       a -> path number 
+*       b -> function code $8C (SS.DScrn)
+*       y -> screen numbe
+*            0 = text screen (32 x 16)
+*            1-3 = high resolution screen
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+
+         clra               Get screen # to display
+         ldb   scr174
+         tfr   d,y          Y=screen # to display
+         lda   #StdOut      $01  Std out path
+         ldb   #SS.DScrn    Display 320x192x16 screen
+         os9   I$SetStt     make the call
+         bcs   L02E6
+
+         leax  >L00E2,pc   values initialized to is $000C
+         ldb   >$0553      monitor type
+         lda   #$10
+         mul
+         abx               add b to x and stow at x
+
+
+* This loads up the control sequence to set the pallete 1B 31 PRN CTN
+*  PRN palette register 0 - 15, CTN color table 0 - 63
+         lda   #$1B      Escape code
+         sta   ,s        push on stack
+         lda   #$31      Palette code
+         sta   $01,s     push on stack
+         clra            make a zero palette reg value
+         sta   $02,s     push it `
+         ldy   #$0004    sets up # of bytes to write
+L02C8    ldb   ,x+       get value computed above for color table and bump it
+         stb   $03,s     push it
+         pshs  x         save it
+         lda   #StdOut   $01      Std Out path
+         leax  $02,s     start of data to write
+         os9   I$Write   write it
+         bcs   L02E6     error during write clean up stack and leave
+         puls  x         retrieve our x
+         inc   $02,s     this is our palette register value
+         lda   $02,s     we bumped it by one 
+         cmpa  #$10      we loop 15 times to set them all
+         bcs   L02C8     loop
+
+         clr   <u0045    clear a flag in memory
+         lbsr  L02E9     go disable keyboard interrupts
+L02E6    leas  $04,s     clean up stack
+         rts             return
+
+
+*  Raw disassembly of following section
+*L02E9    leas  <-$20,s
+*         lda   #$00
+*         ldb   #$00
+*         leax  ,s
+*         os9   I$GetStt 
+*         bcs   L0332
+*         lda   >L0115,pcr
+*         ldb   $04,x
+*         sta   $04,x
+*         stb   >L0115,pcr
+*         lda   >L0116,pcr
+*         ldb   $0C,x
+*         sta   $0C,x
+*         stb   >L0116,pcr
+*         lda   >L0117,pcr
+*         ldb   <$10,x
+*         sta   <$10,x
+*         stb   >L0117,pcr
+*         lda   >L0118,pcr
+*         ldb   <$11,x
+*         sta   <$11,x
+*         stb   >L0118,pcr
+*         lda   #$00
+*         ldb   #$00
+*         os9   I$SetStt 
+*L0332    leas  <$20,s
+*         rts   
+
+* Kills the echo, eof, int and quit signals
+*  get current options packet
+*  GetStat Function Code $00 
+*          Reads the options section of the path descriptor and
+*          copies it into the 32 byte area pointed to by reg X`
+* entry:
+*       a -> path number 
+*       b -> function code $00 (SS.OPT)
+*       x -> address to recieve status packet
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+* 
+
+L02E9    leas  <-$20,s           Make temp buffer to hold PD.OPT data
+         lda   #StdIn            $00 Get 32 byte PD.OPT from Std In
+         ldb   #SS.OPT           $00
+         leax  ,s                point to our temp buffer
+         os9   I$GetStt          make the call
+         bcs   L0332             error goto exit sub
+
+* NOTE: make sure following lines assemble into 5 bit, not 8 bit
+*       These appear to be loading the  echo EOF, INT and QUIT with 
+*       null values and saving the original ones back to vars
+*       since L0115 - L0118 were initialized with $00
+
+         lda   >L0115,pc
+         ldb   PD.EKO-PD.OPT,x   Get echo option
+         sta   PD.EKO-PD.OPT,x   change echo option no echo
+         stb   >L0115,pc         Save original echo option
+
+         lda   >L0116,pc
+         ldb   PD.EOF-PD.OPT,x   Change EOF char 
+         sta   PD.EOF-PD.OPT,x
+         stb   >L0116,pc
+
+         lda   >L0117,pc
+         ldb   <PD.INT-PD.OPT,x  Change INTerrupt char (normally CTRL-C)
+         sta   <PD.INT-PD.OPT,x
+         stb   >L0117,pc
+
+         lda   >L0118,pc
+         ldb   <PD.QUT-PD.OPT,x  Change QUIT char (normally CTRL-E)
+         sta   <PD.QUT-PD.OPT,x
+         stb   >L0118,pc
+
+*  set current options packet
+*  SetStat Function Code $00 
+*          Writes the options section of the path descriptor 
+*          from the 32 byte area pointed to by reg X`
+* entry:
+*       a -> path number 
+*       b -> function code $00 (SS.OPT)
+*       x -> address holding the status packet
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+* 
+
+*                                x is still pointing to our temp buff
+         lda   #StdIn            $00 Set VDG screen to new options
+         ldb   #SS.OPT           $00
+         os9   I$SetStt          set them to be our new values
+
+L0332    leas  <$20,s            Eat temp stack & return
+         rts   
+
+* raw disassembly
+*L0336    leas  -$02,s
+*         tst   >$0174
+*         beq   L036D
+*         lbsr  L02E9
+*         bcs   L036D
+**         lda   #$1B
+*         sta   ,s
+*         lda   #$30
+*         sta   $01,s
+*         ldy   #$0002
+*         lda   #$01
+*         leax  ,s
+*         os9   I$Write  
+*         bcs   L036D
+*         ldb   #$8C
+*         ldy   #$0000
+*         os9   I$SetStt 
+*         clra  
+*         ldb   >$0174
+*         tfr   d,y
+*         lda   #$01
+*         ldb   #$8D
+*         os9   I$SetStt 
+*L036D    leas  $02,s
+*         rts   
+
+
+*  Return the screen to default text sreen and its values
+*  deallocate and free memory of high res screen created
+
+L0336    leas  -2,s         Make temp buffer to hold write data
+*         tst   >$0174       Any hi-res screen # allocated?
+         tst   scr174       Any hi-res screen # allocated?
+         beq   L036D        No, restore stack & return
+         lbsr  L02E9        go change the echo,eof,int and quit settings
+         bcs   L036D        had an error restore stack and return
+         lda   #$1B         Setup DefColr sequence in temp buffer
+         sta   ,s
+         lda   #$30         Sets palettes back to default color
+         sta   1,s
+         ldy   #$0002       number of bytes to write 
+         lda   #StdOut      path to write to $01
+         leax  ,s           point x a buffer
+         os9   I$Write      write
+         bcs   L036D        we have an error clean stack and leave
+
+*  Display a screen allocated by SS.AScrn
+*  SetStat Function Code $8C
+*
+* entry:
+*       a -> path number 
+*       b -> function code $8C (SS.DScrn)
+*       y -> screen numbe
+*            0 = text screen (32 x 16)
+*            1-3 = high resolution screen
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+
+*                           a is still set to stdout from above
+         ldb   #SS.DScrn   Display screen function code
+         ldy   #$0000      Display screen #0 (lo-res or 32x16 text)
+         os9   I$SetStt    make the call
+
+*  Frees the memory of a screen allocated by SS.AScrn
+*  SetStat Function Code $8C
+*
+* entry:
+*       a -> path number 
+*       b -> function code $8D (SS.FScrn)
+*       y -> screen number 1-3 = high resolution screen
+*
+* error:
+*       CC -> Carry set on error
+*       b  -> error code (if any)
+
+         clra               clear high byte
+         ldb   scr174       Get hi-res screen # again
+         tfr   d,y          move it to Y=screen #
+         lda   #StdOut      set the path $01
+         ldb   #SS.FSCrn    Return screen memory to system
+         os9   I$SetStt     amke the call
+
+L036D    leas  2,s          Eat stack & return
+         rts   
+
+
+
+*  Unload the other modules
+L0370    leax  >L0106,pcr    shdw name string
+         lda   #Prgrm+Objct  #$11        module type
+         lbsr  L040B         unload it
+         leax  >L010B,pcr    scrn name string
+         lbsr  L040B         unload it
+         leax  >L0110,pcr    mnln name string
+         lbsr  L040B         unload it 
+         rts   
+
+*L0388    orcc  #$50
+*         lda   <u0042
+*         sta   >$FFA9
+*         ldx   <u0043
+*         ldd   >L0104,pcr
+*         std   $01,x
+*         stb   >$FFAA
+*         ldd   >L0102,pcr
+*         std   -$01,x
+*         stb   >$FFA9
+*         andcc #$AF
+*         clra  
+*         ldb   >L0119,pcr
+*         andb  #$03
+*         tfr   d,x
+*         lda   #$01
+*         ldb   #$92
+*         os9   I$SetStt 
+*         rts   
+**
+*L03B6    tfr   x,d
+*         exg   a,b
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         lsrb  
+*         pshs  b
+*         ldu   #$FFA8
+*         lda   b,u
+*         incb  
+*         andb  #$07
+*         ldb   b,u
+*         tfr   d,u
+*         puls  a
+*         rts   
+
+
+* Restore original MMU block numbers
+L0388    orcc  #IntMasks    Shut off interrupts
+         lda   <u0042       get MMU Block #
+         sta   >$FFA9       Restore original block 0 onto MMU
+         ldx   <u0043
+         ldd   >L0104,pc    Origanl 3rd block of MMU
+         std   1,x
+         stb   >$FFAA       Restore original block 1 onto MMU
+         ldd   >L0102,pc    Original 2nd block of MMU
+         std   -1,x
+         stb   >$FFA9       Restore block 0 again
+         andcc #^IntMasks   Turn interrupts back on
+
+*  return monitor type to original value
+         clra  
+         ldb   >L0119,pc    Get original monitor type
+         andb  #$03         Force to only legit values
+         tfr   d,x          Move to proper register
+         lda   #StdOut      set path $01
+         ldb   #SS.Montr    Restore original monitor type
+         os9   I$SetStt     make the call
+         rts   
+
+* twiddles address 
+* called with value to be twiddled in X
+* returns block # in a 
+*         ?????   in u
+L03B6    tfr   x,d          Move address to D
+         exg   a,b          Swap MSB/LSB
+         lsrb               Divide MSB by 32 (calculate 8k block # in proc map)
+         lsrb  
+         lsrb  
+         lsrb  
+         lsrb  
+         pshs  b            Save block # in process map
+         ldu   #$FFA8       Point to start of user DAT image
+         lda   b,u
+         incb  
+         andb  #$07
+         ldb   b,u
+         tfr   d,u
+         puls  a
+         rts   
+
+
+
+*************************************************************
+*  Called from  within sub at L0229
+*  entry:
+*	x -> is loaded with the address of the name string to load
+*       u -> contains some arbitrary value
+*
+
+L03D0    leas  -$08,s       Make a little scratch on the stack
+         stu   ,s           pointer to our buffer
+
+* Loads one or more modules from a file but does not map the module
+* into user's address space F$NMLoad
+* entry:
+*      a -> type/language byte
+*      x -> address of the path list
+*           with out path list default path is current execution dir
+*
+* exit:
+*      a -> type/language
+*      b -> module revision
+*      x -> address of the last byte in the pathlist + 1
+*      y -> storageb requirements of the module
+*
+* error:
+*      b  -> error code if any
+*      cc -> carry set on error
+
+         stx   $02,s        pointer module name
+         lda   #Prgrm+Objct $11      module type
+         os9   F$NMLoad     Load it but don't map it in
+         bcs   L0408        exit on error
+
+* Links to a memory module that has the specified name, language and type
+* entry:
+*      a -> type/language byte
+*      x -> address of the module name
+*
+* exit:
+*      a -> type/language
+*      b -> attributes/module revision
+*      x -> address of the last byte in the modulename + 1
+*      y -> module entry point absolute address
+*      u -> module header abosolute address
+*
+* error:
+*     cc -> set on error
+
+         ldx   $02,s        get our name string again
+         os9   F$Link       link it
+         bcs   L0408        exit on error
+         stu   $06,s        store module header address
+         tfr   u,x
+L03E8    stx   $04,s
+         lbsr  L03B6        Go twiddle with address`
+         ldx   ,s
+         leax  a,x
+         exg   d,u
+         sta   ,x
+         exg   d,u
+         cmpa  #$06
+         beq   L0403
+         ldx   $04,s
+         leax  >$2000,x
+         bra   L03E8
+
+L0403    ldu   $06,s
+         os9   F$UnLink 
+L0408    leas  $08,s
+         rts   
+
+L040B    os9   F$UnLoad  Unlink a module by name
+         bcc   L040B
+         clrb  
+         rts   
+
+L0412    fcc   '/VI'
+L0415    fcb   C$CR
+L0416    fdb   $0000  address of the device table entry
+L0418    fcb   $00    path number to device
+
+**************************************************************
+*
+*   subroutine entry is L0419 
+*   sets up Sig Intercept 
+*   verifies /VI device is loaded links to it 
+*   and allocates ram for it
+*   called from dispatch table around L0120
+
+
+* Set signal intercept trap
+*  entry: 
+*        x -> address of intercept routine
+*        u -> starting adress of routines memory area
+*  exit:
+*       Signals sent to the process cause the intercept to be
+*       called instead of the process being killed
+
+L0419    ldu   #$0000     start of Sierra memory area
+         ldx   #int5EE    Intercept rourtine copied to mem area
+         os9   F$Icpt     install the trap
+
+* Attach to the vrt memory descriptor
+* Attaches and verifies loaded the VI descriptor
+* entry:
+*      a -> access mode
+*          0 = use any special device capabilities
+*          1 = read only
+*          2 = write only
+*          3 = update (read and write)
+*      x -> address of device name string
+*
+* exit:
+*      x -> updated past device name
+*      u -> address of device table entry
+*
+* error:
+*      b  -> error code (if any)
+*      cc -> carry set on error
+
+         lda   #$01          attach for read
+         leax  >L0412+1,pcr  skip the slash Load VI only
+         os9   I$Attach      make the call
+         bcs   L0451         didn't work exit
+         stu   >L0416,pcr    did work save address 
+
+* Open a path to the device /VI
+* entry:
+*       a -> access mode (D S PE PW PR E W R)
+*       x -> address of the path list
+*
+* exit:
+*       a -> path number
+*       x -> address of the last byte if the pathlist + 1
+*
+* error:
+*       b  -> error code(if any)
+*       cc -> carry set on error
+*
+*                            a still contains $01 read
+         leax  >L0412,pcr    load with device name including /
+         os9   I$Open        make the call
+         bcs   L0451         didn't work exit
+         sta   >L0418,pcr    did work save path #
+
+* Allocate process+path RAM blocks
+
+         ldb   #SS.ARAM      $CA function code for VIRQ
+         ldx   #$000C
+         os9   I$SetStt      make the call
+         bcs   L0451
+         pshs  x
+
+* Set process+path VIRQ KQ3
+         ldb   #SS.KSet     $C8 function code for VIRQ
+         os9   I$SetStt 
+         puls  b,a
+L0451    rts   
+
+* Signal Intercept processing gets copied to int5EE mem slot
+L0452    cmpb  #$80     b gets the signal code if not $80 ignore
+         bne   L0464    $80 is user defined
+         tfr   u,d
+         tfr   a,dp
+         dec   <u004A
+         bne   L0464
+         bsr   L0465
+         lda   #$03
+         sta   <u004A
+L0464    rti   
+
+L0465    inc   >u024C,u
+         bne   L047B
+         inc   >u024B,u
+         bne   L047B
+         inc   >u024A,u
+         bne   L047B
+         inc   >u0249,u
+L047B    tst   >u0102,u
+         bne   L04BC
+         inc   <u003F
+         bne   L0487
+         inc   <u003E
+L0487    ldd   <u0048
+         addd  #$0001
+         std   <u0048
+         cmpd  #$0014
+         bcs   L04BC
+         subd  #$0014
+         std   <u0048
+         ldd   #$003C
+         leax  >u043D,u
+         inc   ,x
+         cmpb  ,x
+         bhi   L04BC
+         sta   ,x+
+         inc   ,x
+         cmpb  ,x
+         bhi   L04BC
+         sta   ,x+
+         inc   ,x
+         ldb   #$18
+         cmpb  ,x
+         bhi   L04BC
+         sta   ,x+
+         inc   ,x
+L04BC    rts   
+
+* deallocates the VIRQ device
+L04BD    lda   >L0418,pcr  load path number to /VI device
+         beq   L04D0       no path open check for device table addr
+         ldb   #SS.KClr    $C9 Clear KQ3 VIRQ       
+         os9   I$SetStt    make the call
+         ldb   #SS.DRAM    $CB deallocate the ram    
+         os9   I$SetStt    make the call
+         os9   I$Close     close the path to /VI
+L04D0    ldu   >L0416,pcr  load device table address for VI
+         beq   L04D9       don't have one leave now
+         os9   I$Detach    else detach it
+L04D9    rts   
+
+*  Twiddles with MMU blocks for us
+*  This sub gets copied into $0659 and executed there from this and
+*  the other modules this one loads (sub659)
+*
+*  s and x loaded by calling routine
+
+L04DA    ldd   ,s++       load d with current stack pointer and bump it
+*                         from mnln we come in with $4040
+         std   <u002A     save the calling stack pointer in u002A
+         orcc  #IntMasks  mask the interrupts
+         lda   <u0042
+         sta   ,x         x is loaded with value from u0028 in mnln
+         sta   >$FFA9  task 1 block 2 x2000 - x3FFF
+         ldu   <u0043
+         lda   $06,x
+         sta   u000C,u
+         sta   >$FFAF  task 1 block 8 xE000 - xFFFF
+         lda   $05,x
+         sta   u000A,u
+         sta   >$FFAE  task 1 block 7 xC000 - xDFFF
+         lda   $04,x
+         sta   u0008,u
+         sta   >$FFAD  task 1 block 6 xA000 - xBFFF
+         lda   $03,x
+         sta   u0006,u
+         sta   >$FFAC  task 1 block 5 x8000 - x9FFF
+         lda   $02,x
+         sta   u0004,u
+         sta   >$FFAB  task 1 block 4 x6000 - x7FFF
+         andcc #^IntMasks   unmask interrupts  
+
+         lda   $07,x
+         ldu   <u002E
+         adda  u000A,u
+         jsr   a,u
+
+         orcc  #IntMasks
+         lda   <u0042
+         sta   >$FFA9
+         ldu   <u0043
+         lda   <u0010
+         sta   u000C,u
+         sta   >$FFAF
+         lda   <u000F
+         sta   u000A,u
+         sta   >$FFAE
+         lda   <u000E
+         sta   u0008,u
+         sta   >$FFAD
+         lda   <u000D
+         sta   u0006,u
+         sta   >$FFAC
+         lda   <u000B
+         sta   u0002,u
+         sta   >$FFAA
+         lda   <u000A
+         sta   ,u
+         sta   >$FFA9
+         andcc #^IntMasks
+
+         jmp   [>$002A]
+
+L054F    fcb   $00,$00,$00,$00,$00,$00,$00,$00   ........
+L0557    fcb   $73,$69,$65,$72,$72,$61,$00       sierra.
+
+         emod
+eom      equ   *
+         end