home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
8bitfiles.net/archives
/
archives.tar
/
archives
/
genie-commodore-file-library
/
GEOSApps
/
VDC-BG.SFX
/
vdc-bg.cvt
(
.txt
)
< prev
Wrap
GEOS ConVerT
|
1990-02-12
|
8KB
|
306 lines
VDC-BG
PRG formatted GEOS file V1.0
Star NX-10
OP V2.0 or higher
Text Scrap
BLASTER'S CONVERTER V2.5
testBGasm.rel
VDC-BG.rel
Write Image V2.1
geoWrite V2.1
; ****************************************************************************
; VDC-BG : routines for a BG screen within VDC RAM on 64K VDC RAM C128's
; Robert A. Knop Jr., Usenet Hacking Mag Issue #3
; ****************************************************************************
.if Pass1
.noeqin
@.include geosSym
.include 128sym
.include geosMac
.eqin
.endif
FGVDCBASE = $0000 ;Address in VDC of foreground screen
BGVDCBASE = $4000 ;Address in VDC of background screen
; ***************************************************************************
; InitVDC -- Makes sure your VDC is set up for 64K. Have fun calling this one on a 16K VDC.
; If you are motivated, modify this to verify that there is in fact have 64K of VDC
; RAM, and return an error if there is only 16K.
; Note -- Call this BEFORE you do any drawing on the screen, otherwise you will become
; hopelessly confused. At any rate, I probably will, and I won't even be there.
; ***************************************************************************
@InitVDC:
jsr TempHideMouse
ldx #28 ;Memory type register
jsr ReadVDC
ora #%00010000 ;Tell it we've got 64K
jsr WriteVDC
@rts
's zero, then we're done
AddW r6,r5
; *****************************************************************************
; VDCImpRect -- Imprint a rectangle from FG to BG
; VDCRecRect -- Recover a rectangle from BG to FG
; Pass: r3 x coordinate of upper left endpoint (word)
; r2L y coordinate of upper left endpoint (byte
; r4 x coordinate of lower right endpoint (word)
; r2H y coordinate of lower right endpoint (byte)
; Returns: r3 and r4 processed through NormalizeX
; Nukes: a,x,y , r5-r8,r10L,r11
; Internal: r5-r8,r11 ;Used in the VDC line routines
; r10L ;Flag for which routine we're in
; *****************************************************************************
@VDCImpRect:
LoadB r10L,#$80
bne contVDCrect
@VDCRecRect:
LoadB r10L,#00
contVDCrect: PushB r2L
5$ sta r11L
bit r10L
bmi 10$
jsr VDCRecLine
bra 20$
10$ jsr VDCImpLine
20$ inc r2L
lda r2L
cmp r2H
bcc 5$
beq 5$
PopB r2L
@rts
any rate, I probably will, and I won't even be there.
; *******************
; *****************************************************************************
; VDCImpLine -- Imprint a horizontal line from FG to BG
; VDCRecLine -- Recover a horizontal line from BG to FG
; Pass: r3 x coordinate of leftmost endpoint (word)
; r4 x coordinate of rightmost endpoint (word)
; r11L y coordinate of line (byte)
; Returns: r3 and r4 processed through NormalizeX
; Nukes: a,x,y , r5-r8,r11
; Internal: r5 ;Starting byte of block to copy
; r6 ;Number of bytes to copy
; r7 ;Starting byte of destination block
; r8L ;Left X mask
; r8H ;Right X mask
; r11 ;Y byte offset; temp storage
; *****************************************************************************
@VDCImpLine:
jsr GetDims ;Get the dimensions of these scary things
AddVW FGVDCBASE,r5
AddVW BGVDCBASE,r7
bra contVDCline
@VDCRecLine:
jsr GetDims
AddVW BGVDCBASE,r5
AddVW FGVDCBASE,r7
contVDCline: jsr SetVDC ;Setup block copying
jsr DoVDC ;Do the copy of complete blocks
ldx #r5
jsr Ddec ;Point to the "partial" byte
ldx #r7
jsr Ddec
ldy r8L ;Check left mask
beq 5$ ;If it's zero, don't worry about leftmost byte
jsr Do1Byte ;Do the one byte
5$ ldy r8H ;Check right mask
beq 90$ ;If
's zero, then we're done
AddW r6,r5
inc r5L
bcc 10$
inc r5H ;Point to rightmost byte (source)
10$ AddW r6,r7
inc r7L
bcc 20$
inc r7H ;Point to rightmost byte (dest)
20$ jsr Do1Byte
90$ jsr RestVDC ;Restore VDC
@rts
GetDims:
@;Get dimensions for VDCImpLine,VDCRecLine
ldx #r3
jsr NormalizeX ;(Why someone would use BitMap
ldx #r4 ; doubling in an 80-column only application
jsr NormalizeX ; is somewhat beyond me....)
LoadB r8L,0
sta r8H
sta r11H
LoadW r5,80
ldx #r11
ldy #r5
jsr DMult ;r11 *= 80
MoveW r3,r5
ldx #$02 ;Divide by 8
10$ lsr r5H
ror r5L
ror r8L
dex
bpl 10$ ; ... so r5 has byte offset from start of line
ldx #$04
20$ lsr r8L
bpl 20$
ldx r8L ;r8L has remainder of division
beq 40$
LoadB r8L,0
30$ sec
ror r8L
bne 30$
lda #$ff
eor r8L
sta r8L ;Now r8L has the mask of the leftmost byte
inc r5L
;...continued on next page....
adB r10L,#$80
bne contVDCrect
@VDCRecRect:
LoadB
;...GetDims continued....
40$ MoveW r4,r6
inc r6L ;Point to one past last byte
bcc 45$
inc r6H
45$ ldx #$02 ;Divide by 8
50$ lsr r6H
ror r6L
ror r8H
dex
bpl 50$ ; ... so r6 has byte offset from start of line
SubB r5L,r6L ;Now r6 has byte count
ldx #$04
60$ lsr r8H
bpl 60$
ldx r8H ;r8H has remainder of divisoin
beq 80$
LoadB r8H,0
70$ sec
ror r8H
bne 70$ ;r8H has mask of rightmost byte
80$ AddB r11L,r5L
sta r7L
lda r11H
adc r5H
sta r5H
sta r7H ;r5, r7 have offset from screen top
@rts
30$ sec
ror r8L
bne 30$
lda #$ff
eor r8L
sta r8L ;Now r8L has the mask of the leftmost byte
inc r5L
;...continued on next page....
adB r10L,#$80
bne contVDCrect
@VDCRecRect:
LoadB
@SetVDC:
jsr TempHideMouse
@;Set up VDC for block copying
ldx #24 ;Copy/fill register
jsr ReadVDC
sta VDCtemp
ora #%10000000 ;Set for block copy
sta $d601
@rts
@RestVDC:
lda VDCtemp
@;Restore original copy/fill status
ldx #24
jsr WriteVDC
@rts
VDCtemp:
.byte 0
@DoVDC:
ldx #18
@;Copy the bulk of the scanline
lda r7H ;Block copy destination
jsr WriteVDC
ldx #19
lda r7L
jsr WriteVDC
ldx #32 ;Block copy source
lda r5H
jsr WriteVDC
ldx #33
lda r5L
jsr WriteVDC
ldx #30 ;# bytes to copy
lda r6L
jsr WriteVDC ;BANGO!
@ rts
@WriteVDC:
stx $d600
@;Writes a to VDC register x
10$ bit $d600
bpl 10$
sta $d601
@rts
ReadVDC:
stx $d600
@;Reads a from VDC register x
10$ bit $d600
bpl 10$
lda $d601
@rts
@Do1Byte:
sty r11H ;r11H holds the mask
ldx #18 ;Point to the source screen byte
lda r5H
jsr WriteVDC
ldx #19
lda r5L
jsr WriteVDC
ldx #31
jsr Rea
@Do1Byte:
sty r11H ;r11H holds the mask
ldx #18 ;Point to the source screen byte
lda r5H
jsr WriteVDC
ldx #19
lda r5L
jsr WriteVDC
ldx #31
jsr ReadVDC ;Get the value of this byte
and r11H ;Mask off bits that we don't modify
sta r11L ;save the result
lda r11H
eor #$ff ;flip the bits in the mask
sta r11H
ldx #18 ;Point to the dest screen byte
lda r7H
jsr WriteVDC
ldx #19
lda r7L
jsr WriteVDC
ldx #31
jsr ReadVDC ;Get the value of this byte
and r11H ;Mask out the bits to change
ora r11L ;...and load those bits in
ldx #18 ;Point to the dest screen byte
lda r7H ; (reset the poitner because of the VDC's
jsr WriteVDC ; auto-increment)
ldx #19
lda r7L
jsr WriteVDC
ldx #31
jsr WriteVDC
@rts
;Reads a from VDC register x
10$ bit $d600
bpl 10$
lda $d601
@rts
@Do1Byte:
sty r11H ;r11H holds the mask
ldx #18 ;Point to the source screen byte
lda r5H
jsr WriteVDC
ldx #19
lda r5L
jsr WriteVDC
ldx #31
jsr Rea