view 3rdparty/utils/view/view_gfx.a @ 2210:7ee1bed662f2

Fixed driver to copy D.SysPrc in Level 2 to D.Proc before link
author boisy
date Mon, 16 Mar 2009 14:39:49 +0000
parents 37fd74e6fad8
children
line wrap: on
line source

*
* Graphics support routines for "view"
*
* Global DP variables:
*     numscreens:  Total number of graphics screens in use.
*     curscreen:   Number of currently selected screen
*     screenpaths: array of path numbers for open screens
* Global subroutines:
*     setscreen:   Set a screen to correct type, open new one if appropriate
*     setborder:   Set border of current screen to palette A.
*     select:      Select StdOut.
*     flipscreen:  Select next screen.
*     flipback:    Select previous screen.
*     echooff:     Turn off echo to current screen
*     saveopts:    Get StdOut options packet and save it.
*     cleanup:     Select StdOut, turn on cursor, restore StdOut.
*     newscreen:   open a new screen, put path num in "outpath" var.
*     killscreen:  DWEnd current screen.
*     killbuffs:   Kill all of our buffers.
*     setbuffer:   Create one-line buffer for putting stuff on screen.
*                  Returns number of bytes/line in D.
*     putline:     Put data in linebuff onto screen line D.
*     fetchline:   Get screen line D into linebuff
*
  ifp1
  use os9defs.d
  endc

check macro
      pshs b,cc
      ldb  #\1
      os9  F$PErr
      puls b,cc
      endm

StdOut equ 1

  psect view_gfx_a,0,0,0,0,0

 vsect dp
numscreens:  rmb 1   Total number of screens allocated.
curscreen:   rmb 1   Current screen

buffadd     rmb 2   Address of Get/Put buffer.
buffsiz     rmb 1   Size of Get/Put buffer.
 endsect

 vsect
screenpaths: rmb 16  
 endsect

********************************
*
* Create appropriate screen
*
*******************************


  vsect
setscCom 
  fdb $1b20       DWSet
  fcb 8           type
  fcb 0,0
  fcb 40          screen width
  fcb 24          screen length
  fcb 1,0,0       palettes
  fcb $1b,$21     Select code
  fcb $05,$20     Cursor off
  endsect

setscreen:
  pshs a,b,x,u,y
  tst  <numscreens
  bne  setSame0     If we already have 1 screen, we _must_ create a new one.
  tst  <Samescreen
  bne  setSame1
setSame0
  lbsr newscreen   Open a new screen.
  lda  <outpath      Store path number to paths array
  leax screenpaths,y
  ldb  <numscreens
  sta  b,x
  bra  setSame2
setSame1
  lbsr killscreen  Kill this screen, so we can re-open with correct type.
  lda  #1          This screen is StdOut
  sta  screenpaths,y Set first path.
setSame2
  ldb  <numscreens
  stb  <curscreen   Set current screen to most recent one.
  incb
  stb  <numscreens  We now have one more screen.
  lda  <type      type from header interp
  sta  setscCom+2,y
  anda #1
  nega
  anda #40
  adda #40
  sta  setscCom+5,y    bottom corner
  leax setscCom,y      Now output this string.
  lda  <outpath
  pshs y
  ldy  #14
  os9  I$Write
  lbcs _error
  puls y

  lbsr echooff        Turn off echo on screen.
  lbsr setmouse       Turn on mouse signal everywhere.
  puls a,b,x,u,y,pc

selectCom
 fdb $1b21     Select screen

select:
  pshs a,b,x,y
  leax selectCom,pcr
  ldy  #2
  lda  #StdOut
  os9  I$Write
  puls a,b,x,y,pc

flipscreen:
  pshs a,b,x,y
  ldb  <curscreen
  incb
  cmpb <numscreens
  blo  flip1
  clrb
flip1
  bra  doflip
flipback:
  pshs a,b,x,y
  ldb  <curscreen
  bne  flip2
  ldb  <numscreens
flip2
  decb
* Send the select code to the new screen.
doflip
  stb  curscreen
  leax screenpaths,y
  lda  b,x
  sta  <outpath
  leax selectCom,pcr
  ldy  #2
  os9  I$Write
  lbcs _error
  puls a,b,x,y,pc

 vsect
borderCom fcb $1b,$34,00,$1b,$33,00,$0c   Set border, set background, cls
 endsect

setborder:
  pshs a,b,x,y
  leax borderCom,y
  sta  2,x
  sta  5,x
  ldy  #7
  lda  <outpath
  os9  I$Write
  lbcs _error
  puls a,b,x,y,pc

*
* Set screen modes on outpath
*
 vsect dp
optvalid rmb 1   T = options packet is valid.
 endsect

 vsect
options rmb 32
newopts rmb 32
 endsect

saveopts:
 pshs   a,b,x
 lda    #StdOut    Get options for StdOut, and save them.
 ldb    #SS.Opt
 leax   options,y
 os9    I$GetStt
 lbcs   _error
 com    optvalid
 puls   a,b,x,pc

echooff:
 pshs   a,b,x
 lda    <outpath
 ldb    #SS.Opt
 leax   newopts,y
 os9    I$GetStt
 lbcs   _error
 clr    4,x      Turn off echo.
 os9    I$SetStt
 lbcs   _error
 puls   a,b,x,pc


