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.