view level1/cmds/grfo.asm @ 1652:558cab468052

RG fixed a bug in the Vavasour emulator clock2 module. clock2 is now of type Sbrtn instead of Systm. clock.asm has been modified to link to this type.
author boisy
date Sat, 17 Jul 2004 12:20:31 +0000
parents 5f18094d961d
children
line wrap: on
line source

********************************************************************
* GRFO - Graphics module
*
* $Id$
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   1      ????/??/??
* From Tandy OS-9 Level One VR 02.00.00.

         nam   GRFO
         ttl   Graphics module

* Disassembled 02/04/05 23:44:21 by Disasm v1.6 (C) 1988 by RML

         ifp1
         use   defsfile
         use   cciodefs
         endc

tylg     set   Systm+Objct   
atrv     set   ReEnt+rev
rev      set   $00
edition  set   1

         mod   eom,name,tylg,atrv,start,size

         org   0
size     equ   .

         fcb   $07 
name     fcs   /GRFO/
         fcb   edition

* Dispatch table
start    lbra  Init
         lbra  Write
         lbra  GetStat
         lbra  SetStat
         lbra  Term

* 128x192 4 color pixel table
Mode1Clr fdb   $0055,$aaff

GetStat
SetStat  comb
         ldb   #E$UnkSvc
         rts

Write    suba  #$15
         leax  <Table,pcr
         lsla
         ldd   a,x
         jmp   d,x

Table    fdb   Do15-Table
         fdb   Do16-Table
         fdb   Do17-Table
         fdb   Do18-Table
         fdb   Do19-Table
         fdb   Do1A-Table
         fdb   NoOp-Table
         fdb   Do1C-Table
         fdb   Do1D-Table
         fdb   NoOp-Table
         fdb   NoOp-Table

* Fix X/Y coords:
* - if Y > 191 then cap it at 191
* - adjust X coord if in 128x192 mode
FixXY    ldd   <V.NChar,u	get next 2 charas
         cmpb  #192		Y greater than max?
         bcs   L0053		branch if lower than
         ldb   #191
L0053    tst   <V.Mode,u	which mode?
         bmi   L0059		branch if 256x192
         lsra  			else divide X by 2
L0059    std   <V.NChar,u	and save
         rts   

* $15 - set graphics cursor
Do15     leax  <SetGC,pcr	load X with return address
GChar2   ldb   #$02		need two parameters
         lbra  GChar

SetGC    bsr   FixXY		fix coords
         std   <V.GCrsX,u	and save new gfx cursor pos

NoOp
Init
Term     clrb  
         rts   

* $19 - erase point
Do19     clr   <V.Msk1,u
* $18 - set point
Do18     leax  <DrawPnt,pcr
         bra   GChar2

DrawPnt  bsr   FixXY		fix coords
         std   <V.GCrsX,u	save as new gfx cursor pos
         bsr   DrwPt2
         lbra  L014A
DrwPt2   jsr   [<V.CnvVct,u]
L0081    tfr   a,b
         comb  
         andb  ,x
         stb   ,x
         anda  <V.Msk1,u	and with mask
         ora   ,x
         sta   ,x
         rts   

* $17 - erase line
Do17     clr   <V.Msk1,u	clear mask value

* $16 - draw line
Do16     leax  <DrawLine,pcr	load X with return address
         bra   GChar2		need two params

DrawLine bsr   FixXY		fix up coords
         leas  -$0E,s		make room on stack
         std   $0C,s		save X/Y
         jsr   [<V.CnvVct,u]	get address given X/Y
         stx   $02,s		save on stack
         sta   $01,s		and pixel too
         ldd   <V.GCrsX,u	get current graphics cursor
         jsr   [<V.CnvVct,u]	get address given X/Y
         sta   ,s
         clra  
         clrb  
         std   $04,s
         lda   #$BF
         suba  <V.GCrsY,u
         sta   <V.GCrsY,u
         lda   #$BF
         suba  <V.NChr2,u
         sta   <V.NChr2,u
         lda   #$FF
         sta   $06,s
         clra  
         ldb   <V.GCrsX,u
         subb  <V.NChar,u
         sbca  #$00
         bpl   L00D6
         nega  
         negb  
         sbca  #$00
         neg   $06,s
L00D6    std   $08,s
         bne   L00DF
         ldd   #$FFFF
         std   $04,s
L00DF    lda   #$E0
         sta   $07,s
         clra  
         ldb   <V.GCrsY,u
         subb  <V.NChr2,u
         sbca  #$00
         bpl   L00F4
         nega  
         negb  
         sbca  #$00
         neg   $07,s
L00F4    std   $0A,s
         bra   L0100
L00F8    sta   ,s
         ldd   $04,s
         subd  $0A,s
         std   $04,s
L0100    lda   ,s
         lbsr  L0081
         cmpx  $02,s
         bne   L010F
         lda   ,s
         cmpa  $01,s
         beq   L0143