cleanCom
 fdb $0521     Turn on cursor.
 fdb $1b21     Select screen

cleanup:
 pshs a,b,x,y
 leax cleanCom,pcr
 lda  #StdOut
 pshs y
 ldy  #4
 os9  I$Write   Select StdOut and turn on cursor.
 puls y

 tst  optvalid  If options is valid,
 beq  echoend
 ldb  #SS.Opt
 leax options,y
 os9  I$SetStt  then restore the initial options.
 lbcc echoend
 os9  F$Exit
echoend
 puls a,b,x,y,pc

*
* Open new window
*
Winname fcc "/w"
 fcb  $0d

newscreen:
 pshs a,b,x
 leax Winname,pcr
 lda  #3           Update mode
 os9  I$Open
 lbcs _error
 sta  <outpath
 puls a,b,x,pc
 
killCom fdb $1b24

killscreen:
 pshs a,b,x,y
 leax killCom,pcr
 lda  <outpath
 ldy  #2
 os9  I$Write
 bcc  killscrend
 cmpb #E$WUndef   Was it window undefined??  That we can ignore.
 lbne _error      No, abort.
killscrend
 puls a,b,x,y,pc

 vsect
killbcom  fcb $1b,$2a,0,0
 endsect

killbuffs:
 pshs a,b,x,y
 lda  <PID
 leax killbcom,y 
 sta  2,x
 ldy  #4
 lda  <outpath
 os9  I$Write
 puls a,b,x,y,pc

**************************************************************
*
* Create get/put buffer for horizontal imaging
*
**************************************************************

 vsect dp
buflegit rmb 1  True= buffer already allocated and mapped
 endsect

 vsect
setbufCom
 fdb $1b2c
 fdb 0001    Group/buffer
 fdb 0000
 fdb 0000
 fdb 320
 fdb 1
 endsect

setbuffer:
 pshs x,y
 tst  buflegit   If buffer already created/mapped, then don't do it again.
 bne  setbufend
 com  buflegit

 lda  <PID
 sta  setbufCom+2,y
 leax setbufCom,y
 lda <outpath
 pshs y
 ldy #12
 OS9 I$Write 
 lbcs _error
 puls y

 lda <PID
 ldb #1
 tfr d,x
 lda #1
 ldb #SS.MpGPB map in buffer
 pshs y
 ldy #1
 os9 I$SetStt  Now try to map it.
 lbcs _error
 tfr y,d
 puls y
 stx buffadd

 lda <type
 ldb #40
 cmpa #7
 beq setbuf8
 cmpa #8
 bne  setbuf9
setbuf8
 addb #40
setbuf9
 stb  buffsiz

setbufend
 ldb  buffsiz
 clra
 lsla
 rolb
 puls x,y,pc


*
* Putline: expects number of row in D
*
 vsect
putCom fdb $1b2d
 fcb 0,1         Grp/Buf
 fdb 0           Xloc
 fdb 0           Yloc
 endsect


putline:
 pshs a,b,x,y,u
 std  putCom+6,y     Set up PUT buffer command
 lda  <PID
 sta  putCom+2,y
 ldd  #0      First X value is zero.
 std  putCom+4,y

 leax linebuff,y
 ldu  buffadd
 ldb  buffsiz

put1
 lda  ,x+
 sta  ,u+
 decb
 bne  put1

 pshs x,y 
 leax putCom,y
 lda  <outpath
 ldy  #8
 OS9  I$Write
 lbcs _error
 puls x,y

 ldd  #320      Second X value is 320= 1/2 screen.
 std  putCom+4,y

 ldb  buffsiz
 ldu  buffadd
put2
 lda  ,x+
 sta  ,u+
 decb
 bne  put2

 leax putCom,y
 lda  <outpath
 ldy  #8
 OS9  I$Write
 lbcs _error

 puls a,b,x,y,u,pc

*
* fetchline: expects number of row in D
*
 vsect
fetchCom fdb $1b2c
 fcb 0,1  Grp/Buf
 fdb 0    Xloc
 fdb 0    Yloc
 fdb 320  XSize
 fdb 1    YSize
 endsect


fetchline:
 pshs a,b,x,y,u
 std  fetchCom+6,y     Set up GET buffer command
 lda  <PID
 sta  fetchCom+2,y
 ldd  #0      First X value is zero.
 std  fetchCom+4,y

 pshs x,y 
 leax fetchCom,y
 lda  <outpath
 ldy  #12
 OS9  I$Write
 lbcs _error
 puls x,y

 leax linebuff,y
 ldu  buffadd
 ldb  buffsiz

fetch1
 lda  ,u+
 sta  ,x+
 decb
 bne  fetch1

 ldd  #320      Second X value is 320= 1/2 screen.
 std  fetchCom+4,y

 pshs x,y
 leax fetchCom,y
 lda  <outpath
 ldy  #12
 OS9  I$Write
 lbcs _error
 puls x,y

 ldb  buffsiz
 ldu  buffadd
fetch2
 lda  ,u+
 sta  ,x+
 decb
 bne  fetch2


 puls a,b,x,y,u,pc

 endsect