/*
Simple Tetris - game
written in 1997 by Marko Kleine Berkenbusch
*/
?resize TRUE
?use80386
?alignword TRUE
?jumptomain NEAR
?include "VIDEO.H--"
?include "RANDOM.H--"
?include "KEYCODES.H--"
?include "SYSTEM.H--"
?include "VGA.H--"
?include "PORTS.H--"
?define PIT_CHANNEL_0 0x40
?define PIT_CHANNEL_2 0x42
?define PIT_CONTROL 0x43
?define PIT_FREQ 0x1234DD
?define TIMER_INT 0x08
?define PF_Width 12
?define PF_Height 22
?define BS_Width 11
?define BS_Height 9
?define Initialspeed 250
byte Tiles[7*16] = { 0, 0, 0, 0,
1, 1, 1, 1,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 1, 1, 0,
0, 1, 0, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 1, 1, 0,
0, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 0,
0, 1, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 1,
0, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 1,
0, 0, 0, 1,
0, 0, 0, 0 } ;
byte Block[99] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 9, 8, 7, 6, 5, 4, 3, 2, 1, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 9, 8, 7, 6, 5, 4, 3, 2, 1, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } ;
byte pal = FROM "TETRIS.PAL" ;
byte logo = FROM "TETRLOGO.DAT" ;
byte PField[PF_Width*PF_Height], TempPF[PF_Width*PF_Height] ;
byte ActTile[16+1], NewTile[16+1] ;
int TPos_x, TPos_y ;
byte up, down, left, right, space, enter, quit ;
word oldkeyboardhandle[2], oldtimerhandle[2] = {} ;
word Lines ;
word VScreen ;
long Time, speed, timercount, clockticks ;
interrupt timerhandle()
{
$ PUSH DS
$ PUSH AX
$ PUSH BX
DS = CS ;
Time++ ;
clockticks += timercount ;
IF (long clockticks >= 0x10000) {
clockticks -= 0x10000 ;
$ PUSHF
$ CS:
$ CALL FAR oldtimerhandle
}
EOI() ;
$ POP BX
$ POP AX
$ POP DS
}
interrupt keyboardhandle()
{
$ PUSH DS
$ PUSH AX
$ PUSH BX
DS = CS ;
$ IN AL, 0x60
BL = TRUE ;
IF ( AL >= 128 )
{AL -= 128;
BL = FALSE;
}
IF ( AL == s_left )
left = BL;
ELSE IF ( AL == s_right )
right = BL;
ELSE IF ( AL == s_up )
up = BL;
ELSE IF ( AL == s_down )
down = BL;
ELSE IF ( AL == s_space )
space = BL;
ELSE IF ( AL == s_return )
enter = BL ;
ELSE IF ( AL == s_esc )
quit = TRUE ;
EATKEY();
EOI();
$ POP BX
$ POP AX
$ POP DS
}
void SetTimer (word HandlerSeg, HandlerOfs, Freq)
dword counter ;
{
IF (word Freq > 0) counter = PIT_FREQ / Freq ;
ELSE counter = 0 ;
timercount = counter ;
OUTPORTB(0x34, , , PIT_CONTROL) ;
OUTPORTB(counter, , , PIT_CHANNEL_0) ;
counter = counter >> 8 ;
OUTPORTB(counter, , , PIT_CHANNEL_0) ;
OUTPORTB(0x90, , , PIT_CONTROL) ;
GETINTVECT(#oldtimerhandle, TIMER_INT) ;
clockticks = 0 ;
SETINTVECT(, TIMER_INT, HandlerSeg, HandlerOfs) ;
}
void InitPField (word pfaddr)
{
AX = PF_Width*PF_Height ; DI = AX ; BX = pfaddr ;
loop (DI) DSBYTE[DI+BX-0x01] = 0 ;
SI = PF_Width ;
loop (SI) {
AX = SI + pfaddr ; BX = AX ;
DSBYTE[BX-0x01] = -1 ;
DSBYTE[PF_Width*PF_Height-PF_Width+BX-0x01] = -1 ;
}
SI = PF_Height ;
loop (SI) {
AX = SI-1*PF_Width+pfaddr ; DI = AX ;
DSBYTE[DI] = -1 ;
DSBYTE[DI+PF_Width-0x01] = -1 ;
}
}
void OutTextXY (word Str, xb, yb; byte c)
byte h ;
word x, y ;
{
DI = Str ; FS = 0xF000 ; SI = 0xFA6E ;
do {
y = 8 ;
loop (y) {
AL = DSBYTE[DI] ; AH = 0 ; AX = AX << 3 + y - 1 ; BX = AX ;
h = FSBYTE[SI+BX] ;
x = 8 ;
$ PUSH DI
loop (x) {
AL = h & 1 ;
IF (AL <> 0) putpixel19(xb+x-1, yb+y, byte c) ;
h >>= 1 ;
}
$ POP DI
}
xb += 8 ; DI++ ;
} while (DSBYTE[DI] <> 0) ;
}
void InitScreen ()
int i, x, y ;
{
SETVIDEOMODE(0x13) ;
SETVGADAC(0, , 768, , , #pal) ;
FILLSCREEN19(0x01) ;
i = 120 ;
loop (i) {
putpixel19(100+i, 7, 0x02) ; putpixel19(100+i, 8, 0x02) ;
putpixel19(100+i, 9, 0x02) ; putpixel19(100+i, 10, 0x02) ;
putpixel19(100+i, 191, 0x02) ; putpixel19(100+i, 192, 0x02) ;
putpixel19(100+i, 193, 0x02) ; putpixel19(100+i, 194, 0x02) ;
}
i = 188 ;
loop (i) {
putpixel19(101, i+6, 0x02) ; putpixel19(102, i+6, 0x02) ;
putpixel19(103, i+6, 0x02) ; putpixel19(104, i+6, 0x02) ; putpixel19(105, i+6, 0x02) ;
putpixel19(216, i+6, 0x02) ; putpixel19(217, i+6, 0x02) ;
putpixel19(218, i+6, 0x02) ; putpixel19(219, i+6, 0x02) ; putpixel19(220, i+6, 0x02) ;
}
OutTextXY("Next:", 245, 8, 4) ;
OutTextXY("Lines:", 241, 110, 5) ;
SI = 0 ; y = 47 ;
loop (y) {
x = 88 ;
loop (x) {
putpixel19(94-x, 70-y, byte logo[SI]) ;
SI++ ;
}
}
OutTextXY("von", 38, 96, 6) ;
OutTextXY("Marko Kleine", 3, 122, 3) ;
OutTextXY("Berkenbusch", 7, 134, 3) ;
}
Simple Tetris - game
written in 1997 by Marko Kleine Berkenbusch
*/
?resize TRUE
?use80386
?alignword TRUE
?jumptomain NEAR
?include "VIDEO.H--"
?include "RANDOM.H--"
?include "KEYCODES.H--"
?include "SYSTEM.H--"
?include "VGA.H--"
?include "PORTS.H--"
?define PIT_CHANNEL_0 0x40
?define PIT_CHANNEL_2 0x42
?define PIT_CONTROL 0x43
?define PIT_FREQ 0x1234DD
?define TIMER_INT 0x08
?define PF_Width 12
?define PF_Height 22
?define BS_Width 11
?define BS_Height 9
?define Initialspeed 250
byte Tiles[7*16] = { 0, 0, 0, 0,
1, 1, 1, 1,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 1, 1, 0,
0, 1, 0, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 1, 1, 0,
0, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 0,
0, 1, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 1,
0, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 1, 1,
0, 0, 0, 1,
0, 0, 0, 0 } ;
byte Block[99] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 9, 8, 7, 6, 5, 4, 3, 2, 1, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 8, 7, 6, 5, 4, 3, 2, 1, 0, 4,
4, 9, 8, 7, 6, 5, 4, 3, 2, 1, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } ;
byte pal = FROM "TETRIS.PAL" ;
byte logo = FROM "TETRLOGO.DAT" ;
byte PField[PF_Width*PF_Height], TempPF[PF_Width*PF_Height] ;
byte ActTile[16+1], NewTile[16+1] ;
int TPos_x, TPos_y ;
byte up, down, left, right, space, enter, quit ;
word oldkeyboardhandle[2], oldtimerhandle[2] = {} ;
word Lines ;
word VScreen ;
long Time, speed, timercount, clockticks ;
interrupt timerhandle()
{
$ PUSH DS
$ PUSH AX
$ PUSH BX
DS = CS ;
Time++ ;
clockticks += timercount ;
IF (long clockticks >= 0x10000) {
clockticks -= 0x10000 ;
$ PUSHF
$ CS:
$ CALL FAR oldtimerhandle
}
EOI() ;
$ POP BX
$ POP AX
$ POP DS
}
interrupt keyboardhandle()
{
$ PUSH DS
$ PUSH AX
$ PUSH BX
DS = CS ;
$ IN AL, 0x60
BL = TRUE ;
IF ( AL >= 128 )
{AL -= 128;
BL = FALSE;
}
IF ( AL == s_left )
left = BL;
ELSE IF ( AL == s_right )
right = BL;
ELSE IF ( AL == s_up )
up = BL;
ELSE IF ( AL == s_down )
down = BL;
ELSE IF ( AL == s_space )
space = BL;
ELSE IF ( AL == s_return )
enter = BL ;
ELSE IF ( AL == s_esc )
quit = TRUE ;
EATKEY();
EOI();
$ POP BX
$ POP AX
$ POP DS
}
void SetTimer (word HandlerSeg, HandlerOfs, Freq)
dword counter ;
{
IF (word Freq > 0) counter = PIT_FREQ / Freq ;
ELSE counter = 0 ;
timercount = counter ;
OUTPORTB(0x34, , , PIT_CONTROL) ;
OUTPORTB(counter, , , PIT_CHANNEL_0) ;
counter = counter >> 8 ;
OUTPORTB(counter, , , PIT_CHANNEL_0) ;
OUTPORTB(0x90, , , PIT_CONTROL) ;
GETINTVECT(#oldtimerhandle, TIMER_INT) ;
clockticks = 0 ;
SETINTVECT(, TIMER_INT, HandlerSeg, HandlerOfs) ;
}
void InitPField (word pfaddr)
{
AX = PF_Width*PF_Height ; DI = AX ; BX = pfaddr ;
loop (DI) DSBYTE[DI+BX-0x01] = 0 ;
SI = PF_Width ;
loop (SI) {
AX = SI + pfaddr ; BX = AX ;
DSBYTE[BX-0x01] = -1 ;
DSBYTE[PF_Width*PF_Height-PF_Width+BX-0x01] = -1 ;
}
SI = PF_Height ;
loop (SI) {
AX = SI-1*PF_Width+pfaddr ; DI = AX ;
DSBYTE[DI] = -1 ;
DSBYTE[DI+PF_Width-0x01] = -1 ;
}
}
void OutTextXY (word Str, xb, yb; byte c)
byte h ;
word x, y ;
{
DI = Str ; FS = 0xF000 ; SI = 0xFA6E ;
do {
y = 8 ;
loop (y) {
AL = DSBYTE[DI] ; AH = 0 ; AX = AX << 3 + y - 1 ; BX = AX ;
h = FSBYTE[SI+BX] ;
x = 8 ;
$ PUSH DI
loop (x) {
AL = h & 1 ;
IF (AL <> 0) putpixel19(xb+x-1, yb+y, byte c) ;
h >>= 1 ;
}
$ POP DI
}
xb += 8 ; DI++ ;
} while (DSBYTE[DI] <> 0) ;
}
void InitScreen ()
int i, x, y ;
{
SETVIDEOMODE(0x13) ;
SETVGADAC(0, , 768, , , #pal) ;
FILLSCREEN19(0x01) ;
i = 120 ;
loop (i) {
putpixel19(100+i, 7, 0x02) ; putpixel19(100+i, 8, 0x02) ;
putpixel19(100+i, 9, 0x02) ; putpixel19(100+i, 10, 0x02) ;
putpixel19(100+i, 191, 0x02) ; putpixel19(100+i, 192, 0x02) ;
putpixel19(100+i, 193, 0x02) ; putpixel19(100+i, 194, 0x02) ;
}
i = 188 ;
loop (i) {
putpixel19(101, i+6, 0x02) ; putpixel19(102, i+6, 0x02) ;
putpixel19(103, i+6, 0x02) ; putpixel19(104, i+6, 0x02) ; putpixel19(105, i+6, 0x02) ;
putpixel19(216, i+6, 0x02) ; putpixel19(217, i+6, 0x02) ;
putpixel19(218, i+6, 0x02) ; putpixel19(219, i+6, 0x02) ; putpixel19(220, i+6, 0x02) ;
}
OutTextXY("Next:", 245, 8, 4) ;
OutTextXY("Lines:", 241, 110, 5) ;
SI = 0 ; y = 47 ;
loop (y) {
x = 88 ;
loop (x) {
putpixel19(94-x, 70-y, byte logo[SI]) ;
SI++ ;
}
}
OutTextXY("von", 38, 96, 6) ;
OutTextXY("Marko Kleine", 3, 122, 3) ;
OutTextXY("Berkenbusch", 7, 134, 3) ;
}