Mercurial > hg > Members > kono > nitros9-code
diff level1/cmds/grfdrv.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 | b41df77588b0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/grfdrv.asm Sat Nov 26 21:31:29 2005 +0000 @@ -0,0 +1,558 @@ +******************************************************************** +* GrfDrv - Graphics module +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 ????/??/?? +* From Tandy OS-9 Level One VR 02.00.00. + + nam GrfDrv + ttl Graphics module + +* Disassembled 02/04/05 23:44:21 by Disasm v1.6 (C) 1988 by RML + + ifp1 + use defsfile + use vtiodefs + 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 /GrfDrv/ + 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 +