pinballfantasies/START.ASM

460 lines
8.0 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

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