vapsppr@prism.gatech.EDU (Paul Raines) (05/25/91)
Below are both the ASC and UUE versions of H.Piper! 2.0
Changes: - CURVED CORNERS!!!
- resume game ability!
- most randomness removed
RESUME: Between jobs (i.e. while at the dripping faucet wait
screen) you can press the decimal (.) key to leave
the game and go to the regular calculator mode. The
total score and level you achieved will be stored in
the user flags so that next time you start the game,
you will resume the game as you left it. Do not
run the SCORE program or you will lose the resumable
state.
RANDOM: The starting pipe for the first level is still
placed randomly. For subsequent levels, however,
the starting pipe is located on the grid site
you "leaked" on with the starting direction opposite
of that you entered. If you leaked onto the border,
then the starting pipe is placed on the site you
leaked from.
The first five pipes in the queue are selected
randomly. Placing a pipe on the grid with the (7)
key will still randomly select a new pipe to put at
the top of the queue. If you press (4) to place
a pipe, the pipe at the top of the queue will be
the one currently displayed between the score and
level indicators.
General Notes: Some people have reported assorted problems with
getting the program to work. For those who can't get
ASC-> to work, it works for me. If one of these people
would mail me the ASC they are trying to get to work, I
might be able to find a solution. For those who can't get
SCHIP to work with H. Piper, try turning off all alarms
and date/clock displays. If any of you have Chipper,
you might try compiling the v1.2 source code I posted and
see if you can get it to run from there. I am really
sorry for all these problems, but I am at a loss to help
right now.
Development Notes: It is really funny how work involved on
each aspect of this last update was inversely proportional
to what I expected. The rounded corners were much, much
easier to implement than I thought. It does increase the
code size by a hefty chunk, but it took little work. The
derandomization of the starting pipe was an absolute
b:tch. I had to extensively recode several procedures
and add some complex testing just to make sure you didn't
end up having a starting pipe going into a border.
Program Size: I have put a semi-rigid limit of 2K on the size
of the program. Any improvement that will put it over
that barrier just won't be worth it. (I will of course
probably eat these words later.)
Everyone please keep me informed on your success in getting this
version to run. Also, any comments and suggestions are welcome.
-------( cut here for ASC version)------------------------------
%%HP: T(3)A(D)F(.);
"C2A20D4E0021616723E20302251696E6563702823692021393931300FF3F58E8
0234102162E6E4060016008AE61F55C6FF0600160026002F57000E06B0160026
008ACA2FE11F552720238721C3060026008A462FE11F552720236021C48A2706
62169336003FE10D5136500780036421068A68068616200D51078026502FE10D
518A09068616A20D51078026502FE10D51180E1865064608518AE10F332F5636
A546931F923D5437502F923D54080E7ACB0F557AEC060016000D210780030621
4B46207A4A06000DC47A0B06800DC447C043E321EB7600080772027710735021
2D162306017AED0D6107800306212E160006067A2A0D2117201383210FD64342
2142E142C216208A6106010D81078003063160178013233140C4FF31A2B40036
60B4303640B4603620B450360031833C703710CC03C701C8433C3038E58AC53F
E11F56B80028019802080C622762CCA62042E37600860072E5720806FF0F5106
700E1A32AA06800E1A324C06300E1A32ED06600E1A328F06100E1A32C806400E
1A326906F00E1AE6200F70040042E431A506F07202080D622700EE72C1080D62
2700EE080D16F00821180D185000EE422142C232E907FF04FF0600D801D84042
2142C20609426300EE422142C232E9071004A00690D801D840422142C2060942
6300EE42E142C232E9170F140F1600D801D84042E142C20609426300EE42E142
C232E9170114061605D801D84042E142C20609426300EE32E9070662A28A640D
4100EE32E9080107A062A28AE30D8100EE080D62A28A630D8100EE07FF030041
6300EE8A45AFE10F5662CB06C616C10D8100EE42E3A7100809160F0821040041
46A4404129A4505122280AB30041E62680285A080B086508650300410CB30027
FF080C62A218428AA40D11F4005140A3105140960051E3B8390670B820080C62
A29361414A8AC4174093D141CA8AE417209351414B8A05174093E141CB8A2517
200D215122B350410D3608248041CD38652710416C3610248041CD38E5271041
2D180308038AE11F558AE1080C62A217309330416FA440418FA3500D21F40051
40A3105140960051E3A380512272E50600771073465161871076000710033051
C072E5A600624E080E180818471400070B0F5142E300EE06B00EE951430E1A51
8300EE06300F815223000E260036008ACA2FE11F5627203841238751A434C387
108AE61F56084736460853480F430017104310074618488AE61F555800368246
828AA61F332F560F033DA437B01F033DA437B02F033DA48AA65F332F5637B01F
033DA437B02F033DA472E57ACB0F56E800E420E740E7CF8300512C0865164618
507851F40051CC526F030021433610510E8AA906A216810D51078026502FE10D
51526F36008AE61F56280E3F5706B00E1A51AE06000E1A510F00DF7AEC362046
803D847A6E36A03D848A4A36E046013D740652426306B00E1A618206000E1A61
823D744720448361603D7461C000EE1800F60F182F1865F6F0082F08E508E508
E50701172000EE070F17EF08650865086518E5084100EE8ACA1800F6F0182F18
E51FE1F60F082F0865180018651865084108E50FE100EE380062251F56560003
B056FF1400618816301F81614A62CB080362A20D8108036225160008021F5508
0262CB080362A20D8172E5784573FF618B8400616B87FF7636618B760072E500
EE16F0082108E508E508E57AEB0FE100EE080C62251F5604B051E39800080C62
25080916101F5500EE3600B4603610B4303601B400360FB45036FF180C1843F6
0F182F140F51E3140651E3180C1843F6F0182F14F051E314A051E3C84362CC00
EE180A71A21C7008650865040018658A451FE10F565800463036008A463FE10F
56280062CB06400D848A463FE108050F5562CB06400D8447C058023710335071
6300EE369646908AA68F332F562F923D5437608AA67F332F561F923D5437602F
923D5400EE080E07EF08650865164118508AA61F332F561F03368646233DA437
B02F033DA400EE8F8F0C0C0C0C0C0C0C0C0C0C0CFF3030303030303030303030
FF000000000000000000003C3C3C3C3C3C3C3CFFFF00000000FFFF3C3C000000
003C3CFFFFFFFFFFFFFFFFFFFFF0703030383CFFFF0F0E0C0C1C3CFFFF0C0C0C
0CFFFFFFFF30303030FFFF3C3C3C3C3C3CFFFFFFFF3C3C3C3C3C3C00E7242424
24E70000000000000000003C1C0C0C0E0FFFFF3C38303070F0FFFF000081C3C3
8100000001010707010100008181E781008040408001020201D15161E1102030
3060705080009030A000000000000000000000000000003A2A3E2AAABB293921
A3BB2A3B22A388888804849D292D259DB3AA3BAAB2A929A9199D4B4A4B4263AE
AAEA4A4EEEA8EC989E0202078F8F8F0700B000B000B000B000B000B000B000B0
00B000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B0
00B000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B0
00B000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B0
00B000B000B000B000ED72"
---------( cut here - end of ASC version)-----------------------
SCORE program to read last games score and level
from the user flags:
%%HP: T(3)A(D)F(.);
\<< RCLF 2 GET
# FFFFFFh AND DUP
# FFFFh AND DUP
# FFh AND SWAP
# 100h / # 64h * +
B\->R SWAP # 10000h /
# 2h - # 4h / # 14h
SWAP - B\->R 1 - RCLF
2 # 0h PUT STOF
\>>
------(cut here for UUE version)--------------------------------
begin 600 vapsppr
M"B4E2%`Z(%0H,RE!*$0I1B@N*3L*(D,R03(P1#1%,#`R,38Q-C<R,T4R,#,P
M,C(U,38Y-D4V-38S-S`R.#(S-CDR,#(Q,SDS.3,Q,S`P1D8S1C4X13@*,#(S
M-#$P,C$V,D4V130P-C`P,38P,#A!138Q1C4U0S9&1C`V,#`Q-C`P,C8P,#)&
M-3<P,#!%,#9",#$V,#`R-@HP,#A!0T$R1D4Q,48U-3(W,C`R,S@W,C%#,S`V
M,#`R-C`P.$$T-C)&13$Q1C4U,C<R,#(S-C`R,4,T.$$R-S`V"C8R,38Y,S,V
M,#`S1D4Q,$0U,3,V-3`P-S@P,#,V-#(Q,#8X038X,#8X-C$V,C`P1#4Q,#<X
M,#(V-3`R1D4Q,$0*-3$X03`Y,#8X-C$V03(P1#4Q,#<X,#(V-3`R1D4Q,$0U
M,3$X,$4Q.#8U,#8T-C`X-3$X044Q,$8S,S)&-38S-@I!-30V.3,Q1CDR,T0U
M-#,W-3`R1CDR,T0U-#`X,$4W04-",$8U-3=!14,P-C`P,38P,#!$,C$P-S@P
M,#,P-C(Q"C1"-#8R,#=!-$$P-C`P,$1#-#=!,$(P-C@P,$1#-#0W0S`T,T4S
M,C%%0C<V,#`P.#`W-S(P,C<W,3`W,S4P,C$*,D0Q-C(S,#8P,3=!140P1#8Q
M,#<X,#`S,#8R,3)%,38P,#`V,#8W03)!,$0R,3$W,C`Q,S@S,C$P1D0V-#,T
M,@HR,30R13$T,D,R,38R,#A!-C$P-C`Q,$0X,3`W.#`P,S`V,S$V,#$W.#`Q
M,S(S,S$T,$,T1D8S,4$R0C0P,#,V"C8P0C0S,#,V-#!"-#8P,S8R,$(T-3`S
M-C`P,S$X,S-#-S`S-S$P0T,P,T,W,#%#.#0S,T,S,#,X134X04,U,T8*13$Q
M1C4V0C@P,#(X,#$Y.#`R,#@P0S8R,C<V,D-#038R,#0R13,W-C`P.#8P,#<R
M134W,C`X,#9&1C!&-3$P-@HW,#!%,4$S,D%!,#8X,#!%,4$S,C1#,#8S,#!%
M,4$S,D5$,#8V,#!%,4$S,CA&,#8Q,#!%,4$S,D,X,#8T,#!%"C%!,S(V.3`V
M1C`P13%!138R,#!&-S`P-#`P-#)%-#,Q034P-D8P-S(P,C`X,$0V,C(W,#!%
M13<R0S$P.#!$-C(*,C<P,$5%,#@P1#$V1C`P.#(Q,3@P1#$X-3`P,$5%-#(R
M,30R0S(S,D4Y,#=&1C`T1D8P-C`P1#@P,40X-#`T,@HR,30R0S(P-C`Y-#(V
M,S`P144T,C(Q-#)#,C,R13DP-S$P,#1!,#`V.3!$.#`Q1#@T,#0R,C$T,D,R
M,#8P.30R"C8S,#!%130R13$T,D,R,S)%.3$W,$8Q-#!&,38P,$0X,#%$.#0P
M-#)%,30R0S(P-C`Y-#(V,S`P144T,D4Q-#(*0S(S,D4Y,3<P,3$T,#8Q-C`U
M1#@P,40X-#`T,D4Q-#)#,C`V,#DT,C8S,#!%13,R13DP-S`V-C)!,CA!-C0P
M1`HT,3`P144S,D4Y,#@P,3`W03`V,D$R.$%%,S!$.#$P,$5%,#@P1#8R03(X
M038S,$0X,3`P144P-T9&,#,P,#0Q"C8S,#!%13A!-#5!1D4Q,$8U-C8R0T(P
M-D,V,39#,3!$.#$P,$5%-#)%,T$W,3`P.#`Y,38P1C`X,C$P-#`P-#$*-#9!
M-#0P-#$R.4$T-3`U,3(R,C@P04(S,#`T,44V,C8X,#(X-4$P.#!",#@V-3`X
M-C4P,S`P-#$P0T(S,#`R-PI&1C`X,$,V,D$R,3@T,CA!030P1#$Q1C0P,#4Q
M-#!!,S$P-3$T,#DV,#`U,44S0C@S.3`V-S!".#(P,#@P0S8R"D$R.3,V,30Q
M-$$X04,T,3<T,#DS1#$T,4-!.$%%-#$W,C`Y,S4Q-#$T0CA!,#4Q-S0P.3-%
M,30Q0T(X03(U,3<*,C`P1#(Q-3$R,D(S-3`T,3!$,S8P.#(T.#`T,4-$,S@V
M-3(W,3`T,39#,S8Q,#(T.#`T,4-$,SA%-3(W,3`T,0HR1#$X,#,P.#`S.$%%
M,3%&-34X044Q,#@P0S8R03(Q-S,P.3,S,#0Q-D9!-#0P-#$X1D$S-3`P1#(Q
M1C0P,#4Q"C0P03,Q,#4Q-#`Y-C`P-3%%,T$S.#`U,3(R-S)%-3`V,#`W-S$P
M-S,T-C4Q-C$X-S$P-S8P,#`W,3`P,S,P-3$*0S`W,D4U038P,#8R-$4P.#!%
M,3@P.#$X-#<Q-#`P,#<P0C!&-3$T,D4S,#!%13`V0C`P144Y-3$T,S!%,4$U
M,0HX,S`P144P-C,P,$8X,34R,C,P,#!%,C8P,#,V,#`X04-!,D9%,3%&-38R
M-S(P,S@T,3(S.#<U,4$T,S1#,S@W"C$P.$%%-C%&-38P.#0W,S8T-C`X-3,T
M.#!&-#,P,#$W,3`T,S$P,#<T-C$X-#@X044V,48U-34X,#`S-C@R-#8*.#(X
M04$V,48S,S)&-38P1C`S,T1!-#,W0C`Q1C`S,T1!-#,W0C`R1C`S,T1!-#A!
M038U1C,S,D8U-C,W0C`Q1@HP,S-$030S-T(P,D8P,S-$030W,D4U-T%#0C!&
M-39%.#`P130R,$4W-#!%-T-&.#,P,#4Q,D,P.#8U,38T-C$X"C4P-S@U,48T
M,#`U,4-#-3(V1C`S,#`R,30S,S8Q,#4Q,$4X04$Y,#9!,C$V.#$P1#4Q,#<X
M,#(V-3`R1D4Q,$0*-3$U,C9&,S8P,#A!138Q1C4V,C@P13-&-3<P-D(P,$4Q
M034Q044P-C`P,$4Q034Q,$8P,$1&-T%%0S,V,C`T-@HX,#-$.#0W039%,S9!
M,#-$.#0X031!,S9%,#0V,#$S1#<T,#8U,C0R-C,P-D(P,$4Q038Q.#(P-C`P
M,$4Q038Q"C@R,T0W-#0W,C`T-#@S-C$V,#-$-S0V,4,P,#!%13$X,#!&-C!&
M,3@R1C$X-C5&-D8P,#@R1C`X134P.$4U,#@*134P-S`Q,3<R,#`P144P-S!&
M,3=%1C`X-C4P.#8U,#@V-3$X134P.#0Q,#!%13A!0T$Q.#`P1C9&,#$X,D8Q
M.`I%-3%&13%&-C!&,#@R1C`X-C4Q.#`P,3@V-3$X-C4P.#0Q,#A%-3!&13$P
M,$5%,S@P,#8R,C4Q1C4V-38P,#`S"D(P-39&1C$T,#`V,3@X,38S,#%&.#$V
M,31!-C)#0C`X,#,V,D$R,$0X,3`X,#,V,C(U,38P,#`X,#(Q1C4U,#@*,#(V
M,D-",#@P,S8R03(P1#@Q-S)%-3<X-#4W,T9&-C$X0C@T,#`V,39".#=&1C<V
M,S8V,3A"-S8P,#<R134P,`I%13$V1C`P.#(Q,#A%-3`X134P.$4U-T%%0C!&
M13$P,$5%,#@P0S8R,C4Q1C4V,#1",#4Q13,Y.#`P,#@P0S8R"C(U,#@P.3$V
M,3`Q1C4U,#!%13,V,#!"-#8P,S8Q,$(T,S`S-C`Q0C0P,#,V,$9"-#4P,S9&
M1C$X,$,Q.#0S1C8*,$8Q.#)&,30P1C4Q13,Q-#`V-3%%,S$X,$,Q.#0S1C9&
M,#$X,D8Q-$8P-3%%,S$T03`U,44S0S@T,S8R0T,P,`I%13$X,$$W,4$R,4,W
M,#`X-C4P.#8U,#0P,#$X-C4X030U,49%,3!&-38U.#`P-#8S,#,V,#`X030V
M,T9%,3!&"C4V,C@P,#8R0T(P-C0P,$0X-#A!-#8S1D4Q,#@P-3!&-34V,D-"
M,#8T,#!$.#0T-T,P-3@P,C,W,3`S,S4P-S$*-C,P,$5%,S8Y-C0V.3`X04$V
M.$8S,S)&-38R1CDR,T0U-#,W-C`X04$V-T8S,S)&-38Q1CDR,T0U-#,W-C`R
M1@HY,C-$-30P,$5%,#@P13`W148P.#8U,#@V-3$V-#$Q.#4P.$%!-C%&,S,R
M1C4V,48P,S,V.#8T-C(S,T1!-#,W"D(P,D8P,S-$030P,$5%.$8X1C!#,$,P
M0S!#,$,P0S!#,$,P0S!#,$-&1C,P,S`S,#,P,S`S,#,P,S`S,#,P,S`*1D8P
M,#`P,#`P,#`P,#`P,#`P,#`P,#-#,T,S0S-#,T,S0S-#,T-&1D9&,#`P,#`P
M,#!&1D9&,T,S0S`P,#`P,`HP,#-#,T-&1D9&1D9&1D9&1D9&1D9&1D9&1D8P
M-S`S,#,P,S@S0T9&1D8P1C!%,$,P0S%#,T-&1D9&,$,P0S!#"C!#1D9&1D9&
M1D8S,#,P,S`S,$9&1D8S0S-#,T,S0S-#,T-&1D9&1D9&1C-#,T,S0S-#,T,S
M0S`P13<R-#(T,C0*,C1%-S`P,#`P,#`P,#`P,#`P,#`P,#-#,4,P0S!#,$4P
M1D9&1D8S0S,X,S`S,#<P1C!&1D9&,#`P,#@Q0S-#,PHX,3`P,#`P,#`Q,#$P
M-S`W,#$P,3`P,#`X,3@Q13<X,3`P.#`T,#0P.#`P,3`R,#(P,40Q-3$V,44Q
M,3`R,#,P"C,P-C`W,#4P.#`P,#DP,S!!,#`P,#`P,#`P,#`P,#`P,#`P,#`P
M,#`P,#`P,#`S03)!,T4R04%!0D(R.3,Y,C$*03-"0C)!,T(R,D$S.#@X.#@X
M,#0X-#E$,CDR1#(U.41",T%!,T)!04(R03DR.4$Y,3DY1#1"-$$T0C0R-C-!
M10I!045!-$$T145%03A%0SDX.44P,C`R,#<X1CA&.$8P-S`P0C`P,$(P,#!"
M,#`P0C`P,$(P,#!",#`P0C`P,$(P"C`P0C`P,$(P,#!",#`P0C`P,$(P,#!"
M,#`P0C`P,$(P,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P,#!",#`P0C`*,#!"
M,#`P0C`P,$(P,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P
M,#!",#`P0C`P,$(P,#!",`HP,$(P,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P
M,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P,#!",#`P0C`P,$(P"C`P0C`P,$(P
M,#!",#`P0C`P,$5$-S(B"@H*)25(4#H@5"@S*4$H1"E&*"XI.PI</#P@4D-,
M1B`R($=%5`HC($9&1D9&1F@@04Y$($154`HC($9&1D9H($%.1"!$55`*(R!&
M1F@@04Y$(%-705`*(R`Q,#!H("\@(R`V-&@@*B`K"D)<+3Y2(%-705`@(R`Q
M,#`P,&@@+PHC(#)H("T@(R`T:"`O(",@,31H"E-705`@+2!"7"T^4B`Q("T@
:4D-,1@HR(",@,&@@4%54(%-43T8*7#X^"@IH
`
end
-----------(end of UUE version)------------------------------
Thats it. Enjoy!
Paul
--
Paul Raines
Georgia Institute of Technology, Atlanta Georgia, 30332
uucp: ...!{decvax,hplabs,ncar,purdue,rutgers}!gatech!prism!vapsppr
Internet: vapsppr@prism.gatech.eduvapsppr@prism.gatech.EDU (Paul Raines) (05/26/91)
The source code in Chipper for ver 2.0 of H. Piper! follows
below. There are some significant changes in some of the
logic. For people having problems with getting the ASC
version to run, try compiling this program and using its
output.
; H. Piper Game for the HP48SX
; (c) Paul Raines
; Register usage:
; V0: Temporary data, may change during any call
; V1: Temporary data, may change during any call
; V2: Temporary data, may change during any call
; V3: Temporary data, may change during any call
; V4: Temporary data, may change during any call
; V5: Temporary data, may change during any call
; V6: Temporary data, may change during any call
; V7: Current Job Score (ones & tens)
; V8: Current Job Score (hundreds & up)
; V9: Current Box type
; VA: Box progression
; VB: Flow direction
; VC: Current Box pos
; VD: Paddle position
; VE: Speed Level
; VF: Flag register
; NOTE: Box position is stored in one register such that
; #34h
; y pos --^^--- x pos on grid
;
; Two registers are used for the score in order to
; have a decimal number greater than 255.
; *************************
; START OF DEFINITIONS AREA
; *************************
F_UP = #00 ; direction definitions
F_DOWN = #03
F_RIGHT = #06
F_LEFT = #05
B_NE = #1D ; pipe definitions
B_SW = #15
B_NW = #1E ; NOTE THAT
B_SE = #16 ;
B_VERT = #01 ; B_SE xor F_UP and #07 = F_RIGHT
B_HORZ = #02 ; B_SW xor F_UP and #07 = F_LEFT
B_CROS = #03 ; B_NE xor F_LEFT and #07 = F_UP
B_ESTR = #07 ; ...
B_WSTR = #08 ; ...
B_NSTR = #09
B_SSTR = #0A
; Key definitions
; ( 7 ) -> #1 ( 8 ) -> #2 ( 9 ) -> #3 ( / ) -> #C
; ( 4 ) -> #4 ( 5 ) -> #5 ( 6 ) -> #6 ( * ) -> #D
; ( 1 ) -> #7 ( 2 ) -> #8 ( 3 ) -> #9 ( - ) -> #E
; ( 0 ) -> #A ( . ) -> #0 ( _ ) -> #B ( + ) -> #F
K_LEFT = #07
K_RIGHT = #08
K_UP = #03
K_DOWN = #06
K_FAST = #0F
K_PLACE = #01
K_UPLACE = #04
TYPERATE = #90 ; repeat rate for holding down key
; ******************
; START OF CODE AREA
; ******************
JP FIRST
COPYRIGHT: DA 'v2.0 Raines (c) 1991'
FIRST: DB #00, #FF ; turnon extend mode
DB #F3, #85 ; read incoming paused score and level
LD VE, V2 ; starting level
SNE V3, #1 ; if resuming paused game
JP RESUME
LD VE, #4E ; starting level
LD V0, 0 ; Zero out total score
LD V1, 0 ; " "
RESUME: LD I, TSCORE ; Set total score from flags
LD [I], V1 ; " "
LD VC, #FF ; signal for random starting placement
LD V0, 0
LD V1, 0
LD V2, 0
DB #F2, #75 ; clear user flags
; *** SETUP SCREEN, DATA AREA, AND REGISTERS FOR GAME PLAY ***
START: CLS
LD V0, #0B ; Fill grid array data
LD V1, #00 ; area with unfilled
LD V2, 0 ; unused grid sites
CLEARGRID: LD I, BOXINFO ; " "
ADD I, V2 ; " "
LD [I], V1 ; " "
ADD V2, 2 ; " "
SE V2, 120 ; " "
JP CLEARGRID ; " "
LD V0, #00 ; Fill preview array data
LD V2, 0 ; area with blank blocks
CLEARPREV: LD I, PBOXINFO ; " "
ADD I, V2 ; " "
LD [I], V1 ; " "
ADD V2, 2 ; " "
SE V2, 6 ; " "
JP CLEARPREV ; " "
LD I, TITLE ; Draw title "H. Piper!"
LD V0, 38
LD V1, 57
LD V3, 0
DRAWTITLE: ADD I, V3
DRW V0, V1, 5
LD V3, 5
ADD V0, 8
SE V0, 70
JP DRAWTITLE
LD I, HDSCORE ; Draw score and level heading
LD V0, 104
LD V1, 2
DRW V0, V1, 5
ADD V0, 8
LD V2, 5
ADD I, V2
DRW V0, V1, 5
LD I, HDLEVEL
LD V0, 104
LD V1, 42
DRW V0, V1, 5
ADD V0, 8
LD V2, 5
ADD I, V2
DRW V0, V1, 5
LD V1, VE ; draw needed score
SHR V1
LD V0, 100
SUB V0, V1 ; determine needed score
LD I, TEMP
LD B, V0 ; write BCD of needed score
LD V2, [I] ; read BCD in three parts
LD V3, 90
LD V4, 57
LD F, V1 ; point to sprite of tens digit
DRW V3, V4, 5 ; draw it
ADD V3, 5
LD F, V2 ; point to sprite of ones digit
DRW V3, V4, 5 ; draw it
LD V0, VE ; store the current level in memory
LD I, LEVEL ; in case some uses FAST key
LD [I], V0
LD I, HORZBOX ; draw top border
LD V0, 0
LD V1, 0
RDTOP: DRW V0, V1, 2
ADD V0, 8
SE V0, 96
JP RDTOP
LD V4, 2
RDPRV: LD I, PRV1BOX ; Draw preview boxes grids
LD V0, 0
DRW V0, V4, 12
LD I, PRV2BOX
LD V0, 8
DRW V0, V4, 12
ADD V4, 12
SE V4, 62
JP RDPRV
LD V7, 0
PREVAGAIN: LD V0, V7 ; favor corners for first 4 preview boxes
CALL GETRANDBLK ; randomly get five new
ADD V7, 1 ; preview boxes
SE V7, 5
JP PREVAGAIN
LD V1, 50 ; draw bottom border
LD V0, 16
LD I, FULLBOX
RDBBDR: DRW V0, V1, 6
ADD V0, 8
SE V0, 96
JP RDBBDR
LD V1, 0 ; Draw right border
LD V0, 96
LD I, RBORDER
RDRBDR: DRW V0, V1, 2
ADD V1, 2
SE V1, 56
JP RDRBDR
LD VD, #34 ; Draw initial paddles
CALL DRAWBPADL
CALL DRAWSPADL
CALL DRAWCRSHR
LD V1, 2 ; Draw grid boxes
LD I, GRID
RDGRID1: LD V0, 16
RDGRID2: DRW V0, V1, 8
ADD V0, 8
SE V0, 96
JP RDGRID2
ADD V1, 8
SE V1, 50
JP RDGRID1
SNE VC, #FF ; get starting direction and box
JP RANDSTART ; if not first job, use last box
NOTCORNER: SNE VB, #00 ;if last direction was down
LD V3, #6 ; make start direction up
SNE VB, #03 ;if last direction was up
LD V3, #4 ; make start direction down
SNE VB, #06 ;if last direction was right
LD V3, #2 ; make start direction left
SNE VB, #05 ;if last direction was left
LD V3, #0 ; make start direction right
JP SETUP
RANDSTART: RND V3, 7 ; Draw random starting box
ADD V3, 1
RND VC, #30
ADD VC, #10
ADD VC, V3 ; get random placement
RND V3, 3
SHL V3
SETUP: LD I, RANDDIR
ADD I, V3 ; get random direction of opening
LD V1, [I]
LD VB, V0 ; starting flow direction
LD V2, V1
LD V9, V2 ; starting box type
LD V0, VC
CALL DRAWBOX
CALL GETBOXTYPE ; prevent change of starting box
LD VA, 2 ; set starting progression
CALL DRAWRANDB
LD V7, 0 ; zero current job score
LD V8, 0
CALL WRITESCORE
CALL WRITELEVEL
LD V0, #FF ; maximum delay of progression
LD DT, V0 ; for beginning of game
; *** MAIN PROCEDURE FOR PLAYING GAME ***
GAMELOOP:
LD V0, K_LEFT
SKNP V0
CALL MOVELEFT ; move left if K_LEFT key pressed
LD V0, K_RIGHT
SKNP V0
CALL MOVERIGHT ; move right
LD V0, K_UP
SKNP V0
CALL MOVEUP ; move up
LD V0, K_DOWN
SKNP V0
CALL MOVEDOWN ; move down
LD V0, K_PLACE
SKNP V0
CALL PLACEBOX ; place box
LD V0, K_UPLACE
SKNP V0
CALL UPLACEBOX ; place box and use block shown for new
LD V0, K_FAST
SKNP V0
LD VE, #02 ; go fast
LD V0, DT
SNE V0, 0
CALL PROGRESS
JP GAMELOOP
; *****************************
; START OF SUBROUTINE CODE AREA
; *****************************
; Places next box on a grid site if allowed and updates preview boxes
; V1 - V5 modified
PLACEBOX: LD V0, #F ; don't favor corners
CALL GETRANDBLK ; get next box type (V2) and update preview
LD V0, VD ; get pos to draw box
CALL DRAWBOX ; draw box (V2) at desired box coord
RET
; Places next box on a grid site if allowed and updates preview boxes
; V1 - V5 modified
UPLACEBOX: CALL NEWPREV ; get next box type (V2) and update preview
LD V0, VD ; get pos to draw box
CALL DRAWBOX ; draw box (V2) at desired box coord
RET
; Takes paddle coord in VD and put x coord in V0, y coord in V1
; V0 := (out) paddle x coord
; V1 := (out) paddle y coord
; VD := bott coord
SPLITPOS: LD V0, VD
LD V1, #0F
AND V0, V1 ; store x part in V0
LD V1, VD
SUB V1, V0 ; store y part in V1
RET
; The following 4 subroutines move the crosshair in the desired direction
; V0 := --- (m)
; V1 := --- (m)
; VD := paddle coord
MOVELEFT: CALL DRAWBPADL ;erase old paddle
CALL DRAWCRSHR
CALL SPLITPOS ; calculate new pos
ADD V0, #FF ; "
SNE V0, #FF ; "
LD V0, 0 ; "
LD VD, V1 ; save new pos
ADD VD, V0
CALL DRAWBPADL ; draw new position
CALL DRAWCRSHR
LD V0, TYPERATE
CALL PAUSE
RET
MOVERIGHT: CALL DRAWBPADL ;erase old paddle
CALL DRAWCRSHR
CALL SPLITPOS ; calculate new pos
ADD V0, #01 ; "
SNE V0, #0A ; "
LD V0, 9 ; "
LD VD, V1 ; save new pos
ADD VD, V0
CALL DRAWBPADL ; draw new position
CALL DRAWCRSHR
LD V0, TYPERATE
CALL PAUSE
;NORIGHT: LD V0, K_RIGHT ; wait till key released
; SKNP V0
; JP NORIGHT
RET
MOVEUP: CALL DRAWSPADL ;erase old paddle
CALL DRAWCRSHR
CALL SPLITPOS ; calculate new pos
ADD V1, #F0 ; "
SNE V1, #F0 ; "
LD V1, 0 ; "
LD VD, V1 ; save new pos
ADD VD, V0
CALL DRAWSPADL ; draw new position
CALL DRAWCRSHR
LD V0, TYPERATE
CALL PAUSE
RET
MOVEDOWN: CALL DRAWSPADL ;erase old paddle
CALL DRAWCRSHR
CALL SPLITPOS ; calculate new pos
ADD V1, #10 ; "
SNE V1, #60 ; "
LD V1, #50 ; "
LD VD, V1 ; save new pos
ADD VD, V0
CALL DRAWSPADL ; draw new position
CALL DRAWCRSHR
LD V0, TYPERATE
CALL PAUSE
RET
; Draw bottom paddle
; V0 := --- (m)
; V1 := --- (m)
; VD := paddle coord
DRAWBPADL: CALL SPLITPOS ; get paddle position
ADD V0, #60
CALL BOXTOSCR
LD I, BOTTPADL ; draw it
DRW V0, V1, 4
RET
; Draw side paddle
; V0 := --- (m)
; V1 := --- (m)
; VD := paddle coord
DRAWSPADL: CALL SPLITPOS
LD V0, V1
ADD V0, #0A
CALL BOXTOSCR
LD I, SIDEPADL
DRW V0, V1, 8
RET
; Draw crosshair
; V0 := --- (m)
; V1 := --- (m)
; VD := paddle coord
DRAWCRSHR: LD V0, VD
CALL BOXTOSCR
LD I, CROSSHAIR
DRW V0, V1, 8
RET
; All purpose pause subroutine
; V0 := (in) time to delay (m)
PAUSE: ADD V0, #FF
SE V0, 0
JP PAUSE
RET
DRAWRANDB: LD I, RANDBLK
ADD I, VA
LD V0, [I]
CALL GETBITADDR
LD V0, 108
LD V1, 28
DRW V0, V1, 8
RET
; Progress flow through current box
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m)
; V3 := --- (m)
; V9 := current box type
; VA := box progression so far
; VB := flow direction
; VC := current box pos
PROGRESS: CALL DRAWRANDB
ADD VA, 1
LD V0, V9 ; Get box type
LD V1, #F0
AND V0, V1 ; if box is a corner (type = #1X)
SNE V0, 0 ; then see if need to change direction
JP KEEPDIR
SNE VA, 4
JP CORNERPROG
SNE VA, 5
JP ENDPROG
KEEPDIR: LD V2, VA ; store progression in v2
SE VB, 0 ; invert progression if moving up
JP NOINVERT ; ^- you will see why below (y position)
LD V2, 8
SUB V2, VA
NOINVERT: LD V0, VB ; store flow direction in v0
SHR V0
SHR V0
SE V0, 0 ; if flowing right left, skip to R_L_PROG
JP R_L_PROG
SE VB, 0 ; if flowing down, subtract one from progression
ADD V2, #FF ; ^- graphical adjustment
LD V0, VC ; copy box coord to v0
CALL BOXTOSCR ; convert to screen coord, v0=x,v1=y
ADD V1, V2 ; add progression to y coord for screen pos
LD I, VERTMOVE ; load address of vert moving flow
DRW V0, V1, 1 ; draw vert moving flow
SNE VF, 0 ; if collision took place
JP SKIPIT ; check to make sure it
SE VA, 1 ; was only with crosshair
JP SKIPIT ; so end of vertical flow
LD V9, #00 ; else end the game
JP ENDGAME
CORNERPROG: XOR VB, V9 ; CHECK THIS OUT! Those value assignments
LD V0, #07 ; for box and direction aren't arbitrary
AND VB, V0
LD V0, VC
CALL BOXTOSCR ; get box coord
SE V9, B_SE
JP FCASE2 ; find proper bitmap to draw
LD I, SEFLOW ; according to type of corner
ADD V1, 4
FCASE2: SE V9, B_NE
JP FCASE3
LD I, NEFLOW
ADD V1, 2
FCASE3: SE V9, B_SW
JP FCASE4
LD I, SWFLOW
ADD V1, 4
FCASE4: SE V9, B_NW
JP FENDCASE
LD I, NWFLOW
ADD V1, 2
FENDCASE: DRW V0, V1, 2 ; draw bitmap
JP ENDPROG ; end of corner flow
R_L_PROG: SE VB, 5 ; skip to right program if moving right
JP RIGHTPRG
LD V3, #80 ; start with 10000000 bitmap graphic
LEFTPRG: SNE V2, 8 ; iterate over progressions left
JP R_L_DRAW
SHR V3 ; build proper sprite by shifting 1 digit right
ADD V2, 1 ; for each progression not obtained
JP LEFTPRG ; end of left flow
RIGHTPRG: LD V3, #01 ; start with 00000001
RIGHTPRG2: SNE V2, 8 ; iterate over progressions left
JP R_L_DRAW
SHL V3 ; build proper sprite
ADD V2, 1
JP RIGHTPRG2 ; end of right flow
R_L_DRAW: LD V1, V3
LD V0, V3
LD I, TEMP
LD [I], V1 ; store built sprite doubled in memory
LD I, TEMP
LD V0, VC
CALL BOXTOSCR ; get position of box to progress flow
ADD V1, 3
SE V9, B_CROS ; "tunnel under" if a crossbar and on 4,5 progr
JP DRAWIT ; else draw the progression
SNE VA, 4
JP NODRAW
SE VA, 5
DRAWIT: DRW V0, V1, 2 ; write sprite to screen
NODRAW: SNE VF, 0 ; if collision took place
JP SKIPIT ; check to make sure it
SE VA, 1 ; was only with crosshair
JP SKIPIT ; so end of horizontal flow
LD V9, #00 ; else end the game
JP ENDGAME ;
SKIPIT: SE VA, 8 ; if at end of progression through box
JP ENDPROG
CALL WRITESCORE
LD V0, 0
SCOREIT: ADD V7, 1 ; earn 3 points for each box passed
SE V7, 100
JP SCOREIT2
ADD V8, 1
LD V7, 0
SCOREIT2: ADD V0, 1
SE V0, 3
JP SCOREIT
CALL WRITESCORE
LD VA, 0
CALL GETNEXTBOX ; get next box pos and type
ENDPROG: LD V0, VE ; resest timer for next progress check
LD V1, V8
ADD V1, V7
SNE V1, 0
ADD V0, #B0 ; increase timer if only starting
LD DT, V0
CALL DRAWRANDB
RET
; Wait until space key is pressed
; V0 := --- (m)
WAIT: LD V0, #B
WAIT2: SKP V0 ; wait till press space
JP WAIT2
WAIT3: SKNP V0
JP WAIT3 ; wait till space key released
RET
; Determine if game ends, tally score, and reset for next screen
; Changes everything
ENDGAME: LD V0, #3
LD ST, V0 ; BEEP
CALL WAIT
CLS
LD V2, 0
LD V3, 0
CHECKBONUS: LD I, BOXINFO ; iterate through box grid array
ADD I, V2 ; adding together field
LD V1, [I] ; that has a 1 if flowed through
ADD V2, 2
ADD V3, V1
SE V2, 120
JP CHECKBONUS ; if every box flowed through
SNE V3, 60 ; then give a bonus 100 points
ADD V8, 1
LD I, TSCORE ; get old stored total score
LD V1, [I]
ADD V0, V7 ; add new score to total
LD V3, 100
SUB V0, V3
LD V4, VF
SE V4, 0 ; if over 100
ADD V1, 1 ; increment hundreds digit
SE V4, 1 ; else
ADD V0, 100 ; put back to normal
ADD V1, V8
LD I, TSCORE ; save new total
LD [I], V1
LD V5, V0 ; store tens & ones digit
LD V3, 40 ; x coord to display total
LD V4, 40 ; y coord to display total
LD I, SCORE ; STORE BCD
LD B, V1 ; of hundreds score to memory
LD V2, [I] ; read BCD
DB #F0, #30 ; point to sprite of ten thousands digit
DRW V3, V4, 10
ADD V3, 11
DB #F1, #30 ; point to sprite of thousands digit
DRW V3, V4, 10
ADD V3, 11
DB #F2, #30 ; point to sprite of hundreds digit
DRW V3, V4, 10
LD I, SCORE ; STORE BCD
LD B, V5 ; of tens & ones score to memory
LD V2, [I] ; read BCD
ADD V3, 11
DB #F1, #30 ; point to sprite of tens digit
DRW V3, V4, 10
ADD V3, 11
DB #F2, #30 ; point to sprite of ones digit
DRW V3, V4, 10
CALL WRITESCORE ; write score of last job in corner
LD I, LEVEL
LD V0, [I]
LD VE, V0 ; get stored level in case FAST used
SNE VE, #02 ; don't go beyond level 10
ADD VE, #04
ADD VE, #FC ; make level harder
SE V8, 0
JP GOODSCORE ; check if score good enough to continue
SHR V0 ; need 100 - (41 - 2 * LEVEL) pts
LD V1, 100 ; in order to continue
SUB V1, V0 ; LVL 1 -> 61
SUB V7, V1 ; LVL 2 -> 63
SNE VF, 0 ; LVL 3 -> 65, and so on
JP GAMEOVER ; if not, gameover
GOODSCORE: CALL DROPWAIT ; show the dripping graphic and wait
SE V0, #0 ; if pause game key (.) not pressed
JP START ; go to next job
LD V3, #1 ; signal flag that game is to continue
JP PAUSEGAME
GAMEOVER: LD I, HDOVER ; print 'OVER' on screen
LD V0, 42
LD V1, 24
DRW V0, V1, 5
ADD V0, 8
LD V2, 5
ADD I, V2
DRW V0, V1, 5
CALL DROPWAIT ; show the dripping graphic and wait
LD V3, #0 ; signal that game not to be resumed
PAUSEGAME: LD I, TSCORE ; get old stored total score
LD V1, [I]
LD V2, VE
DB #F3, #75 ; store total score in user flags
LD V0, #B
NOSPCPRESS: SKNP V0
JP NOSPCPRESS
LD V0, #0
NOPERPRESS: SKNP V0
JP NOPERPRESS
DB #00, #FD ; exit game
; Wait with drop graphic
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m)
; V3 := --- (m)
; V4 := --- (m)
DROPWAIT: LD I, HORZBOX ; draw faucet type pipe
LD V3, 2
LD V4, 8
DRW V3, V4, 8
LD I, SWBOX
LD V3, 10
DRW V3, V4, 8
LD I, DROP ; draw drop and animate
DROPIT: LD V3, 14
LD V4, 16
DRW V3, V4, 7
DRAWDROP: LD V0, #25
CALL PAUSE
LD V0, #B
SKNP V0
JP ENDDROP
LD V0, #0
SKNP V0
JP ENDDROP
DRW V3, V4, 7
ADD V4, 2
SNE V4, 56
JP DROPIT
DRW V3, V4, 7
JP DRAWDROP
ENDDROP: RET
; Get screen coord from box coord
; V0 := (in) box coord, (out) screen x
; V1 := (out) screen y
BOXTOSCR: LD V1, V0
LD VF, #F0
AND V1, VF
SHR V1 ; get y part of box coord
LD VF, #0F
AND V0, VF ; get x part of box coord
SHL V0 ; multipy box coords by 8
SHL V0
SHL V0
ADD V0, 16 ; add proper offsets to get screen coord
ADD V1, 2
RET
; Get box coord from screen coord
; V0 := (in) screen x, (out) box coord
; V1 := (in) screen y, (m)
SCRTOBOX: ADD V0, #F0 ; substr proper offsets
ADD V1, #FE
SHR V0 ; divide screen coords by 8
SHR V0
SHR V0
SHL V1
ADD V0, V1 ; put together into one register
RET
; Get grid array addr from box coord
; V0 := (in) box coord (m)
; V1 := (m)
; I := addr
BOXTOADDR: LD I, BOXINFO ; set address to beginning of box array
LD V1, V0
LD VF, #0F
AND V1, VF
SHL V1
ADD I, V1 ; add x offset (2 * box x)
LD VF, #F0
AND V0, VF
SHR V0
LD V1, V0
SHR V1
SHR V1
ADD V0, V1
SHL V0
ADD I, V0 ; add y offset (20 * box y)
RET
; Draws a box on the grid if possible. if not, penalize
; V0 := box coord (m)
; V1 := --- (m)
; V2 := box type (m)
; V3 := --- (m)
; V4 := --- (m)
; V5 := --- (m)
DRAWBOX: LD V3, V0 ; push box coord
CALL BOXTOADDR ; set I to array address
LD V1, [I] ; read in current box
LD V5, 0
SE V0, #0B ; if box already placed there,
LD V5, #FF ; then penalty
SNE V1, 00 ; if box full
JP DRAWBOX2
LD V1, #3 ; then disallow
LD ST, V1 ; and beep
JP SKIPDRAW
DRAWBOX2: CALL GETBITADDR ; get mask addr for current box
LD V0, V3 ; pop box coord
CALL BOXTOSCR ; convert to scr coord
DRW V0, V1, 8 ; erase current box
LD V0, V3 ; pop box coord
CALL BOXTOADDR ; set I to array address
LD V1, 0
LD V0, V2
LD [I], V1 ; write box type to array
LD V0, V2
CALL GETBITADDR ; get mask addr for box
LD V0, V3 ; pop box coord
CALL BOXTOSCR ; get screen coord
DRW V0, V1, 8 ; draw desired box
SKIPDRAW: CALL WRITESCORE
ADD V7, V5 ; substract penalty
SE V7, #FF ; if V7 was not 0
JP NOADJUST ; no adjustment needed
SNE V8, 0 ; else if V8 is 0
JP ZEROOUT ; set job score to 0
ADD V8, #FF ; else substract 100
LD V7, 99 ; and add 99
JP NOADJUST
ZEROOUT LD V7, 0
NOADJUST: CALL WRITESCORE
RET
; Gets bitmap address for box type
; V0 := box type
; V1 := --- (m)
GETBITADDR: LD V1, #0F
AND V0, V1 ; get offset to mask for box
SHL V0
SHL V0
SHL V0
LD I, ZEROBOX ; set I to mask address
ADD I, V0 ; add offset
RET
; Get box type from storage array and mark it as unchangable
; V0 := (m)
; V1 := (m)
; V3 := (in) box pos
; VC := (in) box pos
; V9 := (out) box type
GETBOXTYPE: LD V0, VC ; get array addr from box pos
CALL BOXTOADDR
LD V1, [I] ; read boxtype
SNE V0, #0B
JP ENDGAME
LD V9, V0
LD V0, VC
CALL BOXTOADDR ; prevent change of box
LD V0, V9
LD V1, #01
LD [I], V1
RET
; Get box coord for next box depending on direction from last
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m)
; VB := direction of flow
; VC := (in) curr box coord, (out) next box coord
GETNEXTBOX: LD V3, #00
SNE VB, F_RIGHT
LD V3, #01 ; if right, add one to x
SNE VB, F_DOWN
LD V3, #10 ; if down, add one to y
SNE VB, F_UP
LD V3, #F0 ; if up, substract 1 from y
SNE VB, F_LEFT
LD V3, #FF ; if left, subtract 1 from x
LD V1, VC
ADD V1, V3 ; adjust
LD VF, #F0
AND V1, VF
SNE V1, #F0 ; if gone off top
JP ENDGAME
SNE V1, #60 ; if gone off bottom
JP ENDGAME
LD V1, VC
ADD V1, V3
LD VF, #0F
AND V1, VF
SNE V1, #0F ; if gone off left
JP ENDGAME
SNE V1, #0A ; if gone off right
JP ENDGAME
ADD VC, V3
CALL GETBOXTYPE
RET
; Get a new preview box and update list
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m) , (out) box type dropped
; V3 := --- (m)
; V4 := --- (m)
; V5 := --- (m)
NEWPREV: LD V1, VA
JP GOTIT
GETRANDBLK: RND V1, 7 ; randomly determine new box
SHR V0
SHR V0
SNE V0, 0 ; if favoring corners (V0 = 0,1,2,3)
SHR V1 ; divide offset by 2
GOTIT: LD I, RANDBLK
ADD I, V1
LD V0, [I]
LD V5, V0 ; store new box type in V5
LD V4, 3 ; top preview box coord
LD V3, 0
NEXTPREV: LD I, PBOXINFO ; shift old box graphics down
ADD I, V3
LD V0, [I]
LD V2, V0
CALL GETBITADDR ; erase old box graphic
LD V0, 4
DRW V0, V4, 8
LD I, PBOXINFO
ADD I, V3
LD V0, V5
LD [I], V0
CALL GETBITADDR ; draw new box graphic
LD V0, 4
DRW V0, V4, 8
ADD V4, 12
LD V5, V2
ADD V3, 1
SE V3, 5
JP NEXTPREV
RET
; Write the score to screen
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m)
; V3 := --- (m)
; V4 := --- (m)
; V7 := (in) score
WRITESCORE: LD V3, 105 ; x pos
LD V4, 9 ; y pos
LD I, SCORE ; write BCD
LD B, V8 ; of hundred score to memory
LD V2, [I] ; read BCD
LD F, V2 ; point to sprite of hundreds digit
DRW V3, V4, 5
ADD V3, 6
LD I, SCORE ; write BCD
LD B, V7 ; of tens and ones score to memory
LD V2, [I] ; read BCD
LD F, V1 ; point to sprite of tens digit
DRW V3, V4, 5
ADD V3, 6
LD F, V2 ; point to sprite of ones digit
DRW V3, V4, 5
RET
; Write the level to screen
; V0 := --- (m)
; V1 := --- (m)
; V2 := --- (m)
; V3 := --- (m)
; V4 := --- (m)
; VE := (in) level
WRITELEVEL: LD V0, VE ; convert speed to game level
ADD V0, #FE
SHR V0
SHR V0
LD V1, 20
SUB V1, V0
LD I, SCORE ; write BCD
LD B, V1 ; of level to memory
LD V2, [I] ; read BCD
DB #F1, #30 ; point to sprite of tens digit
LD V3, 104
LD V4, 50
DRW V3, V4, 10
ADD V3, 11
DB #F2, #30 ; point to sprite of ones digit
DRW V3, V4, 10
RET
; ******************
; START OF DATA AREA
; ******************
RBORDER: DW #F8F8
PRV1BOX: DW #C0C0, #C0C0, #C0C0, #C0C0, #C0C0, #C0FF
PRV2BOX: DW #0303, #0303, #0303, #0303, #0303, #03FF
LEVEL: DW #0000
ZEROBOX: DW #0000, #0000, #0000, #0000 ;0 blank box
VERTBOX: DW #C3C3, #C3C3, #C3C3, #C3C3 ;1 vertical pipe
HORZBOX: DW #FFFF, #0000, #0000, #FFFF ;2 horizontal pipe
CROSBOX: DW #C3C3, #0000, #0000, #C3C3 ;3 crossing pipes
FULLBOX: DW #FFFF, #FFFF, #FFFF, #FFFF ;4 full box
SWBOX: DW #FFFF, #0F07, #0303, #83C3 ;5 south to west pipe
SEBOX: DW #FFFF, #F0E0, #C0C0, #C1C3 ;6 south to east pipe
ESTRBOX: DW #FFFF, #C0C0, #C0C0, #FFFF ;7 east open start pipe
WSTRBOX: DW #FFFF, #0303, #0303, #FFFF ;8 west open start pipe
NSTRBOX: DW #C3C3, #C3C3, #C3C3, #FFFF ;9 north open start pipe
SSTRBOX: DW #FFFF, #C3C3, #C3C3, #C3C3 ;A south open start pipe
GRID: DW #007E, #4242, #4242, #7E00 ;11 (B) empty grid site
TEMP: DW #0000, #0000, #0000, #0000 ;12 (C) temp memory area
NEBOX: DW #C3C1, #C0C0, #E0F0, #FFFF ;13 (D) north to east pipe
NWBOX: DW #C383, #0303, #070F, #FFFF ;14 (E) north to west pipe
CROSSHAIR: DW #0000, #183C, #3C18, #0000 ;15 (F)
SIDEPADL: DW #0010, #1070, #7010, #1000
BOTTPADL: DW #0018, #187E
VERTMOVE: DW #1800 ; bitmap of vertical flow
SEFLOW: DW #0804
NEFLOW: DW #0408
SWFLOW: DW #1020
NWFLOW DW #2010
RANDBLK: DW #1D15, #161E, #0102, #0303 ; used for random block select
RANDDIR: DW #0607, #0508, #0009, #030A ; used for random direction
PBOXINFO: DW #0000, #0000, #0000 ; preview box info
SCORE: DW #0000, #0000 ; total score storage
TSCORE: DW #0000, #0000 ; temp score area
TITLE: DW #A3A2, #E3A2, #AABB, #9293, #123A
TITLE2: DW #BBA2, #B322, #3A88, #8888, #4048
HDSCORE: DW #D992, #D252, #D93B, #AAB3, #AA2B
HDLEVEL: DW #9A92, #9A91, #D9B4, #A4B4, #2436
HDOVER: DW #EAAA, #AEA4, #E4EE, #8ACE, #89E9
DROP: DW #2020, #70F8, #F8F8, #7000
BOXINFO: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; 60x2 array for
X1: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; storage of grid
X2: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; placements and
X3: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; flow control
X4: DW #0B00, #0B00, #0B00, #0B00, #0B00
X5: DW #0B00, #0B00, #0B00, #0B00, #0B00
X6: DW #0B00, #0B00, #0B00, #0B00, #0B00
X7: DW #0B00, #0B00, #0B00, #0B00, #0B00
X8: DW #0B00, #0B00, #0B00, #0B00, #0B00
X9: DW #0B00, #0B00, #0B00, #0B00, #0B00
X10: DW #0B00, #0B00, #0B00, #0B00, #0B00
X11: DW #0B00, #0B00, #0B00, #0B00, #0B00
--
Paul Raines
Georgia Institute of Technology, Atlanta Georgia, 30332
uucp: ...!{decvax,hplabs,ncar,purdue,rutgers}!gatech!prism!vapsppr
Internet: vapsppr@prism.gatech.edu