L010F    ldd   $04,s
         bpl   L011D
         addd  $08,s
         std   $04,s
         lda   $07,s
         leax  a,x
         bra   L0100
L011D    lda   ,s
         ldb   $06,s
         bpl   L0133
         lsla  
         ldb   <V.Mode,u	which mode?
         bmi   L012A		branch if 256x192
         lsla  
L012A    bcc   L00F8
         lda   <V.4A,u
         leax  -$01,x
         bra   L00F8
L0133    lsra  
         ldb   <V.Mode,u	which mode?
         bmi   L013A		branch if 256x196
         lsra  
L013A    bcc   L00F8
         lda   <V.MCol,u
         leax  $01,x
         bra   L00F8
L0143    ldd   $0C,s
         std   <V.GCrsX,u
         leas  $0E,s
L014A    lda   <V.Msk2,u
         sta   <V.Msk1,u
         clrb  
         rts   

* $1C - erase circle
Do1C     clr   <V.Msk1,u	clear mask value
* $1A - draw circle
Do1A     leax  <Circle,pcr
         ldb   #$01		require another param -- radius
GChar    stb   <V.NGChr,u	one more char
         stx   <V.RTAdd,u	return address
         clrb  
         rts   

Circle   leas  -$04,s		make room on stack
         ldb   <V.NChr2,u	get radius
         stb   $01,s		store on stack
         clra  
         sta   ,s
         addb  $01,s
         adca  #$00
         nega  
         negb  
         sbca  #$00
         addd  #$0003
         std   $02,s
L0179    lda   ,s
         cmpa  $01,s
         bcc   L01AB
         ldb   $01,s
         bsr   L01B9
         clra  
         ldb   $02,s
         bpl   L0193
         ldb   ,s
         lslb  
         rola  
         lslb  
         rola  
         addd  #$0006
         bra   L01A3
L0193    dec   $01,s
         clra  
         ldb   ,s
         subb  $01,s
         sbca  #$00
         lslb  
         rola  
         lslb  
         rola  
         addd  #$000A
L01A3    addd  $02,s
         std   $02,s
         inc   ,s
         bra   L0179
L01AB    lda   ,s
         cmpa  $01,s
         bne   L01B5
         ldb   $01,s
         bsr   L01B9
L01B5    leas  $04,s
         bra   L014A
L01B9    leas  -$08,s
         sta   ,s
         clra  
         std   $02,s
         nega  
         negb  
         sbca  #$00
         std   $06,s
         ldb   ,s
         clra  
         std   ,s
         nega  
         negb  
         sbca  #$00
         std   $04,s
         ldx   $06,s
         bsr   L0202
         ldd   $04,s
         ldx   $02,s
         bsr   L0202
         ldd   ,s
         ldx   $02,s
         bsr   L0202
         ldd   ,s
         ldx   $06,s
         bsr   L0202
         ldd   $02,s
         ldx   ,s
         bsr   L0202
         ldd   $02,s
         ldx   $04,s
         bsr   L0202
         ldd   $06,s
         ldx   $04,s
         bsr   L0202
         ldd   $06,s
         ldx   ,s
         bsr   L0202
         leas  $08,s
         rts   
L0202    pshs  b,a
         ldb   <V.GCrsY,u
         clra  
         leax  d,x
         cmpx  #$0000
         bmi   L0214
         cmpx  #$00BF
         ble   L0216
L0214    puls  pc,b,a
L0216    ldb   <V.GCrsX,u
         clra  
         tst   <V.Mode,u
         bmi   L0221
         lslb  
         rola  
L0221    addd  ,s++
         tsta  
         beq   L0227
         rts   
L0227    pshs  b
         tfr   x,d
         puls  a
         tst   <V.Mode,u	which mode?
         lbmi  DrwPt2		branch if 256x192
         lsra  			else divide A by 2
         lbra  DrwPt2

* $1D - flood fill
Do1D     clr   <V.FFFlag,u
         leas  -$07,s
         lbsr  L03AB
         lbcs  L0346
         lda   #$FF
         sta   <V.4F,u
         ldd   <V.GCrsX,u
         lbsr  L0351
         lda   <V.4C,u
         sta   <V.4D,u
         tst   <V.Mode,u	which mode?
         bpl   L0261		branch if 128x192
         tsta  
         beq   L0267
         lda   #$FF
         bra   L0267
L0261    leax  >Mode1Clr,pcr
         lda   a,x
L0267    sta   <V.4E,u
         cmpa  <V.Msk1,u
         lbeq  L0346
         ldd   <V.GCrsX,u
L0274    suba  #$01
         bcs   L027F
         lbsr  L0351
         bcs   L027F
         beq   L0274
L027F    inca  
         std   $01,s
L0282    lbsr  L0384
         adda  #$01
         bcs   L0290
         lbsr  L0351
         bcs   L0290
         beq   L0282
L0290    deca  
         ldx   $01,s
         lbsr  L03D3
         neg   <V.4F,u
         lbsr  L03D3
