pinballfantasies/START.ASM

460 lines
8.0 KiB
NASM
Raw Normal View History

2020-12-19 19:58:00 -08:00
demover=0
keyhandler=65h
jumps
include c:\source\macros1.asm
rate=20000
basememreq=585000 ;free mem required
nosoundmemreq=450000 ;if no music, or XMS detected
xmssize=220000 ;minimum XMS size
GURKA=42
MONOVALUE=72-GURKA
COLORVALUE=73-GURKA
.286P
stacken segment para stack 'stack'
dw 256 dup(0)
stacken ends
data segment para public 'data'
parm db 30 dup (0)
notfound db 'not loaded! Reinstall program.',13,10,'$'
IF DEMOVER
introname db 'Demo.Prg',0,'$'
ELSE
introname db 'Intro.prg',0,'$'
ENDIF
comment\
errlist dw offset error1
dw offset error2
dw offset error3
dw offset error4
error1 db 'Unexpected out of memory! Free up DOS memory!',13,10,'$'
error2 db 'Can not init sound device! Please run the SETSOUND program!',13,10,'$'
error3 db 'Can not find game file! Please reinstall game!',13,10,'$'
error4 db 'Error in game files! Please reinstall game!',13,10,'$'
error5 db '
unknowntxt db 'Unknown error! Please reinstall game and try again!',13,10,'$'
CRITICAL DB 'Critical Error! (Drive not ready?)',13,10,'$',0
\
COMMENT\
IF DEMOVER
ELSE
BADPARM DB 13,10,"Pinball Fantasies (c) 1993-94 21st Century Entertainment Ltd.",13,10,13,10
DB "Usage: PINBALL [options]",13,10,13,10
DB "Options",13,10,13,10
DB " /h - Hi resolution graphics mode.",13,10,13,10
DB " /m - Monochrome graphics mode, suitable for monochrome",13,10
DB " monitors used on a VGA video card."
DB 13,10,13,10,"$"
ENDIF
\
banor label byte
namelen=12
if demover
f1name db 'Pland.Prg',0,'$'
else
f1name db 'Table1.Prg',0,'$'
endif
f2name db 'Table2.Prg',0,'$'
f3name db 'Table3.Prg',0,'$'
f4name db 'Table4.Prg',0,'$'
data ends
savestack macro
move cs:s_s,ss
mov cs:s_p,sp
endm
restorestack macro
move ss,cs:s_s
mov sp,cs:s_p
endm
code segment para public 'code'
assume cs:code,ds:data
START PROC FAR
PUSHA
PUSH DS
COMMENT\
IF DEMOVER
ELSE
MOV CL,DS:[80H]
XOR CH,CH
DEC CX
JLE PARMS_READY ;NO PARMS AT ALL
MOV BP,CX
MOV SI,82H
READ_MORE:
CALL SKIP_BLANKS
JC PARMS_READY
CMP BYTE PTR DS:[SI],'M'
JE ITS_MONO
CMP BYTE PTR DS:[SI],'m'
JE ITS_MONO
CMP BYTE PTR DS:[SI],'H'
JE ITS_HIRES
CMP BYTE PTR DS:[SI],'h'
JE ITS_HIRES
JMP INVALID_PARMS
ITS_MONO:
INC SI
MOV CS:MONOMODE,MONOVALUE
JMP READ_MORE
ITS_HIRES:
INC SI
MOV CS:HI_RES,TRUE
JMP READ_MORE
SKIP_BLANKS: ;OUTPUT: SI POINTS TO THE NEXT NON-BLANK CHAR
; -C- IF LAST CHAR IS READ
MOV AX,SI
SUB AX,82H
CMP AX,BP
JE TESTAT_DEN_SISTA
MOV CX,30
TRY_NEXT:
CMP BYTE PTR DS:[SI],' '
JE BLANK
CMP BYTE PTR DS:[SI],'/'
JE BLANK
CMP BYTE PTR DS:[SI],'-'
JE BLANK
CMP BYTE PTR DS:[SI],0
JE BLANK
CLC
RETN
BLANK: MOV AX,SI
SUB AX,82H
INC AX
CMP AX,BP
JE TESTAT_DEN_SISTA
INC SI
LOOP TRY_NEXT
TESTAT_DEN_SISTA:
STC
RETN
INVALID_PARMS:
POP DS
POPA
MOVE DS,DATA
MOV AX,3
INT 10H
MOV DX,OFFSET BADPARM
MOV AX,0900H
INT 21H
JMP QUITTA
ENDIF
PARMS_READY:
\
POP DS
POPA
move es,ds
move ds,DATA
mov ax,4a00h
mov bx,es
neg bx
add bx,endofprog
add bx,1024/16
int 21h ;shrink block
jmp enough_mem
bannumber db 1
INT24H_SEG DW ?
INT24H_ADR DW ?
int9_ip dw ?
int9_cs dw ?
int16h_ip dw ?
int16h_cs dw ?
in_hyperspace db false
s_p dw ?
s_s dw ?
scan db ?
enough_mem:
;install keyints . . .
move es,0
PUSHF
CLI
move int9_ip,es:[9*4]
move int9_cs,es:[9*4+2]
mov es:[9*4],offset keyint
move es:[9*4+2],cs
move int16h_ip,es:[keyhandler*4]
move int16h_cs,es:[keyhandler*4+2]
mov es:[keyhandler*4],offset int16h
move es:[keyhandler*4+2],cs
MOVE INT24H_ADR,ES:[24H*4]
MOVE INT24H_SEG,ES:[24H*4+2]
NEEEEJ EQU OFFSET BAD24H
MOVE ES:[24H*4],NEEEEJ
MOVE ES:[24H*4+2],CS
POPF
move es,DATA
ONCE_AGAIN:
;Intro and chooser . . .
move ds,DATA
move es,DATA
pusha
savestack
mov ax,4b00h
mov bx,offset parm
mov dx,offset introname
int 21h ;load and execute program
restorestack
popa
move ds,DATA
mov dx,offset introname
jc file_not_found
;Check if any errors was detected in prog.(eg. Mod not found, out of mem)
mov ax,4d00h
int 21h
cmp ax,0
jne PrintGameErrors
mov cs:first_time,false
;******************* cp cp cp! ta bort i riktiga!
; mov ax,3
; int 10h
;*******************
;Ladda bana . . .
cmp bannumber,0
je quit ;esc pressed!!!!
move ds,DATA
pusha
savestack
mov al,cs:bannumber
mov ah,0
mov cx,namelen
mul cx
mov dx,ax
add dx,offset banor-namelen
mov bx,offset parm
mov ax,4b00h
int 21h ;load and execute program
restorestack
popa
move ds,DATA
pushf
mov al,cs:bannumber
mov ah,0
mov cx,namelen
mul cx
mov dx,ax
add dx,offset banor-namelen
popf
jc file_not_found
;********** ska de vara h<>r???
;Check if any errors was detected in prog.(eg. Mod not found, out of mem)
mov ax,4d00h
int 21h
cmp ax,0
jne PrintGameErrors
;****************
jmp once_again
;******************************************************************************
;* Print Error Messages *
;******************************************************************************
PrintGameErrors:
jmp Equit
comment\
; al=1 Out of mem
; al=2 Can't init sound
; al=3 file not found
; al=4 Error in file
;
move ds,data
cmp al,4
ja unknownerror
mov bx,offset errlist
nil ah
shl ax,1
add bx,ax
mov dx,[bx]
MOV AX,900H
; INT 21H
; mov ax,900h
; int 21h
jmp quit
unknownerror:
mov dx,offset unknowntxt
MOV AX,900H
INT 21H
; mov ax,900h
; int 21h
jmp quit
;drv_not_found:
pusha
mov dx,offset error2
mov ax,900h
int 21h
mov cx,13
mov al,0
; mov di,offset drv
move es,data
rep scasb
inc di
mov al,'$'
stosb
popa
; mov dx,offset drv
jmp yo
\
file_not_found:
pusha
mov ax,3
int 10h
popa
yo:
MOV AX,900H
INT 21H
mov dx,offset notfound
mov ax,900h
int 21h
jmp quit
Equit:
quit:
PUSHF
CLI
move es,0
move es:[9*4],int9_ip
move es:[9*4+2],int9_cs
move es:[keyhandler*4],int16h_ip
move es:[keyhandler*4+2],int16h_cs
MOVE ES:[24H*4],INT24H_ADR
MOVE ES:[24H*4+2],INT24H_SEG
POPF
quitta:
mov ax,4c00h
int 21h
TOGGLAR_STRUCEN STRUC
S_BALLS DB ?
S_ANGLE DB ?
S_SCROLLING DB ?
S_IM DB ?
S_RESOLUTION DB ?
S_MODE DB ?
ENDS
RESIDENTA_TOGGLAREN DB SIZE TOGGLAR_STRUCEN DUP (0)
first_time db true
int16h:
push ax
cmp ax,0
jne no_first_time_ask
pop ax
mov ah,cs:first_time
mov bl,cs:bannumber
iret
no_first_time_ask:
cmp ax,0ffffh
jne no_savenumber
mov cs:bannumber,bl ;Vilken bana (1-4)!! 0=Esc pressed!!
no_savenumber:
CMP AX,0100H ;LOKALA TOGGLAREN => RESIDENTA TOGGLAREN
JNE INTE_JAG
;INPUT: ES:BX=OFFSET TO LOKALA TOGGLAREN
PUSH ES DS
MOVE DS,ES
MOVE ES,CS
MOV SI,BX
LEA DI,RESIDENTA_TOGGLAREN
MOV CX,SIZE TOGGLAR_STRUCEN
REP MOVSB
POP DS ES
JMP INTE_JAG_HELLER
INTE_JAG:
CMP AX,0200H ;RESIDENTA TOGGLAREN => LOKALA TOGGLAREN
JNE INTE_JAG_HELLER_OXO_KANSKE
;INPUT: ES:BX=OFFSET TO LOKALA TOGGLAREN
PUSH DS
MOVE DS,CS
MOV DI,BX
LEA SI,RESIDENTA_TOGGLAREN
MOV CX,SIZE TOGGLAR_STRUCEN
REP MOVSB
POP DS
JMP INTE_JAG_HELLER
INTE_JAG_HELLER_OXO_KANSKE:
CMP AX,12H ;text input
JNE INTE_JAG_heller
pop ax
mov ah,0
mov al,cs:scan
mov cs:scan,0
iret
inte_jag_heller:
pop ax
mov ah,0
mov al,cs:scan ;nja, n<>got minskad funktion . .
mov cs:scan,0
iret
KEYINT: ;int 9
PUSHA
PUSH DS
MOV AL,20H
OUT 20H,AL
MOVE DS,DATA
IN AL,60H
PUSH AX
IN AL,61H
OR AL,80H
OUT 61H,AL
AND AL,7FH
OUT 61H,AL
POP AX
test al,80h
jnz no_alfa_key
MOV CS:SCAN,AL ;REKORDKORV??
no_alfa_key:
POP DS
POPA
IRET
BAD24H_RETURN DB 3 ;3=SOMETHING IS WRONG!
;2=ABORT
;1=RETRY
;0=IGNORE
BAD24H:
MOV AL,CS:BAD24H_RETURN
DEC CS:BAD24H_RETURN
JNL JUST_IRET
MOV CS:BAD24H_RETURN,3
JUST_IRET:
IRET
START ENDP
CODE ENDS
endofprog segment
ends
end staRT