nba-jam/NDSP1.ASM

3892 lines
88 KiB
NASM
Executable File

**************************************************************************
*
* Owner: THOMPSON
*
* GSP DMA OBJECT HANDLER
*
* Version 1.0 By Warren Davis 9/1/87
* Version 2.01 By Eugene Jarvis 10/25/87
* Version 3.0 By Eugene Jarvis 12/20/87
* Version 3.1 By Eugene Jarvis 7/4/88
* Version 3.2 By Eugene Jarvis 8/8/88
* Version 3.21 By Shawn Liptak 7/24/91 - Minor improvements (Total carnage)
* Version 3.3 By Shawn Liptak 9/13/91 - More improvements
* Version 4.0 By Shawn Liptak 1/27/92 - Basketball started
* Version 4.1 By Shawn Liptak 3/23/92 - DMA 2 version
* Version 4.2 By Shawn Liptak 7/23/92 - Faster
* Version 4.3 By Shawn Liptak 10/2/92 - Added dtype
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 10/5/93 18:53
*.Last mod - 4/17/95 -- JBJ -- for WWFUNIT
*
* Version 4.4 -- DJT ??/??/95 - NBA/2
*
**************************************************************************
.file "ndsp1.asm"
.title "GSP display processor V 4.4"
.width 132
.option b,d,l,t
.mnolist
.include gsp.equ
.include sys.equ
.include mproc.equ
.include disp.equ
.include macros.hdr
.include "world.equ" ;Court-world defs
.include GAME.EQU
;--------------------
; globals elsewhere
.if DEBUG
.ref SLDEBUG
.endif
.ref pup_court
.ref HALT,pal_getf,FRANIMQ
; .ref _3d_build
; .ref d3vis_p
.ref PCNT
.ref crt_colors
.ref dirq_wait
.ref SYSCOPY,IRQSKYE
;--------------------
; globals in here
.def scale_t,scale_t_sm,scale_t_size
.def scalebaby_t,scalehead_t,scalebighead_t,scalehugehead_t
.def scale57_t,scale57et_t,scale57t_t,scale57f_t,scale57ef_t
.def scale58_t,scale58et_t,scale58t_t,scale58f_t,scale58ef_t
.def scale59_t,scale59et_t,scale59t_t,scale59f_t,scale59ef_t
.def scale510_t,scale510et_t,scale510t_t,scale510f_t,scale510ef_t
.def scale511_t,scale511et_t,scale511t_t,scale511f_t,scale511ef_t
.def scale60_t,scale60et_t,scale60t_t,scale60f_t,scale60ef_t
.def scale61_t,scale61et_t,scale61t_t,scale61f_t,scale61ef_t
.def scale62_t,scale62et_t,scale62t_t,scale62f_t,scale62ef_t
.def scale63_t,scale63et_t,scale63t_t,scale63f_t,scale63ef_t
.def scale64_t,scale64et_t,scale64t_t,scale64f_t,scale64ef_t
.def scale65_t,scale65et_t,scale65t_t,scale65f_t,scale65ef_t
.def scale66_t,scale66et_t,scale66t_t,scale66f_t,scale66ef_t
.def scale67_t,scale67et_t,scale67t_t,scale67f_t,scale67ef_t
.def scale68_t,scale68et_t,scale68t_t,scale68f_t,scale68ef_t
.def scale69_t,scale69et_t,scale69t_t,scale69f_t,scale69ef_t
.def scale610_t,scale610et_t,scale610t_t,scale610f_t,scale610ef_t
.def scale611_t,scale611et_t,scale611t_t,scale611f_t,scale611ef_t
.def scale70_t,scale70et_t,scale70t_t,scale70f_t,scale70ef_t
.def scale71_t,scale71et_t,scale71t_t,scale71f_t,scale71ef_t
.def scale72_t,scale72et_t,scale72t_t,scale72f_t,scale72ef_t
.def scale73_t,scale73et_t,scale73t_t,scale73f_t,scale73ef_t
.def scale74_t,scale74et_t,scale74t_t,scale74f_t,scale74ef_t
.def scale75_t,scale75et_t,scale75t_t,scale75f_t,scale75ef_t
.def scale76_t,scale76et_t,scale76t_t,scale76f_t,scale76ef_t
.def del_transition_objs
.def scale77ef_t
;--------------------
; Constants
;--------------------
; global linked-list pointers
.sect "OBJBSS"
OBJLST .long 0 ;*Active object list
OFREE .long 0 ;*Free object block
BAKLST .long 0 ;*Background list
;--------------------
; ram variables
.bss SCROLLX ,32 ;X scroll value
.bss SCROLLY ,32 ;Y scroll value
;/ Must stay in order
.bss WORLDTLX ,32 ;Left X screen coord (16:16)
.bss WORLDTLY ,32 ;Top Y screen coord (16:16)
.bss WORLDTL ,32 ;Top left world Y:X
.bss SCRNTL ,32 ;TOP LEFT [Y,X] SCREEN (SCRN COORD.)
.bss SCRNLR ,32 ;LOWER RIGHT [Y,X] SCREEN (SCRN COORD.)
.bss dpage ,16 ;Display page; 0=Page0, -1=Page1
.bss dtype ,16 ;Display type; 0=2D, 1=3D, -=Special
.bss dcode_p ,32 ;!0=*Special code (^ must = neg)
BSSX DMAQCUR ,32 ;Misc DMAQ position
.bss OBJSTR ,NOBJ*OBSIZ ;Object structure mem
QSIZE .set (NOBJ+GNDI_H)*BQCELL
QMSIZE .set NOBJ*BQCELL
.bss dmaq0 ,QSIZE ;Main DMA queue
BSSX DMAQ ,QMSIZE ;Misc DMA queue
BSSX gndstat ,16 ;!0=Show ground
BSSX gndpos_t ,16*GND_H
BSSX gndx ,32
.bss DISPLAYON ,16 ;!0=Do display processing
; BSSX QDMAFLG ,16 ;!0=Misc DMAQ being updated
BSSX _3dstat ,16 ;!0=Show polygons
;--------------------
; code start
.text
********************************
* NO CODE BEFORE DMA INT!!! (Cache aligned)
********************************
* DMA interrupt
* B12=*End of DMA regs
* B13=DMAQ count-1 or Neg
* B14=*Next DMAQ fetch
SUBR dma_irq
move -*b14,-*b12,L
move -*b14,-*b12,L
move -*b14,-*b12,L
move -*b14,-*b12,L
or b8,b12 ;Add DMAREGS offset for 20Mb IROM mod
move -*b14,-*b12,L
move -*b14,-*b12,L ;DMA go!
move b9,b12 ;Restore *DMAREGS
subk 1,b13
jrn dmaint1 ;Queue empty?
reti
dmaint1
setf 1,0,0 ;>Disable dma interrupt
move b12,@INTENB+1 ;Clr X1E
clr b13 ;For safety!
subk 1,b13 ;-1
reti
********************************
* Load DMA Q from obj list (3D type)
* A0=*Obj list
* A4=*DMAQ next free spot
* A13=Screen BR, A14=Screen TL
* B2=Y offset for top of page : XPad offset
* B4=World Y:X
* B5=OFLAGS offset
* B6=World center scrn X * 64K
* B7=Default scale
* B11=*DMACTRL
.align
#lp move b5,a3
add a0,a3
move *a3+,a1 ;Get OFLAGS
btst B_CHARGEN,a1 ;Chargen obj type? Yes if !0
jrnz char_gen
mmfm a3,a12,a11,a9,a8 ;OFST:CTRL, SAG, SIZEY:SIZEX, CNST:PAL
move *a0(OYVAL),a10,L ;Get Y INT:FRAC
btst B_3DQ,a1
jrz #chk3d
move b4,a6 ;World TL Y:X
subxy a6,a10 ;-world coord to get screen coord
move *a0(OXPOS),a2 ;X
move *a0(ODATA_p),a3,L ;*gndpos_t
move *a3,a3 ;Get X shift
sub a3,a2
movx a2,a10 ;A10=Obj Y:X
jruc #noscl
#chk3d btst B_3D,a1
jrnz #3d
move *a0(OXPOS),a2 ;X
movx a2,a10 ;A10=Obj Y:X
btst B_SCRNREL,a1
jrnz #noscl ;Screen relative XY?
move b4,a6 ;World TL Y:X
subxy a6,a10 ;-world coord to get screen coord
#noscl move b7,a5 ;A5=Y:X scale
;A8=Const:PAL
;A9=VSize:HSize
;A10=Dest Y:X
;A11=*SAG
;A12=Offset:Ctrl
;Check for flipping, clipping, adjust offset, sag
;>Calc top,bot,lft,rgt clips
clr a3 ;A3=TL clip size
move a10,a2
addxy a9,a2 ;BR Y:X
subxy a13,a2 ;A2=BR clip size
JRYGE #10
movy a3,a2 ;Clr bclip if y neg
#10 JRXGE #20
movx a3,a2 ;Clr rclip if x neg
#20 btst 7,a12 ;dont clip bit if ZERO compressed
jrz #25
move a14,a6
subxy a10,a6 ;tc : lc
JRYLT #21
movy a6,a3 ;Top clip size
#21 JRXLT #22
movx a6,a3 ;Left clip size
#22 add a3,a2 ;TL clip+BR clip
jrz #chkvflip
cmpxy a2,a9 ;Chk clipped size
JRXLE #nxt ;Totally clipped?
JRYLE #nxt
jruc #chkvflip
#25 move a14,a6
subxy a10,a6 ;tc : lc
JRYLT #30
movy a6,a3 ;Top clip size
movy a14,a10 ;Adjust start position to window edge
#30 JRXLT #35
movx a6,a3 ;Left clip size
movx a14,a10 ;Adjust start position to window edge
#35 move a2,b0 ;Save
add a3,a2 ;TL clip+BR clip
jrz #chkvflip
;do obj clipping
movx a9,a6 ;Save HSize
subxy a2,a9 ;Get clipped size
JRXLE #nxt ;Totally clipped?
JRYLE #nxt
movk 8,a1
cmpxy a1,a9 ;Obj now <=8 pixels wide? Skip so DMA won't
jrxle #nxt ; lockup if so; br=yes
movx a6,a9 ;Restore hsize
clr a1
cmpxy a2,a1 ;Is X clipped at all? No if X=0
jrxz #nofh
movx a3,a1 ;Yes. A1=Left clip
btst B_FLIPH,a12
jrz #nofh
subxy a1,a10 ;X-LClip
move b0,a1 ;A1=RClip
zext a1
subxy a1,a10 ;X-RClip
#nofh btst B_FLIPV,a12
jrz #nofv
move b0,a3 ;Bot clip
#nofv srl 16,a3 ;A3=Top or bot clip
jrz #t0
zext a6
mpyu a6,a3 ;T or B clip * total hsize
#t0 add a1,a3 ;Add left clip + tc*ths
move a12,a1
sll 32-15,a1 ;Get bits/pix in CRTL bits 12-14
srl 32-15+12,a1
jrnz #not8
movk 8,a1
#not8 mpys a1,a3 ;# of bits to skip
add a3,a11 ;Add to SAG
sll 16,a2
addxy a2,a12 ;Add clip offset to offset
#chkvflip
btst B_FLIPV,a12
jrz #chkhflip
movy a9,a1 ;VSize
srl 16,a1
subk 1,a1
sll 16,a1
addxy a1,a10
#chkhflip
btst B_FLIPH,a12
jrz #nofh2
movx a9,a1 ;HSize
subk 1,a1
zext a1
addxy a1,a10
#nofh2
move b2,a1
addxy a1,a10 ;Add the page y offset : XPad
rl 16,a12 ;Flip ctrl & offset
mmtm a4,a5,a8,a9,a10,a11,a12 ;Save the DMA regs
addk 1,b13 ;Inc DMA queue cnt
jrp #nxt ;DMA irq active? Yes if +
#dodma
dint
setf 1,0,0 ;Enable DMA irq
movk 1,a1
move a1,@INTENB+1 ;X1E
setf 16,1,0
move *b11,b0 ;DMA busy (will irq)? Yes if -
jrn #dmaok
trap 1 ;Cause DMA irq
#dmaok eint
dma_objlst ;Entry point
#nxt
move *a0,a0,L ;Get next link
jrnz #lp ;More?
rets
;A0 = *OBJ
;A1 = OFLAGS
;A4 = *DMAQ
;A8 = OCONST:OPAL
;A9 = OSIZEY:OSIZEX
;A10= OYVAL
;A11= OSAG
;A12= OFSET:OCTRL
;A13= SCRNLR
;A14= SCRNTL
#3d ;3D coord conversion
;
;calc X offset from center of screen
;
move *a0(OXVAL),a7,L
move b4,a2 ; WorldY:X
subxy a2,a10 ; OYPOS-WorldY:OYFRAC-WorldX
move b6,a2 ; CenterX:0
sub a2,a7 ; OXVAL-CenterX
move *a0(OXANI),a5,L
add a5,a7 ; (OXVAL-CenterX)+OXANI
;
;calc final Z from actual + OMISC Z offset (for shadows,heads)
;
move *a0(OZPOS),a2
move *a0(OMISC),a3 ; ZOFF
add a3,a2 ; A2=ZOFF+OZPOS
move a2,a6 ; A6=A2 for later Y calc
;
;calc screen X by multiplying X offset from center & final Z
;
;TEMP!!! begin
; BSSX pre_xval,32
; BSSX pst_xval,16
; BSSX dlt_xval,16
; move *a0(OID),a3
; cmpi TYPBALL-CLSENMY,a3
; jrnz #tmpx_1
; move a7,@pre_xval,L
;#tmpx_1
; PRJX2Z a7,a2,0
; cmpi TYPBALL-CLSENMY,a3
; jrnz #tmpx_2
; move a7,@pst_xval
; move @pre_xval+16,a3
; sub a7,a3
; abs a3
; move a3,@dlt_xval
;#tmpx_2
;TEMP!!! end; was just PRJ
PRJX2Z a7,a2,0
addi 200,a7 ;make X 0-based from left of screen
sra 16,a5 ;shift down int part of OXANI &
sub a5,a7 ; take it back out of X
movx a7,a10 ;put X away in DESTY:X
;
;calc screen Y
;
subi GZBASE,a6
jrge #zok
clr a6
#zok move a6,a2 ; A2=A6 for later scale lookup
move a6,a3 ;take 3/8 of A6
sra 1,a6
sra 3,a3
sub a3,a6
addi GND_Y,a6
sll 16,a6
addxy a6,a10
btst B_NOSCALE,a1 ;does obj want Z-based scaling?
jrnz #noscl ; yes if !0
btst B_SHAD,a1 ;no. Is it a shadow-type obj?
jrz #notshad ; no if 0
srl 1,a10 ;yes. Lose X lsb
move @PCNT,a5 ;make X even or odd to "shimmer"
srl 1,a5 ; the img
addc a10,a10
jruc #noscl
;
;check screen side clips & get Z-based scale if visible
;
#notshad
move a10,*a0(OSCALE),L
cmpxy a13,a10
JRXGE #nxt ;Left edge past rclip?
move a10,a3 ;add (non-scaled!) OSIZEY:OSIZEX to
addxy a9,a3 ; DESTY:X. Overkill if it gets smaller
cmpxy a14,a3 ; but what if it gets bigger?!?
JRXLT #nxt ;Rgt edge past lclip?
srl 4,a2 ;clr low 4 bits of Z &
sll 6,a2 ; * scale table element size
move *a0(ODATA_p),a5,L ;get *scale_t
add a2,a5
move *a5,a5,L ;A5=SCALEY:X
btst B_FLIPH,a12
jrz #nofh2
movx a9,a1 ;HSize
subk 1,a1
zext a1
addxy a1,a10
move b2,a1
addxy a1,a10 ;Add the page y offset : XPad
rl 16,a12 ;Flip ctrl & offset
mmtm a4,a5,a8,a9,a10,a11,a12 ;Save the DMA regs
addk 1,b13 ;Inc DMA queue cnt
jrp #nxt ;DMA irq active? Yes if +
jruc #dodma
#********************
* Character generator for dma_objlst
*
* Enters with:
* A0 *Obj list
* A1 OFLAGS
* A4 *DMAQ next free spot
* A13 Screen BR
* A14 Screen TL
* B2 Y offset for top of page : XPad offset
* B4 World Y:X
* B5 OFLAGS offset
* B6 World center scrn X * 64K
* B7 Default scale
* B11 *DMACTRL
*
* Uses for DMA:
* A7 SCALEY:SCALEX
* A8 CNST:PAL
* A9 SIZEY:SIZEX
* A10 YPOS:XPOS
* A11 SAG
* A12 CTRL:OFST
.align
.ref init_convert_img
SUBR char_gen
move *a0(ODATA_p),a1,L ;Get *plyrname
move b7,a7 ;SCALEY:SCALEX
move *a0(OPAL),a8,L ;OCNST:OPAL
move *a0(OYPOS),a10 ;OYPOS
move *a0(OMISC),a3 ;OXPOS
sll 16,a10
movx a3,a10 ;-> OYPOS:OXPOS
move b2,a2
addxy a2,a10 ;Add the page Y offset : XPad
move *a0(OCTRL),a5 ;OCTRL
andi DMAWAL|DMACAL,a5 ;-> CTRL
movi init_convert_img,a6,L
movk NAME_LETTERS,b0 ;Init char cnt
#lp
move *a1+,a11 ;Get next char *img
jrz #done ;Done if not a char (if 0)
sll 5,a11
add a6,a11
move *a11,a11,L
move *a11,a9,L ;ISIZEY:ISIZEX
move *a11(ICTRL),a12 ;ICTRL
add a5,a12
sll 16,a12 ;-> CTRL:OFST
move *a11(ISAG),a11,L ;ISAG
mmtm a4,a7,a8,a9,a10,a11,a12 ;Save the DMA regs
zext a9 ;Clr SIZEY
addxy a9,a10 ;Add SIZEX for next XPOS
dsj b0,#lp
#done
neg b0 ;Redo cnt to get # of chars
addk NAME_LETTERS,b0
jrz dma_objlst ;Done if there weren't any
move a3,a3 ;Was OMISC 0? First time here if so
jrnz #strtdma
subxy a2,a10 ;Remove the page Y offset : XPad
zext a10 ;0->YPOS so XPOS is name pix width
sra 1,a10
move *a0(OIMG),a1,L ;Get default *img
move *a0(OXPOS),a2 ;OXPOS
move *a1(IANIOFFX),a3 ;IANIOFFX
add a3,a2 ;Calc obj ctr X coor
sub a10,a2 ;Sub .5 of width for new starting X
move a2,*a0(OMISC) ;Put it away for next time
move a4,a1 ;Step thru DMAq just built to add the
move b0,a5 ; new X to the zero-based imgs
addi DMAHORIZ-DMAOFFST,a1 ;Ptr to 1st (last q'd) img X
#fixx
move *a1,a3
add a2,a3
move a3,*a1
addi DMAWINDOW-DMAOFFST,a1
dsj a5,#fixx
#strtdma
add b0,b13 ;Inc DMA queue cnt
sub b13,b0 ;DMA irq active? Yes if <=
jrle dma_objlst
dint
setf 1,0,0 ;Enable DMA irq
movk 1,a1
move a1,@INTENB+1 ;X1E
setf 16,1,0
move *b11,b0 ;DMA busy (will irq)? Yes if -
jrn #dmaok
trap 1 ;Cause DMA irq
#dmaok eint
jruc dma_objlst ;Reenter obj loop
#*******************************
* Load DMA Q from obj list (2D type)
* A0=*Obj list
* A4=*DMAQ next free spot
* A13=Screen BR, A14=Screen TL
* B2=Y offset for top of page : XPad offset
* B4=World Y:X
* B5=OFLAGS offset
* B6=World center scrn X * 64K
* B11=*DMACTRL
dma_objlst2d
; movi >1000100,a5 ;A5=Y:X scale
jruc #nxt
.align
#lp
move *a0(OSCALE),a5,L
move b5,a3
add a0,a3
move *a3+,a1 ;Get OFLAGS
mmfm a3,a12,a11,a9,a8
move *a0(OYVAL),a10,L ;Get int Y
move *a0(OXPOS),a2 ;X
movx a2,a10 ;A10=Obj Y:X
btst B_SCRNREL,a1
jrnz #noscl ;Screen relative XY?
move b4,a6 ;A6=World TL Y:X
subxy a6,a10 ;-world coord to get screen coord
#noscl
;A8=Const:PAL
;A9=VSize:HSize
;A10=Dest Y:X
;A11=*SAG
;A12=Offset:Ctrl
;Check for flipping, clipping, adjust offset, sag
;>Calc top,bot,lft,rgt clips
clr a3 ;A3=TL clip size
move a10,a2
addxy a9,a2 ;BR Y:X
subxy a13,a2 ;A2=BR clip size
JRYGE #10
movy a3,a2 ;Clr bclip if y neg
#10 JRXGE #20
movx a3,a2 ;Clr rclip if x neg
#20 move a14,a7
subxy a10,a7 ;wstart - pt -> a7 (tc : lc)
JRYLT #30
movy a7,a3 ;Top clip size
btst 7,a12
jrnz #30 ;Zero compression on?
movy a14,a10 ;Adjust start position to window edge
#30 JRXLT #35
movx a7,a3 ;Left clip size
btst 7,a12
jrnz #35 ;Zero compression on?
movx a14,a10 ;Adjust start position to window edge
#35 move a2,b0 ;Save
add a3,a2 ;TL clip+BR clip
jrz #noclip ;Zero clip?
move a9,a6 ;Save VSize:HSize
subxy a2,a9 ;Get clipped size
JRXLE #nxt ;Totally clipped?
JRYLE #nxt
btst 7,a12
jrz #nozc ;Zero compression off?
move a6,a9 ;Restore v:h size
jruc #noclip
#nozc
clr a1
movx a2,a1
move a1,a1
jrz #xclipzero
movx a9,a1
subk 8,a1
jrle #nxt ;<=8 wide? Skip so DMA doesn't lockup
#xclipzero
movx a6,a9 ;Restore hsize
movx a3,a1 ;A1=Left clip
btst B_FLIPH,a12
jrz #nofh
subxy a1,a10 ;Original X
move b0,a1 ;LClip=RClip
zext a1
subxy a1,a10 ;X-RClip
#nofh btst B_FLIPV,a12
jrz #nofv
move b0,a3 ;Bot clip
#nofv srl 16,a3 ;A3=Top or bot clip
jrz #t0
zext a6
mpyu a6,a3 ;T or B clip * total hsize
#t0
add a1,a3 ;Add left clip + tc*ths
move a12,a1
sll 32-15,a1 ;Get bits 12-14
srl 32-15+12,a1
jrnz #not8
movk 8,a1
#not8 mpys a1,a3 ;# of bits to skip
add a3,a11 ;Add to SAG
sll 16,a2
addxy a2,a12 ;Add clip offset to offset
#noclip
btst B_FLIPH,a12
jrz #300
movx a9,a1 ;HSize
subk 1,a1
zext a1
addxy a1,a10
#300 btst B_FLIPV,a12
jrz #400
movy a9,a1 ;VSize
srl 16,a1
subk 1,a1
sll 16,a1
addxy a1,a10
#400
move b2,a1
addxy a1,a10 ;Add the page y offset : XPad
rl 16,a12 ;Flip ctrl & offset
mmtm a4,a5,a8,a9,a10,a11,a12 ;Save the dma regs
addk 1,b13 ;+1 Q cnt
jrgt #nxt ;DMA going?
dint
setf 1,0,0 ;>Enable DMA int
movk 1,a1
move a1,@INTENB+1 ;X1E
setf 16,1,0
move *b11,b0
jrn #dmaok ;DMA busy?
move b13,b13
jrn #dmaok ;DMA int done?
trap 1 ;Cause DMA int
#dmaok eint
#nxt
move *a0,a0,L ;Get next link
jrnz #lp ;More?
rets
#*******************************
* Load DMA Q from obj list (2D type)
* A0=*Obj list
* A4=*DMAQ next free spot
* A13=Screen BR, A14=Screen TL
* B2=Y offset for top of page : XPad offset
* B4=World Y:X
* B5=OFLAGS offset
* B6=World center scrn X * 64K
* B11=*DMACTRL
dma_objlst2dscl
; movi >1000100,a5 ;A5=Y:X scale
jruc #nxt
.align
#lp
move b5,a3
add a0,a3
move *a3+,a1 ;Get OFLAGS
mmfm a3,a12,a11,a9,a8
move *a0(ODATA_p),a5,L ;Get scale value
move *a0(OYVAL),a10,L ;Get int Y
move *a0(OXPOS),a2 ;X
movx a2,a10 ;A10=Obj Y:X
btst B_SCRNREL,a1
jrnz #noscl ;Screen relative XY?
move b4,a6 ;A6=World TL Y:X
subxy a6,a10 ;-world coord to get screen coord
#noscl
;A8=Const:PAL
;A9=VSize:HSize
;A10=Dest Y:X
;A11=*SAG
;A12=Offset:Ctrl
;Check for flipping, clipping, adjust offset, sag
;>Calc top,bot,lft,rgt clips
clr a3 ;A3=TL clip size
move a10,a2
addxy a9,a2 ;BR Y:X
subxy a13,a2 ;A2=BR clip size
JRYGE #10
movy a3,a2 ;Clr bclip if y neg
#10 JRXGE #20
movx a3,a2 ;Clr rclip if x neg
#20 move a14,a7
subxy a10,a7 ;wstart - pt -> a7 (tc : lc)
JRYLT #30
movy a7,a3 ;Top clip size
movy a14,a10 ;Adjust start position to window edge
#30 JRXLT #35
movx a7,a3 ;Left clip size
movx a14,a10 ;Adjust start position to window edge
#35 move a2,b0 ;Save
add a3,a2 ;TL clip+BR clip
jrz #noclip ;Zero clip?
movx a9,a6 ;HSize
subxy a2,a9 ;Get clipped size
JRXLE #nxt ;Totally clipped?
JRYLE #nxt
clr a1
movx a2,a1
move a1,a1
jrz #xclipzero
movx a9,a1
subk 8,a1
jrle #nxt ;<=8 wide? Skip so DMA doesn't lockup
#xclipzero
movx a6,a9 ;Restore hsize
movx a3,a1 ;A1=Left clip
btst B_FLIPH,a12
jrz #nofh
subxy a1,a10 ;Original X
move b0,a1 ;LClip=RClip
zext a1
subxy a1,a10 ;X-RClip
#nofh btst B_FLIPV,a12
jrz #nofv
move b0,a3 ;Bot clip
#nofv srl 16,a3 ;A3=Top or bot clip
jrz #t0
zext a6
mpyu a6,a3 ;T or B clip * total hsize
#t0
add a1,a3 ;Add left clip + tc*ths
move a12,a1
sll 32-15,a1 ;Get bits 12-14
srl 32-15+12,a1
jrnz #not8
movk 8,a1
#not8 mpys a1,a3 ;# of bits to skip
add a3,a11 ;Add to SAG
sll 16,a2
addxy a2,a12 ;Add clip offset to offset
#noclip
btst B_FLIPH,a12
jrz #300
movx a9,a1 ;HSize
subk 1,a1
zext a1
addxy a1,a10
#300 btst B_FLIPV,a12
jrz #400
movy a9,a1 ;VSize
srl 16,a1
subk 1,a1
sll 16,a1
addxy a1,a10
#400
move b2,a1
addxy a1,a10 ;Add the page y offset : XPad
rl 16,a12 ;Flip ctrl & offset
mmtm a4,a5,a8,a9,a10,a11,a12 ;Save the dma regs
addk 1,b13 ;+1 Q cnt
jrgt #nxt ;DMA going?
dint
setf 1,0,0 ;>Enable DMA int
movk 1,a1
move a1,@INTENB+1 ;X1E
setf 16,1,0
move *b11,b0
jrn #dmaok ;DMA busy?
move b13,b13
jrn #dmaok ;DMA int done?
trap 1 ;Cause DMA int
#dmaok eint
#nxt
move *a0,a0,L ;Get next link
jrnz #lp ;More?
rets
#*******************************
* Display object lists, called by DIRQ
DISPLAY
movi DMACTRL,b11 ;B11=*DMACTRL
movi SCRNXP,b2 ;B2=Page y offset : XPad offset
movi [253,0],b3
move @dpage,a1
jrnz #p1
movi [PAGE1YO,SCRNXP],b2
movi [509,256],b3
#p1
movi dmaq0+QSIZE,a4 ;A4=*DMAQ for new data (Top)
clr b13 ;Kill DMA
move b13,*b11
move b13,*b11
movi >80000,b8 ;B8=*DMAREGS offset for 20Mb IROM mod
movi DMAREGS,b9 ;B9=*DMAREGS to restore B12 with
move b9,b12 ;B12=*DMAREGS
subk 1,b13 ;B13=Q count (-1)
move a4,b14 ;B14=*DMAQ for next fetch (Top)
movi >30,b0
move b0,*b12(30h) ;DMACONF (Top/Bottom)
move b3,*b12,L ;DMAWINDOW
move @DISPLAYON,a0
jrz #doff ;Stop DMA of objects except for score?
movi WORLDTLX,b0 ;>Scroll world
; move @SCROLLX,b6,L
; move @SCROLLY,b7,L
; move *b0,b3,L
; add b6,b3
; move b3,*b0+,L ;TLX
; move *b0,b4,L
; add b7,b4
; move b4,*b0+,L ;TLY
move *b0+,b3,L ;Quick version of ^
move *b0+,b4,L
srl 16,b3
movx b3,b4 ;B4=World top left Y:X
move b4,*b0,L ;WORLDTL
movi OFLAGS,b5 ;B5=Obj data offset
move b4,b6
addi 200,b6
sll 16,b6 ;B6=World center scrn X * 64K
move @SCRNLR,a13,L ;A13=Screen BR
move @SCRNTL,a14,L ;A14=Screen TL
.if DEBUG
clr b3 ;trap1 cnt
.endif
move @gndstat,a0
jrz #70 ;Off?
callr gnd_dodma
#70
; move @_3dstat,a0
; jrz #80 ;Off?
; calla _3d_build
; callr _3d_draw
;#80
move @dtype,a1
jrnz #3dtype
movi BAKLST,a0
callr dma_objlst2d
.if DEBUG
move @SLDEBUG,a0
jrnn #nol2d
movi 31<<10+10<<5,a0 ;Proc usage
move a0,@ERASELOC
#nol2d
.endif
movi OBJLST,a0
callr dma_objlst2d
jruc #doff
#3dtype
jrgt #3dgame
move @dcode_p,a0,L
jrnn #3dgame ;No special code?
call a0
jruc #x
#3dgame
; movi BAKLST,a0
; movi >1000100,b7 ;Original scale
; callr dma_objlst
.if DEBUG
move @SLDEBUG,a0
jrnn #nol3d
movi 31<<10+10<<5,a0 ;Proc usage
move a0,@ERASELOC
#nol3d
.endif
movi OBJLST,a0
movi >1000100,b7 ;Original scale
callr dma_objlst
#doff
; move @QDMAFLG,a2
; jrnz #noman ;Q being modified?
move @DMAQCUR,a2,L
movi DMAQ+QMSIZE,a1
cmp a1,a2
jrhs #noman ;Empty?
move a1,@DMAQCUR,L ;Reset top of queue
move b2,a5
#lp move -*a1,-*a4,L ;>Copy manual DMAQ to end of Q
move -*a1,-*a4,L
move -*a1,-*a4,L
move -*a1,a0,L
addxy a5,a0 ;+Y
move a0,-*a4,L
move -*a1,-*a4,L
move -*a1,-*a4,L
addk 1,b13
cmp a2,a1
jrhi #lp
move *b11,b0
jrn #noman ;DMA busy?
move b13,b13
jrn #noman ;DMA int done?
setf 1,0,0 ;>Enable DMA int
movk 1,a1
move a1,@INTENB+1 ;X1E
setf 16,1,0
trap 1 ;Cause DMA int
#noman
; movi nulldma,a0 ;>Put null DMA at end of Q
; mmfm a0,a7,a8,a9,a10,a11,a12
; mmtm a4,a7,a8,a9,a10,a11,a12
move @HALT,a0
jrnz #novel ;Skip vel update?
movi OBJLST,a0
move *a0,a0,L
jrz #novel
; Velocity add loop
#valp move a0,a1
addk OXVEL,a1
mmfm a1,a2,a3,a4,a5,a6,a7 ;A7=XV, A6=YV, A5=ZV, A4=X, A3=Y, A2=Z
add a5,a2 ;Add ZVEL to Z
move a2,-*a1,L
add a6,a3 ;Add YVEL to Y (Uses hidden cycle!)
move a3,-*a1,L
add a7,a4 ;Add XVEL to X ^
move a4,-*a1,L
move *a0,a0,L
jrnz #valp ;!End?
#novel
#x
; .if DEBUG
; move @SLDEBUG,a0
; jrnn #noline
;
; movi 31<<10+31<<5,a0 ;Proc usage
; move a0,@ERASELOC
;
;#dqwt move b13,b13
; jrge #dqwt ;DMA busy?
;
; movi 20<<10,a0 ;DMA usage
; move a0,@ERASELOC
;
;#noline
; .endif
rets
;Null dma data
;nulldma .long >80000000,IROM,0,>00010001,0,>1000100
#*******************************
* Fill DMAQ with ground data for each line
* A4 *DMAQ next free spot
* A13 SCRNLR
* A14 SCRNTL
* B2 Y offset for top of page : XPad offset
* B4 World Y:X
* B11 *DMACTRL
* Trashes A0-A3,A5-A12,B0
* A4 *DMAQ next free spot
.asg 8,COURT_BC ;Court img bit count
DMACRT .equ (((8|COURT_BC)<<12)|DMAWNZ)<<16
.asg 0,BNKCRT ;Court img IROM bank (0,1,2)
.asg 1,BNKOTD ;Outdoor court img IROM bank (0,1,2)
.if 1 ;1 for locked court, 0 for new court
.ref COURT
.ref OUTDOOR
SAGCRT .equ COURT-IROM+(GNDI_W/2-200)*COURT_BC+BNKCRT*>4000000
SAGOTD .equ OUTDOOR-IROM+(GNDI_W/2-200)*COURT_BC+BNKOTD*>4000000
.else
.ref COURTNEW
.ref OUTDOOR
SAGCRT .equ COURTNEW-IROM+(GNDI_W/2-200)*COURT_BC+BNKCRT*>4000000
SAGOTD .equ OUTDOOR-IROM+(GNDI_W/2-200)*COURT_BC+BNKOTD*>4000000
.endif
SUBRP gnd_dodma
;Always build the X table
move @gndx,a2,L ;A2=16:16 mid-screen court X
move a2,a1 ;A1=A2 for divide
sll DIVRES,a1 ; shift up for DIVSLP frac
movi DIVSLP,a3 ;A3=per-line ratio
divs a3,a1 ;A1=per-line delta X
movi gndpos_t,a0 ;A0=X table ptr
movi GND_H,a5 ;A5=# of lines to calc X's for
#do_x_t move a2,a3 ;Eliminate X frac & put in table
sra 16,a3
move a3,*a0+
add a1,a2 ;A2+=delta X
dsjs a5,#do_x_t
cmpxy a14,a13 ;Screen closed?
jryle #exit
jrxle #exit
movi gndpos_t+40*16,a3 ;A3=*1st court X
movi SAGCRT,a6 ;A6=*1st line centered of court img
move @pup_court,a2 ;Outdoor court?
jrz #crt ; br=no
movi SAGOTD,a6 ;A6=*1st line centered of court img
#crt
movi GNDI_W*COURT_BC,a2 ;K> A2=court img bit width
movi GNDI_H,a5 ;A5=court img line count
movi [GNDI_Y,0],a10
move b4,a11
movx a10,a11
subxy a11,a10 ;A10=screen Y:X for court top
move a10,a9 ;Calc diff between court upper Y &
subxy a14,a9 ; screen upper Y
jryge #tyval ;Court above screen top? No if >=
sra 16,a9 ;Pull down the line count
add a9,a5 ;Adjust court line count
jrle #exit ;No lines visible if new count <=0
move a9,a7
sll 4,a7 ;Lines over * gndpos_t element size &
sub a7,a3 ; add to X ptr (by subing a neg #)
mpys a2,a9 ;Lines over * court img bit width &
sub a9,a6 ; add to img ptr (by subing a neg #)
movy a14,a10 ;Set new court Y
#tyval move a13,a9 ;Calc diff between screen lower Y &
subxy a10,a9 ; court upper Y
jryle #exit ;Court below screen bottom? Yes if >=
srl 16,a9 ;Pull down the line count (always +)
cmp a5,a9 ;More court lines than visible?
jrge #byval
move a9,a5 ;Adjust court count
#byval move b2,a11
addxy a11,a10 ;A10=DMA DEST Y:X
;; move @crt_colors,a0,L
;; calla pal_getf
;; move a0,a8
.ref crt_pal
move @crt_pal,a8 ;K> A8=DMA CONSTANT:PALETTE
movi >1000100,a7 ;K> A7=DMA Y:X scale
movi [1,400],a9 ;K> A9=DMA VSIZE:HSIZE
movi DMACRT,a12 ;K> A12=DMA CONTROL:OFFSET
movi [1,0],a1 ;K> A1=Y:X inc
.align
#lp move *a3+,a11 ;Get next line X
sll 3,a11 ;Make it 8-bit
add a6,a11 ;A11=DMA SOURCE
mmtm a4,a7,a8,a9,a10,a11,a12 ;Save the DMA regs
addk 1,b13 ;Inc DMA queue cnt
jrp #next ;DMA irq active? Yes if +
dint
setf 1,0,0 ;Enable DMA irq
movk 1,a0
move a0,@INTENB+1 ;X1E
setf 16,1,0
move *b11,b0 ;DMA busy (will irq)? Yes if -
jrn #dmaok
trap 1 ;Cause DMA irq
#dmaok eint
#next add a2,a6 ;->next img line
add a1,a10 ;->next Y
dsjs a5,#lp
#exit rets
.if 0
#*******************************
* Dump 3D data to DMA
* B2=Y offset for top of page : XPad offset
* B11=*DMACTRL
* B12=*End of DMA regs
* Trashes A0-A3,A5-A12,B0-B1
.bss linelsxy ,32
.bss linersxy ,32
D3XPTS .equ >140 ;UHL *Xformed points array (Cnt, XYZ,XYZ..)
SUBRP _3d_draw ;B1 Free (B14)
PUSH a4,a13,a14
PUSH b3,b4,b5,b6,b7,b8,b9,b10,b13,b14
setf 1,0,0 ;>Disable DMA interrupt
move sp,@INTENB+1 ;Clr X1E
setf 16,1,0
movi [1,1],b13 ;B13=Const 1:1
; clr b14 ;DEBUG
movi >1000100,b5 ;B5=1:1 scale
movi IROM,b9 ;B9=*IROM
movi >800c<<16,b10 ;B10=OFFSET:CONTROL
movi d3vis_p,a12 ;A12=*3D object
;D3PTS .equ >120 ;UHL *Points array (Cnt, XYZ,XYZ..)
;
; PUSH a0,a1 ;DEBUG
; movi d3vis_p,a1
; move *a1,a0,L
; jrz #dx
;#debug move a1,a0
; move *a0,a1,L
; jrnz #debug
; move *a0(D3PTS),a1,L
; jrz $ ;ERROR!!!
;#dx PULL a0,a1
.align
#lpobj move *a12,a12,L
jrz #x ;End?
move a12,a14
addi D3XPTS,a14
move *a14+,a13,L ;A13=*Base of points_t
move *a14+,a14,L ;A14=*1st entry of face line_t
move *a13+,a0 ;# pts
jrz #lpobj ;Not visable?
#facelp
move *a14+,a0
move a0,b6 ;B6=Const:Pal for face
sll 16,b6
move a14,a4
movi >7fff,a8 ;>Find lowest/highest X Y
;DO BETTER
move a8,a9
not a9 ;>8000
move a8,a10
move a9,a11
jruc dd150
#lp2 add a13,a1 ;+Base
move *a1+,a2 ;Get X
cmp a8,a2
jrge #xbig ;Bigger X?
move a2,a8 ;New low
#xbig cmp a9,a2
jrle #xsml ;Smaller X?
move a2,a9 ;New high
#xsml
move *a1,a1 ;Get Y
cmp a10,a1
jrge #ybig ;Bigger Y?
move a1,a10 ;New low
move a4,a5 ;A5=*Left line line table
#ybig cmp a11,a1
jrle dd150
move a1,a11 ;New high
dd150 move *a4+,a1
jrnn #lp2 ;Good offset?
subk 16,a4 ;A4=*Null end entry of line_t
cmpi 200,a8
jrge #nextf ;Face off screen?
cmpi -200,a9
jrle #nextf ;Face off screen?
move a11,a0
sub a10,a11
jreq #nextf ;Height of 1?
cmpi 254,a10
jrge #nextf ;Off screen bottom?
cmpi -400,a10
jrle #nextf ;Way off screen top?
subi 253,a0
jrle dd300
sub a0,a11
dd300 addk 1,a11 ;A11=Main loop cnt
sll 16,a10 ;A10=Dest Y:X
move a5,a6 ;A6=*Rgt line line table
subk 16,a6
move -*a5,a0 ;Get offset
add a13,a0
cmp a14,a5
jrhi dd500 ;!At start?
move a4,a5 ;Put at end
dd500 move *a6+,a1 ;Get offset
add a13,a1
cmp a4,a6
jrlo dd550 ;!Past end
move a14,a6 ;Put at start
dd550
move *a0,a2,L
move *a1,a3,L
move a2,@linelsxy,L ;Needed???
move a3,@linersxy,L
movk 1,b3 ;B3=Y cntdn till end of left line
movk 1,b4 ;B4=Y cntdn till end of rgt line
;A8 Free
movi [1,0],a8 ;A8=Const 1:0
#linelp
dsj b3,dd750
dd700 move -*a5,a0 ;Get offset
add a13,a0
cmp a14,a5
jrhi dd720 ;!At start?
move a4,a5 ;Put at end
dd720
move *a0,a1,L
move @linelsxy,a2,L ;Start XY
move a1,@linelsxy,L
subxy a2,a1
move a1,a7
jrn #nextf ;Neg Y?
srl 16,a1
jrz dd700 ;Same Y?
move a1,b3 ;New Y cnt
sll 16,a7 ;A7=Delta X
divs a1,a7 ;Divide DeltaX into Y increments
sll 16,a2 ;A2=Left line X (16:16)
dd750 dsj b4,dd850
dd800 move *a6+,a0 ;Get offset
add a13,a0
cmp a4,a6
jrlo dd820 ;!Past end
move a14,a6 ;Put at start
dd820
move *a0,a1,L
move @linersxy,a3,L ;Start XY
move a1,@linersxy,L
subxy a3,a1
move a1,a9
jrn #nextf ;Neg Y?
srl 16,a1
jrz dd800 ;Different Y?
dd840 move a1,b4 ;New Y cnt
sll 16,a9 ;A9=Delta X
divs a1,a9 ;Divide DeltaX into Y increments
sll 16,a3 ;A3=Rgt line X (16:16)
dd850 add a7,a2 ;+Offset to left X
add a9,a3 ;^ rgt X
cmp a3,a2
jrgt #nextf ;X flipped?
move a10,a10
jrn #nextl ;Off screen top?
move a2,a0
sra 16,a0 ;Int (0=Screen center)
cmpi 200,a0
jrge #nextl ;L line to rgt of screen?
addi 200,a0
jrge dd1000 ;On screen?
clr a0
dd1000 movx a0,a10 ;X pos
move a3,a1 ;>Calc HSize
sra 16,a1 ;Int
addi 200,a1
jrlt #nextl ;R line to left of screen?
sub a0,a1 ;Width
add a1,a0 ;Rgt X
subi 400,a0
jrlt dd1500 ;On screen?
subxy a0,a1 ;-difference
dd1500
; move a1,a0 ;DEBUG chk VS:HS
; srl 16,a0
; jrnz $
; move a1,a0
; sll 16,a0
; jrlt $
move a1,b7
addxy b13,b7 ;B7=VSIZE:HSIZE
move a10,b8
addxy b2,b8 ;Add the page y offset
; move *b11,b0
; jrnn #dfree
; addk 1,b14 ;DEBUG
#dwait move *b11,b0
jrn #dwait ;DMA busy?
#dfree mmtm b12,b5,b6,b7,b8,b9,b10 ;Set the dma regs
addi >c0,b12 ;Fix DMAREGS
#nextl
add a8,a10 ;Next Y
dsj a11,#linelp
#nextf move a4,a14
addk 16,a14
move *a14,a0
jrnn #facelp ;Another set of lines?
jruc #lpobj
#x PULL b3,b4,b5,b6,b7,b8,b9,b10,b13,b14
PULL a4,a13,a14
rets
.endif
#*******************************
* Manual DMA
* A1=Constant color:Palette
* A2=Vsize:Hsize
* A3=Dest Y:X
* A4=SAG
* A5=Offset:Control
* Trashes A0,A14
SUBR QDMAN
; movk 1,a0
; move a0,@QDMAFLG ;Q being modified
move @DMAQCUR,a14,L
cmpi DMAQ,a14
jrls #x ;Q full?
movi >1000100,a0 ;No scale
rl 16,a5 ;Flip DMA & offset
mmtm a14,a0,a1,a2,a3,a4,a5
rl 16,a5 ;Flip DMA & offset
move a14,@DMAQCUR,L
#x
; clr a0
; move a0,@QDMAFLG
rets
#*******************************
* Turn on the 2d with scaling display mode
* Trashes scratch
SUBRP display_2dsclmodeon
movi #drawcode,a0
move a0,@dcode_p,L
movi -1,a0
move a0,@dtype
rets
#drawcode
movi BAKLST,a0
callr dma_objlst2d
movi OBJLST,a0
jruc dma_objlst2dscl
#*******************************
* Turn on the 2d, with scaling and stars, display mode
* Trashes scratch
.asg MEGBIT1,STARBUF
NSTARS .equ 900
STARSZ .equ 32*6+16
SUBRP display_2dsclstarmodeon
movi NSTARS,b0 ;>Init star array
movi STARBUF,a1
movi -1,a0
#silp move a0,*a1,L ;X
addi STARSZ,a1
dsj b0,#silp
movi #drawcode,a0
move a0,@dcode_p,L
movi -1,a0
move a0,@dtype
rets
********************************
* B2=Y offset for top of page : XPad offset
* Trashes A0-A3,A5-A12,B0-B3
CFRAC .equ 2
.bss starcolor ,16
#drawcode
PUSH a13,a14
PUSH b4
movk 3,a0
callr rnd
move @starcolor,a6
add a0,a6
move a6,@starcolor
sll 32-3-6,a6
srl 32-3,a6 ;Remove fraction
sll 5+CFRAC,a6
movi NSTARS,a5 ;>Find a free star
movi STARBUF,a2
movk 3,a3
#flp move *a2,a0,L ;X
jrn #found
addi STARSZ,a2
#fnxt dsj a5,#flp
jruc #nofree
#found movi [200,0],a0 ;>Create star
move a0,*a2+,L ;X
movi [252,0],a0
move a0,*a2+,L ;Y
clr a0
move a0,*a2+,L ;XV
movi ->3e000,a0
move a0,*a2+,L ;YV
movi >7ff,a0
callr rnd
subi >3ff,a0
move a0,*a2+,L ;XA
movi >3ff,a0
callr rnd
addi >7ff,a0
move a0,*a2+,L ;YA
move a6,*a2+ ;Color type
dsj a3,#fnxt
#nofree
movi #star_p,a0 ;>Update stars
calla pal_getf
move a0,@DMACMAP
movi 512*8,b3
lmo b3,b0
move b0,@CONVDP
clr b4
movi 1<<(32-5-CFRAC),a11
movi [400,0],a13 ;A13=X max+1
movi [254,0],a14 ;A14=Y max+1
move b2,a12
movi NSTARS,b0
movi STARBUF,a8
#lp
; move *a8+,a2,L ;X
; move *a8+,a3,L ;Y
; move *a8+,a5,L ;XV
; move *a8+,a6,L ;YV
; move *a8+,a9,L ;XA
; move *a8+,a10,L ;YA
mmfm a8,a2,a3,a5,a6,a9,a10 ;YA,XA,YV,XV,Y,X
move *a8+,a1 ;Color
move a10,a10
jrn #nxt
add a2,a5
add a3,a6
add a5,a9
add a6,a10
cmp a13,a10
jrhs #offscr ;X off screen?
cmp a14,a9
jrlo #plot ;Y on screen?
#offscr
movi -1,a0
move a0,*a8(-STARSZ),L
jruc #nxt
#plot
move a10,*a8(-STARSZ),L
move a9,*a8(-STARSZ+32),L
move a6,*a8(-STARSZ+32*2),L
move a5,*a8(-STARSZ+32*3),L
move a1,a0
sll 32-5-CFRAC,a0
add a11,a0
jrc #maxc ;Overflow?
; cmpi 32*4,a1
; jrge #offscr
addk 1,a1
move a1,*a8(-16)
#maxc srl CFRAC,a1 ;Remove fraction
srl 16,a10
movx a10,a9
addxy a12,a9
pixt a1,*a9.XY
#nxt
dsj b0,#lp
PULL b4
PULL a13,a14
movi BAKLST,a0
callr dma_objlst2d
movi OBJLST,a0
jruc dma_objlst2dscl
#star_p
.word 256
COLORW 01,01,01, 02,02,02, 03,03,03, 04,04,04 ;Grey
COLORW 05,05,05, 06,06,06, 07,07,07, 08,08,08
COLORW 09,09,09, 10,10,10, 11,11,11, 12,12,12
COLORW 13,13,13, 14,14,14, 15,15,15, 16,16,16
COLORW 17,17,17, 18,18,18, 19,19,19, 20,20,20
COLORW 21,21,21, 22,22,22, 23,23,23, 24,24,24
COLORW 25,25,25, 26,26,26, 27,27,27, 28,28,28
COLORW 29,29,29, 30,30,30, 31,31,31, 31,31,31
COLORW 01,01,00, 02,02,00, 03,03,00, 04,04,00 ;Yellow
COLORW 05,05,00, 06,06,00, 07,07,00, 08,08,00
COLORW 09,09,00, 10,10,00, 11,11,00, 12,12,00
COLORW 13,13,00, 14,14,00, 15,15,00, 16,16,00
COLORW 17,17,00, 18,18,00, 19,19,00, 20,20,00
COLORW 21,21,00, 22,22,00, 23,23,00, 24,24,00
COLORW 25,25,00, 26,26,00, 27,27,00, 28,28,00
COLORW 29,29,00, 30,30,00, 31,31,00, 31,31,00
COLORW 01,00,00, 02,00,00, 03,00,00, 04,00,00 ;Red
COLORW 05,00,00, 06,00,00, 07,00,00, 08,00,00
COLORW 09,00,00, 10,00,00, 11,00,00, 12,00,00
COLORW 13,00,00, 14,00,00, 15,00,00, 16,00,00
COLORW 17,00,00, 18,00,00, 19,00,00, 20,00,00
COLORW 21,00,00, 22,00,00, 23,00,00, 24,00,00
COLORW 25,00,00, 26,00,00, 27,00,00, 28,00,00
COLORW 29,00,00, 30,00,00, 31,00,00, 31,00,00
COLORW 00,01,00, 00,02,00, 00,03,00, 00,04,00 ;Green
COLORW 00,05,00, 00,06,00, 00,07,00, 00,08,00
COLORW 00,09,00, 00,10,00, 00,11,00, 00,12,00
COLORW 00,13,00, 00,14,00, 00,15,00, 00,16,00
COLORW 00,17,00, 00,18,00, 00,19,00, 00,20,00
COLORW 00,21,00, 00,22,00, 00,23,00, 00,24,00
COLORW 00,25,00, 00,26,00, 00,27,00, 00,28,00
COLORW 00,29,00, 00,30,00, 00,31,00, 00,31,00
COLORW 00,00,01, 00,00,02, 00,00,03, 00,00,04 ;Blue
COLORW 00,00,05, 00,00,06, 00,00,07, 00,00,08
COLORW 00,00,09, 00,00,10, 00,00,11, 00,00,12
COLORW 00,00,13, 00,00,14, 00,00,15, 00,00,16
COLORW 00,00,17, 00,00,18, 00,00,19, 00,00,20
COLORW 00,00,21, 00,00,22, 00,00,23, 00,00,24
COLORW 00,00,25, 00,00,26, 00,00,27, 00,00,28
COLORW 00,00,29, 00,00,30, 00,00,31, 00,00,31
COLORW 00,00,01, 00,00,02, 00,00,03, 00,00,04 ;Lt blue
COLORW 00,00,05, 00,00,06, 00,00,07, 00,00,08
COLORW 00,00,09, 01,01,10, 02,02,11, 03,03,12
COLORW 04,04,13, 05,05,14, 06,06,15, 07,07,16
COLORW 08,08,17, 09,09,18, 10,10,19, 11,11,20
COLORW 12,12,21, 14,14,22, 16,16,23, 18,18,24
COLORW 20,20,25, 22,22,26, 24,24,27, 26,26,28
COLORW 28,28,29, 30,30,30, 30,30,31, 31,31,31
COLORW 01,00,01, 02,00,02, 03,00,03, 04,00,04 ;Purple
COLORW 05,00,05, 06,00,06, 07,00,07, 08,00,08
COLORW 09,00,09, 10,00,10, 11,00,11, 12,00,12
COLORW 13,00,13, 14,00,14, 15,00,15, 16,00,16
COLORW 17,00,17, 18,00,18, 19,00,19, 20,00,20
COLORW 21,00,21, 22,00,22, 23,00,23, 24,00,24
COLORW 25,00,25, 26,00,26, 27,00,27, 28,00,28
COLORW 29,00,29, 30,00,30, 31,00,31, 31,00,31
COLORW 00,01,01, 00,02,02, 00,03,03, 00,04,04 ;Cyan
COLORW 00,05,05, 00,06,06, 00,07,07, 00,08,08
COLORW 00,09,09, 00,10,10, 00,11,11, 00,12,12
COLORW 00,13,13, 00,14,14, 00,15,15, 00,16,16
COLORW 00,17,17, 00,18,18, 00,19,19, 00,20,20
COLORW 00,21,21, 00,22,22, 00,23,23, 00,24,24
COLORW 00,25,25, 00,26,26, 00,27,27, 00,28,28
COLORW 00,29,29, 00,30,30, 00,31,31, 00,31,31
********************************
* Get random # with mask
* A0=Mask
* >A0=Rnd # (Pass CC)
* Trashes scratch
SUBRP rnd
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
and a1,a0
rets
********************************
* Zeros velocities for all objects on OBJLST
STOPOBJS
clr a0
movi OBJLST,a1
jruc so20
so10 move a0,*a1(OXVEL),L
move a0,*a1(OYVEL),L
move a0,*a1(OZVEL),L
so20 move *a1,a1,L
jrnz so10
rets
********************************
* Sort object list in Z:Y priority
* Trashes A0-A7
.align
SUBR obj_yzsort
movi OBJLST,a0
movk 1,a1 ;Lowest Z
sll 31,a1 ;Make >80000000
jruc yzlp
yz0 move *a2(OZPOS),a6 ;Get Z
move *a2(OYPOS),a7 ;Get Y
cmp a1,a6
jrgt priok ;Next Z > Current Z?
jrlt priswap
cmp a5,a7
jrge priok ;Next Y > Current Y?
priswap dint ;>Make current after next
move a2,*a4,L ;Point last to next
move *a2,*a0,L ;Point current to block after next
move a0,*a2,L ;Point next to current
eint
move a2,a4
jruc yzlp ;Continue sort of current obj
priok move a0,a4 ;A4=*Last obj
move a2,a0 ;A0=*Current obj
move a6,a1 ;A1=Current Z
move a7,a5 ;A5=Current Y
yzlp move *a0,a2,L ;A2=*Next obj
jrnz yz0
rets
**************************************************************************
* TEST IF OBJECT ON SCREEN
* A8=OBJECT
* RETURNS Z IF ON SCREEN
*ENTER HERE AND PROVIDE YOUR OWN SCREEN BOUNDRIES
SCRTSTG
mmtm sp,a1,a2,a3
jruc scrtst1
*NORMAL SCREEN BOUNDRIES
SCRTST
mmtm sp,a1,a2,a3
move @SCRNTL,a2,L ;Get screen top left
move @SCRNLR,a3,L ;Get screen lower rgt
scrtst1 move *a8(OYPOS),a0
move *a8(OXPOS),a1
sll 16,a0
movx a1,a0 ;get top left of object
move @WORLDTL,a1,L
subxy a1,a0 ;subtract out world base
move *a8(OSIZE),a1,L
addxy a0,a1 ;get lower rt of object
cmpxy a3,a0 ;is it lower than lower rt?
JRYGE scrtf_d ;lower
JRXGE scrtf_r ;to the right
cmpxy a2,a1
JRYLE scrtf_u ;above...
JRXLE scrtf_l ;to the left..
mmfm sp,a1,a2,a3
clr a0 ;On screen Z
rets
scrtf_l movi 1,a0 ;Pass NZ
mmfm sp,a1,a2,a3
rets
scrtf_r movi 2,a0
mmfm sp,a1,a2,a3
rets
scrtf_u movi 3,a0
mmfm sp,a1,a2,a3
rets
scrtf_d movi 4,a0
mmfm sp,a1,a2,a3
rets
#*******************************
* Initialize display system
* Trashes scratch
SUBR display_init
pushst
dint
movi DIE+X2E,a0
move a0,@INTENB ;Display int on, DMA int off
clr a0
move a0,@DMACTRL ;>Init DMA
move a0,@DMACTRL
move a0,@CMAPSEL ;Clear color map select
move a0,@DMATEST
move a0,@DMACONF
movi [511,0],a1 ;L/R (full width to fix glitch)
move a1,@DMAWINDOW,L
movi >30,a1
move a1,@DMACONF ;Top/Bottom
movi [509,0],a1
move a1,@DMAWINDOW,L
movi >1000100,a1
move a1,@DMASCALEX,L
movi -1,b13 ;DMAQ cnt
clr a1 ;>Clr video mem
movi (SCRNE-512*8*2)/64,b0
#clp move a0,*a1+,L
move a0,*a1+,L
dsj b0,#clp
;>Set autoerase lines
movi 510*512*8,a1 ;Store to last 2 lines of bitmap
movi ERASECOL,a14 ;Color pair
movi 512*8*2/16,b0
#lp move a14,*a1+
dsj b0,#lp
movi SCRNST,a1 ;Screen top left [Y,X]
move a1,@SCRNTL,L
movi SCRNEND,a1 ;Screen lower right [Y,X]
move a1,@SCRNLR,L
move a0,@WORLDTLX,L
move a0,@WORLDTLY,L
move a0,@WORLDTL,L
move a0,@SCROLLX,L
move a0,@SCROLLY,L
move a0,@BAKLST,L ;Null backgnd object list
move a0,@OBJLST,L ;Null object list
move a0,@dcode_p,L
movi DMAQ+QMSIZE,a1
move a1,@DMAQCUR,L ;Init misc DMA queue
movi OBJSTR,a1,L ;>Init free list
move a1,@OFREE,L
movi NOBJ,b0 ;# of object blocks
#olp move a1,a14
addi OBSIZ,a1
move a1,*a14,L ;link em up
dsj b0,#olp
move a0,*a14,L ;Null end
popst
rets
********************************
* Get a free object block
* Trashes scratch
* >A0=*Object or 0 (Z)
GETOBJ
move @OFREE,a0,L
jrz nonelft ;None free?
move *a0,a1,L
move a1,@OFREE,L ;Unlink
clr a1
move a1,*a0(OPLINK),L
move a1,*a0(ODATA_p),L
getox
move a0,a0
rets
nonelft
.if DEBUG
LOCKUP
eint
.else
CALLERR 3,0
.endif
jruc getox
********************************
* Add object to free list
* Can trash A0-A1 (currently doesn't)
FREEOBJ
move @OFREE,*a0+,L
subk 32,a0
move a0,@OFREE,L
rets
#*******************************
* Unlink an object from object list
* A0=*Obj
* Trashes scratch
; SUBR obj_unlink
;
; movi OBJLST,a14
;
;#lp move a14,a1 ;A1=*Prev
; move *a14,a14,L ;A14=*Next
; jrz #err
; cmp a14,a0
; jrne #lp
;
; move *a0,*a1,L ;Unlink from obj list
; rets
;
;#err
; .if DEBUG
; LOCKUP
; eint
; .endif
; rets
********************************
* Insert an object block into an object list
* List is sorted by increasing z and increasing y within constant z
#*******************************
* Insert background object
* A0=*Obj
* Trashes scratch
INSBOBJ
movi BAKLST,a14
jruc #strt
********************************
* Insert foreground object
* A0=*Obj
* Trashes scratch
INSOBJ
movi OBJLST,a14
#strt PUSH a2,a3,a4
move *a0(OZPOS),a1
move *a0(OYPOS),a4
#lp
move a14,a2 ;A2=*prev
move *a14,a14,L ;A14=*next
jrz #x
move *a14(OZPOS),a3
cmp a3,a1
jrgt #lp
jrlt #x
move *a14(OYPOS),a3 ;Test y position
cmp a3,a4
jrgt #lp
#x move a14,*a0,L ;Put *next in new block
move a0,*a2,L ;Put *new in prev block
PULL a2,a3,a4
rets
#*******************************
* Delete background object
* A0=*Obj
DELBOBJ
movi BAKLST,a14
jruc #lp
********************************
* Delete foreground object
* A8=*Obj
DELOBJA8
move a8,a0
********************************
* Delete foreground object
* A0=*Obj
* Trashes scratch
DELOBJ
movi OBJLST,a14
#lp move a14,a1 ;A1=*Prev
move *a14,a14,L ;A14=*Next
jrz delerr
cmp a14,a0
jrne #lp
move *a0,*a1,L ;Unlink from obj list
clr a1
move a1,*a0(OXPOS) ;Indicates not in use for collisions
move @OFREE,*a0+,L ;Add to free list
subk 32,a0
move a0,@OFREE,L
#x rets
delerr
.if DEBUG
LOCKUP
eint
.else
CALLERR 1,0
.endif
jruc #x
********************************
* FRANIM list an object, delete it and DIE
* A8=*Obj
* A9=*FRANIM list
FRQDELDIE
JSRP FRANIMQ
#*******************************
* Delete foreground object and DIE
* A8=*Obj
DELOBJDIE
movi OBJLST,a14
#lp move a14,a1 ;A1=*Prev
move *a14,a14,L ;A14=*Next
jrz doderr
cmp a14,a8
jrne #lp
move *a8,*a1,L ;Unlink from obj list
clr a1
move a1,*a8(OXPOS) ;Indicates not in use for collisions
move @OFREE,*a8+,L ;Add to free list
subk 32,a8
move a8,@OFREE,L
#x jauc SUCIDE
doderr
.if DEBUG
LOCKUP
eint
.else
CALLERR 1,0
.endif
jruc #x
#*******************************
* Delete one class from the obj list
* A0=OID
* Trashes scratch
obj_del1c
clr a1
********************************
* Delete a class from the obj list
* A0=OID
* A1=!Mask (Bits to remove)
* Trashes scratch
obj_delc
move a2,b0
move a3,b1
movi OBJLST,a14
sext a0
andn a1,a0 ;Form match
#lp move a14,a3 ;A3=*Prev
move *a14,a14,L ;A14=*Next
jrz #x
#cmp move *a14(OID),a2
cmpi TRANS_OBJ_ID,a2 ;transition effect obj. ?
jreq #lp ;br=yes
andn a1,a2 ;Mask
cmp a0,a2
jrne #lp
move *a14,*a3,L ;Unlink from obj list
move @OFREE,*a14+,L ;Add to free list
subk 32,a14
move a14,@OFREE,L
move *a3,a14,L
jrnz #cmp
#x
move b1,a3
move b0,a2
rets
**********************************************
* Delete the TRANSITION objs from the obj list
* A0=OID
* Trashes scratch
del_transition_objs
move a2,b0
move a3,b1
movi OBJLST,a14
; sext a0
#dto_1 move a14,a3 ;A3=*Prev
move *a14,a14,L ;A14=*Next
jrz #x1
#cmp1 move *a14(OID),a2
cmp a0,a2
jrne #dto_1
move *a14,*a3,L ;Unlink from obj list
move @OFREE,*a14+,L ;Add to free list
subk 32,a14
move a14,@OFREE,L
move *a3,a14,L
jrnz #cmp1
#x1 move b1,a3
move b0,a2
rets
#*******************************
* Check objlst for an object with a certain OID
* A0=OID
* A1=!Mask (Bits to remove)
* >A0=*Obj or 0 (Z)
* Trashes scratch
EXISTOBJ
move a2,b0
movi OBJLST,a14
sext a0
andn a1,a0 ;Form match
#lp
move *a14,a14,L
jrz #x
move *a14(OID),a2
andn a1,a2 ;Mask
cmp a0,a2
jrne #lp
#x move b0,a2
move a14,a0
rets
#*******************************
* Check if object on free list
* A0=*Obj
* >A0=*Obj or 0 (Z)
* Trashes scratch
;ISFREE
; movi OFREE,a1
; jruc #lp
********************************
* Check if object on OBJLST
* A0=*Obj
* >A0=*Obj or 0 (Z)
* Trashes scratch
ISOBJ
movi OBJLST,a1
#lp move *a1,a1,L
jrz #x ;End?
cmp a0,a1
jrne #lp ;No match?
move a0,a0 ;Clr Z
rets
#x clr a0 ;Set Z
rets
********************************
* Add world coordinates to an object
* A0=*Obj
* Trashes scratch, !A0
SUBR obj_addworldxy
move @WORLDTLX,a14,L
move *a0(OXVAL),a1,L
add a14,a1
move a1,*a0(OXVAL),L
move @WORLDTLY,a14,L
move *a0(OYVAL),a1,L
add a14,a1
move a1,*a0(OYVAL),L
rets
**************************************************************************
* *
* ADJNEWTL - ADJUST AN OBJECT TO A NEW SET OF X,Y WORLD COORDINATES *
* BEFORE THEY ARE STORED(TAKE EFFECT). *
* NOTE: CURRENT OBJECT COORDS. MUST BE ABSOLUTE WORLD. *
* A0 = PTR TO OBJECT *
* A4 = NEW WTLX, 32 BITS *
* A5 = NEW WTLY, 32 BITS *
ADJNEWTL
PUSH a1,a2
CALLR GSCRNREL ;SCREEN RELATIVE PLEASE
ADD A4,A1
ADD A5,A2 ;ADJUST
MOVE A1,*A0(OXVAL),L
MOVE A2,*A0(OYVAL),L ;STORE
PULL a1,a2
RETS
**************************************************************************
* *
* GSCRNREL - GET THE SCREEN RELATIVE X,Y COORDINATES OF AN OBJECT *
* IT IS ASSUMED THATE THE CURRENT X,Y COORDINATES ARE *
* WORLD ABSOLUTE. *
* A0 = PTR TO THE OBJECT BLOCK *
* RETURNS *
* A1 = X SCREEN RELATIVE, 32 BITS *
* A2 = Y SCREEN RELATIVE, 32 BITS *
GSCRNREL
PUSH a5
MOVE @WORLDTLX,A5,L
MOVE *A0(OXVAL),A1,L
SUB A5,A1
MOVE @WORLDTLY,A5,L
MOVE *A0(OYVAL),A2,L
SUB A5,A2
PULL a5
RETS
**************************************************************************
* *
* SCRNRELV - MAKE THE X & Y VELOCITIES OF AN OBJECT RELATIVE TO THE *
* SCREEN. IN OTHER WORDS, ADJUST THEM SO THAT THE CURRENT *
* SCROLL RATE DOESN'T AFFECT THEM. *
* A0 = PTR TO OBJECT *
* *
**************************************************************************
SCRNRELV
PUSH a1,a5
MOVE @SCROLLX,A5,L
MOVE *A0(OXVEL),A1,L
ADD A5,A1
MOVE A1,*A0(OXVEL),L
MOVE @SCROLLY,A5,L
MOVE *A0(OYVEL),A1,L
ADD A5,A1
MOVE A1,*A0(OYVEL),L
PULL a1,a5
RETS
********************************
* Adjust current object image with respect to it's anipt and flip flags
* A0=*Object
* A2=New YVAL
* A3=New XVAL
* A4=New FLAGS (Only DMA bits)
* Trashes A1,A14,B0-B1
* >A2=Adjusted YVAL
* >A3=Adjusted XVAL
GANISAG
PUSH a4,a6,a7
PUSH a2
move *a0(OIMG),a1,L
move *a1,a2,L ;ISIZE
move a2,*a0(OSIZE),L
callr GANIOF
PULL a2
sub a6,a3
sub a7,a2 ;adjust upper left corner
move a3,*a0(OXVAL),L
move a2,*a0(OYVAL),L
move *a1(ICTRL),a1 ;Get DMA flags
andi >803f,a4 ;Kill mode bits
or a1,a4
move a4,*a0(OCTRL),L ;&OFFSET
PULL a4,a6,a7
rets
********************************
* Begin an object
* A0=XVAL, A1=YVAL, A2=*IMG, A3=ZPOS, A4=FLAGS, A5=OID, A6=XVEL, A7=YVEL
* >A8=*Obj
* Trashes scratch
BEGINOBJ
move @WORLDTLX,a8,L ;Adjust for world coord
add a8,a0
btst B_3D,a4
jrnz BEGINOBJ2 ;No Y add for 3D?
move @WORLDTLY,a8,L
add a8,a1
BEGINOBJ2
PUSH a2,a3,a4,a6,a7,a9,a10
move a0,a9 ;X
move a1,a10 ;Y
move *a2(ICMAP),a0,L ;Get *palette
.if DEBUG
jrnn bopalerr ;No pallette?
.endif
calla pal_getf
bo20 move @OFREE,a8,L ;Pointer to next available obj block
jrz begobjerr ;No objs?
move *a8,a1,L
move a1,@OFREE,L ;Adjust pointer to free list
move a0,*a8(OPAL),L ;Set pallette & constant
clr a0
move a0,*a8(ODATA_p),L ;Clr stuff
move a0,*a8(OXANI),L
move a0,*a8(OZVEL),L
move a0,*a8(OMISC)
;oscale
movi 01000100H,a0
move a0,*a8(OSCALE),L
move a3,*a8(OZPOS)
move a5,*a8(OID)
move a6,*a8(OXVEL),L
move a7,*a8(OYVEL),L
move a2,a1 ;*Img
move *a1,a2,L ;ISIZE
callr GANIOF ;Adjust animation offset
move *a1(ISAG),a3,L ;Get top left sag
sub a6,a9 ;- x anioff
sub a7,a10 ;- y anioff
move a9,*a8(OXVAL),L
move a10,*a8(OYVAL),L
move a1,*a8(OIMG),L
move a2,*a8(OSIZE),L
move a3,*a8(OSAG),L
move a4,*a8(OFLAGS)
move *a1(ICTRL),a0 ;Get DMA flags
andi >803f,a4 ;Kill mode bits
or a0,a4
move a4,*a8(OCTRL),L ;&OFSET
PULL a2,a3,a4,a6,a7,a9,a10
move a13,*a8(OPLINK),L
move a8,a0
jruc INSOBJ ;Insert object into list
.if DEBUG
bopalerr
LOCKUP ;Object doesn't have pallette!
eint
clr a0
jruc bo20
.endif
begobjerr
.if DEBUG
LOCKUP ;Out of objects!
eint
.else
CALLERR 3,7
.endif
move @OBJLST,a8,L ;Pass 1st obj on list
PULL a2,a3,a4,a6,a7,a9,a10
rets
#*******************************
* Begin an object with specified palette
* A0=XVAL, A1=YVAL, A2=*IMG, A3=ZPOS, A4=FLAGS, A5=OID, A6=XVEL, A7=YVEL
* B0=*Palette
* >A8=*Obj
* Trashes scratch
BEGINOBJP
move @WORLDTLX,a8,L ;Adjust for world coord
add a8,a0
btst B_3D,a4
jrnz BEGINOBJP2 ;No Y add for 3D?
move @WORLDTLY,a8,L
add a8,a1
BEGINOBJP2
PUSH a2,a3,a4,a6,a7,a9,a10
move a0,a9 ;X
move a1,a10 ;Y
move b0,a0 ;Get *palette
.if DEBUG
jrnn #bopalerr ;No pallette?
.endif
calla pal_getf
#bo20 move @OFREE,a8,L ;Pointer to next available obj block
jrz begobjerr ;No objs?
move *a8,a1,L
move a1,@OFREE,L ;Adjust pointer to free list
move a0,*a8(OPAL),L ;Set pallette & constant
clr a0
move a0,*a8(ODATA_p),L ;Clr stuff
move a0,*a8(OXANI),L
move a0,*a8(OZVEL),L
move a0,*a8(OMISC)
;oscale
movi 01000100H,a0
move a0,*a8(OSCALE),L
move a3,*a8(OZPOS)
move a5,*a8(OID)
move a6,*a8(OXVEL),L
move a7,*a8(OYVEL),L
move a2,a1 ;*Img
move *a1,a2,L ;ISIZE
callr GANIOF ;Adjust animation offset
move *a1(ISAG),a3,L ;Get top left sag
sub a6,a9 ;- x anioff
sub a7,a10 ;- y anioff
move a9,*a8(OXVAL),L
move a10,*a8(OYVAL),L
move a1,*a8(OIMG),L
move a2,*a8(OSIZE),L
move a3,*a8(OSAG),L
move a4,*a8(OFLAGS)
move *a1(ICTRL),a0 ;Get DMA flags
andi >803f,a4 ;Kill mode bits
or a0,a4
move a4,*a8(OCTRL),L ;&OFSET
PULL a2,a3,a4,a6,a7,a9,a10
move a13,*a8(OPLINK),L
move a8,a0
jruc INSOBJ ;Insert object into list
.if DEBUG
#bopalerr
LOCKUP ;Object doesn't have pallette!
eint
clr a0
jruc #bo20
.endif
#*******************************
* Set new image for an object
* A1=*Image hdr
* A4=New FLAGS
* A8=*Obj
* Trashes A1,A14
SUBR ANI
PUSH a0,a2,a3,a4,a5,a6,a7
cmpi ROM,a1
jrlo anierr
move a1,a3
move a4,a5
move *a8(OIMG),a1,L
move *a8(OCTRL),a4
cmp a1,a3
jrne #1 ;Different img?
sext a5
cmp a4,a5
jreq #x ;All the same?
#1 move *a8(OSIZE),a2,L
callr GANIOF ;Get old animation offset
move a3,a1 ;New OIMG
srl 6,a4
sll 6,a4
or a5,a4 ;Set new OCTRL
move a6,a0
move a7,a5
move *a1(ISAG),a3,L ;Get top left sag
move *a1,a2,L ;ISIZE
callr GANIOF ;Get new animation offset
move a1,*a8(OIMG),L
sub a6,a0 ;Subtract new from old
sub a7,a5
zext a4 ;Zero offset in A4
move a8,a6 ;Get push address of octrl,osag,osize
addi OCTRL+>60,a6
mmtm a6,a2,a3,a4 ;Save new data
subi OCTRL-OXVAL,a6
move *a6,a7,L ;New OXVAL
add a0,a7
move a7,*a6+,L
move *a6,a7,L ;New OYVAL
add a5,a7
move a7,*a6,L
#x PULL a0,a2,a3,a4,a5,a6,a7
rets
anierr
.if DEBUG
LOCKUP
eint
.else
CALLERR 2,7
.endif
jruc #x
#*******************************
* Change an objects image (Doesn't check VFLIP)
* A0=*New image
* A1=New flip flags & const
* A8=*Obj
* Trashes scratch
SUBRP obj_aniq
PUSH a2,a3
cmpi ROM,a0
jrlo #anierr
move a0,a2
move a1,a3
callr anipt_getxy
move a2,*a8(OIMG),L
move *a2(0),*a8(OSIZE),L
move *a2(ISAG),*a8(OSAG),L
setf 5,0,0
move *a2(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits
setf 6,0,0
move a3,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
move a0,a2
move a1,a3
callr anipt_getxy
sub a0,a2 ;Subtract new from old
sub a1,a3
move a8,a0 ;Get base address
addi OXVAL,a0
move *a0,a14,L ;New OXVAL
add a2,a14
move a14,*a0+,L
move *a0,a14,L ;New OYVAL
add a3,a14
move a14,*a0,L
#x PULL a2,a3
rets
#anierr
.if DEBUG
LOCKUP
eint
.else
CALLERR 2,2
.endif
jruc #x
#*******************************
* Get an objects anipt XY (Doesn't check VFLIP)
* A8=*Obj
* >A0=Scaled Ani X (16:16)
* >A1=Scaled Ani Y
* Trashes scratch
SUBRP anipt_getxy
move a2,b0
move *a8(OIMG),a2,L
move *a2(IANIOFFX),a0
sll 16,a0
move *a2(IANIOFFY),a1
sll 16,a1
move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz #x ;No flip?
move *a2,a2 ;ISIZEX
subk 1,a2
sll 16,a2 ;*64K
neg a0
add a2,a0 ;+size
#x move b0,a2
rets
#*******************************
* Change an objects image (doesn't check flip flags)
* A0=*New image
* A1=New OCTRL
* A8=*Obj
* Trashes scratch
SUBRP obj_aniq_cnoff
move a2,b0
move a1,*a8(OCTRL) ;Write new ctrl
move *a8(OIMG),a14,L
move *a14(IANIOFFX),a2
move *a14(IANIOFFY),a14
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
move *a0(IANIOFFY),a1
move *a0(IANIOFFX),a0
sub a0,a2 ;Subtract new from old
sub a1,a14
sll 16,a2
sll 16,a14
move a8,a0 ;Get base address
addi OXVAL,a0
move *a0,a1,L ;New OXVAL
add a2,a1
move a1,*a0+,L
move *a0,a1,L ;New OYVAL
add a14,a1
move a1,*a0,L
move b0,a2
rets
#*******************************
* Change an scaled objects image (Doesn't check VFLIP)
* A0=*New image
* A1=New OCTRL (low 8 bits)
* A8=*Obj
* Trashes scratch, A2,A3
.ref anipt_getsclxy
SUBRP obj_aniq_scld
cmpi ROM,a0
jrlo #anierr
move a0,a2
move a1,a3
calla anipt_getsclxy
movb a3,*a8(OCTRL)
move a2,*a8(OIMG),L
move *a2(0),*a8(OSIZE),L
move *a2(ISAG),*a8(OSAG),L
move a0,a2
move a1,a3
calla anipt_getsclxy
sub a0,a2 ;Subtract new from old
sub a1,a3
move a0,*a8(OXANI),L ;Save scaled anipt
move a8,a0 ;Get base address
addi OXVAL,a0
move *a0,a14,L ;New OXVAL
add a2,a14
move a14,*a0+,L
move *a0,a14,L ;New OYVAL
add a3,a14
move a14,*a0,L
#x rets
#anierr
.if DEBUG
LOCKUP
eint
.else
CALLERR 2,0
.endif
jruc #x
********************************
* Get the x and y positions of an objects animation point
* A8=*Object
* Trashes scratch
* >A2=Ani pt Y 16:16
* >A3=Ani pt X 16:16
GETANIXY
PUSH a4,a6,a7
move *a8(OIMG),a1,L
move *a8(OSIZE),a2,L
move *a8(OCTRL),a4
callr GANIOF
move *a8(OXVAL),a3,L
move *a8(OYVAL),a2,L
add a6,a3
add a7,a2
PULL a4,a6,a7
rets
#********************************
* Get animation offset (Fast!)
* A1=*Image header, A2=H:W, A4=OCTRL
* Trashes A14
*Rets:
* A6=X ani offset * 64K
* A7=Y ani offset * 64K
GANIOF
move *a1(IANIOFF),a6,L
cmpi ROM,a1
jrlo #err
#h clr a7
movy a6,a7
sll 16,a6 ;Move to upper word
btst B_FLIPH,a4
jrz #v
move a2,a14
subk 1,a14
sll 16,a14 ;Move W to upper word
neg a6
add a14,a6 ;Sub Width-1
#v btst B_FLIPV,a4
jrz #x
move a2,a14
neg a7
srl 16,a14
subk 1,a14
sll 16,a14
add a14,a7 ;Sub Hgt-1
#x rets
#err clr a6
jruc #h
#*******************************
* Scale screen out (JSRP)
.asg MEGBIT0,SCRNBUF
.asg MEGBIT1,PALBUF
.bss scrnscl ,16
SUBR scrn_scaleout
movk 1,a0
move a0,@HALT
move @dtype,a0
PUSHP a0
move @gndstat,a0
PUSHP a0
movi >160,a0
move a0,@scrnscl
movi #initcode,a0
move a0,@dcode_p,L
movi -1,a0
move a0,@dtype
clr a0
move a0,@gndstat
move a0,@IRQSKYE
#lp SLEEPK 1
movi scrnscl,a14
move *a14,a5
move a5,a0
srl 3,a0
add a0,a5
move a5,*a14
cmpi >7000,a5
jrlt #lp
clr a0
move a0,@dcode_p,L
PULLP a0
move a0,@gndstat
PULLP a0
move a0,@dtype
RETP
#initcode
callr scrn_copy
movi scrn_scale,a0
move a0,@dcode_p,L
jump a0
#*******************************
* Initialization for scrn_scalein (JSRP)
SUBR scrn_scaleininit
dint
#lp move @VCOUNT,a0
cmpi EOSINT,a0
jrlt #lp
move @HSBLNK,a0 ;Blank screen
move a0,@HEBLNK
eint
SLEEPK 2
RETP
#*******************************
* Scale screen in (JSRP)
SUBR scrn_scalein
PUSHP a8
move @HALT,a0
PUSHP a0
movk 1,a0
move a0,@HALT
move @dtype,a0
PUSHP a0
move @gndstat,a0
PUSHP a0
move @dcode_p,a0,L
PUSHP a0
movi >7000,a0
move a0,@scrnscl
movi #initcode,a0
move a0,@dcode_p,L
movi -1,a0
move a0,@dtype
clr a0
move a0,@gndstat
.if DEBUG
; movi >1a0,a0
; move a0,@scrnscl
; SLEEP TSEC*2
.endif
#lp SLEEPK 1
movi scrnscl,a14
move *a14,a5
move a5,a0
srl 2,a0
sub a0,a5
move a5,*a14
cmpi >100,a5
jrgt #lp
PULLP a0
move a0,@dcode_p,L
PULLP a0
move a0,@gndstat
PULLP a0
move a0,@dtype
PULLP a0
move a0,@HALT
PULLP a8
RETP
#initcode
callr scrn_copy
movi scrn_scaledison,a0
move a0,@dcode_p,L
jruc scrn_scale
#*******************************
* B2=Y offset for top of page : XPad offset
* Trashes A0-A3,A7
SUBRP scrn_copy
;
; THIS COULD BE A PROBLEM....
;
move b2,a0
srl 16,a0
xori >100,a0 ;Flip to the page being shown
sll 12,a0 ;*512*8
addi SCRNXP*8,a0 ;A0=*Scrn mem
PUSH a0
movi SCRNBUF,a1
movi 254,a3
movi (512-400)*8,a7
#cslp
movi 400/16,a2
#cslp2
move *a0+,*a1+,L
move *a0+,*a1+,L
move *a0+,*a1+,L
move *a0+,*a1+,L
dsj a2,#cslp2
add a7,a0
add a7,a1
dsj a3,#cslp
move @SYSCOPY,a0
.if WWFUNIT
andni PALENB,a0
move a0,@SYSCOPY
.if DEBUG
andni LEDON,a0
ori WROMINTCLR,a0
.endif
.else
andni 100000b,a0
move a0,@SYSCOPY
.if DEBUG
andni 1000000b,a0
.endif
.endif
move a0,@SYSCTRL
PULL a0
movi PALBUF,a1
movi 254,a3
#cplp
movi 400/16,a2
#cplp2
move *a0+,*a1+,L
move *a0+,*a1+,L
move *a0+,*a1+,L
move *a0+,*a1+,L
dsj a2,#cplp2
add a7,a0
add a7,a1
dsj a3,#cplp
move @SYSCOPY,a0
.if WWFUNIT
ori PALENB,a0
move a0,@SYSCOPY
.if DEBUG
andni LEDON,a0
ori WROMINTCLR,a0
.endif
.else
; ori 100000b,a0
move a0,@SYSCOPY
.if DEBUG
andni 1000000b,a0
.endif
.endif
move a0,@SYSCTRL
rets
#*******************************
* Copy screen data (throw out 1 in 5 pixels)
* B2=Y offset for top of page : XPad offset
SUBRP scrn_scale140
PUSH a4,a14
movi >140,a5
move b2,a1
srl 16,a1
addi 25,a1
sll 12,a1 ;*512*8
addi SCRNXP*8+40*8,a1 ;A1=*Scrn mem
movi DMACMAP,a6
clr a7 ;Y line 8:8
#lp
move a7,a2
srl 8,a2
sll 12,a2 ;*512*8
move a2,a3
addi SCRNBUF,a2
addi PALBUF,a3
movi 400/2/5,b0 ;Copy 1 line
#cslp
move *a3,*a6 ;Set pal latch
addk 16,a3
move *a2+,*a1+ ;Copy 2 pixels
move *a3,*a6
addk 16,a3
move *a2+,*a1+
move *a3,*a6
addk 16,a3
move *a2+,*a1+
move *a3,*a6
addk 16,a3
move *a2+,*a1+
addk 16,a3
addk 16,a2
dsj b0,#cslp
addi (512-320)*8,a1
add a5,a7
cmpi 254<<8,a7
jrlt #lp
#x PULL a4,a14
rets
#*******************************
* Copy screen data (throw out 1 in 3 pixels)
* B2=Y offset for top of page : XPad offset
SUBRP scrn_scale180
PUSH a4,a14
movi >180,a5
move b2,a1
srl 16,a1
addi 42,a1
sll 12,a1 ;*512*8
addi SCRNXP*8+68*8,a1 ;A1=*Scrn mem
movi DMACMAP,a6
clr a7 ;Y line 8:8
#lp
move a7,a2
srl 8,a2
sll 12,a2 ;*512*8
move a2,a3
addi SCRNBUF,a2
addi PALBUF,a3
movi 400/2/3,b0 ;Copy 1 line
#cslp
move *a3,*a6 ;Set pal latch
addk 16,a3
move *a2+,*a1+ ;Copy 2 pixels
move *a3,*a6
addk 16,a3
move *a2+,*a1+
addk 16,a3
addk 16,a2
dsj b0,#cslp
addi (512-264)*8,a1
add a5,a7
cmpi 254<<8,a7
jrlt #lp
#x PULL a4,a14
rets
********************************
SUBRP scrn_scaledison
movi HEBLNKINIT,a0 ;Display on
move a0,@HEBLNK
movi scrn_scale,a0
move a0,@dcode_p,L
#*******************************
* Copy screen data with variable down scaling
* B2=Y offset for top of page : XPad offset
SUBRP scrn_scale
move @scrnscl,a5
cmpi >168,a5
jrlt scrn_scale140
cmpi >190,a5
jrlt scrn_scale180
PUSH a4,a14
move b2,a9
srl 16,a9
movi 127<<8,a3
divu a5,a3
sub a3,a9
addi 127,a9
sll 12,a9 ;*512*8
addi (SCRNXP+200)*8,a9 ;A9=*Scrn mem
movi 100<<8,a3
divu a5,a3
sll 4,a3 ;*16
sub a3,a9
movi DMACMAP,a6
clr a7 ;Y line 8:8
movi 200<<8,a10
#lp
move a7,a2
srl 8,a2
sll 12,a2 ;*512*8
move a2,a3
move a9,a1
addi SCRNBUF,a2
addi PALBUF,a3
clr a8 ;X 8:8
#cslp
move *a3,*a6 ;Set pal latch
move *a2,*a1 ;Copy 2 pixels
addk 16,a1
move a8,a0
add a5,a8
sra 8,a0
move a8,a14
sra 8,a14
sub a0,a14
#nxtp
addk 16,a3
addk 16,a2
subk 1,a14
jrgt #nxtp
cmp a10,a8
jrlt #cslp
addi 512*8,a9 ;Next line
add a5,a7
cmpi 254<<8,a7
jrlt #lp
#x PULL a4,a14
rets
#*******************************
* Object Z scaling math values
*
* Scale base constants to derive everything else from
*
;Original set
; .asg >180,S_XBEG ;Begining scale values for
; .asg >180,S_YBEG ; ref plyr (6'8") @ crt tp
;
; .asg >100,S_XEND ;Ending scale values for
; .asg >100,S_YEND ; ref plyr (6'8") @ crt bt
.asg >188,S_XBEG ;Begining scale values for
.asg >180,S_YBEG ; ref plyr (6'8") @ crt tp
.asg >100,S_XEND ;Ending scale values for
.asg >f8,S_YEND ; ref plyr (6'8") @ crt bt
.asg 1024,Sp_XRES ;Scale parameter resolutions
.asg 1024,Sp_YRES ; (># = bigger image)
;
; Court area element cnts
;
.asg 0,TOP_PAD ;Pad @ Z bt
.eval (CZMIN-GZMIN)/16, TOP_C ;Z bt to crt tp
.eval (CZMAX-GZMIN)/16-TOP_C, CRT_C ;Crt tp to crt bt
.eval (GZMAX-GZMIN)/16-TOP_C-CRT_C,BOT_C ;Crt bt to Z bt
.asg 8,BOT_PAD ;Pad @ Z tp
;
; Scale-rate subregion element cnts
;
;Original set
; .eval TOP_PAD+TOP_C, TOPRGN_C
; .eval CRT_C*3/8, RGN1_C
; .eval CRT_C*3/8, RGN2_C
; .eval CRT_C-RGN2_C-RGN1_C,RGN3_C
; .eval BOT_PAD+BOT_C, BOTRGN_C
.eval TOP_PAD+TOP_C, TOPRGN_C
.eval CRT_C*3/8, RGN1_C
.eval CRT_C*3/8, RGN2_C
.eval CRT_C-RGN2_C-RGN1_C,RGN3_C
.eval BOT_PAD+BOT_C, BOTRGN_C
;
; Scale-rate subregion rate fractions
;
;Original set
; .asg 1/8,TOPRGN_Fr
; .asg 2/8,RGN1_Fr
; .asg 5/8,RGN2_Fr
; .asg 8/8,RGN3_Fr
; .asg 0/8,BOTRGN_Fr
.asg 1/8,TOPRGN_Fr
.asg 3/8,RGN1_Fr
.asg 5/8,RGN2_Fr
.asg 8/8,RGN3_Fr
.asg 0/8,BOTRGN_Fr
;
; Scale math constants
;
Sk_XDRS .equ 1024*256 ;Scale dividend resolutions
Sk_YDRS .equ 1024*256 ; (do not change;see Sp_?RES)
Sk_XDIV .equ 1024*Sk_XDRS ;Scale calc values
Sk_YDIV .equ 1024*Sk_YDRS ; (do not change;see Sp_?RES)
Rk_XDIV .equ 1024*1024 ;Scale ratio calc values
Rk_YDIV .equ 1024*1024 ; (do not change;see Sp_?RES)
;
; Scale math constants - calculated
;
.asg 32,Fk ;Fraction multiplier
.eval Fk*RGN1_C*RGN1_Fr,FrC
.eval FrC+Fk*RGN2_C*RGN2_Fr,FrC
.eval FrC+Fk*RGN3_C*RGN3_Fr,FrC
.eval Fk*Sk_XDRS/S_XBEG,Sk_Xb
.eval Fk*Sk_YDRS/S_YBEG,Sk_Yb
.eval Fk*Sk_XDRS/S_XEND,Sk_Xe
.eval Fk*Sk_YDRS/S_YEND,Sk_Ye
;--------------------
; Scaler-table macro
;
SCLT .macro sxb,syb,sxe,sye
.eval :sxb:*Sp_XRES,X
.eval :syb:*Sp_YRES,Y
.eval (:sxe:-:sxb:)*Fk*Sp_XRES/FrC,Xr
.eval (:sye:-:syb:)*Fk*Sp_YRES/FrC,Yr
.eval X-TOPRGN_C*Xr*TOPRGN_Fr,X ;Pull back so initial # is
.eval Y-TOPRGN_C*Yr*TOPRGN_Fr,Y ; still for top of court
.loop TOPRGN_C
.word Sk_XDIV/(X/Fk), Sk_YDIV/(Y/Fk)
.word Rk_XDIV/(Sk_XDIV/(X/Fk)), Rk_YDIV/(Sk_YDIV/(Y/Fk))
.eval X+Xr*TOPRGN_Fr,X
.eval Y+Yr*TOPRGN_Fr,Y
.endloop
.loop RGN1_C
.word Sk_XDIV/(X/Fk), Sk_YDIV/(Y/Fk)
.word Rk_XDIV/(Sk_XDIV/(X/Fk)), Rk_YDIV/(Sk_YDIV/(Y/Fk))
.eval X+Xr*RGN1_Fr,X
.eval Y+Yr*RGN1_Fr,Y
.endloop
.loop RGN2_C
.word Sk_XDIV/(X/Fk), Sk_YDIV/(Y/Fk)
.word Rk_XDIV/(Sk_XDIV/(X/Fk)), Rk_YDIV/(Sk_YDIV/(Y/Fk))
.eval X+Xr*RGN2_Fr,X
.eval Y+Yr*RGN2_Fr,Y
.endloop
.loop RGN3_C
.word Sk_XDIV/(X/Fk), Sk_YDIV/(Y/Fk)
.word Rk_XDIV/(Sk_XDIV/(X/Fk)), Rk_YDIV/(Sk_YDIV/(Y/Fk))
.eval X+Xr*RGN3_Fr,X
.eval Y+Yr*RGN3_Fr,Y
.endloop
.loop BOTRGN_C
.word Sk_XDIV/(X/Fk), Sk_YDIV/(Y/Fk)
.word Rk_XDIV/(Sk_XDIV/(X/Fk)), Rk_YDIV/(Sk_YDIV/(Y/Fk))
.eval X+Xr*BOTRGN_Fr,X
.eval Y+Yr*BOTRGN_Fr,Y
.endloop
.endm
;--------------------
; Object Z scaling tables
;scalehead_t SCLT Sk_Xb*625/800,Sk_Yb*625/800,Sk_Xe*625/800,Sk_Ye*625/800
scalehead_t SCLT Sk_Xb*580/800,Sk_Yb*580/800,Sk_Xe*580/800,Sk_Ye*580/800
scalebighead_t SCLT Sk_Xb*840/800,Sk_Yb*840/800,Sk_Xe*840/800,Sk_Ye*840/800
scalehugehead_t SCLT Sk_Xb*1100/800,Sk_Yb*1100/800,Sk_Xe*1100/800,Sk_Ye*1100/800
;Original set
; .asg 88/100,KT
; .asg 95/100,Kt
; .asg 105/100,Kn
; .asg 115/100,Kf
; .asg 122/100,KF
;Mod 1 - larger than original set
; .asg 100/100,KT
; .asg 106/100,Kt
; .asg 116/100,Kn
; .asg 125/100,Kf
.asg 132/100,KF
;Mod 2 - a little less large than mod 1
; .asg 97/100,KT
; .asg 102/100,Kt
; .asg 112/100,Kn
; .asg 124/100,Kf
; .asg 131/100,KF
;Mod 3 - a bump from 2
.asg 97/100,KT
.asg 102/100,Kt
.asg 110/100,Kn
.asg 118/100,Kf
.asg 124/100,KF
scale_t ;Start of large-image scale tables
scale57_t SCLT Sk_Xb*Kn*670/800,Sk_Yb*670/800,Sk_Xe*Kn*670/800,Sk_Ye*670/800
scale57et_t SCLT Sk_Xb*KT*670/800,Sk_Yb*670/800,Sk_Xe*KT*670/800,Sk_Ye*670/800
scale57t_t SCLT Sk_Xb*Kt*670/800,Sk_Yb*670/800,Sk_Xe*Kt*670/800,Sk_Ye*670/800
scale57f_t SCLT Sk_Xb*Kf*670/800,Sk_Yb*670/800,Sk_Xe*Kf*670/800,Sk_Ye*670/800
scale57ef_t SCLT Sk_Xb*KF*670/800,Sk_Yb*670/800,Sk_Xe*KF*670/800,Sk_Ye*670/800
scale58_t SCLT Sk_Xb*Kn*680/800,Sk_Yb*680/800,Sk_Xe*Kn*680/800,Sk_Ye*680/800
scale58et_t SCLT Sk_Xb*KT*680/800,Sk_Yb*680/800,Sk_Xe*KT*680/800,Sk_Ye*680/800
scale58t_t SCLT Sk_Xb*Kt*680/800,Sk_Yb*680/800,Sk_Xe*Kt*680/800,Sk_Ye*680/800
scale58f_t SCLT Sk_Xb*Kf*680/800,Sk_Yb*680/800,Sk_Xe*Kf*680/800,Sk_Ye*680/800
scale58ef_t SCLT Sk_Xb*KF*680/800,Sk_Yb*680/800,Sk_Xe*KF*680/800,Sk_Ye*680/800
scale59_t SCLT Sk_Xb*Kn*690/800,Sk_Yb*690/800,Sk_Xe*Kn*690/800,Sk_Ye*690/800
scale59et_t SCLT Sk_Xb*KT*690/800,Sk_Yb*690/800,Sk_Xe*KT*690/800,Sk_Ye*690/800
scale59t_t SCLT Sk_Xb*Kt*690/800,Sk_Yb*690/800,Sk_Xe*Kt*690/800,Sk_Ye*690/800
scale59f_t SCLT Sk_Xb*Kf*690/800,Sk_Yb*690/800,Sk_Xe*Kf*690/800,Sk_Ye*690/800
scale59ef_t SCLT Sk_Xb*KF*690/800,Sk_Yb*690/800,Sk_Xe*KF*690/800,Sk_Ye*690/800
scale510_t SCLT Sk_Xb*Kn*700/800,Sk_Yb*700/800,Sk_Xe*Kn*700/800,Sk_Ye*700/800
scale510et_t SCLT Sk_Xb*KT*700/800,Sk_Yb*700/800,Sk_Xe*KT*700/800,Sk_Ye*700/800
scale510t_t SCLT Sk_Xb*Kt*700/800,Sk_Yb*700/800,Sk_Xe*Kt*700/800,Sk_Ye*700/800
scale510f_t SCLT Sk_Xb*Kf*700/800,Sk_Yb*700/800,Sk_Xe*Kf*700/800,Sk_Ye*700/800
scale510ef_t SCLT Sk_Xb*KF*700/800,Sk_Yb*700/800,Sk_Xe*KF*700/800,Sk_Ye*700/800
scale511_t SCLT Sk_Xb*Kn*710/800,Sk_Yb*710/800,Sk_Xe*Kn*710/800,Sk_Ye*710/800
scale511et_t SCLT Sk_Xb*KT*710/800,Sk_Yb*710/800,Sk_Xe*KT*710/800,Sk_Ye*710/800
scale511t_t SCLT Sk_Xb*Kt*710/800,Sk_Yb*710/800,Sk_Xe*Kt*710/800,Sk_Ye*710/800
scale511f_t SCLT Sk_Xb*Kf*710/800,Sk_Yb*710/800,Sk_Xe*Kf*710/800,Sk_Ye*710/800
scale511ef_t SCLT Sk_Xb*KF*710/800,Sk_Yb*710/800,Sk_Xe*KF*710/800,Sk_Ye*710/800
scale60_t SCLT Sk_Xb*Kn*720/800,Sk_Yb*720/800,Sk_Xe*Kn*720/800,Sk_Ye*720/800
scale60et_t SCLT Sk_Xb*KT*720/800,Sk_Yb*720/800,Sk_Xe*KT*720/800,Sk_Ye*720/800
scale60t_t SCLT Sk_Xb*Kt*720/800,Sk_Yb*720/800,Sk_Xe*Kt*720/800,Sk_Ye*720/800
scale60f_t SCLT Sk_Xb*Kf*720/800,Sk_Yb*720/800,Sk_Xe*Kf*720/800,Sk_Ye*720/800
scale60ef_t SCLT Sk_Xb*KF*720/800,Sk_Yb*720/800,Sk_Xe*KF*720/800,Sk_Ye*720/800
scale61_t SCLT Sk_Xb*Kn*730/800,Sk_Yb*730/800,Sk_Xe*Kn*730/800,Sk_Ye*730/800
scale61et_t SCLT Sk_Xb*KT*730/800,Sk_Yb*730/800,Sk_Xe*KT*730/800,Sk_Ye*730/800
scale61t_t SCLT Sk_Xb*Kt*730/800,Sk_Yb*730/800,Sk_Xe*Kt*730/800,Sk_Ye*730/800
scale61f_t SCLT Sk_Xb*Kf*730/800,Sk_Yb*730/800,Sk_Xe*Kf*730/800,Sk_Ye*730/800
scale61ef_t SCLT Sk_Xb*KF*730/800,Sk_Yb*730/800,Sk_Xe*KF*730/800,Sk_Ye*730/800
scale62_t SCLT Sk_Xb*Kn*740/800,Sk_Yb*740/800,Sk_Xe*Kn*740/800,Sk_Ye*740/800
scale62et_t SCLT Sk_Xb*KT*740/800,Sk_Yb*740/800,Sk_Xe*KT*740/800,Sk_Ye*740/800
scale62t_t SCLT Sk_Xb*Kt*740/800,Sk_Yb*740/800,Sk_Xe*Kt*740/800,Sk_Ye*740/800
scale62f_t SCLT Sk_Xb*Kf*740/800,Sk_Yb*740/800,Sk_Xe*Kf*740/800,Sk_Ye*740/800
scale62ef_t SCLT Sk_Xb*KF*740/800,Sk_Yb*740/800,Sk_Xe*KF*740/800,Sk_Ye*740/800
scale63_t SCLT Sk_Xb*Kn*750/800,Sk_Yb*750/800,Sk_Xe*Kn*750/800,Sk_Ye*750/800
scale63et_t SCLT Sk_Xb*KT*750/800,Sk_Yb*750/800,Sk_Xe*KT*750/800,Sk_Ye*750/800
scale63t_t SCLT Sk_Xb*Kt*750/800,Sk_Yb*750/800,Sk_Xe*Kt*750/800,Sk_Ye*750/800
scale63f_t SCLT Sk_Xb*Kf*750/800,Sk_Yb*750/800,Sk_Xe*Kf*750/800,Sk_Ye*750/800
scale63ef_t SCLT Sk_Xb*KF*750/800,Sk_Yb*750/800,Sk_Xe*KF*750/800,Sk_Ye*750/800
scale64_t SCLT Sk_Xb*Kn*760/800,Sk_Yb*760/800,Sk_Xe*Kn*760/800,Sk_Ye*760/800
scale64et_t SCLT Sk_Xb*KT*760/800,Sk_Yb*760/800,Sk_Xe*KT*760/800,Sk_Ye*760/800
scale64t_t SCLT Sk_Xb*Kt*760/800,Sk_Yb*760/800,Sk_Xe*Kt*760/800,Sk_Ye*760/800
scale64f_t SCLT Sk_Xb*Kf*760/800,Sk_Yb*760/800,Sk_Xe*Kf*760/800,Sk_Ye*760/800
scale64ef_t SCLT Sk_Xb*KF*760/800,Sk_Yb*760/800,Sk_Xe*KF*760/800,Sk_Ye*760/800
scale65_t SCLT Sk_Xb*Kn*770/800,Sk_Yb*770/800,Sk_Xe*Kn*770/800,Sk_Ye*770/800
scale65et_t SCLT Sk_Xb*KT*770/800,Sk_Yb*770/800,Sk_Xe*KT*770/800,Sk_Ye*770/800
scale65t_t SCLT Sk_Xb*Kt*770/800,Sk_Yb*770/800,Sk_Xe*Kt*770/800,Sk_Ye*770/800
scale65f_t SCLT Sk_Xb*Kf*770/800,Sk_Yb*770/800,Sk_Xe*Kf*770/800,Sk_Ye*770/800
scale65ef_t SCLT Sk_Xb*KF*770/800,Sk_Yb*770/800,Sk_Xe*KF*770/800,Sk_Ye*770/800
scale66_t SCLT Sk_Xb*Kn*780/800,Sk_Yb*780/800,Sk_Xe*Kn*780/800,Sk_Ye*780/800
scale66et_t SCLT Sk_Xb*KT*780/800,Sk_Yb*780/800,Sk_Xe*KT*780/800,Sk_Ye*780/800
scale66t_t SCLT Sk_Xb*Kt*780/800,Sk_Yb*780/800,Sk_Xe*Kt*780/800,Sk_Ye*780/800
scale66f_t SCLT Sk_Xb*Kf*780/800,Sk_Yb*780/800,Sk_Xe*Kf*780/800,Sk_Ye*780/800
scale66ef_t SCLT Sk_Xb*KF*780/800,Sk_Yb*780/800,Sk_Xe*KF*780/800,Sk_Ye*780/800
scale67_t SCLT Sk_Xb*Kn*790/800,Sk_Yb*790/800,Sk_Xe*Kn*790/800,Sk_Ye*790/800
scale67et_t SCLT Sk_Xb*KT*790/800,Sk_Yb*790/800,Sk_Xe*KT*790/800,Sk_Ye*790/800
scale67t_t SCLT Sk_Xb*Kt*790/800,Sk_Yb*790/800,Sk_Xe*Kt*790/800,Sk_Ye*790/800
scale67f_t SCLT Sk_Xb*Kf*790/800,Sk_Yb*790/800,Sk_Xe*Kf*790/800,Sk_Ye*790/800
scale67ef_t SCLT Sk_Xb*KF*790/800,Sk_Yb*790/800,Sk_Xe*KF*790/800,Sk_Ye*790/800
scale68_t SCLT Sk_Xb*Kn*800/800,Sk_Yb*800/800,Sk_Xe*Kn*800/800,Sk_Ye*800/800
scale68et_t SCLT Sk_Xb*KT*800/800,Sk_Yb*800/800,Sk_Xe*KT*800/800,Sk_Ye*800/800
scale68t_t SCLT Sk_Xb*Kt*800/800,Sk_Yb*800/800,Sk_Xe*Kt*800/800,Sk_Ye*800/800
scale68f_t SCLT Sk_Xb*Kf*800/800,Sk_Yb*800/800,Sk_Xe*Kf*800/800,Sk_Ye*800/800
scale68ef_t SCLT Sk_Xb*KF*800/800,Sk_Yb*800/800,Sk_Xe*KF*800/800,Sk_Ye*800/800
scale69_t SCLT Sk_Xb*Kn*810/800,Sk_Yb*810/800,Sk_Xe*Kn*810/800,Sk_Ye*810/800
scale69et_t SCLT Sk_Xb*KT*810/800,Sk_Yb*810/800,Sk_Xe*KT*810/800,Sk_Ye*810/800
scale69t_t SCLT Sk_Xb*Kt*810/800,Sk_Yb*810/800,Sk_Xe*Kt*810/800,Sk_Ye*810/800
scale69f_t SCLT Sk_Xb*Kf*810/800,Sk_Yb*810/800,Sk_Xe*Kf*810/800,Sk_Ye*810/800
scale69ef_t SCLT Sk_Xb*KF*810/800,Sk_Yb*810/800,Sk_Xe*KF*810/800,Sk_Ye*810/800
scale610_t SCLT Sk_Xb*Kn*820/800,Sk_Yb*820/800,Sk_Xe*Kn*820/800,Sk_Ye*820/800
scale610et_t SCLT Sk_Xb*KT*820/800,Sk_Yb*820/800,Sk_Xe*KT*820/800,Sk_Ye*820/800
scale610t_t SCLT Sk_Xb*Kt*820/800,Sk_Yb*820/800,Sk_Xe*Kt*820/800,Sk_Ye*820/800
scale610f_t SCLT Sk_Xb*Kf*820/800,Sk_Yb*820/800,Sk_Xe*Kf*820/800,Sk_Ye*820/800
scale610ef_t SCLT Sk_Xb*KF*820/800,Sk_Yb*820/800,Sk_Xe*KF*820/800,Sk_Ye*820/800
scale611_t SCLT Sk_Xb*Kn*830/800,Sk_Yb*830/800,Sk_Xe*Kn*830/800,Sk_Ye*830/800
scale611et_t SCLT Sk_Xb*KT*830/800,Sk_Yb*830/800,Sk_Xe*KT*830/800,Sk_Ye*830/800
scale611t_t SCLT Sk_Xb*Kt*830/800,Sk_Yb*830/800,Sk_Xe*Kt*830/800,Sk_Ye*830/800
scale611f_t SCLT Sk_Xb*Kf*830/800,Sk_Yb*830/800,Sk_Xe*Kf*830/800,Sk_Ye*830/800
scale611ef_t SCLT Sk_Xb*KF*830/800,Sk_Yb*830/800,Sk_Xe*KF*830/800,Sk_Ye*830/800
scale70_t SCLT Sk_Xb*Kn*840/800,Sk_Yb*840/800,Sk_Xe*Kn*840/800,Sk_Ye*840/800
scale70et_t SCLT Sk_Xb*KT*840/800,Sk_Yb*840/800,Sk_Xe*KT*840/800,Sk_Ye*840/800
scale70t_t SCLT Sk_Xb*Kt*840/800,Sk_Yb*840/800,Sk_Xe*Kt*840/800,Sk_Ye*840/800
scale70f_t SCLT Sk_Xb*Kf*840/800,Sk_Yb*840/800,Sk_Xe*Kf*840/800,Sk_Ye*840/800
scale70ef_t SCLT Sk_Xb*KF*840/800,Sk_Yb*840/800,Sk_Xe*KF*840/800,Sk_Ye*840/800
scale71_t SCLT Sk_Xb*Kn*850/800,Sk_Yb*850/800,Sk_Xe*Kn*850/800,Sk_Ye*850/800
scale71et_t SCLT Sk_Xb*KT*850/800,Sk_Yb*850/800,Sk_Xe*KT*850/800,Sk_Ye*850/800
scale71t_t SCLT Sk_Xb*Kt*850/800,Sk_Yb*850/800,Sk_Xe*Kt*850/800,Sk_Ye*850/800
scale71f_t SCLT Sk_Xb*Kf*850/800,Sk_Yb*850/800,Sk_Xe*Kf*850/800,Sk_Ye*850/800
scale71ef_t SCLT Sk_Xb*KF*850/800,Sk_Yb*850/800,Sk_Xe*KF*850/800,Sk_Ye*850/800
scale72_t SCLT Sk_Xb*Kn*860/800,Sk_Yb*860/800,Sk_Xe*Kn*860/800,Sk_Ye*860/800
scale72et_t SCLT Sk_Xb*KT*860/800,Sk_Yb*860/800,Sk_Xe*KT*860/800,Sk_Ye*860/800
scale72t_t SCLT Sk_Xb*Kt*860/800,Sk_Yb*860/800,Sk_Xe*Kt*860/800,Sk_Ye*860/800
scale72f_t SCLT Sk_Xb*Kf*860/800,Sk_Yb*860/800,Sk_Xe*Kf*860/800,Sk_Ye*860/800
scale72ef_t SCLT Sk_Xb*KF*860/800,Sk_Yb*860/800,Sk_Xe*KF*860/800,Sk_Ye*860/800
scale73_t SCLT Sk_Xb*Kn*870/800,Sk_Yb*870/800,Sk_Xe*Kn*870/800,Sk_Ye*870/800
scale73et_t SCLT Sk_Xb*KT*870/800,Sk_Yb*870/800,Sk_Xe*KT*870/800,Sk_Ye*870/800
scale73t_t SCLT Sk_Xb*Kt*870/800,Sk_Yb*870/800,Sk_Xe*Kt*870/800,Sk_Ye*870/800
scale73f_t SCLT Sk_Xb*Kf*870/800,Sk_Yb*870/800,Sk_Xe*Kf*870/800,Sk_Ye*870/800
scale73ef_t SCLT Sk_Xb*KF*870/800,Sk_Yb*870/800,Sk_Xe*KF*870/800,Sk_Ye*870/800
scale74_t SCLT Sk_Xb*Kn*880/800,Sk_Yb*880/800,Sk_Xe*Kn*880/800,Sk_Ye*880/800
scale74et_t SCLT Sk_Xb*KT*880/800,Sk_Yb*880/800,Sk_Xe*KT*880/800,Sk_Ye*880/800
scale74t_t SCLT Sk_Xb*Kt*880/800,Sk_Yb*880/800,Sk_Xe*Kt*880/800,Sk_Ye*880/800
scale74f_t SCLT Sk_Xb*Kf*880/800,Sk_Yb*880/800,Sk_Xe*Kf*880/800,Sk_Ye*880/800
scale74ef_t SCLT Sk_Xb*KF*880/800,Sk_Yb*880/800,Sk_Xe*KF*880/800,Sk_Ye*880/800
scale75_t SCLT Sk_Xb*Kn*890/800,Sk_Yb*890/800,Sk_Xe*Kn*890/800,Sk_Ye*890/800
scale75et_t SCLT Sk_Xb*KT*890/800,Sk_Yb*890/800,Sk_Xe*KT*890/800,Sk_Ye*890/800
scale75t_t SCLT Sk_Xb*Kt*890/800,Sk_Yb*890/800,Sk_Xe*Kt*890/800,Sk_Ye*890/800
scale75f_t SCLT Sk_Xb*Kf*890/800,Sk_Yb*890/800,Sk_Xe*Kf*890/800,Sk_Ye*890/800
scale75ef_t SCLT Sk_Xb*KF*890/800,Sk_Yb*890/800,Sk_Xe*KF*890/800,Sk_Ye*890/800
scale76_t SCLT Sk_Xb*Kn*900/800,Sk_Yb*900/800,Sk_Xe*Kn*900/800,Sk_Ye*900/800
scale76et_t SCLT Sk_Xb*KT*900/800,Sk_Yb*900/800,Sk_Xe*KT*900/800,Sk_Ye*900/800
scale76t_t SCLT Sk_Xb*Kt*900/800,Sk_Yb*900/800,Sk_Xe*Kt*900/800,Sk_Ye*900/800
scale76f_t SCLT Sk_Xb*Kf*900/800,Sk_Yb*900/800,Sk_Xe*Kf*900/800,Sk_Ye*900/800
scale76ef_t SCLT Sk_Xb*KF*900/800,Sk_Yb*900/800,Sk_Xe*KF*900/800,Sk_Ye*900/800
scale77ef_t SCLT Sk_Xb*KF*910/800,Sk_Yb*910/800,Sk_Xe*KF*910/800,Sk_Ye*910/800
scalebaby_t SCLT Sk_Xb*420/800,Sk_Yb*420/800,Sk_Xe*420/800,Sk_Ye*420/800
;--------------------
.asg 110/100,Ks
scale_t_sm ;Start of small-image scale tables
scale_t_size .equ scale_t_sm-scale_t
scale57_t_sm SCLT Sk_Xb*Ks*Kn*670/800,Sk_Yb*Ks*670/800,Sk_Xe*Ks*Kn*670/800,Sk_Ye*Ks*670/800
scale57et_t_sm SCLT Sk_Xb*Ks*KT*670/800,Sk_Yb*Ks*670/800,Sk_Xe*Ks*KT*670/800,Sk_Ye*Ks*670/800
scale57t_t_sm SCLT Sk_Xb*Ks*Kt*670/800,Sk_Yb*Ks*670/800,Sk_Xe*Ks*Kt*670/800,Sk_Ye*Ks*670/800
scale57f_t_sm SCLT Sk_Xb*Ks*Kf*670/800,Sk_Yb*Ks*670/800,Sk_Xe*Ks*Kf*670/800,Sk_Ye*Ks*670/800
scale57ef_t_sm SCLT Sk_Xb*Ks*KF*670/800,Sk_Yb*Ks*670/800,Sk_Xe*Ks*KF*670/800,Sk_Ye*Ks*670/800
scale58_t_sm SCLT Sk_Xb*Ks*Kn*680/800,Sk_Yb*Ks*680/800,Sk_Xe*Ks*Kn*680/800,Sk_Ye*Ks*680/800
scale58et_t_sm SCLT Sk_Xb*Ks*KT*680/800,Sk_Yb*Ks*680/800,Sk_Xe*Ks*KT*680/800,Sk_Ye*Ks*680/800
scale58t_t_sm SCLT Sk_Xb*Ks*Kt*680/800,Sk_Yb*Ks*680/800,Sk_Xe*Ks*Kt*680/800,Sk_Ye*Ks*680/800
scale58f_t_sm SCLT Sk_Xb*Ks*Kf*680/800,Sk_Yb*Ks*680/800,Sk_Xe*Ks*Kf*680/800,Sk_Ye*Ks*680/800
scale58ef_t_sm SCLT Sk_Xb*Ks*KF*680/800,Sk_Yb*Ks*680/800,Sk_Xe*Ks*KF*680/800,Sk_Ye*Ks*680/800
scale59_t_sm SCLT Sk_Xb*Ks*Kn*690/800,Sk_Yb*Ks*690/800,Sk_Xe*Ks*Kn*690/800,Sk_Ye*Ks*690/800
scale59et_t_sm SCLT Sk_Xb*Ks*KT*690/800,Sk_Yb*Ks*690/800,Sk_Xe*Ks*KT*690/800,Sk_Ye*Ks*690/800
scale59t_t_sm SCLT Sk_Xb*Ks*Kt*690/800,Sk_Yb*Ks*690/800,Sk_Xe*Ks*Kt*690/800,Sk_Ye*Ks*690/800
scale59f_t_sm SCLT Sk_Xb*Ks*Kf*690/800,Sk_Yb*Ks*690/800,Sk_Xe*Ks*Kf*690/800,Sk_Ye*Ks*690/800
scale59ef_t_sm SCLT Sk_Xb*Ks*KF*690/800,Sk_Yb*Ks*690/800,Sk_Xe*Ks*KF*690/800,Sk_Ye*Ks*690/800
scale510_t_sm SCLT Sk_Xb*Ks*Kn*700/800,Sk_Yb*Ks*700/800,Sk_Xe*Ks*Kn*700/800,Sk_Ye*Ks*700/800
scale510et_t_sm SCLT Sk_Xb*Ks*KT*700/800,Sk_Yb*Ks*700/800,Sk_Xe*Ks*KT*700/800,Sk_Ye*Ks*700/800
scale510t_t_sm SCLT Sk_Xb*Ks*Kt*700/800,Sk_Yb*Ks*700/800,Sk_Xe*Ks*Kt*700/800,Sk_Ye*Ks*700/800
scale510f_t_sm SCLT Sk_Xb*Ks*Kf*700/800,Sk_Yb*Ks*700/800,Sk_Xe*Ks*Kf*700/800,Sk_Ye*Ks*700/800
scale510ef_t_sm SCLT Sk_Xb*Ks*KF*700/800,Sk_Yb*Ks*700/800,Sk_Xe*Ks*KF*700/800,Sk_Ye*Ks*700/800
scale511_t_sm SCLT Sk_Xb*Ks*Kn*710/800,Sk_Yb*Ks*710/800,Sk_Xe*Ks*Kn*710/800,Sk_Ye*Ks*710/800
scale511et_t_sm SCLT Sk_Xb*Ks*KT*710/800,Sk_Yb*Ks*710/800,Sk_Xe*Ks*KT*710/800,Sk_Ye*Ks*710/800
scale511t_t_sm SCLT Sk_Xb*Ks*Kt*710/800,Sk_Yb*Ks*710/800,Sk_Xe*Ks*Kt*710/800,Sk_Ye*Ks*710/800
scale511f_t_sm SCLT Sk_Xb*Ks*Kf*710/800,Sk_Yb*Ks*710/800,Sk_Xe*Ks*Kf*710/800,Sk_Ye*Ks*710/800
scale511ef_t_sm SCLT Sk_Xb*Ks*KF*710/800,Sk_Yb*Ks*710/800,Sk_Xe*Ks*KF*710/800,Sk_Ye*Ks*710/800
scale60_t_sm SCLT Sk_Xb*Ks*Kn*720/800,Sk_Yb*Ks*720/800,Sk_Xe*Ks*Kn*720/800,Sk_Ye*Ks*720/800
scale60et_t_sm SCLT Sk_Xb*Ks*KT*720/800,Sk_Yb*Ks*720/800,Sk_Xe*Ks*KT*720/800,Sk_Ye*Ks*720/800
scale60t_t_sm SCLT Sk_Xb*Ks*Kt*720/800,Sk_Yb*Ks*720/800,Sk_Xe*Ks*Kt*720/800,Sk_Ye*Ks*720/800
scale60f_t_sm SCLT Sk_Xb*Ks*Kf*720/800,Sk_Yb*Ks*720/800,Sk_Xe*Ks*Kf*720/800,Sk_Ye*Ks*720/800
scale60ef_t_sm SCLT Sk_Xb*Ks*KF*720/800,Sk_Yb*Ks*720/800,Sk_Xe*Ks*KF*720/800,Sk_Ye*Ks*720/800
scale61_t_sm SCLT Sk_Xb*Ks*Kn*730/800,Sk_Yb*Ks*730/800,Sk_Xe*Ks*Kn*730/800,Sk_Ye*Ks*730/800
scale61et_t_sm SCLT Sk_Xb*Ks*KT*730/800,Sk_Yb*Ks*730/800,Sk_Xe*Ks*KT*730/800,Sk_Ye*Ks*730/800
scale61t_t_sm SCLT Sk_Xb*Ks*Kt*730/800,Sk_Yb*Ks*730/800,Sk_Xe*Ks*Kt*730/800,Sk_Ye*Ks*730/800
scale61f_t_sm SCLT Sk_Xb*Ks*Kf*730/800,Sk_Yb*Ks*730/800,Sk_Xe*Ks*Kf*730/800,Sk_Ye*Ks*730/800
scale61ef_t_sm SCLT Sk_Xb*Ks*KF*730/800,Sk_Yb*Ks*730/800,Sk_Xe*Ks*KF*730/800,Sk_Ye*Ks*730/800
scale62_t_sm SCLT Sk_Xb*Ks*Kn*740/800,Sk_Yb*Ks*740/800,Sk_Xe*Ks*Kn*740/800,Sk_Ye*Ks*740/800
scale62et_t_sm SCLT Sk_Xb*Ks*KT*740/800,Sk_Yb*Ks*740/800,Sk_Xe*Ks*KT*740/800,Sk_Ye*Ks*740/800
scale62t_t_sm SCLT Sk_Xb*Ks*Kt*740/800,Sk_Yb*Ks*740/800,Sk_Xe*Ks*Kt*740/800,Sk_Ye*Ks*740/800
scale62f_t_sm SCLT Sk_Xb*Ks*Kf*740/800,Sk_Yb*Ks*740/800,Sk_Xe*Ks*Kf*740/800,Sk_Ye*Ks*740/800
scale62ef_t_sm SCLT Sk_Xb*Ks*KF*740/800,Sk_Yb*Ks*740/800,Sk_Xe*Ks*KF*740/800,Sk_Ye*Ks*740/800
scale63_t_sm SCLT Sk_Xb*Ks*Kn*750/800,Sk_Yb*Ks*750/800,Sk_Xe*Ks*Kn*750/800,Sk_Ye*Ks*750/800
scale63et_t_sm SCLT Sk_Xb*Ks*KT*750/800,Sk_Yb*Ks*750/800,Sk_Xe*Ks*KT*750/800,Sk_Ye*Ks*750/800
scale63t_t_sm SCLT Sk_Xb*Ks*Kt*750/800,Sk_Yb*Ks*750/800,Sk_Xe*Ks*Kt*750/800,Sk_Ye*Ks*750/800
scale63f_t_sm SCLT Sk_Xb*Ks*Kf*750/800,Sk_Yb*Ks*750/800,Sk_Xe*Ks*Kf*750/800,Sk_Ye*Ks*750/800
scale63ef_t_sm SCLT Sk_Xb*Ks*KF*750/800,Sk_Yb*Ks*750/800,Sk_Xe*Ks*KF*750/800,Sk_Ye*Ks*750/800
scale64_t_sm SCLT Sk_Xb*Ks*Kn*760/800,Sk_Yb*Ks*760/800,Sk_Xe*Ks*Kn*760/800,Sk_Ye*Ks*760/800
scale64et_t_sm SCLT Sk_Xb*Ks*KT*760/800,Sk_Yb*Ks*760/800,Sk_Xe*Ks*KT*760/800,Sk_Ye*Ks*760/800
scale64t_t_sm SCLT Sk_Xb*Ks*Kt*760/800,Sk_Yb*Ks*760/800,Sk_Xe*Ks*Kt*760/800,Sk_Ye*Ks*760/800
scale64f_t_sm SCLT Sk_Xb*Ks*Kf*760/800,Sk_Yb*Ks*760/800,Sk_Xe*Ks*Kf*760/800,Sk_Ye*Ks*760/800
scale64ef_t_sm SCLT Sk_Xb*Ks*KF*760/800,Sk_Yb*Ks*760/800,Sk_Xe*Ks*KF*760/800,Sk_Ye*Ks*760/800
scale65_t_sm SCLT Sk_Xb*Ks*Kn*770/800,Sk_Yb*Ks*770/800,Sk_Xe*Ks*Kn*770/800,Sk_Ye*Ks*770/800
scale65et_t_sm SCLT Sk_Xb*Ks*KT*770/800,Sk_Yb*Ks*770/800,Sk_Xe*Ks*KT*770/800,Sk_Ye*Ks*770/800
scale65t_t_sm SCLT Sk_Xb*Ks*Kt*770/800,Sk_Yb*Ks*770/800,Sk_Xe*Ks*Kt*770/800,Sk_Ye*Ks*770/800
scale65f_t_sm SCLT Sk_Xb*Ks*Kf*770/800,Sk_Yb*Ks*770/800,Sk_Xe*Ks*Kf*770/800,Sk_Ye*Ks*770/800
scale65ef_t_sm SCLT Sk_Xb*Ks*KF*770/800,Sk_Yb*Ks*770/800,Sk_Xe*Ks*KF*770/800,Sk_Ye*Ks*770/800
scale66_t_sm SCLT Sk_Xb*Ks*Kn*780/800,Sk_Yb*Ks*780/800,Sk_Xe*Ks*Kn*780/800,Sk_Ye*Ks*780/800
scale66et_t_sm SCLT Sk_Xb*Ks*KT*780/800,Sk_Yb*Ks*780/800,Sk_Xe*Ks*KT*780/800,Sk_Ye*Ks*780/800
scale66t_t_sm SCLT Sk_Xb*Ks*Kt*780/800,Sk_Yb*Ks*780/800,Sk_Xe*Ks*Kt*780/800,Sk_Ye*Ks*780/800
scale66f_t_sm SCLT Sk_Xb*Ks*Kf*780/800,Sk_Yb*Ks*780/800,Sk_Xe*Ks*Kf*780/800,Sk_Ye*Ks*780/800
scale66ef_t_sm SCLT Sk_Xb*Ks*KF*780/800,Sk_Yb*Ks*780/800,Sk_Xe*Ks*KF*780/800,Sk_Ye*Ks*780/800
scale67_t_sm SCLT Sk_Xb*Ks*Kn*790/800,Sk_Yb*Ks*790/800,Sk_Xe*Ks*Kn*790/800,Sk_Ye*Ks*790/800
scale67et_t_sm SCLT Sk_Xb*Ks*KT*790/800,Sk_Yb*Ks*790/800,Sk_Xe*Ks*KT*790/800,Sk_Ye*Ks*790/800
scale67t_t_sm SCLT Sk_Xb*Ks*Kt*790/800,Sk_Yb*Ks*790/800,Sk_Xe*Ks*Kt*790/800,Sk_Ye*Ks*790/800
scale67f_t_sm SCLT Sk_Xb*Ks*Kf*790/800,Sk_Yb*Ks*790/800,Sk_Xe*Ks*Kf*790/800,Sk_Ye*Ks*790/800
scale67ef_t_sm SCLT Sk_Xb*Ks*KF*790/800,Sk_Yb*Ks*790/800,Sk_Xe*Ks*KF*790/800,Sk_Ye*Ks*790/800
scale68_t_sm SCLT Sk_Xb*Ks*Kn*800/800,Sk_Yb*Ks*800/800,Sk_Xe*Ks*Kn*800/800,Sk_Ye*Ks*800/800
scale68et_t_sm SCLT Sk_Xb*Ks*KT*800/800,Sk_Yb*Ks*800/800,Sk_Xe*Ks*KT*800/800,Sk_Ye*Ks*800/800
scale68t_t_sm SCLT Sk_Xb*Ks*Kt*800/800,Sk_Yb*Ks*800/800,Sk_Xe*Ks*Kt*800/800,Sk_Ye*Ks*800/800
scale68f_t_sm SCLT Sk_Xb*Ks*Kf*800/800,Sk_Yb*Ks*800/800,Sk_Xe*Ks*Kf*800/800,Sk_Ye*Ks*800/800
scale68ef_t_sm SCLT Sk_Xb*Ks*KF*800/800,Sk_Yb*Ks*800/800,Sk_Xe*Ks*KF*800/800,Sk_Ye*Ks*800/800
scale69_t_sm SCLT Sk_Xb*Ks*Kn*810/800,Sk_Yb*Ks*810/800,Sk_Xe*Ks*Kn*810/800,Sk_Ye*Ks*810/800
scale69et_t_sm SCLT Sk_Xb*Ks*KT*810/800,Sk_Yb*Ks*810/800,Sk_Xe*Ks*KT*810/800,Sk_Ye*Ks*810/800
scale69t_t_sm SCLT Sk_Xb*Ks*Kt*810/800,Sk_Yb*Ks*810/800,Sk_Xe*Ks*Kt*810/800,Sk_Ye*Ks*810/800
scale69f_t_sm SCLT Sk_Xb*Ks*Kf*810/800,Sk_Yb*Ks*810/800,Sk_Xe*Ks*Kf*810/800,Sk_Ye*Ks*810/800
scale69ef_t_sm SCLT Sk_Xb*Ks*KF*810/800,Sk_Yb*Ks*810/800,Sk_Xe*Ks*KF*810/800,Sk_Ye*Ks*810/800
scale610_t_sm SCLT Sk_Xb*Ks*Kn*820/800,Sk_Yb*Ks*820/800,Sk_Xe*Ks*Kn*820/800,Sk_Ye*Ks*820/800
scale610et_t_sm SCLT Sk_Xb*Ks*KT*820/800,Sk_Yb*Ks*820/800,Sk_Xe*Ks*KT*820/800,Sk_Ye*Ks*820/800
scale610t_t_sm SCLT Sk_Xb*Ks*Kt*820/800,Sk_Yb*Ks*820/800,Sk_Xe*Ks*Kt*820/800,Sk_Ye*Ks*820/800
scale610f_t_sm SCLT Sk_Xb*Ks*Kf*820/800,Sk_Yb*Ks*820/800,Sk_Xe*Ks*Kf*820/800,Sk_Ye*Ks*820/800
scale610ef_t_sm SCLT Sk_Xb*Ks*KF*820/800,Sk_Yb*Ks*820/800,Sk_Xe*Ks*KF*820/800,Sk_Ye*Ks*820/800
scale611_t_sm SCLT Sk_Xb*Ks*Kn*830/800,Sk_Yb*Ks*830/800,Sk_Xe*Ks*Kn*830/800,Sk_Ye*Ks*830/800
scale611et_t_sm SCLT Sk_Xb*Ks*KT*830/800,Sk_Yb*Ks*830/800,Sk_Xe*Ks*KT*830/800,Sk_Ye*Ks*830/800
scale611t_t_sm SCLT Sk_Xb*Ks*Kt*830/800,Sk_Yb*Ks*830/800,Sk_Xe*Ks*Kt*830/800,Sk_Ye*Ks*830/800
scale611f_t_sm SCLT Sk_Xb*Ks*Kf*830/800,Sk_Yb*Ks*830/800,Sk_Xe*Ks*Kf*830/800,Sk_Ye*Ks*830/800
scale611ef_t_sm SCLT Sk_Xb*Ks*KF*830/800,Sk_Yb*Ks*830/800,Sk_Xe*Ks*KF*830/800,Sk_Ye*Ks*830/800
scale70_t_sm SCLT Sk_Xb*Ks*Kn*840/800,Sk_Yb*Ks*840/800,Sk_Xe*Ks*Kn*840/800,Sk_Ye*Ks*840/800
scale70et_t_sm SCLT Sk_Xb*Ks*KT*840/800,Sk_Yb*Ks*840/800,Sk_Xe*Ks*KT*840/800,Sk_Ye*Ks*840/800
scale70t_t_sm SCLT Sk_Xb*Ks*Kt*840/800,Sk_Yb*Ks*840/800,Sk_Xe*Ks*Kt*840/800,Sk_Ye*Ks*840/800
scale70f_t_sm SCLT Sk_Xb*Ks*Kf*840/800,Sk_Yb*Ks*840/800,Sk_Xe*Ks*Kf*840/800,Sk_Ye*Ks*840/800
scale70ef_t_sm SCLT Sk_Xb*Ks*KF*840/800,Sk_Yb*Ks*840/800,Sk_Xe*Ks*KF*840/800,Sk_Ye*Ks*840/800
scale71_t_sm SCLT Sk_Xb*Ks*Kn*850/800,Sk_Yb*Ks*850/800,Sk_Xe*Ks*Kn*850/800,Sk_Ye*Ks*850/800
scale71et_t_sm SCLT Sk_Xb*Ks*KT*850/800,Sk_Yb*Ks*850/800,Sk_Xe*Ks*KT*850/800,Sk_Ye*Ks*850/800
scale71t_t_sm SCLT Sk_Xb*Ks*Kt*850/800,Sk_Yb*Ks*850/800,Sk_Xe*Ks*Kt*850/800,Sk_Ye*Ks*850/800
scale71f_t_sm SCLT Sk_Xb*Ks*Kf*850/800,Sk_Yb*Ks*850/800,Sk_Xe*Ks*Kf*850/800,Sk_Ye*Ks*850/800
scale71ef_t_sm SCLT Sk_Xb*Ks*KF*850/800,Sk_Yb*Ks*850/800,Sk_Xe*Ks*KF*850/800,Sk_Ye*Ks*850/800
scale72_t_sm SCLT Sk_Xb*Ks*Kn*860/800,Sk_Yb*Ks*860/800,Sk_Xe*Ks*Kn*860/800,Sk_Ye*Ks*860/800
scale72et_t_sm SCLT Sk_Xb*Ks*KT*860/800,Sk_Yb*Ks*860/800,Sk_Xe*Ks*KT*860/800,Sk_Ye*Ks*860/800
scale72t_t_sm SCLT Sk_Xb*Ks*Kt*860/800,Sk_Yb*Ks*860/800,Sk_Xe*Ks*Kt*860/800,Sk_Ye*Ks*860/800
scale72f_t_sm SCLT Sk_Xb*Ks*Kf*860/800,Sk_Yb*Ks*860/800,Sk_Xe*Ks*Kf*860/800,Sk_Ye*Ks*860/800
scale72ef_t_sm SCLT Sk_Xb*Ks*KF*860/800,Sk_Yb*Ks*860/800,Sk_Xe*Ks*KF*860/800,Sk_Ye*Ks*860/800
scale73_t_sm SCLT Sk_Xb*Ks*Kn*870/800,Sk_Yb*Ks*870/800,Sk_Xe*Ks*Kn*870/800,Sk_Ye*Ks*870/800
scale73et_t_sm SCLT Sk_Xb*Ks*KT*870/800,Sk_Yb*Ks*870/800,Sk_Xe*Ks*KT*870/800,Sk_Ye*Ks*870/800
scale73t_t_sm SCLT Sk_Xb*Ks*Kt*870/800,Sk_Yb*Ks*870/800,Sk_Xe*Ks*Kt*870/800,Sk_Ye*Ks*870/800
scale73f_t_sm SCLT Sk_Xb*Ks*Kf*870/800,Sk_Yb*Ks*870/800,Sk_Xe*Ks*Kf*870/800,Sk_Ye*Ks*870/800
scale73ef_t_sm SCLT Sk_Xb*Ks*KF*870/800,Sk_Yb*Ks*870/800,Sk_Xe*Ks*KF*870/800,Sk_Ye*Ks*870/800
scale74_t_sm SCLT Sk_Xb*Ks*Kn*880/800,Sk_Yb*Ks*880/800,Sk_Xe*Ks*Kn*880/800,Sk_Ye*Ks*880/800
scale74et_t_sm SCLT Sk_Xb*Ks*KT*880/800,Sk_Yb*Ks*880/800,Sk_Xe*Ks*KT*880/800,Sk_Ye*Ks*880/800
scale74t_t_sm SCLT Sk_Xb*Ks*Kt*880/800,Sk_Yb*Ks*880/800,Sk_Xe*Ks*Kt*880/800,Sk_Ye*Ks*880/800
scale74f_t_sm SCLT Sk_Xb*Ks*Kf*880/800,Sk_Yb*Ks*880/800,Sk_Xe*Ks*Kf*880/800,Sk_Ye*Ks*880/800
scale74ef_t_sm SCLT Sk_Xb*Ks*KF*880/800,Sk_Yb*Ks*880/800,Sk_Xe*Ks*KF*880/800,Sk_Ye*Ks*880/800
scale75_t_sm SCLT Sk_Xb*Ks*Kn*890/800,Sk_Yb*Ks*890/800,Sk_Xe*Ks*Kn*890/800,Sk_Ye*Ks*890/800
scale75et_t_sm SCLT Sk_Xb*Ks*KT*890/800,Sk_Yb*Ks*890/800,Sk_Xe*Ks*KT*890/800,Sk_Ye*Ks*890/800
scale75t_t_sm SCLT Sk_Xb*Ks*Kt*890/800,Sk_Yb*Ks*890/800,Sk_Xe*Ks*Kt*890/800,Sk_Ye*Ks*890/800
scale75f_t_sm SCLT Sk_Xb*Ks*Kf*890/800,Sk_Yb*Ks*890/800,Sk_Xe*Ks*Kf*890/800,Sk_Ye*Ks*890/800
scale75ef_t_sm SCLT Sk_Xb*Ks*KF*890/800,Sk_Yb*Ks*890/800,Sk_Xe*Ks*KF*890/800,Sk_Ye*Ks*890/800
scale76_t_sm SCLT Sk_Xb*Ks*Kn*900/800,Sk_Yb*Ks*900/800,Sk_Xe*Ks*Kn*900/800,Sk_Ye*Ks*900/800
scale76et_t_sm SCLT Sk_Xb*Ks*KT*900/800,Sk_Yb*Ks*900/800,Sk_Xe*Ks*KT*900/800,Sk_Ye*Ks*900/800
scale76t_t_sm SCLT Sk_Xb*Ks*Kt*900/800,Sk_Yb*Ks*900/800,Sk_Xe*Ks*Kt*900/800,Sk_Ye*Ks*900/800
scale76f_t_sm SCLT Sk_Xb*Ks*Kf*900/800,Sk_Yb*Ks*900/800,Sk_Xe*Ks*Kf*900/800,Sk_Ye*Ks*900/800
scale76ef_t_sm SCLT Sk_Xb*Ks*KF*900/800,Sk_Yb*Ks*900/800,Sk_Xe*Ks*KF*900/800,Sk_Ye*Ks*900/800
scale77ef_t_sm SCLT Sk_Xb*Ks*KF*910/800,Sk_Yb*Ks*910/800,Sk_Xe*Ks*KF*910/800,Sk_Ye*Ks*910/800
scalebaby_t_sm SCLT Sk_Xb*Ks*420/800,Sk_Yb*Ks*420/800,Sk_Xe*Ks*420/800,Sk_Ye*Ks*420/800
.end