Post Mania

Developer(s): Bret Richdale
Date: 1985
Type: Program
Platform(s): TS 2068
Tags: Arcade

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 RangePurpose
1–8User-defined functions and variable initialization
10Entry point — jumps to initialization at 9000
20–50Machine code call wrappers and conveyor belt movement logic
60–80Stamp machine subroutine
90–120Trap door subroutine
130–155Tractor movement subroutine
165–290Player movement (upper zone, above conveyors)
300–440Player movement (lower zone, on conveyors)
510–530Score update subroutine
555–580Timer/clock subroutine
600–650Centered text printing subroutine
4010–4120Post box / exit screen draw
5005–5499Game-over (failure) sequence with music
5505–5810Success sequence with Harold animation and music
6005–6080Death/respawn handler
6510–6990Game variable initialization
7010–7250Main game screen draw
7510–7999Title screen and instructions
8002–8530Machine code loader, character set copy, custom graphics poke
9002–9120Main 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 by a to produce elapsed time in scaled units.
  • FN t(a) — combines the two, returning INT(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 RESTORE statement 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,60 sets the system variable KSTATE+6 to configure the keyboard repeat rate; POKE 23607,249 appears 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 uppercase DATA "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 was GO TO 200*(mrow<7)+300*(mrow>=7) using addition rather than multiplication.

Content

Appears On

Related Products

Related Articles

Related Content

Image Gallery

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.

Scroll to Top