OK, just like i promised here is the source. Please note that it is fairly messy and there is a LOT of room for improvment. This *was* only a stuff-around project that was never ment to evolve into anything you know
Code: Select all
;-----------------------------------
; xLIB - v0.3 tr1p1ea
;-----------------------------------
.nolist
#define end .end
#define END .end
#define equ .equ
#define EQU .equ
#include "ti83plus.inc"
#define ProgStart $9D95
.list
.org ProgStart - 2
.db t2ByteTok, tAsmCmp
start_of_program:
bcall(_RclAns) ; recall Ans
ld hl,1 ; 1st element in Real List
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; returns a as LSByte
or a
jp z,APD ; 0 = Enable/Disale APD
cp 1
jp z,ClearScreen ; 1 = Clear the Screen
cp 2
jp z,SetupSprites ; 2 = Setup Sprite Data
cp 3
jp z,DrawSprite ; 3 = Draw a Sprite
cp 4
jp z,DrawMap ; 4 = Draw a TileMap
cp 5
jp z,UpdateLCD ; 5 = Update the LCD
jp Quit ; return to tios if anything else
;-----------------------------------
; APD - Enable/Disable APD
;-----------------------------------
; syntax - {0,APD_Var:Asm(prgmXLIB ; 0 = Disable, 1 = Enable
;
APD:
bcall(_RclAns) ; recall Ans
ld hl,2 ; 2nd element in Real List (APD Q)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
or a
jp nz,EnableAPD
DisableAPD:
bcall(_DisableAPD)
jp Quit
EnableAPD:
bcall(_EnableAPD)
jp Quit
;-----------------------------------
; ClearScreen - Clears the Screen
;-----------------------------------
; syntax - {1:Asm(prgmXLIB
;
ClearScreen:
bcall(_grBufClr)
bcall(_clrLCDFull)
jp Quit ; return to tios
;-----------------------------------
; SetupSprites - Setup Sprite Data
;-----------------------------------
; syntax - {2,GFXPage:Asm(prgmXLIB
;
SetupSprites:
bcall(_RclAns) ; recall Ans
ld hl,2 ; 2nd element in Real List (Xpos)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (GFX_Page_var),a ; store GFX Page var
ld hl,SpriteBuffer1
ld de,SpriteBuffer1
ld (hl),0
ld bc,768
ldir ; clear temp sprite area
ld hl,SpriteBuffer2
ld de,SpriteBuffer2
ld (hl),0
ld bc,768
ldir ; clear temp sprite area
ld hl,PicName ; pict name
bcall(_Mov9toOP1) ; pict name to op1
bcall(_FindSym) ; look it up - returns de as pointer to data (must be in ram)
ret c ; return if not found
ld a,b
or a
ret nz ; return if archived
load_data:
inc de
inc de ; skip length bytes
ex de,hl
push hl
call GetSpriteBuffer
push hl
pop ix
pop hl
ld bc,0
SetupLoop:
push hl
push bc
ld de,12
ld b,8
Copy_l:
ld a,(hl)
ld (ix),a
add hl,de
inc ix
djnz Copy_l
pop bc
pop hl
inc hl
inc c
ld a,c
cp 12
jp nz,SetupLoop
dec hl
ld de,(12*8)-11
add hl,de
ld c,0
ld a,8
add a,b
ld b,a
cp 64
jp nz,SetupLoop
jp Quit ; return to tios
;-----------------------------------
; DrawSprite - Draws a Sprite
;-----------------------------------
; syntax - {3,X,Y,SpriteNumber,GFX_Page,Clipped/Aligned,UpdateLCD:Asm(prgmXLIB
;
DrawSprite:
xor a
ld (SprRoutine_Flag),a
inc a
ld (Spr_Type),a
bcall(_RclAns) ; recall Ans
ld hl,2 ; 2nd element in Real List (Xpos)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
push af ; save x
bcall(_RclAns) ; recall Ans
ld hl,3 ; 3rd element in Real List (Ypos)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
push af ; save y
bcall(_RclAns) ; recall Ans
ld hl,4 ; 4th element in Real List (SprNum)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
push af
bcall(_RclAns) ; recall Ans
ld hl,5 ; 5th element in Real List (SprNum)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (GFX_Page_var),a
bcall(_RclAns) ; recall Ans
ld hl,6 ; 6th element in Real List (Sprite Routine)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (SprRoutine_Flag),a
bcall(_RclAns) ; recall Ans
ld hl,7 ; 6th element in Real List (UpdateLCD Q)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (UpdateLCD_Q),a
pop af
ld l,a ; sprite number
ld h,0 ; clear upper byte
add hl,hl ; x 2
add hl,hl ; x 4
add hl,hl ; x 8
push hl ; de = sprite data
call GetSpriteBuffer
push hl
pop de
pop hl
add hl,de ; hl points to correst sprite
ld de,TempSprite+1 ; temporary sprite
ld bc,8 ; number of bytes to copy
ldir ; copy
pop af ; restore y-coord
ld c,a ; sprite y-coord
pop af ; restore x-coord
ld b,a ; sprite x-coord
ld hl,TempSprite+1 ; sprite data
ld a,(SprRoutine_Flag)
or a
jr z,ClippedSprite
call PutAlignedSprite
jr SprSelEnd
ClippedSprite:
call PutSprite ; draw sprite to gBuf
SprSelEnd:
ld a,(UpdateLCD_Q)
or a
call nz,FastCopy ; copy to lcd
jp Quit ; return to tios
;-----------------------------------
; DrawMap - Draws a TileMap
;-----------------------------------
; syntax - {4,X_Offsett,Y_Offsett,MapWidth,MapHeight,ScreenStartX,ScreenEndX,ScreenStartY,ScreenEndY,GFX_Page,Tile_Type,UpdateLCD:Asm(prgmXLIB
;
DrawMap
bcall(_RclAns) ; recall Ans
ld hl,2 ; 2nd element in Real List (Xpos)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (MapX_O),a ; map x offsett
bcall(_RclAns) ; recall Ans
ld hl,3 ; 3rd element in Real List (Ypos)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (MapY_O),a ; map y offsett
bcall(_RclAns) ; recall Ans
ld hl,4 ; 4th element in Real List (MapWidth)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (MapWidth),a ; map width
bcall(_RclAns) ; recall Ans
ld hl,5 ; 5th element in Real List (MapHeight)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (MapHeight),a ; map width
bcall(_RclAns) ; recall Ans
ld hl,6 ; 5th element in Real List (ScreenStartX)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (ScreenStartX),a
bcall(_RclAns) ; recall Ans
ld hl,7 ; 5th element in Real List (ScreenEndX)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
dec a
ld (ScreenEndX),a
bcall(_RclAns) ; recall Ans
ld hl,8 ; 5th element in Real List (ScreenStartY)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (ScreenStartY),a
bcall(_RclAns) ; recall Ans
ld hl,9 ; 5th element in Real List (ScreenEndY)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
dec a
ld (ScreenEndY),a
bcall(_RclAns) ; recall Ans
ld hl,10 ; 5th element in Real List (GFX Page)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (GFX_Page_var),a
bcall(_RclAns) ; recall Ans
ld hl,11 ; 5th element in Real List (Sprite Type)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (Spr_Type),a
bcall(_RclAns) ; recall Ans
ld hl,12 ; 5th element in Real List (UpdateLCD Q)
bcall(_GetLtoOp1) ; get element
bcall(_ConvOp1) ; convert to de
ld (UpdateLCD_Q),a
ld hl,MatAName ; matrice name
bcall(_Mov9toOP1) ; matrice name to op1
bcall(_FindSym) ; look it up - returns de as pointer to data (must be in ram)
ret c ; return if not found
ld a,b
or a
ret nz ; return if archived
call TileMap
ld a,(UpdateLCD_Q)
or a
call nz,FastCopy ; copy to lcd
jp Quit ; return to tios
;-----------------------------------
; Routines
;-----------------------------------
;
;-----------------------------------
; TileMap
;-----------------------------------
TileMap:
;ld a,(MapX_O)
;add a,12
;ld c,a
;ld a,(MapWidth)
;or a
;sub c
;ret c
;ld a,(MapY_O)
;add a,8
;ld b,a
;ld a,(MapHeight)
;or a
;sub b
;ret c
ld a,(MapX_O)
inc a
ld c,a
ld a,(MapY_O)
inc a
ld b,a ; bc = row, col
DrawMapLoop:
push de ; save matrice data pointer
push bc ; save current element
bcall(_getMToOP1) ; get element bc
bcall(_ConvOP1) ; cenvert to de
pop bc ; restore current element
ld l,e
ld h,0 ; hl = current tile number
add hl,hl
add hl,hl
add hl,hl ; hl = tile * 8
push hl ; de = sprite data
call GetSpriteBuffer
push hl
pop de
pop hl
add hl,de ; offsett with tiledata
push bc ; save current element
ld a,(MapY_O)
inc a
ld e,a
ld a,b
sub e
add a,a
add a,a
add a,a
ld e,a
ld a,(MapX_O)
inc a
ld d,a
ld a,c
sub d
add a,a
add a,a
add a,a ; b = (x - 1) * 8
ld b,a
ld c,e ; c = (y - 1) * 8
ld a,(ScreenStartX)
add a,a
add a,a
add a,a
add a,b
ld b,a
ld a,(ScreenStartY)
add a,a
add a,a
add a,a
add a,c
ld c,a
call PutAlignedSprite
pop bc ; restore current element
pop de ; restore matrice data pointer
inc c ; increase to next element
ld a,(MapX_O)
inc a
push af
ld a,(ScreenEndX)
ld h,a
ld a,(ScreenStartX)
ld l,a
ld a,11
sub h
add a,l
ld l,a
ld a,12
sub l
inc a
ld l,a
pop af
add a,l
sub c
or a ; test for end of row
jp nz,DrawMapLoop ; continue until row is drawn
ld a,(MapX_O)
inc a
ld c,a
inc b ; reset to start of next row
ld a,(MapY_O)
inc a
push af
ld a,(ScreenEndY)
ld h,a
ld a,(ScreenStartY)
ld l,a
ld a,7
sub h
add a,l
ld l,a
ld a,8
sub l
inc a
ld l,a
pop af
add a,l
sub b ; test if all rows are drawn
jp nz,DrawMapLoop ; loop until all rows are drawn
ret
;-----------------------------------
; PutSprite
;-----------------------------------
PutSprite:
;----------------------------------------------------------------------------
;[ PutSprClpXOR ] [ABCDEFIX] [ 139 bytes ] [ CrASH_Man ]
;----------------------------------------------------------------------------
; Draws a sprite using only XOR data, with clipping
;
; parameters: HL -> sprite, (B,C) = coordinates
; returns: Puts sprite in GRAPH_MEM
;
DefaultXSpriteHeight = 8 ; This is the default for the sprite height
PutSprClpXOR: XOR A
__XChange_1: LD DE, DefaultXSpriteHeight ; D = 0, E = Height
OR C ; If C < 0
JP M, _SCX_NoBotClp ; No bottom clip.
LD A, $3F ; Is C is offscreen?
SUB C
RET C
__XChange_2: CP DefaultXSpriteHeight-1 ; If C + 7 < 64
JR NC, _SCX_NoVertClp ; No vertical clip.
INC A
LD E, A
JR _SCX_NoVertClp ; Height = 64 - C
_SCX_NoBotClp:
__XChange_3: CP -(DefaultXSpriteHeight-1) ; Is C is offscreen?
RET C
ADD A, E ; Find how many lines
LD C, A ; to actually draw
SUB E
NEG
LD E, A
ADD HL, DE ; Move HL down
LD E, C ; by -C lines
LD C, D
_SCX_NoVertClp: PUSH HL ; IX -> Sprite
POP IX
LD A, $77 ; OP code for
LD (_SCX_OPchg_1), A ; LD (HL), A
LD (_SCX_OPchg_2), A
XOR A ; Is B > 0?
OR B
JP M, _SCX_NoRightClp
CP 89 ; Is B < 89?
JR C, _SCX_ClpDone
CP 96
RET NC
LD HL, _SCX_OPchg_1 ; Modify LD to NOP
JR _SCX_ClpModify
_SCX_NoRightClp:CP -7 ; Is B is offscreen?
RET C
LD HL, _SCX_OPchg_2 ; Modify LD to NOP
_SCX_ClpModify: LD (HL), D
_SCX_ClpDone: LD B, D
LD H, B
LD L, C
ADD HL, BC ; HL = Y * 12
ADD HL, BC
ADD HL, HL
ADD HL, HL
LD C, A ; HL = Y*12 + X/8
SRA C
SRA C
SRA C
INC C
ADD HL, BC
LD BC, PlotsScreen
ADD HL, BC
LD B, E ; B = number of rows
CPL
AND %00000111 ; find number of
LD E, A ; instructions to jump
ADD A, E
ADD A, E
LD (_SCX_OPchg_3 + 1), A ; 3 * (7 - number)
LD DE, 13
_SCX_LineLoop: LD C, (IX)
XOR A
_SCX_OPchg_3: JR _SCX_OPchg_3 ; modify
RR C
RRA
RR C
RRA
RR C
RRA
RR C
RRA
RR C
RRA
RR C
RRA
RR C
RRA
XOR (HL) ; XOR with background
_SCX_OPchg_1: LD (HL), A ; Write
DEC HL ; HL -> next 8 pixels
LD A, C
XOR (HL) ; XOR with background
_SCX_OPchg_2: LD (HL), A ; Write
ADD HL, DE ; HL -> next row
INC IX ; Increment to next data
DJNZ _SCX_LineLoop
RET
;----------------------------------------
; PUTALIGNEDSPRITE
; Draw an Aligned Sprite to PlotsScreen
; HL = Sprite_Pointer
; b = X
; c = Y
;----------------------------------------
PutAlignedSprite:
bit 7,b
ret nz
or a
ld a,b
cp 96
ret nc
bit 7,c
ret nz
or a
ld a,c
cp 64
ret nc
push hl
pop ix
ld a,b
ld h,0
ld d,h
ld e,c
ld l,c
add hl,hl
add hl,de
add hl,hl
add hl,hl
ld e,a
srl e
srl e
srl e
add hl,de
ex de,hl
ld hl,PlotsScreen
add hl,de
ld de,12
ld b,8
ld a,(Spr_Type)
or a
jp z,sLD
cp 1
jp z,sOR
cp 2
jp z,sXOR
sLD:
ld a,(ix)
ld (hl),a
add hl,de
inc ix
djnz sLD
ret
sOR:
ld a,(ix)
or (hl)
ld (hl),a
add hl,de
inc ix
djnz sOR
ret
sXOR:
ld a,(ix)
xor (hl)
ld (hl),a
add hl,de
inc ix
djnz sXOR
ret
;-----------------------------------
; UpdateLCD - Updates the LCD
;-----------------------------------
; syntax - {5:Asm(prgmXLIB
;
UpdateLCD:
call FastCopy
jp Quit
;-----------------------------------
; FastCopy
;-----------------------------------
;-----> Copy the gbuf to the screen (fast)
;Input: nothing
;Output:graph buffer is copied to the screen
FastCopy:
di
ld a,$80 ; 7
out ($10),a ; 11
ld hl,PlotsScreen-12-(-(12*64)+1) ; 10
ld a,$20 ; 7
ld c,a ; 4
inc hl ; 6 waste
dec hl ; 6 waste
fastCopyAgain:
ld b,64 ; 7
inc c ; 4
ld de,-(12*64)+1 ; 10
out ($10),a ; 11
add hl,de ; 11
ld de,10 ; 10
fastCopyLoop:
add hl,de ; 11
inc hl ; 6 waste
inc hl ; 6 waste
inc de ; 6
ld a,(hl) ; 7
out ($11),a ; 11
dec de ; 6
djnz fastCopyLoop ; 13/8
ld a,c ; 4
cp $2B+1 ; 7
jr nz,fastCopyAgain ; 10/1
ei
ret ; 10
; Critical timings:
; command->command: 65
; command->value : 68
; value ->value : 66
; value ->command: 67
;-----------------------------------
; GetSpriteBuffer
;-----------------------------------
GetSpriteBuffer:
push af
ld a,(GFX_Page_var)
or a
jp nz,retSpriteBuffer2
retSpriteBuffer1:
ld hl,SpriteBuffer1
pop af
ret
retSpriteBuffer2:
ld hl,SpriteBuffer2
pop af
ret
;-----------------------------------
; End of Routines
;-----------------------------------
Quit:
ret
PicName:
.db PictObj,tVarPict,tPic0,0,0
MatAname:
.DB MatObj,tVarMat,tMatA,0
TempSprite:
.db 8,0,0,0,0,0,0,0,0
SprRoutine_Flag:
.db 0
MapWidth:
.db 0
MapHeight:
.db 0
MapX_O:
.db 0
MapY_O:
.db 0
ScreenStartX:
.db 0
ScreenEndX:
.db 0
ScreenStartY:
.db 0
ScreenEndY:
.db 0
Spr_Type:
.db 0
GFX_Page_var:
.db 0
UpdateLCD_Q:
.db 0
SpriteBuffer1 = $9872
SpriteBuffer2 = $86EC
.end
.END