Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define ITEXTURE_BC1 %00000001
- #define ITEXTURE_RBG %00000010
- ; max ;
- #define ITEXTURE_MAX_SIZE 32385
- #define ITEXTURE_MAX_HEIGHT 127
- #define ITEXTURE_MAX_WIDTH 127
- #define push_in push hl \ push de \ push ix \ push iy
- #define pop_in pop iy \ pop ix \ pop de \ pop hl
- ITEXTUREDRAW:
- IRasterTexturedTriangle:
- ld a, (de)
- sub a, (hl)
- jr c, IRasterSwap0
- ex de, hl
- IRasterSwap0:
- ld a, (bc)
- sub a, (hl)
- jr nc, IRasterSwap1
- push hl
- or a, a
- sbc hl, hl
- add hl, bc
- pop bc
- IRasterSwap1:
- ld a, (de)
- sub a, (hl)
- jr nc, IRasterSwap2
- ex de, hl
- IRasterSwap2:
- ld a, (bc)
- sub (hl)
- ret z
- call ITextureSetup
- ld ix, $FF0000
- ld iy, $FF0000
- ld ixl, a
- neg
- ld (IDeltaY0), a
- ; x1-x0
- ld a, (de)
- ld (IValueY1), a
- sub (hl)
- push af
- ld iyl, a
- neg
- ld (IDeltaY1), a
- ld a, (hl)
- push af
- push bc
- inc hl
- ld bc, (hl)
- ex de, hl
- inc hl
- ld hl, (hl)
- ld (IValueX1), hl
- jr z, IRasterNoEdgeWrite
- ld a, $13
- or a, a
- sbc hl, bc
- jr nc, IRasterEdge1
- or a, $08
- ex de, hl
- sbc hl, hl
- sbc hl, de
- IRasterEdge1:
- ld (IDeltaX1), hl
- ld (ISMC_Code1), a
- lea de, iy+0
- add hl, de
- ex de, hl
- sbc hl, hl
- ccf
- sbc hl, de
- sra h
- rr l
- ex de, hl
- ld iyh, d
- ld iyl, e
- IRasterNoEdgeWrite:
- pop hl
- ; x2-x0
- inc hl
- ld hl, (hl)
- ld (IValueX2), hl
- ld a, $23 ; inc hl
- or a, a
- sbc hl, bc
- ; if x0>x1, edge goes to left
- jr nc, IRasterEdge0
- or a, $08 ; dec hl
- ; edge goes to left
- ex de, hl
- sbc hl, hl
- sbc hl, de
- IRasterEdge0:
- ld (IDeltaX0), hl
- ld (ISMC_Code0), a
- lea de, ix+0
- add hl, de
- ex de, hl
- sbc hl, hl
- ccf
- sbc hl, de
- sra h
- rr l
- ex de, hl
- ld ixh, d
- ld ixl, e
- pop hl
- ld l, 160
- mlt hl
- add hl, hl
- add hl, bc
- ld de, (IFramebuffer)
- add hl, de
- ex de, hl
- sbc hl, hl
- add hl, de
- pop af
- call nz, IRasterTriangleInner
- ld a, (IDeltaY0) ; y2-y0
- ld c, a
- ld a, (IDeltaY1)
- sub c
- ret z
- push af
- ld iyl, a
- neg
- ld (IDeltaY1), a
- push hl
- IValueX2=$+1
- ld hl, $000000
- IValueX1=$+1
- ld bc, $000000
- or a, a
- sbc hl, bc
- ld a, $13
- ; if x0>x1, edge goes to left
- jr nc, IRasterEdge2
- or a, $08
- ex de, hl
- sbc hl, hl
- sbc hl, de
- IRasterEdge2:
- ld (IDeltaX1), hl
- ld (ISMC_Code1), a
- lea de, iy+0
- ld d, $00 ;compensate due to previous looping
- add hl, de
- ex de, hl
- sbc hl, hl
- ccf
- sbc hl, de
- sra h
- rr l
- ex de, hl
- ld iyh, d
- ld iyl, e
- IValueY1=$+1
- ld l, $00
- ld h, 160
- mlt hl
- add hl, hl
- add hl, bc
- ld de, (IFramebuffer)
- add hl, de
- ex de, hl
- pop hl
- pop af
- IRasterTriangleInner:
- push af
- IDeltaX0=$+1
- ld bc, $000000
- add ix, bc
- jr nc, $+11
- IDeltaY0=$+1
- ld bc, $FFFF00
- ISMC_Code0=$
- nop
- add ix, bc
- jr c, $-3
- IDeltaX1=$+1
- ld bc, $000000
- add iy, bc
- jr nc, $+11
- IDeltaY1=$+1
- ld bc, $FFFF00
- ISMC_Code1=$
- nop
- add iy, bc
- jr c, $-3
- ; hl = adress1, de = adress2
- push_in
- sbc hl, de
- jp c, IRasterInverted
- ld b, h
- ld c, l
- add hl, de
- jp z, ITextureNext
- ; draw from left to right
- ld a, c
- dec bc
- inc b
- dec hl
- ; start at (hl), decrement
- ; ix texture adress
- ; de = int(dvx)*text_size+int(dux)
- ; bc = frac(dux)*65536+frac(dvx)
- ; iy fractionnal offset
- ; hl framebuffer adress
- ; a size
- ; ld ix, (ITextureAdress)
- ; push af
- ; ld a, (ITextureFrac)
- ; cpl
- ; ld (TMP), a
- ; ld a, (ITextureFrac+2)
- ; cpl
- ; ld (TMP+2), a
- ; ld iy, (TMP)
- ; pop af
- push hl
- ld de, (ITextureFrac)
- scf
- sbc hl, hl
- or a, a
- sbc hl, de
- ld h, 0
- ex de, hl
- ld iy, 0
- add iy, de
- ld ix, (ITextureAdress)
- pop hl
- ITextureICplInt0=$+1
- ld de, $000000
- ITextureLong0:
- push bc
- ITextureICplFrac0=$+1
- ld bc, 19*65536+28
- ;ITextureInner0:
- ; add ix, de
- ; add iy, bc
- ; jr nc, $+4
- ; .db $DD
- ;ITextureUXV0=$
- ; .db $2B
- ; ld b, iyh
- ; rr b
- ; jr nc, $+5
- ;ITextureVXV0=$+2
- ; lea ix, ix+16
- ; ld b, (ix)
- ; ld (hl), b
- ; ld b, 0
- ; ld iyh, b
- ; dec hl
- ; dec a
- ; jr nz, ITextureInner0
- ITextureInner0:
- add iy, bc
- ld b, (ix)
- ld (hl), b
- jr nc, $+4
- .db $DD
- ITextureUXV0=$
- .db $00
- add ix, de
- ld b, iyh
- rr b
- ld iyh, b
- jr nc, $+5
- ITextureVXV0=$+2
- lea ix, ix+0
- dec hl
- dec a
- jr nz, ITextureInner0
- pop bc
- djnz ITextureLong0
- ; this loop have inversed direction interpolators
- jp ITextureNext
- IRasterInverted:
- ; draw from right to left
- add hl, de
- ex de, hl
- or a, a
- sbc hl, de
- ld b, h
- ld c, l
- add hl, de
- ex de, hl
- ; start at (hl), inc
- ; reconvert bc size to dual loop size
- ld a, c
- dec bc
- inc b
- ; right to left texture filling
- ; ix texture adress
- ; de = int(dvx)*text_size+int(dux)
- ; bc = frac(dux)*65536+frac(dvx)
- ; iy fractionnal offset
- ; hl framebuffer adress
- ; a size
- ; ld ix, (ITextureAdress)
- ; push af
- ; ld a, (ITextureFrac)
- ; cpl
- ; ld (TMP), a
- ; ld a, (ITextureFrac+2)
- ; cpl
- ; ld (TMP+2), a
- ;; ld iy, (TMP)
- ; pop af
- push hl
- ld de, (ITextureFrac)
- scf
- sbc hl, hl
- or a, a
- sbc hl, de
- ld h, 0
- ex de, hl
- ld iy, 0
- add iy, de
- ld ix, (ITextureAdress)
- pop hl
- ITextureICplInt1=$+1
- ld de, $000000
- ITextureLong1:
- push bc
- ITextureICplFrac1=$+1
- ld bc, $000000
- ;ITextureInner1:
- ; add ix, de
- ; add iy, bc
- ; jr nc, $+4
- ; .db $DD
- ;ITextureUXV1=$
- ; nop
- ; ld b, iyh
- ; rr b
- ; jr nc, $+5
- ;ITextureVXV1=$+2
- ; lea ix, ix+0
- ; ld b, (ix)
- ; ld (hl), b
- ; ld b, 0
- ; ld iyh, b
- ; inc hl
- ; dec a
- ; jr nz, ITextureInner1
- ITextureInner1:
- add iy, bc
- ld b, (ix)
- ld (hl), b
- jr nc, $+4
- .db $DD
- ITextureUXV1=$
- .db $00
- add ix, de
- ld b, iyh
- rr b
- ld iyh, b
- jr nc, $+5
- ITextureVXV1=$+2
- lea ix, ix+0
- inc hl
- dec a
- jr nz, ITextureInner1
- pop bc
- djnz ITextureLong1
- ; ix texture adress
- ; de = int(dvy)*text_size+int(duy)
- ; bc = frac(duy)*65536+frac(dvy)
- ; hl fractionnal offset
- ITextureNext:
- ld hl, (ITextureFrac)
- ld ix, (ITextureAdress)
- ITextureOCplInt=$+1
- ld bc, $000000
- add ix, bc
- ITextureOCplFrac=$+1
- ld bc, $000000
- add hl, bc
- jr nc, $+4
- .db $DD
- ITextureUYV=$
- nop
- or a, a
- rr h
- jr nc, $+5
- ITextureVYV=$+2
- lea ix, ix+0
- ld (ITextureFrac), hl
- ld (ITextureAdress), ix
- pop_in
- ld bc, 320
- add hl, bc
- ex de, hl
- add hl, bc
- ex de, hl
- pop af
- dec a
- jp nz, IRasterTriangleInner
- ret
- ITextureSetup:
- ; duy=(u2-u0)/(y2-y0)
- ; dvy=(v2-v0)/(y2-y0)
- ; (At-Ct)*(By-Cy) - (Bt-Ct)*(Ay-Cy)
- ; dt/dx = ---------------------------------
- ; (Ax-Cx)*(By-Cy) - (Bx-Cx)*(Ay-Cy)
- ;
- ; du = ((u0-u2)*(y1-y2) - (u1-u2)*(y0-y2))/dx
- ; dv = ((v0-v2)*(y1-y2) - (v1-v2)*(y0-y2))/dx
- ; dx = (x0-x2)*(y1-y2) - (x1-x2)*(y0-y2)
- ; u:-640, r=20 : -5080, r=162
- ; v:960, r=-30 : 7620, r=-243
- ; x:-8000
- ;ITextureOCplInt:int(dvy)*text_size+int(duy)
- ;ITextureOCplFrac:bc = abs(frac(duy)*65536)+abs(frac(dvy))
- ;ITextureUYV:if duy is neg
- ;ITextureVYV:if dvy is neg
- push_in
- push bc
- push af
- ld ix, tmpWR
- ld (ix+0), hl
- ld (ix+3), de
- ld (ix+6), bc
- ; (u2-u0)/(y2-y0)
- ld a, (bc)
- sub (hl)
- push af
- ; a = delta y
- ld bc, 4
- add hl, bc
- ld c, a
- ld iy, (ix+6)
- ld a, (iy+4)
- sub (hl)
- ; a = delta u, c = delta y
- or a, a
- sbc hl, hl
- ex de, hl
- ; extend a to de
- ld de, $FFFFFF
- bit 7, a
- jr nz, $+3
- inc de
- ld e, a
- call DEDivBC
- ld bc, 5
- ld hl, (ix+0)
- add hl, bc
- pop af
- ld c, a
- ld iy, (ix+6)
- ld a, (iy+5)
- sub (hl)
- push de
- or a, a
- sbc hl, hl
- ex de, hl
- ; ld e, a
- ; extend e into de
- ld de, $FFFFFF
- bit 7, a
- jr nz, $+3
- inc de
- ld e, a
- call DEDivBC
- ex de, hl
- pop de
- ld a, h
- and %10000000
- rrca
- ld c, a
- ld a, d
- and %10000000
- or c
- ld c, a
- ; c :: 7 : u, 6:v
- bit 7, h
- jr z, INNegHL0
- push de
- or a, a
- ex de, hl
- sbc hl, hl
- sbc hl, de
- pop de
- INNegHL0:
- bit 7, d
- jr z, INNegDE0
- push hl
- or a, a
- sbc hl, hl
- sbc hl, de
- ex de, hl
- pop hl
- INNegDE0:
- ; ITextureFracPack:
- ; abs(frac(dux)*65536)+abs(frac(dvx))
- ld a, l
- ld (ITextureOCplFrac), a
- ld a, e
- ld (ITextureOCplFrac+2), a
- ; Variance:
- ld a, $23
- bit 7, c
- jr z, $+4
- or $08
- ld (ITextureUYV), a
- ITextureMlt1=$+1
- ld a, 0
- bit 6, c
- jr z, $+4
- neg
- ld (ITextureVYV), a
- ; now integer pack
- call ITextureIntegerPack
- ld (ITextureOCplInt), hl
- ; v0*size+u0+base=textureadress
- ld hl, (ix+0)
- ld bc, 4
- add hl, bc
- ld c, (hl)
- inc hl
- ld h, (hl)
- ITextureMlt2=$+1
- ld l, 0
- mlt hl
- add hl, bc
- ld de, (ITexture)
- add hl, de
- ld (ITextureAdress), hl
- ; du = ((u0-u2)*(y1-y2) - (u1-u2)*(y0-y2))/dx
- ; dv = ((v0-v2)*(y1-y2) - (v1-v2)*(y0-y2))/dx
- ; dx = (x0-x2)*(y1-y2) - (x1-x2)*(y0-y2)
- ; du = ((u2-u0)*(y2-y1)-(u2-u1)*(y2-y0))/dx ; -5080
- ; dv = ((v2-v0)*(y2-y1)-(v2-v1)*(y2-y0))/dx ; 20320
- ; dx = (x2-x0)*(y2-y1) - (x2-x1)*(y2-y0) ; -20000
- ; rv = -260
- ; ru= 65
- ld hl, (ix+0)
- ld de, (ix+3)
- ld bc, (ix+6)
- ld a, (bc)
- sub (hl)
- ld (ITmp20), a
- ex de, hl
- ld a, (bc)
- sub (hl)
- ld (ITmp21), a
- inc hl \ inc bc \ inc de
- ld bc, (hl) ; x1
- ld hl, (ix+6)
- inc hl
- ld hl, (hl)
- or a, a
- sbc hl, bc
- ; now do s16bits*8bits
- ld a, (ITmp20)
- call ITextureMlt16
- push hl
- ld hl, (ix+0)
- inc hl
- ld bc, (hl)
- ld hl, (ix+6)
- inc hl
- ld hl, (hl)
- or a, a
- sbc hl, bc ; (x2-x0)
- ld a, (ITmp21)
- call ITextureMlt16
- pop de
- or a, a
- sbc hl, de
- ; dx is computed
- ld (ITextureDX), hl
- ; du = ((u2-u0)*(y2-y1)-(u2-u1)*(y2-y0))/dx
- ld iy, (ix+3)
- ld c, (iy+4)
- ld iy, (ix+6)
- ld a, (iy+4)
- sub a, c ; (u2-u1)
- ld c, a
- ld a, (ITmp20)
- call ITextureMlt8
- push hl
- ld iy, (ix+0)
- ld c, (iy+4)
- ld iy, (ix+6)
- ld a, (iy+4)
- sub a, c
- ld c, a
- ld a, (ITmp21)
- call ITextureMlt8
- pop de
- or a, a
- sbc hl, de
- ex de, hl
- ld bc, (ITextureDX)
- call DEDivBC
- push de ; du
- ; dv = ((v2-v0)*(y2-y1)-(v2-v1)*(y2-y0))/dx
- ld iy, (ix+3)
- ld c, (iy+5)
- ld iy, (ix+6)
- ld a, (iy+5)
- sub a, c ; (u2-u1)
- ld c, a
- ld a, (ITmp20)
- call ITextureMlt8
- push hl
- ld iy, (ix+0)
- ld c, (iy+5)
- ld iy, (ix+6)
- ld a, (iy+5)
- sub a, c
- ld c, a
- ld a, (ITmp21)
- call ITextureMlt8
- pop de
- or a, a
- sbc hl, de
- ex de, hl
- ld bc, (ITextureDX)
- call DEDivBC
- ex de, hl
- pop de
- ; dux, dvx ratio
- ; ld hl, -260 ;v
- ; ld de, 65 ;u
- ; hl = dv
- ; de = du
- ld a, h
- and %10000000
- rrca
- ld c, a
- ld a, d
- and %10000000
- or c
- ld c, a
- ; c :: 7 : u, 6:v
- bit 7, h
- jr z, INNegHL
- push de
- or a, a
- ex de, hl
- sbc hl, hl
- sbc hl, de
- pop de
- INNegHL:
- bit 7, d
- jr z, INNegDE
- push hl
- or a, a
- sbc hl, hl
- sbc hl, de
- ex de, hl
- pop hl
- INNegDE:
- ; ITextureFracPack:
- ; abs(frac(dux)*65536)+abs(frac(dvx))
- ld a, l
- ld (ITextureICplFrac0), a
- ld (ITextureICplFrac1), a
- ld a, e
- ld (ITextureICplFrac0+2), a
- ld (ITextureICplFrac1+2), a
- ; Variance:
- ld a, $23
- bit 7, c
- jr z, $+4
- or $08
- ld (ITextureUXV1), a
- xor $08
- ld (ITextureUXV0), a
- ITextureMlt3=$+1
- ld a, 0
- bit 6, c
- jr z, $+4
- neg
- ld (ITextureVXV1), a
- neg
- ld (ITextureVXV0), a
- ; now integer pack
- call ITextureIntegerPack
- ld (ITextureICplInt1), hl
- or a, a
- ex de, hl
- sbc hl, hl
- sbc hl, de
- ld (ITextureICplInt0), hl
- ; warning the int should be negated in Int0. Error in compute
- ld hl, 0
- ld (ITextureFrac), hl
- pop af
- pop bc
- pop_in
- ret
- ITextureSwitchRes:
- ; hl is new resolution
- ; y, x
- ld (ITextureMlt0), a
- ld (ITextureMlt1), a
- ld (ITextureMlt2), a
- ld (ITextureMlt3), a
- ret
- ITexture:
- .dl 0
- ITextureAdress:
- .dl 0
- ITextureFrac:
- .dl 0
- tmpWR:
- .dl 0,0,0
- ITextureDX:
- .dl 0
- ITmp20:
- .dl 0
- ITmp21:
- .dl 0
- ; DEDivBC {
- ; Output in DE
- DEDivBC: ; Mostly copied from Xeda
- ld a,$B7
- call AbsDE
- jp m,+_
- xor a,%10000000
- _: call AbsBC
- jp m,+_
- xor a,%10000000
- _: ld (DivSMC),a
- or a,a \ sbc hl,hl
- ld l,d ; DEh
- ld a,e
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ cpl \ ld d,a
- ld a,e
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ adc hl,hl \ sbc hl,bc \ jr nc,$+3 \ add hl,bc
- rla \ cpl \ ld e,a
- DivSMC: or a,a
- ret nc
- or a,a \ sbc hl,hl
- sbc hl,de
- ex de,hl
- ret
- ; }
- ; AbsDE/AbsBC - Untested {
- ; Result in DE
- ; HL is returned zero
- ; S flag is set to opposite of input sign
- AbsDE:
- or a,a
- sbc hl,hl
- sbc hl,de
- ret m ; If ( 0 - DE ) is negative, then DE is positive (so return)
- ex de,hl
- ret
- AbsBC:
- or a,a
- sbc hl,hl
- sbc hl,bc
- ret m ; If ( 0 - BC ) is negative, then BC is positive (so return)
- push hl \ pop bc
- ret
- ITextureMlt8:
- ; do c times a, c is signed, a is unsigned
- ld h, c
- ld l, a
- mlt hl
- bit 7, c
- ret z
- ; substract A*256 from HL
- ld bc, 0
- ld b, a
- sbc hl, bc
- ret
- ITextureMlt16:
- ; do hl times a, hl is signed, a unsigned
- ex de, hl
- ld h, a
- ld l, d
- mlt hl
- bit 7, d
- ld d, a
- jr z, $+5
- ld a, h
- sub d
- ld h, a
- slhl
- mlt de
- add hl, de
- ret
- ITextureIntegerPack:
- ITextureMlt0=$+1
- ld l, 0
- mlt hl
- ld e, d
- ld d, 0
- bit 6, c ; dv
- jr z, ITextureIntegerCorrect
- push de
- or a, a
- ex de, hl
- sbc hl, hl
- sbc hl, de
- pop de
- ITextureIntegerCorrect:
- bit 7, c
- jr z, ITextureAddUV
- or a, a
- sbc hl, de
- ret
- ITextureAddUV:
- add hl, de
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement