278 lines
4.9 KiB
NASM
278 lines
4.9 KiB
NASM
B>type gameover.asm
|
|
|
|
.title "Game Over Show"
|
|
.sbttl "FRENZY"
|
|
.ident GOVER
|
|
;~~~~~~~~~~~~~~~~~~~~~~~
|
|
; game over
|
|
;_______________________
|
|
.insert equs
|
|
.intern GOVER,CLEAR,INSERT
|
|
.intern LINE,LTABLE
|
|
.extern SHOWN,SHOWO,SHOWA,SHOWC,GETC,CREDS,SHOWS
|
|
.extern C.GO,C.L1,C.L2,C.LI,PH1,NoVoice,Zap
|
|
|
|
; macros
|
|
.define WROTE[Magic,X,Y,String]=[
|
|
call SHOWA
|
|
.byte Magic,X,Y
|
|
.asciz String
|
|
]
|
|
; language tabled subroutine call
|
|
.define LANG[Name]=[
|
|
call LTABLE
|
|
.word E.'Name ;;English
|
|
.word G.'Name ;;German
|
|
.word F.'Name ;;French
|
|
.word S.'Name ;;Spanish
|
|
]
|
|
; equates
|
|
S.END == EndScreen
|
|
LINE1 == 190
|
|
;---------------------------------+
|
|
; clear screen and show copyright |
|
|
;---------------------------------+
|
|
GOVER: call CLEAR ; erase.screen
|
|
call C.GO ; setup color gameover
|
|
call CREDS ;show credits
|
|
call SHOWS ;show scores
|
|
;----------------------------+
|
|
; show high scores and names |
|
|
;----------------------------+
|
|
call SmallTitle# ;FRENZY
|
|
LANG High
|
|
lxi h,56*Hsize+Screen ; start position
|
|
call LINE
|
|
lxi h,HIGH1 ; first high score
|
|
mvi A,1
|
|
sta TEMP ; number 1 line
|
|
lxi d,63<8!64 ; YX position
|
|
..loop: push d
|
|
push h
|
|
mov a,m ;if score is zero dont show it
|
|
inx h
|
|
ora m
|
|
inx h
|
|
ora m
|
|
pop h
|
|
push h
|
|
jrnz ..skip
|
|
pop h
|
|
pop d
|
|
jmpr DRAW
|
|
..skip: lxi h,TEMP ; shown line number
|
|
mvi B,2 ; 2 digits long
|
|
call SHOWN
|
|
inx d ; spc over one byte
|
|
pop h
|
|
mvi B,6 ; shown high score,6digits
|
|
call SHOWO
|
|
inx d ;space over
|
|
xra a ;plop write
|
|
mov c,m
|
|
call SHOWC
|
|
inx d
|
|
inx h
|
|
mov c,m
|
|
call SHOWC
|
|
inx d
|
|
inx h
|
|
mov c,m
|
|
call SHOWC
|
|
inx h ; -> next high score
|
|
pop d
|
|
mov a,d
|
|
ADI 12
|
|
mov d,a
|
|
lda TEMP
|
|
ADI 1
|
|
daa
|
|
sta TEMP
|
|
cpi 11H
|
|
jnz ..loop
|
|
;------------+
|
|
; draw lines
|
|
;------------+
|
|
DRAW: lxi h,184*Hsize+Screen
|
|
call LINE
|
|
lxi h,204*Hsize+Screen
|
|
; call line
|
|
; 2
|
|
;------------------+
|
|
; draw line across |
|
|
;------------------+
|
|
LINE: mvi A,0FFH
|
|
mvi B,64
|
|
L.LOP: mov m,a
|
|
inx h
|
|
djnz L.LOP
|
|
ret
|
|
;--------------+
|
|
; erase screen |
|
|
;--------------+
|
|
CLEAR: lxi h,ColorScreen
|
|
lxi b,700H
|
|
call Zap
|
|
di
|
|
sspd Temp
|
|
lxi sp,S.END+1
|
|
mvi B,Vsize
|
|
lxi d,0
|
|
E.L: push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
push d
|
|
djnz E.L
|
|
lspd Temp
|
|
ei
|
|
; set flip state by player number
|
|
SFLIP: in I.O3 ;is it a cocktail
|
|
bit 7,A
|
|
jrnz Normal ;if not cocktail
|
|
lda PLAYER ;is cocktail version
|
|
cpi 2 ;flip screen? for player2
|
|
jrnz Normal
|
|
mvi A,8 ;the flip bit
|
|
sta FLIP
|
|
ret
|
|
Normal: xra a
|
|
sta FLIP
|
|
ret
|
|
; Copyright
|
|
CopyR:: call SHOWA ; @ 1980 stern electronics
|
|
.byte 90H
|
|
.byte 12,LINE1,1FH
|
|
.asciz "1982 STERN Electronics, Inc."
|
|
ret
|
|
;---------------------------+
|
|
; insert coin / press start |
|
|
;---------------------------+
|
|
INSERT: CALL LERASE ;erase line for text
|
|
call GETC ;get credits
|
|
jrz INSSS
|
|
dcr a
|
|
jrz PRESS1
|
|
call C.L2
|
|
LANG Pus2
|
|
ret
|
|
;
|
|
PRESS1: CALL C.L1
|
|
LANG Push1
|
|
ret
|
|
;
|
|
INSSS: call C.LI
|
|
LANG In
|
|
; coins detected in pocket
|
|
lxi h,PH1 ;phrase
|
|
shld V.PC ;into voice pc
|
|
ret
|
|
;~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
; xtra man level
|
|
;__________________________
|
|
XMLEV:: call LERASE
|
|
in Dip2
|
|
ani 15 ;# of k for extra man
|
|
jrz ..cheap
|
|
mov b,a
|
|
ani 8
|
|
mov c,a
|
|
mov a,b
|
|
ani 7
|
|
add c
|
|
daa ;now its in BCD
|
|
sta TEMP
|
|
lxi d,LINE1<8!88 ; y:x position
|
|
lxi h,TEMP ; number
|
|
mvi B,2 ; 2 digits long
|
|
call SHOWN ; show it
|
|
WROTE 90h,104,LINE1,"000 = ~"
|
|
ret
|
|
..cheap:
|
|
WROTE 90H,72,LINE1,"No Extra Lives"
|
|
ret
|
|
;~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
; erase line for messages
|
|
;__________________________
|
|
LERASE: lxi h,LINE1*Hsize+Screen
|
|
lxi b,2C0H ;2 lines less than 16
|
|
xra a
|
|
LELE: mov m,a
|
|
inx h
|
|
dcr c
|
|
jnz LELE
|
|
djnz LELE
|
|
ret
|
|
;---------------------------------+
|
|
; Language tabled subroutine call |
|
|
;---------------------------------+
|
|
LTABLE: pop h ;get table address
|
|
mov d,h
|
|
mov e,l ;save table address
|
|
lxi b,8 ;offset to end of table
|
|
dad b ;calc return address
|
|
push h ;put return address on stack
|
|
xchg ;get table address
|
|
in diP2 ;get language bits
|
|
ani 0C0H
|
|
rlc ;rotate bits into low bits
|
|
rlc
|
|
rlc ;A=language#*2
|
|
mov c,a ;BC=language#*2
|
|
dad b ;address into table
|
|
mov a,m ;get low address
|
|
inx h
|
|
mov h,m ;get high address
|
|
mov l,a ;HL=subroutine address
|
|
pchl
|
|
;------+
|
|
; Text |
|
|
;------+
|
|
E.High: WROTE 90H,80,42,"High Scores"
|
|
ret
|
|
F.High: WROTE 90H,68,42,"Meilleur Score"
|
|
ret
|
|
G.High: WROTE 90H,60,42,"Hoechster Gebnis"
|
|
ret
|
|
S.High: WROTE 90H,96,42,"Records"
|
|
ret
|
|
;-------------------------
|
|
E.Push1: WROTE 90H,20,LINE1,"Push 1 Player Start Button"
|
|
ret
|
|
F.Push1: WROTE 90H,36,LINE1,"Pousser bouton start 1"
|
|
ret
|
|
;-------------------------
|
|
E.Pus2: WROTE 90H,4,LINE1,"Push 1 or 2 Player Start Button"
|
|
ret
|
|
F.Pus2: WROTE 90H,16,LINE1,"Pousser bouton start 1 ou 2"
|
|
ret
|
|
G.Push1:
|
|
G.Pus2: WROTE 90H,32,LINE1,"Startknoepfe druecken"
|
|
ret
|
|
S.Push1:
|
|
S.Pus2: WROTE 90H,68,LINE1,"Pulsar Start"
|
|
ret
|
|
;-----------------
|
|
E.In: WROTE 90H,88,LINE1,"Insert Coin"
|
|
ret
|
|
F.In: WROTE 90H,48,LINE1,"Introduire la monnaie"
|
|
ret
|
|
G.In: WROTE 90H,72,LINE1,"Munze einwerfen"
|
|
ret
|
|
S.In: WROTE 90H,72,LINE1,"Ponga la moneda"
|
|
ret
|
|
|
|
.end
|
|
|