diff level2/modules/cowin.asm @ 1933:1e312b144f4d

Major changes: CCIO,CC3IO are now VTIO GrfInt is now CoGrf WindInt is now CoWin VDGInt (L2), CO32 (L1) is now CoVDG CO51 (L1) is now CoHR CO80 (L1) is now CoWP All files referencing these have been changed
author boisy
date Sat, 26 Nov 2005 21:31:29 +0000
parents
children 14e43c3ec661
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/cowin.asm	Sat Nov 26 21:31:29 2005 +0000
@@ -0,0 +1,5593 @@
+*******************************************************************
+* CoGrf/CoWin - NitrOS-9 Text/Graphics Window Module
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*  19r0    2003/09/23  Robert Gault
+* Many new patches for 6809 code use.
+*
+*  19r1    2003/11/14  Robert Gault
+* Patches to scrollbar windows to recover arrows and markers.
+* Includes new stdfonts with graphics added to the end.
+
+         nam   CoGrf/CoWin
+         ttl   NitrOS-9 Window Module
+
+         ifp1  
+         use   defsfile
+         endc
+  
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  equ   19
+
+* Color table for 3D look stuff & others - WILL NEED TO SWAP 1 & 2 FOR MENUS
+* This should now match VIEW's color table
+WColor0  equ   0          black
+WColor1  equ   2          dark grey (was lite grey)
+WColor2  equ   1          light grey (dark grey)
+WColor3  equ   3          (white)
+
+         mod   eom,name,tylg,atrv,entry,size
+size     equ   .
+
+name     equ   *
+         IFEQ  CoGrf-1
+         fcs   /CoGrf/
+         ELSE
+         fcs   /CoWin/
+         ENDC
+         fcb   edition
+
+****************************
+* Escape code parameter vector table
+* Format: Byte 1  : Length of parameters required (in bytes)
+*         Byte 2  : Internal function code for GrfDrv
+*         Byte 3-4: Vector offset of routine from Byte 1
+
+L0027    fcb   7,$04      DWSet
+         fdb   DWSet-*+2
+         fcb   0,$10      Select
+         fdb   Select-*+2
+         fcb   7,$0A      OWSet
+         fdb   OWSet-*+2
+         fcb   0,$0C      OWEnd
+         fdb   OWEnd-*+2
+         fcb   0,$08      DWEnd
+         fdb   DWEnd-*+2
+         fcb   4,$0E      CWArea
+         fdb   CWArea-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   4,$2C      DefGPB
+         fdb   DefGPB-*+2
+         fcb   2,$2E      KillBuf
+         fdb   KillBuf-*+2
+         fcb   9,$30      GPLoad
+         fdb   GPLoad-*+2
+         fcb   10,$34     GetBlk
+         fdb   GetBlk-*+2
+         fcb   6,$36      PutBlk
+         fdb   PutBlk-*+2
+         fcb   2,$12      PSet
+         fdb   PSet-*+2
+         fcb   1,$1E      LSet
+         fdb   LSet-*+2
+         fcb   0,$1C      DefPal
+         fdb   DefPal-*+2
+         fcb   2,$16      Palette
+         fdb   Palette-*+2
+         fcb   1,$20      FColor
+         fdb   FColor-*+2
+         fcb   1,$22      BColor
+         fdb   BColor-*+2
+         fcb   1,$14      Border
+         fdb   Border-*+2
+         fcb   1,$28      ScaleSw
+         fdb   ScaleSw-*+2
+         fcb   1,$06      DWProtSw
+         fdb   DWProtSw-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   2,$1A      GCSet
+         fdb   L060C-*+2
+         fcb   2,$18      Font
+         fdb   Font-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   1,$24      TCharSw
+         fdb   TCharSw-*+2
+         fcb   1,$2A      Bold
+         fdb   BoldSw-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   1,$26      PropSw
+         fdb   PropSw-*+2
+         fcb   4,$00      SetDP
+         fdb   SetDPtr-*+2
+         fcb   4,$00      RSetDPtr
+         fdb   RSetDPtr-*+2
+         fcb   4,$48      Point
+         fdb   Point-*+2
+         fcb   4,$48      RPoint
+         fdb   RPoint-*+2
+         fcb   4,$4A      Line
+         fdb   Line-*+2
+         fcb   4,$4A      RLine
+         fdb   RLine-*+2
+         fcb   4,$4A      LineM
+         fdb   LineM-*+2
+         fcb   4,$4A      RLineM
+         fdb   RLineM-*+2
+         fcb   4,$4C      Box
+         fdb   Box-*+2
+         fcb   4,$4C      RBox
+         fdb   RBox-*+2
+         fcb   4,$4E      Bar
+         fdb   Bar-*+2
+         fcb   4,$4E      RBar
+         fdb   RBar-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   $ff,$00    Blank
+         fdb   $0000
+         fcb   4,$44      PutGC
+         fdb   PutGC-*+2
+         fcb   0,$56      FFill
+         fdb   FFill-*+2
+         fcb   2,$50      Circle
+         fdb   Circle-*+2
+         fcb   4,$52      Ellipse
+         fdb   Ellipse-*+2
+         fcb   12,$54     Arc
+         fdb   Arc-*+2
+         fcb   2,$50      Filled Circle (flag set to differentiate) $53
+         fdb   Filled-*+2
+         fcb   4,$52      Filled Ellipse (flag set to differentiate) $54
+         fdb   Filled-*+2
+         fcb   $ff,$00    Blank
+         fdb   $0000
+
+L0129    fcc   "../CMDS/"
+L0131    fcs   "grfdrv"
+
+******************************
+*
+* Initialization routine
+Init     pshs  u,y        Preserve regs
+         ldd   >WGlobal+G.GrfEnt     Grfdrv there?
+         lbne  L01DB      Yes, go on
+* Setup window allocation bit map table
+         IFNE  H6309
+         clrd  
+         clrw
+         stq   >WGlobal+G.WUseTb     Set all 32 windows to be unused
+         ELSE
+         clra
+         clrb
+         std   >GrfMem+gr00B5
+         std   >WGlobal+G.WUseTb
+         std   >WGlobal+G.WUseTb+2
+         ENDC
+* Get grfdrv setup
+         leax  <L0131,pc  Point to grfdrv module name
+         lbsr  L01FB      Does it exist in memory?
+         bcc   L0169      Yes, go on
+         cmpb  #E$MNF     Module not found?
+         bne   L0166      No, exit with error
+L0159    leax  <L0129,pc  Point to full pathname
+         lbsr  L021F      Load ok?
+         bcs   L0167      No, exit with error
+* Initialize grfdrv
+         lbsr  L020C      Check grfdrv load address
+         bcc   L0169      It's ok, go on
+L0166    coma             Set carry
+L0167    puls  y,u,pc     Return
+
+* Default palette color settings
+L02F3    fcb   $3f,$09,$00,$12 Colors 0-3 & 8-11
+L02F7    fcb   $24,$36,$2d,$1b Colors 4-7 & 12-15
+
+* Execute Grfdrv's init routine
+* Grfdrv will move itself over to task 1 & setup it's own memory map
+L0169    pshs  y,u        Preserve regs
+         ldu   #GrfMem    Point to GRFDRV global mem
+         clrb             Get code to initialize grfdrv
+         stb   >WGlobal+g0038
+         jsr   ,y         Execute it
+* unlink grfdrv from user map
+         lda   #Systm+Objct Get module type
+         leax  <L0131,pc  Point to grfdrv name
+         ldy   <D.SysPrc  Get system process dsc. ptr.
+         leay  <P$DATImg,y Point to the DAT image
+         os9   F$FModul   Get module directory pointer to grfdrv
+         inc   MD$Link+1,u Increment it's link count
+         ldu   2,s        Get pointer to Grfdrv module
+         lbsr  L022F      Unlink it (it's already in system state)
+         puls  d          Get pointer to Grfdrv entry
+         anda  #$1F       Calculate new entry point
+         ora   #$40
+         std   >WGlobal+G.GrfEnt     Save it
+         leas  2,s        Purge stack
+         IFNE  H6309
+         oim   #$80,>WGlobal+G.BCFFlg Indicate that Grfdrv has been found?
+         ELSE
+         lda   >WGlobal+G.BCFFlg
+         ora   #$80
+         sta   >WGlobal+G.BCFFlg
+         ENDC
+* Initialize GFX tables
+         ldd   #$02FF     Get how many bytes we need
+         os9   F$SRqMem   Reserve it (note: only $2cf is used so far)
+         bcs   L0166      Can't get memory, exit
+         stu   >WGlobal+G.GfxTbl  Save the pointer to GFX tables (NOT IN GLOBAL!)
+         IFNE  H6309
+         tfr   d,w        Move mem size to W
+         leay  <Nul0+2,pc Clear them all to NUL's
+         tfm   y,u+
+         stw   >WGlobal+G.PrWMPt     initialize previous window table pointer to 0
+         ldu   #WGlobal+G.WrkWTb     Point to work window table
+Nul0
+         ldw   #$0040
+         tfm   y,u+
+         ELSE
+ClrLp1   clr   ,u+ 
+         subd  #$0001
+         bne   ClrLp1
+         std   >WGlobal+G.PrWMPt     initialize previous window table pointer to 0
+         ldu   #WGlobal+G.WrkWTb     Point to work window table
+         ldb   #$0040
+ClrLp2   clr   ,u+
+         decb
+         bne   ClrLp2 
+         ENDC
+* Set default palettes
+         ldy   #$10c7     Point to default palette register buffer
+         sty   >WGlobal+G.DefPal     Save it
+         IFNE  H6309
+         ldq   <L02F3,pc  Get 4 of default palettes
+         stq   ,y         Save 0-3
+         stq   8,y        Save 8-11
+         ldq   <L02F7,pc  Get other 4 default palettes
+         stq   4,y        Save 4-7
+         stq   12,y       Save 12-15
+         ELSE
+         ldd   L02F7+2,pc
+         std   6,y
+         std   14,y
+         ldd   L02F3+2,pc
+         std   2,y
+         std   10,y
+         ldd   L02F3,pc
+         std   ,y
+         std   8,y
+         ldd   L02F7,pc
+         std   4,y
+         std   12,y
+         ENDC
+L01DB    ldu   2,s        Get device static mem
+         ldy   ,s         Get path descriptor pointer
+         leax  CC3Parm,u  Point to parameters
+         stx   V.PrmStrt,u  Save it as param start pointer
+         stx   V.NxtPrm,u   Save it as pointer to next param
+         ldb   IT.WND,y   Get window # from device dsc
+         stb   V.DWNum,u    Save it as window # in static mem
+* If normal window # (0-31), mark as used in window bit table
+* If high bit set (like /W's $FF), don't allocate, let SS.Open call use next
+*  available one and let it mark which one it found
+         bmi   L01F4      Skip ahead if /w type (Wildcard)
+         clra             Clear MSB of window #
+         bsr   L024A      Allocate window in 32 bit window used table
+L01F4    lbsr  L07B0      Find empty window tbl entry & put in linked list
+         clrb             No error & return
+         puls  u,y,pc
+
+* Link to module
+L01FB    leas  -2,s       Make buffer for current process dsc.
+         bsr   L0238      Swap to system process
+         lda   #Systm+Objct Link module
+         os9   F$Link
+         bsr   L0244      Swap back to current process
+         bcs   L022C      Return if error
+         bsr   L020C      Check load address
+         bra   L022C      Return
+
+* Check grfdrv load/link address
+L020C    tfr   u,d        Move module header ptr to D
+         IFNE  H6309
+         andd  #$1FFF     Make sure on even 8K boundary
+         ELSE
+         anda  #$1F
+         bne   L0217
+         andb  #$FF
+         ENDC
+         bne   L0217      It's not, exit with Bad Page Address error
+         clrb             No error, exit
+         rts   
+
+L0217    comb             Exit with Bad Page Address error
+         ldb   #E$BPAddr
+         rts   
+
+* Load a module
+L021F    leas  -2,s       Make a buffer for current process ptr
+         bsr   L0238      Switch to system process descriptor
+         lda   #Systm+Objct Load module
+         ldu   <D.Proc
+         os9   F$Load
+L022A    bsr   L0244      Swap back to current process
+L022C    leas  2,s        Purge stack & return
+         rts   
+
+* Unlink a module
+L022F    leas  -2,s       Make buffer for current process ptr
+         bsr   L0238      Switch to system process dsc.
+         os9   F$UnLink   Unlink module
+         bra   L022A      Return
+
+* Switch to system process descriptor
+L0238    pshs  d          Preserve D
+         ldd   <D.Proc    Get current process dsc. ptr
+         std   4,s        Preserve on stack
+         ldd   <D.SysPrc  Get system process dsc. ptr
+         std   <D.Proc    Make it the current process
+         puls  d,pc       Restore D & return
+
+* Switch back to current process
+L0244    pshs  d          Preserve D
+         ldd   4,s        Get current process ptr
+         std   <D.Proc    Make it the current process
+         puls  d,pc       Restore D & return
+
+* Allocate a window
+* Entry: D=Window # to allocate
+L024A    pshs  d,u        Preserve U
+         bsr   L0238      Swap to system process dsc
+         bsr   L0279      Get pointer to window allocation table
+         os9   F$AllBit   Allocate it
+L0255    bsr   L0244      Swap back to current process
+         leas  2,s        Purge stack
+         puls  u,pc       Restore U & return
+
+* Search for a free window
+* Entry: D=Starting window #
+L025B    pshs  d,u        Preserve U
+         bsr   L0238      Swap to system process dsc
+         bsr   L0279      Get ptr to window map
+         leau  4,x        Point to end of map
+         os9   F$SchBit   Find it
+         bra   L0255      Return with it
+
+* De-Allocate a window
+* Entry: D=Window # to delete
+L026A    bmi   L0282      Illegal window #
+         pshs  d,u        Preserve U
+         bsr   L0238      Swap to system process dsc
+         bsr   L0279      Get ptr to window map
+         os9   F$DelBit   Delete it & return
+         bra   L0255
+
+* Point to window allocation table
+L0279    ldx   #WGlobal+G.WUseTb  Point to window bit table
+         ldy   #1         Get # windows to allocate/de-allocate
+L0282    rts              Return
+
+******************************
+* Terminate routine
+* Entry: U=Static mem ptr
+*        Y=Path dsc. ptr
+Term     clra             Get start window # for de-allocate
+         ldb   V.DWNum,u    Get device window # from static mem
+         pshs  u,y        Preserve static mem & path dsc. ptrs
+         bsr   L026A      De-allocate it from window map
+         lbsr  L06AE      Get window table pointer
+         lda   Wt.STbl,y  Get MSB of screen table ptr
+         cmpa  #$FF       Set?
+         bne   L0298      Yes, go on
+         sta   Wt.STbl+1,y Get rid of table ptr
+         bra   L02A5      Go on
+
+* Send DWEnd to grfdrv
+L0298    ldy   ,s         Get path dsc. ptr
+         ldu   2,s        Get static mem ptr
+         ldb   #$08       Get callcode for DWEnd
+         stb   V.CallCde,u  Save it in static mem area
+         lbsr  L0452      Go do it
+* Clear out device static memory
+L02A5    puls  u,y        Restore static mem & path dsc. ptrs
+         leax  V.WinNum,u   Point to window entry #
+         IFNE  H6309
+         leay  <Nul1+2,pc Point to NUL byte
+Nul1     
+         ldw   #CC3DSiz-V.WinNum     Size of block to clear
+         tfm   y,x+
+         ELSE
+         ldd   #CC3DSiz-V.WinNum
+Lp4      sta   ,x+
+         decb
+         bne   Lp4
+         ENDC
+         clr   V.InfVld,u   Clear 'rest of info valid' flag
+* Scan window tables for a valid window
+         ldx   #WinBase   Point to base of window tables
+         ldd   #MaxWind*256+Wt.Siz     # of window tables & Size of each table
+L02B9    equ   *
+         IFNE  H6309
+         ldw   Wt.STbl,x  Get screen table ptr
+         cmpe  #$FF       MSB indicate unused?
+         bne   L02F1      No, exit without error
+* Just a guess, but if 2nd byte is $FE with 1st being $FF, could be a flag
+*  for that this is a "copy" of a window to do overlapped device windows
+         cmpf  #$FF       LSB indicate unused?
+         bne   L02F1      No, exit without error 
+         ELSE
+         pshs  d
+         ldd   Wt.STbl,x
+         std   >GrfMem+gr00B5
+         cmpa  #$FF
+         bne   L02F1B
+         cmpb  #$FF
+         bne   L02F1B      No, exit without error
+         puls  d 
+         ENDC
+         abx              Point to next window table
+         deca             Decrement counter
+         bne   L02B9      Do until all 32 entries are checked
+* All windows are unallocated, terminate GRFDRV
+         tfr   x,y        Move to proper register again
+         ldb   #$02       get grfdrv terminate code
+         lbsr  L0101      go do it
+         ldd   >WGlobal+G.GrfEnt     get grfdrv address
+         clrb             Make it even page
+         tfr   d,u        Move to proper reg for Unlink
+         os9   F$UnLink   Unlink GRFDRV
+         bcs   L02F2      If error unlinking, exit
+         IFNE  H6309
+         clrd  
+         ELSE
+         clra  
+         clrb  
+         ENDC
+         std   >WGlobal+G.GrfEnt     GRFDRV address to non-existant
+         ldu   >WGlobal+G.GfxTbl     Get ptr to gfx tables
+         ldd   #$02FF     Size of graphics tables
+         os9   F$SRtMem   Return graphics table memory to system
+         bcs   L02F2      If error, exit with it
+         clrb  
+         rts   
+
+         IFEQ  H6309
+L02F1B   puls  d
+         ENDC
+L02F1    clrb             No error & return
+         tfr   x,y        Move to proper register
+L02F2    rts   
+
+****************************
+* Main Entry point from VTIO
+* Entry: U=Device memory pointer
+*        Y=Path descriptor pointer
+
+entry    lbra  Init       Initialization
+         bra   Write      Write
+         nop   
+         lbra  GetStt     Get status
+         lbra  SetStt     Set status
+         lbra  Term       Terminate
+         lbra  L0C68      Window special processing
+
+L0A96    comb             Set error flag
+         ldb   #E$UnkSvc  Unknown service error
+         rts   
+
+****************************
+* Write routine: Optomized for normal text
+* Entry: A=Char to write
+*        U=Device memory pointer
+*        Y=Path descriptor pointer
+Write    ldb   #$3a       get grfdrv function for Alpha put as default
+         cmpa  #C$SPAC    Space or higher?
+         bhs   L03A1      Yes, do alpha put
+         cmpa  #$1B       Escape code?
+         bne   L0347      No, keep checking
+         ldb   [V.PrmStrt,u] get first parameter from parameter area
+         cmpb  #$55       Past maximum supported escape code?
+         bhi   L0A96      Yes, exit with error
+         subb  #$20       Adjust it down for table offset
+         bmi   L0A96      Below minimum supported code, exit with error
+         lslb             Adjust for 4 bytes/entry
+         lslb  
+         leax  >L0027,pc  Point to ESC code vector table
+         abx              Point to 4 byte entry
+         IFNE  H6309
+         ldq   ,x         A=# param bytes,B=GRFDRV code,W=vector offset
+         ELSE
+         ldd   2,x
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         ENDC
+         stb   V.CallCde,u  Save GRFDRV code in Static mem (need for L00F7)
+         tsta             Any parameter bytes needed?
+         beq   L0339      No, just go do function
+         bmi   L0A96      $FF=Empty, exit with error
+         sta   V.ParmCnt,u  Preserve for VTIO to get the rest
+L032F    equ   *
+         IFNE  H6309
+         addr  w,x        Point to vector
+         ELSE
+         pshs  b
+         ldd   2,x
+         leax  d,x
+         puls  b
+         ENDC
+         stx   V.ParmVct,u  Save vector for VTIO to call
+         clra             No error & return so VTIO can get rest of parms
+         rts   
+
+* No param calls go here
+L0339    equ   *
+         IFNE  H6309
+         jmp   w,x        Go execute function
+         ELSE
+         pshs  d
+         ldd   >GrfMem+gr00B5
+         leax  d,x
+         puls  d
+         jmp   ,x 
+         ENDC
+
+* Check special display codes
+L0347    cmpa  #$1F       $1F codes?
+         beq   L038D      Yes, go process them
+L034D    cmpa  #$02       Cursor X,Y?
+         bne   L0356      No, check next
+         leax  <L036E,pc  Point to Cursor X,Y routine
+         bra   L0362      Let VTIO get rest of parms
+
+L0356    cmpa  #$05       Cursor On/Off?
+         beq   L0396      Go to cursor on/off routine
+L039F    ldb   #$3C       Otherwise, GrfDrv function: Control codes
+L03A1    pshs  d          Preserve write char & GrfDrv function code
+         lbsr  L06A0      Get window table ptr & verify it
+         bcs   UnDef      Couldn't, exit with Window Undefined error
+         puls  d          Get back write char & GrfDrv function code
+
+* Execute GrfDrv
+* Entry: @ L0101 : B=Callcode for GRFDRV
+* All regs are thrown onto stack for 'fake' RTI done by [D.Flip1] (in vector
+* page RAM at the top of OS9p1) after switching to System Task #1 (GRFDRV)
+* Added protection for regE; RG 2003/10/15
+L0101    ldx   >WGlobal+G.GrfEnt     Get GrfDrv entry address
+         orcc  #Entire    Set up 'pull all regs' for RTI
+         IFNE  H6309
+         pshs  e
+         tfr   cc,e
+         ste   >WGlobal+g0005
+         puls  e
+         ELSE
+         pshs  d
+         ldd   >GrfMem+gr00B5
+         std   >GrfMem+gr00B5
+         tfr   cc,a
+         sta   >WGlobal+g0005
+         puls  d
+         ENDC
+         orcc  #IntMasks  Disable IRQ's
+         sts   >WGlobal+G.GrfStk     Save stack ptr for GRFDRV
+         lds   <D.CCStk   Get new stack ptr
+
+* Dump all registers to stack for fake RTI
+         pshs  dp,x,y,u,pc dump all registers to stack for fake RTI
+         IFNE  H6309
+         pshsw           no register to push for 6809
+         lde   >WGlobal+g0005	get back regDP 
+         ENDC
+         pshs  cc,d
+         stx   R$PC,s     Save grfdrv entry address as the PC on stack
+         IFNE  H6309
+         ste   R$CC,s     Save CC bitE into CC on stack
+         ste   >WGlobal+G.GfBusy     Flag grfdrv busy
+         ELSE
+         lda   >WGlobal+g0005
+         sta   R$CC,s
+         sta   >WGlobal+G.GfBusy     Flag grfdrv busy 
+         lda   R$A,s      may not be needed
+         ENDC
+         jmp   [>D.Flip1] Flip to GRFDRV and execute it
+
+* GRFDRV will execute function, then call [D.Flip0] to switch back to here. It
+* will use an RTS to return to the code here that called L00F7 or L0101 in the
+* first place. Only SP,PC & CC are set up- ALL OTHER REGISTERS MAY BE MODIFIED
+
+* Entry point for GRFDRV for most GFX commands
+L00F7    ldx   >WGlobal+G.CurDvM     Get current device memory ptr
+         ldb   V.CallCde,x  Get callcode from it
+         bra   L0101      Go call GRFDRV
+
+UnDef    leas  2,s        Eat stack
+UnDef2   ldb   #E$WUndef  Undefined Window error
+         rts   
+
+* Set counts up for CC3/TC9IO to get rest of needed parms
+L0362    sta   V.ParmCnt,u  Store # bytes to get for params in static mem
+         stx   V.ParmVct,u  Store vector to function in static mem
+         clra             No error & return so VTIO can get rest of parms
+         rts   
+
+* Process CurXY after parms are gotten
+* Entry: U=Static mem ptr
+L036E    pshs  u          Save static mem ptr (in case DWSet modifies U)
+         lbsr  L06A0      Get window table ptr
+         puls  u          Get back static mem ptr
+         bcs   UnDef2     Couldn't, exit with Window undefined error
+         ldd   [V.PrmStrt,u] get the coords requested
+L0380    sta   >GrfMem+gr0047     Save X coord
+         stb   >GrfMem+gr0049     Save Y coord
+         ldb   #$42       GrfDrv function: Goto X/Y
+L038A    bra   L0101      Execute Grfdrv
+
+* Process $1f display codes
+L038D    lda   [V.PrmStrt,u] get type of $1f function
+         ldb   #$40       GrfDrv function: $1F codes
+         bra   L03A1      Go get window tbl ptr & execute GRFDRV
+
+* Cursor on/off
+L0396    lda   [V.PrmStrt,u] get cursor on/off parameter byte
+         ldb   #$3E       GrfDrv function: Cursor on/off
+         bra   L03A1      Go get window tbl ptr & execute GRFDRV
+
+******************************
+* DWSet entry point
+* Entry: U=Device static mem pointer
+*        Y=Path descriptor
+*        X=Param pointer
+DWSet    pshs  y,u        preserve static mem & path descriptor pointers
+         lbsr  L06AE      get window table pointer for current window
+* Window already defined?
+         lda   Wt.STbl,y  Get MSB of screen table ptr
+         cmpa  #$FF       Already defined?
+         beq   L03BF      No, skip ahead
+         comb             Exit with Window Already Defined error
+         ldb   #E$WADef   get window already defined error
+         puls  u,y,pc     Restore regs & return
+
+* Check screen type
+L03BF    lda   ,x+        Get screen type from parameters
+         lbsr  L07E0      Convert it to internal code
+         bcc   L03CB      it's good, skip ahead
+         puls  u,y        Exit with Illegal Window Definition error
+         lbra  L0697      return illegal window definition error
+
+* Legal window type, make sure coords & size are at least reasonable
+L03CB    stb   >GrfMem+Gr.STYMk     Save screen type in Grfdrv Mem
+         bsr   L0413      Move coord's, size & pals. to window table
+         bcc   L03D7      Legal values, skip ahead
+         ldb   #E$IWDef   Illegal Window Definition
+         puls  pc,u,y     restore regs & return with error
+
+* Coordinates & size are within 0-127, continue
+L03D7    cmpb  #$FF       is it same screen?
+         beq   L03F2      yes, don't bother getting border color
+         leax  <L03E5,pc  point to processor for border color
+         lda   #$01       get # bytes to get
+         puls  u,y        purge stack
+         bra   L0362      let VTIO get it for me
+
+* If the window was not on the current screen grab the optional border color
+L03E5    pshs  u,y        Preserve static mem & path dsc. ptrs
+         lbsr  L06AE      get window table pointer into Y
+         lda   ,x         get border color
+         sta   >GrfMem+gr005A     save it in grfdrv mem
+         bra   L03F9      continue processing
+
+* Current displayed screen or current process screen goes here
+L03F2    ldx   ,s         get path descriptor pointer
+         lbsr  L075C      check validity of screen table
+         bcs   L0408      error, return
+* all parameters are moved, let grfdrv do the rest
+L03F9    lbsr  L00F7      let grfdrv take over
+         bcs   L040A      grfdrv error, return
+         ldu   2,s        get static mem pointer
+         inc   V.InfVld,u   Set flag to indicate rest of static mem valid
+         IFNE  H6309
+         ldw   >WGlobal+G.CurDev     Get current window ptr
+         ELSE
+         ldy   >WGlobal+G.CurDev
+         sty   >GrfMem+gr00B5
+         ENDC
+         beq   Nowin      None, skip ahead
+         IFNE  H6309
+         lda   >V.ULCase,w  Get special keyflags
+         ELSE
+         lda   >V.ULCase,y
+         ENDC
+         sta   >V.ULCase,u   Save in new window
+Nowin    ldy   ,s         get path descriptor pointer
+         bsr   L0436      setup lines per page
+L0408    puls  pc,u,y     all done, return
+
+* DWSet didn't work, flag window table entry as free again
+L040A    ldu   #$FFFF     get table free value
+         stu   Wt.STbl,y  put it in window table
+         puls  y,u,pc     restore & return
+
+* Move co-ordinates/size & fore/back colors into window table
+L0413    pshs  d          Preserve D
+         bsr   L0423      Move coordinates & size
+         bcs   L041F      Error in size, return the error
+         ldd   ,x++       Get foreground/background colors
+         std   Wt.Fore,y  Put it in window table
+L041D    puls  d,pc       Restore D & return
+
+L041F    stb   1,s        Save error code into B on stack
+         puls  d,pc       Restore D & return
+
+* Move start coordinates & size into window table
+* Entry: X=Pointer to co-rdinates
+*        Y=Window table pointer
+L0423    ldd   ,x++       Get start coordinates
+         std   Wt.CPX,y   Save 'em
+         lda   ,x+        Get X size
+         ble   L042F      Too big or 0, exit with error
+         ldb   ,x+        Get Y size
+         bgt   L0432      Above 0, go on
+L042F    lbra  L0697      Return error
+
+L0432    std   Wt.SZX,y   Save size to window table
+         clrb             Clear error & return
+         rts   
+
+* Setup lines/page variables
+* Entry: Y=Path descriptor pointer
+*        U=Device static mem pointer for new window
+L0436    pshs  y          L06AE resets y
+         lbsr  L06AE      get window table pointer
+         ldb   Wt.SZY,y   Get Y size
+         puls  y          restore reg
+         stb   V.LINE,u   save it in static mem for SCF
+         stb   PD.PAG,y   Save it as the default in path descriptor
+         clrb             clear errors
+         rts              return
+
+****************************
+* DWEnd entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+DWEnd    pshs  u
+         bsr   L0452      process it
+         puls  u
+         bcs   L0451      error, return
+         clr   V.InfVld,u   clear flag - static mem no longer valid
+L0451    rts              return
+
+* Check for legal screen table (PRESERVES U)
+L0452    lbsr  L06AE      get pointer to window table into Y
+         lda   Wt.STbl,y  screen table exist?
+         bpl   L0461      screen table exists, skip ahead
+         comb             set carry for error
+         lbra  L069D      return undefined window error
+
+* Window legal, Delete any overlays (PRESERVES U)
+L0461    lda   Wt.BLnk,y  Any overlay windows?
+         bmi   L0479      No, skip ahead
+         pshs  a,u        save parent window # & static mem
+         IFNE  H6309
+         bsr   L04EA      Do a CWArea to full size
+         ELSE
+         lbsr  L04EA
+         ENDC
+         ldb   #$0C       Grfdrv function: Overlay window end
+         lbsr  L0101
+         puls  a,u        restore parent & static mem
+         sta   V.WinNum,u   save parent as current
+         lbsr  L06AE      get it's window table pointer
+         bra   L0461      keep going
+
+* Change to full window size & clear out the graphics table entry
+*   clear out the current window & screen table ptrs
+L0479    pshs  u          save static mem pointer
+         bsr   L04EA      Do a CWArea to full size
+* clear out gfx table entry
+         puls  u          Restore static mem ptr
+         lbsr  L06B9      Point to gfx table entry for this window
+         IFNE  H6309
+         leau  <Nul2+2,pc
+Nul2     ldw   #$0012
+         tfm   u,x+
+         ELSE
+         pshs  b
+         ldd   #$0012
+Nul2     sta   ,x+
+         decb
+         bne   Nul2
+         puls  b
+         ENDC
+         lda   >WGlobal+G.WinType     is this a window?
+         bmi   L0499      no, return
+         IFNE  H6309
+         clrd  
+         stq   >GrfMem+gr002E     clear window & screen table entrys
+         ELSE
+         clra
+         clrb
+         std   >GrfMem+gr00B5 
+         std   >GrfMem+gr002E     clear window & screen table entrys
+         std   >GrfMem+gr002E+2
+         ENDC
+L0499    lbra  L00F7      let grfdrv do the rest
+
+*****************************
+* OWSet entry point
+* Entry: U=Device static mem pointer
+*        Y=Path descriptor pointer
+*        X=Parameter pointer
+OWSet    pshs  y,u        preserve path descriptor & static mem pointers
+         lbsr  L06A0      verify window table
+         puls  u,y        restore pointers
+         lbcs  L069D      not a legal window, return undefined window error
+         pshs  u,y        preserve path descriptor & static mem pointers
+         lbsr  L07B0      get a blank window table pointer
+         bcc   L04B6      we found one, skip ahead
+         puls  u,y,pc     purge stack & return
+
+L04B2    puls  u,y
+         bra   L04D5
+
+* We have a new window table for overlay, so process parameters
+L04B6    lda   ,x+        get save switch from parameters
+         sta   >GrfMem+gr0059     save it in grfdrv mem
+         lbsr  L0413      move rest of parameters to grfdrv mem
+         bcs   L04B2      error, return
+         pshs  y          preserve window table pointer
+         lbsr  L00F7      let grfdrv create overlay
+         puls  y          restore window table pointer
+         bcs   L04D1      error from grfdrv, return
+         puls  u,y        restore path descriptor & static mem pointers
+         lbra  L0436      setup lines per page & return from there
+
+L04D1    leas  2,s        Eat path dsc. ptr
+         puls  u          Get static mem ptr back
+
+* Could not find a window table for overlay, get rid of links & return
+L04D5    lda   Wt.BLnk,y  Get back window # link
+         sta   V.WinNum,u   Store it as current window #
+         IFNE  H6309
+         ldw   #$FFFF     Set screen table ptr to unused
+         stw   Wt.STbl,y
+         ELSE
+         pshs  x
+         ldx   #$FFFF
+         stx   >GrfMem+gr00B5
+         stx   Wt.STbl,y
+         puls  x
+         ENDC
+         coma             Set carry for error
+L04E7    rts   
+
+* Change window to full size reported in window table
+L04EA    equ   *
+* Relocated lines and removed regW; regE bug; RG
+         ldd   Wt.DfSZX,y Get default size of window
+         std   Wt.CPX+2,y	  Save current size
+         std   >GrfMem+gr00B5
+         IFNE  H6309 
+         clrd             set start coords to 0,0
+         ELSE
+         clra
+         clrb
+         ENDC
+         std   Wt.CPX,y   Store coords
+         ldb   #$0E       GrfDrv function: CWArea
+         pshs  y          preserve window table ptr
+         lbsr  L0101      Send it to GrfDrv
+         puls  y,pc       Restore reg & return
+
+****************************
+* OWEnd entry point
+* Entry: U=Device static mem pointer
+*        Y=Path descriptor pointer
+OWEnd    pshs  u,y        preserve path descriptor & static mem pointers
+         lbsr  L06A0      get pointer to window table & verify it
+         bcc   L0508      went ok, skip ahead
+         puls  u,y        Restore regs
+         lbra  L069D      Exit with undefined window error
+
+L0508    lda   Wt.BLnk,y  is this an overlay?
+         bpl   L0511      yes, go remove it
+         puls  u,y        purge stack
+         lbra  L0697      return with illegal window definition error
+
+* We are in overlay, remove it
+L0511    ldu   2,s        get static mem pointer
+         lbsr  L06B9      get pointer to graphics table for this window
+         IFNE  H6309
+         lde   ,x         get menuing system screen type
+         ELSE
+         lda   ,x
+         sta   >GrfMem+gr00B5
+         ENDC
+         lda   Wt.BLnk,y  get parent window # of this overlay
+* We know this is a overlay window, continue
+         sta   V.WinNum,u   save new window #
+         bsr   L04EA      change to the full size window 
+         ldb   #$0C       get grfdrv function for OWEnd
+         lbsr  L0101      let grfdrv do the rest
+         bcc   L052E      grfdrv went ok, skip ahead
+L052C    puls  y,u,pc     restore & return
+
+
+* Overlay removed, check if we activate menu bar on parent window
+L052E    puls  y,u        Restore static mem & path dsc. ptrs
+         lbsr  L0436      set lines per page in path descriptor
+        
+         IFNE  CoGrf-1
+         IFNE  H6309
+         tste		is screen type a regular no box window?
+         ELSE
+         tst   >GrfMem+gr00B5
+         ENDC
+         beq   L04E7      yes, return
+         IFNE  H6309
+         cmpe  #WT.FSWin  do we have a menu bar on window?
+         ELSE
+         pshs  a
+         lda   >GrfMem+gr00B5
+         cmpa  #WT.FSWin
+         puls  a
+         ENDC
+         bhi   L04E7      no, return
+         lda   >WGlobal+G.CrDvFl     Are we the current active window?
+         beq   L0591      no, no need to update menu bar
+         lbra  L13F5      set menu bar to active state
+         ELSE
+         rts
+         ENDC
+
+****************************
+* Select entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+Select   ldx   PD.RGS,y   get register stack pointer
+         lda   R$A,x      get path # to new window
+         ldx   <D.Proc    get current process pointer
+         cmpa  P$SelP,x   same as current selected path?
+         beq   L0591      yes, nothing to do so return
+         ldb   P$SelP,x   get the current selected path
+         sta   P$SelP,x   save new path
+         pshs  y          save path descriptor pointer
+         bsr   L0592      Get the device table ptr for new window
+         ldx   V$STAT,y   Get static mem ptr
+         cmpx  >WGlobal+G.CurDev     Same as current device?
+         puls  y          restore path descriptor pointer
+         bne   L0590      no match on current device, return
+         pshs  b          save old window path block #
+         leax  ,u         point to static mem
+         lbsr  L06A0      verify window table of new window
+         puls  b          restore old window path block #
+         bcc   L0582      window exists, skip ahead
+         ldx   <D.Proc    get current process pointer
+         stb   P$SelP,x   save old window path number back
+         lbra  L069D      return undefined window error
+
+* New window exists, update screen to it
+L0582    ldu   >WGlobal+G.CurDev     Get current device mem ptr
+         stu   >WGlobal+G.PrWMPt     Save as previoius device mem ptr
+         stx   >WGlobal+G.CurDev     Save new current device mem ptr
+         inc   V.ScrChg,x   Flag screen has changed for AltIRQ routine
+L0590    clrb             clear errors
+L0591    rts              return
+
+* Get ptr to device table
+* Entry: X=Pointer to process descriptor
+*        B=Path block # to get
+* Exit : Y=Pointer to device table entry
+L0592    leax  P$Path,x   get pointer to path #'s
+         lda   b,x        get path block #
+         ldx   <D.PthDBT  get pointer to descriptor block table
+         os9   F$Find64   get pointer to path descriptor
+         ldy   PD.DEV,y   get pointer to device table entry
+         rts              return
+
+****************************
+* CWArea entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+*        X=Pointer to parameters
+CWArea   pshs  y,u        Save device mem ptr & path dsc. ptr on stack
+         lbsr  L06A0      verify window table
+         IFNE  H6309
+         ldq   Wt.CPX,y   get original start & size
+         pshsw             preserve them on the stack
+         ELSE
+         ldd   Wt.CPX+2,y
+         std   >GrfMem+gr00B5
+         pshs  d
+         ldd   Wt.CPX,y
+         ENDC
+         pshs  d
+         lbsr  L0423      move coords to window table
+         bcs   L0609      didn't pan out, restore originals & return error
+* The rest of this is unique to CoWin.  What it does is calculate the
+* maximum allowable window sizes based on the window type defined in the
+* menuing system.
+* NOTE: MAY BE ABLE TO USE E & F FOR SOME OF THE ,S STUFF
+         ldu   6,s        get device static memory pointer
+         lbsr  L06B9      get graphics table entry pointer for this window
+         IFNE  H6309
+         clrd             set starting X/Y coords to 0
+         ELSE
+         clra
+         clrb
+         ENDC
+         pshs  d
+         ldd   Wt.DfSZX,y Get default X/Y sizes from window table
+         pshs  d          Make them the ending X,Y coords
+
+         IFNE  CoGrf-1
+         lda   ,x         get graphics table window type
+         beq   L05E3      If normal window, skip all adjustments
+         deca             Is it a WT.FWin (framed window=1)?
+         bne   L05CB      no, check for scroll bars
+         dec   1,s        Yes, subtract 1 from Y size
+         inc   3,s        Add 1 to Y start
+         bra   L05E3
+
+L05CB    deca             Is it a WT.FSWin (scroll barred window=2)?
+         bne   L05D3      No, has to be Shadowed,double or plain, skip ahead
+         dec   ,s         decrement X size by 1 for right scroll bar
+         bra   L05DD      skip ahead
+
+* Shadowed, double & plain go here - 1 char border on all 4 sides
+L05D3    inc   2,s        add 1 to X start for left border
+         dec   ,s         decrement X size by 2 for left & right borders
+         dec   ,s
+L05DD    inc   3,s        add 1 to Y start for menu bar
+         dec   1,s        decrement Y size by 2 for menu & bottom borders
+         dec   1,s
+         ENDC
+
+L05E3    ldd   Wt.SZX,y   get current X/Y sizes
+         cmpa  ,s         will X size fit?
+         bhi   L0606      no return error
+         cmpb  1,s        will Y size fit?
+         bhi   L0606      no, return error
+         ldd   Wt.CPX,y   get current X/Y start
+         cmpa  2,s        will X start fit?
+         bcs   L0606      no, return error
+         cmpb  3,s        will Y start fit?
+         blo   L0606      no, return error
+         lbsr  L00F7      let grfdrv do the rest
+         bcs   L0606      error from grfdrv, return
+         leas  8,s        eat local data
+         puls  y,u        Get back path dsc. ptr & device mem ptr
+         lbra  L0436      setup lines per page
+
+L0606    leas  4,s        Eat stack buffer & return
+L0609    equ   *
+         IFNE  H6309
+         puls  d          Restore originals
+         pulsw  
+         stq   Wt.CPX,y
+         ELSE
+         ldd   2,s
+         std   Wt.CPX+2,y
+         std   >GrfMem+gr00B5
+         ldd   ,s
+         std   Wt.CPX,y
+         leas  4,s        eat the stack
+         ENDC
+         comb             Illegal coordinates error
+         ldb   #E$ICoord
+         puls  y,u,pc
+
+****************************
+* GCSet entry point
+* Entry: U=Static mem pointer
+*        Y=path descriptor pointer
+*        X=Parameter pointer
+L060C    pshs  u          save static mem pointer
+         lbsr  L06A0      verify window exists, or create it if it isn't
+         lbcs  L069B      couldn't create, exit with error
+         ldd   ,x         get group/buffer from parameters
+         std   >GrfMem+gr0057     Save in Grfdrv mem
+         lbsr  L00F7      let grfdrv do the rest
+         puls  u          restore static mem pointer
+         lbsr  L06B9      get graphics table pointer
+         lda   Wt.GBlk,y  Get graphics cursor memory block #
+         sta   Gt.GBlk,x  save it in graphics table
+         ldd   Wt.GOff,y  Get graphics cursor offset
+         std   Gt.GOff,x  save it in graphics table
+         rts              return
+
+****************************
+* LSet entry point
+LSet     equ   *
+         IFNE  H6309
+         bsr   L06A0      verify window table
+         bcs   L069D      no good, return error 
+         ELSE
+         lbsr  L06A0
+         lbcs   L069D      no good, return error 
+         ENDC
+         lda   ,x         Get LSET type from params
+         sta   Wt.LSet,y  store it in window table
+         lbra  L00F7      let grfdrv do the rest
+
+****************************
+* Border entry point
+Border   pshs  u          preserve static mem
+         bsr   L06A0      verify window table
+         bcs   L069B      not good, return error
+         lda   ,x         Get border color from parm area
+         ldx   Wt.STbl,y  Get screen table ptr
+         sta   St.Brdr,x  Save as border color in screen tbl
+         bra   L0669      Flag for GIME update & exit
+
+****************************
+* FColor/BColor entry point
+BColor
+FColor   bsr   L06A0      verify window table
+         bcs   L069D      not good, return error
+         lda   ,x         Get palette # from param area
+         sta   >GrfMem+gr005A     Put in GRFDRV's working palette #
+L064B    lbra  L00F7      Go into GrfDrv
+
+****************************
+* DefPal entry point
+DefPal   pshs  u          preserve static mem pointer
+         bsr   L06A0      verify window
+         bcs   L069B      not good, return error
+         ldx   Wt.STbl,y  Get ptr to screen table
+         leax  St.Pals,x  Point to palettes in screen table
+         ldd   >WGlobal+G.DefPal     Get ptr to system default palettes
+         IFNE  H6309
+         ldw   #16        # palette registers to copy
+         tfm   d+,x+      Copy into screen table
+         ELSE
+         pshs  y
+         tfr   d,y
+         ldb   #16
+L064Eb   lda   ,y+
+         sta   ,x+
+         decb
+         bne   L064Eb
+         clra
+         std   >GrfMem+gr00B5
+         puls  y
+         ENDC   
+         bra   L0669      Flag for GIME update & exit
+
+****************************
+* Palette entry point
+Palette  pshs  u          preserve static mem pointer
+         bsr   L06A0      verify window table
+         bcs   L069B      not good, return error
+         ldd   ,x         Get palette # & color
+         ldx   Wt.STbl,y  Get screen table ptr
+         anda  #$0f       Only allow palettes 0-15
+         adda  #St.Pals   Palette tbl starts @ +$10
+         stb   a,x        Save in scrn tbl's palette
+L0669    clrb             No error
+         puls  u          restore static mem pointer
+         lda   >WGlobal+G.CrDvFl     Are we the current device?
+         beq   L0673      No, we are done
+         inc   V.ScrChg,u   Yes, flag AltIRQ for screen update
+L0673    rts              return
+
+****************************
+* PSet/Font entry point
+Font
+PSet     bsr   L06A0      verify window table
+         bcs   L069D      not good, return error
+         ldd   ,x         Get group & buffer #'s from parm area
+         beq   L0682      If caller wants to disable pattern set, skip
+         tstb             Is buffer=0?
+         lbeq  L0812      Yes, illegal
+L0682    std   >GrfMem+gr0057     Save group & buffer #'s
+         lbra  L00F7      Go to GrfDrv
+
+****************************
+* KillBuf entry point
+KillBuf  bsr   L06A0      verify window table
+         bcs   L069D      not good, return error
+         ldd   ,x         Get buffer & group #
+         bra   L0682      Save them
+
+* Return undefined window error
+L069B    leas  2,s        Eat stack
+L069D    ldb   #E$WUndef  Window undefined error
+         rts   
+
+* Get window table pointer & verify it
+* Entry: X=parm ptr
+*        Y=Path dsc. ptr
+*        U=Device mem ptr
+* Exit: Y=Window tbl ptr
+*       X=Parm ptr
+L06A0    ldb   V.WinNum,u   Get window # from device mem
+         lda   #Wt.Siz    Size of each entry
+         mul              Calculate window table offset
+         addd  #WinBase   Point to specific window table entry
+         IFNE  H6309
+         tfr   d,w        Move to W (has indexing mode)
+         lda   Wt.STbl,w  Get MSB of scrn tbl ptr
+         ELSE
+         pshs  y
+         tfr   d,y
+         std   >GrfMem+gr00B5
+         lda   Wt.STbl,y
+         puls  y
+         ENDC
+         bgt   VerExit    If $01-$7f, should be ok
+         cmpa  #$ff       Unused?
+         bne   L0697      No, in range of $80-$FE or $00, illegal
+         IFNE  H6309
+         pshsw            Preserve window tbl ptr
+         pshs  x          Preserve param ptr
+         tfr   y,x        Move path dsc. ptr to X
+         tfr   w,y        Move window tbl ptr to Y
+         ELSE
+         pshs  x,y
+         ldx   >GrfMem+gr00B5
+         stx   2,s        pshsw
+         exg   y,x        tfr y,x; tfr w,y
+         ENDC
+         bsr   L06DD      Window doesn't exist, see if we can create
+         puls  x,y,pc     Get parm ptr, window tbl ptr & return
+
+* X still parm ptr, just move window tbl ptr & return
+VerExit  clra             No error
+         IFNE  H6309
+         tfr   w,y        Move window tbl ptr to Y
+         ELSE
+         ldy   >GrfMem+gr00B5
+         ENDC
+         rts              Return
+
+* Return illegal window definition error
+L0697    comb             set carry
+         ldb   #E$IWDef   Illegal window definition error
+         rts
+
+* Get window table ptr for current window
+* Entry: U=Static memory pointer
+* Exit : Y=Window tbl ptr
+L06AE    ldb   V.WinNum,u   Get window # from device mem
+         lda   #Wt.Siz    Size of each entry
+         mul              Calculate window table offset
+         addd  #WinBase   Point to specific window tbl entry
+         tfr   d,y        Put into Y & return
+         rts   
+
+* Get graphics table pointer for current window
+* Entry: U=Static memory pointer
+L06B9    pshs  d          Preserve D
+         lda   V.WinNum,u   Get window #
+         ldb   #GTabSz    Size of each entry
+         mul              Calculate offset
+         ldx   >WGlobal+G.GfxTbl     Get ptr to GFX tables
+         IFNE  H6309
+         addr  d,x        Point to table entry
+         ELSE
+         leax  d,x        Point to table entry
+         ENDC
+         puls  d,pc       Restore D & return
+
+* Verify window table
+* Entry: Y=Window table ptr
+* Unused window, check if device dsc. default is valid
+L06DD    pshs  x          Preserve path dsc ptr
+         ldx   PD.DEV,x   Get device table ptr
+         pshs  x          Preserve it
+         ldx   V$DESC,x   Get device dsc ptr
+         ldb   IT.VAL,x   Window dsc contain a valid type?
+         bne   L06EE      Yes, skip ahead
+         coma             Otherwise, exit with error
+L06EB    leas  4,s        Eat stack & return
+         rts   
+
+* Unused window with valid device dsc type
+* X=Ptr to window's device dsc.
+L06EE    lda   IT.STY,x   Get descriptor's screen type
+         lbsr  L07E0      Go get GrfDrv internal screen type
+         bcc   L06FA      Good window type found, continue
+         leas  4,s        Eat stack & exit with error
+         bra   L0697
+
+* Valid screen type
+L06FA    stb   >GrfMem+Gr.STYMk     Preserve GrfDrv window type
+         cmpb  #$FF       Current screen?
+         beq   L070B      Yes, skip ahead
+         lda   IT.BDC,x   Get default border color
+         sta   >GrfMem+gr005A     Put into palette area in grfdrv mem
+         bra   L070F
+
+* If window is supposed to be on same screen, do this
+L070B    pshs  x          preserve device descriptor pointer
+         ldx   4,s        get path descriptor pointer
+         bsr   L075C      Set up screen table ptr in window table
+         puls  x          restore device descriptor pointer
+         bcs   L06EB      If error, eat stack & leave
+
+L070F    ldd   IT.CPX,x   Get start X coordinate from dsc
+         IFNE  H6309
+         ldw   IT.COL,x
+         stq   Wt.CPX,y   Put into window table
+         ELSE
+         std   Wt.CPX,y
+         ldd   IT.COL,x
+         std   >GrfMem+gr00B5
+         std   Wt.CPX+2,y
+         ENDC
+         ldd   IT.FGC,x   Get foreground & background default colors
+         std   Wt.Fore,y  Save in window table
+         ldb   #$04       GrfDrv function: DWSet
+         lbsr  L0101      Go make the window
+         puls  x          Get device dsc. ptr back
+         bcc   L0730      no error, skip ahead
+         ldd   #$FFFF     Error, Reset window table entry as 'unused'
+         std   Wt.STbl,y
+         leas  2,s        Eat stack & return
+L075B    rts   
+
+* Last part of DWSet
+L0730    ldx   V$STAT,x   Get device's static mem ptr
+         inc   V.InfVld,x   Set flag indicating rest of table is valid
+         leau  ,x         Point U to static storage
+         tfr   y,d        Move window table ptr to D
+         puls  y          Get path dsc. ptr back into Y
+         pshs  d          Save window table ptr on stack
+         lbsr  L0436      Set up some default size values
+         puls  y          Get window table ptr back
+         tst   >WGlobal+G.CrDvFl     Are we current device?
+         beq   L075B      No, skip ahead
+         IFNE  H6309
+         ldw   >WGlobal+G.CurDev     Get current device's static mem ptr
+         stw   >WGlobal+G.PrWMPt     Move to old device's static mem ptr
+         lda   >V.ULCase,w  Get old device's special keyboard flags
+         ELSE
+         pshs  x
+         ldx   >WGlobal+G.CurDev     Get current device's static mem ptr 
+         stx   >WGlobal+G.PrWMPt     Move to old device's static mem ptr
+         stx   >GrfMem+gr00B5 
+         lda   >V.ULCase,x  Get old device's special keyboard flags
+         puls  x
+         ENDC 
+         sta   V.ULCase,x   Save in new device (kybrd mouse in Gshell)
+         stx   >WGlobal+G.CurDev     Make it the current device's static mem ptr
+         lbra  L0C86      Select the window & do setmouse in VTIO
+
+* If current screen window, go here
+* Entry: A=Screen type from caller
+*        B=Internal screen type
+*        X=Path descriptor ptr
+*        Y=Window table ptr
+* Exit: Screen table ptr in window dsc. table is set
+L075C    cmpa  #$FF       Current displayed screen?
+         bne   L076D      No, must be process' current screen
+         ldd   >GrfMem+gr0030     Get current screen table ptr
+         bne   L076A      There is one, continue
+         comb             Otherwise, window undefined error
+         lbra  L069D
+
+L076A    std   Wt.STbl,y  Store screen table ptr in window table & return
+         rts   
+
+* Verify that current process window is compatible with current window
+* Entry: X=Path descriptor pointer
+*        Y=Window table pointer of current window
+L076D    pshs  x,y        Preserve window table ptr & path dsc. ptr
+         ldx   <D.Proc    Get current process dsc. ptr
+         ldb   P$SelP,x   Get selected path for current window
+         lbsr  L0592      Get device table ptr for the path (into Y)
+         ldx   ,s         Get back path dsc. ptr
+         ldx   PD.DEV,x   Get device table entry address
+         ldd   V$DRIV,x   drivers match?
+         cmpd  V$DRIV,y
+         bne   L07AB      No, they aren't compatible, exit with error
+         ldy   V$STAT,y   Get device driver static storage ptr
+         lda   V.TYPE,y   Get device type
+         bpl   L07AB      not a window, exit with error
+         lda   V.WinType,y  Get type of window flag
+         bne   L07AB      If not a Grf/CoWin window, error
+         lda   V.InfVld,y   Get 'device mem info is valid' flag
+         beq   L07AB      If clear, error
+         leau  ,y         Point U to static mem
+         lbsr  L06AE      Get window table ptr for process window
+         lda   Wt.STbl,y  screen table active?
+         bmi   L07AB      no, exit with illegal window def. error
+         leas  2,s        Eat window device dsc. ptr
+         ldd   WT.STbl,y  Get screen table ptr of process window
+         puls  y          Get window tbl ptr
+         std   WT.Stbl,y  Put into current window's screen tbl ptr
+         clra             No error
+         rts              return
+
+L07AB    puls  y,x        Restore regs & illegal window definition error
+         lbra  L0697
+
+* Search for empty window table & setup window links
+* Entry: U=Device static mem ptr
+* Exit : Y=New window table pointer
+L07B0    pshs  d,x        Save regs used
+         leay  ,u         Point to device static storage
+         ldx   #WinBase   swap it into X for ABX
+         ldd   #Wt.Siz    A=Start entry #(0), B=Entry size
+         IFNE  H6309
+L07B8    ldw   Wt.STbl,x  get screen table pointer
+         ELSE
+L07B8    pshs  y
+         ldy   Wt.STbl,x
+         sty   >GrfMem+gr00B5
+         puls  y
+         ENDC
+         bpl   L07CF      if high bit clear, table used, skip to next
+         IFNE  H6309
+         cmpf  #$FF       if LSB not a $ff, then check next one
+         ELSE
+         pshs  b
+         ldb   >GrfMem+gr00B5+1
+         cmpb  #$FF
+         puls  b
+         ENDC
+         bne   L07CF
+* Found empty entry, link it in & make current device (static mem) point to
+* new table entry
+         ldb   V.WinNum,y   Get current window table #
+         stb   Wt.BLnk,x  Save it as back link #
+         sta   V.WinNum,y   Save new window table entry #
+         dec   Wt.STbl+1,x make LSB of screen table ptr $fe
+         tfr   x,y        move window table pointer to Y
+         clrb             Clear carry
+         puls  d,x,pc     Restore & return
+
+L07CF    inca             Move to next table #
+         cmpa  #$20       Past max table #?
+         bhi   L07D9      Yes, exit with error
+         abx              Nope, point to next one
+         bra   L07B8      Go try again
+
+* BUG @ approx L1789, it calls this routine, but does NOT check for a window
+* table full error... it just stores Y assuming it worked.
+L07D9    tfr   x,y        move window table pointer to Y
+         comb             Set carry
+         ldb   #E$TblFul  Get table full error code
+         stb   1,s        Save it in B on stack for restore
+         puls  d,x,pc     Restore & return
+
+* Convert STY mark to internal type
+* Entry: A=Requested screen type from parameters
+* Exit : B=Internal screen type marker
+L07E0    pshs  a,y        Preserve sty & window entry
+         inca             Bump up so $FF type is now 0
+         cmpa  #9         Past maximum allowable?
+         bhi   L07F5      Yes, exit with error
+         leay  <L07F9,pc  Point to conversion table (base 0)
+         ldb   a,y        Get internal code
+         cmpb  #$FE       Invalid?
+         beq   L07F5      Yes, exit
+         clra             Clear carry
+         puls  a,y,pc     Restore & return
+
+L07F5    comb             Set carry
+         puls  y,a,pc     Restore regs & return
+
+* Screen type conversion table
+L07F9    fcb   $ff        Current screen, sty=$ff
+         fcb   $ff        Current screen, sty=$00
+         fcb   $86        40 column, sty=$01
+         fcb   $85        80 column, sty=$02
+         fcb   $fe        Invalid, sty=$03
+         fcb   $fe        Invalid, sty=$04
+         fcb   $01        640 2 color, sty=$05
+         fcb   $02        320 4 color, sty=$06
+         fcb   $03        640 4 color, sty=$07
+         fcb   $04        320 16 color, sty=$08
+
+BadDef   comb  
+         ldb   #E$IllArg
+         rts   
+
+****************************
+* DefGPB entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+*        X=Parameter pointer
+DefGPB   lbsr  L06A0      verify window table
+         lbcs  L069D      not good, return error
+         IFNE  H6309
+         ldq   ,x         D=Group/Buffer W=Length
+         ELSE
+         ldd   2,x
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         ENDC
+         tsta             group a zero?
+         beq   L0812      yes, illegal return error
+         cmpa  #$FF       is he trying to use overlay group?
+         bne   L0816      no, go on
+* Return bad buffer error
+L0812    comb             set carry
+         ldb   #E$BadBuf  get error code
+         rts              return to caller
+
+* check buffer #
+L0816    tstb             buffer a zero?
+         beq   L0812      yes, illegal return error
+         IFNE  H6309
+         tstw             length a zero?
+         ELSE
+         pshs  d
+         ldd   >GrfMem+gr00B5
+         puls  d
+         ENDC
+         beq   BadDef     yes, return error
+         std   >GrfMem+gr0057     save group/buffer #'s in global mem
+         IFNE  H6309
+         stw   >GrfMem+gr0080     save length in global mem
+         ELSE
+         pshs  d
+         ldd   >GrfMem+gr00B5
+         std   >GrfMem+gr0080     save length in global mem
+         puls  d
+         ENDC 
+L0822    lbra  L00F7      let grfdrv do the rest
+
+****************************
+* GetBlk entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+*        X=Parameter pointer
+GetBlk   lbsr  L06A0      verify window table
+         lbcs  L069D      couldn't get it, return error
+         bsr   L0849      check group/buffer #'s & move upper left coords
+         bcs   L0812      error, return bad buffer
+         bsr   L085C      get X/Y sizes
+         lbcc  L00F7      let grfdrv do the rest if no error
+SmlBuf   ldb   #E$BufSiz  get error code
+         rts              return
+
+****************************
+* PutBlk entry point
+PutBlk   lbsr  L06A0      verify window table
+         lbcs  L069D      exit if error
+         bsr   L0849      get parameters
+         bcs   L0812      exit if error
+         lbra  L00F7      let grfdrv do rest
+
+* Check passed Group & buffer parameters and move start co-ordinates
+L0849    ldd   ,x++       get group/buffer #'s
+         tsta             group a zero?
+         beq   L086E      yes, return error
+         cmpa  #$FF       trying to use overlay?
+         beq   L086E      yes, return error
+         tstb             buffer a zero?
+         beq   L086E      yes, return error
+         std   >GrfMem+gr0057     save group/buffer to global memory
+         lbsr  L0A32      move start coords
+         clra             clear errors
+         rts              return
+
+* Parse passed X/Y sizes & move if ok
+* Entry: X=Parameter pointer
+* Exit : X - Incremented by 4
+         IFNE  H6309
+L085C    ldq   ,x         D=X Size, W=Y size
+         tstd             X size a zero?
+         ELSE
+L085C    ldd   2,x
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         ENDC
+         beq   L086E      yes, return error
+         IFNE  H6309
+         tstw             Y size a zero?
+         ELSE
+         ldd   2,x
+         ENDC
+         beq   L086E      yes, return error
+         IFNE  H6309
+         stq   >GrfMem+gr004F     save sizes into grfdrv mem
+         ELSE
+         std   >GrfMem+gr004F+2     save sizes into grfdrv mem
+         ldd   ,x
+         std   >GrfMem+gr004F     save sizes into grfdrv mem
+         ENDC
+         ldb   #4         adjust parameter pointer
+         abx   
+L086C    clra             clear errors
+         rts              return
+
+L086E    coma             set carry for error
+         rts              return
+
+****************************
+* GPLoad entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+*        X=Parameter pointer
+GPLoad   pshs  u,y        save regs
+         lbsr  L06AE      get window table pointer for this window
+         ldd   ,x++       get group & buffer
+         tsta             group a zero?
+         beq   L087D      yes, return error
+         cmpa  #$FF       is he using overlay group?
+         bne   L0881      no, so far so good
+L087D    puls  u,y        purge stack
+         IFNE  H6309
+         bra   L0812      return error
+         ELSE
+         lbra  L0812
+         ENDC
+
+* parse buffer & screen type parameters
+L0881    tstb             buffer a zero?
+         beq   L087D      yes, return error
+         std   >GrfMem+gr0057     save it in grfdrv mem.
+         lda   ,x+        get screen type
+         lbsr  L07E0      convert it to internal screen type
+         tstb             is it a graphics screen?
+         bpl   L0894      yes, skip ahead
+         puls  u,y        restore regs
+         lbra  L0697      return illegal window definition error
+
+* parse X/Y size & buffer size parameters
+L0894    stb   >GrfMem+Gr.STYMk     save screen type
+         bsr   L085C      get X/Y sizes
+         bcc   GdSiz      no error, skip ahead
+         leas  4,s        eat stack
+         bra   SmlBuf     return error
+
+GdSiz    ldd   ,x++       get size of buffer
+         std   Wt.BLen,y  save it in window table as a counter
+         pshs  y          preserve global mem & window table pointer
+         lbsr  L00F7      let grfdrv do some work
+         puls  y          restore pointers
+         bcs   L08CA      error from grfdrv, eat stack & return
+* get buffer count grfdrv made & start the move process
+L08A8    ldd   Wt.BLen,y  get buffer counter
+         cmpd  #72        more than 72 bytes left?
+         bhi   L08CD      yes, skip last move
+* last gpload buffer move
+         stb   >WGlobal+g0070     save LSB of count
+         tfr   b,a        copy count to A
+         leax  <L08BE,pc  get vector to buffer move processor
+L08B9    puls  u,y        restore static mem & path descriptor pointers
+         lbra  L0362      save into parameter area of static mem.
+
+* last buffer move parameter processor
+L08BE    pshs  u,y        preserve static mem & path descriptor pointers
+         lbsr  L06AE      get window table pointer
+         bsr   L08EA      Move data to shared buffer & then Grfdrv
+*         bcs   L08CA      error, return
+L08CA    leas  4,s        purge stack
+         rts              return
+
+* multi gpload buffer move
+L08CD    subd  #72        subtract 72 from count
+         std   Wt.BLen,y  save count
+         lda   #72
+         sta   >WGlobal+g0070
+         leax  <L08DD,pc  get vector
+         bra   L08B9      save into parameter area of static mem.
+
+* Place VTIO comes to for next gpload sub-buffer
+L08DD    pshs  u,y        Preserve static & path dsc. ptrs
+         lbsr  L06AE      Get window tbl ptr
+         bsr   L08EA      Move data to shared buffer & then Grfdrv
+         bcc   L08A8      Continue moving until whole GPLoad done
+         bra   L08CA      Error from Grfdrv, exit with it
+
+* Move buffer to global area for GrfDrv
+L08EA    ldu   #$1200     Point to global move area
+         IFNE  H6309
+         ldf   >WGlobal+g0070     get byte count
+         clre  
+         tfm   x+,u+      move it
+         ELSE
+         pshs  a
+         ldb   >WGlobal+g0070     get byte count
+L08EAb   lda   ,x+
+         sta   ,u+
+         decb
+         bne   L08EAb
+         clra
+         std   >GrfMem+gr00B5
+         puls  a 
+         ENDC
+* Send move buffer to GrfDrv
+* Special problem. Seems to pass info via regF.
+L08FC    equ   *
+         IFNE  H6309
+         ldf   >WGlobal+g0070     get count
+         ELSE
+         ldb   >WGlobal+g0070
+*         stb   >GrfMem+$B6        grfdrv regF
+         stb   >GrfMem+gr00B5+1   cowin regF
+         ENDC
+         ldb   #$32       get move buffer code
+         lbra  L0101      send it to grfdrv & return from there
+
+****************************
+* PutGC entry point
+PutGC    lbsr  L06A0      verify window
+         lbcs  L069D
+         IFNE  H6309
+         ldq   ,x         get position requested
+         stq   >GrfMem+gr005B     save in grfdrv mem
+         ELSE
+         ldd   2,x
+         std   >GrfMem+gr005B+2     save in grfdrv mem
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         std   >GrfMem+gr005B     save in grfdrv mem
+         ENDC 
+         lbra  L00F7      go do it
+
+****************************
+* SetDPtr entry point
+SetDPtr  pshs  x,u        preserve static mem & param pointers
+         lbsr  L06A0      Verify/Create window
+         bcc   L092A      Got window, continue
+L0925    puls  x,u        Restore regs & exit with error
+         lbra  L069D
+
+L092A    pshs  y          save window table pointer
+         bsr   L098D      Get graphics table ptr into y
+         IFNE  H6309
+         ldq   ,x         get co-ordinates from parameters
+         stq   Gt.GXCur,y put co-ordinates into graphics table
+         ELSE
+         ldd   2,x
+         std   Gt.GXCur+2,y put co-ordinates into graphics table
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         std   Gt.GXCur,y put co-ordinates into graphics table
+         ENDC 
+L0934    puls  y
+         leas  4,s
+         clrb  
+         rts   
+
+****************************
+* RSetDPtr
+RSetDPtr pshs  u,x
+         lbsr  L06A0      Verify/create window
+         bcs   L0925
+         pshs  y
+         bsr   L098D      Get graphics table ptr into y
+         IFNE  H6309
+         ldq   ,x         Get graphics cursor coords
+         addd  Gt.GXCur,y Add to graphics cursor coords
+         addw  Gt.GYCur,y
+         stq   Gt.GXCur,y Save update cursor coords
+         ELSE
+         ldd   2,x
+         addd  Gt.GYCur,y
+         std   Gt.GXCur+2,y
+         std   >GrfMem+gr00B5 
+         ldd   ,x
+         addd  Gt.GXCur,y
+         std   Gt.GXCur,y
+         ENDC
+         bra   L0934
+
+****************************
+* Point entry point
+Point    pshs  u,x
+         lbsr  L06A0
+         bcs   L0925
+         pshs  y
+         bsr   L098D
+         lbsr  L0A32
+L0961    puls  y
+         leas  4,s
+         lbra  L00F7
+
+****************************
+* RPoint entry point
+RPoint   pshs  u,x
+         lbsr  L06A0
+         bcs   L0925
+         pshs  y
+         bsr   L098D
+         IFNE  H6309
+         ldq   ,x         Get coord offsets
+         addd  Gt.GXCur,y Add to X
+         addw  Gt.GYCur,y Add to Y
+         stq   >GrfMem+gr0047     Save in GRFDRV mem
+         ELSE
+         ldd   2,x
+         addd  Gt.GYCur,y
+         std   >GrfMem+gr0047+2
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         addd  Gt.GXCur,y
+         std   >GrfMem+gr0047
+         ENDC
+         bra   L0961
+
+****************************
+* Line/Box/Bar entry point
+Line
+Bar
+Box      pshs  u,x
+         lbsr  L06A0
+         bcs   L0925
+L0984    pshs  y
+         bsr   L098D
+         lbsr  L0A51
+L098B    bra   L0961
+
+* Get graphics table pointer into Y
+L098D    ldu   6,s        get static mem pointer
+         lbsr  L06B9      get graphics table pointer
+         tfr   x,y        move it to Y
+         ldx   4,s        get parameter pointer
+         rts              return
+
+****************************
+* RLine/RBox/RBar entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+*        X=Parameter pointer
+RLine
+RBox
+RBar     pshs  u,x        save static & parameter pointers
+         lbsr  L06A0      get window table pointer
+         IFNE  H6309
+         bcs   L0925
+         ELSE
+         lbcs  L0925
+         ENDC
+L09A3    pshs  y          preserve window table pointer
+         bsr   L098D      get graphics table pointer
+         lbsr  L0A5E
+         bra   L0961
+
+****************************
+* LineM entry point
+LineM    pshs  u,x
+         lbsr  L06A0
+         lbcs  L0925
+         pshs  y
+         bsr   L098D
+         IFNE  H6309
+         bsr   L0A51
+         ELSE
+         lbsr  L0A51
+         ENDC
+
+L09BC    equ   *
+         IFNE  H6309
+         ldq   >GrfMem+gr004B
+         stq   Gt.GXCur,y
+         ELSE
+         ldd   >GrfMem+gr004B+2
+         std   Gt.GXCur+2,y
+         std   >GrfMem+gr00B5
+         ldd   >GrfMem+gr004B
+         std   Gt.GXCur,y
+         ENDC
+         bra   L0961
+
+****************************
+* RLineM entry point
+RLineM   pshs  u,x
+         lbsr  L06A0
+         lbcs  L0925
+         pshs  y
+         bsr   L098D
+         IFNE  H6309
+         bsr   L0A5E
+         ELSE
+         lbsr  L0A5E
+         ENDC
+         bra   L09BC
+
+* Filled Circle/Ellipse entry point
+Filled   lda   #1         Filled flag
+         sta   >GrfMem+gr00B2     Save flag
+         bra   FlagSet    skip ahead
+
+* FFill/Circle/Ellipse/Arc entry point
+Circle
+Ellipse
+Arc
+FFill    clr   >GrfMem+gr00B2     Clear filled flag
+FlagSet  pshs  u,x        Preserve regs
+         lbsr  L06A0      verify window table
+         lbcs  L0925      error, return
+         pshs  y          preserve window table pointer
+         ldu   4,s        get device static mem pointer
+         ldb   V.CallCde,u  get grfdrv call #
+         pshs  b          save it
+         lbsr  L06B9      get graphics table pointer
+         tfr   x,y        move it to Y
+         ldx   3,s        get parameter pointer
+
+         IFNE  H6309
+         ldq   Gt.GXCur,y Get coords from graphics table
+         stq   >GrfMem+gr0047     Save in GRFDRV mem
+         ELSE
+         ldd   Gt.GXCur+2,y
+         std   >GrfMem+gr00B5
+         std   >GrfMem+gr0047+2
+         ldd   Gt.GXCur,y
+         std   >GrfMem+gr0047
+         ENDC
+         puls  b          restore callcode
+         cmpb  #$56       is it flood fill?
+         beq   L0A2D      yes, let grfdrv do it
+         IFNE  H6309
+         ldw   ,x++       get X radius from parameters
+         stw   >GrfMem+gr0053     save it in grfdrv mem
+         ELSE
+         pshs  y
+         ldy   ,x++       get X radius from parameters
+         sty   >GrfMem+gr0053     save it in grfdrv mem
+         sty   >GrfMem+gr00B5
+         puls  y
+         ENDC 
+         cmpb  #$50       is it circle?
+         beq   L0A2D      yes, let grfdrv do it
+         IFNE  H6309
+         ldw   ,x++       get Y radius from parameters
+         stw   >GrfMem+gr0055     save it in grfdrv mem
+         ELSE
+         pshs  y
+         ldy   ,x++       get Y radius from parameters
+         sty   >GrfMem+gr0055     save it in grfdrv mem
+         sty   >GrfMem+gr00B5
+         puls  y
+         ENDC
+         cmpb  #$52       is it ellipse?
+         beq   L0A2D      yes, let grfdrv do it
+         ldy   #GrfMem+gr0020     Move rest of parameters for ARC
+         IFNE  H6309
+         ldw   #8
+         tfm   x+,y+
+         ELSE
+         pshs  d
+         ldb   #8
+L0A2Db   lda   ,x+
+         sta   ,y+
+         decb
+         bne   L0A2Db
+         clra
+         std   >GrfMem+gr00B5
+         puls  d
+         ENDC
+L0A2D    lbra  L0961      let grfdrv do the rest
+
+* Move X/Y co-ordinates from parameters into GrfDrv memory
+
+L0A32    equ   *
+         IFNE  H6309
+         ldq   ,x         Get X/Y coords
+         stq   >GrfMem+gr0047     Save in GRFDRV mem
+         ELSE
+         ldd   2,x
+         std   >GrfMem+gr00B5 
+         std   >GrfMem+gr0047+2     Save in GRFDRV mem 
+         ldd   ,x
+         std   >GrfMem+gr0047     Save in GRFDRV mem
+         ENDC
+         ldb   #4         Bump param ptr up
+         abx   
+         rts   
+
+* Move current draw pointer co-ordinates from graphics table 
+* and destination co-ordinates from parameters into GrfDrv memory
+* Entry: X=Parameter pointer
+*        Y=Graphics table pointer
+
+         IFNE  H6309
+L0A51    ldq   Gt.GXCur,y Get coords from graphics table
+         stq   >GrfMem+gr0047     Save in GRFDRV mem
+         ldq   ,x         Get X/Y coords from params
+L0A59    stq   >GrfMem+gr004B
+         ELSE
+L0A51    ldd   Gt.GXCur,y Get coords from graphics table
+         std   >GrfMem+gr0047     Save in GRFDRV mem 
+         ldd   Gt.GXCur+2,y Get coords from graphics table
+         std   >GrfMem+gr0047+2     Save in GRFDRV mem
+         ldd   2,x
+         std   >GrfMem+gr00B5
+         ldd   ,x
+L0A59    pshs  d
+         ldd   >GrfMem+gr00B5
+         std   >GrfMem+gr004B+2
+         puls  d
+         std   >GrfMem+gr004B
+         ENDC
+         ldb   #4         Bump param ptr past bytes we got
+         abx   
+         rts   
+
+* Move current draw pointer co-ordinates from graphics table & calculate
+* Destination draw pointer from parameters & move into GrfDrv memory
+* Entry: X=Parameter pointer
+*        Y=Graphics table pointer
+
+         IFNE  H6309
+L0A5E    ldq   Gt.GXCur,y Get coords from graphics table
+         stq   >GrfMem+gr0047     Save in GRFDRV mem
+         ldq   ,x         Get X/Y coords from params
+         addd  Gt.GXCur,y Make relative
+         addw  Gt.GYCur,y
+         ELSE
+L0A5E    ldd   Gt.GXCur,y Get coords from graphics table 
+         std   >GrfMem+gr0047     Save in GRFDRV mem
+         ldd   Gt.GXCur+2,y Get coords from graphics table
+         std   >GrfMem+gr0047+2     Save in GRFDRV mem
+         ldd   2,x
+         addd  Gt.GYCur,y
+         std   >GrfMem+gr00B5
+         ldd   ,x         Get X/Y coords from params
+         addd  Gt.GXCur,y Make relative
+         ENDC
+         bra   L0A59      Save & bump param ptr
+
+****************************
+* Get status entry point
+* Entry: A=Function call #
+GetStt   cmpa  #SS.ScSiz  get screen size?
+         beq   L0A9A      yes, go process
+         cmpa  #SS.Palet  get palettes?
+         beq   L0AA7      yes, go process
+         cmpa  #SS.ScTyp  get screen type?
+         beq   L0AD5      yes, go process
+         cmpa  #SS.FBRgs  get colors?
+         lbeq  L0AF4      yes, go process
+         cmpa  #SS.DfPal  get default colors?
+         beq   L0AC3      yes, go process
+         IFNE  CoGrf-1
+         cmpa  #SS.MnSel  menu select?
+         lbeq  L1515      yes, go process
+         ENDC
+         cmpa  #SS.ScInf  screen info?
+         beq   SS.SInf    yes, go process
+         lbra  L0A96      All others illegal
+
+* SS.ScInf processor ($8F)
+* New call to get info on current screen for use with direct mapped video
+*  Programmer can even handle non-full sized window
+*  Programmer will still have to get screen type to determine # bytes/line &
+*  # of rows
+* Returns: X=Offset into first block of screen start
+*          A=# 8k blocks required for screen
+*          B=Start block #
+*          Y=High byte=X start of window
+*            Low byte= X size of window
+*          U=High byte=Y start of window
+*            Low byte= Y size of window
+* It should be noted that these are the current working area, not the original
+*  window start/sizes
+
+SS.SInf  bsr   L0ACB      get register & window table pointers
+         ldd   Wt.LStrt,y get current screen logical start
+         suba  #$80       make it a offset into 1st block
+         std   R$X,x      save it to caller
+         IFNE  H6309
+         ldq   Wt.CPX,y   Get X&Y coord starts & X/Y sizes
+         exg   b,e        Swap so registers easier for programmer
+         stq   R$Y,x      Save X values & Y values into callers Y & U
+         ELSE
+         ldd   Wt.CPX,y
+         sta   R$Y,x
+         stb   R$Y+2,x
+         stb   >GrfMem+gr00B5
+         ldd   Wt.CPX+2,y
+         sta   R$Y+1,x
+         stb   R$Y+3,x
+         stb   >GrfMem+gr00B5+1
+         ENDC
+         ldd   [Wt.STbl,y] get screen type & start block #
+         anda  #$0f       make it fit table
+         leau  <NmBlks-1,pc point to # blocks needed for screen type
+         lda   a,u        get # blocks
+         std   R$D,x      save it to caller
+         rts   
+
+NmBlks   fcb   2,2,4,4,1,1
+
+* SS.ScSiz processing - Current size (with CWArea's in effect), not DWSet size
+L0A9A    bsr   L0ACB      get register stack pointer & window table pointer
+         clra  
+         ldb   Wt.SZX,y   get X size
+         std   R$X,x      save it to caller
+         ldb   Wt.SZY,y   get Y size
+         std   R$Y,x      save it to caller
+         clrb  
+         rts   
+
+* SS.Palet processing
+L0AA7    bsr   L0ACB      get register stack & window table pointers
+         ldy   Wt.STbl,y  get screen table pointer
+         leay  St.Pals,y  point to palettes
+L0AAF    ldu   R$X,x      get callers buffer pointer
+         ldx   <D.Proc    get task # of caller
+         ldb   P$Task,x
+         ldx   <D.SysPrc  get task # of system
+         lda   P$Task,x
+         tfr   y,x
+L0ABB    ldy   #16        get # bytes to move
+         os9   F$Move     move 'em
+         rts              return
+
+* SS.DfPal processing
+L0AC3    ldx   PD.RGS,y   get register stack pointer
+         ldy   >WGlobal+G.DefPal     get pointer to default palettes
+         bra   L0AAF      go move 'em
+
+* Get register stack pointer into X, window table pointer into Y & global mem
+L0ACB    ldx   PD.RGS,y   Get ptr to caller's register stack
+         lbsr  L06A0      Go find window table entry
+         lbcs  L069B      Error, exit
+         rts              Return
+
+* SS.ScTyp processing
+L0AD5    bsr   L0ACB      get register stack & window table pointers
+         ldb   [Wt.STbl,y] get screen type
+         bmi   L0AE2      text, skip ahead
+         addb  #$04       add 4 to make it a user screen type
+         bra   L0AEC      go save it
+
+L0AE2    cmpb  #$86       40 column text?
+         bne   L0AEA      no, skip ahead
+         ldb   #$01       get screen type for 40 column text
+         bra   L0AEC      save it
+
+L0AEA    ldb   #$02       get screen type for 80 column text
+L0AEC    stb   R$A,x      save it to caller
+         clrb  
+         rts   
+
+* Color mask for fore/back palette registers
+L0AF0    fcb   $01        2 color screens
+         fcb   $03        4 color screens
+         fcb   $0f        16 color screens
+         fcb   $0f        16 color screens
+
+* SS.FBRgs processing
+L0AF4    bsr   L0ACB      get register stack & window table pointers
+         bsr   L0B01      Go get fore/back ground colors
+         std   R$D,x      Save in caller's D
+         ldb   St.Brdr,u  Get border register
+         clra             D=border color
+         std   R$X,x      Save in caller's X & return
+         rts   
+
+L0B01    ldb   [Wt.STbl,y] Get screen type from screen table
+         andb  #$07       Mask off text mode, etc.
+         lsrb             Divide by 2 (for similiar screens)
+         leau  <L0AF0,pc  Point to masking table
+         ldb   b,u        Get table entry
+         tfr   b,a        Dupe for background color too
+         IFNE  H6309
+         andd  Wt.Fore,y  Mask with fore/bckground colors from window tbl
+         ELSE
+         anda  Wt.Fore,y
+         andb  Wt.Fore+1,y
+         ENDC
+         ldu   Wt.STbl,y  Get screen table ptr for border reg
+         rts   
+
+****************************
+* Set status entry point
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+SetStt   cmpa  #SS.Open   Open window call (for /W)
+         beq   L0B4B
+         cmpa  #SS.MpGPB  Map Get/Put buffer into callers program space
+         lbeq  L0BD1
+         cmpa  #SS.DfPal  Set default palettes
+         beq   L0B38
+         IFNE  CoGrf-1
+         cmpa  #SS.WnSet
+         lbeq  L0D23
+         cmpa  #SS.SBar
+         lbeq  L1AB9
+         cmpa  #SS.UmBar  Update menu bar
+         lbeq  L13F5
+         ENDC
+         lbra  L0A96
+
+* SS.DfPal entry point
+L0B38    ldx   PD.RGS,y   get register stack pointer
+         ldx   R$X,x      get pointer to palettes
+         ldu   <D.Proc    get task # of caller
+         lda   P$Task,u
+         ldu   <D.SysPrc  get task # of system
+         ldb   P$Task,u
+         ldu   >WGlobal+G.DefPal     get pointer to destination of palettes
+         lbra  L0ABB      move 'em
+
+* SS.Open processor
+* Entry: X=Register stack pointer
+*        U=Static memory pointer
+*        Y=Path descriptor pointer
+L0B4B    pshs  u,y        preserve registers
+         ldx   PD.DEV,y   get pointer to device table entry
+         ldx   V$DESC,x   get pointer to descriptor
+         ldb   IT.WND,x   get window # from descriptor
+         bpl   L0BCD      not a legal window descriptor, return
+         pshs  x          save device descriptor pointer
+L0B58    equ   *
+         IFNE  H6309
+         clrd             start window #=0
+         ELSE
+         clra
+         clrb
+         ENDC
+         lbsr  L025B      find a free window in bit map
+         bcc   L0B65      got one, skip ahead
+         puls  u,y,x      purge stack
+         comb             set carry
+         ldb   #E$MNF     get module not found error
+         rts              return
+
+* Found a free window
+L0B65    pshs  b          save window # of free entry
+         lbsr  L024A      allocate the window we found
+         ldy   #$1200     Point to a buffer area (GPLoad area)
+         ldb   #'w        get window name prefix
+         stb   ,y+        put it in buffer
+         ldb   ,s         get window # that was free
+* Convert window # in B to ASCII eqivalent with high bit set
+
+         IFNE  H6309
+         divd  #10        divide it by 10
+         ELSE
+         lda   #-1
+L0B87b   inca
+         subb  #10
+         bcc   L0B87b
+         addb  #10
+         exg   a,b
+         cmpb  #0
+         ENDC
+         beq   L0B87      if answer is 0 there is only 1 digit, skip ahead 
+         orb   #$30       make first digit ASCII
+         stb   ,y+        put it in buffer
+L0B87    ora   #$B0       make remainder ASCII with high bit set
+         sta   ,y+        put it in buffer
+L0B92    leas  -2,s       make a buffer for process decriptor pointer
+         lbsr  L0238      switch to system process descriptor
+         ldx   #$1200     Point to calculated dsc. name
+         lda   #Devic+Objct get module type
+         os9   F$Link     try & link it
+         lbsr  L0244      switch back to current process
+         leas  2,s        purge stack
+         bcc   L0BAB      it's linked, skip ahead
+L0BA7    leas  1,s        purge window #
+         bra   L0B58      go look for another one
+
+* Got a device descriptor, put into device table & save window # into static
+L0BAB    lda   IT.PAR,u   valid window?
+         bpl   L0BA7      no, go look for another one
+         ldy   3,s        get path descriptor pointer
+         ldx   PD.DEV,y   get pointer to device table
+         stu   V$DESC,x   save pointer to descriptor into it
+         ldb   ,s         get window #
+         ldu   5,s        get static mem pointer
+         stb   V.DWNum,u    save window # as active window in static mem
+         ldu   1,s        get pointer to descriptor
+         os9   F$UnLink   unlink it from system map
+         ldu   5,s        get static mem pointer
+         leas  7,s        purge stack
+         rts              Return with or without error
+
+L0BCD    clrb             No error
+         puls  u,y,pc     Restore regs & return
+
+* SS.MpGPB (map get/put buffer)
+* Parameters: X=Group/Buffer #'s
+*             Y=Map/Un-Map flag, 0=Un-Map, 1+=Map
+* Returns   : X=Start address of buffer in 64k user map
+*             Y=Length of buffer
+* Entry: U=Static memory pointer
+*        Y=Path descriptor pointer
+L0BD1    ldx   PD.RGS,y   get register stack pointer
+         pshs  x          preserve it
+         lbsr  L06A0      verify window table
+         ldd   R$X,x      get group/buffer #'s
+         std   >GrfMem+gr0057     save it to grfdrv mem
+         ldb   #$38       get grfdrv function call to map
+         lbsr  L0101      let grfdrv calculate block # & count
+         ldb   >GrfMem+gr0097     get block #
+         lda   >GrfMem+gr0099     get # blocks long
+         puls  x          Get register stack ptr back
+         tst   R$Y+1,x    mapping or un-mapping?
+         beq   L0C1F      un-map, remove it from process space
+* Map the get/put buffer into process space
+         pshs  d,x,u      save block #/# of blocks, reg stack & global
+         bsr   L0C31      Make sure all blocks needed are there
+         bcc   L0C1B      Yes, exit
+         clra  
+         ldb   1,s        get starting block #
+         tfr   d,x
+         ldb   ,s         get # blocks
+         os9   F$MapBlk   map blocks into process space
+         stb   1,s        save error code if any
+         bcs   L0C19      return if there was a error
+         tfr   u,d        copy start address to D
+         ldx   2,s        get register stack pointer
+         addd  >GrfMem+gr009D     add in offset to buffer
+         std   R$X,x      save offset into block of buffer
+         ldd   >GrfMem+gr009B     get length of buffer
+         std   R$Y,x      save it into callers Y
+L0C19    puls  d,x,u,pc   restore regs & return
+
+L0C1B    leas  2,s        purge stack
+         puls  pc,u,x
+
+* Remove get/put buffer from process space
+L0C1F    pshs  a,x,y      preserve # blocks, register stack & window table
+         bsr   L0C31      Go verify all blocks are correct & contiguous
+         bcs   L0C2E      Nope, exit with error
+         IFNE  H6309
+         lde   ,s         Get counter back
+         ELSE
+         lda   ,s
+         sta   >GrfMem+gr00B5
+         ENDC
+         ldd   #DAT.Free  Empty DAT marker
+
+L0C28    std   ,x++       Save them in DAT image
+         IFNE  H6309
+         dece             Keep marking unused blocks until done
+         ELSE
+         dec   >GrfMem+gr00B5
+         ENDC
+         bne   L0C28
+L0C2E    puls  a,x,y,pc   Restore regs & return
+
+* Verify blocks in process DAT image
+* Entry: A=# blocks in GP buffer
+*        B=Start block #
+*        X=Caller's register stack ptr
+* Exit:  A=block #*16 in DAT image
+
+         IFNE  H6309
+L0C31    tfr   a,e        copy start block
+         ldf   #8         get # DAT slots
+         ELSE
+L0C31    pshs  b
+         ldb   #8
+         std   >GrfMem+gr00B5
+         puls  b
+         ENDC
+         ldx   <D.Proc    get current process pointer
+         leax  P$DATImg+16,x point to end of DAT image
+         IFNE  H6309
+         addr  e,b        Add # blocks to start block #
+         ELSE
+         addb  >GrfMem+gr00B5
+         ENDC
+         clra             Clear high byte of D 
+         decb             Adjust for zero based
+L0C40    cmpd  ,--x       Same block as DAT image?
+         beq   L0C4B      yes, skip ahead
+         IFNE  H6309
+         decf             No, dec block counter
+         ELSE
+         dec   >GrfMem+gr00B5+1
+         ENDC
+         bne   L0C40      Do until all 8 blocks are checked
+L0C62    comb             Exit with boundary (bad page address) error
+         ldb   #E$BPAddr
+         rts   
+
+L0C4B    equ   *
+         IFNE  H6309
+         decf             Dec block # counter
+         dece             Dec # blocks in buffer counter
+         ELSE
+         dec   >GrfMem+gr00B5+1
+         dec   >GrfMem+gr00B5
+         ENDC
+         beq   L0C58      Do until GP blocks are checked
+         decb             Dec block #
+         cmpb  ,--x       Same as previous one in DAT image
+         beq   L0C4B      Yes, keep going
+         bra   L0C62      No, exit with bad page address error
+
+
+         IFNE  H6309
+L0C58    tfr   f,a        Move block # within DAT to proper reg
+         ELSE
+L0C58    lda   >GrfMem+gr00B5+1
+         ENDC
+         lsla             Multiply x 16
+         lsla  
+         lsla  
+         lsla  
+         clrb  
+L0CF1    rts              return
+
+******************************
+* Special windowing processor (called from AltIRQ in VTIO)
+* Entry: A=$00 - Screen has changed in some way
+*          $01 - Update mouse packet window region (Pt.Stat)
+*          $02 - Update text & graphics cursor
+*          $03 - Update auto follow mouse
+L0C68    tsta             Screen change?
+         beq   L0C7F      Yes, go do
+         deca             Update mouse packet?
+* TODO: Does update mouse packet go in CoGrf?
+         IFNE  CoGrf-1
+         lbeq  L1CC8      Yes, go do
+         ENDC
+         deca             Update cursors?
+         beq   L0CE7      Yes, go do
+* TODO: Does auto-follow mouse go in CoGrf?
+         IFNE  CoGrf-1
+         deca             Update auto-follow mouse?
+         lbeq  L1B4D      Yes, go do
+         ENDC
+         lbra  L0A96
+
+* Active window has changed, update everything
+L0C7F    lbsr  L06AE      Get window table pointer
+         ldd   Wt.STbl,y  Screen table active?
+* NOTE: IS THIS THE WHITE SCREEN BUG???
+         bmi   L0CF1      No, return
+* Check for de-activation of previous window
+L0C86    clr   ,-s        clear activate/deactivate flag
+         ldx   >WGlobal+G.PrWMPt     get previous window static mem pointer
+         cmpx  >WGlobal+G.CurDev     Same as current device?
+         beq   L0CB3      Yes, activate current window
+         inc   ,s         flag de-activation of last used window
+         ldu   >WGlobal+G.PrWMPt     get previous device static mem pointer
+         beq   L0CB3      nothing there, skip ahead
+         pshs  y          preserve new window table pointer
+         bsr   L0CF2      any overlay windows or frames?
+         IFNE  CoGrf-1
+         bcs   L0CA3      no, skip ahead
+         lbsr  L1034      set menu bar to in-active state
+         ENDC
+L0CA3    lda   >WGlobal+g00BE     get new window table flag
+         bmi   L0CB1      not used, skip ahead
+         ldu   >WGlobal+G.PrWMPt     get previous device static mem pointer
+         sta   V.WinNum,u   save window table # into it
+L0CB1    puls  y          restore window table pointer
+* Send select to grfdrv
+L0CB3    ldb   #$10       Get select callcode
+         lbsr  L0101      Send it to grfdrv
+         ldu   >WGlobal+G.CurDev     Get current device static mem pointer
+* Check for activation of current window
+         tst   ,s         did we de-activate last used window?
+         beq   L0CE1      no, skip activate
+         pshs  y,u        Preserve regs
+         bsr   L0CF2      any overlay or framed windows?
+         IFNE  CoGrf-1
+         bcs   L0CCA      no, skip ahead
+         lbsr  L13E9      set menu bar to active state
+         ENDC
+L0CCA    ldy   >WGlobal+G.CurDev     get current device mem pointer
+         sty   >WGlobal+G.PrWMPt     save it as previous
+         puls  u,y        Get Y & static mem ptr back for possible overlay
+         lda   >WGlobal+g00BE     get overlay window #
+         bmi   L0CE1      Wasn't an overlay, skip ahead
+         sta   V.WinNum,u   save it as current
+L0CE1    leas  1,s        purge stack
+         jmp   [>WGlobal+G.MsInit]   initialize mouse & return
+
+* Update text & mouse cursors
+L0CE7    lbsr  L06A0      verify window table
+         bcs   L0CF1      not good, return error
+L0CEC    ldb   #$46       get set window code
+         lbra  L0101      send it to grfdrv
+
+* Checks for any overlay windows & framed or scroll barred windows
+* Entry: U=Static mem pointer
+* Exit : Carry set=No overlay windows & No framed/scroll barred window
+*                  $BE in global mem will be $FF
+*        Carry clear=There is 2 possibilitys here 1: Framed or scroll barred
+*                    window or 2: Overlay window is present, $BE in global
+*                    will contain the current window table # & $35 in static
+*                    memory of current device will be switched to the
+*                    parent window of the overlay
+L0CF2    lda   #$FF       initialize new window table flag
+         sta   >WGlobal+g00BE
+L0CFA    lbsr  L06AE      get window table pointer of this window
+         IFNE  CoGrf-1
+         lbsr  L0E34      framed or scroll barred window?
+         bcs   L0D06      no, skip ahead
+         rts   
+         ENDC
+
+* No framed or scroll barred window, check for overlay window
+L0D06    lda   Wt.BLnk,y  is this a overlay window?
+         bmi   L0D20      no, return carry set
+         ldb   V.WinNum,u   get current window table #
+         tst   >WGlobal+g00BE     already have one?
+         bpl   L0D1B      yes, skip ahead
+         stb   >WGlobal+g00BE     save current window #
+L0D1B    sta   V.WinNum,u   save back link as current window in static mem
+         bra   L0CFA      go check it out
+
+L0D20    coma             set carry & return
+         rts   
+
+         IFNE  CoGrf-1
+* SS.WnSet SetStt call processor
+L0D23    lbsr  L1358      setup the graphics table entry
+         ldx   PD.RGS,y   get register stack pointer
+         ldb   R$Y+1,x    get requested window type
+         cmpb  #WT.PBox   past maximum?
+         lbhi  L0697      yes, return error
+         lslb             adjust for 2 bytes/entry
+         leax  <L0D3C,pc  point to vector table
+         ldd   b,x        get offset
+         jmp   d,x        continue from there
+
+L0D3C    fdb   L0F9A-L0D3C No box
+         fdb   L0D48-L0D3C Framed window
+         fdb   L0DE8-L0D3C Framed scroll barred window
+         fdb   L0E68-L0D3C shadowed window
+         fdb   L0EFC-L0D3C double box
+         fdb   L0FF2-L0D3C plain box
+
+* Process framed window setstat
+L0D48    lbsr  L0E04      is this an overlay window?
+         bcc   L0D55      no, skip ahead
+         tst   >WGlobal+G.CrDvFl     are we the active device?
+         beq   L0D55      No, skip ahead
+         lbsr  L0E13      de-activate parent window's menu bar
+L0D55    lbsr  L115F      copy window table & check for graphics screen
+         lda   #WT.FWin   get window type
+         bsr   L0D80      get window descriptor & setup graphics table entry
+         bcc   L0D6A      went ok, skip ahead
+* Error, re-draw parent window & return
+L0D5E    pshs  cc,b       Preserve error
+         tst   >WGlobal+G.CrDvFl     Are we active device?
+         beq   L0D68      No, exit with error
+         lbsr  L0E4B      activate parent window's menu bar
+L0D68    puls  cc,b,pc    Exit with error
+
+* Window descriptor is good, print it according to active/in-active
+L0D6A    tst   >WGlobal+G.CrDvFl     are we the active window?
+         beq   L0D74      no, skip ahead
+         lbsr  L13FA      print menu in active state
+         bra   L0D77      skip ahead
+
+L0D74    lbsr  L1037      print menu in in-active state
+L0D77    bcs   L0D7F      error on printing, return
+         lbra  L11F3      change window working size for frame & exit
+
+* Setup graphics table entry with window type & check sizes
+* Entry: A=Window type (Not related to grfdrv, cowin specific)
+*        X=Graphics table entry pointer
+*        Y=Path descriptor pointer
+
+L0D80    leas  -WN.SIZ,s  make a buffer to preserve current window desc.
+         sta   ,x         save window type
+         ldu   PD.RGS,y   get pointer to register stack
+         ldu   R$X,u      get pointer to window descriptor
+         stu   Gt.DPtr,x  save it in graphics table
+         IFNE  H6309
+         ldw   <D.Proc    get process ID of creator
+         lda   P$ID,w
+         sta   Gt.Proc,x  save it in graphics table
+         ste   Gt.PBlk,x  Save process block # into graphics table
+         ELSE
+         pshs  y
+         ldy   <D.Proc    get process ID of creator
+         sty   >GrfMem+gr00B5
+         lda   <D.Proc
+         sta   Gt.PBlk,x  ste 
+         lda   P$ID,y
+         sta   Gt.Proc,x
+         puls  y
+         ENDC
+         leau  ,s         point to buffer
+         pshs  x          save graphics table pointer
+         ldx   >WGlobal+G.GfxTbl     get graphics table pointer
+         leax  >$0240,x   point to window descriptor buffer
+         IFNE  H6309
+         ldw   #WN.SIZ    Preserve window descriptor in stack buffer
+         tfm   x+,u+
+         ELSE
+         pshs  d
+         ldb   #WN.SIZ
+L0D80b   lda   ,x+
+         sta   ,u+
+         decb
+         bne   L0D80b
+         std   >GrfMem+gr00B5
+         puls  d
+         ENDC
+         ldx   ,s         restore graphics table entry pointer
+         lbsr  L1371      get window descriptor from caller
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         leau  ,x         point to window descriptor
+         puls  x          restore graphics table entry pointer
+* Check if window will fit
+         lda   Wt.SZX,y   get current X size from window table
+         cmpa  WN.XMIN,u  will it fit?
+         blo   L0DC0      no, clear entry & return
+         lda   Wt.SZY,y   get current Y size from window table
+         cmpa  WN.YMIN,u  will it fit?
+         bhs   L0DD6      yes, return
+* Window descriptor won't fit on window, restore old & return
+
+L0DC0    clr   Gt.WTyp,x  clear graphics table entry
+         ldu   >WGlobal+G.GfxTbl     get graphics table pointer
+         leau  >$0240,u   point to working buffer
+         IFNE  H6309
+         ldw   #WN.SIZ    Restore window descriptor from stack copy
+         tfm   s+,u+
+         ELSE
+         pshs  a
+         lda   #WN.SIZ
+L0DC0b   ldb   ,s+
+         stb   ,u+
+         deca
+         bne   L0DC0b
+         sta   >GrfMem+gr00B5
+         puls  a
+         ENDC
+         comb             set carry
+         ldb   #E$ICoord  get illegal co-ordinates error
+L0D7F    rts              return
+
+* Window table is good, return
+L0DD6    leas  WN.SIZ,s   purge stack
+         lda   Gt.WTyp,x  get screen type
+         cmpa  #WT.FSWin  scroll barred?
+         lbeq  FSWin      yes, do 3D frame
+         lbra  L0FFC      draw 3D frame & return
+
+* Process a framed scroll barred window
+L0DE8    bsr   L0E04      is this a overlay window?
+         bcc   L0DF3      no, skip ahead
+         tst   >WGlobal+G.CrDvFl     current device?
+         beq   L0DF3      no, skip ahead
+         bsr   L0E13      de-activate menu bar on parent window
+L0DF3    lbsr  L115F      setup window table & check if graphics screen
+         lda   #WT.FSWin  get code for scroll barred window
+         IFNE  H6309
+         bsr   L0D80      setup graphics table entry & check window desc.
+         ELSE
+         lbsr  L0D80
+         ENDC
+         lbcs  L0D5E      error, return
+         lbsr  L108C      go draw window
+         lbra  L0D6A      finish up by drawing menu bar & return
+
+* Check if this is a overlay window
+L0E04    pshs  y,u        preserve regs
+         lbsr  L06AE      get window table pointer
+         coma             set carry
+         lda   Wt.BLnk,y  any overlays?
+         bpl   L0E10      yes, return carry set
+         clra             clear carry
+L0E10    puls  y,u,pc     return
+
+* Place parent window in a in-active state if it's a framed or scroll barred
+* window.
+L0E13    pshs  y,u        preserve registers
+         lbsr  L06AE      get pointer to window table entry
+         lda   Wt.BLnk,y  get overlay window back link
+         ldu   2,s        get static mem pointer
+         ldy   ,s         get path descriptor pointer
+         ldb   V.WinNum,u   get current window #
+         pshs  b          save it
+         sta   V.WinNum,u   make overlay back link current
+         bsr   L0E34      framed or scroll barred?
+         bcs   L0E2E      no, skip ahead
+         lbsr  L1034      set menu bar to inactive state
+L0E2E    puls  b,y,u      restore
+         stb   V.WinNum,u   restore active window
+         rts              return
+
+* Check whether current window has a framed or framed scrolled barred window
+* Entry: U=Static mem pointer
+* Exit:  CC: Carry set if window is scroll barred or framed
+L0E34    pshs  a,x        preserve registers
+         tst   V.TYPE,u   is this a window?
+         bpl   L0E48      no, return with carry
+         lbsr  L06B9      get graphics table pointer
+         lda   Gt.WTyp,x  get cowin screen type
+         beq   L0E48      if no box, return with carry set
+         cmpa  #WT.FSWin  scroll barred or framed?
+         bhi   L0E48      no, return carry set
+         clra             clear carry
+         puls  a,x,pc     return
+
+L0E48    coma             set carry
+         puls  a,x,pc     return
+
+* Place parent window in a active state if it's a framed or scroll barred
+* window.
+L0E4B    ldu   >WGlobal+g00B7     get static mem pointer
+L0E51    lda   Wt.BLnk,y  get overlay window link
+         ldb   V.WinNum,u   get current window #
+         pshs  b,u        save current window # & static mem
+         sta   V.WinNum,u   save back link as current
+         bsr   L0E34      framed or scroll barred?
+         bcs   L0E62      no, skip ahead
+         lbsr  L13F5      update menu bar
+L0E62    puls  b,u        restore static mem & current window #
+         stb   V.WinNum,u   restore static mem to current window
+         rts              return
+
+* Process a shadowed window
+L0E68    lbsr  L0FBB      update parent window if any
+         lbsr  L115F      check for graphic window
+         lda   #WT.SBox   save window type in graphics table entry
+         sta   Gt.WTyp,x
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L12BE      clear screen
+         leax  <SBox1,pc  point to draw table for 640 wide screen
+         IFNE  H6309
+         tim   #$01,>WGlobal+g00BD 640 wide screen?
+         ELSE
+         lda   >WGlobal+g00BD
+         anda  #$01
+         ENDC
+         bne   L0E91      no, skip ahead
+         leax  <SBox2,pc  point to draw table for 320 wide screen
+L0E91    lda   #$03       get # entrys in draw table
+         lbsr  DrawBar    draw window
+         lbsr  L11F3      change window to working size
+         clrb             clear errors
+         rts              return
+
+* Draw table for shadowed window on 640 wide screen
+* Draw table for Light Grey Box
+SBox1    fcb   WColor1    Color 1
+         fdb   0          Start X=0
+         fdb   0          Start Y=0
+         fdb   -3         End X=Width of window-3
+         fdb   -1         End Y=Height of window-1
+         fcb   $4c        Box function in GRFDRV
+
+* Draw table for Dark Grey shadow on right side
+         fcb   WColor2    Color 2
+         fdb   -2         Start X=Width of window-2
+         fdb   2          Start Y=2
+         fdb   $8000      End X=Width of window
+         fdb   $8000      End Y=Height of window
+         fcb   $4e        Bar function in GRFDRV
+
+* Draw table for Dark Grey shadow on bottom
+         fcb   WColor2    Color 2
+         fdb   2          Start X=2
+         fdb   $8000      Start Y=Height of window
+         fdb   $8000      End X=Width of window
+         fdb   $8000      End Y=Height of window
+         fcb   $4a        Line function in GRFDRV
+
+* Draw table for shadowed window on 320 wide screen
+* Draw table for Light Grey Box
+SBox2    fcb   WColor1    Color 1
+         fdb   0          Start X=0
+         fdb   0          Start Y=0
+         fdb   -1         End X=Width of window-1
+         fdb   -1         End Y=Height of window-1
+         fcb   $4c        Box function in GRFDRV
+
+* Draw table for Dark Grey shadow on right side
+         fcb   WColor2    Color 2
+         fdb   $8000      Start X=Width of window
+         fdb   2          Start Y=2
+         fdb   $8000      End X=Width of window
+         fdb   $8000      End Y=Height of window
+         fcb   $4a        Line function in GRFDRV
+
+* Draw table for Dark Grey shadow on bottom
+         fcb   WColor2    Color 2
+         fdb   2          Start X=2
+         fdb   $8000      Start Y=Height of window
+         fdb   $8000      End X=Width of window
+         fdb   $8000      End Y=Height of window
+         fcb   $4a        Line function in GRFDRV
+
+* Process a double box window
+L0EFC    bsr   L0FBB      update parent window if we have to
+         lbsr  L115F      if this comes back it's a graphic window
+         lda   #WT.DBox   get window type
+         sta   Gt.WTyp,x  save it into graphics table entry
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L12BE      clear screen
+         bsr   L1257      set text co-ordinates to 0,0
+         leax  <DBox,pc   point to draw table
+         lda   #3         get # entrys
+         lbsr  DrawBar    go draw it
+         lbsr  L11F3      setup window working area & return
+         clrb  
+         rts   
+
+* Draw table for double box window
+* Outside Box
+DBox     fcb   WColor2    Color 2
+         fdb   $0000      Start X=0
+         fdb   $0000      Start Y=0
+         fdb   $8000      End X=Width of window
+         fdb   $8000      End Y=Height of window
+         fcb   $4c        Box function in GRFDRV
+
+* Doubled up inside box - next 2
+         fcb   WColor2    Color 2
+         fdb   $0002      Start X=2
+         fdb   $0002      Start Y=2
+         fdb   -2         End X=Width of window-2
+         fdb   -2         End Y=Height of window-2
+         fcb   $4c        Box function
+
+         fcb   WColor2    Color 2
+         fdb   $0003      Start X=3
+         fdb   $0003      Start Y=3
+         fdb   -3         End X=Width of window-3
+         fdb   -3         End Y=Height of window-3
+         fcb   $4c        Box function
+
+* Process a no box window
+L0F9A    bsr   L0FBB      update parent window if we have to
+         lbsr  L116C      copy window table to working buffer
+         clra             WT.NBox =0
+         sta   Gt.WTyp,x
+         ldy   >WGlobal+g00B9     get pointer to window table
+         clrb             set start coord
+         std   Wt.CPX,y
+         ldd   Wt.DfSZX,y get default size
+         pshs  u,y
+         lbsr  L1204      set default size
+         puls  u,y
+         lbra  L12BE      clear screen & return from there
+
+* Check if we have to update a parent window
+L0FBB    pshs  y,u        preserve registers
+         lbsr  L0E04      we an overlay window?
+         bcc   L0FF0      no, return
+         lbsr  L06B9      get graphics table pointer
+         lda   Gt.WTyp,x  get cowin screen type
+         beq   L0FF0      it's a plain window, return
+         cmpa  #WT.FSWin  framed or scroll barred window?
+         bhi   L0FF0      no, return
+         tst   >WGlobal+G.CrDvFl     Are we the current active device
+         beq   L0FF0      no, return
+         ldu   2,s        get static memory pointer
+         lbsr  L06AE      get window table pointer
+         ldu   2,s        get static memory pointer
+         lda   V.WinNum,u   get window #
+         pshs  a          save it
+         lda   Wt.BLnk,y  get back window link
+         sta   V.WinNum,u   save it as current
+         lbsr  L0E34      get framed or scroll barred window flag for this one
+         puls  a          restore window #
+         sta   V.WinNum,u   save it
+         bcs   L0FF0      if not a framed or scroll barred window, return
+         lbsr  L0E51      place parent window into a active state
+L0FF0    puls  y,u,pc     restore & return
+
+* Set current X/Y draw pointer to 0,0
+L1257    equ   *
+         IFNE  H6309
+         clrd  
+         clrw  
+         stq   >GrfMem+gr0047     Save X&Y coords
+         ELSE
+         clra  
+         clrb  
+         std   >GrfMem+gr0047     Save X&Y coords
+         std   >GrfMem+gr0047+2
+         std   >GrfMem+gr00B5
+         ENDC
+         rts   
+
+* Process a plain box window
+L0FF2    bsr   L0FBB
+         lbsr  L115F
+         lda   #WT.PBox
+         sta   Gt.WTyp,x
+* Draw a frame around full window
+ 
+L0FFC    ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L12BE      clear screen
+         bsr   L1257      set text co-ordinates to 0,0
+         IFNE  H6309
+         lde   Wt.Fore,y  get current color mask
+         ELSE
+         lda   Wt.Fore,y
+         sta   >GrfMem+gr00B5
+         ENDC
+         lda   #1
+         lbsr  GetColr    convert it to mask
+         sta   Wt.Fore,y
+         lbsr  L1013      calculate X size
+         std   >GrfMem+gr004B
+         lbsr  L100F      calculate Y size
+         lbsr  L122B      draw the box
+         IFNE  H6309
+         ste   Wt.Fore,y
+         rts
+         ELSE
+         pshs  a
+         lda   >GrfMem+gr00B5
+         sta   Wt.Fore,y
+         puls  a,pc
+         ENDC
+
+         IFNE  CoGrf-1
+* Draw a 3D frame around window for scroll barred window
+FSWin    ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L12BE      clear screen
+         bsr   L1257      set text co-ordinates to 0,0
+         pshs  x          preserve graphics table pointer
+         lda   #11        get # entrys
+         leax  <FSWinTbl,pc point to draw table
+         lbsr  DrawBar
+         puls  x,pc
+
+FSWinTbl fcb   WColor1    left bar (Color 1)
+         fdb   0          From 0,8 to 7,bottom
+         fdb   8
+         fdb   7
+         fdb   $8000
+         fcb   $4e        Bar command for GRFDRV
+
+         fcb   WColor1    bottom bar (Color 1)
+         fdb   8          From 8,(bottom-7) to (Right-8),bottom
+         fdb   -7
+         fdb   -8
+         fdb   $8000
+         fcb   $4e
+
+         fcb   WColor1    right bar
+         fdb   -7
+         fdb   8
+         fdb   $8000
+         fdb   $8000
+         fcb   $4e
+
+         fcb   WColor3    left bar 3D look
+         fdb   0
+         fdb   8
+         fdb   7
+         fdb   8
+         fcb   $4a
+
+         fcb   WColor3    White - 0,8 to 0,bottom-1
+         fdb   0
+         fdb   8
+         fdb   0
+         fdb   -1
+         fcb   $4a
+
+         fcb   WColor2    Light grey - 7,9 to 7,bottom-7
+         fdb   7
+         fdb   9
+         fdb   7
+         fdb   -7
+         fcb   $4a
+
+* Bottom bar 3D look
+         fcb   WColor3    White
+         fdb   9          From 9,(bottom-7) to (right-7),(bottom-7)
+         fdb   -7
+         fdb   -7
+         fdb   -7
+         fcb   $4a        Line
+
+         fcb   WColor2    Light grey
+         fdb   1          From 1,(bottom-1) to Right,(bottom-1)
+         fdb   -1
+         fdb   $8000
+         fdb   -1
+         fcb   $4a        Line
+
+         fcb   WColor3    right bar 3D look
+         fdb   -7         right-7,8 to right,8
+         fdb   8
+         fdb   $8000
+         fdb   8
+         fcb   $4a
+
+         fcb   WColor3
+         fdb   -7         left+7,9 to left+7,bottom-8
+         fdb   9
+         fdb   -7
+         fdb   -8
+         fcb   $4a
+
+         fcb   WColor2
+         fdb   $8000      left,9 to right,bottom-1
+         fdb   9
+         fdb   $8000
+         fdb   -1
+         fcb   $4a
+
+* Set Menu bar to in-active state by printing the window title
+L1034    lbsr  L116C      setup work window table
+L1037    lbsr  L1240      draw 3D bar
+* Swap foreground/background colors
+         ldd   Wt.Fore,y  Get fore/background colors
+         sta   Wt.Back,y  Swap them
+         stb   Wt.Fore,y
+         lbsr  L1013      calculate X size in pixels
+         IFNE  H6309
+         decd             take off 1 of X co-ordinate
+         ELSE
+         subd  #$0001
+         ENDC
+         lbsr  L1371      get window descriptor pointer
+         bne   L107A      Not valid dsc., exit
+         ldd   #$0100     Valid, get X/Y text start coord
+         lbsr  L128E      place in grfdrv mem
+         IFNE  H6309
+         aim   #^TChr,Wt.BSW,y Turn on transparency
+         oim   #Prop,Wt.BSW,y Turn on proportional spacing
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         anda  #^TChr
+         ora   #Prop
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L12A2      calculate string length of menu title
+         subb  #$02       subtract 2 to give 1 space on either side
+         cmpb  Wt.SZX,y   bigger than window?
+         bls   L1075      no, skip ahead
+         ldb   Wt.SZX,y   Use X size of window as length
+         lbra  L12AE      Print menu bar title & return from there
+
+L1075    addb  #2         get length back
+         lbra  L12AE      print menu bar title & return from there
+
+L107A    rts              return
+
+* Draw a framed scroll barred window
+L108C    ldy   >WGlobal+g00BB     Get ptr to work window table
+         IFNE  H6309
+         aim   #^TChr,Wt.BSW,y Turn on transparency
+         ELSE
+         lda   Wt.BSW,y
+         anda  #^TChr
+         sta   Wt.BSW,y
+         ENDC
+         pshs  x          Preserve old X
+         leas  -10,s      Make enough room for BS stack for R$X/Y
+         leax  ,s         Point X to stack
+         IFNE  H6309
+         clrd             get text co-ordinates
+         ELSE
+         clra
+         clrb
+         ENDC
+         std   R$X,x
+         std   R$Y,x
+         lbsr  DfltBar    Draw scroll bar markers
+         bsr   DrawArr    draw the 4 arrows
+         lda   #7         Draw 3D shading stuff
+         leax  <ScBar,pc  point to draw table
+         lbsr  DrawBar
+         leas  10,s       Restore stack to normal
+         puls  x,pc       restore X
+
+* Draw scroll bar arrows
+* Entry: Y=Window table pointer
+*        U=Global mem pointer
+* Exit : A=$00
+*        All other regs. preserved
+DrawArr  lda   #4         Get # arrows
+         pshs  x,a        preserve X & arrow counter
+         leax  <ScArr,pc  point to table
+NxtArr   ldd   ,x++       get group/buffer
+         std   >GrfMem+gr0057     save it to grfdrv mem
+         lbsr  CalXCord   calculate X start co-ordinate
+         std   >GrfMem+gr0047     save it in grfdrv mem.
+         lbsr  CalYCord   calculate Y start co-ordinate
+         std   >GrfMem+gr0049     save it in grfdrv mem
+         ldb   #$36       get grfdrv function code for PutBlk
+* NOTE: SHOULDN'T NEED U PRESERVED
+         pshs  x,y,u      preserve regs
+         lbsr  L0101      let grfdrv do the rest
+         puls  x,y,u      restore regs
+         dec   ,s         done?
+         bne   NxtArr     keep going till we're done
+         puls  a,x,pc
+
+* Draw table for scroll barred window arrows
+* This seems a major error in group number. $CE does not exist. RG
+ScArr    fdb   $ce01      group/buffer for up arrow
+         fdb   -7
+         fdb   8
+
+         fdb   $ce02      group/buffer for down arrow
+         fdb   -7
+         fdb   -15
+
+         fdb   $ce03      group/buffer for left arrow
+         fdb   0
+         fdb   -7
+
+         fdb   $ce04      group/buffer for right arrow
+         fdb   -15
+         fdb   -7
+
+* Draw table for for various lines on a scroll barred window
+ScBar    fcb   WColor3    white line below up arrow
+         fdb   -7
+         fdb   16
+         fdb   $8000
+         fdb   16
+         fcb   $4a
+
+         fcb   WColor2    gray line above down arrow
+         fdb   -7
+         fdb   -16
+         fdb   $8000
+         fdb   -16
+         fcb   $4a
+
+         fcb   WColor3    white line to the right of left arrow
+         fdb   8
+         fdb   -7
+         fdb   8
+         fdb   -1
+         fcb   $4a
+
+         fcb   WColor2    gray line to the left of right arrow
+         fdb   -16
+         fdb   -7
+         fdb   -16
+         fdb   -1
+         fcb   $4a
+
+         fcb   WColor2    gray line above left arrow
+         fdb   0
+         fdb   -8
+         fdb   7
+         fdb   -8
+         fcb   $4a
+
+         fcb   WColor3    white line to the right of right arrow
+         fdb   -7
+         fdb   -7
+         fdb   $8000
+         fdb   -7
+         fcb   $4a
+
+         fcb   WColor3    white line below the down arrow
+         fdb   -7
+         fdb   -7
+         fdb   -7
+         fdb   -1
+         fcb   $4a
+
+         ENDC
+
+* Check if window is a graphic window
+L115F    bsr   L116C      copy window table to work table
+         lda   >WGlobal+g00BD     Get current screen type
+         bpl   L116B      graphics, skip ahead
+         leas  2,s        purge return address
+         comb             set carry
+         ldb   #E$IWTyp   get illegal window type error code
+L116B    rts              return
+
+* Copy current window table into work table & set all default sizes in work
+* table
+
+L116C    pshs  y          save path descriptor pointer
+         stu   >WGlobal+g00B7     save device static in global
+         sty   >WGlobal+g00C0     save path descriptor in global
+         lbsr  L06A0      verify window table
+         sty   >WGlobal+g00B9     save window table pointer
+         lda   [Wt.STbl,y] get screen type
+         sta   >WGlobal+g00BD     save it in global
+         ldu   >WGlobal+g00B7     get static mem back
+         lbsr  L06B9      get graphics table pointer for this window
+         ldy   #WGlobal+G.WrkWTb+$10     Point to work window table
+         sty   >WGlobal+g00BB     save the pointer to work table
+         ldu   >WGlobal+g00B9     get pointer to current window table
+         IFNE  H6309
+         ldq   Wt.LStDf,u get default logical start & start X/Y co-ordinates
+         stq   Wt.LStrt,y save it in window table
+         ELSE
+         ldd   Wt.LStDf+2,u
+         std   Wt.LStrt+2,y
+         std   >GrfMem+gr00B5
+         ldd   Wt.LStDf,u
+         std   Wt.LStrt,y
+         ENDC
+         ldd   Wt.DfSZX,u get default X/Y sizes
+         std   Wt.SZX,y   save as current working area
+         ldd   Wt.STbl,u  get screen table pointer
+         std   Wt.STbl,y  save it in new
+         lda   Wt.BLnk,u  get overlay window link
+         sta   Wt.BLnk,y  save it in new
+         ldd   Wt.Cur,u   get cursor address
+         std   Wt.Cur,y   save it
+         ldd   Wt.CurX,u  get X/Y coord of cursor
+         std   Wt.CurX,y  save it
+         IFNE  H6309
+         ldq   Wt.XBCnt,u get X byte count & bytes/row
+         stq   Wt.XBCnt,y save it in window table
+         ELSE
+         ldd   Wt.XBCnt+2,u
+         std   Wt.XBCnt+2,y
+         std   >GrfMem+gr00B5
+         ldd   Wt.XBCnt,u 
+         std   Wt.XBCnt,y
+         ENDC
+         lda   Wt.FBlk,u  get block # for font
+         sta   Wt.FBlk,y  save it
+         ldd   Wt.FOff,u  get offset for font
+         std   Wt.FOff,y
+         clr   Wt.BSW,y   clear window switches
+         lbsr  L1337      set pattern to normal plot
+         lbsr  L1342      set logic type to nothing
+         ldb   Wt.DfSZX,u get X size
+         lbsr  L1015      multiply by 8
+         std   Wt.MaxX,y  save max X coord
+         ldb   Wt.DfSZY,u get Y size
+         lbsr  L1015      multiply by 8
+         std   Wt.MaxY,y  save max Y co-ordinate
+         ldd   Gt.FClr,x  get fore/back colors
+         std   Wt.Fore,y  save 'em
+         puls  y,pc       restore path descriptor ptr & return
+
+* Change window size to leave a 1 character space on all 4 sides
+L11F3    ldy   >WGlobal+g00B9     get current window table pointer
+         ldd   #$0101     set X/Y start co-ordinate
+         std   Wt.CPX,y   save it
+         ldd   Wt.DfSZX,y get default X/Y sizes
+L1200    decb             take 2 off Y
+         decb  
+         deca             take 2 off X
+         deca  
+L1204    std   Wt.SZX,y   save X/Y size
+         ldb   #$0E       get grfdrv function for CWArea
+         lbsr  L0101
+         bcs   L11F2
+         ldu   >WGlobal+g00B7     get static mem pointer
+         ldy   >WGlobal+g00C0     get path descriptor pointer
+         lbra  L0436      go setup lines per page & return
+
+* NOTE: ALL OF THESE MAY NOT NEED U PRESERVED ANYMORE
+* Draw a box
+L122B    std   >GrfMem+gr004d
+         pshs  u,y,x
+         ldb   #$4C       get code for box
+L1232    lbsr  L0101
+         puls  pc,u,y,x
+
+* Draw a line
+L1237    std   >GrfMem+gr004d     save current Y coord
+L123A    pshs  u,y,x      preserve regs
+         ldb   #$4A       get grfdrv function for line
+         bra   L1232      send it to grfdrv
+
+* Draw a bar at current color
+L124E    std   >GrfMem+gr004d
+         pshs  u,y,x
+         ldb   #$4E
+         bra   L1232
+
+* Draw a 3D bar starting at 0,0 to 639,7 in current colors
+L1240    ldy   >WGlobal+g00BB     Get ptr to work window table
+         pshs  x          preserve X
+         leax  <TopBar,pc point to draw table for top bar
+         lda   #4         get entry count
+         bsr   DrawBar    draw the bar
+         puls  x,pc       restore & return
+
+* Draw a graphic sequence that requires start & end co-ordinates
+* If the co-ordinate in draw table is negative, This will calculate the
+* co-ordinate based on the size of the window in pixels.
+* Entry: A=Number of draw table entrys
+*        X=Pointer to draw table
+*        Y=Pointer to window table
+*        U=Global mem pointer
+DrawBar  ldb   $06,y      get current color
+         pshs  d          save it and entry count
+DrawNxt  lda   ,x+        get foreground color
+         bsr   GetColr    get color mask
+         sta   WT.Fore,y  put it in window table
+         bsr   CalXCord   calculate X start co-ordinate
+         std   >GrfMem+gr0047     save it in grfdrv mem.
+         bsr   CalYCord   calculate Y start co-ordinate
+         std   >GrfMem+gr0049     save it in grfdrv mem
+         bsr   CalXCord   calculate X end co-ordinate
+         std   >GrfMem+gr004B     save it in grfdrv mem
+         bsr   CalYCord   calculate Y end co-ordinate
+         std   >GrfMem+gr004D     save it in grfdrv mem
+         ldb   ,x+        get grfdrv function code
+         pshs  x,y,u      preserve regs
+         lbsr  L0101      let grfdrv do the rest
+         puls  x,y,u      restore regs
+         dec   ,s         done?
+         bne   DrawNxt    keep going till we're done
+         puls  d          restore current color & purge stack
+         stb   Wt.Fore,y  put it back in window table
+L11F2    rts   
+
+* Calculate X coord based on the size of window
+CalXCord bsr   L1013      get window X size in pixels
+         bra   CalCord
+
+* Calculate Y co-ordinate based on the size of window
+CalYCord bsr   L100F      get window Y size in pixels
+CalCord  pshs  d          preserve size
+         ldd   ,x++       get coord
+         bpl   PosCord    it's positive, return coord
+         cmpd  #$8000     use actual size?
+         bne   NegCord    no, skip ahead
+         clra             clear MSB to zero D
+NegCord  addd  ,s         add it to the size (signed add!!)
+PosCord  leas  2,s        purge size from stack
+         rts              return
+
+* Get window Y size in pixels - NEED TO CHANGE TO ADJUST FOR 200 LINE ONLY
+L100F    ldb   Wt.SZY,y   Get window Y size in chars
+         bra   L1015
+
+* Get window X size in pixels
+L1013    ldb   Wt.SZX,y   Get window X size in chars
+L1015    clra             Clear MSB
+* NOTE: HOW OFTEN WILL WE GET A WINDOW SIZE OF ZERO? SHOULD CHANGE TO NOT
+* BOTHER WITH EITHER TSTB OR BEQ (UNLESS CALLING ROUTINE CHECKS FLAG)
+         tstb             0?
+         beq   L101E      Yes, don't bother with multiply
+         IFNE  H6309
+         lsld             Multiply by 8
+         lsld  
+         lsld  
+         decd             0 base
+         ELSE
+         lslb
+         rola
+         lslb
+         rola
+         lslb
+         rola
+         subd  #$0001
+         ENDC
+L101E    rts              Return
+
+* Get color mask
+GetColr  pshs  b,x        save color & table pointer
+         ldb   >WGlobal+g00BD     get screen type
+         leax  <ColrMsk-1,pc point to color mask table
+         ldb   b,x
+         mul   
+         tfr   b,a
+         puls  b,x,pc     restore & return
+
+ColrMsk  fcb   $ff,$55,$55,$11
+
+* Draw table for top menu bar
+TopBar   fcb   WColor1    Color 1- Draw Bar from 1,1 to (Right-1,6)
+         fdb   1          (Changed from original 0,0-Right,7)
+         fdb   1
+         fdb   -1
+         fdb   6
+         fcb   $4e
+
+         fcb   WColor3    Color 3-Draw Box from 0,0 to Right,7)
+         fdb   0
+         fdb   0
+         fdb   $8000
+         fdb   7
+         fcb   $4c
+
+         fcb   WColor2    Foreground color
+         fdb   $0000      Start X co-ordinate
+         fdb   $0007      Start Y co-ordinate
+         fdb   $8000      End X
+         fdb   $0007      End Y
+         fcb   $4a        grfdrv function code
+
+         fcb   WColor2    Foreground color
+         fdb   $8000      Start X co-ordinate
+         fdb   $0000      Start Y co-ordinate
+         fdb   $8000      End X
+         fdb   $0007      End Y
+         fcb   $4a        grfdrv function code
+
+* Print close box
+L127B    lda   #$C7
+* Generic routine for calling graphics font (font $c803) & resetting to normal
+L1271    bsr   L12C2      Go select graphics font
+         bsr   L1285      Print char on screen
+         bra   L12D7      Revert to normal font, return from there.
+
+* Print tandy menu icon
+L127F    lda   #$CB       Tandy icon character
+         bra   L1271      Put on screen
+
+* Print a space
+L1283    lda   #$20
+
+* Print a character
+* Entry: A=character to print
+L1285    pshs  d,x,y,u
+         ldb   #$3A       Regular alpha put
+L1289    lbsr  L0101
+         puls  d,x,y,u,pc
+
+* Set cursor co-ordinates
+* Entry: A=X co-ordinate
+*        B=Y co-ordinate
+L128E    adda  #$20       Set up for GRFDRV CurXY call
+         addb  #$20
+         pshs  u,y,x
+         lbsr  L0380
+         puls  pc,u,y,x
+
+L1299    bsr   L12A2      Calculate length of NUL terminated string @,X
+         cmpb  #15        >15 chars?
+         bls   L12A1      No, return
+         ldb   #15        Force to 15 chars
+L12A1    rts   
+
+* Get length of a NULL terminated text string (not greater than 128)
+* Entry: X=Pointer to string
+* Exit : B=Length of string
+L12A2    pshs  a          preserve a
+         ldb   #$ff       Init count to 0
+L12A5    incb             Bump char count up
+         lda   b,x        Get char
+         bne   L12A5      Not end of string yet, keep looking
+L12AC    puls  a,pc       restore a & return
+
+* Print a string of specific length
+* NOTE: ASSUMES LENGTH NEVER >128 CHARS!
+* Entry: B=Length of string
+*        X=Pointer to string
+
+L12AE    pshs  d,x,y,u    Save regs
+         IFNE  H6309
+         clre  
+         tfr   b,f        W=String length
+         ldu   #$0180     Point to buffered write buffer
+         tfm   x+,u+      Copy to GRFDRV buffer
+         ELSE
+         pshs  b
+         ldu   #$0180
+L12AEb   lda   ,x+
+         sta   ,u+
+         decb
+         bne   L12AEb
+         clra
+         std   >GrfMem+gr00B5
+         puls  b
+         ENDC
+         ldu   #$0180     Point to buffered write buffer for GRFDRV
+         tfr   b,a        Move size of buffer to A for GRFDRV
+         ldb   #$06       Buffered Write call code for GRFDRV
+         lbsr  L0101      Call GRFDRV
+         puls  d,x,y,u,pc Restore regs & return
+
+* Erase to end of line
+L12B6    lda   #$04
+L12B8    pshs  u,y,x,d
+         ldb   #$3C
+         bra   L1289
+
+* Clear screen
+L12BE    lda   #$0C
+         bra   L12B8
+
+L12C2    pshs  u,y,x,d
+         ldx   >WGlobal+G.GfxTbl     Get graphics table ptr
+         leax  >$02B9,x   Offset into it???
+         lda   Grf.Bck,x  DOUBT THIS IS RIGHT
+         beq   L12E9
+L12CF    sta   Wt.FBlk,y
+         ldd   Grf.Off,x
+         std   Wt.FOff,y
+         puls  pc,u,y,x,d
+
+* Switch to text font
+L12D7    pshs  u,y,x,d
+         ldx   >WGlobal+G.GfxTbl     Get graphics tables ptr
+         leax  >$02B6,x   Offset to ???
+         lda   Grf.Bck,x  Get ???
+         bne   L12CF      If non-0, copy 3 bytes back to original state
+         ldd   #$C801     Normal 8x8 text font
+         bra   L12EC      Call grfdrv to set font
+
+* Switch to graphic font
+L12E9    ldd   #$C803     Graphics font/buffer #
+L12EC    pshs  u,y,x
+         std   >GrfMem+gr0057     Save in Grfdrv mem
+         ldb   #$18       Set font command
+         lbsr  L0101      Set font in grfdrv
+         puls  u,y,x
+         lda   Wt.FBlk,y  Copy stuff back
+         sta   Grf.Bck,x
+         ldd   Wt.FOff,y
+         std   Grf.Off,x
+         puls  pc,u,y,x,d Restore & return
+
+* Turn inverse on
+L1329    pshs  u,y,x
+         ldd   #$2040     Inverse ON
+L130D    lbsr  L0101      Go execute in grfdrv
+         puls  pc,u,y,x
+
+* Turn inverse off
+L1331    pshs  u,y,x
+         ldd   #$2140     Inverse off
+         bra   L130D
+
+* Set pattern
+L1337    pshs  u,y,x
+         IFNE  H6309
+         clrd  
+         ELSE
+         clra  
+         clrb  
+         ENDC
+         std   >GrfMem+gr0057     Save in Grfdrv Mem
+         ldb   #$12
+         bra   L130D
+
+* Set logic type to 0 (normal gfx)
+L1342    pshs  u,y,x
+         clra  
+         sta   Wt.LSet,y
+         ldb   #$1E
+         bra   L130D
+
+* Setup graphics table entry
+L1358    pshs  d,x,y,u
+         lbsr  L06A0      verify window table
+         ldu   6,s        get static memory pointer
+         lbsr  L06B9      get graphics table pointer
+         ldd   Wt.Fore,y  get current foreground/background colors
+         std   Gt.FClr,x  save it in graphics table
+         lbsr  L0B01      get mask value
+         std   Gt.FMsk,x  save it into graphics table
+         IFNE  H6309
+         clrd             init pointer to window descriptor
+         ELSE
+         clra
+         clrb
+         ENDC
+         std   Gt.DPtr,x
+         puls  d,x,y,u,pc
+
+* Copy a window descriptor from caller's process area
+* Entry: None
+L1371    pshs  d,y,u      preserve regs
+         bsr   L139E      is it the owner of the window?
+         bcs   L1397      no, return
+         ldx   Gt.DPtr,x  get pointer to window descriptor
+         leau  >$0240,u   point to a work buffer
+         ldy   #WN.SIZ    get size of descriptor
+L1381    leas  -2,s       make a buffer for current process
+         lbsr  L0238      switch to system process
+         os9   F$CpyMem   copy the window descriptor from process space
+         lbsr  L0244      switch back to current process
+         leas  2,s        purge stack
+         tfr   u,x        move destination to X
+         ldd   WN.SYNC,x  get sync bytes
+         cmpd  #WINSYNC   set flags for compare
+L1397    puls  d,y,u,pc   restore & return
+
+* Entry:
+* Exit : B=Offset to DAT image
+L139B    lbsr  L06B9      get pointer to graphics table entry
+L139E    ldu   >WGlobal+G.GfxTbl     get pointer to start of graphics table
+         ldy   <D.PrcDBT  get process descriptor block table pointer
+         ldb   Gt.Proc,x  get process number of owner
+         lda   b,y        get process # of user
+         cmpa  Gt.PBlk,x  match?
+         bne   L13B1      no, set carry & return
+         ldb   #P$DATImg  get offset to DAT image into D
+         andcc  #^Carry    clear carry
+L13B0    rts              return
+
+L13B1    orcc  #Carry     set carry
+         rts              return
+
+* Copy a menu descriptor from caller's process space
+L13B5    pshs  u,y,d
+         pshs  x
+         bsr   L139B      Get DAT image offset to copy menu descriptor from
+         puls  x
+         bcs   L1397
+         leau  >$0262,u
+         ldy   #MN.SIZ
+         bra   L1381      Copy the memory
+
+* Set the root window menu bar to active state (Called from VTIO special calls)
+L13E9    lbsr  L116C      setup working window table
+         leas  -8,s       make a buffer
+         clr   2,s        clear a flag?
+         lbsr  L1240      draw 3D bar
+         bra   L1404      go print it
+
+* SS.UmBar enry point
+L13F5    lbsr  L116C      setup working window table
+
+* Called from SS.WnSet
+L13FA    lbsr  L1240      draw a 3D bar
+         leas  -8,s
+         clr   2,s
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+
+* Print menu bar in active state
+L1404    lbsr  L1329      turn inverse on
+         IFNE  H6309
+         aim   #^TChr,Wt.BSW,y Turn on transparency
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         anda  #^TChr
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L12D7      set to text font
+         IFNE  H6309
+         clrd             x,y both to 0
+         ELSE
+         clra
+         clrb
+         ENDC
+         sta   5,s
+         lbsr  L128E      Set Text cursor to 0,0
+         ldb   Wt.SZX,y   get current window X size
+         subb  #2         take off 2 for space on either side of text
+         stb   ,s         save it
+         ldb   #2         get current text size (just the spaces so far)
+         stb   1,s        save it in buffer
+         lbsr  L1283      print leading space for menu
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y Turn off Bold print
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         anda  #^Bold
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L127B      print close box
+         ldy   >WGlobal+G.GfxTbl     Get graphics table ptr
+         leay  >$028E,y   point to handling table
+         clr   MnuXNum,y  Menu entry number=0
+         lbsr  L1371      get window descriptor pointer
+         lbne  L14E3      valid?
+         lda   WN.NMNS,x  yes, get number of menus in menu bar
+         lbeq  L14E3      none to print, return
+         cmpa  #10        more than 10?
+         lbhi  L14E3      yes, return
+         sta   4,s        save count
+         ldx   WN.BAR,x   get pointer to menu descriptor
+L144A    stx   6,s        save menu descriptor pointer
+         pshs  u
+         ldu   >WGlobal+g00B7     get pointer to static mem
+         IFNE  H6309
+         bsr   L13B5      get menu descriptor
+         ELSE
+         lbsr  L13B5
+         ENDC
+         puls  u
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         lda   MN.ENBL,x  is menu enabled?
+         beq   L1466      no, skip ahead
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y Turn on Bold print
+         ELSE
+         lda   Wt.BSW,y
+         ora   #Bold
+         sta   Wt.BSW,y
+         ENDC
+         bra   L1469      skip ahead
+
+L1466    equ   *
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y Turn off Bold print
+         ELSE
+         lda   Wt.BSW,y
+         anda  #^Bold
+         sta   Wt.BSW,y
+         ENDC
+L1469    lda   MN.ID,x    get ID number
+         cmpa  #MId.Tdy   is it tandy menu?
+         bne   L148D      no, skip ahead
+* Print tandy menu
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L1283      print a space
+         lbsr  L127F      print the tandy character
+         lbsr  L1283      print a space
+         ldb   #1         get this menu's length
+         stb   3,s        save it
+         pshs  b
+         bsr   L14EE      add it into handling table
+         leas  1,s
+         ldb   ,s         get window size
+         subb  #3         take off length for tandy menu
+         stb   ,s         save it back
+         bra   L14C6      go to next entry
+
+* Print normal menu entry
+L148D    leax  MN.TTL,x   point to text
+         lbsr  L1299      get length of it up to maxium of 15
+         stb   3,s        save it
+         cmpb  ,s         will it fit in window?
+         bls   L14A4      yes, skip ahead
+         ldb   ,s         get window X size
+         subb  #1
+         bls   L14E3      no, return
+         inc   2,s        flag only 1 space
+* Print menu title text
+L14A4    pshs  b          save length of text
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L1283      print a space
+         lbsr  L12AE      print menu text
+         tst   3,s        was there anything to print?
+         bne   L14B6      yes, skip ahead
+         lbsr  L1283      print a space
+L14B6    bsr   L14EE      add menu to handling table
+         puls  a          get length of menu text
+         adda  #2         add 2 for space on each side
+         ldb   ,s         get size
+         IFNE  H6309
+         subr  a,b        subtract width from size left
+         ELSE
+         pshs  a
+         subb  ,s+
+         ENDC
+         stb   ,s         save size left
+
+* Move to next menu descriptor
+L14C6    ldx   6,s        get menu descriptor pointer
+         leax  MN.SIZ,x   point to next menu descriptor
+         inc   5,s        add 1 to menu total
+         dec   4,s        done all descriptors?
+         lbne  L144A      no, go print next one
+L14E3    ldy   >WGlobal+g00BB     Get ptr to work window table
+         lbsr  L1331      turn inverse off
+         leas  8,s        purge stack
+         rts              return
+
+* Add menu entry to internal handling table.
+* Entry: Stack buffer pre loaded
+* This table is 4 bytes long for each entry and consists of:
+*        $00 - Menu # (starts at 1)
+*        $01 - X start co-ordinate
+*        $02 - X End co-ordinate
+*        $03 - Reserved as far as I can tell (possibly use for menu type
+*              flag: 0=normal, 1="sticky", etc.)
+L14EE    pshs  d,x
+         ldx   >WGlobal+G.GfxTbl     get pointer to special windowing table
+         leax  >$028E,x   point to menu handling table
+         ldb   12,s       get menu number
+         clra             multiply it by 4 (size of handling table entries)
+         IFNE  H6309
+         lsld  
+         lsld  
+         addr  d,x        add to handling table start
+         ELSE
+         lslb
+         rola
+         lslb
+         rola
+         leax  d,x
+         ENDC
+         ldb   12,s       get menu number
+         incb             Bump up by 1
+         stb   MnuXNum,x  save menu number
+         ldb   8,s        get X start coord
+         stb   MnuXStrt,x save it
+         addb  10,s       add length
+         incb             add 1 for space
+         stb   MnuXEnd,x  save end X coord
+         incb  
+         stb   8,s
+         clr   MnuHSiz,x  make sure next entry is clear
+         puls  d,x,pc
+
+* SS.MnSel entry point
+* Buffer breakdown:
+* $00-$01,s : Static mem ptr
+* $02-$17,s : ???
+* $18-$19,s : Window table ptr
+* $1A-$21,s : ???
+* $22,s     : ??? (Flag of some sort)
+* $23,s     : ???
+L1515    leas  <-$23,s    make a buffer
+         stu   ,s         save static mem pointer
+         sty   $18,s      save window table pointer
+         clr   $22,s      clear a flag
+         tst   >WGlobal+G.CrDvFl     Are we the current active device?
+         beq   L160A      No, return with nothing
+         ldx   #WGlobal+G.Mouse Get ptr to mouse packet
+         clr   >WGlobal+G.WIBusy     flag cowin free
+L1530    tst   Pt.CBSA,x  button A still down?
+         bne   L1530      yes, wait for release
+         inc   >WGlobal+G.WIBusy     flag cowin busy
+         lbsr  L06A0      verify window
+         lbsr  L1D24      copy current mouse coords to work cords.
+         leax  Pt.Siz,x   point to my work coords (hidden outside packet)
+         lbsr  L1C19      mouse on full window?
+         bcs   L160A      no, return with nothing
+         lbsr  L161B      calculate window start & end coords in pixels
+         ldd   7,s        get current mouse Y coord?
+         cmpd  #7         is it in the menu bar?
+         bhi   L158B      no, skip ahead
+         ldb   <$13,s     get current mouse text X coord
+         cmpb  #$01       past close box?
+         bgt   L155E      yes, skip ahead
+         lda   #MId.Cls   No, menu id=Close box
+         bra   L160C      return menu info
+
+* It wasn't close box scan menu handling table
+L155E    ldx   >WGlobal+G.GfxTbl     get graphics table pointer
+         leax  >$028E,x   point to menu handling table
+L1565    lda   MnuXNum,x  last entry?
+         beq   L160A      yes, return nothing
+         cmpb  MnuXEnd,x  within max X range?
+         bhi   L1587      no, point to next entry
+         lbsr  L16E6      process menu pulldown
+         pshs  a,u        save menu ID & global mem
+         ldu   3,s        get static mem pointer
+         lda   <$24,s     get mouse signal process #
+         sta   V.MSigID,u save it in static mem
+         clr   >WGlobal+G.MsSig     Clear mouse signal flag
+         puls  a,u
+         bra   L160C      Return menu id # & entry # to caller
+
+L1587    leax  MnuHSiz,x  move to next entry in handling table
+         bra   L1565      keep looking
+
+* Return no menu information received
+L160A    equ   *
+         IFNE  H6309
+         clrd             Menu # & ID # =0
+         ELSE
+         clra
+         clrb
+         ENDC
+         bra   L160C
+
+* Mouse wasn't on menu bar check scroll bars
+* NOTE: SHOULD ADD SO THAT IF MOUSE CLICKED BETWEEN SCROLL BARS, IT WILL
+*       RETURN THE POSITION (IN TEXT CHARS) ACROSS OR UP/DOWN WITHIN SCROLL
+*       BAR AREA
+L158B    pshs  u,y,x
+         ldu   6,s        get static mem pointer
+         lbsr  L06B9      get graphics table entry pointer
+         lda   ,x         get window type
+         cmpa  #WT.FSWin  do we have scroll bars?
+         puls  u,y,x
+         bne   L160A      no, no need to check more return nothing
+* Check for left scroll bar arrow
+         ldd   5,s        get mouse X coord
+         cmpd  #7         X in range for left scroll bar arrow?
+         bhi   L15B0      no, check up arrow
+         ldd   $0F,s
+         subd  #7
+         cmpd  7,s
+         bhi   L15B0
+         lda   #MId.SLt   get menu ID for left scroll bar arrow
+* Return menu ID & item to caller
+* Entry: A=Menu ID
+*        B=Menu item #
+*        Y=Path descriptor pointer
+L160C    ldy   <$18,s     get path descriptor pointer
+         ldx   PD.RGS,y   get register stack pointer
+         std   R$D,x      save menu & item #
+         leas  <$23,s     Eat stack buffer
+         clrb             No error & return
+         rts   
+
+* Check for up scroll bar arrow
+L15B0    ldd   7,s        get mouse Y coord
+         cmpd  #15        in range of up arrow?
+         bhi   L15C6      no, check right arrow
+         ldd   $D,s       get window X end coord pixel
+         subd  #7         subtract 7
+         cmpd  5,s        mouse X coord in range?
+         bhi   L15C6      no, check right arrow
+         lda   #MId.SUp   get menu ID for scroll up arrow
+         bra   L160C      return with menu ID
+
+* Check for right scroll bar arrow
+L15C6    ldd   $0F,s      get window Y end co-ordinate pixel
+         subd  #7         subtract 7
+         cmpd  7,s        mouse in range for Y
+         bhi   L15E8      no, check down arrow
+         ldd   $0D,s      get window X end co-ordinate pixel
+         subd  #8         subtract 8
+         cmpd  5,s        mouse below maximum range?
+         blo   L15E8      no, check down arrow
+         ldd   $0D,s
+         subd  #$000F
+         cmpd  5,s
+         bhi   L15E8
+         lda   #MId.SRt   get menu ID for right scroll arrow
+         bra   L160C
+
+* Check for down scroll bar arrow
+L15E8    ldd   $0D,s
+         subd  #$0007
+         cmpd  5,s
+         bhi   L160A      no, not on scroll bars, so return nothing
+         ldd   $0F,s
+         subd  #$0008
+         cmpd  7,s
+         blo   L160A
+         ldd   $0F,s
+         subd  #$000F
+         cmpd  7,s
+         lbhi  L160A
+         lda   #MId.SDn   get menu ID for down scroll arrow
+         bra   L160C      save it to caller & return
+
+* Calculate window start & end coords in pixels
+L161B    equ   *
+         IFNE  H6309
+         clrd
+         ELSE
+         clra
+         clrb
+         ENDC
+         std   $0D,s
+         pshs  d
+         bsr   L1667      calculate coords
+         puls  d
+         ldb   Wt.DfCPX,y get full window X start coord
+         addb  $0D,s      add it to
+         lbsr  L1015      calculate size in pixels
+         IFNE  H6309
+         tfr   d,w        copy it to W
+         ldd   ,x         get mouse X co-ordinate
+         subr  w,d        calculate relative co-ordinate in window
+         ELSE
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         subd  >GrfMem+gr00B5
+         ENDC
+         std   7,s        save it on stack
+         bsr   L1027      divide it by 8
+         stb   <$15,s     save it as mouse text X co-ordinate
+         ldb   Wt.DfCPY,y get window default Y start co-ordinate
+         addb  $0E,s      add in size
+         lbsr  L1015      calculate window height in pixels
+         IFNE  H6309
+         ldw   $02,x      get mouse Y co-ordinate
+         subr  d,w        calculate relative co-ordinate within window
+         stw   9,s        save it
+         ELSE
+         pshs  d,dp
+         sta   2,s
+         ldd   2,x
+         subd  ,s++
+         std   10,s
+         std   >GrfMem+gr00B5
+         puls  a
+         ENDC
+         ldb   Wt.DfCPX,y get window default X start co-ordinate
+         addb  $0D,s
+         addb  Wt.DfSZX,y
+         lbsr  L1015      calculate size in pixels
+         std   $0F,s
+         ldb   Wt.DfCPY,y
+         addb  $0E,s
+         addb  Wt.DfSZY,y
+         lbsr  L1015      calculate size in pixels
+         std   <$11,s
+         rts   
+
+* Seems to hunt down root device window given overlay window?
+* Entry: X=some sort of window tbl ptr
+*        Y=Some sort of window tbl ptr
+L1667    pshs  y,x
+         lda   Wt.BLnk,y  this a overlay window?
+L166B    bmi   L1688      no, return
+         lbsr  L1CBC      point X to the window table entry
+         ldd   Wt.DfCPX,x get window default start co-ordinates
+         addd  <$15,s
+         ldy   Wt.LStDf,x get window logical start address
+         cmpy  Wt.LStrt,x match current?
+         beq   L1681      yes, skip ahead
+         addd  Wt.CPX,x   add current start co-ordinates
+L1681    std   <$15,s
+         lda   Wt.Blnk,x  get back window link
+         bra   L166B      go calculate 
+L1688    puls  pc,y,x
+
+* Signed Divide by 8
+* ONLY CALLED TWICE...SHOULD EMBED
+L1027    equ   *
+         IFNE  H6309
+         asrd  
+         asrd  
+         asrd  
+         ELSE
+         asra
+         rorb
+         asra
+         rorb
+         asra
+         rorb
+         ENDC
+         rts   
+
+* Calculate the current mouse Y text coord within a overlay window
+* used for menu pull down updates
+L168A    pshs  x,u        preserve pointer to mouse coords & global mem
+         lda   Wt.BLnk,y  get parent window # of this overlay
+         lbsr  L1CBC      point X to window table entry
+         lda   Wt.BLnk,x  parent window a overlay?
+         bpl   L169D      yes, skip ahead
+         ldb   Wt.DfCPY,y get current overlay window Y default start
+         addb  Wt.DfCPY,x add it to parent window default Y start
+         bra   L16A6      skip ahead
+
+L169D    ldb   Wt.DfCPY,y get default Y co-ordinate of current window
+         bsr   L16BC
+         tfr   a,b
+L16A6    ldx   ,s         get mouse coordinate pointer
+         lbsr  L1015      calculate it in pixels
+         IFNE  H6309
+         incd             Add 1
+         tfr   d,w        copy it to W
+         ldd   2,x        get mouse Y co-ordinate
+         subr  w,d        calculate the relative co-ordinate in window
+         ELSE
+         addd  #$0001
+         std   >GrfMem+gr00B5
+         pshs  d
+         ldd   2,x
+         subd  ,s++
+         ENDC
+         bsr   L1027      divide it by 8
+         decb             subtract 1
+         tfr   b,a        copy it to A
+         puls  x,u,pc     restore & return
+
+* Calculate the current mouse Y text co-ordinate
+L16BC    pshs  x,y        preserve current & parent window table pointers
+         clrb  
+         pshs  b
+         tfr   y,x
+L16C3    lda   Wt.BLnk,x  get window # of parent window
+         bmi   L16D3      we're at the bottom, skip ahead
+         lbsr  L1CBC      go calculate
+         ldb   Wt.DfCPY,x get parent window default Y start
+         addb  ,s         add it to current
+         stb   ,s         save it
+         bra   L16C3      keep going
+
+L16D3    ldy   Wt.LStDf,x
+         cmpy  Wt.LStrt,x
+         beq   L16E2
+         ldb   Wt.CPY,x
+         addb  ,s
+         stb   ,s
+L16E2    inc   ,s
+         puls  a,x,y,pc
+
+* Process a selected menu item on menu bar
+* Entry: A=Menu # from menu handling table
+*        X=Pointer to menu handling entry
+L16E6    stx   $0B,s      save current menu handling entry pointer
+         ldy   <$1A,s     get path descriptor pointer
+         ldu   $02,s      get static mem pointer
+         ldb   V.MSigID,u get process ID of mouse signal reciever
+         stb   <$23,s     save it
+         clr   V.MSigID,u clear it in device mem
+         lbsr  L1A3C      copy window table
+         stx   <$1E,s     save pointer to graphics table entry
+         sty   <$13,s     save pointer to window table
+         ldx   >WGlobal+G.GfxTbl     get graphics table pointer
+         leax  >$0240,x   point to working window descriptor
+         ldx   WN.BAR,x   get pointer to array of menu descriptors
+         deca             adjust current menu # to start at 0
+         ldb   #MN.SIZ    get size of menu descriptor
+         mul              calculate offset
+         IFNE  H6309
+         addr  d,x        add it to menu array pointer
+         ELSE
+         leax  d,x
+         ENDC
+         ldu   2,s        get static mem pointer
+         lbsr  L13B5      copy menu descriptor from user space
+         stx   5,s        save menu entry pointer
+         lda   MN.ENBL,x  menu enabled?
+         bne   L1728      yes, process pulldown
+         IFNE  H6309
+         clrd             clear menu ID & item #
+         ELSE
+         clra
+         clrb
+         ENDC
+         lbra  L193A      restore window table & return
+
+* Print selected menu text
+L1728    ldu   $0B,s      get menu handling entry pointer
+         ldy   <$13,s     get window table pointer
+         lda   MnuXStrt,u get start X co-ordinate
+         clrb             get start Y co-ordinate
+         pshs  y,x        preserve regs
+         lbsr  L12D7      switch to text font
+         lbsr  L128E      set text coords
+         IFNE  H6309
+         oim   #Bold+TChr,Wt.BSW,y Turn Bold ON/Transparency OFF
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         ora   #Bold+TChr
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         puls  y,x        restore regs
+         lbsr  L1299      get length of text to a maximum of 15
+         lbsr  L1A88      calculate if we can print a space after menu text
+         lbsr  L1283      print a space
+         lda   MN.ID,x    get menu ID
+         cmpa  #MId.Tdy   is it tandy menu?
+         bne   L1757      no, skip ahead
+         lbsr  L127F      print tandy icon
+         bra   L175A      skip ahead
+
+L1757    lbsr  L12AE      print menu text
+L175A    tst   <$19,s     can we print a space here?
+         bne   L1762      no, skip ahead
+         lbsr  L1283      print a space
+L1762    equ   *
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y Turn BOLD OFF
+         ELSE
+         lda   Wt.BSW,y
+         anda  #^Bold
+         sta   Wt.BSW,y
+         ENDC
+         ldx   $05,s      get pointer to menu descriptor
+         lda   MN.NITS,x  any items to print?
+         bne   L1772      yes, skip ahead
+         lda   MN.ID,x    get menu ID
+         clrb             clear item
+         lbra  L193A      return with menu info
+
+* Calculate X start position and size of pull down
+L1772    lda   MN.XSIZ,x  get horizontal size of pull down
+         adda  #$02       add 2 for the borders
+         pshs  a          save window width
+         ldu   $0C,s      get pointer to handling entry
+         adda  MnuXStrt,u add in the start coord to get end coord
+         cmpa  Wt.SZX,y   will it fit in current window?
+         bhs   L1785      no, skip ahead
+         lda   MnuXStrt,u get start coord
+         bra   L1789
+
+L1785    lda   Wt.SZX,y   get current window size
+         suba  ,s         subtract calculated width
+L1789    puls  b          restore width of pull down
+         ldu   2,s        get static mem pointer
+         lbsr  L07B0      find a new window table & link it to current
+         sty   <$1C,s     save the pointer to new window table
+         pshs  y          preserve new window table pointer
+         ldy   <$15,s     get old window table pointer
+         tst   Wt.BLnk,y  Is it an overlay window?
+         bmi   L17A5      No, skip ahead
+L17A2    adda  Wt.DfCPX,y Yes, add to Default X coord start
+L17A5    puls  y          Get new window table ptr back
+         sta   Wt.CPX,y   Save new current X coord start
+         stb   Wt.SZX,y   Save new current X size
+         pshs  y          Save new window table ptr again
+         ldy   <$15,s     get working window table pointer?
+         tst   Wt.BLnk,y  this a overlay window?
+         bpl   L17B9      yes, skip ahead
+         puls  y
+         bra   L17C1
+
+L17B9    lda   Wt.DfCPY,y get full window Y start
+         inca             add 1
+         puls  y          restore
+         bra   L17C3      skip ahead
+
+* Calculate Y start & size of pull down
+L17C1    lda   #$01       get Y co-ordinate start
+L17C3    sta   Wt.CPY,y   save it as current window Y start
+         sta   >GrfMem+gr0059     save it as save switch too
+         lda   MN.NITS,x  get # items in this menu
+         adda  #$02       add 2 to put a blank line on top & bottom
+         pshs  x          save pointer to menu descriptor
+         ldx   <$15,s
+         cmpa  Wt.SZY,x
+         blt   L17E5
+         lda   Wt.SZY,x
+         deca  
+         sta   Wt.SZY,y
+         suba  #2
+         puls  x          restore menu descriptor pointer
+         sta   MN.NITS,x  save as # items in menu descriptor
+         bra   L17E9
+
+L17E5    puls  x          restore menu descriptor pointer
+         sta   Wt.SZY,y   save overlay window size
+* Place pull down on screen
+L17E9    ldx   <$1E,s     get graphics table pointer
+         ldd   Gt.FMsk,x  get the foreground/background masks
+         std   Wt.Fore,y  set foreground/background masks in window table
+         pshs  y          Preserve window tbl ptr
+         ldb   #$0A       get code for OWSet
+         lbsr  L0101      do a overlay window
+         puls  y          Get window tbl ptr back
+         bcc   L181D      no errors on OWSet, print menu items
+         lda   Wt.BLnk,y  Error, get parent window #
+         ldu   2,s        Get static mem ptr
+         sta   V.WinNum,u   Save parent window
+         ldd   #$FFFF     Mark window table as unused
+         std   Wt.STbl,y
+         lbsr  L19F1
+         IFNE  H6309
+         clrd
+         ELSE
+         clra
+         clrb
+         ENDC
+         lbra  L193A
+
+* Move a menu item descriptor from caller
+* Exit: X=Ptr to destination
+L13C9    pshs  b,y,u      preserve regs
+         ldu   <D.Proc    get source task #
+         lda   P$Task,u
+         ldu   <D.SysPrc  get system task #
+         ldb   P$Task,u
+         ldu   >WGlobal+G.GfxTbl     get destination pointer
+         leau  >$0279,u
+         ldy   #MI.SIZ    get size of item descriptor
+         os9   F$Move     move it
+         tfr   u,x        make X point to destination
+         puls  b,y,u,pc
+
+* Setup for printing the item text in the pull down
+L181D    ldu   $02,s      get static memory pointer
+         lbsr  L1358      setup graphics table entry
+         ldy   <$1A,s     get working window table pointer
+         lbsr  L0E68      do a shadowed window on this overlay
+         lbcs  L1935      error, return nothing
+         ldy   <$1C,s     get window table pointer
+         pshs  y
+         ldd   #$203E     turn cursor off
+         lbsr  L0101
+         puls  y
+         ldx   $05,s      get pointer to menu descriptor
+         ldb   MN.NITS,x  get # items in menu
+         stb   <$18,s     save it as a counter
+         clra  
+         sta   <$17,s
+         ldx   MN.ITEMS,x get pointer to item descriptor
+         lbsr  L12D7      switch to text font
+* Print all items in the pull down
+L1852    stx   <$20,s     save pointer to item descriptor
+         bsr   L13C9      get item descriptor from caller
+         tst   MI.ENBL,x  item enabled?
+         bne   L1861      yes, turn bold on
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y Turn BOLD OFF
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         anda  #^Bold
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         bra   L1864      skip to printing
+
+L1861    equ   *
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y Turn BOLD ON
+         ELSE
+         lda   Wt.BSW,y
+         ora   #Bold
+         sta   Wt.BSW,y
+         ENDC
+L1864    clra             set X co-ordinate
+         ldb   <$17,s     get Y co-ordinate
+         pshs  x          preserve item pointer
+         lbsr  L128E      set text co-ordinate
+         puls  x          restore item pointer
+         lbsr  L1299      get length of text to a maximum of 15
+         lbsr  L12AE      print item text
+         ldx   <$20,s     get pointer to item descriptor
+         leax  MI.SIZ,x   move to next item
+         inc   <$17,s     add another item
+         dec   <$18,s     done all items?
+         bne   L1852      no, keep going
+* Setup some variables
+         lda   #$FF       set current selected item state
+         sta   $04,s
+         sta   >WGlobal+g00BF
+         lda   >WGlobal+G.MSmpRV     get current mouse scan rate
+         sta   <$22,s     preserve it
+         lda   #$02       set new mouse scan rate in global mem
+         sta   >WGlobal+G.MSmpRV
+         sta   >WGlobal+G.MSmpRt
+* Main pointer processing loop for a pulldown
+* waits for either a keypress or a mouse button click while updating
+* item text in pull down
+L18A5    clr   >WGlobal+G.WIBusy     flag cowin not busy
+         ldx   #1         let VTIO scan keyboard & update mouse pointer
+         os9   F$Sleep
+         inc   >WGlobal+G.WIBusy     flag cowin busy
+         lda   >WGlobal+g00BF     was a key pressed?
+         bmi   L18CB      no, skip ahead
+         beq   L1943      already processed, remove pull down & return
+         clr   >WGlobal+g00BF     clear key press flag
+         lda   #MId.Chr   get menu ID for key press
+         bra   L1937      remove pull down & return
+
+L18CB    ldx   #WGlobal+G.Mouse Point to mouse packet
+         tst   Pt.CBSA,x  button A down?
+         bne   L1911      yes, go check out where it is
+* No mouse button, check if mouse is in window
+         lbsr  L1D24      copy mouse co-ordinates to system co-ordinates
+         leax  Pt.Siz,x   point to 'em
+         lbsr  L1C25      mouse in current working area?
+         bcc   L18FC      yes, check for item update
+         bsr   L194A      print current item in non-inverse state
+         ldx   #WGlobal+g005C Get ptr to work mouse coords
+         lbsr  L1C19      mouse in current window?
+         bcs   L18F5      no, skip ahead
+         lda   #$01       set mouse in pulldown flag
+         sta   <$24,s
+         lda   #$FF       flag no current item selected
+         sta   $04,s
+         bra   L18A5      go back & wait
+
+L18F5    tst   <$24,s     mouse still in pull down?
+         bne   L1935      no, remove pulldown & return nothing
+         bra   L18A5      go back & wait
+
+* Check if we update current item text
+L18FC    lda   #$01       set mouse in pull down flag
+         sta   <$24,s
+         lbsr  L168A      calculate text Y co-ordinate from mouse
+         sta   <$16,s     save current Y co-ordinate
+         cmpa  $04,s      match current item?
+         beq   L18A5      yes, go back & wait
+         bsr   L194A      print item text
+         bsr   L1972      print next item in inverse state
+         bra   L18A5      go back & wait
+
+* Mouse button down but not released, check if it's a menu item
+L1911    lbsr  L1A33      wait for button release
+         lbsr  L1D24      get current mouse co-ordinates
+         leax  Pt.Siz,x   point to 'em
+         lbsr  L1C25      mouse still in current working area?
+         bcs   L1935      no, return nothing
+         lda   $04,s      get current item #
+         leas  -2,s
+* Was BSR
+         lbsr  L19A8      get item descriptor from caller
+         leas  2,s
+         lda   MI.ENBL,x  item enabled?
+         beq   L1935      no, return nothing
+         ldx   $05,s      get menu descriptor pointer
+         lda   MN.ID,x    get ID
+         ldb   $04,s      get item #
+         incb             add 1 to it (can't use zero)
+         bra   L1937      return with ID & item #
+
+L1935    equ   *
+         IFNE  H6309
+         clrd             clear menu ID & item #
+         ELSE
+         clra
+         clrb
+         ENDC
+L1937    equ   *
+         IFNE  H6309
+         bsr   L19B9      remove pulldown & redraw menu bar
+         ELSE
+         lbsr  L19B9
+         ENDC
+L193A    pshs  d          preserve menu id & item #
+         ldu   $04,s      get static mem pointer
+         lbsr  L1A61      copy the window table
+         puls  d,pc       restore & return
+
+L1943    equ   *
+         IFNE  H6309
+         clrd
+         bsr   L19CA
+         ELSE
+         clra
+         clrb
+         lbsr  L19CA
+         ENDC
+         bra   L193A
+
+* Print non-inversed item text
+L194A    lda   $06,s      get current item #
+         bmi   L1971      no item, return
+         pshs  a          preserve it
+         lbsr  L1331      turn inverse off
+         puls  a          restore item #
+         bsr   L19A8      get item descriptor from caller
+         tst   MI.ENBL,x  enabled?
+         beq   L1971      no, return
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y Turn BOLD ON
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         ora   #Bold
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L1299      get length of item text
+         pshs  b          save length
+         clra             get text X co-ordinate
+         ldb   $07,s      get text Y co-ordinate of item
+         lbsr  L128E      set them
+         lbsr  L12B6      erase to end of line
+         puls  b          restore item text length
+         lbra  L12AE      print item text & return from there
+
+* Print inversed item text
+L1972    lbsr  L1329      turn inverse on
+         lda   <$18,s     get item #
+         bsr   L19A8      get item descriptor from caller
+         tst   MI.ENBL,x  enabled?
+         beq   L19A2      no, return
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y Turn BOLD ON
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         ora   #Bold
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L1299      calculate length
+         pshs  b          save it
+         clra             get X coord of item
+         ldb   <$19,s     get Y coord of item
+         lbsr  L128E      set cursor
+         ldb   ,s         get length
+         lbsr  L12AE      print item text
+         ldx   $08,s      get menu descriptor pointer
+         ldb   MN.XSIZ,x  get width of pull down
+         subb  ,s+        subtract from text length
+         decb             take one off
+L199A    decb             done printing?
+         bmi   L19A2      yes, return
+         lbsr  L1283      print a space
+         bra   L199A      keep going till done
+
+L19A2    lda   <$18,s     get new item #
+         sta   6,s        save as current
+L1971    rts              return
+
+* Get a item descriptor from caller
+* Entry: A=Item #
+L19A8    ldx   $09,s      get menu descriptor pointer
+         ldx   MN.ITEMS,x get pointer to item descriptor array
+         ldb   #MI.SIZ    get size of item descriptor
+         mul              calculate offset
+         IFNE  H6309
+         addr  d,x        add it to pointer
+         ELSE
+         leax  d,x
+         ENDC
+         lbsr  L13C9      get item descriptor from caller
+         rts              return
+
+* Remove pull down menu & redraw menu bar
+L19B9    pshs  d          preserve menu ID and item number
+         bsr   L19D0      remove pull down overlay
+         lda   <$26,s     restore mouse sample rate
+         sta   >WGlobal+G.MSmpRV     put it in global
+         sta   >WGlobal+G.MSmpRt
+         bra   L19F3      redo menu text
+
+L19CA    pshs  d          preserve menu ID & item #
+         bsr   L19D0      remove pull down
+         puls  d,pc
+
+* Remove menu bar pull down
+L19D0    ldy   <$22,s     get window table pointer
+         ldu   $08,s      get static mem pointer
+         lda   Wt.BLnk,y  get window back link #
+         sta   V.WinNum,u   save as current window
+         ldd   Wt.LStDf,y get screen logical start of full window
+         std   Wt.LStrt,y save it as current
+         IFNE  H6309
+         ldq   Wt.DfCPX,y get start co-ordinates & sizes
+         stq   Wt.CPX,y   save 'em as current
+         ELSE
+         ldd   Wt.DfCPX+2,y
+         std   Wt.CPX+2,y
+         std   >GrfMem+gr00B5
+         ldd   Wt.DfCPX,y
+         std   Wt.CPX,y
+         ENDC
+         ldb   #$0C       get code for OWEnd
+         lbra  L0101
+
+* Print menu descriptor text
+* ENTRY: X=ptr to NUL terminated menu text
+L19F1    pshs  d          preserve menu ID & item #
+L19F3    ldu   $F,s       get pointer to menu handling entry
+         ldy   <$17,s     get window table pointer
+         ldx   $9,s       get menu text pointer
+         lda   MnuXStrt,u get start X coord
+         clrb             Y coord=0
+         lbsr  L128E      Do CurXY (preserves u,y,x)
+* Shut scaling off so it works properly (may be able to use A or B instead)
+         lda   Wt.BSW,y
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y BOLD ON
+         aim   #^(TChr+Scale),Wt.BSW,y Transparency on / Scaling off
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         ora   #Bold
+         anda  #^(TChr+Scale)
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         sta   Wt.BSW
+         lbsr  L1329      turn inverse on (preserves u,y,x)
+         lbsr  L1299      get length of text (up to 15) into B
+         IFNE  H6309
+         bsr   L1A8F      Get size that we print into A/U=menu table ptr
+         ELSE
+         lbsr  L1A8F
+         ENDC
+         lbsr  FixMenu    Draw the graphics under current menu option
+         lbsr  L1283      print a space
+         lda   MN.ID,x    get menu ID
+         cmpa  #MId.Tdy   tandy menu?
+         bne   L1A23      no, print normal text
+         lbsr  L127F      print tandy icon (no spaces)
+         bra   L1A2E      return
+
+L1A23    lbsr  L12AE      print menu text
+L1A2E    equ   *
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y turn BOLD OFF
+         ELSE
+         lda   Wt.BSW,y
+         anda  #^Bold
+         sta   Wt.BSW,y
+         ENDC
+         puls  d,pc
+
+* Wait for mouse button release
+L1A33    tst   Pt.CBSA,x  button A down?
+         bne   L1A33      yes, wait for release
+         clr   Pt.CCtA,x  clear click count
+         clr   Pt.TTSA,x  clear time this state
+         rts              return
+
+* Copy window table into a buffer for preservation while cowin is processing
+* the menu bar selections. It does this for ease of restoration of window
+* to do overlays & such
+L1A3C    pshs  d          preserve registers
+         lbsr  L06AE      get window table pointer
+         ldx   >WGlobal+G.GfxTbl     point to a buffer for window table
+         leax  >$02CF,x   Point to buffer to preserve original window tbl
+         bsr   L1A6E      copy current window table into buffer
+         lbsr  L04EA      change window to full size
+         ldu   6,s
+         lbsr  L06B9      get graphics table pointer
+         ldd   Gt.FClr,x
+         std   Wt.Fore,y  save it into window table
+         IFNE  H6309
+         aim   #^Prop,Wt.BSW,y Proportional OFF
+         ELSE
+         pshs  a
+         lda   Wt.BSW,y
+         anda  #^Prop
+         sta   Wt.BSW,y
+         puls  a
+         ENDC
+         lbsr  L1337      set draw pattern to nothing
+         lbsr  L1342      set logic type to nothing
+         puls  d,pc       restore & return
+
+* Restore window table to original state
+L1A61    lbsr  L06AE
+         tfr   y,x
+         ldy   >WGlobal+G.GfxTbl
+         leay  >$02CF,y
+
+* Copy a window table
+* Entry: Y=Source pointer
+*        X=Destination pointer
+
+L1A6E    pshs  x,y
+         leax  Wt.STbl,x
+         leay  Wt.STbl,y
+         IFNE  H6309
+         ldw   #Wt.Siz
+         tfm   y+,x+
+         ELSE
+         pshs  d
+         ldb   #Wt.Siz
+L1A6Eb   lda   ,y+
+         sta   ,x+
+         decb
+         bne   L1A6Eb
+         clra
+         std   >GrfMem+gr00B5
+         puls  d
+         ENDC
+         puls  x,y,pc
+
+L1A88    leas  -2,s       adjust stack for L1a8f routine
+         bsr   L1A8F      Calc End X coord for menu entry
+         leas  2,s        restore stack & return
+         rts   
+
+* Calculate what size of text we will write (preferably with 1 space in
+*   front & back). Set flag @ <$1d on stack as to whether spaces fit or not.
+* Entry: B=Size of text entry
+* Exit: <$1d,s (after puls a,pc) = 0 if fits with lead & trailing spaces
+*       <$1d,s = 1 if did not fit
+*       A=End X coord on menu bar of TEXT ONLY, NOT INCLUDING SPACES
+*       B=Maximum size of text to write (IF CAN'T FIT WITH 2 SPACES)
+*       U=menu table ptr
+*       E=End X coord including spaces
+* NOTE: A does calculate real end in the routine, but only to set flag on
+*       stack. It destroys the result before exiting.
+
+L1A8F    ldu   <$11,s     get menu table pointer
+         lda   MnuXStrt,u get X start co-ordinate
+         IFNE  H6309
+         addr  b,a        add size of text to it
+         ELSE
+         pshs  b
+         adda  ,s+
+         ENDC
+         pshs  a          save result (end coord)
+         inca             add 2 for space on either side
+         inca  
+* Changed to use E
+
+         IFNE  H6309
+         tfr   a,e        Move to register we can preserve
+         cmpe  Wt.SZX,y   still fit in window?
+         bls   L1AB0      yes, skip ahead
+         dece             Subtract one of the 2 spaces
+         cmpe  Wt.SZX,y   fit in window now?
+         ELSE
+         sta   >GrfMem+gr00B5
+         cmpa  Wt.SZX,y
+         bls   L1AB0
+         deca
+         sta   >GrfMem+gr00B5
+         cmpa  Wt.SZX,y
+         ENDC
+         bls   L1AAC      yes, skip ahead
+         ldb   Wt.SZX,y   get window size
+         subb  MnuXStrt,u take off start coord
+         decb             take off another for space in front
+         IFNE  H6309
+         tfr   b,e
+         ELSE
+         stb   >GrfMem+gr00B5
+         ENDC
+L1AAC    lda   #$01
+         bra   L1AB1
+
+L1AB0    clra  
+L1AB1    sta   <$20,s
+         puls  a,pc       restore new X coord & return
+
+* SS.SBar entry point
+L1AB9    lbsr  L116C      setup working window table
+         ldx   PD.RGS,y   get register stack pointer
+         ldy   >WGlobal+g00BB     Get ptr to work window table
+* Theoretically, this is where setting up a FSWIN should draw the scroll bars
+DfltBar  pshs  x          preserve register stack pointer
+         lda   #2         point to draw table to erase old markers
+         leax  <SBarErs,pc
+         lbsr  DrawBar    erase old markers
+         puls  x
+* Draw horizontal scroll bar marker
+         ldb   R$X+1,x    get requested coord
+         addb  #$05       Add 5 to it (min. size of horiz. scroll bar)
+         cmpb  Wt.SZX,y   Still within X size of window?
+         ble   L1B1E      Yes, bump X pos. back by 4 & go draw it
+         ldb   Wt.SZX,y   No, get X size of Window
+         subb  #$03       Bump down by 3
+         bra   L1B20      Go draw it
+
+L1B1E    subb  #$04
+L1B20    clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         std   >GrfMem+gr0047     save X coord
+         ldb   Wt.SZY,y   get window Y size
+         decb             subtract 1 to start at 0
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         incd             Bump down for new marker size
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         addd   #$0001
+         ENDC
+         std   >GrfMem+gr0049
+         ldd   #$ce06     get group/buffer
+         bsr   DrawScrl   Go PutBlk on screen
+* Draw vertical scroll bar marker
+         ldb   Wt.SZX,y   get window X size
+         decb             subtract 1 to start at 0
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld
+         incd            added RG
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola
+         addd  #1        added RG
+         ENDC
+         std   >GrfMem+gr0047
+         ldb   R$Y+1,x    get requested Y position
+         addb  #$06
+         cmpb  Wt.SZY,y   will it fit in window?
+         ble   L1B3D
+         ldb   Wt.SZY,y
+         subb  #$03
+         bra   L1B3F
+
+L1B3D    subb  #4
+L1B3F    clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         std   >GrfMem+gr0049
+         ldd   #$ce05     get group/buffer
+DrawScrl std   >GrfMem+gr0057
+         ldb   #$36       get grfdrv funtion for putblk
+         pshs  x,y
+         lbsr  L0101
+         puls  x,y,pc
+
+* Draw table for erasing scroll bars
+SBarErs  fcb   WColor1    Background of bar color
+         fdb   9          9,(bottom+6) to (Right-17),(Bottom -1)
+         fdb   -6
+         fdb   -17
+         fdb   -2
+         fcb   $4e
+
+         fcb   WColor1    Background of bar color
+         fdb   -6         (Right-6),17 to (Right-1),(Bottom-17)
+         fdb   17
+         fdb   -1
+         fdb   -17
+         fcb   $4e
+
+* Update auto follow mouse cursor - ADD CHECK FOR MOUSE BUTTON DOWN ON AREA
+*  NOT IN OUR WINDOW, DO SELECT IF IN ANOTHER WINDOW
+* NOTE: THE AUTO-FOLLOW MOUSE FLAG REMAINS SET _EVEN_ IF WE END UP ON A TEXT
+*    WINDOW!!!
+* Theoretically, entry is:
+*   U=static mem ptr for current active window
+*   Y=Path descriptor (64 bytes) ptr for current active window
+L1B4D    leas  -5,s       make a buffer for flag & current mouse coords
+         clr   4,s        clear a flag (for different gfx cursor required)
+         ldx   #WGlobal+G.Mouse+Pt.AcX Point to mouse current coords
+         ldu   >WGlobal+G.CurDev     get current device static mem pointer
+         lbsr  L06A0      Go point to & verify window dsc. (preserves X)
+         IFNE  H6309
+         ldq   ,x         Get current X&Y Coords
+         tim   #$01,[Wt.STbl,y] 320 or 640 pixel wide screen?
+         ELSE
+         ldd   2,x
+         std   >GrfMem+gr00B5
+         ldd   ,x
+         pshs  a
+         lda   [Wt.STbl,y]
+         bita  #$01
+         puls  a
+         ENDC
+         bne   L1B72      640, skip ahead
+         IFNE  H6309
+         lsrd             Divide X coord by 2
+L1B72    stq   ,s         Save current mouse coords
+         ELSE
+         lsra             Divide X coord by 2
+         rorb
+L1B72    std   ,s         Save current mouse coords
+         ldd   >GrfMem+gr00B5
+         std   2,s
+         ldd   ,s
+         ENDC
+         leax  ,s         point to coord info
+*  1ST TRY - NEW ROUTINE
+         lbsr  L1C19      Check if mouse coord in current window at all
+         bcs   L1B8D      No, check to see if we switch windows
+* Mouse cursor within current physical window
+         lbsr  L1C25      Check if mouse coord in CWArea of current window
+         lbcs  AdjstCrs   No, must be in control region, adjust gfx cursor
+         ldu   >WGlobal+G.CurDev     get current device static mem
+         lbsr  L06B9      get gfx table pointer for this window
+         ldd   Gt.GOff,x  get offset into block of graphics cursor
+         cmpd  Wt.GOff,y  Same as ptr in window table itself?
+         lbeq  L1BD8      Yes, skip ahead
+         inc   4,s        No, set flag & then skip ahead
+         lbra  L1BD8
+
+* Mouse cursor not within current window's CWArea. Please note that if running
+*   in a bordered window, this means it could be in the menu bar or scroll bar
+*   areas (within DWSet range, but not CWArea)
+* Gets here ok when cursor on different window
+* REQUIRES VTIO TO SET MSEMOVE FLAG WHEN BUTTON PRESSED (DONE IN TC9IO)
+* May want to change to send MsSig here in CoWin instead - then we can leave
+* Tc9/CC3 IO alone.
+* NOTE: WE _WILL_ HAVE TO MAKE SURE IT IS A WINDOW LINKED WITH A PROCESS IN
+*   SOME WAY (AS TC9IO'S CLEAR ROUTINE DOES), AS IT WILL SELECT "GHOST"
+*   WINDOWS FOR GSHELL (I THINK)
+
+L1B8D    ldd   >Pt.CBSA+G.Mouse+WGlobal Get both buttons
+         lbeq  AdjstCrs   Neither down, continue normally
+* Search through window tables looking for ones on the same screen (NO overlay
+         ldu   Wt.STbl,y  Get our screen table for comparison purposes
+         ldx   #WinBase   Point to start of internal window tables
+         ldd   #$2040     32 windows to check, $40 bytes/table entry
+         IFNE  H6309
+SrchLoop ldw   Wt.STbl,x  Get screen tbl ptr
+         cmpw  #$FFFF     unused, skip
+         beq   TryNext
+         cmpr  x,y        Our own ptr?
+         beq   TryNext
+         cmpr  w,u        On same screen?
+         ELSE
+SrchLoop pshs  x
+         ldx   Wt.STbl,x
+         stx   >GrfMem+gr00B5
+         cmpx  #-1
+         puls  x
+         beq   TryNext
+         pshs  x
+         cmpy  ,s++
+         beq   TryNext
+         cmpu   >GrfMem+gr00B5
+         ENDC
+         beq   CheckScn   Yes, check if mouse clicked on it.
+* inc >BordReg
+TryNext  abx              No, bump ptr up
+         deca             Dec # windows left to check
+         bne   SrchLoop
+         bra   AdjstCrs
+
+
+CheckScn equ   *
+         IFNE  H6309
+         lde   Wt.BLnk,x  Is this an overlay window?
+         ELSE
+         pshs  a
+         lda   Wt.Blnk,x
+         sta   >GrfMem+gr00B5
+         puls  a
+         ENDC
+         bpl   TryNext    Yes, don't bother with it (MAY BE WRONG?)
+         pshs  u,y,x,d    Preserve regs
+         leax  8,s        Point to mouse packet
+*         ldx   #WGlobal+G.Mouse+Pt.AcX   Point to mouse current coords
+         lbsr  L1C19      See if mouse on this window
+         puls  u,y,x,d    Restore regs
+         bcs   TryNext    Not on this window either, continue through table
+* Found window mouse was clicked on. Now, we must find the ptr to _this_
+*   windows' device mem ptr, load it into X, lbsr L0582 & bra L1C16
+* See TC9IO source, but basically, get Device Table ptr, get # of devices max,
+*   use that as range, Get our V$DRIV, check for match (going through Device
+*   table), if match, get V$STAT for static storage. Go in there, make sure
+*   $1d indicates GRFDRV/CoWin, $1e >0 (Valid window). If so, we found our
+*   ptr. If not, skip to AdjstCrs. Do NOT have to go back in loop, as only
+*   one window can be in same area (at this time... until movable/resizable
+*   windows are implimented in 16K grfdrv)
+* This routine should preserve Y (window table ptr)
+* SEEMS TO WORK TO HERE NOW.
+* Entry: A=32-window entry #
+* NOTE: IF IT ALLOWS SELECTING THE UNDERLYING GSHELL "GHOST" WINDOW, WE ALSO
+*   HAVE TO ADD CODE TO MAKE SURE A PROCESS IS ACTIVE FOR THE WINDOW... WHICH
+*   MEANS RE-SEARCHING (PAST LAST FOUND POINT) THE WINDOW TABLE ITSELF
+         ldb   #$20       Invert window entry #
+         IFNE  H6309
+         subr  a,b
+         ELSE
+         pshs  a
+         subb  ,s+
+         ENDC
+         pshs  b,y        Preserve window entry # & Window table ptr
+         ldx   >WGlobal+G.CurDev     Get ptr to current device static mem
+         ldx   V.PORT,x   Get ptr to our device table entry
+         IFNE  H6309
+         ldw   V$DRIV,x   Get original window's driver ptr
+         ELSE
+         ldx   V$DRIV,x
+         stx   >GrfMem+gr00B5
+         ENDC
+         ldb   #DEVSIZ    Size of each device table entry
+         ldx   <D.Init    Get ptr to INIT module
+         lda   DevCnt,x   Get # of entries allowed in device table
+         ldx   <D.DevTbl  Get start of device table
+         mul              Calculate offset to end of device table
+         leay  d,x        Point Y to end of Device table
+         ldb   #DEVSIZ    Get device table entry size again
+DevLoop  ldu   V$DRIV,x   Get driver ptr for device we are checking
+         IFNE  H6309
+         cmpr  u,w        Same as original window?
+         ELSE
+         cmpu  >GrfMem+gr00B5
+         ENDC
+         bne   NextEnt    No, skip to next entry
+         ldu   V$STAT,x   Get static mem ptr for CC3/TC9IO device
+         lda   V.WinType,u  Is this a Windint/Grfint window?
+         bne   NextEnt    No, VDGINT so skip
+         lda   V.InfVld,u   Is this static mem properly initialized?
+         beq   NextEnt    No, skip
+         lda   V.WinNum,u   Get window table entry #
+         cmpa  ,s         Same as one we are looking for?
+         bne   NextEnt    No, wrong window
+* In some cases, it DOES deactivate the original window
+         ldd   >WGlobal+G.CurDev Copy old static mem ptr to previous
+         std   >WGlobal+G.PrWMPt
+         stu   >WGlobal+G.CurDev Found it, save as current device
+         inc   V.ScrChg,u   Flag that screen update needed
+         clr   >WGlobal+g000A Flag that we are not active device anymore
+         clr   >WGlobal+g00BF Clear Windint's key pressed flag
+         leas  8,s        Eat temp vars
+         rts   
+
+NextEnt  abx              Point to next entry in device table
+         IFNE  H6309
+         cmpr  y,x        Past end of table?
+         ELSE
+         pshs  y
+         cmpx  ,s++
+         ENDC
+         blo   DevLoop    No, keep trying
+NoGo     puls  b,y        Yes, restore window table ptr
+AdjstCrs ldx   >WGlobal+G.GfxTbl     get pointer to graphics table
+         ldd   >$02BC,x   graphics cursor been initialized?
+         bne   L1BB5      yes, skip ahead
+         ldd   #$CA01     get default group/buffer for arrow
+         std   >GrfMem+gr0057     Save in Grfdrv mem
+         pshs  y,x
+         ldb   #$1A       get function call for GCSet
+         lbsr  L0101      let grfdrv do it
+         puls  y,x
+         lda   Wt.GBlk,y  get graphics cursor block #
+         sta   >$02BC,x   save it in Gfx table mem
+         ldd   Wt.GOff,y  get offset in block to graphics cursor
+         std   >$02BD,x   save it
+         bra   L1BD1
+
+* Change mouse cursor if necessary
+L1BB5    pshs  a          save gcursor block #
+         ldd   Wt.GOff,y  get offset into block
+         cmpd  >$02BD,x   match current?
+         puls  a          restore block #
+         beq   L1BD8      Yes, skip next bit
+L1BC5    sta   Wt.GBlk,y  save it into window table
+         ldd   >$02BD,x   get offset from global mem
+         std   Wt.GOff,y  save it as offset in window table
+L1BD1    pshs  y,x        Preserve regs
+         lbsr  L0CEC      Update cursors in Grfdrv
+         puls  y,x        Restore regs
+
+L1BD8    equ   *
+         IFNE  H6309
+         ldq   ,s         get X&Y coords
+         stq   >GrfMem+gr005B     save them in grfdrv mem
+         ELSE
+         ldd   2,s
+         std   >GrfMem+gr005B+2
+         std   >GrfMem+gr00B5
+         ldd   ,s
+         std   >GrfMem+gr005B 
+         ENDC
+         ldb   #$44       get function call for PutGC
+         pshs  y          Preserve regs
+         lbsr  L0101      Put mouse cursor on screen
+         puls  y          Restore regs
+         tst   4,s        Was gfx cursor in window same as in gfx table?
+         beq   L1C16      Yes, skip ahead
+         ldu   >WGlobal+G.CurDev     No, get ptr to current device
+         lbsr  L06B9      get pointer to graphics tables for this window
+         lda   Gt.GBlk,x  Get gfx table block # for gfx cursor
+         bne   L1C07      There is one, make the it the same in window table
+         lda   Wt.GBlk,y  Isn't one, copy from window table to gfx table
+         sta   Gt.GBlk,x
+         ldd   Wt.GOff,y
+         std   Gt.GOff,x
+         bra   L1C11      Go update the cursors on screen
+
+L1C07    sta   Wt.GBlk,y  set block # of graphics cursor in window table
+         ldd   Gt.GOff,x  get offset into block
+         std   Wt.GOff,y
+L1C11    lbsr  L0CEC      Update cursors in GrfDrv
+L1C16    leas  5,s        Eat stack & return
+         rts   
+
+* Check if mouse is in current window (DWSet area)
+* Entry: X=pointer to current mouse coordinates in mouse packet
+*        Y=Pointer to window table
+* Stack use: 0,s   current window table pointer
+*            2,s   window start cords.
+*            4,s   window size
+L1C19    leas  -6,s       make a buffer
+         sty   ,s         save window table pointer
+         leay  Wt.DfCPX,y point to window default co-ordinates
+         bsr   L1C84      calculate co-ordinates
+         bra   L1C2E      go calculate it
+
+* Check if mouse is in current working area (CWArea)
+* Entry: X=pointer to current mouse coordinates in mouse packet
+*        Y=Pointer to window table
+* Stack use: 0,s   current window table pointer
+*            2,s   window start cords.
+*            4,s   window size
+* Exit: Carry clear - on current window area
+*       Carry set, off of current window area
+* Preserves X
+L1C25    leas  -6,s       make a buffer
+         sty   ,s         save window table pointer
+         leay  Wt.CPX,y   point to current window co-ordinates
+         bsr   L1C64      (preserves X)
+L1C2E    ldb   2,s        get window X co-ordinate max.
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         cmpd  ,x         higher or lower than current mouse X co-ordinate
+         bhi   L1C5D      higher not in window, return carry set
+         ldb   $02,s      get window X co-ordinate
+         addb  $04,s      add it to size
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         cmpd  ,x         within range?
+         bls   L1C5D
+* Check if mouse is within range of maximum Y co-ordinate of window
+         ldb   $03,s      get 
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         cmpd  $02,x
+         bhi   L1C5D
+* Check if mouse is within Y lower range of window
+         ldb   $03,s      get Y co-ordinate of window
+         addb  $05,s      add in the size
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         ENDC
+         cmpd  $02,x      higher or lower than current mouse Y co-ordinate
+         bls   L1C5D      lower, return mouse off window
+         clra             flag mouse pointer is on this window
+         bra   L1C5E      return
+
+L1C5D    coma             flag pointer is off this window
+L1C5E    ldy   ,s         restore window table pointer
+         leas  6,s        purge stack
+         rts              return
+
+L1C64    pshs  x          preserve pointer to mouse working co-ordinates
+         pshs  y          save pointer to window X/Y start co-ordinates
+         ldy   6,s        get window table pointer
+         ldd   Wt.CPX,y   get current X & Y start co-ordinates
+         IFNE  H6309
+         ldw   Wt.LStDf,y get screen logical start of full window
+         cmpw  Wt.LStrt,y match current working area?
+         ELSE
+         pshs  x
+         ldx   Wt.LStDf,y get screen logical start of full window
+         stx   >GrfMem+gr00B5
+         cmpx  Wt.LStrt,y match current working area?
+         puls  x
+         ENDC
+         beq   L1C80      yes, skip ahead
+         addd  Wt.DfCPX,y add current X/Y start to actual X/Y start
+         puls  y
+         bra   L1C88
+
+L1C80    puls  y          restore pointer to window X/Y start coords
+         bra   L1C86      skip ahead
+
+L1C84    pshs  x          preserve pointer to mouse working coords
+L1C86    ldd   ,y         get active window start X/Y default coords
+L1C88    std   6,s        save 'em
+         ldd   2,y        get active window default sizes
+         std   8,s        save 'em
+         ldx   4,s        get current window table pointer
+         lda   Wt.BLnk,x  this a overlay window?
+         bmi   L1CBA      no we are the only window, return
+L1C94    bsr   L1CBC      get window table pointer to the parent window
+         lda   Wt.BLnk,x  we at the bottom of the pile?
+         bpl   L1C94      no, keep going
+         ldd   $06,s      get active window start coords
+         IFNE  H6309
+         ldw   Wt.LStDf,x get window logical start
+         cmpw  Wt.LStrt,x same as current working area?
+         ELSE
+         pshs  y
+         ldy   Wt.LStDf,x get window logical start
+         sty   >GrfMem+gr00B5
+         cmpy  Wt.LStrt,x same as current working area?
+         puls  y
+         ENDC
+         bne   L1CB1      no, skip ahead
+         addd  Wt.DfCPX,x add the start coord defaults of parent window
+         bra   L1CB8      save & return
+
+L1CB1    addd  Wt.DfCPX,x
+         addd  Wt.CPX,x   add current window start coords. of parent window
+L1CB8    std   $06,s      save window start coords
+L1CBA    puls  x,pc       retsore & return
+
+* Get pointer to window table entry
+* Entry: A=Window table entry #
+* Exit : X=Pointer to window table entry
+L1CBC    ldb   #Wt.Siz    get size of entrys
+         mul              calculate offset
+         ldx   #WinBase   Point X to window table start
+         IFNE  H6309
+         addr  d,x        add offset
+         ELSE
+         leax  d,x
+         ENDC
+         rts              return
+
+* Update mouse packet pointer status based on where it is (called from VTIO)
+* Entry: None
+L1CC8    lbsr  L06A0      verify window (don't care about errors)
+         bsr   L1D24      copy current mouse coords to work area
+         pshs  x          save pointer to mouse packet
+         leax  Pt.Siz,x   point to working coord copies
+         lbsr  L1C25      mouse in menu bar area?
+         bcs   L1CE2      yes, clear relative coords from mouse packet
+         bsr   L1CFA      update window relative mouse coords
+         clra             get code for content region
+L1CDD    puls  x          restore mouse packet pointer
+         sta   Pt.Stat,x  save pointer type
+         clrb             clear errors
+         rts   
+
+* Mouse is either in control region or off window, calculate which
+L1CE2    equ   *
+         IFNE  H6309
+         clrd
+         clrw  
+         stq   -4,x       clear out relative coords in mouse packet
+         ELSE
+         clra
+         clrb
+         std   >GrfMem+gr00B5
+         std   -4,x
+         std   -2,x
+         ENDC
+         lbsr  L1C19      mouse on window?
+         lda   #WR.Cntrl  Default to Control Region (doesn't affect carry)
+         bcc   L1CDD      Yes, leave flag alone
+         inca             Not on window, change flag to 2
+         bra   L1CDD
+
+* Update window relative coords in mouse packet
+* Entry: X=Ptr to mouse working coords
+*        Y=Ptr to current window table
+L1CFA    leas  -6,s       make a buffer
+         sty   ,s         save window table pointer
+         leay  Wt.CPX,y   point to current window start coords
+         lbsr  L1C64      calculate window 
+         ldb   2,s        get window X size
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ldw   ,x         get current mouse X coord
+         subr  d,w        subtract it from size
+         stw   -4,x       save window relative X coord in mouse packet
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         pshs  d
+         ldd   ,x
+         subd  ,s
+         std   -4,x
+         puls  d
+         ENDC
+         ldb   3,s        get window Y size
+         clra             Multiply x 8
+         IFNE  H6309
+         lsld  
+         lsld  
+         lsld  
+         ldw   2,x        get current mouse Y coord
+         subr  d,w        subtract it from size
+         stw   -2,x       save window relative Y coord in mouse packet
+         ELSE
+         lslb  
+         rola  
+         lslb  
+         rola  
+         lslb  
+         rola  
+         pshs  d
+         ldd   2,x
+         subd  ,s
+         std   >GrfMem+gr00B5
+         std   -2,x
+         puls  d
+         ENDC
+         ldy   ,s         get window table pointer
+         leas  6,s        purge stack
+         rts              return
+
+* Copy current mouse coords to working area
+L1D24    ldx   #WGlobal+G.Mouse Point to mouse packet in global mem
+         IFNE  H6309
+         ldq   Pt.AcX,x   get current mouse coords
+         tim   #$01,[Wt.STbl,y] 640 pixel wide screen?
+         ELSE
+         ldd   Pt.AcX+2,x
+         std   >GrfMem+gr00B5
+         ldd   Pt.AcX,x
+         pshs  a
+         lda   [Wt.STbl,y]
+         anda  #$01
+         puls  a
+         ENDC
+         bne   L1D47      yes, skip ahead
+         IFNE  H6309
+         lsrd             Divide X coord by 2
+L1D47    stq   Pt.Siz,x   Save X&Y coords in working area
+         ELSE
+         lsra
+         rorb
+L1D47    pshs  d
+         ldd   >GrfMem+gr00B5
+         std   Pt.Siz+2,x
+         puls  d
+         std   Pt.Siz,x
+         ENDC
+         rts              return
+
+         ENDC
+
+
+****************************
+* Scale/DWProtSw/TCharSw/BoldSw
+DWProtSw
+TCharSw
+BoldSw
+PropSw
+ScaleSw  lbsr  L06A0      verify window table
+         bcs   NoWind     not good, return error
+         lda   ,x         Get switch
+         ldx   >WGlobal+G.CurDvM     Get current devices' static mem ptr
+         ldb   V.CallCde,x  Get which switch we will be setting
+         subb  #$22       Bump down to 0-8 range
+         bpl   doswitch   If anything but DWProtSW, skip ahead
+         clrb             0=DWProtSW
+doswitch leax  <SwtchTbl,pc Point to switch table
+         tsta             On or Off?
+         bne   SwOn       On, go do
+         leax  10,x       Off, adjust for 2nd table
+SwOn     jmp   b,x        Go set/reset bit flag
+
+NoWind   ldb   #E$WUndef  Window Undefined error
+         rts   
+
+* Table for switches
+SwtchTbl bra   DProtOn    Device window protect On
+         bra   TChrOn     Transparent chars On
+         bra   PropOn     Proportional On
+         bra   ScaleOn    Scaling On
+         bra   BoldOn     Bold On
+         bra   DProtOff   Device window protect Off
+         bra   TChrOff    Transparent chars Off
+         bra   PropOff    Proportional Off
+         bra   ScaleOff   Scaling Off
+         bra   BoldOff    Bold Off
+
+DProtOn  equ    *
+         IFNE  H6309
+         oim   #Protect,Wt.BSW,y Turn Device window protect on
+         ELSE
+         ldb   Wt.BSW,y
+         orb   #Protect
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+DProtOff equ    *
+         IFNE  H6309
+         aim   #^Protect,Wt.BSW,y Turn Device window protect off
+         ELSE
+         ldb   Wt.BSW,y
+         andb  #^Protect
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+TChrOff  equ    *
+         IFNE  H6309
+         oim   #TChr,Wt.BSW,y Turn Transparency off
+         ELSE
+         ldb   Wt.BSW,y
+         orb   #TChr
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+TChrOn   equ    *
+         IFNE  H6309
+         aim   #^TChr,Wt.BSW,y Turn Transparency on
+         ELSE
+         ldb   Wt.BSW,y
+         andb  #^TChr
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+PropOn   equ    *
+         IFNE  H6309
+         oim   #Prop,Wt.BSW,y Turn Proportional on
+         ELSE
+         ldb   Wt.BSW,y
+         orb   #Prop
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+PropOff  equ    *
+         IFNE  H6309
+         aim   #^Prop,Wt.BSW,y Turn Proportional off
+         ELSE
+         ldb   Wt.BSW,y
+         andb  #^Prop
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+ScaleOn  equ    *
+         IFNE  H6309
+         oim   #Scale,Wt.BSW,y Turn Scaling on
+         ELSE
+         ldb   Wt.BSW,y
+         orb   #Scale
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+ScaleOff equ    *
+         IFNE  H6309
+         aim   #^Scale,Wt.BSW,y Turn Scaling off
+         ELSE
+         ldb   Wt.BSW,y
+         andb  #^Scale
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+BoldOn   equ    *
+         IFNE  H6309
+         oim   #Bold,Wt.BSW,y Turn Bold on
+         ELSE
+         ldb   Wt.BSW,y
+         orb   #Bold
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+BoldOff  equ    *
+         IFNE  H6309
+         aim   #^Bold,Wt.BSW,y Turn Bold off
+         ELSE
+         ldb   Wt.BSW,y
+         andb  #^Bold
+         stb   Wt.BSW,y
+         ENDC
+         clrb             No error & return
+         rts   
+
+         IFNE  CoGrf-1
+* FIXMENU - redos the graphics on the menu bar affected by menu pulldown
+* Entry: X=Ptr to menu text (NUL terminated)
+*        Y=Window table ptr
+*        U=Ptr to menu handling table entry (4 byte packets)
+*        B=Size of text to write (dont' need here)
+*        A=End X coord of menu entry
+* Exit: preserves x,y,u registers
+* Stack offsets for temp stack:
+fixcolor equ   0
+fixstrtx equ   1
+fixstrty equ   3
+fixendx  equ   5
+fixendy  equ   7
+fixcode  equ   9
+
+* 1st, redo background
+
+FixMenu  pshs  d,x        Save # of chars & menu text ptr
+         leas  -10,s      Make room on stack for graphics "chunk"
+         IFNE  H6309
+         tfr   e,b        Move calculated End X coord to D
+         ELSE
+         ldb   >GrfMem+gr00B5
+         ENDC
+         lda   MN.ID,x    Get menu ID #
+         cmpa  #MId.Tdy   Tandy menu (in which case E is fried)
+         bne   normalmn
+         ldb   MnuXEnd,u  Get real end coord
+         incb             For space between it & next coord
+* Draw 6 pixel high bar in middle
+normalmn clra  
+         IFNE  H6309
+         lsld             D=D*8 (for graphics X coord)
+         lsld  
+         lsld  
+         ELSE
+         lslb
+         rola
+         lslb
+         rola
+         lslb
+         rola
+         ENDC
+         std   fixendx,s  Save End X Coord
+         ldd   #WColor1   Color 1
+         stb   fixcolor,s Save it
+         ldd   #1         Y Pix start=1 (added since WColor now changeable)
+         std   fixstrty,s
+         ldb   #6         Save Y pixel end
+         std   fixendy,s
+         ldb   MnuXStrt,u Get start X coord
+         IFNE  H6309
+         lsld             D=X coord in pixels
+         lsld  
+         lsld  
+         ELSE
+         lslb
+         rola
+         lslb
+         rola
+         lslb
+         rola
+         ENDC
+         std   fixstrtx,s Save X pixel start
+         ldd   #$014e     1 function & GRFDRV Bar function code
+         stb   fixcode,s
+         leax  ,s         Point to our "chunk"
+         lbsr  DrawBar    Draw the top line again
+* Now redo top line
+         lda   #WColor3   Color 3
+         sta   fixcolor,s
+         IFNE  H6309
+         clrd             Y coord=0
+         ELSE
+         clra
+         clrb
+         ENDC
+         std   fixstrty,s
+         std   fixendy,s
+         ldd   #$014a     1 function & Draw line GRFDRV function code
+         stb   fixcode,s
+         leax  ,s         Point to our "chunk"
+         lbsr  DrawBar
+* Now redo bottom line
+         lda   #WColor2   Color 2
+         sta   fixcolor,s
+         ldd   #7         Y coord=7
+         std   fixstrty,s
+         std   fixendy,s
+         ldd   #$014a     1 function & GRFDRV Draw Line function code
+         stb   fixcode,s
+         leax  ,s         Point to our "chunk"
+         lbsr  DrawBar
+         leas  10,s       Restore stack
+         puls  d,x,pc     Restore regs & return
+         ENDC
+
+         emod  
+eom      equ   *
+         end