frenzy/super.asm

271 lines
4.2 KiB
NASM

B>type super.asm
.title "SUPER-ROBOT"
.sbttl "FRENZY"
.ident SUPER
;-------------+
; super robot |
;-------------+
.insert EQUS
.intern SETVXY
.extern NEXT.J,J.WAIT,D.TAB,V.ZERO,SR.0
Down= 3
Up= 2
Right= 1
Left= 0
;-------------
; Initialize
;-------------
SUPER::
xra a
sta CACKLE+1 ;otto death flag
lhld ManX ;set position
mov a,l
cpi 32
jrnc ..r
mvi L,2
jmpr ..y
..r: cpi 240
jrc ..y
mvi L,248
..y: mov a,h
cpi 180
jrc ..t
mvi H,160
..T: shld SSpos
lda Rsaved ; calc time til start
mov b,a
lda Rwait
rrc
rrc
ani 7
add B
sta STIME
mvi e,0 ;speed=1
; wait for stime seconds
..LOOP: WAIT 40
lxi h,STIME
dcr m
jrnz ..LOOP
lhld SSpos ;super start pos
mvi a,30
sta KWait
jmpr INIT
;~~~~~~~~~~~~~~~~~~~~~~~
; Moms own SUPER Ottos
;_______________________
;de=yx to start
Klutz:: lxi d,(84<8)!128
MSUPER::
xchg ;get hl=YX
lxi d,1 ;sportingly fast ottos
; initialize, e=speed
INIT: push d
PUSH H
call V.ZERO ; zap vector
POP H
pop d
jc JobDel# ;if none available forget it
mov a,e ;if faster speed no talk
ora a
jrnz REDO ;go fast
PUSH D
PUSH H
call S.TALK#
POP B
POP D
WAIT 60
mov h,b
mov l,c ;start position
REDO: mov P.X(x),L ;set pos
mov P.Y(x),H
xra a
mov V.X(x),a
mov V.Y(x),a
lxi h,SR.0
mov D.P.L(x),L
mov D.P.H(x),H
mvi TIME(x),1
mvi TPRIME(x),2 ;slower than normal
mvi d,0 ;number of hits taken
mvi V.STAT(x),(1<InUse)!(1<Move)!(1<Write)
xra a
call SETDIR
WAIT 60
res HIT,V.STAT(x)
;------------------------+
; super robot's job loop |
;------------------------+
SEEK: lxi y,Vectors ; mans vector
push D
;calc delta x => e
mov a,P.X(y) ;man x
sub P.X(x) ;robot x
;calc x index
mvi B,0 ;0 velocity in x
jrz X.D
mvi B,1<RIGHT ;+ vel in x
jrnc X.D
mvi B,1<LEFT ;- vel in x
neg
;calc delta y => d
X.D: mov d,a ;save |delta X|
mov a,P.Y(y) ;mans Y
add e ;drift down with speed
mov e,d ;save delta in right place
sui 1
cpi 175+1
jc ..ok ;adjust mans x
mvi a,175
..ok: sub P.Y(x)
;calc y index
mvi C,0 ;0 velocity in y
jrz Y.D
mvi C,1<DOWN ;+ vel in y
jrnc Y.D
mvi C,1<UP ;- vel in y
neg
Y.D: mov d,a ;save abs(delta Y)
mov a,b ;add offsets
add c ;to from direction
mov b,d ;bc=de
mov c,e
pop D ;speed
call SETDIR
bit HIT,V.STAT(x) ;check for hits
jrz ..wait
res HIT,V.STAT(x) ;reset hit bit
call SBLAM# ;hit sound
inr d ;number of hits taken
push d
; set new pattern
lxi h,SR.1#
dcr d
jz ..stdp
lxi h,SR.2#
..stdp: mov D.P.L(x),L
mov D.P.H(x),H
mvi TIME(x),1
lxi b,102h ;50pts
call ADDS#
pop d
mov a,d ;check hits
cpi 3 ;if 3 then DIE sucker
jrz DIE
..wait: call NEXT.J
jmpr SEEK
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Otto Deflates
;_______________________________
DIE: xra a
mov V.X(x),a
mov V.Y(x),a
cma
sta CACKLE+1 ;otto death flag
call SD.TALK#
lxi h,SR.3#
mov D.P.L(x),L
mov D.P.H(x),H
mvi TPRIME(x),4 ;real slow
WAIT 60
mvi V.STAT(x),(1<InUse)!(1<Erase)
WAIT 10
; start a new otto
mov a,e
cpi 7
jrnc ..n
inr e ;up the speed
..n: lhld SSpos
jmp REDO
;-----------------------------
; change direction of robot
; a=durl, e=speed
;-----------------------------
SETDIR: ani 0FH ; SUPER ROBOTS VERSION
jnz ..nor
lxi b,0
jmp SETV
..nor: PUSH B ;save deltas
EXAF ;save durl
;get speed numbers
lxi h,SpeedTab
mvi B,0
mov c,e
dad b
dad b
mov a,m
mov TPRIME(x),a
inx h
mov a,m ;speed
; now set vel
POP B ;delta yx
cmp b ;is vy<|delta|
jrnc ..sy
mov b,a ;save smaller
..sy: cmp c ;is vx<delta
jrnc ..sx
mov c,a ;save smaller
..sx: EXAF ;get durl
bit up,a
jrz ..dx
EXAF
mov a,b
neg ;vel=-vel
mov b,a
EXAF
..dx: bit left,a
jrz ..sv
EXAF
mov a,c
neg ;vel=-vel
mov c,a
EXAF
..sv:
SETV: mov V.X(x),c
mov V.Y(x),b
ret
; normal robot version
SETVXY: mov c,a ;update tracker
mvi B,0
lxi h,D.TAB ;convert direction to offset
dad b
mov e,m ;load offset
mov d,b
lxi h,M.TAB ;index move table
dad d
mov a,m ;get vx
mov V.X(x),a
inx h
mov A,m ;get vy
mov V.Y(x),a
ret
;----------------------
; move table
; x,y
M.TAB: .byte 0,0
.byte 1,-1
.byte 1,0
.byte 1,1
.byte 0,1
.byte -1,1
.byte -1,0
.byte -1,-1
.byte 0,-1
.byte 0,0
.define ST[Tprime,Vel]=
[ .byte Tprime,Vel
]
SpeedTab:
ST 3,1
ST 1,1
ST 1,3
ST 1,4
ST 1,6
ST 1,8
ST 1,10
ST 1,12
.end