home *** CD-ROM | disk | FTP | other *** search
Text File | 1980-08-29 | 92.9 KB | 4,094 lines |
- *************************************************************************
- * *
- * AMOS 1.3 TURBO LIBRARY v1.6 *
- * *
- * Idea's and improvements may be sent to : *
- * *
- * MANUEL ANDRE *
- * Prins Boudewijnlaan 155/5 *
- * 2610 WILRIJK *
- * *
- * BELGIUM *
- * *
- * *
- *************************************************************************
-
- * ASSEMBLE AS TURBO.LIB and put it in your AMOS_SYSTEM directory.
- * SYMBOLS CASE --> INDEPENDANT !!! NO DEBUG INFO !!! EXECUTABLE !!!
- * Also modify your extension list, put TURBO.LIB as extension nr 8.
-
- OPT O+
-
- ExtNb equ 8-1 so this is extension nr 8 !!!
-
-
- ; Don't forget to change the INCDIR directories to your own needs...
- ; Do not remove the RsSet instruction!
- incdir "dF0:include/"
- include "hardware/intbits.i"
- include "hardware/cia.i"
- ; include "hardware/custom.i"
- include "hardware/blit.i"
- include "exec/nodes.i"
- include "exec/interrupts.i"
- include "exec/memory.i"
- include "exec/exec_lib.i"
- ; incdir "dh0:UPLOAD/EXTENSION/INCLUDES/"
- Include "_Equ.s"
- RsSet DataLong
- Include "_Pointe.s"
- Include "_CEqu.s"
- Include "_WEqu.s"
- Include "_LEqu.s"
-
- ; **CHIPS**
- ;
- BLTCPTH equ $48
- BLTBPTH equ $4C
- BLTAPTH equ $50
- BLTDPTH equ $54
- BLTCMOD equ $60
- BLTBMOD equ $62
- BLTAMOD equ $64
- BLTDMOD equ $66
- BLTAFWM equ $44
- BLTALWM equ $46
- BLTDDAT equ $00
- BLTCDAT equ $70
- BLTBDAT equ $72
- BLTADAT equ $74
-
- ; A usefull macro to find the address of data in the extension's own
- ; datazone (see later)...
- DLea MACRO
- move.l ExtAdr+ExtNb*16(a5),\2
- add.w #\1-MB,\2
- ENDM
-
- ; Another macro to load the base address of the datazone...
- DLoad MACRO
- move.l ExtAdr+ExtNb*16(a5),\1
- ENDM
-
-
- ******************************************************************
- * AMOS TURBO EXTENSION
- ;
- ; First, a pointer to the token list
- Start dc.l C_Tk-C_Off
- ;
- ; Then, a pointer to the first library function
- dc.l C_Lib-C_Tk
- ;
- ; Then to the title
- dc.l C_Title-C_Lib
- ;
- ; From title to the end of the program
- dc.l C_End-C_Title
- ;
-
- ; So, a value of 0 indicates to copy if needed only,
- ; A value of -1 forces the copy of the first library routine...
- dc.w 0
-
- ******************************************************************
- * Offset to library
-
-
- C_Off dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
- dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
- dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
- dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
- dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
- dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2,(L24-L23)/2
- dc.w (L25-L24)/2,(L26-L25)/2,(L27-L26)/2,(L28-L27)/2
- dc.w (L29-L28)/2,(L30-L29)/2,(L31-L30)/2,(L32-L31)/2
- dc.w (L33-L32)/2,(L34-L33)/2,(L35-L34)/2,(L36-L35)/2
- dc.w (L37-L36)/2,(L38-L37)/2,(L39-L38)/2,(L40-L39)/2
- DC.W (L41-L40)/2,(L42-L41)/2,(L43-L42)/2,(L44-L43)/2
- DC.W (L45-L44)/2,(L46-L45)/2,(L47-L46)/2,(L48-L47)/2
- DC.W (L49-L48)/2,(L50-L49)/2,(L51-L50)/2,(L52-L51)/2
- DC.W (L53-L52)/2,(L54-L53)/2,(L55-L54)/2,(L56-L55)/2
- DC.W (L57-L56)/2,(L58-L57)/2,(L59-L58)/2,(L60-L59)/2
- DC.W (L61-L60)/2,(L62-L61)/2,(L63-L62)/2,(L64-L63)/2
- DC.W (L65-L64)/2,(L66-L65)/2,(L67-L66)/2,(L68-L67)/2
- DC.W (L69-L68)/2,(L70-L69)/2,(L71-L70)/2,(L72-L71)/2
- DC.W (L73-L72)/2,(L74-L73)/2,(L75-L74)/2,(L76-L75)/2
- DC.W (L77-L76)/2,(L78-L77)/2,(L79-L78)/2,(L80-L79)/2
- DC.W (L81-L80)/2,(L82-L81)/2,(L83-L82)/2,(L84-L83)/2
- DC.W (L85-L84)/2,(L86-L85)/2,(L87-L86)/2,(L88-L87)/2
- DC.W (L89-L88)/2,(L90-L89)/2,(L91-L90)/2,(L92-L91)/2
- DC.W (L93-L92)/2,(L94-L93)/2,(L95-L94)/2,(L96-L95)/2
-
- ; Do not forget the LAST label!!!
-
- ******************************************************************
- * TOKEN TABLE
-
-
- ; The next two lines needs to be unchanged...
- C_Tk: dc.w 1,0
- dc.b $80,-1
- dc.w L_MULTI_YES,-1
- dc.b "multi ye","s"+$80,"I",-1
- dc.w L_MULTI_NO,-1
- dc.b "multi n","o"+$80,"I",-1
- dc.w -1,L_LSL_B
- dc.b "lsl.","b"+$80,"00,0",-1
- dc.w -1,L_LSL_W
- dc.b "lsl.","w"+$80,"00,0",-1
- dc.w -1,L_LSL_L
- dc.b "lsl.","l"+$80,"00,0",-1
- dc.w -1,L_LSR_B
- dc.b "lsr.","b"+$80,"00,0",-1
- dc.w -1,L_LSR_W
- dc.b "lsr.","w"+$80,"00,0",-1
- dc.w -1,L_LSR_L
- dc.b "lsr.","l"+$80,"00,0",-1
- dc.w -1,L_SWAP_VAL
- dc.b "l swa","p"+$80,"00",-1
- dc.w -1,L_TEST_B
- dc.b "test.","b"+$80,"00,0",-1
- dc.w -1,L_TEST_W
- dc.b "test.","w"+$80,"00,0",-1
- dc.w L_VBL_WAIT,-1
- dc.b "vbl wai","t"+$80,"I0",-1
- dc.w L_RESERVE_CHECK,-1
- dc.b "reserve chec","k"+$80,"I0",-1
- dc.w L_RELEASE_CHECK,-1
- dc.b "check eras","e"+$80,"I",-1
- dc.w -1,L_CHECK_ZONE
- dc.b "chec","k"+$80,"00t0,0,0",-1
- dc.w L_CHECK_SET,-1
- dc.b "set chec","k"+$80,"I0,0,0t0,0",-1
- dc.w L_CHECK_DISCARD,-1
- dc.b "reset chec","k"+$80,"I0",-1
- dc.w -1,L_HIT_ZONE_SPRITE
- dc.b "hit spr zon","e"+$80,"00,0,0",-1
- dc.w -1,L_HIT_ZONE_BOB
- dc.b "hit bob zon","e"+$80,"00,0,0",-1
- dc.w -1,L_CHECK_SPR
- dc.b "hit spr chec","k"+$80,"00t0,0,0,0",-1
- dc.w -1,L_RAW_KEY
- dc.b "raw ke","y"+$80,"00",-1
- dc.w L_R_POS,-1
- dc.b "r mov","e"+$80,"I0,0",-1
- dc.w L_R_LINE,-1
- dc.b "r dra","w"+$80,"I0,0",-1
- dc.w L_R_BOX,-1
- dc.b "r bo","x"+$80,"I0,0",-1
- dc.w L_R_HOME,-1
- dc.b "r hom","e"+$80,"I0,0",-1
- dc.w L_R_BAR,-1
- dc.b "r ba","r"+$80,"I0,0",-1
- dc.w L_DEF_OBJ_CH,-1
- dc.b "reserve object chi","p"+$80,"I0,0",-1
- dc.w L_DEF_OBJ_FA,-1
- dc.b "reserve object fas","t"+$80,"I0,0",-1
- dc.w L_DEF_OBJ_DRAW,-1
- dc.b "define dra","w"+$80,"I0,0t0,0",-1
- dc.w L_DEF_OBJ_MOVE,-1
- dc.b "define mov","e"+$80,"I0,0t0,0",-1
- dc.w L_DEF_OBJ_STOP,-1
- dc.b "define sto","p"+$80,"I0,0",-1
- dc.w L_DEF_OBJ_ATT,-1
- dc.b "define att","r"+$80,"I0,0t0,0",-1
- dc.w L_OBJECT_DRAW,-1
- dc.b "object dra","w"+$80,"I0",-1
- dc.w L_R_OBJECT_DRAW,-1
- dc.b "r object dra","w"+$80,"I0,0,0",-1
- dc.w L_OBJ_MAG_DRAW,-1
- dc.b "object mag dra","w"+$80,"I0,0",-1
- dc.w L_R_OBJ_MAG_DRA,-1
- dc.b "r object mag dra","w"+$80,"I0,0,0,0",-1
- dc.w L_DISCARD_OBJECT,-1
- dc.b "object eras","e"+$80,"I0",-1
- dc.w L_LINE_3D,-1
- dc.b "line 3","d"+$80,"I0,0,0t0,0,0",-1
- dc.w L_EYE_3D,-1
- dc.b "eye 3","d"+$80,"I0,0",-1
- dc.w L_OBJECT_SAVE,-1
- dc.b "object sav","e"+$80,"I2,0t0",-1
- dc.w L_OBJECT_LOAD_CHIP,-1
- dc.b "object load chi","p"+$80,"I2,0",-1
- dc.w L_BLIT_STORE,-1
- dc.b "blit store lef","t"+$80,"I0,0,0,0t0,0,0",-1
- dc.w L_MULTI_BLIT,-1
- dc.b "multi bli","t"+$80,"I0t0",-1
- dc.w L_ERASE_BLIT,-1
- dc.b "blit eras","e"+$80,"I0",-1
- dc.w L_BLIT_SPEED,-1
- dc.b "blit spee","d"+$80,"I0,0",-1
- dc.w L_BLIT_LEFT,-1
- dc.b "blit lef","t"+$80,"I0,0,0t0,0,0",-1
- dc.w L_FAST_PLOT,-1
- dc.b "f plo","t"+$80,"I0,0,0",-1
- dc.w L_BLIT_CLEAR,-1
- dc.b "blit clea","r"+$80,"I0",-1
- dc.w -1,L_LEFT_CLICK
- dc.b "left clic","k"+$80,"0",-1
- dc.w L_RES_STARS,-1
- dc.b "reserve star","s"+$80,"I0",-1
- dc.w L_DEF_STAR,-1
- dc.b "define sta","r"+$80,"I0,0,0,0,0",-1
- dc.w L_DRAW_STARS,-1
- dc.b "display star","s"+$80,"I",-1
- dc.w L_ERASE_STARS,-1
- dc.b "stars eras","e"+$80,"I",-1
- dc.w L_COMPUTE_STARS,-1
- dc.b "stars comput","e"+$80,"I0t0",-1
- dc.w L_F_STARS,-1
- dc.b "f star","s"+$80,"I",-1
- dc.w L_STARS_SPEED,-1
- dc.b "stars spee","d"+$80,"I0t0,0,0",-1
- dc.w L_CLIP_STARS,-1
- dc.b "stars cli","p"+$80,"I0,0,0,0",-1
- dc.w -1,L_FAST_POINT
- dc.b "f poin","t"+$80,"00,0",-1
- dc.w L_F_CIRCLE,-1
- dc.b "f circl","e"+$80,"I0,0,0,0",-1
- dc.w -1,L_FAST_SQR
- dc.b "f sq","r"+$80,"00",-1
- dc.w L_STARS_INT_ON,-1
- dc.b "stars int o","n"+$80,"I0",-1
- dc.w L_STARS_INT_OFF,-1
- dc.b "stars int of","f"+$80,"I",-1
- dc.w L_BLIT_INT_ON,-1
- dc.b "blit int o","n"+$80,"I0t0",-1
- dc.w L_BLIT_INT_OFF,-1
- dc.b "blit int of","f"+$80,"I",-1
- dc.w L_FAST_DRAW,-1
- dc.b "!f dra","w"+$80,"I0,0t0,0",-2
- dc.w L_FAST_DRAW_TO,-1
- dc.b $80,"I0,0",-1
- dc.w L_SET_OBJECT_LIMIT,-1
- dc.b "object limi","t"+$80,"I0",-1
- dc.w L_SET_PLANES,-1
- dc.b "set plane","s"+$80,"I0",-1
- dc.w L_PLANE_OFFSET,-1
- dc.b "plane offse","t"+$80,"I0,0,0,0",-1
- dc.w L_PLANE_SWAP,-1
- dc.b "plane swa","p"+$80,"I0,0,0",-1
- dc.w L_PLANE_SH_UP,-1
- dc.b "plane shift u","p"+$80,"I0,0t0",-1
- dc.w L_PLANE_SH_DOWN,-1
- dc.b "plane shift dow","n"+$80,"I0,0t0",-1
- dc.w L_PLANE_UPDATE,-1
- dc.b "plane updat","e"+$80,"I0",-1
- dc.w F_PASTE_ICON,-1
- dc.b "f paste ico","n"+$80,"I0,0,0",-1
- dc.w F_32BIT_ICON,-1
- dc.b "f 32 ico","n"+$80,"I0,0,0",-1
- dc.w F_16BIT_ICON,-1
- dc.b "f 16 ico","n"+$80,"I0,0,0",-1
- dc.w F_PROC_16ICON,-1
- dc.b "f 16proc ico","n"+$80,"I0,0,0",-1
- dc.w F_PROC_32ICON,-1
- dc.b "f 32proc ico","n"+$80,"I0,0,0",-1
- dc.w -1,L_ICON_X
- dc.b "x ico","n"+$80,"00",-1
- dc.w -1,L_ICON_Y
- dc.b "y ico","n"+$80,"00",-1
- dc.w -1,L_ICON_PLANES
- dc.b "planes ico","n"+$80,"00",-1
- dc.w -1,L_CPU_INFO
- dc.b "cpu inf","o"+$80,"0",-1
- dc.w -1,L_MATH_INFO
- dc.b "math inf","o"+$80,"0",-1
- dc.w 0
-
- iii equ 0
-
- C_Lib
- ******************************************************************
- * COLD START
- *
-
-
- L0 movem.l a3-a6,-(sp)
-
- ;
- ; Here I store the address of the extension data zone in the special area
- lea MB(pc),a3
- move.l a3,ExtAdr+ExtNb*16(a5)
- ;
- ; Here, I store the address of the routine called by DEFAULT, or RUN
- lea Default(pc),a0
- move.l a0,ExtAdr+ExtNb*16+4(a5)
- ;
- ; Here, the address of the END routine,
- lea End(pc),a0
- move.l a0,ExtAdr+ExtNb*16+8(a5)
- movem.l (sp)+,a3-a6
- moveq #ExtNb,d0 * NO ERRORS
- rts
-
- ******* SCREEN RESET
-
- Default RTS
-
- ******* QUIT
-
- End RTS
-
-
- ; Now follows a big chunk of data. Better disable the RBsr system...
-
- RDATA
-
- *********************************************************************
- * extension data zone
- MB:
- ZONE_DEFS DC.L 0
- RESERVED_BYTES DC.L 0
- MAX_CHECK DC.W 0
- OBJECT_LIMIT DC.W 0
- OBJECT_ADRES_BASE DC.L 0
- OBJECT_POINT_BASE DC.L 0
- OBJECT_DISKNAME DS.B 80 MAX LENGTE VAN BETANDSNAAM
- OBJECT_DISK_HEADER DC.B "OBJE" HEADER DEFINITIE VAN OBJECT FILE
- OBJECT_DISK_COUNT DC.W 0 HOEVEEL OBJECTEN ZIJN ER ?
- OBJECT_READ_BUFFER DS.B 8 8 BYTES OF READ BUFFER
- X_VIEW DC.W 160
- Y_VIEW DC.W 100
- BLIT_DEFS DS.L 96
- STARS_ADRES DC.L 0
- STARS_COUNT DC.W 0
- OFFSET_COUNT DC.W 0
- OFFSET_ADRES DC.L 0
- COMPUTE_TO DC.W 0
- STARS_CLIP DS.W 4 CLIPPING THE STARS
- STARS_INT_SCREEN DC.L 0
- INT_STARS_SERVER DC.L 0
- INT_BLIT_SERVER DC.L 0
- INT_BLIT_FROM DC.W 0
- INT_BLIT_TO DC.W 0
- INT_STARS_ON DC.W 0
- STARS_INT_CLEAR DC.W 0
- INT_BLIT_ON DC.W 0
- INT_STARS_NAME DC.B "STARS_INT",0
- INT_BLIT_NAME DC.B "BLITTER_I",0
- EVEN
- X1 DC.W 0
- Y1 DC.W 0
- X2 DC.W 0
- Y2 DC.W 0
- PLANE_OFFSETS DS.L 48 6 OFFSETS * 8 SCREENS
- ECLOGIC_SAVE DS.L 6 \
- ECPHYSIC_SAVE DS.L 6 |-> temporary storage-> Plane Update
- ECCURRENT_SAVE DS.L 6 /
- EVEN
- **********************************************************************
- ; Please leave 1 or two labels free for future extension. You never
- ; know!
- L1
-
- ; Now follow all the routines.
-
-
- L_MULTI_YES EQU 2
- L2 MOVE.L A6,A2
- CALLEXEC Permit ENABLE MULTITASKING
- MOVE.L A2,A6
- RTS
-
- L_MULTI_NO EQU 3
- L3 MOVE.L A6,A2
- CALLEXEC Forbid DISABLE MULTITASKING
- MOVE.L A2,A6
- RTS
-
- L_LSL_B EQU 4
- L4 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSL.B D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_LSL_W EQU 5
- L5 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSL.W D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_LSL_L EQU 6
- L6 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSL.L D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_LSR_B EQU 7
- L7 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSR.B D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_LSR_W EQU 8
- L8 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSR.W D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_LSR_L EQU 9
- L9 MOVE.L (A3)+,D0 SHIFT COUNT
- MOVE.L (A3)+,D3 VALUE TO BE SHIFTED
- LSR.L D0,D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_SWAP_VAL EQU 10
- L10 MOVE.L (A3)+,D3 VALUE TO BE SWAPPED
- SWAP D3 DO IT, AND RETURN VALUE
- MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_TEST_B EQU 11
- L11 MOVEQ #0,D3 SET FALSE
- MOVE.L (A3)+,D0 TEST VALUE
- MOVE.L (A3)+,D1 VALUE TO BE TESTED
- CMP.B D0,D1 EQUAL ?
- BNE.S NEE_B
- MOVEQ #-1,D3 OK, IS EQUAL. RETURN TRUE
- NEE_B MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_TEST_W EQU 12
- L12 MOVEQ #0,D3 SET FALSE
- MOVE.L (A3)+,D0 TEST VALUE
- MOVE.L (A3)+,D1 VALUE TO BE TESTED
- CMP.W D0,D1 EQUAL ?
- BNE.S NEE_W
- MOVEQ #-1,D3 OK, IS EQUAL. RETURN TRUE
- NEE_W MOVEQ #0,D2 THE RETURNED VALUE IS AN INTEGER
- RTS
-
- L_VBL_WAIT EQU 13
- L13 MOVE.L (A3)+,D0 LINE TO WAIT FOR
- VERTIC MOVE.B $DFF006,D1 ACTUAL POSITION OF RASTER BEAM
- CMP.B D0,D1 EQUAL ?
- BNE.S VERTIC
- RTS
-
- L_RESERVE_CHECK EQU 14
- L14 MOVE.L (A3)+,D0 HOW MANY CHECK ZONES
- CMP.L #32001,D0 MORE THAN 32000 ?
- Rbge L_IFonc
- MOVE.W D0,D5
- Dload A2
- CMP.W #0,MAX_CHECK-MB(A2) ANY ZONES RESERVED ?
- BNE.S IS_RESERVED DISPLAY ERROR MESSAGE
- MULU #10,D0 10 BYTES FOR EVERY CHECK ZONE
- MOVE.L D0,RESERVED_BYTES-MB(A2) STORE THE RESERVED AMOUNT
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- MOVE.L A6,-(SP)
- CALLEXEC AllocMem RESERVE THE MEMORY (CHIP+CLEARED)
- MOVE.L (SP)+,A6
- Rbeq OUT_OF_MEM
- MOVE.L D0,ZONE_DEFS-MB(A2) STORE THE ADRES OF THE CHECK DEFS
- MOVE.W D5,MAX_CHECK-MB(A2) STORE THE AMOUNT OF CHECK ZONES
- RTS
- IS_RESERVED MOVEQ #0,D0 CHECK ALLREADY RESERVED
- Rbra L_CUSTOM
-
- L_RELEASE_CHECK EQU 15
- L15 Dload A2
- CMP.W #0,MAX_CHECK-MB(A2) CHECK ZONES TO BE CLEARED
- BEQ.S NO_RELEASE NO ! ERROR !
- MOVE.L ZONE_DEFS-MB(A2),A1 GET THE ADRESS OF THE MEMORY
- MOVE.W #0,MAX_CHECK-MB(A2) CLEAR THE AMOUNT OF CHECK ZONES
- MOVE.L RESERVED_BYTES-MB(A2),D0 HOW MANY BYTES RESERVED ?
- MOVE.L A6,-(SP)
- CALLEXEC FreeMem FREE THE MEMORY USED
- MOVE.L (SP)+,A6
- RTS
- NO_RELEASE MOVEQ #1,D0 CHECK ALLREADY RELEASED !
- Rbra L_CUSTOM
- RTS
-
- L_CHECK_ZONE EQU 16
- L16 MOVEM.L (A3)+,D4-D7 GET PARAMETERS
- Dload A1
- CMP.W #0,MAX_CHECK-MB(A1) ANY ZONES RESERVED ?
- BEQ.S DONT_CHECK_ZONE NO ZONES RESERVED !
- CMP.W MAX_CHECK-MB(A1),D6
- BGT.S ERROR_CHECK END > MAX CHECK ZONES
- CMP.W #1,D7
- BLT.S ERROR_CHECK START < 1
- SUB.W D7,D6
- BMI.S ERROR_CHECK END < START
- SUBQ #1,D7
- MOVE.W D7,D3
- LSL.W #3,D7 D7 * 10 BUT FASTER !
- ADD.W D3,D7
- ADD.W D3,D7
- MOVE.L ZONE_DEFS-MB(A1),A0
- ADD.L D7,A0
- CHECK_LOOP MOVE.W (A0)+,D7 ZONE
- BMI.S NO_CHECK1
- MOVEM.W (A0)+,D0-D3 X1,X2,Y1,Y2
- CMP.W D1,D5 \
- BGT.S NO_CHECK |
- CMP.W D0,D5 |
- BLT.S NO_CHECK |
- CMP.W D3,D4 |-> CHECK IT !
- BGT.S NO_CHECK |
- CMP.W D2,D4 |
- BLT.S NO_CHECK /
- MOVE.W D7,D3 RETURN ZONE NUMBER
- MOVEQ #0,D2 VALUE RETURNED IS AN INTEGER
- RTS
- NO_CHECK1 ADDQ.L #8,A0
- NO_CHECK DBRA D6,CHECK_LOOP
- MOVEQ #0,D3 NO ZONE FOUND
- MOVEQ #0,D2 VALUE RETURNED IS AN INTEGER
- RTS
- ERROR_CHECK MOVEQ #23,D0
- Rjmp L_Error
- DONT_CHECK_ZONE MOVEQ #1,D0
- Rbra L_Custom
-
- L_CHECK_SET EQU 17
- L17 MOVE.L (A3)+,D4 Y2
- Rbmi L_IFonc
- MOVE.L (A3)+,D2 X2
- Rbmi L_IFonc
- MOVE.L (A3)+,D3 Y1
- Rbmi L_IFonc
- MOVE.L (A3)+,D1 X1
- Rbmi L_IFonc
- MOVE.L (A3)+,D0 ZONE
- Rble L_IFonc
- Dload A1
- CMP.W MAX_CHECK-MB(A1),D0 ZONE TO BE INSTALLED >
- Rbhi L_IFonc MAX AMOUNT OF ZONES ?
- MOVE.W D0,D5
- SUBQ #1,D0
- MOVE.W D0,D6
- LSL.W #3,D0 D0 * 10 BUT FASTER
- ADD.W D6,D0
- ADD.W D6,D0
- MOVE.L ZONE_DEFS-MB(A1),A0
- ADD.L D0,A0
- MOVE.W D5,D0
- MOVEM.W D0-D4,(A0) STORE X1,Y1,X2,Y1
- RTS
-
- L_CHECK_DISCARD EQU 18
- L18 MOVE.L (A3)+,D0
- Dload A1
- CMP.W #0,MAX_CHECK-MB(A1) ANY ZONES RESERVED ?
- BEQ.S NOT_RESERVED NO ! DISPLAY MESSAGE !
- SUBQ #1,D0
- Rbmi L_IFonc
- CMP.W MAX_CHECK-MB(A1),D0 ZONE TO BE DISCARDED >
- Rbhi L_IFonc MAX AMOUNT OF ZONES ?
- MOVE.W D0,D1
- LSL.W #3,D0 D0 * 10 BUT FASTER
- ADD.W D1,D0
- ADD.W D1,D0
- MOVE.L ZONE_DEFS-MB(A1),A0
- MOVE.W #-1,(A0,D0.L) DISCARD THE ZONE
- RTS
- NOT_RESERVED MOVEQ #1,D0
- Rbra L_Custom
-
- L_HIT_ZONE_SPRITE EQU 19
- L19 MOVE.L (A3)+,D1 SPRITE NUMBER
- SyCall XYSp GET X (D1) AND Y (D2) COORDINATES
- ADD.L (A3)+,D2 Y COOR TO BE CHECKED
- ADD.L (A3)+,D1 X COOR TO BE CHECKED
- MOVEQ #0,D3
- MOVEQ #8,D5
- SyCall ZoHd CHECK THE ZONES
- MOVE.W D1,D3 RETURN ZONE
- MOVEQ #0,D2 VALUE RETURNED IS AN INTEGER
- RTS
-
- L_HIT_ZONE_BOB EQU 20
- L20 MOVE.L (A3)+,D1 BOB NUMBER
- SyCall XYBob GET X (D1) AND Y (D2) COORDINATES
- ADD.L (A3)+,D2 Y COOR TO BE CHECKED
- ADD.L (A3)+,D1 X COOR TO BE CHECKED
- MOVEQ #0,D3
- SyCall ZoGr CHECK THE ZONES
- MOVE.W D1,D3 RETURN ZONE
- MOVEQ #0,D2 VALUE RETURNED IS AN INTEGER
- RTS
-
- L_CHECK_SPR EQU 21
- L21 Dload A1
- CMP.W #0,MAX_CHECK-MB(A1)
- BEQ.S DONT_CHECK_SPR
- MOVE.L (A3)+,D1 Get Sprite Number
- SyCall XYSp GET X (D1) AND Y (D2) COORDINATES
- ADD.L (A3)+,D2 Y COOR TO BE CHECKED
- ADD.L (A3)+,D1 X COOR TO BE CHECKED
- MOVEQ #0,D3
- SyCall XyScr CONVERT FORM HARDWARE COORDINATES
- EXG D2,D4 TO SCREEN COORDINATES
- EXG D1,D5
- MOVE.L (A3)+,D6 GET PARAMETERS
- MOVE.L (A3)+,D7
- CMP.W MAX_CHECK-MB(A1),D6 END > AMOUNT RESERVED
- Rbhi L_IFonc
- CMP.W #1,D7
- Rblt L_IFonc START < 1
- SUB.W D7,D6
- Rbmi L_IFonc
- SUBQ #1,D7
- MOVE.W D7,D3
- LSL.W #3,D7 D7 * 10 BUT FASTER
- ADD.W D3,D7
- ADD.W D3,D7
- MOVE.L ZONE_DEFS-MB(A1),A0
- ADD.L D7,A0
- CHECK_LOOP_SPR MOVE.W (A0)+,D7 ZONE
- BMI.S NO_CHECK_SPR1 ZONE IS DISCARDED
- MOVEM.W (A0)+,D0-D3 X1,X2,Y1,Y2
- CMP.W D1,D5
- BGT.S NO_CHECK_SPR
- CMP.W D0,D5
- BLT.S NO_CHECK_SPR
- CMP.W D3,D4
- BGT.S NO_CHECK_SPR
- CMP.W D2,D4
- BLT.S NO_CHECK_SPR
- MOVE.W D7,D3 RETURN ZONE NUMBER
- MOVEQ #0,D2 VALUE RETUNED IS AN INTEGER
- RTS
- NO_CHECK_SPR1 ADDQ.L #8,A0
- NO_CHECK_SPR DBRA D6,CHECK_LOOP_SPR
- MOVEQ #0,D3 NO ZONE FOUND
- MOVEQ #0,D2 VALUE RETURNED IS AN INTEGER
- RTS
- DONT_CHECK_SPR MOVEQ #1,D0
- Rbra L_Custom
-
- L_RAW_KEY EQU 22
- L22 MOVE.L (A3)+,D0
- LEA $BFE001,A0
- MOVE.B $C00(A0),D1 GET KEY
- MOVEQ #$0,D2
- MOVE.B D2,$E00(A0) CLEAR BUFFER
- MOVE.B D2,$E00(A0) CLEAR BUFFER
- ORI.B #$40,$E00(A0)
- NOT.B D1
- ROR.B #1,D1
- MOVEQ #$64,D7
- KEYW:
- DBF D7,KEYW
- ANDI.B #$BF,$E00(A0)
- ADD.W #256,D1
- EXT.W D1
- SUB.W D0,D1
- BEQ.S JUISTE_TOETS
- MOVEQ #0,D3
- MOVEQ #0,D2
- RTS
- JUISTE_TOETS MOVEQ #-1,D3
- MOVEQ #0,D2
- RTS
-
- L_R_POS EQU 23
- L23 MOVE.L T_Rastport(A5),A1
- MOVE.L (A3)+,D1 DY COORD
- MOVE.L (A3)+,D0 DX COORD
- ADD.W D0,36(A1) NEW X POS
- ADD.W D1,38(A1) NEW Y POS
- RTS
-
- L_R_LINE EQU 24
- L24 MOVE.L A6,A2
- MOVE.L T_Rastport(A5),A1
- MOVE.L T_GfxBase(a5),A6
- MOVE.L (A3)+,D1 DY
- MOVE.L (A3)+,D0 DX
- MOVE.W 36(A1),D2 GET ACTUAL X POSITION OF GFX CURSOR
- MOVE.W 38(A1),D3 GET ACTUAL Y POSITION OF GFX CURSOR
- ADD.W D2,D0 SET X COORD TO BE DRAWN TO
- ADD.W D3,D1 SET Y COORD TO BE DRAWN TO
- JSR -246(A6) DRAW THE LINE
- MOVE.L A2,A6
- RTS
-
- L_R_BOX EQU 25
- L25 MOVE.L A6,A2
- MOVE.L T_Rastport(A5),A1
- MOVE.L T_GfxBase(A5),A6
- MOVE.L (A3)+,D7 DY
- MOVE.L (A3)+,D6 DX
- MOVE.W 36(A1),D4 GET ACTUAL X POSITION OF GFX CURSOR
- MOVE.W 38(A1),D5 GET ACTUAL Y POSITION OF GFX CURSOR
- ADD.W D6,D4 ACTUAL X + DX
- MOVE.W D4,D0 SET X COORD TO BE DRAWN TO
- MOVE.W D5,D1 SET Y COORD TO BE DRAWN TO (ACTUAL Y)
- JSR -246(A6) DRAW THE LINE
- MOVE.W D4,D0 SET X COORD TO BE DRAWN TO (ACTUAL X)
- ADD.W D7,D5 ACTUAL Y + DY
- MOVE.W D5,D1 SET Y COORD TO BE DRAWN TO
- JSR -246(A6) DRAW THE LINE
- SUB.W D6,D4 ACTUAL X - DX
- MOVE.W D4,D0 SET X COORD TO BE DRAWN TO
- MOVE.W D5,D1 SET Y COORD TO BE DRAWN TO (Y + DY)
- JSR -246(A6) DRAW THE LINE
- SUB.W D7,D5 Y - DY = ACTUAL Y
- MOVE.W D5,D1 SET Y COORD TO BE DRAWN TO
- MOVE.W D4,D0 SET X COORD TO BE DRAWN TO (X - DX)
- JSR -246(A6) DRAW THE LINE
- MOVE.L A2,A6
- RTS
-
- L_R_HOME EQU 26
- L26 MOVE.L T_Rastport(A5),A1
- MOVE.L (A3)+,D1 GET Y
- MOVE.L (A3)+,D0 GET X
- MOVE.W D0,36(A1) SET X POSITION OF GFX CURSOR
- MOVE.W D1,38(A1) SET Y POSITION OF GFX CURSOR
- RTS
-
- L_R_BAR EQU 27
- L27 MOVE.L A6,A2
- MOVE.L T_Rastport(A5),A1
- MOVE.L T_GfxBase(A5),A6
- MOVE.W 36(A1),D0 GET ACTUAL X POSITION OF GFX CURSOR
- MOVE.W 38(A1),D1 GET ACTUAL Y POSITION OF GFX CURSOR
- MOVE.L (A3)+,D3 GET DY
- Rbmi L_IFonc Y1 < 0 ERROR !
- MOVE.L (A3)+,D2 GET DX
- Rbmi L_IFonc X1 < 0 ERROR !
- ADD.W D0,D2 X1 = ACTUAL X + DX
- ADD.W D1,D3 Y1 = ACTUAL Y + DY
- JSR -306(A6) RECTFILL
- MOVE.L A2,A6
- RTS
-
- L_DEF_OBJ_CH EQU 28
- L28 MOVE.L (A3)+,D0 AMOUNT OF VECTORS
- Rble L_IFonc <= 0 ? ERROR
- MOVE.L D0,D6 SAVE AMOUNT OF VECTORS
- MOVE.L (A3)+,D2 OBJECT NR
- DLOAD A2
- CMP.W OBJECT_LIMIT-MB(A2),D2
- BGT.S OVER_LIMIT_CH
- SUBQ #1,D2
- Rbmi L_IFonc < 0 ? ERROR
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D2,D2
- MOVE.L D2,D7 USE FOR POINT_BASE
- ADD.L D2,D2 USE FOR ADRES_BASE
- TST.L (A0,D2.L)
- BNE.S IS_SET_CH
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- MULU #6,D0
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- JSR ALLOCMEM(A6)
- MOVE.L A2,A6
- RBEQ OUT_OF_MEM
- DLOAD A2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- MOVE.L D0,(A0,D2.L) PUT ADDRESS OF OBJECT
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0
- MOVE.W D6,(A0,D7.L) PUT AMOUNT OF VECTORS
- RTS
- IS_SET_CH MOVEQ #2,D0
- Rbra L_Custom
- OVER_LIMIT_CH MOVEQ #18,D0
- RBRA L_CUSTOM
-
- L_DEF_OBJ_FA EQU 29
- L29 MOVE.L (A3)+,D0 AMOUNT OF VECTORS
- Rble L_IFonc <= 0 ? ERROR
- MOVE.L D0,D6 SAVE AMOUNT OF VECTORS
- MOVE.L (A3)+,D2 OBJECT NR
- DLOAD A2
- CMP.W OBJECT_LIMIT-MB(A2),D2
- BGT.S OVER_LIMIT_FA
- SUBQ #1,D2
- Rbmi L_IFonc < 0 ? ERROR
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D2,D2
- MOVE.L D2,D7 USE FOR POINT_BASE
- ADD.L D2,D2 USE FOR ADRES_BASE
- TST.L (A0,D2.L)
- BNE.S IS_SET_FA
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- MULU #6,D0
- MOVE.L #MEMF_FAST+MEMF_CLEAR,D1
- JSR ALLOCMEM(A6)
- MOVE.L A2,A6
- RBEQ OUT_OF_MEM
- DLOAD A2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- MOVE.L D0,(A0,D2.L) PUT ADDRESS OF OBJECT
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0
- MOVE.W D6,(A0,D7.L) PUT AMOUNT OF VECTORS
- RTS
- IS_SET_FA MOVEQ #2,D0
- Rbra L_Custom
- OVER_LIMIT_FA MOVEQ #18,D0
- RBRA L_CUSTOM
-
- L_DEF_OBJ_DRAW EQU 30
- L30 MOVE.L (A3)+,D1 GET Y
- MOVE.L (A3)+,D0 GET X
- MOVE.L (A3)+,D2 GET VECTOR
- Rble L_IFonc
- MOVE.L (A3)+,D3 GET OBJECT
- SUBQ #1,D3
- BMI.S NOT_DEF_DR OBJECT < 0 ? ERROR
- MOVE.L D3,D5
- ADD.L D5,D5
- DLOAD A2
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0 ADRESS OF OBJECT POINTS
- CMP.W (A0,D5.L),D2 CHECK AMOUNT OF VECTORS
- BGT.S TOO_MUCH_DR TOO MANY VECTORS --> ERROR !
- SUBQ #1,D2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D5,D5
- MOVE.L (A0,D5.L),D5 GET ADDRESS OF OBJECT
- BEQ.S NOT_DEF_DR DEFINED ? NO --> ERROR
- MOVE.L D5,A1
- MULU #6,D2 GET VECTOR POSITION
- MOVE.W #0,(A1,D2.L) DEFINE IT AS A DRAW INSTRUCTION
- MOVEM.W D0-D1,2(A1,D2.L) STORE X AND Y TO BE DRAWN TO
- RTS
- NOT_DEF_DR MOVEQ #3,D0
- Rbra L_Custom
- TOO_MUCH_DR MOVEQ #4,D0
- Rbra L_Custom
-
- L_DEF_OBJ_MOVE EQU 31
- L31 MOVE.L (A3)+,D1 GET Y
- MOVE.L (A3)+,D0 GET X
- MOVE.L (A3)+,D2 GET VECTOR
- Rble L_IFonc
- MOVE.L (A3)+,D3 GET OBJECT
- SUBQ #1,D3
- BMI.S NOT_DEF_MOV OBJECT < 0 ? ERROR
- MOVE.L D3,D5
- ADD.L D5,D5
- DLOAD A2
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0 ADRESS OF OBJECT POINTS
- CMP.W (A0,D5.L),D2 CHECK AMOUNT OF VECTORS
- BGT.S TOO_MUCH_MOV TOO MANY VECTORS --> ERROR !
- SUBQ #1,D2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D5,D5
- MOVE.L (A0,D5.L),D5 GET ADDRESS OF OBJECT
- BEQ.S NOT_DEF_MOV DEFINED ? NO --> ERROR
- MOVE.L D5,A1
- MULU #6,D2
- MOVE.W #-1,(A1,D2.L)
- MOVEM.W D0-D1,2(A1,D2.L)
- RTS
- NOT_DEF_MOV MOVEQ #3,D0
- Rbra L_Custom
- TOO_MUCH_MOV MOVEQ #5,D0
- Rbra L_Custom
-
- L_DEF_OBJ_STOP EQU 32
- L32 MOVE.L (A3)+,D2 WELK PUNT
- Rble L_IFonc
- MOVE.L (A3)+,D3 WELK OBJECT
- SUBQ #1,D3
- BMI.S NOT_DEF_STOP
- MOVE.L D3,D5
- ADD.L D5,D5
- DLOAD A2
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0 ADRESS OF OBJECT POINTS
- CMP.W (A0,D5.L),D2 CHECK AMOUNT OF VECTORS
- BGT.S TOO_MUCH_STOP TOO MANY VECTORS --> ERROR !
- SUBQ #1,D2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D5,D5
- MOVE.L (A0,D5.L),D5 GET ADDRESS OF OBJECT
- BEQ.S NOT_DEF_STOP DEFINED ? NO --> ERROR
- MOVE.L D5,A1
- MULU #6,D2
- MOVE.W #1,(A1,D2.L)
- RTS
- NOT_DEF_STOP MOVEQ #3,D0
- Rbra L_Custom
- TOO_MUCH_STOP MOVEQ #5,D0
- Rbra L_Custom
-
- L_DEF_OBJ_ATT EQU 33
- L33 MOVE.L (A3)+,D1 MASK
- MOVE.L (A3)+,D0 COLOUR
- MOVE.L (A3)+,D2 WELK PUNT
- Rble L_IFonc
- MOVE.L (A3)+,D3 WELK OBJECT
- SUBQ #1,D3
- BMI.S NOT_DEF_COL
- MOVE.L D3,D5
- ADD.L D5,D5
- DLOAD A2
- MOVE.L OBJECT_POINT_BASE-MB(A2),A0 ADRESS OF OBJECT POINTS
- CMP.W (A0,D5.L),D2 CHECK AMOUNT OF VECTORS
- BGT.S TOO_MUCH_COL TOO MANY VECTORS --> ERROR !
- SUBQ #1,D2
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A0
- ADD.L D5,D5
- MOVE.L (A0,D5.L),D5 GET ADDRESS OF OBJECT
- BEQ.S NOT_DEF_COL DEFINED ? NO --> ERROR
- MOVE.L D5,A1
- MULU #6,D2
- MOVE.W #2,(A1,D2.L)
- MOVEM.W D0-D1,2(A1,D2.L)
- RTS
- NOT_DEF_COL MOVEQ #3,D0
- Rbra L_Custom
- TOO_MUCH_COL MOVEQ #6,D0
- Rbra L_Custom
-
-
- L_OBJECT_DRAW EQU 34
- L34 MOVE.L (A3)+,D3
- SUBQ #1,D3
- Rbmi L_IFonc
- Dload A0
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- ADD.L D3,D3
- MOVE.L D3,D5
- ADD.L D3,D3
- MOVE.L (A1,D3.L),D0
- BEQ.S DONT_DRAW OBJECT NOT DEFINED ? --> ERROR !
- MOVE.L D0,A2
- MOVE.L OBJECT_POINT_BASE-MB(A0),A0
- MOVE.W (A0,D5.L),D5
- SUBQ #1,D5 --> AANTAL KEER -1
- MOVE.L A6,-(sp)
- MOVE.L T_RastPort(A5),A1
- MOVE.L T_GfxBase(A5),A6
- DRAW_LOOP MOVE.W (A2)+,D3
- BEQ.S JUST_DRAW
- BMI.S JUST_MOVE
- CMP.W #1,D3
- BEQ.S STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,DRAW_LOOP
- JUST_MOVE MOVE.L (A2)+,36(A1) PUT X AND Y IN Rp STRUCT
- DBRA D5,DRAW_LOOP
- STOP MOVE.L (sp)+,A6
- RTS
- JUST_DRAW MOVEM.W (A2)+,D0-1
- JSR -246(A6)
- DBRA D5,DRAW_LOOP
- MOVE.L (sp)+,A6
- RTS
- DONT_DRAW MOVEQ #3,D0
- Rbra L_Custom
-
- L_R_OBJECT_DRAW EQU 35
- L35 MOVE.L (A3)+,D7 DY
- MOVE.L (A3)+,D6 DX
- MOVE.L (A3)+,D3
- SUBQ #1,D3
- Rbmi L_IFonc
- Dload A0
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- ADD.L D3,D3
- MOVE.L D3,D5
- ADD.L D3,D3
- MOVE.L (A1,D3.L),D0
- BEQ.S DONT_R_DRAW OBJECT NOT DEFINED ? --> ERROR !
- MOVE.L D0,A2
- MOVE.L OBJECT_POINT_BASE-MB(A0),A0
- MOVE.W (A0,D5.L),D5
- SUBQ #1,D5 --> AANTAL KEER -1
- MOVE.L A6,-(sp)
- MOVE.L T_RastPort(A5),A1
- MOVE.L T_GfxBase(A5),A6
- R_DRAW_LOOP MOVE.W (A2)+,D3
- BEQ.S JUST_R_DRAW
- BMI.S JUST_R_MOVE
- CMP.W #1,D3
- BEQ.S R_STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,R_DRAW_LOOP
- JUST_R_MOVE MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- ADD.W D6,D0
- ADD.W D7,D1
- MOVEM.W D0-1,36(A1)
- DBRA D5,R_DRAW_LOOP
- R_STOP MOVE.L (sp)+,A6
- RTS
- JUST_R_DRAW MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- ADD.W D6,D0
- ADD.W D7,D1
- JSR -246(A6)
- DBRA D5,R_DRAW_LOOP
- MOVE.L (sp)+,A6
- RTS
- DONT_R_DRAW MOVEQ #3,D0
- Rbra L_Custom
-
- L_OBJ_MAG_DRAW EQU 36
- L36 MOVE.L (A3)+,D2
- MOVE.L (A3)+,D3
- SUBQ #1,D3
- Rbmi L_IFonc
- Dload A0
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- ADD.L D3,D3
- MOVE.L D3,D5
- ADD.L D3,D3
- MOVE.L (A1,D3.L),D0
- BEQ.S DONT_MAG_DRAW OBJECT NOT DEFINED ? --> ERROR !
- MOVE.L D0,A2
- MOVE.L OBJECT_POINT_BASE-MB(A0),A0
- MOVE.W (A0,D5.L),D5
- SUBQ #1,D5 --> AANTAL KEER -1
- MOVE.L A6,-(sp)
- MOVE.L T_RastPort(A5),A1
- MOVE.L T_GfxBase(A5),A6
- CMP.W #0,D2
- BLT.S DRAW_MIN
- DRAW_MAG_LOOP MOVE.W (A2)+,D6
- BEQ.S JUST_MAG_DRAW
- BMI.S JUST_MAG_MOVE
- CMP.W #1,D6
- BEQ.S MAG_STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,DRAW_MAG_LOOP
- JUST_MAG_MOVE MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- MULS D2,D0
- MULS D2,D1
- MOVEM.W D0-1,36(A1)
- DBRA D5,DRAW_MAG_LOOP
- MAG_STOP MOVE.L (sp)+,A6
- RTS
- JUST_MAG_DRAW MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- MULS D2,D0
- MULS D2,D1
- JSR -246(A6)
- DBRA D5,DRAW_MAG_LOOP
- MOVE.L (sp)+,A6
- RTS
- DONT_MAG_DRAW MOVEQ #3,D0
- Rbra L_Custom
- DRAW_MIN NEG.W D2
- DRAW_MIN_LOOP MOVE.W (A2)+,D6
- BEQ.S JUST_MIN_DRAW
- BMI.S JUST_MIN_MOVE
- CMP.W #1,D6
- BEQ.S MIN_STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,DRAW_MIN_LOOP
- JUST_MIN_MOVE MOVEM.W (A2)+,D0-D1
- DIVS D2,D0
- DIVS D2,D1
- MOVEM.W D0-1,36(A1)
- DBRA D5,DRAW_MIN_LOOP
- MIN_STOP MOVE.L (sp)+,A6
- RTS
- JUST_MIN_DRAW MOVEM.W (A2)+,D0-D1
- DIVS D2,D0
- DIVS D2,D1
- JSR -246(A6)
- DBRA D5,DRAW_MIN_LOOP
- MOVE.L (sp)+,A6
- RTS
-
- L_R_OBJ_MAG_DRA EQU 37
- L37 MOVEM.L (A3)+,D2-D5
- SUBQ #1,D5
- Rbmi L_IFonc
- Dload A0
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- ADD.L D5,D5
- MOVE.L D5,D0
- ADD.L D5,D5
- MOVE.L (A1,D5.L),D1
- BEQ.S DONT_MAG_DRAW OBJECT NOT DEFINED ? --> ERROR !
- MOVE.L D1,A2
- MOVE.L OBJECT_POINT_BASE-MB(A0),A0
- MOVE.W (A0,D0.L),D5
- SUBQ #1,D5 --> AANTAL KEER -1
- MOVE.L A6,-(sp)
- MOVE.L T_RastPort(A5),A1
- MOVE.L T_GfxBase(A5),A6
- CMP.W #0,D2
- BLT.S DRAW_R_MIN
- DRAW_R_MAG_LOOP MOVE.W (A2)+,D6
- BEQ.S JUST_R_MAG_DRAW
- BMI.S JUST_R_MAG_MOVE
- CMP.W #1,D6
- BEQ.S R_MAG_STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,DRAW_R_MAG_LOOP
- JUST_R_MAG_MOVE MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- MULS D2,D0
- MULS D2,D1
- ADD.W D4,D0
- ADD.W D3,D1
- MOVEM.W D0-1,36(A1)
- DBRA D5,DRAW_R_MAG_LOOP
- R_MAG_STOP MOVE.L (sp)+,A6
- RTS
- JUST_R_MAG_DRAW MOVE.W (A2)+,D0
- MOVE.W (A2)+,D1
- MULS D2,D0
- MULS D2,D1
- ADD.W D4,D0
- ADD.W D3,D1
- JSR -246(A6)
- DBRA D5,DRAW_R_MAG_LOOP
- MOVE.L (sp)+,A6
- RTS
- DONT_R_MAG_DRAW MOVEQ #3,D0
- Rbra L_Custom
- DRAW_R_MIN NEG.W D2
- DRAW_R_MIN_LOOP MOVE.W (A2)+,D6
- BEQ.S JUST_R_MIN_DRAW
- BMI.S JUST_R_MIN_MOVE
- CMP.W #1,D6
- BEQ.S R_MIN_STOP
- MOVE.W (A2)+,D0
- JSR -342(A6)
- MOVE.W (A2)+,D0
- JSR -354(A6)
- DBRA D5,DRAW_R_MIN_LOOP
- JUST_R_MIN_MOVE MOVEM.W (A2)+,D0-D1
- DIVS D2,D0
- DIVS D2,D1
- ADD.W D4,D0
- ADD.W D3,D1
- MOVEM.W D0-1,36(A1)
- DBRA D5,DRAW_R_MIN_LOOP
- R_MIN_STOP MOVE.L (sp)+,A6
- RTS
- JUST_R_MIN_DRAW MOVEM.W (A2)+,D0-D1
- DIVS D2,D0
- DIVS D2,D1
- ADD.W D4,D0
- ADD.W D3,D1
- JSR -246(A6)
- DBRA D5,DRAW_R_MIN_LOOP
- MOVE.L (sp)+,A6
- RTS
-
- L_DISCARD_OBJECT EQU 38
- L38 MOVE.L (A3)+,D0
- CMP.L #32000,D0
- RBHI L_IFONC
- DLOAD A0
- CMP.W OBJECT_LIMIT-MB(A0),D0
- BGT.S OVER_LIMIT
- SUBQ #1,D0
- Rbmi L_IFonc
- ADD.L D0,D0
- MOVE.L D0,D7 USE FOR POINT BASE
- ADD.L D0,D0 USE FOR ADRES BASE
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- MOVE.L (A1,D0.L),D1
- BEQ.S NOT_DEFINED
- CLR.L (A1,D0.L)
- MOVE.L D1,A1
- MOVE.L OBJECT_POINT_BASE-MB(A0),A0
- MOVE.W (A0,D7.L),D0
- MULU #6,D0
- MOVE.L A6,A2
- CALLEXEC FreeMem
- MOVE.L A2,A6
- RTS
- NOT_DEFINED MOVEQ #3,D0
- Rbra L_Custom
- OVER_LIMIT MOVEQ #18,D0
- RBRA L_CUSTOM
-
- L_OBJECT_SAVE EQU 39
- L39 MOVE.L (A3)+,D5 TO PARAM
- MOVE.L (A3)+,D4 FROM PARAM
- MOVE.L (A3)+,A0
- MOVE.W (A0)+,D0
- CMP.W #80,D0
- BGT NAME_TO_LONG
- MOVEM.L A3-A6,-(SP)
- SUBQ #1,D5
- SUBQ #1,D4
- MOVE.W D5,D7
- SUB.W D4,D7 AANTAL OBJECTEN
- SUBQ #1,D0
- Dlea OBJECT_DISKNAME,A1
- MOVE.L A1,A2
- PUT_NAME MOVE.B (A0)+,(A1)+ COPIEER NAAM + CHR$(0)
- DBRA D0,PUT_NAME
- MOVE.L DosBase(A5),A6
- MOVE.L A2,D1 POINTER NAAR NAAM
- MOVE.L #1006,D2 MODUS --> NEW
- JSR -30(A6) Open
- BEQ DISK_ERROR FOUT BIJ OPEN
- MOVE.L D0,A4
- Dload A0
- MOVE.W D7,OBJECT_DISK_COUNT-MB(A0)
- Dlea OBJECT_DISK_HEADER,A0
- MOVE.L D0,D1
- MOVE.L A0,D2
- MOVEQ.L #6,D3
- JSR -48(A6)
- BEQ.S SAVE_ERROR FOUT BIJ SAVEN HEADER
- LOOP_SAVE Dload A0
- ADD.W D4,D4
- ADD.W D4,D4
- MOVE.L OBJECT_ADRES_BASE-MB(A0),A1
- MOVE.L (A1,D4.L),D3 GEEF ADRES VAN VECTORS OM TE SAVEN
- BEQ.S GET_NEXT_OBJECT NIET GEDEFINIEERD ? VOLGENDE...
- MOVE.L D3,A2
- LSR.W #1,D4
- MOVE.L OBJECT_POINT_BASE-MB(A0),A1
- MOVE.W (A1,D4.L),D6 GEEF HET AANTAL PUNTEN VAN OBJECT
- ASR.W #1,D4
- Dlea OBJECT_DISK_COUNT,A0
- MOVE.W D6,(A0)
- MOVE.L A4,D1 HANDLE IN D1
- MOVE.L A0,D2 AANTAL VECTORS IN D2 --> BUFFER
- MOVEQ #2,D3 AANTAL TE SAVEN BYTES
- MOVE.L DosBase(A5),A6
- JSR -48(A6)
- BMI.S SAVE_ERROR
- EXT.L D6
- MULU #6,D6 AANTAL VECTORS * 6 --> 2 BYTES X 2 BYTES Y
- MOVE.L A4,D1 HANDLE IN D1
- MOVE.L A2,D2 ADRES VECTORS IN D2 --> BUFFER
- MOVE.L D6,D3 AANTAL TE SAVEN BYTES
- MOVE.L DosBase(A5),A6
- JSR -48(A6) Write GO!!!
- BMI.S SAVE_ERROR
- GET_NEXT_OBJECT ADDQ #1,D4
- CMP.W D5,D4
- BGT.S FINISH_SAVE
- BRA.S LOOP_SAVE
- SAVE_ERROR
- FINISH_SAVE MOVE.L DosBase(A5),A6
- MOVE.L A4,D1
- JSR -36(A6) Close !!!
- DISK_ERROR
- MOVEM.L (SP)+,A3-A6
- RTS
- NAME_TO_LONG MOVEQ #21,D0
- Rjmp L_Error
-
- L_OBJECT_LOAD_CHIP EQU 40
- L40 MOVE.L (A3)+,D7 LOAD FROM WHERE PARAMETER
- MOVE.L (A3)+,A0 POINTER STRING --> NAAM
- MOVE.W (A0)+,D0 GET LENGTH OF STRING
- CMP.W #80,D0
- BGT LOAD_TO_LONG NAAM -> 80 CHARS --> ERROR !
- MOVEM.L A3-A6,-(SP)
- SUBQ.W #1,D7
- SUBQ.W #1,D0
- Dlea OBJECT_DISKNAME,A1
- MOVE.L A1,A2 SAVE POINTER NAAM
- COPY_NAME MOVE.B (A0)+,(A1)+
- DBRA D0,COPY_NAME
- MOVE.L DosBase(A5),A6
- MOVE.L A2,D1 POINTER NAAM IN D1
- MOVE.L #1005,D2 MODUS --> READ
- JSR -30(A6) Open file
- BEQ OPEN_ERROR
- MOVE.L D0,A4 SAVE HANDLE !
- Dlea OBJECT_READ_BUFFER,A3
- MOVE.L D0,D1 HANDLE IN D1
- MOVE.L A3,D2 BUFFER IN D2
- MOVEQ.L #8,D3 LEES OBJECT HEADER + AANTAL OBJECTS
- JSR -42(A6) Read
- BEQ READ_ERROR SOMETHING WRONG !!!
- CMP.L #"OBJE",(A3) IS THIS AN OBJECT FILE ???
- BNE NO_OBJECT_FILE NO ? GET OUT OF HERE !!!
- MOVE.W 4(A3),D6 OBJECT COUNTER IN D6
- ADD.W D7,D6
- DLOAD A1
- MOVE.W OBJECT_LIMIT-MB(A1),D4
- BEQ LOAD_OVER_LIMIT
- SUBQ #1,D4
- CMP.W D4,D6
- BGT LOAD_OVER_LIMIT
- MOVE.W 6(A3),D5 AANTAL VERTICES OBJECT 1
- EXT.L D6 MAAK LONG -> VOOR ALLE ZEKERHEID
- EXT.L D5
- LOAD_LOOP Dload A1
- MOVE.L OBJECT_ADRES_BASE-MB(A1),A1
- LSL.W #2,D7
- MOVE.L (A1,D7.W),D4
- BNE.S IS_DEFINED DEFINED ? --> ERROR !
- MOVE.L D5,D3
- MULU #6,D5 AANTAL TE LEZEN + TE RESERVEREN BYTES
- MOVE.W D5,D0
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- CALLEXEC AllocMem
- BEQ NO_LOAD_MEM
- DLOAD A1
- MOVE.L OBJECT_ADRES_BASE-MB(A1),A1
- MOVE.L D0,(A1,D7.W) SET OBJECT ADRES
- LSR.W #1,D7
- DLOAD A1
- MOVE.L OBJECT_POINT_BASE-MB(A1),A1
- MOVE.W D3,(A1,D7.W) SET OBJECT POINTS
- MOVE.L D0,A3 SAVE ADRES VOOR IN TE SCHRIJVEN
- LSR.W #1,D7 TERUG D7 GEWOON !
- MOVE.L A4,D1 HANDLE
- MOVE.L D0,D2 BUFFER --> IS GERESERVEERD !
- MOVE.L D5,D3 AANTAL BYTES TE LEZEN
- MOVE.L DosBase(A5),A6
- JSR -42(A6) Read
- BEQ.S READ_ERROR SOMETHING WRONG !!!
- ADDQ #1,D7
- CMP.W D6,D7
- BGT.S FINISH_LOAD
- Dlea OBJECT_READ_BUFFER,A3
- MOVE.L A4,D1
- MOVE.L A3,D2
- MOVEQ.L #2,D3
- MOVE.L DosBase(A5),A6
- JSR -42(A6)
- BEQ.S READ_ERROR
- MOVE.W (A3)+,D5
- BRA LOAD_LOOP
- IS_DEFINED
- READ_ERROR
- FINISH_LOAD MOVE.L A4,D1
- MOVE.L DosBase(A5),A6
- JSR -36(A6)
- OPEN_ERROR MOVEM.L (SP)+,A3-6
- RTS
- LOAD_TO_LONG MOVEQ #21,D0
- Rjmp L_Error
- LOAD_OVER_LIMIT MOVE.L A4,D1
- MOVE.L DosBase(A5),A6
- JSR -36(A6)
- MOVEM.L (SP)+,A3-6
- MOVEQ #18,D0
- RBRA L_CUSTOM
- NO_OBJECT_FILE MOVE.L A4,D1
- MOVE.L DosBase(A5),A6
- JSR -36(A6)
- MOVEM.L (SP)+,A3-6
- MOVEQ #7,D0
- Rbra L_Custom
- NO_LOAD_MEM MOVEM.L (SP)+,A3-6
- Rbra OUT_OF_MEM
-
-
- L_LINE_3D EQU 41
- L41 MOVE.L (A3)+,D5 Z-2 COORD
- BEQ.S DIV_BY_ZERO
- MOVE.L (A3)+,D4 Y-2 COORD
- MOVE.L (A3)+,D3 X-2 COORD
- MOVE.L (A3)+,D2 Z-1 COORD
- BEQ.S DIV_BY_ZERO
- MOVE.L (A3)+,D1 Y-1 COORD
- MOVE.L (A3)+,D0 X-1 COORD
- Dload A0
- MOVE.W X_VIEW-MB(A0),D6
- MOVE.W Y_VIEW-MB(A0),D7
- ASL.L #7,D0
- DIVS D2,D0
- ADD.W D6,D0
- ASL.L #7,D1
- DIVS D2,D1
- ADD.W D7,D1
- MOVE.L A6,A2
- MOVE.L T_RastPort(A5),A1
- MOVE.L T_GfxBase(A5),A6
- JSR -240(A6)
- MOVE.L D3,D0
- MOVE.L D4,D1
- ASL.L #7,D0
- DIVS D5,D0
- ADD.W D6,D0
- ASL.L #7,D1
- DIVS D5,D1
- ADD.W D7,D1
- JSR -246(A6)
- MOVE.L A2,A6
- RTS
- DIV_BY_ZERO MOVEQ #20,D0
- Rjmp L_Error
-
- L_EYE_3D EQU 42
- L42 MOVE.L (A3)+,D1 Y EYE
- MOVE.L (A3)+,D0 X EYE
- Dload A0
- MOVE.W D0,X_VIEW-MB(A0)
- MOVE.W D1,Y_VIEW-MB(A0)
- RTS
-
- L_BLIT_STORE EQU 43
- L43 CMP.L #0,20(A3)
- Rble L_IFonc
- CMP.L #97,20(A3)
- Rbcc L_IFonc
- Dlea BLIT_DEFS,A1
- MOVE.L 20(A3),D1 BLIT NR
- SUBQ.W #1,D1
- ASL.W #2,D1
- TST.L (A1,D1.W) IS RESERVED
- BNE BLIT_STORE_DEF IF YES ERROR !
- MOVE.L 24(A3),D1 SCREEN NR
- Rjsr L_GetEc
- MOVE.L A0,A4 --- A4 BEZET !
- MOVE.W EcNPlan(A0),D7 --- D7 BEZET !
- MOVE.L D0,A2 --- A2 BEZET !
- MOVE.W D7,D0
- EXT.L D0
- MULU #8,D0
- ADD.W #20,D0
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- MOVE.L A6,-(SP)
- CALLEXEC AllocMem
- MOVE.L (SP)+,A6
- Rbeq OUT_OF_MEM
- MOVEM.L A4-6,-(SP)
- Dlea BLIT_DEFS,A1
- MOVE.L 20(A3),D1 BLIT NR
- SUBQ.W #1,D1
- ASL.W #2,D1
- MOVE.L D0,(A1,D1.W) BLIT_DEF_ADRES
- MOVE.L D0,A1 --- A1 BEZET !
- MOVEQ #-1,D6
- MOVE.L (A3)+,D5
- BMI DESCENDING
- AND.L #$F,D5
- Rbeq L_IFonca
- LSL.L D5,D6
- MOVE.W D7,(A1)+
- MOVE.L D6,(A1)+ BLTAFLWM
- ROR.L #4,D5
- ADD.L #$9F00000,D5
- MOVE.L D5,A5 --- A5 BEZET ! BLTCON01
- MOVE.L (A3)+,D5 Y1
- CMP.W EcTy(A4),D5
- Rbhi L_IFonca
- MOVE.L (A3)+,D3 X1
- AND.W #$FFF0,D3
- MOVE.L (A3)+,D4 Y
- Rbmi L_IFonca
- MOVE.L (A3)+,D2 X
- Rbmi L_IFonca
- AND.W #$FFF0,D2
- CMP.W D3,D2
- Rbge L_IFonca
- CMP.W D5,D4
- Rbge L_IFonca
- MOVE.W EcTLigne(A4),D6 BYTES PER REGEL
- ASL.W #3,D6 PIXELS PER REGEL
- CMP.W D3,D6
- BGT.S NOT_OVER_A
- MOVE.W D6,D3
- NOT_OVER_A ASR.W #3,D6 BYTES PER REGEL
- MOVE.L D4,D0 Y
- MULU D6,D0 Y * BYTES REGEL
- MOVE.L D2,D1 X
- LSR.L #3,D1 X / 8
- ADD.L D0,D1 OFFSET START D1 = Y * BYTES REGEL + X / 8
- SUB.L D2,D3 D3 = X1 - X
- LSR.L #3,D3 D3 = (X1 - X) / 8
- SUB.L D3,D6 D6 = BLTAMOD = BYTES REGEL-(X1-X)/8
- MOVE.L #0,(A1)+ BLTCMOD + BLTBMOD OP 0
- MOVE.W D6,(A1)+ BLTAMOD
- MOVE.W D6,(A1)+ BLTDMOD
- MOVE.L A5,(A1)+ BLTCON01
- SUB.L D4,D5 Y1 - Y
- ASL.L #6,D5 (Y1 - Y) * 64
- LSR.L #1,D3 (X1 - X) / 16
- ADD.L D3,D5 BLITSIZE (Y1 - Y) * 64 + (X1 - X) / 16
- MOVE.W D5,(A1)+ BLTSIZE
- SUBQ.W #1,D7 PLANECOUNT - 1 VOOR DBRA !
- ADRES_LOOP MOVE.L (A2)+,D0 ADRES PLANES 1 -> 6
- ADD.L D1,D0
- MOVE.L D0,(A1)+ SOURCE ADRES
- MOVE.L D0,(A1)+ DEST ADRES
- DBRA D7,ADRES_LOOP D7 = PLANECOUNT -1
- ADDQ.L #8,A3 STACK ADJUST !
- MOVEM.L (SP)+,A4-6
- RTS
- BLIT_STORE_DEF MOVEQ #11,D0
- Rbra L_CUSTOM
- DESCENDING NEG.L D5
- AND.L #$F,D5
- Rbeq L_IFonca
- LSR.L D5,D6
- SWAP D6
- MOVE.W D7,(A1)+
- MOVE.L D6,(A1)+ BLTAFLWM
- ROR.L #4,D5
- ADD.L #$9F00002,D5
- MOVE.L D5,A5 --- A5 BEZET ! BLTCON01
- MOVE.L (A3)+,D5 Y1
- CMP.W EcTy(A4),D5
- Rbhi L_Ifonca
- MOVE.L (A3)+,D3 X1
- AND.W #$FFF0,D3
- MOVE.L (A3)+,D4 Y
- Rbmi L_IFonca
- MOVE.L (A3)+,D2 X
- Rbmi L_IFonca
- AND.W #$FFF0,D2
- CMP.W D3,D2
- Rbge L_IFonca
- CMP.W D5,D4
- Rbge L_IFonca
- MOVE.W EcTLigne(A4),D6 BYTES PER REGEL
- ASL.W #3,D6 PIXELS PER REGEL
- CMP.W D3,D6
- BGT.S NOT_OVER_D
- MOVE.W D6,D3
- NOT_OVER_D ASR.W #3,D6 BYTES PER REGEL
- MOVEM.L D2-6,-(SP)
- SUB.L D4,D5 Y1 - Y
- MULU D6,D5 (Y1 - Y) * BYTES REGEL
- SUB.L D2,D3 X1 - X
- ASR.L #3,D3 (X1 - X) / 8
- ADD.L D3,D5
- SUBQ #2,D5
- SUB.W D6,D5
- MOVE.L D5,A6 DESCENDING OFFSET
- MOVEM.L (SP)+,D2-6
- MOVE.L D4,D0 Y
- MULU D6,D0 Y * BYTES REGEL
- MOVE.L D2,D1 X
- LSR.L #3,D1 X / 8
- ADD.L D0,D1 OFFSET START D1 = Y * BYTES REGEL + X / 8
- ADD.L A6,D1 DESCENDING OFFSET
- SUB.L D2,D3 D3 = X1 - X
- LSR.L #3,D3 D3 = (X1 - X) / 8
- SUB.L D3,D6 D6 = BLTAMOD = BYTES REGEL-(X1-X)/8
- MOVE.L #0,(A1)+ BLTCMOD + BLTBMOD OP 0
- MOVE.W D6,(A1)+ BLTAMOD
- MOVE.W D6,(A1)+ BLTDMOD
- MOVE.L A5,(A1)+ BLTCON01
- SUB.L D4,D5 Y1 - Y
- ASL.L #6,D5 (Y1 - Y) * 64
- LSR.L #1,D3 (X1 - X) / 16
- ADD.L D3,D5 BLITSIZE (Y1 - Y) * 64 + (X1 - X) / 16
- MOVE.W D5,(A1)+ BLTSIZE
- SUBQ.W #1,D7 PLANECOUNT - 1 VOOR DBRA !
- ADRES_D_LOOP MOVE.L (A2)+,D0 ADRES PLANES 1 -> 6
- ADD.L D1,D0
- MOVE.L D0,(A1)+ SOURCE ADRES
- MOVE.L D0,(A1)+ DEST ADRES
- DBRA D7,ADRES_D_LOOP D7 = PLANECOUNT -1
- ADDQ.L #8,A3 STACK ADJUST !
- MOVEM.L (SP)+,A4-6
- RTS
-
- L_MULTI_BLIT EQU 44
- L44 MOVE.L (A3)+,D7 TO BLIT
- MOVE.L (A3)+,D6 FROM BLIT
- CMP.W D6,D7
- Rblt L_IFonc
- SUBQ.W #1,D6
- Rbmi L_IFonc
- SUBQ.W #1,D7
- CMP.W #96,D7
- Rbcc L_IFonc
- MOVEM.L A3-4,-(SP)
- MOVE.L T_RASTPORT(A5),A4
- LEA $DFF000,A1
- Dlea BLIT_DEFS,A2
- NEXT_MULTI_BLIT ADD.W D6,D6
- ADD.W D6,D6
- MOVE.L A2,A0
- MOVE.L (A0,D6.W),D0
- BEQ.S NO_MULTI_BLIT IF ADRES = 0 ERROR !!
- MOVE.L D0,A0
- MOVE.W (A0)+,D5 PLANE COUNT
- SUBQ.L #1,D5
- MOVEM.L (A0)+,D1-4
- MOVE.W (A0)+,A3 BLTSIZE
- MOVEQ #0,D0
- BLIT_S_LOOP BTST D0,24(A4)
- BEQ.S SKIP_BLIT
- BLIT_S_LOOP1 BTST #14,2(A1)
- BNE.S BLIT_S_LOOP1
- ADDQ #1,D0
- MOVE.L D1,$44(A1) BLTAFLWM
- MOVE.L D2,$60(A1) BLTCBMOD
- MOVE.L D3,$64(A1) BLTADMOD
- MOVE.L D4,$40(A1) BLTCON01
- MOVE.L (A0)+,$50(A1) SOURCE ADRES
- MOVE.L (A0)+,$54(A1) DEST ADRES
- MOVE.W A3,$58(A1)
- DBRA D5,BLIT_S_LOOP
- ASR.W #2,D6
- ADDQ.W #1,D6
- CMP.W D7,D6
- BLE.S NEXT_MULTI_BLIT
- MOVEM.L (SP)+,A3-4
- RTS
- SKIP_BLIT ADDQ.L #8,A0
- ADDQ #1,D0
- DBRA D5,BLIT_S_LOOP
- ASR.W #2,D6
- ADDQ.W #1,D6
- CMP.W D7,D6
- BLE.S NEXT_MULTI_BLIT
- MOVEM.L (SP)+,A3-4
- RTS
- NO_MULTI_BLIT MOVEM.L (SP)+,A3-4
- MOVEQ #12,D0
- Rbra L_CUSTOM
-
- L_ERASE_BLIT EQU 45
- L45 MOVE.L A6,-(SP)
- MOVE.L (A3)+,D2
- Rble L_IFonc
- SUBQ.W #1,D2
- CMP.W #96,D2
- Rbcc L_IFonc
- ASL.L #2,D2
- Dlea BLIT_DEFS,A1
- MOVE.L A1,A2
- MOVE.L (A1,D2.L),D1
- BEQ.S BLIT_IS_ERASED
- MOVE.L D1,A1
- MOVE.W (A1),D0
- MOVE.L #0,(A2,D2.L)
- EXT.L D0
- MULU #8,D0
- ADD.W #20,D0
- CALLEXEC FreeMem
- BLIT_IS_ERASED MOVE.L (SP)+,A6
- RTS
-
- L_BLIT_SPEED EQU 46
- L46 MOVE.L (A3)+,D7 NEW SPEED
- AND.L #$F,D7
- Rbeq L_IFonc
- MOVE.L (A3)+,D6 BLIT NUMBER
- MOVE.W #$FFFF,D5
- MOVE.W #$9F0,D4
- SUBQ.L #1,D6
- Dlea BLIT_DEFS,A0
- ADD.W D6,D6
- ADD.W D6,D6
- MOVE.L (A0,D6.W),D0 BLIT DEF ADRES
- BEQ.S NO_BLIT_SPEED NOT DEFINED ? ERROR !
- MOVE.L D0,A0
- MOVE.L 2(A0),D0 BLTAFLWM
- BTST #0,D0
- BEQ.S IS_RIGHT
- LSR.W D7,D5
- MOVE.W D5,4(A0)
- ROR.W #4,D7
- ADD.W D7,D4
- MOVE.W D4,14(A0)
- RTS
- IS_RIGHT BTST #15,D0
- BEQ.S IS_UP
- ASL.W D7,D5
- MOVE.W D5,4(A0)
- ROR.W #4,D7
- ADD.W D7,D4
- MOVE.W D4,14(A0)
- IS_UP RTS
- NO_BLIT_SPEED MOVEQ #12,D0
- Rbra L_CUSTOM
-
- L_BLIT_LEFT EQU 47
- L47 MOVE.L 20(A3),D1
- Rjsr L_GetEc
- MOVE.L D0,A2 BITMAP ADRESSEN
- MOVE.W EcNPlan(A0),D7 AANTAL PLANES
- SUBQ.W #1,D7 -1 VOOR DBRA
- MOVE.L (A3)+,D6 SHIFT
- BMI DESCENDING_LEFT
- MOVE.L (A3)+,D5 Y1
- CMP.W EcTy(A0),D5
- Rbhi L_IFonc
- MOVE.L (A3)+,D3 X1
- AND.W #$FFF0,D3
- MOVE.L (A3)+,D4 Y
- Rbmi L_IFonc
- MOVE.L (A3)+,D2 X
- Rbmi L_IFonc
- AND.W #$FFF0,D2
- CMP.W D3,D2
- Rbge L_IFonc
- CMP.W D5,D4
- Rbge L_IFonc
- MOVE.L D4,D0
- MULU EcTligne(A0),D0 Y * BYTES REGEL
- MOVE.L D2,D1
- LSR.W #3,D1 X / 8
- ADD.W D0,D1 OFFSET= Y * BYTES REGEL + X / 8
- SUB.W D2,D3 X1 - X
- LSR.W #3,D3 (X1 - X) / 8
- MOVE.W EcTligne(A0),D0
- SUB.W D3,D0 BLTAMOD = BYTES REGEL - (X1 - X) / 8
- SUB.W D4,D5 (Y1 - Y)
- ASL.W #6,D5 (Y1 - Y) * 64
- LSR.W #1,D3 (X1 - X) / 16
- ADD.W D3,D5 BLTSIZE
- MOVEQ #-1,D2
- LSL.L D6,D2 BLTAFLWM
- ROR.L #4,D6
- ADD.L #$9F00000,D6 BLTCON01
- LEA $DFF000,A1
- MOVE.L T_RASTPORT(A5),A0
- MOVEQ #0,D4
- LOOP_A_LEFT BTST D4,24(A0)
- BEQ.S SKIP_A_BLIT
- LOOP_A_LEFT1 BTST #14,2(A1)
- BNE.S LOOP_A_LEFT1
- ADDQ #1,D4
- MOVE.L D2,$44(A1) BLTAFLWM
- MOVE.L #0,$60(A1) BLTCBMOD
- MOVE.W D0,$64(A1) BLTAMOD
- MOVE.W D0,$66(A1) BLTDMOD
- MOVE.L (A2)+,D3 ADRES PLANES 1 - > 6
- ADD.L D1,D3
- MOVE.L D6,$40(A1)
- MOVE.L D3,$50(A1) SOURCE ADRES
- MOVE.L D3,$54(A1) DEST ADRES
- MOVE.W D5,$58(A1) BLTSIZE
- DBRA D7,LOOP_A_LEFT
- ADDQ.L #4,A3 ADJUST STACK !
- RTS
- SKIP_A_BLIT ADDQ.L #4,A2
- ADDQ #1,D4
- DBRA D7,LOOP_A_LEFT
- ADDQ.L #4,A3
- RTS
- DESCENDING_LEFT NEG.L D6
- MOVE.L (A3)+,D5 Y1
- CMP.W EcTy(A0),D5
- Rbhi L_IFonc
- MOVE.L (A3)+,D3 X1
- AND.W #$FFF0,D3
- MOVE.L (A3)+,D4 Y
- Rbmi L_IFonc
- MOVE.L (A3)+,D2 X
- Rbmi L_IFonc
- AND.W #$FFF0,D2
- CMP.W D3,D2
- Rbge L_IFonc
- CMP.W D5,D4
- Rbge L_IFonc
- MOVEM.L D2-5,-(SP)
- SUB.W D4,D5 Y1 - Y
- MULU EcTligne(A0),D5 (Y1 - Y) * BYTES REGEL
- SUB.W D2,D3 X1 - X
- ASR.W #3,D3 (X1 - X) / 8
- ADD.W D3,D5
- SUBQ.W #2,D5
- SUB.W EcTligne(A0),D5
- MOVE.L D5,A1 DESCENDING OFFSET
- MOVEM.L (SP)+,D2-5
- MOVE.L D4,D0
- MULU EcTligne(A0),D0 Y * BYTES REGEL
- MOVE.L D2,D1
- LSR.W #3,D1 X / 8
- ADD.W D0,D1 OFFSET= Y * BYTES REGEL + X / 8
- ADD.L A1,D1 OFFSET + DESCENDING OFFSET
- SUB.W D2,D3 X1 - X
- LSR.W #3,D3 (X1 - X) / 8
- MOVE.W EcTligne(A0),D0
- SUB.W D3,D0 BLTAMOD = BYTES REGEL - (X1 - X) / 8
- SUB.L D4,D5 (Y1 - Y)
- ASL.W #6,D5 (Y1 - Y) * 64
- LSR.W #1,D3 (X1 - X) / 16
- ADD.W D3,D5 BLTSIZE
- MOVEQ #-1,D2
- LSR.L D6,D2 BLTAFLWM
- SWAP D2
- ROR.L #4,D6
- ADD.L #$9F00002,D6 BLTCON01
- LEA $DFF000,A1
- MOVE.L T_RASTPORT(A5),A0
- MOVEQ #0,D4
- LOOP_D_LEFT BTST D4,24(A0)
- BEQ.S SKIP_D_BLIT
- LOOP_D_LEFT1 BTST #14,2(A1)
- BNE.S LOOP_D_LEFT1
- ADDQ #1,D4
- MOVE.L D2,$44(A1) BLTAFLWM
- MOVE.L #0,$60(A1) BLTCBMOD
- MOVE.W D0,$64(A1) BLTAMOD
- MOVE.W D0,$66(A1) BLTDMOD
- MOVE.L (A2)+,D3 ADRES PLANES 1 - > 6
- ADD.L D1,D3
- MOVE.L D6,$40(A1)
- MOVE.L D3,$50(A1) SOURCE ADRES
- MOVE.L D3,$54(A1) DEST ADRES
- MOVE.W D5,$58(A1) BLTSIZE
- DBRA D7,LOOP_D_LEFT
- ADDQ.L #4,A3 ADJUST STACK !
- RTS
- SKIP_D_BLIT ADDQ.L #4,A2
- ADDQ #1,D4
- DBRA D7,LOOP_D_LEFT
- ADDQ.L #4,A3
- RTS
-
- L_BLIT_CLEAR EQU 48
- L48 LEA $DFF000,A1
- MOVE.L ScOnAd(A5),A0
- MOVE.W EcNPlan(A0),D7
- MOVE.W EcTLigne(A0),D6 BYTES REGEL
- ASR.W #1,D6 WORDS REGEL
- MOVE.W EcTy(A0),D5
- ASL.W #6,D5 Y * 64
- ADD.W D5,D6 BLITSIZE
- MOVEQ #0,D1 INIT BLTADAT/BLTDMOD
- MOVEQ #-1,D2 INIT BLTAFLWM
- MOVE.L (A3)+,D0 PLANE TO BE ERASED !
- BMI.S ALL_PLANES
- Rbeq L_IFonc
- SUBQ #1,D0
- CMP.W D7,D0
- Rbge L_IFonc
- SELECT_PLANE MOVE.L (A0)+,A2
- DBRA D0,SELECT_PLANE
- ERASE_SINGLE BTST #14,2(A1)
- BNE.S ERASE_SINGLE
- MOVE.W D1,$74(A1) BLTADAT
- MOVE.W D1,$66(A1) BLTDMOD
- MOVE.L D2,$44(A1) BLTAFLWM
- MOVE.L #$01F00000,$40(A1) BLTCON0/1
- MOVE.L A2,$54(A1) ADRES PLANE 1 -> 6
- MOVE.W D6,$58(A1) BLTSIZE
- RTS
- ALL_PLANES SUBQ #1,D7
- MOVE.L T_RASTPORT(A5),A2
- MOVEQ #0,D3
- ERASE_ALL BTST #14,2(A1)
- BNE.S ERASE_ALL
- BTST D3,24(A2)
- BEQ.S SKIP_CLEAR
- ADDQ #1,D3
- MOVE.W D1,$74(A1) BLTADAT
- MOVE.W D1,$66(A1) BLTDMOD
- MOVE.L D2,$44(A1) BLTAFLWM
- MOVE.L #$01F00000,$40(A1) BLTCON0/1
- MOVE.L (A0)+,$54(A1) ADRES PLANES 1 -> 6
- MOVE.W D6,$58(A1) BLTSIZE
- DBRA D7,ERASE_ALL
- RTS
- SKIP_CLEAR ADDQ.L #4,A0
- ADDQ #1,D3
- DBRA D7,ERASE_ALL
- RTS
-
- L_FAST_PLOT EQU 49
- L49 MOVE.L ScOnAd(A5),A0
- MOVEQ.L #0,D2
- MOVE.L (A3)+,D3 COLOUR
- Rbmi L_IFonc
- MOVE.L (A3)+,D7 Y
- BMI.S NO_PLOT1
- CMP.W EcTy(A0),D7
- BGE.S NO_PLOT1
- MOVE.L (A3)+,D6 X
- BMI.S NO_PLOT
- MOVE.W EcTligne(A0),D4
- MOVE.W D4,D5
- ASL.W #3,D5
- CMP.W D5,D6
- BGE.S NO_PLOT
- MULU D4,D7 D4 -> EcTligne(A0)
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- NOT D5
- MOVE.W EcNPlan(A0),D0
- SUBQ.W #1,D0
- TST.W EcAuto(A0)
- Rbeq L_PLOT
- MOVEM.L D0-D7/A0-2,-(SP)
- EcCall AutoBack1
- MOVEM.L (SP),D0-7/A0-2
- BTST #BitDble,EcFlags(A0)
- BEQ.S ABPac1
- Rbsr L_PLOT
- EcCall AutoBack2
- MOVEM.L (SP),D0-7/A0-2
- Rbsr L_PLOT
- EcCall Autoback3
- BRA.S ABPac2
- ABPac1 Rbsr L_PLOT
- EcCall AutoBack4
- ABPac2 MOVEM.L (SP)+,D0-7/A0-2
- NO_PLOT RTS
- NO_PLOT1 ADDQ.L #4,A3
- RTS
-
- L_PLOT EQU 50
- L50 LEA EcCurrent(A0),A2
- SET_BIT_LOOP MOVE.L A2,A1
- MOVE.L (A1),A1
- BTST D2,D3
- BEQ.S BIT_CLEAR
- BSET D5,(A1,D7.L)
- ADDQ.W #1,D2
- ADDQ.L #4,A2
- DBRA D0,SET_BIT_LOOP
- RTS
- BIT_CLEAR BCLR D5,(A1,D7.L)
- ADDQ.W #1,D2
- ADDQ.L #4,A2
- DBRA D0,SET_BIT_LOOP
- RTS
-
- L_FAST_POINT EQU 51
- L51 MOVEQ #-1,D3 INIT RESULT
- MOVE.L ScOnAd(A5),A0
- MOVE.L (A3)+,D7 Y
- BMI.S NO_POINT1
- CMP.W EcTy(A0),D7
- BGE.S NO_POINT1
- MOVE.L (A3)+,D6 X
- BMI.S NO_POINT
- MOVE.W EcTligne(A0),D5
- MOVE.W D5,D4
- ASL.W #3,D5
- CMP.W D5,D6
- BGE.S NO_POINT
- MOVEQ #0,D3
- MULU D4,D7
- MOVE.W D6,D4
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- NOT D4
- MOVE.W EcNPlan(A0),D2
- MOVEQ #0,D5
- SUBQ #1,D2
- CHEK_POINT_LOOP MOVE.L (A0)+,A1
- BTST D4,(A1,D7.L)
- BEQ.S NO_BIT_SET
- BSET D5,D3
- NO_BIT_SET ADDQ #1,D5
- DBRA D2,CHEK_POINT_LOOP
- MOVEQ #0,D2
- RTS
- NO_POINT MOVEQ #0,D2
- RTS
- NO_POINT1 ADDQ.L #4,A3
- MOVEQ #0,D2
- RTS
-
- L_RES_STARS EQU 52
- L52 MOVE.L (A3)+,D0
- Rble L_IFonc
- CMP.W #4001,D0
- Rbge L_IFonc
- Dload A2
- MOVE.W STARS_COUNT-MB(A2),D1
- BNE STARS_DEFINED
- MOVE.W D0,STARS_COUNT-MB(A2)
- MULU #8,D0
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- MOVE.L A6,A2
- CALLEXEC AllocMem
- MOVE.L A2,A6
- Rbeq OUT_OF_MEM
- Dload A2
- MOVE.L D0,STARS_ADRES-MB(A2)
- MOVEQ #2,D0
- MOVE.L ScOnAd(A5),A0
- * STORE ADRES OF SCREEN FOR STARS INTERRUPT ROUTINE
- * THIS ADRES IS NOT USED BY THE NORMAL 'STAR' ROUTINES !
- MOVE.L A0,STARS_INT_SCREEN-MB(A2)
- MULU EcTy(A0),D0
- MOVE.W D0,OFFSET_COUNT-MB(A2)
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- MOVE.L A6,A2
- CALLEXEC AllocMem
- MOVE.L A2,A6
- Dload A2
- MOVE.L D0,OFFSET_ADRES-MB(A2)
- MOVE.L D0,A1
- MOVE.L ScOnAd(A5),A0
- MOVE.W EcTy(A0),D7
- MOVE.W EcTLigne(A0),D6
- SUBQ #1,D7
- MOVEQ #0,D1
- OFFSET_LOOP MOVE.W D1,D0
- MULU D6,D0
- MOVE.W D0,(A1)+
- ADDQ #1,D1
- CMP.W D7,D1
- BLE.S OFFSET_LOOP
- Dlea STARS_CLIP,A2
- CLR.L (A2)+ X,Y CLIP=0
- MOVE.L ScOnAd(A5),A0
- MOVE.W EcTLigne(A0),D0
- ASL.W #3,D0 X1
- MOVE.W D0,(A2)+
- MOVE.W EcTy(A0),(A2) Y1
- RTS
- STARS_DEFINED MOVEQ #8,D0
- Rbra L_CUSTOM
-
- L_DEF_STAR EQU 53
- L53 Dload A2
- MOVE.L (A3)+,D4 Y SPEED
- MOVE.L (A3)+,D3 X SPEED
- MOVE.L (A3)+,D2 Y
- Rbmi L_IFonc
- MOVE.L (A3)+,D1 X
- Rbmi L_IFonc
- MOVE.L (A3)+,D0 STAR NR
- Rble L_IFonc
- SUBQ #1,D0
- TST.W STARS_COUNT-MB(A2)
- BEQ.S NO_STARS_RESERVED
- CMP.W STARS_COUNT-MB(A2),D0
- Rbge L_IFonc NO STARS DEFINED OR 'STAR NR' >COUNT?
- ASL.W #3,D0
- MOVE.L STARS_ADRES-MB(A2),A2
- MOVEM.W D1-4,(A2,D0.W)
- RTS
- NO_STARS_RESERVED
- MOVEQ #9,D0
- Rbra L_CUSTOM
-
- L_DRAW_STARS EQU 54
- L54 Dload A2
- MOVE.W STARS_COUNT-MB(A2),D7 HOW MANY STARS ?
- Rbeq L_IFonc NO STARS DEFINED
- SUBQ.W #1,D7
- MOVEM.L A3-A6,-(SP)
- MOVE.L OFFSET_ADRES-MB(A2),A6 START ADRES OF EVERY LINE
- MOVE.L ScOnAd(A5),A4 ADRES ACTUAL SCREEN
- MOVE.L (A4),A0 PTR TO BITMAP ETC...
- Dlea STARS_CLIP,A3 CLIP DEFINITIONS
- MOVEM.W (A3),D1/A1/A3/A5 MIN X,MIN Y,MAX X,MAX Y
- MOVE.L STARS_ADRES-MB(A2),A2 STAR DEFINITIONS
- MOVEQ #0,D0 VALUE FOR TESTING SPEED
- STARS1_LOOP MOVEM.W (A2),D3-6 3=X 4=Y 5=X SPEED 6= Y SPEED
- CMP.W D0,D5 X SPEED = 0 ?
- BEQ.S NO_X_SPEED
- ADD.W D3,D5
- CMP.W A3,D5 X >= MAX X ?
- BGE.S X_OFF_SCREEN
- CMP.W D1,D5 X < MIN X ?
- BLT.S X_OFF_SCREEN1
- MOVE.W D5,(A2) NEW COORD = OK
- BRA.S X_ON_SCREEN
- X_OFF_SCREEN SUB.W A3,D5
- MOVE.W D5,(A2) NEW COORD = X - MAX X
- BRA.S X_ON_SCREEN
- X_OFF_SCREEN1 ADD.W D5,A3
- MOVE.W A3,(A2) NEW COORD = MAX X + (-X)
- X_ON_SCREEN
- NO_X_SPEED CMP.W D0,D6 Y SPEED = 0 ?
- BEQ.S NO_Y_SPEED
- ADD.W D4,D6
- CMP.W A1,D6 Y < MIN Y ?
- BLT.S Y_OFF_SCREEN1
- CMP.W A5,D6 Y >= MAX Y ?
- BGE.S Y_OFF_SCREEN
- MOVE.W D6,2(A2) NEW COORD = OK
- BRA.S Y_ON_SCREEN
- Y_OFF_SCREEN SUB.W A5,D6
- MOVE.W D6,2(A2) NEW COORD = Y - MAX Y
- BRA.S Y_ON_SCREEN
- Y_OFF_SCREEN1 ADD.W D6,A5
- MOVE.W A5,2(A2) NEW COORD = MAX Y + (-Y)
- Y_ON_SCREEN
- NO_Y_SPEED ADD.W D4,D4 FIND START ADRES OF LINE
- MOVE.W D3,D5 SAVE X -> PIXELS
- NOT D5
- ASR.W #3,D3 SCREEN OFFSET -> ONLY X (BYTES)
- ADD.W (A6,D4.W),D3 ADD SCREEN OFFSETS -> X+Y
- BSET D5,(A0,D3.W) SET BIT ON SCREEN
- ADDQ.L #8,A2 ADRES OF NEXT STAR
- DBRA D7,STARS1_LOOP GO ON !
- MOVEM.L (SP)+,A3-A6
- RTS
-
- L_ERASE_STARS EQU 55
- L55 Dload A2
- MOVE.W STARS_COUNT-MB(A2),D0
- BEQ.S STARS_ERASED
- EXT.L D0
- MULU #8,D0
- MOVE.W #0,STARS_COUNT-MB(A2)
- MOVE.L STARS_ADRES-MB(A2),A1
- MOVE.L A6,A2
- CALLEXEC FreeMem
- MOVE.L A2,A6
- Dload A2
- MOVE.W OFFSET_COUNT-MB(A2),D0
- EXT.L D0
- MOVE.L OFFSET_ADRES-MB(A2),A1
- MOVE.L A6,A2
- CALLEXEC FreeMem
- MOVE.L A2,A6
- STARS_ERASED RTS
-
- L_COMPUTE_STARS EQU 56
- L56 Dload A2
- MOVE.L (A3)+,D3 TO PARAM
- Rbeq L_IFonc CHECK VALUE !!!
- SUBQ #1,D3
- CMP.W STARS_COUNT-MB(A2),D3
- Rbge L_IFonc NO STARS DEFINED ?
- MOVE.L (A3)+,D7 FROM PARAM
- Rbeq L_IFonc CHECK VALUE !!!
- SUBQ #1,D7
- MOVE.W D3,COMPUTE_TO-MB(A2) STORE "TO" VALUE
- MOVEM.L A3-A6,-(SP)
- MOVE.L OFFSET_ADRES-MB(A2),A6 Y OFFSETS (FOR MORE SPEED)
- MOVE.L STARS_ADRES-MB(A2),A2 STARS DEFINITIONS
- MOVE.L D7,D4 COMPUTE ADRESS OF
- LSL.W #3,D4 FIRST STAR TO BE
- ADD.L D4,A2 PROCESSED...
- DLOAD A4
- Dlea STARS_CLIP,A3 CLIP DEFINITIONS
- MOVEM.W (A3),D1/A1/A3/A5 MIN X,MIN Y,MAX X,MAX Y
- MOVEQ #0,D0 RESET AND CHECK VALUE
- STARS1_COMP MOVEM.W (A2),D3-6 3=X 4=Y 5=X SPEED 6= Y SPEED
- CMP.W D0,D5 X SPEED = 0 ?
- BEQ.S NO_X_SPEED_C
- ADD.W D3,D5
- CMP.W A3,D5 X >= MAX X ?
- BGE.S X_OFF_SCREEN_C
- CMP.W D1,D5 X < MIN X ?
- BLT.S X_OFF_SCREEN1_C
- MOVE.W D5,(A2) NEW COORD = OK
- BRA.S X_ON_SCREEN_C
- X_OFF_SCREEN_C SUB.W A3,D5
- MOVE.W D5,(A2) NEW COORD = X - MAX X
- BRA.S X_ON_SCREEN_C
- X_OFF_SCREEN1_C ADD.W D5,A3
- MOVE.W A3,(A2) NEW COORD = MAX X + (-X)
- X_ON_SCREEN_C
- NO_X_SPEED_C CMP.W D0,D6 Y SPEED = 0 ?
- BEQ.S NO_Y_SPEED_C
- ADD.W D4,D6
- CMP.W A1,D6 Y < MIN Y ?
- BLT.S Y_OFF_SCREEN1_C
- CMP.W A5,D6 Y >= MAX Y ?
- BGE.S Y_OFF_SCREEN_C
- MOVE.W D6,2(A2) NEW COORD = OK
- BRA.S Y_ON_SCREEN_C
- Y_OFF_SCREEN_C SUB.W A5,D6
- MOVE.W D6,2(A2) NEW COORD = Y - MAX Y
- BRA.S Y_ON_SCREEN_C
- Y_OFF_SCREEN1_C ADD.W D6,A5
- MOVE.W A5,2(A2) NEW COORD = MAX Y + (-Y)
- Y_ON_SCREEN_C
- NO_Y_SPEED_C ADDQ.L #8,A2
- ADDQ #1,D7
- CMP.W COMPUTE_TO-MB(A4),D7
- BLE.S STARS1_COMP
- MOVEM.L (SP)+,A3-A6
- RTS
-
- L_F_STARS EQU 57
- L57 Dload A2
- MOVE.W STARS_COUNT-MB(A2),D7 HOW MANY STARS ?
- Rbeq L_IFonc NO STARS DEFINED ?
- SUBQ.W #1,D7 -1 FOR DBRA
- MOVE.L A4,-(SP)
- MOVE.L A6,-(SP)
- MOVE.L ScOnAd(A5),A4 ADRES ACTUAL SCREEN
- MOVE.L OFFSET_ADRES-MB(A2),A6 Y OFFSETS (FOR MORE SPEED)
- MOVE.L STARS_ADRES-MB(A2),A2 STAR DEFINITIONS
- MOVE.L (A4),A0 FIRST BITPLANE OF SCREEN
- STARS1_F_LOOP MOVEM.W (A2)+,D3-6 3=X 4=Y 5=X SPEED 6= Y SPEED
- ADD.W D4,D4 (SPEED FACTORS NOT USED !!!)
- MOVE.W D3,D5 SAVE X -> PIXELS
- NOT D5
- ASR.W #3,D3 SCREEN OFFSET -> ONLY X (BYTES)
- ADD.W (A6,D4.W),D3 ADD SCREEN OFFSETS -> X+Y
- BSET D5,(A0,D3.W) SET BIT ON SCREEN
- DBRA D7,STARS1_F_LOOP NEXT STAR...
- EXIT_F_STARS MOVE.L (SP)+,A6
- MOVE.L (SP)+,A4
- RTS
-
- L_STARS_SPEED EQU 58
- L58 MOVE.L (A3)+,D4 NEW Y SPEED
- MOVE.L (A3)+,D3 NEW X SPEED
- MOVE.L (A3)+,D2 TO PARAM
- MOVE.L (A3)+,D1 FROM PARAM
- Rbeq l_IFonc
- CMP.W D1,D2
- Rble L_IFonc
- Dload A2
- SUBQ #1,D2
- CMP.W STARS_COUNT-MB(A2),D2
- Rbge L_IFonc NO STARS DEFINED ?
- SUBQ #1,D1
- MOVE.L D1,D5
- ASL.W #3,D5
- MOVE.L STARS_ADRES-MB(A2),A1
- ADD.L D5,A1
- SPEED_LOOP ADDQ.L #4,A1
- MOVE.W D3,(A1)+
- MOVE.W D4,(A1)+
- ADDQ #1,D1
- CMP.W D2,D1
- BLE.S SPEED_LOOP
- RTS
-
- L_CLIP_STARS EQU 59
- L59 MOVE.L (A3)+,D7 MAX Y
- MOVE.L (A3)+,D6 MAX X
- MOVE.L (A3)+,D5 MIN Y
- Rbmi L_IFonc MIN Y < 0 ? ERROR
- MOVE.L (A3)+,D4 MIN X
- Rbmi L_IFonc MIN X < 0 ? ERROR
- CMP.W D4,D6
- Rble L_IFonc MAX X <= MIN X ? ERROR
- CMP.W D5,D7
- Rble L_IFonc MAX Y <= MIN Y ? ERROR
- MOVE.L ScOnAd(A5),A0 ACTUAL SCREEN
- MOVE.W EcTy(A0),D3 MAX Y OF SCREEN
- MOVE.W EcTLigne(A0),D2
- ASL.W #3,D2 MAX X OF SCREEN
- Dlea STARS_CLIP,A1 CLIP DEFINITIONS
- CMP.W D2,D4
- Rbge L_IFonc MIN X >= MAX X OF SCREEN ?
- MOVE.W D4,(A1)+ STORE NEW MIN X
- CMP.W D3,D5
- Rbge L_IFonc MIN Y >= MAX Y OF SCREEN ?
- MOVE.W D5,(A1)+ STORE NEW MIN Y
- CMP.W D2,D6
- BGE.S X_TOO_BIG MAX X >= MAX X OF SCREEN ?
- MOVE.W D6,(A1)+ STORE NEW MAX X
- BRA.S Y_TEST
- X_TOO_BIG SUBQ #1,D2
- MOVE.W D2,(A1)+ NEW MAX X = MAX X OF SCREEN-1
- Y_TEST CMP.W D3,D7
- BGE.S Y_TOO_BIG MAX Y >= MAX Y OF SCREEN ?
- MOVE.W D7,(A1) STORE NEW MAX Y
- BRA.S CLIPS_OK
- Y_TOO_BIG SUBQ #1,D3
- MOVE.W D3,(A1) NEW MAX Y = MAX Y OF SCREEN-1
- CLIPS_OK RTS
-
- L_LEFT_CLICK EQU 60
- L60 BTST #6,$BFE001
- BEQ.S LEFT_CLICK IS SOMEONE CLICKING ?
- MOVEQ.L #0,D3 RETURN FALSE
- MOVEQ.L #0,D2 INTEGER VALUE
- RTS
- LEFT_CLICK MOVEQ.L #-1,D3 RETURN TRUE
- MOVEQ.L #0,D2 INTEGER VALUE
- RTS
-
- L_F_CIRCLE EQU 61
- L61 MOVE.L (A3)+,D7 COLOUR
- Rbmi L_IFonc
- MOVE.L (A3)+,D6 R
- Rble L_IFonc
- MOVE.L (A3)+,D5 OFFY
- MOVE.L (A3)+,D4 OFFX
- MOVE.W D6,D3 R ->D3
- ASL.L #8,D3 R * 256
- DIVU #362,D3 (R * 256)/ 362
- BEQ.S NO_ADD
- ADDQ #1,D3 1 + (R * 256)/ 362 = TELLER
- NO_ADD MULU D6,D6 R*R
- MOVE.L ScOnAd(A5),A2
- MOVEM.L A4-6,-(SP)
- MOVEM.W EcTX(A2),A4-A6 EcTx, EcTy, EcNPlan
- SUBQ #1,A6
- MOVE.W D7,-(A3) PASS COLOUR ONLY ONCE !
- CIRCLE_LOOP MOVE.W D3,D0 X ->D0
- MULU D0,D0 X*X
- NEG.L D0 -(X*X)
- ADD.L D6,D0 -(X*X)+(R*R)
- MOVE.W D3,A1 \
- MOVEQ #0,D1 |
- move.w #$4000,d2 |
- ROOT_CIRC move.w d1,d3 |
- add.w d2,d3 |
- lsr.w #1,d1 |
- cmp.w d3,d0 |
- ble.s BOING_CIRC |
- sub.w d3,d0 |---> ROOT OF -(X*X)+(R*R)
- or.w d2,d1 |
- BOING_CIRC lsr.w #2,d2 | IN D2
- bne.s ROOT_CIRC |
- cmp.w d1,d0 |
- blt.s NO_ROUND_CIRC |
- addq #1,d1 |
- NO_ROUND_CIRC MOVE.W A1,D3 /
- MOVE.W D1,D2
- MOVE.W EcTLigne(A2),D1
- MOVEM.W D2-6,-(SP)
- ADD.W D3,D4 OFFX + X
- ADD.W D2,D5 OFFY + Y
- * MOVE.W D4,-(A3) \ X
- * MOVE.W D5,-(A3) |--> PASS PARAMS Y
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE1
- CMP.W A5,D7
- BGE.S NO_CIRCLE1
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE1
- CMP.W A4,D6
- BGE.S NO_CIRCLE1
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC1 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC1
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC1
- BRA.S NO_CIRCLE1
- BIT_CLEAR_CIRC1 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC1
- NO_CIRCLE1
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- ADD.W D3,D4 OFFX + X
- SUB.W D2,D5 OFFY - Y
- * MOVE.W D4,-(A3) \ X
- * MOVE.W D5,-(A3) |--> PASS PARAMS Y
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE2
- CMP.W A5,D7
- BGE.S NO_CIRCLE2
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE2
- CMP.W A4,D6
- BGE.S NO_CIRCLE2
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC2 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC2
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC2
- BRA.S NO_CIRCLE2
- BIT_CLEAR_CIRC2 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC2
- NO_CIRCLE2
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- SUB.W D3,D4 OFFX - X
- ADD.W D2,D5 OFFY + Y
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE3
- CMP.W A5,D7
- BGE.S NO_CIRCLE3
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE3
- CMP.W A4,D6
- BGE.S NO_CIRCLE3
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC3 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC3
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC3
- BRA.S NO_CIRCLE3
- BIT_CLEAR_CIRC3 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC3
- NO_CIRCLE3
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- SUB.W D3,D4 OFFX - X
- SUB.W D2,D5 OFFY - Y
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE4
- CMP.W A5,D7
- BGE.S NO_CIRCLE4
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE4
- CMP.W A4,D6
- BGE.S NO_CIRCLE4
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC4 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC4
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC4
- BRA.S NO_CIRCLE4
- BIT_CLEAR_CIRC4 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC4
- NO_CIRCLE4
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- SUB.W D2,D4 OFFX - Y
- ADD.W D3,D5 OFFY + X
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE5
- CMP.W A5,D7
- BGE.S NO_CIRCLE5
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE5
- CMP.W A4,D6
- BGE.S NO_CIRCLE5
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC5 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC5
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC5
- BRA.S NO_CIRCLE5
- BIT_CLEAR_CIRC5 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC5
- NO_CIRCLE5
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- SUB.W D2,D4 OFFX - Y
- SUB.W D3,D5 OFFY - X
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE6
- CMP.W A5,D7
- BGE.S NO_CIRCLE6
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE6
- CMP.W A4,D6
- BGE.S NO_CIRCLE6
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC6 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC6
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC6
- BRA.S NO_CIRCLE6
- BIT_CLEAR_CIRC6 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC6
- NO_CIRCLE6
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- ADD.W D2,D4 OFFX + Y
- SUB.W D3,D5 OFFY - X
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE7
- CMP.W A5,D7
- BGE.S NO_CIRCLE7
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE7
- CMP.W A4,D6
- BGE.S NO_CIRCLE7
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC7 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC7
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC7
- BRA.S NO_CIRCLE7
- BIT_CLEAR_CIRC7 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC7
- NO_CIRCLE7
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP),D2-6
- ADD.W D2,D4 OFFX + Y
- ADD.W D3,D5 OFFY + X
- * MOVE.W D4,-(A3) \
- * MOVE.W D5,-(A3) |--> PASS PARAMS
- MOVE.L A2,A0
- MOVEQ.L #0,D2
- MOVE.W D5,D7 Y
- BMI.S NO_CIRCLE8
- CMP.W A5,D7
- BGE.S NO_CIRCLE8
- MOVE.W D4,D6 X
- BMI.S NO_CIRCLE8
- CMP.W A4,D6
- BGE.S NO_CIRCLE8
- MOVE.W (A3),D3 COLOUR
- MULU D1,D7
- * MULU EcTligne(A0),D7
- MOVEQ.L #7,D4
- MOVE.W D6,D5
- ASR.W #3,D6
- ADD.W D6,D7 OFFSET
- AND.W #%111,D5
- SUB.W D5,D4
- MOVE.L A6,D0
- SET_BIT_CIRC8 MOVE.L (A0)+,A1
- BTST D2,D3
- BEQ.S BIT_CLEAR_CIRC8
- BSET D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC8
- BRA.S NO_CIRCLE8
- BIT_CLEAR_CIRC8 BCLR D4,(A1,D7.L)
- ADDQ.W #1,D2
- DBRA D0,SET_BIT_CIRC8
- NO_CIRCLE8
- * Rbsr L_CIRCLE_PLOT
- MOVEM.W (SP)+,D2-6
- DBRA D3,CIRCLE_LOOP
- MOVEM.L (SP)+,A4-6
- MOVE.W (A3)+,D0
- RTS
-
-
- L_IFonc EQU 62
- L62 MOVEQ.L #23,D0
- Rjmp L_Error
-
- L_IFonca EQU 63
- L63 MOVEM.L (SP)+,A4-6
- MOVEQ.L #23,D0
- Rjmp L_Error
-
- OUT_OF_MEM EQU 64
- L64 MOVEQ #24,D0
- Rjmp L_Error
-
- L_FAST_SQR EQU 65
- L65 MOVE.L (A3)+,D0
- MOVEQ #0,D1
- move.l #$40000000,d2
- root_loop:
- move.l d1,d3
- add.l d2,d3
- lsr.l #1,d1
- cmp.l d3,d0
- ble.s boing
- sub.l d3,d0
- or.l d2,d1
- boing:
- lsr.l #2,d2
- bne.s root_loop
- cmp.l d1,d0
- blt.s no_round_up
- addq.l #1,d1
- no_round_up:
- EXT.L D1
- move.L d1,d3
- MOVEQ #0,D2
- rts
-
- L_STARS_INT_ON EQU 66
- L66 Dload A2
- TST.W STARS_COUNT-MB(A2)
- BEQ.S NO_INT_STARS_DEF
- TST.W INT_STARS_ON-MB(A2)
- BNE.S NO_INT_STARS
- MOVE.W #1,INT_STARS_ON-MB(A2)
- MOVE.L (A3)+,D0
- BEQ.S NO_CLEAR
- MOVE.W #1,STARS_INT_CLEAR-MB(A2)
- NO_CLEAR MOVEM.L A4-A7,-(SP)
- MOVE.L #IS_SIZE,D0
- MOVE.L #(MEMF_PUBLIC|MEMF_CLEAR),D1
- CALLEXEC AllocMem
- TST.L D0
- BEQ.S EXIT
- MOVE.L D0,A1
- Dload A2
- MOVE.L D0,INT_STARS_SERVER-MB(A2)
- * INITIALISATIE INTERRUPT
- MOVE.B #NT_INTERRUPT,LN_TYPE(A1)
- MOVE.B #-40,LN_PRI(A1)
- Dlea INT_STARS_NAME,A2
- MOVE.L A2,LN_NAME(A1)
- MOVE.L A5,IS_DATA(A1)
- LEA INT_DRAW_STARS(PC),A2
- MOVE.L A2,IS_CODE(A1)
- MOVE.L #INTB_VERTB,D0
- CALLEXEC AddIntServer
- EXIT MOVEM.L (SP)+,A4-A7
- RTS
- NO_INT_STARS MOVEQ #10,D0
- Rbra L_CUSTOM
- NO_INT_STARS_DEF
- MOVEQ #9,D0
- Rbra L_CUSTOM
-
- INT_DRAW_STARS MOVEM.L D2-D7/A2-A4,-(SP)
- MOVE.L A1,A5
- Dload A2
- MOVEQ #0,D0
- MOVE.L STARS_INT_SCREEN-MB(A2),A4
- TST.W STARS_INT_CLEAR-MB(A2)
- BEQ.S SKIP_STARS_CLR
- LEA $DFF000,A1
- MOVE.W EcTLigne(A4),D6 BYTES REGEL
- ASR.W #1,D6 WORDS REGEL
- MOVE.W EcTy(A4),D5
- ASL.W #6,D5 Y * 64
- ADD.W D5,D6 BLITSIZE
- ERASE_SINGLE_I BTST #14,2(A1)
- BNE.S ERASE_SINGLE_I
- MOVE.W D0,$74(A1) BLTADAT
- MOVE.W D0,$66(A1) BLTDMOD
- MOVE.L #-1,$44(A1) BLTAFLWM
- MOVE.L #$01F00000,$40(A1) BLTCON0/1
- MOVE.L (A4),$54(A1) ADRES PLANE 1 -> 6
- MOVE.W D6,$58(A1) BLTSIZE
- SKIP_STARS_CLR MOVE.W STARS_COUNT-MB(A2),D7 HOW MANY STARS ?
- BEQ.S EXIT_STARS NO STARS DEFINED
- SUBQ.W #1,D7
- MOVE.L OFFSET_ADRES-MB(A2),A6 START ADRES OF EVERY LINE
- MOVE.L (A4),A0 PTR TO BITMAP ETC...
- Dlea STARS_CLIP,A3 CLIP DEFINITIONS
- MOVEM.W (A3),D1/A1/A3/A5 MIN X,MIN Y,MAX X,MAX Y
- MOVE.L STARS_ADRES-MB(A2),A2 STAR DEFINITIONS
- STARS1_LOOP_I MOVEM.W (A2),D3-6 3=X 4=Y 5=X SPEED 6= Y SPEED
- CMP.W D0,D5 X SPEED = 0 ?
- BEQ.S NO_X_SPEED_I
- ADD.W D3,D5
- CMP.W A3,D5 X >= MAX X ?
- BGE.S X_OFF_SCREEN_I
- CMP.W D1,D5 X < MIN X ?
- BLT.S X_OFF_SCREEN1_I
- MOVE.W D5,(A2) NEW COORD = OK
- BRA.S X_ON_SCREEN_I
- X_OFF_SCREEN_I SUB.W A3,D5
- MOVE.W D5,(A2) NEW COORD = X - MAX X
- BRA.S X_ON_SCREEN_I
- X_OFF_SCREEN1_I ADD.W D5,A3
- MOVE.W A3,(A2) NEW COORD = MAX X + (-X)
- X_ON_SCREEN_I
- NO_X_SPEED_I
- ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ; !!! I don't change the Y coordinates. This takes too much time !!!
- ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ; CMP.W D0,D6 Y SPEED = 0 ?
- ; BEQ.S NO_Y_SPEED_I
- ; ADD.W D4,D6
- ; CMP.W A1,D6 Y < MIN Y ?
- ; BLT.S Y_OFF_SCREEN1_I
- ; CMP.W A5,D6 Y >= MAX Y ?
- ; BGE.S Y_OFF_SCREEN_I
- ; MOVE.W D6,2(A2) NEW COORD = OK
- ; BRA.S Y_ON_SCREEN_I
- ;Y_OFF_SCREEN_I MOVE.W A1,2(A2) NEW COORD = MIN Y
- ; BRA.S Y_ON_SCREEN_I
- ;Y_OFF_SCREEN1_I MOVE.W A5,2(A2) NEW COORD = MAX Y
- ;Y_ON_SCREEN_I
- NO_Y_SPEED_I ADD.W D4,D4 FIND START ADRES OF LINE
- * MOVE.W (A6,D4.W),D6 IN TABLE
- MOVE.W D3,D5 SAVE X -> PIXELS
- NOT D5
- ASR.W #3,D3 SCREEN OFFSET -> ONLY X (BYTES)
- ADD.W (A6,D4.W),D3 ADD SCREEN OFFSETS -> X+Y
- BSET D5,(A0,D3.W) SET BIT ON SCREEN
- ADDQ.L #8,A2 ADRES OF NEXT STAR
- DBRA D7,STARS1_LOOP_I GO ON !
- EXIT_STARS MOVEM.L (SP)+,D2-D7/A2-A4
- MOVEQ #0,D0
- RTS
-
- L_STARS_INT_OFF EQU 67
- L67 Dload A2
- TST.W INT_STARS_ON-MB(A2)
- BEQ.S NO_STARS_INT
- CLR.W STARS_INT_CLEAR-MB(A2)
- MOVEM.L A4-A6,-(SP)
- CALLEXEC Disable
- Dload A2
- CLR.W INT_STARS_ON-MB(A2)
- MOVE.L INT_STARS_SERVER-MB(A2),A1
- MOVE.L #INTB_VERTB,D0
- CALLEXEC RemIntServer
- CALLEXEC Enable
- MOVEM.L (SP),A4-6
- Dload A2
- MOVE.L INT_STARS_SERVER-MB(A2),A1
- MOVE.L #IS_SIZE,D0
- CALLEXEC FreeMem
- MOVEM.L (SP)+,A4-A6
- NO_STARS_INT RTS
-
- L_BLIT_INT_ON EQU 68
- L68 MOVE.L (A3)+,D7 TO BLIT
- MOVE.L (A3)+,D6 FROM BLIT
- CMP.W D6,D7
- Rblt L_IFonc
- SUBQ.W #1,D6
- Rbmi L_IFonc
- SUBQ.W #1,D7
- CMP.W #96,D7
- Rbcc L_IFonc
- Dload A2
- TST.W INT_BLIT_ON-MB(A2)
- BNE.S NO_INT_BLIT
- MOVE.W #1,INT_BLIT_ON-MB(A2)
- MOVE.W D6,INT_BLIT_FROM-MB(A2)
- MOVE.W D7,INT_BLIT_TO-MB(A2)
- MOVEM.L A4-A7,-(SP)
- MOVE.L #IS_SIZE,D0
- MOVE.L #(MEMF_PUBLIC|MEMF_CLEAR),D1
- CALLEXEC AllocMem
- TST.L D0
- BEQ.S EXIT_INT_BLIT
- MOVE.L D0,A1
- Dload A2
- MOVE.L D0,INT_BLIT_SERVER-MB(A2)
- * INITIALISATIE INTERRUPT
- MOVE.B #NT_INTERRUPT,LN_TYPE(A1)
- MOVE.B #9,LN_PRI(A1)
- Dlea INT_BLIT_NAME,A2
- MOVE.L A2,LN_NAME(A1)
- MOVE.L A5,IS_DATA(A1)
- LEA INT_MULTI_BLIT(PC),A2
- MOVE.L A2,IS_CODE(A1)
- MOVE.L #INTB_VERTB,D0
- CALLEXEC AddIntServer
- EXIT_INT_BLIT MOVEM.L (SP)+,A4-A7
- RTS
- NO_INT_BLIT MOVEQ #13,D0
- Rbra L_CUSTOM
- INT_MULTI_BLIT MOVEM.L D2-D7/A2-A4,-(SP)
- MOVE.L A1,A5
- Dload A2
- MOVE.L T_RASTPORT(A5),A4
- MOVE.W INT_BLIT_FROM-MB(A2),D6
- MOVE.W INT_BLIT_TO-MB(A2),D7
- LEA $DFF000,A1
- Dlea BLIT_DEFS,A2
- NEXT_INT_BLIT ADD.W D6,D6
- ADD.W D6,D6
- MOVE.L A2,A0
- MOVE.L (A0,D6.W),D0
- BEQ.S BLIT_SKIP_THIS IF ADRES = 0 EXIT !!
- MOVE.L D0,A0
- MOVE.W (A0)+,D5 PLANE COUNT
- SUBQ #1,D5
- MOVEM.L (A0)+,D1-4
- MOVE.W (A0)+,A3 BLITSIZE
- MOVEQ #0,D0
- BLIT_S_LOOP_I BTST D0,24(A4)
- BEQ.S SKIP_S_BLIT
- BLIT_S_LOOP_I1 BTST #14,2(A1)
- BTST #14,2(A1)
- BNE.S BLIT_S_LOOP_I1
- ADDQ #1,D0
- MOVE.L D1,$44(A1) BLTAFLWM
- MOVEM.L D2-3,$60(A1) BLTCBMOD + BLTADMOD
- MOVE.L D4,$40(A1) BLTCON01
- MOVE.L (A0)+,$50(A1) SOURCE ADRES
- MOVE.L (A0)+,$54(A1) DEST ADRES
- MOVE.W A3,$58(A1)
- DBRA D5,BLIT_S_LOOP_I
- BLIT_SKIP_THIS ASR.W #2,D6
- ADDQ #1,D6
- CMP.W D7,D6
- BLE.S NEXT_INT_BLIT
- MOVEM.L (SP)+,D2-D7/A2-A4
- MOVEQ #0,D0
- RTS
- SKIP_S_BLIT ADDQ.L #8,A0
- ADDQ #1,D0
- DBRA D5,BLIT_S_LOOP_I
- ASR.W #2,D6
- ADDQ #1,D6
- CMP.W D7,D6
- BLE.S NEXT_INT_BLIT
- MOVEM.L (SP)+,D2-D7/A2-A4
- MOVEQ #0,D0
- RTS
-
- L_BLIT_INT_OFF EQU 69
- L69 Dload A2
- TST.W INT_BLIT_ON-MB(A2)
- BEQ.S NO_BLIT_INT
- CLR.W INT_BLIT_ON-MB(A2)
- MOVEM.L A4-A6,-(SP)
- CALLEXEC Disable
- Dload A2
- MOVE.L INT_BLIT_SERVER-MB(A2),A1
- MOVE.L #INTB_VERTB,D0
- CALLEXEC RemIntServer
- CALLEXEC Enable
- MOVEM.L (SP),A4-6
- Dload A2
- MOVE.L INT_BLIT_SERVER-MB(A2),A1
- MOVE.L #IS_SIZE,D0
- CALLEXEC FreeMem
- MOVEM.L (SP)+,A4-A6
- NO_BLIT_INT RTS
-
- L_FAST_DRAW EQU 70
- L70 MOVE.L (A3)+,D3 Y2
- MOVE.L (A3)+,D2 X2
- MOVE.L (A3)+,D1 Y1
- MOVE.L (A3)+,D0 X1
- MOVE.L T_RASTPORT(A5),A1
- RBSR L_DRAW_THE_LINE
- RTS
-
-
- *********************************
- L_INTER_Y EQU 71
- L71
- inter_y move.w d0,d4 *\
- add.w d2,d4 * >middle of X
- asr.w #1,d4 */
- move.w d1,d5 *\
- add.w d3,d5 * >middle of Y
- asr.w #1,d5 */
- cmp.w d6,d5
- bne.s inter_y_not_found
- rts
- inter_y_not_found:
- cmp.w d6,d5 *\
- blt.s middle_inf_y * \ if middle_y(d5) is greater
- move.w d4,d2 * > than d6
- move.w d5,d3 * / then modify coord and loop
- bra.s inter_y */
- middle_inf_y: *\
- move.w d4,d0 * \if middle_y(d5) is less
- move.w d5,d1 * / than d6
- bra.s inter_y */ then modify coord and loop
-
- ***********************************
- L_INTER_X EQU 72
- L72
- inter_x move.w d0,d4 *\
- add.w d2,d4 * > middle of X
- asr.w #1,d4 */
- move.w d1,d5 *\
- add.w d3,d5 * > middle of Y
- asr.w #1,d5 */
- cmp.w d6,d4
- bne.s inter_x_not_found
- rts
-
- inter_x_not_found:
- cmp.w d6,d4 *\
- blt.s middle_inf_x * \ if middle_x(d4) is greater
- move.w d4,d2 * > than d6
- move.w d5,d3 * / then modify coord and loop
- bra.s inter_x */
- middle_inf_x: *\
- move.w d4,d0 * \if middle_x(d4) is less
- move.w d5,d1 * / than d6
- bra.s inter_x */ then modify coord and loop
-
- ***********************************
-
- L_SET_OBJECT_LIMIT EQU 73
- L73 DLOAD A2
- MOVE.L (A3)+,D0
- RBMI L_IFONC
- CMP.L #32000,D0
- BGT.S LIMIT_TOO_HIGH
- TST.L D0
- BEQ.S CLEAR_OBJECT_LIMIT
- TST.W OBJECT_LIMIT-MB(A2)
- BNE.S LIMIT_IS_SET
- MOVE.L A2,-(SP)
- MOVE.L D0,D7
- LSL.L #2,D0
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- JSR ALLOCMEM(A6)
- BEQ.S NO_MEM
- MOVE.L D0,D6 STORE OBJECT BASE ADR
- MOVE.L D7,D0
- ADD.L D0,D0
- MOVE.L #MEMF_CHIP+MEMF_CLEAR,D1
- JSR ALLOCMEM(A6)
- BEQ.S NO_MEM
- MOVE.L A2,A6
- MOVE.L (SP)+,A2
- MOVE.W D7,OBJECT_LIMIT-MB(A2)
- MOVE.L D6,OBJECT_ADRES_BASE-MB(A2)
- MOVE.L D0,OBJECT_POINT_BASE-MB(A2)
- RTS
- LIMIT_IS_SET MOVEQ #14,D0
- RBRA L_CUSTOM
- LIMIT_TOO_HIGH MOVEQ #16,D0
- RBRA L_CUSTOM
- NO_MEM MOVE.L A2,A6
- MOVE.L (SP)+,A2
- RBRA OUT_OF_MEM
- CLEAR_OBJECT_LIMIT
- MOVE.W OBJECT_LIMIT-MB(A2),D0
- BEQ.S ALLREADY_CLEARED
- MOVE.W D0,D7
- SUBQ #1,D7
- MOVE.L OBJECT_ADRES_BASE-MB(A2),A1
- MOVE.L A1,A0
- BASE_TEST TST.L (A0)+
- BNE.S OBJECT_STILL_DEFINED
- DBRA D7,BASE_TEST
- EXT.L D0
- ADD.L D0,D0
- MOVE.L D0,D7
- ADD.L D0,D0
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- JSR FREEMEM(A6)
- MOVE.L A2,A6
- DLOAD A2
- CLR.W OBJECT_LIMIT-MB(A2)
- MOVE.L OBJECT_POINT_BASE-MB(A2),A1
- MOVE.L D7,D0
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- JSR FREEMEM(A6)
- MOVE.L A2,A6
- RTS
- ALLREADY_CLEARED
- MOVEQ #15,D0
- RBRA L_CUSTOM
- OBJECT_STILL_DEFINED
- MOVEQ #17,D0
- RBRA L_CUSTOM
-
-
- L_FAST_DRAW_TO EQU 74
- L74 MOVE.L T_RASTPORT(A5),A1
- MOVEM.W 36(A1),D0-1
- MOVE.L (A3)+,D3 Y2
- MOVE.L (A3)+,D2 X2
- RBSR L_DRAW_THE_LINE
- RTS
-
- L_DRAW_THE_LINE EQU 75
- L75 MOVEM.L A3-6,-(SP)
- MOVEM.W D2-3,36(A1)
- MOVEQ #0,D7
- MOVE.B 25(A1),D7 COLOUR FROM Rp STRUCT
- LEA $DFF000,A1
- MOVE.L ScOnAd(A5),A0 POINTER NAAR BITPLANES ENZ...
- Dload A2
- MOVEM.W EcClipX0(A0),A3-A6 XMIN=3,YMIN=4,XMAX=5,YMAX=6
- SUBQ #1,A5
- SUBQ #1,A6
- clip_line:
- cmp.w d2,d0 *\
- ble.s x1_less_x2 * \
- exg d0,d2 * >after that d0 <= d2
- exg d1,d3 * /
- x1_less_x2: */
- movem.w d0-d3,X1-MB(A2) * save coor in buffer
- CMP.W A5,D2
- ; cmp.w #x_max,d2 *\
- ble.s no_inter_x_max * > all line is at left of x_max
- CMP.W A5,D0
- ; cmp.w #x_max,d0 *\
- bgt line_unvisible * > all line is at right of x_max
- MOVE.W A5,D6
- ; move.w #x_max,d6 *\
- Rbsr L_INTER_X * \compute intersectoin with x_max
- movem.w d4-d5,X2-MB(A2) * / adn modify the coor
- movem.w X1-MB(A2),d0-d3 */
- no_inter_x_max:
- CMP.W A3,D0
- ; cmp.w #x_min,d0 *\
- bge.s no_inter_x_min * > all line is at right of x_min
- CMP.W A3,D2
- ; cmp.w #x_min,d2 *\
- ble line_unvisible * > all line is at left of x_min
- MOVE.W A3,D6
- ; move.w #x_min,d6 *\
- Rbsr L_INTER_X * \ compute intersection with x_min
- movem.w d4-d5,X1-MB(A2) * / adn modify the coor
- movem.w X1-MB(A2),d0-d3 */
- no_inter_x_min:
- cmp.w d3,d1 *\
- ble.s y1_less_y2 * \
- exg d0,d2 * >after that d1 <= d3
- exg d1,d3 * /
- y1_less_y2: */
- movem.w d0-d3,X1-MB(A2) * save coor in buffer
- CMP.W A6,D3
- ; cmp.w #y_max,d3 *\
- ble.s no_inter_y_max * > all line is at left of y_max
- CMP.W A6,D1
- ; cmp.w #y_max,d1 *\
- bgt line_unvisible * > all line is at right of y_max
- MOVE.W A6,D6
- ; move.w #y_max,d6 *\
- Rbsr L_INTER_Y * \compute intersectoin with y_max
- movem.w d4-d5,X2-MB(A2) * / adn modify the coor
- movem.w X1-MB(A2),d0-d3 */
- no_inter_y_max:
- CMP.W A4,D1
- ; cmp.w #y_min,d1 *\
- bge.s no_inter_y_min * > all line is at right of y_min
- CMP.W A4,D3
- ; cmp.w #y_min,d3 *\
- ble line_unvisible * > all line is at left of y_min
- MOVE.W A4,D6
- ; move.w #y_min,d6 *\
- Rbsr L_INTER_Y * \ compute intersection with y_min
- movem.w d4-d5,X1-MB(A2) * / adn modify the coor
- movem.w X1-MB(A2),d0-d3 */
- no_inter_y_min:
- SUB.W D0,D2
- BMI.S XNEG
- SUB.W D1,D3
- BMI.S YNEG
- CMP.W D3,D2
- BMI.S YGTX
- MOVEQ.L #OCTANT1+LINEMODE,D5
- BRA.S LINEAGAIN
- YGTX EXG D2,D3
- MOVEQ.L #OCTANT2+LINEMODE,D5
- BRA.S LINEAGAIN
- YNEG NEG.W D3
- CMP.W D3,D2
- BMI.S YNYGTX
- MOVEQ.L #OCTANT8+LINEMODE,D5
- BRA.S LINEAGAIN
- YNYGTX EXG D2,D3
- MOVEQ.L #OCTANT7+LINEMODE,D5
- BRA.S LINEAGAIN
- XNEG NEG.W D2
- SUB.W D1,D3
- BMI.S XYNEG
- CMP.W D3,D2
- BMI.S XNYGTX
- MOVEQ.L #OCTANT4+LINEMODE,D5
- BRA.S LINEAGAIN
- XNYGTX EXG D2,D3
- MOVEQ.L #OCTANT3+LINEMODE,D5
- BRA.S LINEAGAIN
- XYNEG NEG.W D3
- CMP.W D3,D2
- BMI.S XYNYGTX
- MOVEQ.L #OCTANT5+LINEMODE,D5
- BRA.S LINEAGAIN
- XYNYGTX EXG D2,D3
- MOVEQ.L #OCTANT6+LINEMODE,D5
- LINEAGAIN MOVE.W EcTLigne(A0),D4 BREEDTE IN BYTES
- MULU D4,D1
- MOVE.L D1,A3
- ROR.L #4,D0
- ADD.W D0,D0
- ADD.W D0,A3 A3=OFFSET
- SWAP D0
- ADD.W D3,D3
- ADD.W D3,D3
- MOVE.W D3,A4 A4=BLTBMOD IN LOW-WORD VAN A4
- ADD.W D2,D2
- MOVE.W D2,D1
- LSL.W #5,D1
- ADD.W #$42,D1
- MOVE.W D1,A6 BLTSIZE
- MOVE.L D0,D1
- SUB.W D2,D3
- MOVE.W D3,A5
- BPL.S LINEOVER
- OR.W #SIGNFLAG,D5
- LINEOVER SUB.W D2,A5 BLTBMOD+BLTAMOD
- MOVE.W EcNplan(A0),D2 NUMBER OF PLANES
- SUBQ #1,D2 -1 VOOR DBRA !
- BNE MULTI_PLANE_DRAW
- ONE_PLANE_DRAW
- WAIT_BLITTER1 BTST #14,2(A1)
- BNE.S WAIT_BLITTER1
- MOVE.W D4,BLTDMOD(A1)
- MOVEM.W D4/A4/A5,BLTCMOD(A1) C/B/A MOD
- MOVEQ #-1,D0
- MOVE.L D0,BLTAFWM(A1)
- MOVE.W #$8000,BLTADAT(A1)
- MOVE.L (A0),A2
- SUBQ #1,D7
- BNE.S LINE_CLEAR1
- OR.W #$BFA,D1
- MOVEM.W D1/D5,BLTCON0(A1)
- ADD.L A3,A2 ADRES BITPLANE + OFFSET
- LEA $52(A1),A3 EFFECTIEF ADRES BLTAPTL
- MOVE.L A2,BLTCPTH(A1)
- MOVE.W D3,(A3)+ BLTAPTL
- MOVE.L A2,(A3)+ BLTDPTH+BLTDPTL
- MOVE.W A6,(A3) BLTSIZE
- MOVEM.L (SP)+,A3-6
- RTS
- LINE_CLEAR1 OR.W #$B0A,D1
- MOVEM.W D1/D5,BLTCON0(A1)
- ADD.L A3,A2 ADRES BITPLANE + OFFSET
- LEA $52(A1),A3
- MOVE.L A2,BLTCPTH(A1) EFFECTIEF ADRES BLTAPTL
- MOVE.W D3,(A3)+ BLTAPTL
- MOVE.L A2,(A3)+ BLTDPTH+BLTDPTL
- MOVE.W A6,(A3) BLTSIZE
- LINE_UNVISIBLE MOVEM.L (SP)+,A3-6
- RTS
-
- MULTI_PLANE_DRAW
- MOVEQ #0,D6
- WAIT_BLITTER BTST #14,2(A1)
- BNE.S WAIT_BLITTER
- MOVE.W D4,BLTDMOD(A1)
- MOVEM.W D4/A4/A5,BLTCMOD(A1) C/B/A MOD
- MOVEQ.L #-1,D0
- MOVE.L D0,BLTAFWM(A1)
- MOVE.W #$8000,BLTADAT(A1)
- MOVE.L D1,D4
- MOVE.L D1,D0
- OR.W #$BFA,D0
- OR.W #$B0A,D4
- MOVE.W #$8400,$96(A1)
- NEXT_PLANE MOVE.L (A0)+,A2
- WAIT_BLITTER2 BTST #14,2(A1)
- BNE.S WAIT_BLITTER2
- BTST D6,D7
- BEQ.S LINE_CLEAR
- MOVEM.W D0/D5,BLTCON0(A1)
- ADD.L A3,A2 ADRES BITPLANE + OFFSET
- LEA $52(A1),A4 EFFECTIEF ADRES BLTAPTL
- MOVE.L A2,BLTCPTH(A1)
- MOVE.W D3,(A4)+ BLTAPTL
- MOVE.L A2,(A4)+ BLTDPTH+BLTDPTL
- MOVE.W A6,(A4) BLTSIZE
- ADDQ #1,D6
- DBRA D2,NEXT_PLANE
- MOVE.W #$0400,$96(A1)
- MOVEM.L (SP)+,A3-6
- RTS
- LINE_CLEAR MOVEM.W D4/D5,BLTCON0(A1)
- ADD.L A3,A2 ADRES BITPLANE + OFFSET
- LEA $52(A1),A4 EFFECTIEF ADRES BLTAPTL
- MOVE.L A2,BLTCPTH(A1)
- MOVE.W D3,(A4)+ BLTAPTL
- MOVE.L A2,(A4)+ BLTDPTH+BLTDPTL
- MOVE.W A6,(A4) BLTSIZE
- ADDQ #1,D6
- DBRA D2,NEXT_PLANE
- MOVE.W #$0400,$96(A1)
- MOVEM.L (SP)+,A3-6
- RTS
-
- L_SET_PLANES EQU 76
- L76 MOVE.L T_RASTPORT(A5),A0
- MOVE.L (A3)+,D0
- AND.L #$FF,D0
- MOVE.B D0,24(A0)
- RTS
-
- L_PLANE_OFFSET EQU 77
- L77 MOVEM.L (A3)+,D4-7 D4=Y D5=X D6=PLANE D7=SCREEN
- MOVE.L D7,D1
- RJSR L_GETEC
- TST.W D6
- RBEQ L_IFONC
- BMI.S CLEAR_PLANE_OFFSETS
- MOVE.W ECNPLAN(A0),D0
- CMP.W D6,D0
- RBLT L_IFONC
- SUBQ #1,D6
- LSL.W #2,D6
- MULU #24,D7
- ADD.W D7,D6
- MULS ECTLIGNE(A0),D4
- ADD.L D5,D4
- BEQ.S CLEAR_SINGLE_OFFSET
- DLEA PLANE_OFFSETS,A2
- ADD.L D4,(A2,D6.W)
- RTS
- CLEAR_SINGLE_OFFSET
- DLEA PLANE_OFFSETS,A2
- MOVE.L D4,(A2,D6.W)
- RTS
- CLEAR_PLANE_OFFSETS
- DLEA PLANE_OFFSETS,A1
- MULU #24,D7
- ADD.L D7,A1
- MOVEQ #5,D0 6 OFFSETS TO CLEAR
- CLEAR_OFFSET_L CLR.L (A1)+
- DBRA D0,CLEAR_OFFSET_L
- RTS
-
- L_PLANE_SWAP EQU 78
- L78 MOVE.L (A3)+,D6 TO PARAM
- RBLE L_IFONC
- MOVE.L (A3)+,D7 FROM PARAM
- RBLE L_IFONC
- MOVE.L (A3)+,D1 screen nr
- MOVE.W D1,D4 SAVE SCREEN NR
- RJSR L_GETEC
- MOVE.W EcNplan(A0),D5
- CMP.W #1,D5
- RBEQ L_IFONC ONLY 1 PLANE ? NO SWAP POSSIBLE
- CMP.W D6,D5
- RBLT L_IFONC PLANE CNT < PLANE TO SWAP ? ERROR !
- CMP.W D7,D5
- RBLT L_IFONC PLANE CNT < PLANE TO SWAP ? ERROR !
- SUBQ #1,D6
- SUBQ #1,D7
- LSL.W #2,D6
- LSL.W #2,D7
- MULU #24,D4
- ADD.W D4,D6 |
- ADD.W D4,D7 /
- LEA ECLOGIC(A0),A1
- MOVE.L (A1,D6.W),D0
- MOVE.L (A1,D7.W),D1
- EXG D0,D1 swap logic bitplanes
- MOVE.L D0,(A1,D6.W)
- MOVE.L D1,(A1,D7.W)
- LEA ECPHYSIC(A0),A1
- MOVE.L (A1,D6.W),D0
- MOVE.L (A1,D7.W),D1
- EXG D0,D1 swap physic bitplanes
- MOVE.L D0,(A1,D6.W)
- MOVE.L D1,(A1,D7.W)
- LEA ECCURRENT(A0),A1
- MOVE.L (A1,D6.W),D0
- MOVE.L (A1,D7.W),D1
- EXG D0,D1 swap current bitplanes
- MOVE.L D0,(A1,D6.W)
- MOVE.L D1,(A1,D7.W)
- RTS
-
- L_PLANE_SH_UP EQU 79
- L79 MOVE.L (A3)+,D7 TO PARAM
- RBLE L_IFONC
- MOVE.L (A3)+,D6 FROM PARAM
- RBLE L_IFONC
- CMP.W D6,D7
- RBLE L_IFONC
- MOVE.L (A3)+,D1 screen nr
- MOVE.W D1,D4
- RJSR L_GETEC
- MOVE.W ECNPLAN(A0),D0
- CMP.W D7,D0
- RBLT L_IFONC
- SUBQ #1,D6
- SUBQ #1,D7
- MOVE.W D7,D5
- SUB.W D6,D5
- SUBQ #1,D5 D5=COUNT
- LSL.W #2,D7
- MOVE.W D7,D6
- SUBQ #4,D6
- MULU #24,D4 |
- ADD.W D4,D6 |
- ADD.W D4,D7 /
- LEA ECLOGIC(A0),A2
- LEA ECPHYSIC(A0),A1
- LEA ECCURRENT(A0),A0
- MOVE.L (A2,D7.W),D2
- MOVE.L (A1,D7.W),D1
- MOVE.L (A0,D7.W),D0
- SHIFT_UP MOVE.L (A2,D6.W),(A2,D7.W)
- MOVE.L (A1,D6.W),(A1,D7.W)
- MOVE.L (A0,D6.W),(A0,D7.W)
- SUBQ #4,D6
- SUBQ #4,D7
- DBRA D5,SHIFT_UP
- MOVE.L D2,(A2,D7.W)
- MOVE.L D1,(A1,D7.W)
- MOVE.L D0,(A0,D7.W)
- RTS
-
- L_PLANE_SH_DOWN EQU 80
- L80 MOVE.L (A3)+,D7 TO PARAM
- RBLE L_IFONC
- MOVE.L (A3)+,D6 FROM PARAM
- RBLE L_IFONC
- CMP.W D6,D7
- RBLE L_IFONC
- MOVE.L (A3)+,D1 screen nr
- MOVE.W D1,D4
- RJSR L_GETEC
- MOVE.W ECNPLAN(A0),D0
- CMP.W D7,D0
- RBLT L_IFONC
- SUBQ #1,D6
- SUBQ #1,D7
- MOVE.W D7,D5
- SUB.W D6,D5
- SUBQ #1,D5 D5=COUNT
- LSL.W #2,D6
- MOVE.W D6,D7
- ADDQ #4,D7
- MULU #24,D4 |
- ADD.W D4,D6 |
- ADD.W D4,D7 /
- LEA ECLOGIC(A0),A2
- LEA ECPHYSIC(A0),A1
- LEA ECCURRENT(A0),A0
- MOVE.L (A2,D6.W),D2
- MOVE.L (A1,D6.W),D1
- MOVE.L (A0,D6.W),D0
- SHIFT_DOWN MOVE.L (A2,D7.W),(A2,D6.W)
- MOVE.L (A1,D7.W),(A1,D6.W)
- MOVE.L (A0,D7.W),(A0,D6.W)
- ADDQ #4,D6
- ADDQ #4,D7
- DBRA D5,SHIFT_DOWN
- MOVE.L D2,(A2,D6.W)
- MOVE.L D1,(A1,D6.W)
- MOVE.L D0,(A0,D6.W)
- RTS
-
- L_PLANE_UPDATE EQU 81
- L81 MOVE.L (A3)+,D1 screen nr
- MOVE.W D1,D4
- RJSR L_GETEC
- MOVEM.L A3/A6,-(SP)
- MOVE.L A0,A2
- MOVE.L A2,-(SP)
- MOVE.L $4.W,A6
- MOVEQ #72,D7 4*6*3 BYTES
- LEA ECLOGIC(A2),A0
- DLEA ECLOGIC_SAVE,A1
- MOVE.L D7,D0
- JSR -630(A6)
- MOVE.W ECNPLAN(A2),D0
- LEA ECLOGIC(A2),A0
- LEA ECPHYSIC(A2),A1
- LEA ECCURRENT(A2),A2
- DLEA PLANE_OFFSETS,A3
- MULU #24,D4
- ADD.W D4,A3
- ADD_OFFSETS MOVE.L (A3)+,D1
- ADD.L D1,(A0)+
- ADD.L D1,(A1)+
- ADD.L D1,(A2)+
- DBRA D0,ADD_OFFSETS
- MOVE.L (SP)+,A2
- MOVEM.L (SP),A3/A6
- ECCALL COPFORCE
- MOVE.L $4.W,A6
- DLEA ECLOGIC_SAVE,A0
- LEA ECLOGIC(A2),A1
- MOVE.L D7,D0
- JSR -630(A6)
- MOVEM.L (SP)+,A3/A6
- RTS
-
- F_PASTE_ICON EQU 82
- L82 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),D0
- BEQ IC_BANK_NOT_RES
- MOVE.L D0,A2
- ADDQ.L #8,A2
- CMP.W (A2),D1
- BHI ICON_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),D0 GET ICON ADDRESS
- BEQ ICON_NOT_DEF
- MOVE.L D0,A2
- MOVE.L (A3)+,D1 D1=Y
- BLT ICON_OF_SCREEN1
- MOVE.L (A3)+,D2 D2=X
- BLT ICON_OF_SCREEN
- AND.W #$FFF0,D2 X 16 BIT BOUNDARY
- MOVE.L SCONAD(A5),A0 ADRES ACTUAL SCREEN
- MOVEM.W ECTX(A0),D5-7 D5=ECTX D6=ECTY D7=ECNPLAN
- ; MOVEQ.L #0,D4 TEST PARAM FOR COORDS OF ICON
- ; CMP.W D4,D1 Y<0 ?
- ; BLT ICON_OF_SCREEN
- ; CMP.W D4,D2 X<0 ?
- ; BLT ICON_OF_SCREEN
- CMP.W D6,D1 Y>=ECTY ?
- BGE ICON_OF_SCREEN
- CMP.W D5,D2 X>=ECTX ?
- BGE ICON_OF_SCREEN
- MOVE.W ECTLIGNE(A0),D0 BYTES IN LINE
- MOVE.W D0,D5
- MOVE.W D0,D4
- MULU D1,D0 Y * BYTES IN LINE
- LSR.W #3,D2 X / 8
- ADD.L D2,D0 D0 = OFFSET START (Y*BYTES+X/8)
- MOVE.W (A2)+,D3 SIZE ICON IN X (WORDS)
- ADD.W D3,D3 SIZE ICON IN X (BYTES)
- SUB.W D3,D5 D5 = BLTDMOD (BYTES LINE-BYTES ICON)
- SUB.W D1,D6 ECTY - Y = YOVER
- ; MOVEQ #0,D1 INIT BLTAMOD
- SUB.W D2,D4 X OVER (BYTES LINE-X POS ICON)
- MOVE.W D3,D2 STORE SIZE ICON IN X (BYTES)
- MOVE.W D3,-(SP) STORE IT ONE MORE...
- SUB.W D4,D3 SIZE ICON X <= X OVER ?
- BLE.S NO_MOD_ICON
- ADD.W D3,D5 ADJUST DMOD
- SWAP D3 BLTAMOD IN HIGH WORD (SIZE X-X OVER)
- OR.L D3,D5
- MOVE.W D4,(SP) STORE NEW SIZE ICON X FOR BLTSIZE
- NO_MOD_ICON MOVE.W (A2)+,D4 D4 = SIZE ICON IN LINES
- MULU D4,D2 OFFSET D2 = SIZE ICON X * SIZE LINES (BYTES)
- CMP.W D6,D4
- BLT.S NO_CLIP_ICON
- MOVE.W D6,D4
- NO_CLIP_ICON
- LSL.W #6,D4 D4 = ICON LINES * 64
- MOVE.W (SP)+,D3
- LSR.W #1,D3 D3 = SIZE ICON IN X (WORDS)
- ADD.W D3,D4 D4 = BLTSIZE LINES*64+X (X=WORDS)
- MOVE.W (A2)+,D3 D3 = NUMBER OF PLANES IN ICON
- CMP.W D3,D7 NUMBER OF PLANES IN SCREEN <
- BLT.S PUT_SCR_PLAN NUMBER OF PLANES IN ICON ?
- MOVE.W D3,D7 NUMBER OF PLANES ICON FOR LOOP
- PUT_SCR_PLAN SUBQ #1,D7 -1 FOR DBRA
- LEA 4(A2),A2 SOURCE ADDRESS
- LEA $DFF002,A1 BASE CUSTOM+2
- MOVE.L #$9F00000,D1 INIT BLTCON0/1
- ICON_LOOP MOVE.L (A0)+,D6 ADRES PLANES 1 --> 6
- ADD.L D0,D6 ADD OFFSET TO PLANE
- WAIT_LOOP BTST #14,(A1)
- BNE.S WAIT_LOOP
- MOVEQ.L #-1,D3
- MOVEM.L D1/D3,-2+$40(A1) BLTCON0/1 + BLTAFLWM
- MOVEQ.L #0,D3
- MOVEM.L D3/D5,-2+$60(A1) BLTCBMOD AND BLTADMOD
- MOVE.L A2,-2+$50(A1) SOURCE ADRES (ICON)
- MOVE.L D6,-2+$54(A1) DEST ADRES (PLANE)
- MOVE.W D4,-2+$58(A1) BLTSIZE
- ADD.L D2,A2
- DBRA D7,ICON_LOOP
- ICON_OF_SCREEN RTS
- ICON_OF_SCREEN1 ADDQ.L #4,A3
- RTS
- IC_BANK_NOT_RES MOVEQ #$24,D0
- RJMP L_ERROR
- ICON_NOT_DEF MOVEQ #$4A,D0
- RJMP L_ERROR
-
- F_32BIT_ICON EQU 83
- L83 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),A2
- ; MOVE.L 8(A0),D0
- ; BEQ IC_32_NOT_RES
- ; MOVE.L D0,A2
- ADDQ.L #8,A2
- ; CMP.W (A2),D1
- ; BHI IC_32_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),A2
- ; MOVE.L (A2),D0 GET ICON ADDRESS
- ; BEQ IC_32_NOT_DEF
- ; MOVE.L D0,A2
- MOVE.L (A3)+,D1 D1=Y
- BLT.S IC_32_OF_SCREEN1
- MOVE.L (A3)+,D2 D2=X
- BLT.S IC_32_OF_SCREEN
- AND.W #$FFE0,D2 X 32 BIT BOUNDARY
- AND.W #$FFE0,D1 Y 32 BIT BOUNDARY
- MOVE.L SCONAD(A5),A0 ADRES ACTUAL SCREEN
- MOVEM.W ECTX(A0),D5-7 D5=ECTX D6=ECTY D7=ECNPLAN
- MOVEQ.L #0,D4 TEST PARAM FOR COORDS OF ICON
- ; CMP.W D4,D1 Y<0 ?
- ; BLT.S IC_32_OF_SCREEN
- ; CMP.W D4,D2 X<0 ?
- ; BLT.S IC_32_OF_SCREEN
- CMP.W D6,D1 Y>=ECTY ?
- BGE.S IC_32_OF_SCREEN
- CMP.W D5,D2 X>=ECTX ?
- BGE.S IC_32_OF_SCREEN
- MOVE.W ECTLIGNE(A0),D0 BYTES IN LINE
- MOVE.W D0,D5
- MULU D1,D0 Y * BYTES IN LINE
- LSR.W #3,D2 X / 8
- ADD.L D2,D0 D0 = OFFSET START (Y*BYTES+X/8)
- SUBQ.W #4,D5 D5 = BLTAMOD (BYTES LINE-BYTES ICON)
- MOVE.W #$802,D1 BLTSIZE
- MOVE.W 4(A2),D3 D3 = NUMBER OF PLANES IN ICON
- CMP.W D3,D7 NUMBER OF PLANES IN SCREEN <
- BLT.S PUT_32_PLAN NUMBER OF PLANES IN ICON ?
- MOVE.W D3,D7 NUMBER OF PLANES ICON FOR LOOP
- PUT_32_PLAN SUBQ #1,D7 -1 FOR DBRA
- LEA 10(A2),A2 SOURCE ADDRESS
- LEA $DFF002,A1 BASE CUSTOM+2
- MOVEQ.L #-1,D6 INIT BLTAFLWM
- MOVE.L #$9F00000,D2
- ICON_32_LOOP MOVE.L (A0)+,D3 ADRES PLANES 1 --> 6
- ADD.L D0,D3 ADD OFFSET TO PLANE
- WAIT_32_LOOP BTST #14,(A1)
- BNE.S WAIT_32_LOOP
- MOVEM.L D2/D6,-2+$40(A1) BLTCON0/1 + BLTAFLWM
- MOVEM.L D4-5,-2+$60(A1) BLTCBAMOD AND BLTDMOD
- MOVE.L A2,-2+$50(A1) SOURCE ADRES (ICON)
- MOVE.L D3,-2+$54(A1) DEST ADRES (PLANE)
- MOVE.W D1,-2+$58(A1) BLTSIZE
- LEA 128(A2),A2
- DBRA D7,ICON_32_LOOP
- IC_32_OF_SCREEN RTS
- IC_32_OF_SCREEN1
- ADDQ.L #4,A3
- RTS
- IC_32_NOT_RES MOVEQ #$24,D0
- RJMP L_ERROR
- IC_32_NOT_DEF MOVEQ #$4A,D0
- RJMP L_ERROR
-
-
- F_16BIT_ICON EQU 84
- L84 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),A2
- ; MOVE.L 8(A0),D0
- ; BEQ IC_16_NOT_RES
- ; MOVE.L D0,A2
- ADDQ.L #8,A2
- ; CMP.W (A2),D1
- ; BHI IC_16_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),A2
- ; MOVE.L (A2),D0 GET ICON ADDRESS
- ; BEQ IC_32_NOT_DEF
- ; MOVE.L D0,A2
- MOVE.L (A3)+,D1 D1=Y
- BLT.S IC_16_OF_SCREEN1
- MOVE.L (A3)+,D2 D2=X
- BLT.S IC_16_OF_SCREEN
- AND.W #$FFF0,D2 X 32 BIT BOUNDARY
- AND.W #$FFF0,D1 Y 32 BIT BOUNDARY
- MOVE.L SCONAD(A5),A0 ADRES ACTUAL SCREEN
- MOVEM.W ECTX(A0),D5-7 D5=ECTX D6=ECTY D7=ECNPLAN
- MOVEQ.L #0,D4 TEST PARAM FOR COORDS OF ICON
- ; CMP.W D4,D1 Y<0 ?
- ; BLT.S IC_16_OF_SCREEN
- ; CMP.W D4,D2 X<0 ?
- ; BLT.S IC_16_OF_SCREEN
- CMP.W D6,D1 Y>=ECTY ?
- BGE.S IC_16_OF_SCREEN
- CMP.W D5,D2 X>=ECTX ?
- BGE.S IC_16_OF_SCREEN
- MOVE.W ECTLIGNE(A0),D0 BYTES IN LINE
- MOVE.W D0,D5
- MULU D1,D0 Y * BYTES IN LINE
- LSR.W #3,D2 X / 8
- ADD.L D2,D0 D0 = OFFSET START (Y*BYTES+X/8)
- SUBQ.W #2,D5 D5 = BLTAMOD (BYTES LINE-BYTES ICON)
- MOVE.W #$802/2,D1 BLTSIZE
- MOVE.W 4(A2),D3 D3 = NUMBER OF PLANES IN ICON
- CMP.W D3,D7 NUMBER OF PLANES IN SCREEN <
- BLT.S PUT_16_PLAN NUMBER OF PLANES IN ICON ?
- MOVE.W D3,D7 NUMBER OF PLANES ICON FOR LOOP
- PUT_16_PLAN SUBQ #1,D7 -1 FOR DBRA
- LEA 10(A2),A2 SOURCE ADDRESS
- LEA $DFF002,A1 BASE CUSTOM+2
- MOVEQ.L #-1,D6 INIT BLTAFLWM
- MOVE.L #$9F00000,D2 INIT BLTCON0/1
- ICON_16_LOOP MOVE.L (A0)+,D3 ADRES PLANES 1 --> 6
- ADD.L D0,D3 ADD OFFSET TO PLANE
- WAIT_16_LOOP BTST #14,(A1)
- BNE.S WAIT_16_LOOP
- MOVEM.L D2/D6,-2+$40(A1) BLTCON0/1 + BLTAFLWM
- MOVEM.L D4-5,-2+$60(A1) BLTCBAMOD AND BLTDMOD
- MOVE.L A2,-2+$50(A1) SOURCE ADRES (ICON)
- MOVE.L D3,-2+$54(A1) DEST ADRES (PLANE)
- MOVE.W D1,-2+$58(A1) BLTSIZE
- LEA 32(A2),A2 ADD SIZE ICON TO PTR
- DBRA D7,ICON_16_LOOP
- IC_16_OF_SCREEN RTS
- IC_16_OF_SCREEN1
- ADDQ.L #4,A3
- RTS
- IC_16_NOT_RES MOVEQ #$24,D0
- RJMP L_ERROR
- IC_16_NOT_DEF MOVEQ #$4A,D0
- RJMP L_ERROR
-
-
- F_PROC_16ICON EQU 85
- L85 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),A2
- ; MOVE.L 8(A0),D0
- ; BEQ IC_16_NOT_RES
- ; MOVE.L D0,A2
- ADDQ.L #8,A2
- ; CMP.W (A2),D1
- ; BHI IC_16_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),A2
- ; MOVE.L (A2),D0 GET ICON ADDRESS
- ; BEQ IC_32_NOT_DEF
- ; MOVE.L D0,A2
- MOVE.L (A3)+,D1 D1=Y
- BLT IC_PROC_16OF_SCREEN1
- MOVE.L (A3)+,D2 D2=X
- BLT.S IC_PROC_16OF_SCREEN
- AND.W #$FFF0,D2 X 32 BIT BOUNDARY
- AND.W #$FFF0,D1 Y 32 BIT BOUNDARY
- MOVE.L SCONAD(A5),A0 ADRES ACTUAL SCREEN
- MOVEM.W ECTX(A0),D5-7 D5=ECTX D6=ECTY D7=ECNPLAN
- ; MOVEQ.L #0,D4 TEST PARAM FOR COORDS OF ICON
- ; CMP.W D4,D1 Y<0 ?
- ; BLT.S IC_PROC_16OF_SCREEN
- ; CMP.W D4,D2 X<0 ?
- ; BLT.S IC_PROC_16OF_SCREEN
- CMP.W D6,D1 Y>=ECTY ?
- BGE.S IC_PROC_16OF_SCREEN
- CMP.W D5,D2 X>=ECTX ?
- BGE.S IC_PROC_16OF_SCREEN
- MOVE.W ECTLIGNE(A0),D0 BYTES IN LINE
- MOVE.W D0,D5
- MULU D1,D0 Y * BYTES IN LINE
- LSR.W #3,D2 X / 8
- ADD.L D2,D0 D0 = OFFSET START (Y*BYTES+X/8)
- MOVE.W 4(A2),D3
- CMP.W D3,D7
- BLT.S PUT_PROC_16PLAN
- MOVE.W D3,D7
- PUT_PROC_16PLAN SUBQ #1,D7
- LEA 10(A2),A2
- PUT_PROC_16LOOP MOVE.L (A0)+,A1
- ADD.L D0,A1
- PUT_DATA_16LOOP MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- ADD.W D5,A1
- MOVE.W (A2)+,(A1)
- DBRA D7,PUT_PROC_16LOOP
- IC_PROC_16OF_SCREEN
- RTS
- IC_PROC_16OF_SCREEN1
- ADDQ.L #4,A3
- RTS
-
- F_PROC_32ICON EQU 86
- L86 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),A2
- ; MOVE.L 8(A0),D0
- ; BEQ IC_16_NOT_RES
- ; MOVE.L D0,A2
- ADDQ.L #8,A2
- ; CMP.W (A2),D1
- ; BHI IC_16_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),A2
- ; MOVE.L (A2),D0 GET ICON ADDRESS
- ; BEQ IC_32_NOT_DEF
- ; MOVE.L D0,A2
- MOVE.L (A3)+,D1 D1=Y
- BLT IC_PROC_32OF_SCREEN1
- MOVE.L (A3)+,D2 D2=X
- BLT IC_PROC_32OF_SCREEN
- AND.W #$FFF0,D2 X 32 BIT BOUNDARY
- AND.W #$FFF0,D1 Y 32 BIT BOUNDARY
- MOVE.L SCONAD(A5),A0 ADRES ACTUAL SCREEN
- MOVEM.W ECTX(A0),D5-7 D5=ECTX D6=ECTY D7=ECNPLAN
- ; MOVEQ.L #0,D4 TEST PARAM FOR COORDS OF ICON
- ; CMP.W D4,D1 Y<0 ?
- ; BLT IC_PROC_32OF_SCREEN
- ; CMP.W D4,D2 X<0 ?
- ; BLT IC_PROC_32OF_SCREEN
- CMP.W D6,D1 Y>=ECTY ?
- BGE IC_PROC_32OF_SCREEN
- CMP.W D5,D2 X>=ECTX ?
- BGE IC_PROC_32OF_SCREEN
- MOVE.W ECTLIGNE(A0),D0 BYTES IN LINE
- MOVE.W D0,D5
- MULU D1,D0 Y * BYTES IN LINE
- LSR.W #3,D2 X / 8
- ADD.L D2,D0 D0 = OFFSET START (Y*BYTES+X/8)
- MOVE.W 4(A2),D3
- CMP.W D3,D7
- BLT.S PUT_PROC_32PLAN
- MOVE.W D3,D7
- PUT_PROC_32PLAN SUBQ #1,D7
- LEA 10(A2),A2
- PUT_PROC_32LOOP MOVE.L (A0)+,A1
- ADD.L D0,A1
- PUT_DATA_32LOOP MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- ADD.W D5,A1
- MOVE.L (A2)+,(A1)
- DBRA D7,PUT_PROC_32LOOP
- IC_PROC_32OF_SCREEN
- RTS
- IC_PROC_32OF_SCREEN1
- ADDQ.L #4,A3
- RTS
-
- L_ICON_X EQU 87
- L87 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),D0
- BEQ.S IC_X_NOT_RES
- MOVE.L D0,A2
- ADDQ.L #8,A2
- CMP.W (A2),D1
- BHI.S ICON_X_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),D0 GET ICON ADDRESS
- BEQ.S ICON_X_NOT_DEF
- MOVE.L D0,A2
- MOVE.W (A2),D3
- MOVEQ #0,D2
- RTS
- IC_X_NOT_RES MOVEQ #$24,D0
- RJMP L_ERROR
- ICON_X_NOT_DEF MOVEQ #$4A,D0
- RJMP L_ERROR
-
- L_ICON_Y EQU 88
- L88 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),D0
- BEQ.S IC_Y_NOT_RES
- MOVE.L D0,A2
- ADDQ.L #8,A2
- CMP.W (A2),D1
- BHI.S ICON_Y_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),D0 GET ICON ADDRESS
- BEQ.S ICON_Y_NOT_DEF
- MOVE.L D0,A2
- MOVE.W 2(A2),D3
- MOVEQ #0,D2
- RTS
- IC_Y_NOT_RES MOVEQ #$24,D0
- RJMP L_ERROR
- ICON_Y_NOT_DEF MOVEQ #$4A,D0
- RJMP L_ERROR
-
- L_ICON_PLANES EQU 89
- L89 MOVE.L (A3)+,D1
- RBLE L_IFONC
- MOVE.L ABANKS(A5),A0
- MOVE.L 8(A0),D0
- BEQ.S IC_PLANES_NOT_RES
- MOVE.L D0,A2
- ADDQ.L #8,A2
- CMP.W (A2),D1
- BHI.S ICON_PLANES_NOT_DEF
- LSL.W #3,D1
- LEA -6(A2,D1.W),A2 PTR TO ICON DEFINITION
- MOVE.L (A2),D0 GET ICON ADDRESS
- BEQ.S ICON_PLANES_NOT_DEF
- MOVE.L D0,A2
- MOVE.W 4(A2),D3
- MOVEQ #0,D2
- RTS
- IC_PLANES_NOT_RES
- MOVEQ #$24,D0
- RJMP L_ERROR
- ICON_PLANES_NOT_DEF
- MOVEQ #$4A,D0
- RJMP L_ERROR
-
-
- L_CPU_INFO EQU 90
- L90 MOVE.L A6,A2
- MOVE.L $4.W,A6
- MOVE.W 296(A6),D1
- BTST #3,D1
- BNE.S CPU040
- BTST #2,D1
- BNE.S CPU030
- BTST #1,D1
- BNE.S CPU020
- BTST #0,D1
- BNE.S CPU010
- CPU000 MOVEQ #0,D3
- BRA.S CPU_OK
- CPU010 MOVEQ #10,D3
- BRA.S CPU_OK
- CPU020 MOVEQ #20,D3
- BRA.S CPU_OK
- CPU030 MOVEQ #30,D3
- BRA.S CPU_OK
- CPU040 MOVEQ #40,D3
- CPU_OK MOVEQ #0,D2
- MOVE.L A2,A6
- RTS
-
- L_MATH_INFO EQU 91
- L91 MOVEQ.L #0,D3 INIT RESULT
- MOVEQ.L #0,D2 AS AN INTEGER
- MOVE.L A6,A2
- MOVE.L $4.W,A6
- MOVE.W 296(A6),D1
- BTST #4,d1
- BNE.S FOUND_881
- BTST #5,d1
- BNE.S FOUND_882
- BRA.S FPU_FOUND
- FOUND_882 MOVE.L #882,D3
- BRA.S FPU_FOUND
- FOUND_881 MOVE.L #881,D3
- FPU_FOUND MOVE.L A2,A6
- RTS
-
-
- L92
- L93
- ***********************************************************
- * Customized error messages
- ; This list of routines just load in D0 the number of the error message in
- ; the extension error-list, and call the error handling routine.
-
-
- *********************************************************************
- * ERROR MESSAGES...
-
- L_Custom equ 94
- L94 lea ErrMess(pc),a0
- moveq #0,d1 * Can be trapped
- moveq #ExtNb,d2 * Number of extension
- moveq #0,d3 * IMPORTANT!!!
- RJmp L_ErrorExt * Jump to routine...
- * Messages...
- ErrMess dc.b "Check allready reserved",0 *0
- dc.b "Check not reserved",0 *1
- dc.b "Object is allready defined",0 *2
- dc.b "Object is not defined",0 *3
- dc.b "Too many draws in object",0 *4
- dc.b "Too many moves in object",0 *5
- dc.b "Too many attributes in object",0 *6
- dc.b "This is not an object file",0 *7
- dc.b "Stars allready reserved",0 *8
- dc.b "Stars not reserved",0 *9
- dc.b "Stars int allready on",0 *10
- dc.b "Blit store allready defined",0 *11
- dc.b "Blit store not defined",0 *12
- dc.b "Blit int allready on",0 *13
- dc.b "Limit allready set",0 *14
- dc.b "Limit allready cleared",0 *15
- dc.b "Limit should be max : 32000",0 *16
- dc.b "Some objects still defined, Erase them",0 *17
- dc.b "Object count exceeds object limit",0 *18
-
- * IMPORTANT! Always EVEN!
- even
-
- ******* "No errors" routine
- ; If you compile with -E0, the compiler will replace the previous
- ; routine by this one. This one just sets D3 to -1, and does not
- ; load messages in A0. Anyway, values in D1 and D2 must be valid.
- ;
- ; THIS ROUTINE MUST BE THE LAST ONE IN THE LIBRARY!
- ;
-
- L95 moveq #0,d1
- moveq #ExtNb,d2
- moveq #-1,d3
- RJmp L_ErrorExt
-
- ; Do not forget the last label to delimit the last library routine!
- L96
-
- *********************************************************************
- ; Now the title of the extension. If you come from V1.23 note that
- ; the cursor is no more located on the screen, instead a CDOWN (31)
- ; control code is used...
-
- ******* TITLE MESSAGE
- C_Title dc.b 31,"TURBO EXTENSION V1.6 ",10
- Even
-
- ******* END OF THE EXTENSION
- C_End dc.w 0
- even
-
-
-
-
-
-
-