The code below shows two trucks on a collision course. At 782 bytes it's not very optimal. Many bytes could have been -and could still be- saved by better tightening of the code, but it was programmed in a hurry (about an hour for the curious: you know how hard it is to picture a truck in your head [in color] just off decimal numbers?).


Instructions (for beginners):
------------

1- Copy the code below into a file and name it SCOLL00B.ASM .
2- Next, assemble the file by using an assembler (MASM, NASM, TASM, ML.EXE as examples).
3- Run the resulting .COM file and enjoy, that's it!


Some assemblers may need the ".MODEL TINY" line, so just remove the ";" at its beginning and then assemble.

Needless to say, this example works best when viewed in a clean system (i.e., not infected by windows) [apr 2005]

Enjoy!
YSS
pixelrat@hotmail.com



;THE FILE STARTS RIGHT BELOW THIS LINE:
;///////////////////////////////////////////////////////////////////

;.MODEL TINY
;YSS89, cont, ycont,Yss 1989-, sdD+J.
;------------------------------------
CSEG SEGMENT PARA PUBLIC 'CODE'
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

;=============================================================
;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:
;=============================================================
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
       ;JNE MXOXIT   ;.
	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	     ;.

;=============================================================
;IMG CLRS
;=============================================================
	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,7	;
	MOV M2BDL,7	;
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
       REP MOVSW
       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
CSEG ENDS
     END START
;/////////////////////////////////////////////////////////////////////// ;THE FILE ENDS HERE.