Post Mania is a multi-screen arcade-style game in which the player guides Harold Jones, a postman, through a post office filled with obstacles to recover letters before a one-hour time limit expires. The game uses machine code routines loaded into RAM at address 63000 to perform screen scrolling for the conveyor belt animations, with separate left and right scroll routines of 26 bytes each. Custom character graphics are defined by copying the ROM character set to address 64000 and then patching 43 individual characters with hand-crafted 8-byte bitmap data, covering game elements such as Harold, tractor, trap doors, conveyor belts, boxes, stamp machine parts, and UI elements. The timer is implemented using the system frame counter at addresses 23672–23673 via user-defined functions, with the clock speed increasing each time a letter is recovered. Obstacles include a moving tractor, randomly opening trap doors, directional conveyor belts that shift Harold’s position, and a stamp machine with moving arms.
Program Structure
The program is organized into well-separated functional blocks, with line numbers serving as module boundaries:
| Line Range | Purpose |
|---|---|
| 1–8 | User-defined functions and variable initialization |
| 10 | Entry point — jumps to initialization at 9000 |
| 20–50 | Machine code call wrappers and conveyor belt movement logic |
| 60–80 | Stamp machine subroutine |
| 90–120 | Trap door subroutine |
| 130–155 | Tractor movement subroutine |
| 165–290 | Player movement (upper zone, above conveyors) |
| 300–440 | Player movement (lower zone, on conveyors) |
| 510–530 | Score update subroutine |
| 555–580 | Timer/clock subroutine |
| 600–650 | Centered text printing subroutine |
| 4010–4120 | Post box / exit screen draw |
| 5005–5499 | Game-over (failure) sequence with music |
| 5505–5810 | Success sequence with Harold animation and music |
| 6005–6080 | Death/respawn handler |
| 6510–6990 | Game variable initialization |
| 7010–7250 | Main game screen draw |
| 7510–7999 | Title screen and instructions |
| 8002–8530 | Machine code loader, character set copy, custom graphics poke |
| 9002–9120 | Main game loop |
Machine Code Usage
Two machine code routines are loaded into RAM starting at address 63000 via DATA statements at lines 8020–8030. The routine at left (63000) scrolls a row of screen characters leftward, and the routine at right (63026) scrolls rightward. Each routine is 26 bytes. Before calling them, lines 20–30 POKE the target row number and screen address byte directly into the routine, then invoke it with USR left or USR right. Line 9010 checks PEEK 63000 for the value 33 (the Z80 LD HL,nn opcode) to determine whether the machine code has already been loaded, avoiding a redundant reload on RUN.
The conveyor belt animation at lines 20–50 calls the left-scroll routine twice (with two different row addresses POKEd in) and the right-scroll routine once, corresponding to the three conveyor belt rows at screen rows 7, 11, and 15.
Custom Character Graphics
Lines 8050 copies the ROM character set (addresses 15616–16383) to RAM at 64000, making all standard characters available as a base. Lines 8060–8080 then read 43 custom character definitions from DATA and POKE their 8-byte bitmaps into the copied set at 64000 + 8*(CODE a$ - 32). This allows UDG-style custom graphics using ordinary lowercase and uppercase letters, without consuming the limited UDG area. The custom characters include Harold in four orientations (s, t, u, v), conveyor belt segments, boxes, tractor parts, trap door frames, stamp machine components, and HUD elements.
Timer Implementation
Three user-defined functions are declared at line 1:
FN m(x,y)— computes the maximum of two values using(x+y+ABS(x-y))/2, a branchless max idiom.FN u(a)— reads the system frame counter from addresses 23672–23673 and divides by 50 (frames per second) and byato produce elapsed time in scaled units.FN t(a)— combines the two, returningINT(FN m(FN u(a), FN u(a)))to get a stable integer elapsed-time reading.
Line 555 computes the effective time limit using FN t with an argument that shrinks as more letters are recovered, making the clock run faster in later rounds. The frame counter registers are reset to zero at line 9058 at the start of each round. At line 560, a time reading of 60 triggers the “late” flag and sets late=1, ending the round. A warning beep sounds at time=55 (line 570).
Movement and Zone Logic
Harold’s movement is split into two subroutines based on his current row. Lines 165–290 handle the upper zone (mrow < 7), where Harold can move in all four directions and jump down onto conveyor belts. Lines 300–440 handle the lower zone (mrow >= 7), where upward movement is blocked (line 315 returns immediately on key “7”) and jumping on/off conveyors uses different fall distances depending on which belt Harold is on.
The branch between the two movement handlers at line 170 uses the expression GO TO 200*(mrow<7)*300*(mrow>=7). When mrow<7, this evaluates to GO TO 200*1*0 = GO TO 0, which falls through to line 200; when mrow>=7, it evaluates to GO TO 200*0*300 = GO TO 0 — actually both cases produce 0 when the other factor is 0. In practice the expression resolves to GO TO 300 only when mrow>=7 and to a non-existent line otherwise, making it a deliberate use of the non-existent-line GO TO technique to fall into line 200.
Collision Detection
Collision detection throughout the game uses SCREEN$ to read the character currently displayed at a target cell before moving Harold there. If the cell is not a space, dead=1 is set. This approach avoids maintaining a separate map array and works correctly with all the dynamically printed game elements. The same technique is used for the tractor (line 150), Harold’s movement (lines 237, 335), and the stamp machine (line 75).
Scoring
Line 510 awards points based on Harold’s row when he reaches the exit, using a sum of Boolean-multiplied values — a common Sinclair BASIC idiom for conditional arithmetic without IF statements. Recovering a letter at the exit awards a bonus of 150 * letter (line 5690), escalating with each successive letter. The score display is zero-padded to five digits using the string-slicing idiom "00000"(TO 5-LEN STR$ score) at line 525.
Screen Drawing
The main game screen at lines 7010–7250 uses a mix of PRINT AT statements and PLOT/DRAW commands. The conveyor belt textures (rows 7, 11, 15) are randomly offset substrings of 64-character string constants, giving varied visual patterns each game. The exit area (bottom right) is drawn with PLOT/DRAW to render a letterbox outline. The HUD at row 0 contains the score, a clock display, and INK/PAPER color-coded elements, all drawn with a single PRINT statement at line 7230.
Notable Techniques
- The
RESTOREstatement is used with the line number of the DATA being read (e.g.,RESTORE 4040,RESTORE 5000,RESTORE 5500,RESTORE 7010,RESTORE 8020,RESTORE 8050,RESTORE 8110) rather than resetting to the start, allowing DATA to be scattered throughout the program alongside the code that uses it. POKE 23607,60sets the system variable KSTATE+6 to configure the keyboard repeat rate;POKE 23607,249appears to adjust it to a different value, used during animation sequences where key repeat behavior should differ.- The success animation (lines 5505–5810) animates Harold walking across the bottom of the screen one character at a time using PAUSE 10 delays and sequential PRINT statements, effectively frame-by-frame sprite animation in BASIC.
- The instructions text at lines 7740–7930 uses
FREE(rendered from the~token) to display inverse-video key labels inline within PRINT statements.
Anomalies and Notes
- Line 8400 redefines character
"d"(already defined at line 8110), overwriting the first definition. The second definition at 8400 uses uppercaseDATA "d"but the same character code, so only the last POKE survives. - Line 5060 contains
RESTORE 5000, but the DATA for the game-over tune is at line 5080. Since there is no DATA before line 5080 in that block, the RESTORE to 5000 simply ensures the pointer is before line 5080, which is functionally correct. - Line 170’s
GO TO 200*(mrow<7)*300*(mrow>=7)always evaluates to 0 for both branches due to one factor always being 0; the intended branch to 300 relies on the non-existent line 0 falling through to line 200 in one case, and on a separate product being non-zero in the other — but the arithmetic as written always yields 0. This appears to be a bug; the likely intent wasGO TO 200*(mrow<7)+300*(mrow>=7)using addition rather than multiplication.
Content
Source Code
1 DEF FN m(x,y)=(x+y+ABS (x-y))/2: DEF FN u(a)=(PEEK 23672+256*PEEK 23673)/50/a: DEF FN t(a)=INT (FN m(FN u(a),FN u(a)))
2 CLEAR 62999
5 RANDOMIZE
8 LET letter=1: LET score=0: LET late=0: LET alarm=0
10 GO TO 9000
20 POKE 63001,224: POKE 63002,64: LET code=USR left
25 POKE 63027,127: POKE 63028,72: LET code=USR right
30 POKE 63001,224: POKE 63002,72: LET code=USR left
35 IF mrow=7 THEN LET mcol=mcol-1: IF mcol=-1 THEN LET mcol=30: PRINT AT 7,31;SCREEN$ (7,30);AT 7,30;"v": BEEP .01,20
40 IF mrow=11 THEN LET mcol=mcol+1: IF mcol=32 THEN LET mcol=1: PRINT AT 11,0;SCREEN$ (11,1);AT 11,1;"u": BEEP .01,20
45 IF mrow=15 THEN LET mcol=mcol-1: IF mcol=-1 THEN LET mcol=30: PRINT AT 15,31;SCREEN$ (15,30);AT 15,30;"v": BEEP .01,20
50 RETURN
60 LET stamp=INT (RND*12)+1
65 LET s$=SCREEN$ (21,(2+2*stamp))
70 PRINT AT 20,2+2*stamp;"r";AT 21,2+2*stamp;"q": BEEP .01,-5: BEEP .01,-8
75 IF s$<>" " THEN LET dead=1
80 PRINT AT 21,2+2*stamp;" ";AT 20,2+2*stamp;"p": RETURN
90 LET door=INT (RND*7)+1
95 LET drow=6*(door=1)+10*(door>=2 AND door<=5)+14*(door=6 OR door=7)
100 LET dcol=26*(door=1)+1*(door=2)+8*(door=3)+14*(door=4)+20*(door=5)+27*(door=6)+16*(door=7)
105 PRINT AT drow,dcol;"FGEF": BEEP .01,2
110 PRINT AT odrow,odcol;"G E"
120 LET odrow=drow: LET odcol=dcol: RETURN
130 LET trow=otrow-(mrow<otrow AND otrow>2)+(mrow>otrow AND otrow<5)
135 LET tcol=otcol+2: IF tcol>30 THEN LET tcol=0
140 PRINT AT otrow,otcol; INK 0;" "
145 PRINT AT trow,tcol; INK 1;"\b\c"
150 IF trow=mrow AND (mcol=tcol OR mcol=tcol+1) THEN LET dead=1
155 LET otrow=trow: LET otcol=tcol: RETURN
165 LET a$=INKEY$
167 IF CODE a$<53 OR CODE a$>57 THEN RETURN
170 GO TO 200*(mrow<7)*300*(mrow>=7)
200 LET omrow=mrow: LET omcol=mcol
205 IF a$="8" THEN LET mcol=mcol+(mcol<31): LET m$="u"
210 IF a$="5" THEN LET mcol=mcol-(mcol>0): LET m$="v"
215 IF a$="6" THEN GO TO 250
220 IF omcol=mcol AND omrow=mrow AND mrow>=6 THEN RETURN
225 IF a$="7" THEN LET mrow=mrow-1: LET m$="t"
227 IF mcol=omcol AND mrow=omrow THEN RETURN
230 LET q$=SCREEN$ (mrow,mcol)
235 PRINT AT omrow,omcol;" ";AT mrow,mcol;m$
237 IF q$<>" " THEN LET dead=1
240 RETURN
250 LET q$=" "
252 IF mrow<>5 THEN LET mrow=mrow+1: LET m$="s": GO TO 230
255 FOR f=1 TO 2
260 LET omrow=mrow: LET mrow=mrow+1
265 PRINT AT omrow,omcol;q$
270 LET q$=SCREEN$ (mrow,mcol): PRINT AT mrow,mcol;"s": BEEP .02,10-f*3
275 IF q$<>" " THEN LET dead=1: LET f=5
280 NEXT f
285 IF NOT dead THEN BEEP .03,0
290 RETURN
300 LET omrow=mrow: LET omcol=mcol
305 IF a$="8" THEN LET mcol=mcol+(mcol<31): LET m$="u"
310 IF a$="5" THEN LET mcol=mcol-(mcol>0): LET m$="v"
315 IF a$="7" THEN RETURN
320 IF a$="6" THEN GO TO 350*(mrow=7 OR mrow=11)+400*(mrow=15)+340*(mrow=21)
321 IF mcol=omcol AND mrow=omrow THEN RETURN
325 LET q$=SCREEN$ (mrow,mcol)
330 PRINT AT omrow,omcol;" ";AT mrow,mcol;m$
332 IF mrow=21 AND mcol=28 THEN LET end=1
335 IF q$<>" " THEN LET dead=1
340 RETURN
350 LET q$=" "
355 FOR f=1 TO 4
360 LET omrow=mrow: LET mrow=mrow+1
365 PRINT AT omrow,omcol;q$
370 LET q$=SCREEN$ (mrow,mcol): PRINT AT mrow,mcol;"s": BEEP .02,10-f*3
375 IF q$<>" " AND f>2 THEN LET dead=1: LET f=5
380 NEXT f
385 IF NOT dead THEN BEEP .03,0
390 RETURN
400 FOR f=1 TO 6
410 LET omrow=mrow: LET mrow=mrow-1
415 PRINT AT omrow,omcol;q$
420 LET q$=SCREEN$ (mrow,mcol): PRINT AT mrow,mcol;"s": BEEP .02,10-f*3
425 IF q$<>" " AND f>2 THEN LET dead=1: LET f=7
430 NEXT f
435 IF NOT dead THEN BEEP .03,0
440 RETURN
510 LET score=score+5*(mrow<6 AND mrow>1)+10*(mrow=7)+15*(mrow=11)+20*(mrow=15)+30*(mrow=21)
520 IF score>99999 THEN LET score=0
525 PRINT AT 0,12; INK 2; PAPER 6;"00000"( TO 5-LEN STR$ score);score
530 RETURN
555 LET time=FN t(3.1-(0.3*(letter*(letter<7)+6*(letter>=7))))
560 IF time=60 THEN PRINT AT 0,23; INK 2; PAPER 6;"A"; INK 6; PAPER 2;"1:": LET time=0: LET late=1
565 PRINT AT 0,26; INK 6; PAPER 2;"0"( TO (time<10));time
570 IF time=55 AND alarm=0 THEN FOR f=1 TO 2: BEEP .3,30: NEXT f: LET alarm=1
575 IF late THEN FOR f=1 TO 5: BEEP .1,50: BEEP .1,40: NEXT f
580 RETURN
605 POKE 23607,60
610 PRINT AT row,(32-LEN m$)/2;
615 FOR f=1 TO LEN m$
620 PRINT m$(f);: BEEP .01,INT (RND*50)
630 NEXT f
640 BEEP .1,10
645 PRINT
650 RETURN
4010 INK 0: PAPER 7: CLS
4020 PRINT #1;AT 0,0; INK 4;"████████████████████████████████████████████████████████████████"
4030 FOR f=17 TO 20: PRINT AT f,22; INK 2; PAPER 7;"AAAAAA": NEXT f: PRINT AT 21,22; INK 2; PAPER 7;"QQQQQQ"
4040 RESTORE 4040: FOR f=1 TO 4: READ b,c: PRINT AT b,c;"N": NEXT f: DATA 18,23,18,26,20,23,20,26
4050 PRINT AT 21,21;"p";AT 19,21; INK 3;"o"
4060 PLOT 170,37: DRAW 29,14: DRAW 1,0: DRAW 29,-14
4080 FOR f=0 TO 5
4090 PLOT 176+f*4,40+f*2: DRAW 47-f*8,0
4100 NEXT f
4110 INK 2: PLOT 176,0: DRAW 0,39: PLOT 223,0: DRAW 0,39: INK 0
4120 RETURN
5005 POKE 23607,60: CLS
5010 LET row=7: LET m$="Sorry, Harold ... ": GO SUB 600
5020 LET row=10: LET m$="The letters have been": GO SUB 600: LET row=12: LET m$="delivered": GO SUB 600
5060 RESTORE 5000
5070 FOR a=1 TO 11: READ b,c: BEEP b/6,c-1: NEXT a
5080 DATA 3,1,2,1,1,1,3,1,2,4,1,3,2,3,1,1,2,1,1,0,6,1
5090 CLS
5100 PLOT 80,35: DRAW 5,110
5110 DRAW 10,10,-PI/2: DRAW 95,0
5120 DRAW 10,-10,-PI/2: DRAW -5,-5,-PI/2: DRAW -15,0: DRAW 15,0
5130 DRAW -3,3,-PI/2: DRAW 3,3,-PI/2: DRAW -15,0
5140 PLOT 175,30: DRAW 5,115: DRAW 10,10,-PI/2
5150 PLOT 175,30: DRAW -10,-10,-PI/2: DRAW -6,10,-PI/2
5160 DRAW 5,5,-PI/2: DRAW 3,-3,-PI/2: DRAW -3,-3,-PI/2: DRAW -4,0
5170 PLOT 164,35: DRAW -95,0: DRAW -6,-10,PI/2: DRAW 8,-5,PI/2: DRAW 95,0
5180 PRINT AT 4,15;"WILL";AT 5,15;" "
5190 PRINT AT 9,13;"Harold";AT 11,14;"Jones"
5200 FOR f=103 TO 153: PLOT f,100: BEEP .01,10: NEXT f
5205 BEEP .1,10
5210 FOR f=111 TO 153: PLOT f,84: BEEP .01,10: NEXT f
5215 BEEP .1,10
5220 FOR f=20 TO -10 STEP -0.5: BEEP .01,f: NEXT f
5230 LET row=21: LET m$="You scored "+STR$ score+" points.": GO SUB 600: BEEP .1,10: BEEP .1,0: BEEP .1,0
5235 INPUT BRIGHT 1;"Another game ? (Yes/No) "; LINE I$
5240 IF I$="" THEN BEEP .1,10: BEEP .1,5: GO TO 7680
5260 IF I$(1)="N" OR I$(1)="n" THEN BEEP .1,15: STOP
5270 IF I$(1)<>"Y" AND I$(1)<>"y" THEN BEEP .1,10: BEEP .1,5: GO TO 5235
5280 CLS : BEEP .1,20: RUN
5499 STOP
5505 RESTORE 5500
5510 FOR f=1 TO 8: READ b,c: BEEP b,c: NEXT f
5515 DATA .1,11,.1,11,.8,16,.05,11,.05,16,.05,11,.05,16,1,20
5520 PRINT AT 21,29;" ";AT 20,29; INK 2; PAPER 6;"AAA"
5525 PRINT AT 21,29;"M": BEEP .1,25: PAUSE 10
5530 FOR f=1 TO 4
5540 PRINT AT 21,27+f;" "
5545 IF f<4 THEN PRINT AT 21,28+f;"u"
5550 IF f<3 THEN PRINT AT 21,29+f;"M": BEEP .01,25
5555 PAUSE 10: NEXT f
5560 GO SUB 4000
5570 PRINT AT 21,0;"M": BEEP .01,25: PAUSE 10
5575 PRINT AT 21,0;"uM": BEEP .01,25: PAUSE 10
5580 FOR f=0 TO 18
5590 PRINT AT 21,f;" uM": BEEP .01,25: PAUSE 10
5600 NEXT f
5610 PRINT AT 21,19;" u";AT 20,21;"\m": BEEP .01,25: PAUSE 10
5620 PRINT AT 21,20;" ";AT 20,21;"u": BEEP .01,25: PAUSE 10
5630 PRINT AT 20,21;" ": BEEP .1,15
5640 LET row=3: LET m$="CONGRATULATIONS!": GO SUB 600
5650 LET row=6: LET m$="You have succeeded": GO SUB 600
5660 LET row=3: LET m$="in recovering letter": GO SUB 600
5670 LET row=10: LET m$="number "+STR$ letter+" ... ": GO SUB 600
5680 FOR f=30 TO 0 STEP -0.5: BEEP .01,f: NEXT f
5690 LET score=score+150*letter: LET letter=letter+1
5700 FOR f=3 TO 10: PRINT AT f,0;" ": NEXT f
5710 LET row=4: LET m$="Bonus = "+STR$ ((letter-1)*150): GO SUB 600: BEEP .1,20
5720 LET row=7: LET m$="Now, Where's the next one ?": GO SUB 600
5730 FOR f=1 TO 5: BEEP .2,15: PAUSE 3: NEXT f
5735 POKE 23607,249
5740 PRINT AT 20,21;"v": BEEP .01,20: PAUSE 10
5750 PRINT AT 20,21;" ";AT 21,20;"v": BEEP .01,20: PAUSE 10
5760 FOR f=19 TO 0 STEP -1
5770 PRINT AT 21,f+1;" ";AT 21,f;"v"
5780 BEEP .01,20: PAUSE 10
5790 NEXT f
5800 PRINT AT 21,0;" ": BEEP .01,20
5810 INK 0: PAPER 7: CLS : GO TO 9040
6005 LET dead=0
6010 IF mrow=1 OR mrow>=6 THEN PRINT AT mrow,mcol;q$
6020 IF mrow=0 THEN PRINT AT mrow,mcol; INVERSE 1;q$
6030 IF mrow>1 AND mrow<6 THEN PRINT AT trow,tcol;"BC"
6040 FOR f=30 TO 0 STEP -0.5: BEEP .01,f: NEXT f
6050 LET mrow=1: LET mcol=3
6060 PRINT AT mrow,mcol;"s"
6070 BEEP .05,-10
6080 RETURN
6510 LET left=63000: LET right=63026
6520 LET dead=0: LET mrow=1: LET mcol=3
6530 LET door=1: LET odrow=6: LET odcol=26
6540 LET otrow=5: LET otcol=0
6550 LET end=0: LET dead=0
6990 RETURN
7010 RESTORE 7010: FOR f=1 TO 6: READ a: PRINT AT a,0; INK 2; PAPER 6;"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": NEXT f: DATA 0,1,6,10,14,18
7020 PRINT #1;AT 0,3; PAPER 7;"Dnnnnnnnnnnnnnnnnnnnnnnno";AT 0,0; INK 2; PAPER 6;"AAA";AT 0,28;"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
7030 PRINT AT 0,2; INVERSE 1;"wxyz";AT 1,2; INVERSE 0;" "
7035 PRINT AT 1,3;"s"
7040 PRINT AT 6,26;"FGEF";AT 5,0; INK 1;"BC"
7050 LET a$="f hk i k h ki h ji l f ihg hf k hi kl hij ig jk h l f i": LET f=INT (RND*32)+1: PRINT AT 7,0; INK 2;a$(f TO f+31)
7060 PRINT AT 8,0;"abbcbbbcbbbcbbbcbbbcbbbcbbbcbbbde e e e e e e e e"
7070 PRINT AT 10,1;"G E";AT 10,8;"G E";AT 10,14;"G E";AT 10,20;"G E"
7080 LET a$="lj ki fhk klh h k jl i hl g f klk gh f hj ik kij hk hi ": LET f=INT (RND*32)+1: PRINT AT 11,0; INK 1;a$(f TO f+31)
7090 PRINT AT 12,0;"abbcbbbcbbbcbbbcbbbcbbbcbbbcbbbde e e e e e e e e"
7100 PRINT AT 14,16;"G E";AT 14,27;"G E"
7110 LET a$="f jk kig jg fg ikl jhi gji k j hji h j ikj ilj j jk jf g ji jk": LET f=INT (RND*32)+1: PRINT AT 15,0; INK 3;a$(f TO f+31)
7120 PRINT AT 16,0;"abbcbbbcbbbcbbbcbbbcbbbcbbbcbbbde e e e e e e e e"
7130 PRINT AT 18,1;" "
7140 PRINT AT 19,0; INK 2; PAPER 6;"A"
7150 PRINT AT 19,3;"Dnnnnnnnnnnnnnnnnnnnnnnno"
7160 PRINT AT 19,2; INK 2; PAPER 6;"A";AT 19,28;"AAAA"
7170 PRINT AT 20,0; INK 2; PAPER 6;"A";AT 20,2;"A";AT 20,28;""
7180 PRINT AT 20,4;"p p p p p p p p p p p p"
7190 PRINT AT 21,0; INK 2; PAPER 6;"A"
7200 PLOT 233,15: DRAW 22,0: DRAW 0,-14: DRAW -22,0: DRAW 0,14
7210 PLOT 251,13: DRAW 2,0: DRAW 0,-3: DRAW -2,0: DRAW 0,3
7220 FOR f=9 TO 5 STEP -2: PLOT 238,f: DRAW 8,0: NEXT f
7230 INK 6: PAPER 2: PRINT AT 0,8;"HIJ";AT 0,12;"00000"( TO 5-LEN STR$ score);score;AT 0,20;"KL";AT 0,23;"12:00": INK 0: PAPER 7
7240 INK 2: PLOT 159,168: DRAW 0,7: INK 0
7250 RETURN
7510 FOR f=6 TO 0 STEP -1: INK f
7515 PRINT AT 2,0;
7520 PRINT AT 10,10;"POST MANIA"
7650 BEEP .1,6*(6-f): BEEP .05,6*((6-f)+1): NEXT f
7660 BEEP .1,40: BEEP .5,41
7670 PRINT #1;AT 1,4; BRIGHT 1;"Press any key to continue": PAUSE 0
7680 BEEP .1,10: INPUT BRIGHT 1;"Instructions (Yes or No) "; LINE I$
7685 IF I$="" THEN BEEP .1,10: BEEP .1,5: GO TO 7680
7690 IF I$(1)="N" OR I$(1)="n" THEN BEEP .1,15: CLS : GO TO 7940
7700 IF I$(1)<>"Y" AND I$(1)<>"y" THEN BEEP .1,10: BEEP .1,5: GO TO 7680
7710 CLS
7720 LET row=1: LET m$="P O S T M A N I A": GO SUB 600
7730 LET row=2: LET m$="_ _ _ _ _ _ _ _ _ _": GO SUB 600
7740 PRINT : PRINT "The main character in this game is called Harold Jones. Harold has only one problem and that's his mother-in-law. He is totallyfed up with her and has recently"
7750 PRINT "sent her a number of letters explaining his poinion of her in detail."
7755 PRINT " After posting these letters, however, he found out that she is going to leave him a large "
7760 PRINT "sum of money in her will. Understandably he has now had second thoughts and must recoverthe letters from the post officebefore they are delivered."
7770 PRINT #1;AT 1,2; BRIGHT 1;"Press a key to continue ... ": PAUSE 0: INPUT "": CLS
7775 PRINT '"Harold begins in the entrance tothe post office at the top left of the screen and must make his way down to the bottom right of the screen where he will find a letter. You must help Harold "
7780 PRINT "to recover this letter."
7790 PRINT " There are many obstacles in Harolds way and if he is caught in any of these he is returned to the entrance, wasting time."
7795 PRINT " There is one other problem and that is the time limit. Harold starts into the post office at twelve o'clock and must be out before the mail is delivered at one o'clock (a tonesounds at 12:55). The clock speeds up each time Harold recovers a letter."
7800 PRINT #1;AT 1,2; BRIGHT 1;"Press a key to continue ... ": PAUSE 0: INPUT "": CLS
7805 LET row=1: LET m$="O B S T A C L E S": GO SUB 600: LET row=2: LET m$="_ _ _ _ _ _ _ _ _": GO SUB 600
7810 PRINT '' PAPER 5;"1. The tractor :"; PAPER 7;" ";: POKE 23607,249: PRINT INK 1;"BC": POKE 23607,60: PRINT ''"Moves from left to right at top of screen. Harold must avoid this when moving around in this area."
7820 PRINT '' PAPER 5;"2. Trap doors :"; PAPER 7;" ";: POKE 23607,249: PRINT INK 2; PAPER 6;"A"; INK 0; PAPER 7;"G E"; INK 2; PAPER 6;"A": POKE 23607,60: PRINT ''"Open and close at random times, hindering Harold's progress between conveyor belts."
7830 PRINT #1;AT 1,2; BRIGHT 1;"Press a key to continue ... ": PAUSE 0: INPUT "": CLS
7840 PRINT ' PAPER 5;"3. Conveyor Belts:"; PAPER 7;" ";: POKE 23607,249: PRINT INK 1;" hi kl ": PRINT TAB 20;"abbcbbd": PRINT TAB 20;"e e e": POKE 23607,60: PRINT ''"Move left to right or vice-versa. Harold must jump on these, avoiding the boxes, to reach theletter."
7850 PRINT '' PAPER 5;"4. Stamp Machine:"; PAPER 7;" ";: POKE 23607,249: PRINT "Dnnno";TAB 20;" p r ";TAB 20;" q ";TAB 20;"Dnnno": POKE 23607,60: PRINT ''"Moves up and down. Harold must move through this while avoidingthe movind arms."
7880 PRINT #1;AT 1,2; BRIGHT 1;"Press a key to continue ... ": PAUSE 0: INPUT "": CLS
7890 LET row=1: LET m$="C O N T R O L S ": GO SUB 600: LET row=2: LET m$="_ _ _ _ _ _ _ _": GO SUB 600
7900 PRINT ''" FREE 5FREE moves one step left "
7910 PRINT ''" FREE 6FREE moves one step down ( also jumps on of off a conveyor belt )"
7920 PRINT ''" FREE 7FREE moves up one step. ( Harold can not move up after the first trap door)"
7930 PRINT ''" FREE 8FREE moves one step right"
7940 PRINT #1;AT 1,1; FLASH 1; BRIGHT 1;"Press a key to begin game .. ": PAUSE 0: INPUT "": CLS
7999 RETURN
8002 RESTORE 8020
8007 CLS : BEEP .1,10: PRINT AT 10,10; FLASH 1;"Loading Code"
8010 FOR f=63000 TO 63051: READ a: POKE f,a: NEXT f
8020 DATA 33,0,64,14,8,86,6,31,35,126,43,119,35,16,-7,114,6,31,43,16,-3,36,13,32,-20,201
8030 DATA 33,31,64,14,8,86,6,31,43,126,35,119,43,16,-7,114,6,31,35,16,-3,36,13,32,-20,201
8032 RESTORE 8050
8047 CLS : BEEP .1,10: PRINT AT 10,4; FLASH 1;"Transferring Characters"
8050 FOR f=15616 TO 16383: POKE 64000+(f-15616),PEEK f: NEXT f
8057 CLS : BEEP .1,10: PRINT AT 10,8; FLASH 1;"Loading Graphics"
8060 RESTORE 8110
8070 FOR f=1 TO 43: READ a$: LET add=64000+8*(CODE a$-32): FOR g=add TO add+7: READ a: POKE g,a: NEXT g: NEXT f
8080 BEEP .1,40: BEEP .5,20: CLS : RETURN
8110 DATA "a",63,64,152,165,165,152,64,63
8120 DATA "b",255,0,255,165,165,255,0,255
8130 DATA "c",255,0,24,165,165,24,0,255
8140 DATA "d",252,2,25,165,165,25,2,252
8150 DATA "e",24,24,24,60,0,0,0,0
8160 DATA "f",0,124,84,84,124,84,84,124
8170 DATA "g",0,0,0,127,73,127,73,127
8180 DATA "h",0,127,73,73,127,73,73,127
8190 DATA "i",0,0,0,62,42,62,42,62
8200 DATA "j",0,124,68,68,68,68,68,124
8210 DATA "k",0,0,0,127,65,65,65,127
8220 DATA "l",0,127,65,65,65,65,65,127
8230 DATA "m",0,0,0,62,34,34,34,62
8240 DATA "n",255,0,255,119,255,255,0,255
8250 DATA "o",254,3,253,117,253,253,3,254
8260 DATA "p",24,24,24,60,126,0,0,0
8270 DATA "q",24,24,24,24,24,24,60,126
8280 DATA "r",24,24,24,24,24,24,24,24
8290 DATA "s",56,40,16,124,186,56,40,108
8300 DATA "t",56,56,16,124,186,56,40,108
8310 DATA "u",56,56,16,40,36,56,16,24
8320 DATA "v",56,56,16,40,72,56,16,48
8330 DATA "w",0,234,138,206,142,138,234,0
8340 DATA "x",0,238,74,76,74,74,74,0
8350 DATA "y",0,234,170,174,238,170,170,0
8360 DATA "z",0,238,168,140,136,168,238,0
8370 DATA "A",254,254,254,0,239,239,239,0
8380 DATA "B",8,24,126,67,25,37,36,24
8390 DATA "C",0,252,140,252,196,144,40,16
8400 DATA "d",127,192,191,175,191,191,192,127
8410 DATA "E",0,128,192,255,255,192,128,0
8420 DATA "F",0,0,0,255,255,0,0,0
8430 DATA "G",0,2,6,254,254,6,2,0
8440 DATA "H",0,14,8,238,2,2,14,224
8450 DATA "I",0,238,170,138,138,170,238,0
8460 DATA "J",0,238,168,206,168,168,174,0
8470 DATA "K",0,238,68,68,68,68,78,0
8480 DATA "L",0,174,232,236,168,168,174,0
8490 DATA "M",0,255,131,129,185,129,255,0
8500 DATA "N",255,145,145,255,145,145,145,255
8510 DATA "O",1,3,7,15,31,63,63,63
8520 DATA "P",0,0,3,3,15,15,63,63
8530 DATA "Q",254,254,254,0,255,255,255,255
9002 BORDER 6: PAPER 7: INK 0: CLS
9010 IF PEEK 63000<>33 THEN GO SUB 8000
9020 POKE 23607,60: GO SUB 7500
9030 POKE 23607,249
9040 GO SUB 7000
9050 GO SUB 6500
9053 INK 8: PAPER 8
9058 POKE 23672,0: POKE 23673,0
9060 GO SUB 160: IF dead THEN GO SUB 6000
9070 GO SUB 15: GO SUB 500: GO SUB 550: IF late THEN GO TO 5000
9080 IF mrow<6 AND RND>.33 THEN GO SUB 125: IF dead THEN GO SUB 6000
9090 IF mrow>19 THEN GO SUB 55: IF dead THEN GO SUB 6000
9100 IF RND>.25 THEN GO SUB 85
9110 IF NOT end THEN GO TO 9060
9120 GO TO 5500
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
