The following code shows two trucks bouncing against each other on a digital desert during the night. It's an example of how to draw by using the "Fast Clear" technique. Download it to see it in motion right away (april 2005).
YSS
;>>>>>>>>>>>>>>>>>>>>
;THE CODE BEGINS RIGHT BELOW THIS LINE:
;.MODEL TINY
;-----------
;(APR 2005)
;
;THIS CODE USED SCOLL00B.ASM AS AN EXAMPLE
;TO USE THE "FAST CLEAR" TECHNIQUE TO DRAW
;ON VGA MODE 13 SCREEN.
;
CSEG SEGMENT
ORG 100H
ASSUME CS:CSEG,DS:CSEG
START PROC
;=============================================================
;SET SCREEN + ES
;=============================================================
MOV AL,13H
INT 10H
MOV BH,0A0H
MOV ES,BX
CLD
CALL LINE ;FLOOR
CALL SET
;=============================================================
;FIX TIME A BIT
;=============================================================
CALL GETTIM
MOV VB,AL
;=============================================================
;SYSTEM CYCLE
;=============================================================
S000:
CALL MOBSOUT ;SET MOTION,
MOV AH,1 ;CHECK FOR XIT REQUEST,
INT 16H ;
JE S000 ;AND REPEAT WHILE NO KEY
;=============================================================
XOR AH,AH
INT 16H
DB 0C3H
;
;
;
;=============================================================
;=============================================================
;=============================================================
;SYSTEM ROUTINES:
;=============================================================
SET PROC
;SET BACKGROUND IMG IN PLACE
;--------------------------------------
;LOAD RGB TBL
MOV SI,OFFSET RGB80
MOV DX,03C8H
MOV AH,32*3
MOV AL,128
OUT DX,AL
INC DX
L00:
MOV AL,[SI]
OUT DX,AL
INC SI
DEC AH
JNE L00
;--------------------------------------
;SCREEN IN PLACE
MOV BH,0A0H
MOV ES,BX
MOV SI,OFFSET CPXTST
XOR DI,DI
XOR BP,BP
S01:
MOV AX,[SI]
ADD SI,2
S00:
MOV ES:[DI],AL
INC DI
DEC AH
JNE S00
ADD BP,2
CMP BP,CPXLM
JB S01
CALL NOC4
CALL NORM
PUSH DS
PUSH ES
POP DS
MOV CX,16000
CLD
XOR SI,SI
MOV DI,16000
CX00:
REP MOVSB
POP DS
CALL NORM
SET ENDP
NOC4 PROC
;------------------------
;------------------------ NO CHAIN 4: 03C4 #04 BT3=0
;------------------------
MOV DX,03C4H
MOV AL,4
OUT DX,AL
INC DX
IN AL,DX ;AL=[#04]
XOR AL,8
OUT DX,AL ;#04=[#04] AND F7
RET
NOC4 ENDP
NORM PROC ;FLIP BITMASK REGISTER
MOV DX,03CEH
MOV AL,8
OUT DX,AL
INC DX
IN AL,DX
XOR AL,255
OUT DX,AL
RET
NORM ENDP
NO100D:
CALL NOC4
CALL NORM
PUSH DS
PUSH ES
POP DS
MOV DI,950*8 ;"FAST CLEAR"
MOV SI,1475*16 ;NOW USED TO DRAW
MOV CX,48*5*3 ;NOT TO CLEAR
CLD
NXX0:
REP MOVSB
POP DS
CALL NORM
JMP NOC4
GETTIM PROC
;GET TIME
PUSH ES
XOR AX,AX
MOV ES,AX
MOV AL,ES:[46CH]
POP ES
RET
GETTIM ENDP
LINE PROC
;SET A FLOOR
MOV DI,320*104
MOV AX,0202H
MOV CX,320/2
REP STOSW
RET
LINE ENDP
MDX DB 2 ;MOBS VECTORS
;BT0 -> MOB 1 DX: 0 -> MOVING RIGHT
; 1 -> '' 2 ' ' ' '
;BTS2-7 N/U
VB DB 0 ;TIMER CMP
M1XPOS DW 0 ;MOB 1 XPOS
M2XPOS DW 319-22 ; '' 2 ''
M1BDL DB 0 ;
M2BDL DB 0 ;
BOUNDS PROC
;CHECK FOR MOB OUT OF BOUNDS.
;AX=XPOS (0..319)
;BL(BT0)=MOVING DIRECTION (0=TO THE RIGHT)
;RETURNS:
;CF -> OUT OF BOUNDS
;AND AX INC'D OR DEC'D
SHR BL,1
JNC B00
CMP AX,0+1 ;LEFT BOUND
JNB B001
CLC
RET
B001:
DEC AX
STC
RET
B00:
CMP AX,319-22 ;RIGHT BOUND
JBE B01
STC
RET
B01:
CLC
INC AX
RET
BOUNDS ENDP
MOBSOUT PROC
;DRAW MOBS ON SCREEN..
CALL GETTIM ;
CMP AL,VB ;..WHEN IT'S THE RIGHT TIME FOR IT
JE MXOXITBOOR
JMP MXOXIT
MXOXITBOOR:
PUSH ES ;GO INTO
XOR AX,AX ;SLO MOTION
MOV ES,AX ;IF SHIFT
MOV AL,ES:[417H] ;KEY IS
POP ES ;PRESSED.
TEST AL,1 ;
JE S002 ;
INC VB
INC VB
INC VB
S002:
TEST AL,2 ;EVEN SLOWER
JE S001 ;IF BOTH
INC VB ;PRESSED
INC VB
INC VB
S001:
INC VB ;.
DNBL:
;=============================================================
;IMG CLRS
;=============================================================
CALL NO100D ;"FAST CLEAR"
;CALL NO1
;=============================================================
;ACTUAL COLLISION DETECTION
;=============================================================
MOV AX,M1XPOS ;MATHEMATICAL COLLISION DET.
SUB AX,M2XPOS ;NOT PIXEL ACCURATE, BUT WHAT IS?
ADD AX,22 ;I MEAN, WHAT IS, REALLY? :)
JLE NOCOLL ;NO COLLISION
XOR MDX,3 ;YET, INDICATE IF SO
MOV M1BDL,14 ;
MOV M2BDL,14 ;
NOCOLL:
;=============================================================
;BOUND CHECKS AND INCS
;=============================================================
MOV AX,M1XPOS ;XPOS
MOV BL,MDX ;MOVING DIRECTION (BT0)
CALL BOUNDS ;CHECK FOR SCREEN BOUNDS
MOV M1XPOS,AX ;AND UPDATE
RCL BL,1 ;CF = BOUNDS
AND MDX,254
AND BL,1
OR MDX,BL ;CHANGE DIRECTION IF NEEDED
MOV AX,M2XPOS ;SAME FOR MOB2
MOV BL,MDX
SHR BL,1
CALL BOUNDS
MOV M2XPOS,AX
RCL BL,1
SHL BL,1
AND MDX,253
AND BL,2
OR MDX,BL
;=============================================================
CALL MOBOUT1 ;VIEW MOBS
MXOXIT:
RET
MOBSOUT ENDP
MOBOUT1 PROC
;VIEW CHR1
MOV AL,1 ;VIEW
MOV SI,OFFSET MOB
CMP M1BDL,0
JE M1NOB ;NO BUMP
DEC M1BDL
JNE M10R
M1NOB:
TEST MDX,1
JE M10R ;MOVING RIGHT
ADD SI,198 ;MOVING LEFT
M10R:
MOV DI,0+320*(100-5)
ADD DI,M1XPOS
CALL MOBOUT
MOBOUT1 ENDP
MOBOUT2 PROC
;VIEW CHR2
MOV AL,1
MOV SI,OFFSET MOB+198
CMP M2BDL,0
JE M2NOB ;NO BUMP
DEC M2BDL
JNE M20R
M2NOB:
TEST MDX,2
JNE M20R
SUB SI,198
M20R:
MOV DI,0+320*(100-5) ;+319-22
ADD DI,M2XPOS
CALL MOBOUT
RET
MOBOUT2 ENDP
;NO1 PROC
; ;WIPE CHR1
; XOR AL,AL
; MOV SI,OFFSET MOB
; MOV DI,0+320*(100-5)
; ADD DI,M1XPOS
; CALL MOBOUT
;NO1 ENDP
;
;NO2 PROC
; ;WIPE CHR2
; XOR AL,AL
; MOV SI,OFFSET MOB+198
; MOV DI,0+320*(100-5)
; ADD DI,M2XPOS
;NO2 ENDP
MOBOUT PROC
;VIEW/CLR MOB IN SI
;AL BT0=1 -> VIEW
MOV BP,9
TEST AL,1
JE M01
M00:
MOV CX,22; /2
M001:
MOV AL,[SI]
TEST AL,AL
JE M0010
MOV ES:[DI],AL
M0010:
INC SI
INC DI
LOOP M001
ADD DI,320-22
DEC BP
JNE M00
RET
M01:
XOR AX,AX
MOV CX,22/2
REP STOSW
ADD DI,320-22
DEC BP
JNE M01
RET
MOBOUT ENDP
START ENDP
MOB LABEL WORD
;=============================================================
;MOB DATA. MOB = MOVABLE OBJECT BLOCK
;22*9 IMAGES: 22 PIXELS WIDE, 9 PIXELS DOWN
;IF A=OFFSET ->
;A+0 -> CHR FACING RIGHT
;A+198 -> CHR FACING LEFT
;[pixelrat@hotmail.com]
;[http://www.oocities.org/yssmlp/]
;=============================================================
DW 2313, 2313, 2313, 2313, 2313, 2313, 2313, 9
DW 0, 0, 0, 2313, 1026, 1026, 1026, 516, 1028
DW 2306, 9, 3084, 12, 0, 2313, 1033, 1033, 1033
DW 2313, 2308, 2313, 9, 3084, 3084, 0, 2313, 514
DW 516, 514, 516, 1026, 2306, 265, 12, 0, 0
DW 2313, 2313, 2308, 1033, 2308, 1028, 2313, 265, 3084
DW 3084, 1036, 2313, 514, 2313, 2313, 521, 514, 2306
DW 265, 3084, 3084, 1036, 2313, 2313, 6409, 6425, 2313
DW 2313, 2313, 265, 6412, 6425, 1036, 0, 0, 6400
DW 6408, 0, 0, 0, 0, 6400, 6408, 0, 0
DW 0, 6400, 6425, 0, 0, 0, 0, 6400, 6425
DW 0, 0, 0, 0, 2304, 2313, 2313, 2313, 2313
DW 2313, 2313, 2313, 0, 3072, 3084, 2304, 521, 1026
DW 1028, 1026, 1026, 514, 2313, 0, 3084, 3084, 2304
DW 2313, 1033, 1033, 1033, 2308, 2313, 2313, 0, 0
DW 3072, 2305, 521, 1026, 1026, 1026, 516, 514, 2313
DW 3076, 3084, 3084, 2305, 2313, 1033, 1028, 1033, 1033
DW 2313, 2313, 3076, 3084, 3084, 2305, 521, 514, 2306
DW 2313, 2313, 514, 2313, 3076, 6425, 3097, 2305, 2313
DW 2313, 2313, 6425, 2329, 2313, 2313, 0, 2073, 25
DW 0, 0, 0, 0, 2073, 25, 0, 0, 0
DW 6425, 25, 0, 0, 0, 0, 6425, 25, 0
DW 0
DB 0,0 ;,0,0,0,0,0,0
RGB80 LABEL BYTE ;
DW 5410, 0, 10752, 5410, 10786, 10261, 5414, 9216, 18
DW 3612, 7189, 4366, 3612, 7182, 3601, 5404, 7182, 3608
DW 7196, 6158, 3612, 7189, 4366, 3612, 6, 2060, 3584
DW 10, 3088, 4608, 14, 4116, 5632, 18, 5144, 6656
DW 22, 6172, 7680, 26, 7200, 8704, 30, 8228, 9728
DW 34, 9256, 10752
CPXTST LABEL WORD
;--------------------------------------
;TAKEN FROM E:\RC171\SD4242K5\TST\SD424CPX.ZTX
;--------------------------------------
CPXIN EQU CPXND - $ +1
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 10240, 65424, 65424, 65424, 50064
DW 65425, 65425, 65425, 65425, 65425, 65425, 18065, 65426, 65426
DW 4498, 1055, 335, 65426, 15506, 335, 1567, 335, 36242
DW 334, 43922, 335, 1823, 335, 65426, 14738, 335, 543
DW 332, 1055, 335, 26258, 53907, 335, 1823, 65427, 14995
DW 799, 332, 799, 41363, 325, 38803, 335, 1567, 65427
DW 14995, 335, 799, 332, 543, 65427, 14995, 335, 1567
DW 26259, 12436, 320, 41620, 1055, 332, 287, 335, 65428
DW 14740, 335, 287, 332, 1055, 65428, 14740, 335, 1567
DW 335, 65428, 14484, 335, 543, 332, 543, 335, 65428
DW 14740, 332, 1055, 335, 27540, 65429, 65429, 65429, 9109
DW 10806, 65429, 8853, 13622, 65429, 8597, 6198, 26773, 65430
DW 65430, 65430, 65430, 65430, 65430, 18070, 65431, 65431, 65431
DW 65431, 65431, 65431, 18071, 65432, 65432, 65432, 65432, 65432
DW 65432, 18072, 65433, 65433, 65433, 65433, 65433, 65433, 18073
DW 65434, 65434, 65434, 65434, 65434, 65434, 18074, 65435, 65435
DW 8347, 389, 1798, 65435, 14235, 389, 518, 388, 1664
DW 1542, 65435, 12187, 389, 518, 388, 3712, 518, 65435
DW 11419, 518, 388, 4736, 262, 20891, 55196, 389, 262
DW 388, 5504, 262, 65436, 9884, 389, 518, 388, 6016
DW 518, 65436, 8860, 774, 388, 7040, 262, 65436, 8092
DW 389, 262, 388, 8064, 518, 65436, 7068, 389, 518
DW 9088, 518, 18844, 52893, 389, 262, 388, 9856, 518
DW 65437, 5277, 389, 518, 388, 10624, 518, 65437, 4253
DW 389, 518, 388, 11648, 262, 65437, 3741, 518, 388
DW 12416, 262, 65437, 3229, 262, 388, 13184, 262, 17053
DW 51073, 387, 13698, 387, 65409, 2177, 643, 14210, 387
DW 65409, 1153, 899, 14722, 387, 65409, 641, 643, 15746
DW 387, 16513, 65282, 16642, 65280, 16640, 65282, 16642, 65280
DW 16640, 65282, 16642, 65280, 65280, 33280, 65282, 16642, 65280
DW 65280, 65280, 49920, 65282, 16642, 65280, 65280, 65280, 49920
DW 65282, 16642, 65280, 65280, 65280, 65280, 65280, 1280, 65282
DW 16642, 65280, 65280, 65280, 65280, 65280, 65280, 17920, 65282
DW 16642, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 34560
DW 65282, 16642, 65280, 65280, 45056, 265, 256, 265, 23808
DW 265, 256, 265, 23808, 265, 256, 265, 32000, 265
DW 256, 265, 23808, 265, 256, 265, 23808, 265, 256
DW 265, 32000, 265, 256, 265, 23808, 265, 256, 265
DW 23808, 265, 256, 265, 32000, 265, 256, 265, 23808
DW 265, 256, 265, 23808, 265, 256, 265, 32000, 265
DW 256, 265, 23808, 265, 256, 265, 23808, 265, 256
DW 265, 20224, 11778, 265, 258, 265, 23810, 265, 258
DW 265, 23810, 265, 258, 265, 20226, 11776, 265, 256
DW 265, 23808, 265, 256, 265, 23808, 265, 256, 265
DW 32000, 265, 256, 265, 23808, 265, 256, 265, 23808
DW 265, 256, 265, 32000, 265, 256, 265, 23808, 265
DW 256, 265, 23808, 265, 256, 265, 32000, 265, 256
DW 265, 23808, 265, 256, 265, 23808, 265, 256, 265
DW 32000, 265, 256, 265, 23808, 265, 256, 265, 23808
DW 265, 256, 265, 32000, 265, 256, 265, 23808, 265
DW 256, 265, 23808, 265, 256, 265, 32000, 265, 256
DW 265, 23808, 265, 256, 265, 23808, 265, 256, 265
DW 32000, 265, 256, 265, 23808, 265, 256, 265, 23808
DW 265, 256, 265, 20224, 65282, 16642, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 19200
DW 65282, 16642, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 35840, 65282, 16642, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280, 52480, 65282, 16642, 65280, 65280, 65280
DW 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280, 65280
DW 65280, 65280, 65280
CPXND EQU $
CPXLM DW CPXIN
CSEG ENDS
END START