once upon a time
05. November 2011
| aktualisiert am 05. November 2011
This is a small recording of an old project, developed by Pilz and me some weeks before Xmas '95. Well, thats a long time ago, almost 16 years. Unfortunately we didn't come together in the beginning of the year '96. Therefore this project wasn't finished ever. But neither of us can remember the reason thereof.
However, I've found the source code in my collection of old projects (developed long time ago). Actually the "game" is still runing under windows in the XP-compatible mode. One can select a tank (of one of the four opposing teams) and attack and destroy a vehicle of another team. It was possible to build a structure (already existing one??) and the wheelers drove arround controlled by a more or less intelligent AI. The cracks you can hear are the cannon shots of the fighting tanks :-)
It was a great feeling to see the old assembler code again. Here a little excerpt of it:
; Modul zum Einbinden in G00.CPP
;*SUCHSTRINGS************************************************************
; !!! = Achtung mögliche Fehlerquelle
; ??? = Programmteil noch nicht fertig
; %%% = Entwicklungshilfe , kann später entfernt werden
; !noK = Konstanten wurden nicht verwendet
;*KONSTANTEN**EXTERN DEKLARATIONEN***************************************
INCLUDE G10EXCO.INC
;************************************************************************
.model large,c
.386
RestMou PROTO C
SavMou PROTO C
.data
MouSeg WORD 0abefh
WORD 0abf4h
OldOfs WORD ?
WORD ?
BldSeg WORD 0a000h
FldSeg WORD 0a3e8h
WriteMode0 WORD ?
WriteMode1 WORD ?
S spr_struct SPRITE_NUM DUP ({?})
public S
Cat cat_struct CAT_NUM DUP ({0})
public Cat
S2_0_A spr2_struct1 {?}
S2_0_B spr2_struct2 SPR2_NUM0 DUP ({?})
S2_1_A spr2_struct1 {?}
S2_1_B spr2_struct2 SPR2_NUM1 DUP ({?})
S2_2_A spr2_struct1 {?}
S2_2_B spr2_struct2 SPR2_NUM2 DUP ({?})
S2_3_A spr2_struct1 {?}
S2_3_B spr2_struct2 SPR2_NUM3 DUP ({?})
public S2_0_A
public S2_0_B
public S2_1_A
public S2_1_B
public S2_2_A
public S2_2_B
public S2_3_A
public S2_3_B
Spr2Poi NPVOID S2_0_A
NPVOID S2_1_A
NPVOID S2_2_A
NPVOID S2_3_A
.code
;***************************************************************************
SegInit proc
mov ax,ds ; FS = DS ( Datensegment alternativ über
mov fs,ax ; FS erreichbar )
ret
SegInit endp
;***************************************************************************
InitLin proc uses di
mov ax,0013h
int 10h
mov dx,3ceh ; auftrennen der Speicheradressen
mov al,5 ; im Graphics_Mode_reg. des Graphic_Ctrl.
out dx,al ; über 'and' abschalten (Bit 4 -> 0)
inc dx ; auf des Datenreg.des Graph._Ctrl (3cfh)
; erhöhen
in al,dx ; Vorhandene Daten von 3cfh lesen
and al,11101111b ; hier Bit 4 des Grafik_Mode_Reg.löschen
out dx,al
;** Variablen für Write Modi laden
mov ah,al ; AH = Daten
mov al,5 ; AL = Registernummer
mov WriteMode0,ax ; für Mode 0 laden
and ah,not 3 ; Bits für Write Mode löschen
or ah,1 ; Bit für Mode 1 setzen
mov WriteMode1,ax ; für Mode 1 laden
;**
dec dx ; dx wieder auf 3ceh (Portadr.des Graf.Ctrl)
mov al,6 ; das Ganze nochmal im Micellaneous_REg.
out dx,al ; über Bit #1
inc dx
in al,dx
and al,11111101b
out dx,al
mov dx,3c4h ; das Memory-Mode-REg.im Sequencer-Ctrl.
mov al,4 ; dahingehend modifizieren, dass keine Auf-
out dx,al ; der Adressen in den Bitplanes erfolgt
inc dx ; und die aktuelle Bitplane festlegen
in al,dx ; über das Bit-Mask-Reg.
and al,11110111b
or al,4
out dx,al
mov ax,0a000h ; alle vier Bitplanes komplett mit
mov es,ax ; mit dem Farbcode 0h füllen und
xor di,di ; damit den Bildschirm löschen
mov ax,di
mov cx,8000h
rep stosw
mov dx,3d4h ; Doppelwort-Modus über das Bit 6
mov al,14h ; im Underline-Register des CRT-Ctrl.deakt.
out dx,al
inc dx
in al,dx
and al,10111111b
out dx,al
dec dx
mov al,17h ; über Bit 6 im Mode-Control-Reg. des
out dx,al ; CRT-Ctrl. jetzt vom Word- in den Byte-
inc dx ; Modus wechseln
in al,dx
or al,01000000b
out dx,al
mov ah,SCREENX/8 ; Anzahl der Offsets pro Zeile
mov al,13h ; Nummer des Offsetregisters
dec dx ; Adresse des Video-Controllers
out dx,ax
mov dx,3ceh ; Write Mode 0 ist Standard
mov ax,WriteMode0
out dx,ax
ret
InitLin endp
;***************************************************************************
DacSet proc uses es \
arg1 : word ; Offset
mov ax,1012h ;** Gruppe DAC_register setzen
mov bx,ds ; ES = Segmentadresse
mov es,bx
xor bx,bx ; Erstes DAC_Register
mov cx,100h ; Anzahl der DAC_Register
mov dx,arg1 ; Offset DAC-Register
int 10h
ret
DacSet endp
;** DACs (16-255) für BGR einblenden ***************************************
DacOn proc uses es di si \
arg1 : word , arg2 : word
local buf[768] : byte , buf1[768] : byte
; arg1 = Dateihandle
; arg2 = Zeit
push ds ; DS = SS
mov ax,ss
mov ds,ax
mov ah,3fh ; Funktion Datei lesen
lea dx,buf ; DX = Offset buf
mov cx,768 ; CX = zu lesende Bytes
int 21h ; Datei lesen
mov si,64 ; große Schreife: 64* DACs ändern
dac0:
dec si
mov di,768 ; kleine Schleife: DAC 0-255 ändern (3*268)
dac1:
dec di
mov al,buf[di] ; AL = Originalwert
and al,00111111b ; unzulässige Bits ausblenden
; shr al,2
xor ah,ah ; AL -= gr. Schleifenz. (63 -> 0)
sub ax,si ;
test ax,8000h ; IF (AX==negativ) AL = 0
je @F ;
mov al,0 ;
@@: ;
mov buf1[di],al ; AL in Puffer
or di,di
jne dac1 ; Ende kleine Schleife
mov cx,arg2 ; Warteschleife
w: RETRACE ; auf vertikalen Rücklauf warten
loop w
mov ax,1012h ;* Gruppe DAC_register setzen
mov bx,ds ; ES = Segmentadresse
mov es,bx
lea dx,buf1 ; Offset DAC-Register
mov bx,0 ; Erstes DAC_Register
mov cx,256 ; Anzahl der DAC_Register
int 10h
or si,si
jne dac0 ; Ende große Schleife
pop ds
ret
DacOn endp
...
And last but not least some screenshots taken of some of our lovingly created sprites and drafts (created using ZSoft's Paintbrush).




Hope you can remember that very cool time, Pilz my old lad.
Immer noch kein Kommentar. Jetzt wird's aber mal Zeit!
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt.
Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code
muss wirklich ZWISCHEN den Tags stehen. Beispiel:
Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>
int main( void ){
return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau