--- title: "Post Mania" id: 70817 type: "computer_media" slug: "post-mania" url: "http://localhost/computer_media/post-mania/" markdown_url: "http://localhost/computer_media/post-mania.md" published_at: "2026-08-23T15:08:04+00:00" modified_at: "2026-08-23T20:53:26+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/08/Post-Mania.png" alt: "Post Mania screen" excerpt: "Guide Harold through a hazard-filled post office — dodging conveyors, tractor, and trap doors — to recover his letters before the one o'clock mail delivery." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Bret Richdale" slug: "bret-richdale" taxonomy: "indiv" url: "http://localhost/indiv/bret-richdale/" genre: - name: "Arcade" slug: "arcade" taxonomy: "genre" url: "http://localhost/type/arcade/" media_type: "Program" programmers: - name: "Bret Richdale" slug: "bret-richdale" taxonomy: "indiv" url: "http://localhost/indiv/bret-richdale/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Post%20Mania%20%281985%29%28Richdale%2C%20Bret%29%28TS2068%29%28UK%29%28Program%29.zip" mediadate: "1985" images: - url: "http://localhost/wp-content/uploads/2026/08/Post-Mania.png" alt: "Post Mania screen" media_type_tags: "Arcade" --- # Post Mania 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 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. ## 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-(mrow2)+(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 ```