L029C    lbsr  L03F9
         lbcs  L0346
         tst   <V.4F,u
         bpl   L02B3
         subb  #$01
         bcs   L029C
         std   $03,s
         tfr   x,d
         decb  
         bra   L02BD
L02B3    incb  
         cmpb  #$BF
         bhi   L029C
         std   $03,s
         tfr   x,d
         incb  
L02BD    std   $01,s
         lbsr  L0351
         bcs   L029C
L02C4    bne   L02D2
         suba  #$01
         bcc   L02CD
         inca  
         bra   L02D6
L02CD    lbsr  L0351
         bcc   L02C4
L02D2    adda  #$01
         bcs   L029C
L02D6    cmpd  $03,s
         bhi   L029C
         bsr   L0351
         bcs   L029C
         bne   L02D2
         std   $05,s
         cmpd  $01,s
         bcc   L02FB
         ldd   $01,s
         decb  
         cmpd  $05,s
         beq   L02FB
         neg   <V.4F,u
         ldx   $05,s
         lbsr  L03D3
         neg   <V.4F,u
L02FB    ldd   $05,s
L02FD    std   $01,s
L02FF    bsr   L0351
         bcs   L030B
         bne   L030B
         bsr   L0384
         adda  #$01
         bcc   L02FF
L030B    deca  
         ldx   $01,s
         lbsr  L03D3
         std   $05,s
         adda  #$01
         bcs   L0326
L0317    cmpd  $03,s
         bcc   L0326
         adda  #$01
         bsr   L0351
         bcs   L0326
         bne   L0317
         bra   L02FD
L0326    inc   $03,s
         inc   $03,s
         ldd   $03,s
         cmpa  #$02
         lbcs  L029C
         ldd   $05,s
         cmpd  $03,s
         lbcs  L029C
         neg   <V.4F,u
         ldx   $03,s
         lbsr  L03D3
         lbra  L029C
L0346    leas  $07,s
         clrb  
         ldb   <V.FFFlag,u
         beq   L0350
L034E    orcc  #Carry
L0350    rts   
L0351    pshs  b,a
         cmpb  #$BF
         bhi   L0380
         tst   <V.Mode,u	which mode?
         bmi   L0360		branch if 256x192
         cmpa  #$7F
         bhi   L0380
L0360    jsr   [<V.CnvVct,u]
         tfr   a,b
         andb  ,x
L0367    bita  #$01
         bne   L0376
         lsra  
         lsrb  
         tst   <V.Mode,u	which mode?
         bmi   L0367		branch if 256x192
         lsra  
         lsrb  
         bra   L0367
L0376    stb   <V.4C,u
         cmpb  <V.4D,u
         andcc #^Carry
         puls  pc,b,a
L0380    orcc  #Carry
         puls  pc,b,a
L0384    pshs  b,a
         jsr   [<V.CnvVct,u]
         bita  #$80
         beq   L03A6
         ldb   <V.4E,u
         cmpb  ,x
         bne   L03A6
         ldb   <V.Msk1,u
         stb   ,x
         puls  b,a
         tst   <V.Mode,u	which mode?
         bmi   L03A3		branch if 256x192
         adda  #$03
         rts   
L03A3    adda  #$07
         rts   
L03A6    lbsr  L0081
         puls  pc,b,a
L03AB    ldx   <V.FFSTp,u	get top of flood fill stack
         beq   L03B5		if zero, we need to allocate stack
         stx   <V.FFSPt,u	else reset flood fill stack ptr
L03B3    clrb  
         rts   

* Allocate Flood Fill Stack
L03B5    pshs  u		save U for now
         ldd   #$0200		get 512 bytes
         os9   F$SRqMem 	from system
         bcc   AllocOk		branch if ok
         puls  pc,u		else pull out with error
AllocOk  tfr   u,d		move pointer to alloced mem to D
         puls  u		get stat pointer we saved earlier
         std   <V.FFMem,u	save pointer to alloc'ed mem
         addd  #512		point D to end of alloc'ed mem
         std   <V.FFSTp,u	and save here as top of fill stack
         std   <V.FFSPt,u	and here
         bra   L03B3		do a clean return

L03D3    pshs  b,a
         ldd   <V.FFSPt,u
         subd  #$0004
         cmpd  <V.FFMem,u
         bcs   L03F2
         std   <V.FFSPt,u
         tfr   d,y
         lda   <V.4F,u
         sta   ,y
         stx   $01,y
         puls  b,a
         sta   $03,y
         rts   
L03F2    ldb   #$F5
         stb   <V.FFFlag,u
         puls  pc,b,a
L03F9    ldd   <V.FFSPt,u
         cmpd  <V.FFSTp,u		top of flood fill stack?
         lbcc  L034E
         tfr   d,y
         addd  #$0004
         std   <V.FFSPt,u
         lda   ,y
         sta   <V.4F,u
         ldd   $01,y
         tfr   d,x
         lda   $03,y
         andcc #^Carry
         rts   

         emod
eom      equ   *
         end