!0.......^.........^.........^.. !B \H11\H07\H10\H00 THROUGH THE \H11\H07\H10\H02 S Q U A R E \H11\H07\H10\H00 W I N D O W !2.......^.........^.........^.........^.........^.........^.... Lose yourself in machine code with the maestro herself. Toni Baker takes you one step nearer creating the perfect arcade game with another riotous routine. !0.......^.........^.........^.. NOTE !1.......^.........^.........^.........^........ >See also the letter "Short Cut to Amaze" from >issue #6, after the main article. This month I'm presenting an interesting little routine that fits happily into many a video game. The gist of it is really very simple - a 'window' appears in the top right-hand corner of the screen and on it you can see part of a maze. The cursor keys: '5', '6', '7' and '8' - without shift - will scroll the window over the maze in all four directions (actually eight directions because you can go diagonally by pressing two keys at once). In other words, the window allows you to see a smaller part of a much larger maze - by moving the window you can cover the whole maze, but you can never see all of it at once. So, what can you do with it? Well, as it stands you can probably have a bit of fun trying to find your way out of the maze - you start at the 'S' character and finish at the 'F'. The fact that you can only ever see part of the maze doesn't spoil the game - it just makes it that much harder! But if you wanted to, you could adapt the routine (or add more Basic) and make quite a comprehensive game. The window is always printed in the same place in black INK on white PAPER, but note that the normal PRINT position (as well as PAPER and INK colours) is totally unaffected by the machine code. The Basic is completely separate from the machine code. By calling the machine code from Basic you will scroll the window either not at all or by just one square; thus, if you want to move continuously, all you have to do is repeat- edly call the machine code routine, over and over again. Of course, any number of Basic lines may be placed between these calls. !0.......^.........^.........^.. !B SERIOUSLY NOW !1.......^.........^.........^.........^........ Just on the off chance that there are any serious machine code programmers reading this, you may be interested in the 'CALL HL=HL*DE' instruction used in the program. This is a sub- routine in the ROM which, as its name implies, multiplies HL by DE, leaving the result in HL. The BC and DE registers are unaffected, but the A register is corrupted. Once again, I've put question marks in the listing of the Hex codes, instead of absolute addresses - so you can locate the machine code anywhere you want to. Once you've decided where to put it you have to replace the question marks by the address of the instruction which has the label that I've specified. In other words - where it says 'CD???? CALL INC_COORD', you must replace the question marks with the address of the instruction labelled 'INC_COORD'. This address must be in Hex and with the bytes in reverse order. There are two variables used by the program which you can POKE from Basic if you want to. These are X_COORD and Y_COORD which store re- spectively the X and Y coordinate of the top left-hand corner of the window (relative to the top left-hand corner of the maze). X_COORD is stored in address 23728, and Y_COORD in 23729. So there you have it! No longer need you spend tiresome hours running round Hampton Court - now you can spend those tiresome hours wearing out your fingers instead. Happy head scratching! !2.......^.........^.........^.........^.........^.........^.... !B Machine code Assembler Comments ---------.---------.------------------.------------------------- 7E INC_COORD LD A,(HL) A:=coordinate to change FE18 CP Length-8 C8 RET Z Return if coordinate is at the maximum 34 INC (HL) Increment coordinate C9 RET ---------.---------.------------------.------------------------- 7E DEC_COORD LD A,(HL) A:=coordinate to change A7 AND A C8 RET Z Return if coordinate is at the minimum (zero) 35 DEC (HL) Decrement coordinate C9 RET ---------.---------.------------------.------------------------- 3EF7 START LD A,#F7 DBFE IN A,(#FE) Scan segment 3 of the k/bd E610 AND #10 A:=10 if '5' pressed, 00 otherwise 47 LD B,A 3EEF LD A,#EF DBFE IN A,(#FE) Scan segment 4 of the k/bd E604 AND #04 A:=04 if '8' pressed, 00 otherwise B0 OR B 21B05C LD HL,X_COORD Prepare to adjust the X coordinate FE04 CP #04 2809 JR Z,RIGHT Jump if '8' pressed, but not '5' FE10 CP #10 2008 JR NZ,UP/DOWN Jump unless '5' pressed without '8' ---------.---------.------------------.------------------------- CD???? LEFT CALL INC_COORD Increment the X coordinate (Note window moves right, hence maze moves left.) 1803 JR UP/DOWN ---------.---------.------------------.------------------------- CD???? RIGHT CALL DEC_COORD Decrement the X coordinate ---------.---------.------------------.------------------------- 3EEF UP/DOWN LD A,#EF DBFE IN A,(#FE) Scan segment 4 of the k/bd E618 AND #18 A:=08 if '7' pressed, 10 if '6' pressed, 18 if both '7'&'6' pressed or 00 if neither pressed 21B15C LD HL,Y_COORD Prepare to adjust the Y coordinate FE10 CP #10 2809 JR Z,DOWN Jump if '6' pressed, but not '7' FE08 CP #08 2008 JR NZ,WINDOW Jump unless '7' pressed without 6 ---------.---------.------------------.------------------------- CD???? UP CALL INC_COORD Increment the Y coordinate 1803 JR WINDOW ---------.---------.------------------.------------------------- CD???? DOWN CALL DEC_COORD Decrement the Y coordinate ---------.---------.------------------.------------------------- 2A845C WINDOW LD HL,(DF_CC) E5 PUSH HL Stack PRINT position 2A885C LD HL,(S_POSN) E5 PUSH HL Stack PRINT coordinates AF XOR A A:=00 323C5C LD (TVFLAG),A Print to the upper part of the screen FD365538 LD (ATTR_T),#38 Set colours to black on white 2AB15C LD HL,(Y_COORD) L:=Y coordinate of the window 67 LD H,A HL:=Y coordinate of the window 112000 LD DE,Length DE:=size of the maze CDA930 CALL #30A9,HL=HL*DEHL:=(Y coordinate) * (size of maze) ED5BB05C LD DE,(X_COORD) E:=X coordinate of the window 57 LD D,A DE:=X coordinate of the window 19 ADD HL,DE HL:=square number of the window position 11???? LD DE,MAZE Point DE to the start of the maze 19 ADD HL,DE Point HL to the appropriate square 110108 LD DE,#0801 D:=count (number of rows to print, E:= PRINT AT coordinate required ---------.---------.------------------.------------------------- 3E16 LOOP_1 LD A,"at_ctrl" D7 RST #10 PRINT AT 7B LD A,E D7 RST #10 required row, 3E17 LD A,#17 D7 RST #10 17h; 0608 LD B,#08 B:=number of columns in the window ---------.---------.------------------.------------------------- 7E LOOP_2 LD A,(HL) A:=next character from the maze 23 INC HL Point to next character D7 RST #10 Print this character in window 10FB DJNZ LOOP_2 Print the whole row 0E18 LD C,Length-8 BC:=displacement to the next row of the window 09 ADD HL,BC Point HL to the next row 1C INC E Increment PRINT AT pos'n 15 DEC D 20EA JR NZ,LOOP_1 Repeat for all rows E1 POP HL 22885C LD (S_POSN),HL Restore PRINT coordinates E1 POP HL 22845C LD (DF_CC),HL Restore PRINT position C9 RET !0.......^.........^.........^.. !2.......^.........^.........^.........^.........^.........^.... !B 10 PLOT 183,103 Construct a frame for the window 20 DRAW 0,65 30 DRAW 65,0 40 DRAW 0,-65 50 DRAW -65,0 60 LET l=USR ????? This refers to the label START 70 GO TO 60 !0.......^.........^.........^.. !B \H11\H07\H10\H00USER DEFINED GRAPHICS !2.......^.........^.........^.........^.........^.........^.... Type this Hex into the User Defined Graphics area of your m/c. !0.......^.........^.........^.. Graphc A 00 00 00 00 00 00 00 00 Graphc B 01 01 01 01 01 01 01 01 Graphc C 80 80 80 80 80 80 80 80 Graphc D 81 81 81 81 81 81 81 81 Graphc E FF 00 00 00 00 00 00 00 Graphc F FF 01 01 01 01 01 01 01 Graphc G FF 80 80 80 80 80 80 80 Graphc H FF 81 81 81 81 81 81 81 Graphc I 00 00 00 00 00 00 00 FF Graphc J 01 01 01 01 01 01 01 FF Graphc K 80 80 80 80 80 80 80 FF Graphc L 81 81 81 81 81 81 81 FF Graphc M FF 00 00 00 00 00 00 FF Graphc N FF 01 01 01 01 01 01 FF Graphc O FF 80 80 80 80 80 80 FF Graphc P FF 81 81 81 81 81 81 FF !B \H11\H07\H10\H00DATA FOR MAZE !2.......^.........^.........^.........^.........^.........^.... It's worth getting a friend to help you type this lot in! !0.......^.........^.........^.. 53 9C 94 9C 94 9C 9C 9C 9C 9C 9C 9C 9C 9C 94 94 9C 9C 9C 9D 96 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9D 93 97 93 97 92 9C 9C 9C 9C 9C 9C 9C 9C 95 93 93 9C 9C 9C 9C 98 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 95 92 98 99 93 9A 9C 9C 9C 9C 9C 9C 9C 95 93 93 93 93 96 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 95 93 93 9E 9C 98 9C 9C 94 9C 9C 9C 9C 9D 93 93 93 93 93 93 96 9C 9C 94 9C 94 9C 9C 9C 9C 9C 95 93 93 92 9C 9C 9C 9C 9D 93 9E 9C 9C 9C 9C 99 93 93 93 93 93 9A 9C 95 93 97 93 96 9C 9C 9C 95 93 93 93 93 9E 9C 9C 9C 9C 98 9C 9C 9C 9C 9C 9C 91 93 93 93 9A 9C 95 93 93 93 93 93 96 9C 95 93 93 93 93 92 9C 9C 9C 9C 9C 9C 9C 9C 9C 94 9C 95 93 93 93 92 9C 9C 99 93 93 93 93 93 93 97 93 93 93 93 93 93 9E 9C 9C 9C 9C 94 9C 9C 9D 93 97 93 93 93 93 93 9E 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 92 9C 9C 9C 9C 95 93 9E 9C 9C 99 93 93 93 93 93 9A 9C 9C 9C 9C 99 93 93 93 93 93 93 93 93 93 93 9A 9C 9C 9C 9D 93 93 96 9C 9C 9C 99 93 93 93 92 9C 9C 9C 9C 9C 9C 99 93 93 93 93 93 93 93 9B 93 9E 9C 9C 9C 9C 91 9A 91 96 9C 9C 9C 99 99 93 9B 96 9C 9C 9C 9C 9C 9C 99 93 93 93 93 93 92 9C 99 96 9C 9C 9C 9D 9A 95 93 93 96 9C 9C 9C 99 9A 9C 99 96 9C 9C 9C 9C 9C 9C 99 93 93 93 93 93 96 95 93 96 9C 9C 95 97 93 93 93 9A 9C 9C 9C 9C 9C 9C 9C 91 96 9C 9C 9C 9C 9C 9C 99 93 93 93 93 9B 93 93 93 9E 9C 99 93 93 93 92 9C 9C 9D 96 9C 9C 9C 9D 93 93 96 9C 9C 9C 9C 9C 9C 91 93 93 92 9C 91 93 93 96 9C 9C 99 93 93 9A 9C 9C 9C 91 9E 9C 9C 95 93 93 93 96 9C 9C 9C 9C 95 93 93 93 93 97 93 93 93 93 9E 9C 9C 99 9A 9C 9C 9C 95 9A 9C 9C 95 9A 99 93 93 93 9E 9C 9C 95 93 93 93 93 93 93 93 93 93 92 9C 9C 9C 9C 9C 9C 9C 9C 98 9C 9C 95 9A 9C 94 99 93 9A 9C 9C 9D 93 93 93 93 93 93 93 93 93 93 93 96 9C 9C 9C 9C 9C 9C 9C 9C 9C 95 92 9C 9D 93 9E 98 95 96 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 96 9C 9C 9C 9C 9C 9C 9C 95 93 93 9E 9C 98 9C 95 93 93 96 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 96 9C 9C 9C 9C 9C 95 93 93 9A 9C 9C 9C 95 93 93 93 93 96 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 96 9C 9C 9C 95 93 93 92 9C 9C 9C 95 93 93 9A 99 93 93 96 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 96 9C 95 93 93 93 93 96 9C 95 93 93 9A 9C 9C 99 93 93 96 9C 9C 99 93 93 93 93 93 93 93 93 93 93 93 97 93 93 93 93 93 93 97 93 93 9A 9C 9C 9C 9C 99 93 93 96 9C 9C 99 93 93 93 93 93 93 93 9A 98 99 93 93 93 93 93 9B 93 93 93 9A 9C 9C 94 9C 9C 9C 99 93 9B 96 9C 9C 99 93 93 93 93 93 9A 9C 9C 9C 99 93 93 93 92 9C 91 93 9B 96 9C 9C 99 9E 9C 9C 9C 98 9C 91 96 9C 94 99 93 93 93 9A 9C 9C 9C 9C 9C 99 93 93 93 97 93 92 9C 99 9E 9C 9C 9C 9C 9C 9C 9C 95 93 93 97 93 96 93 93 9A 9C 9C 9C 9C 9C 9C 9C 99 93 9B 93 93 93 96 95 96 9C 95 9E 9C 9C 9C 95 93 9B 93 93 92 91 93 92 94 94 9C 9C 9C 9C 9C 9C 9C 98 9C 99 93 93 93 9B 93 97 92 9C 9C 9C 95 93 9A 9C 99 93 93 9B 9C 9C 9A 91 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 99 93 93 96 99 92 90 9C 9C 95 93 9A 9C 9C 9C 98 98 9D 93 93 97 93 93 9E 9C 9C 9C 9C 9C 9C 9C 9C 9C 99 93 93 96 99 92 9C 95 93 9A 9C 9C 9C 9C 9C 9C 95 93 9A 99 93 9A 9C 9C 94 9C 9C 9C 9C 9C 9C 9C 9C 99 93 93 9E 99 97 93 9A 9C 9C 9C 9C 9C 9C 95 93 9A 9C 9C 98 9C 9C 9C 98 9C 9C 9C 9C 9C 9C 9C 9C 9C 99 9A 9C 9C 99 9A 9C 9C 9C 9C 9C 9C 9D 9B 46 !1.......^.........^.........^.........^........ !B -- from Your Spectrum #4 (Jun.1984) -- !0.......^.........^.........^.. !B SHORT CUT TO AMAZE !1.......^.........^.........^.........^........ Toni Baker has a marvellous knack of coming up with something fresh and her Maze program in issue 4 of Your Spectrum is no exception. How- ever, those of us (like me) who were a bit daunted by the idea of correctly keying in 1024 Hex pairs might revive their spirits with this little routine, which automates the operation as much as possible. Looking at the ranks of numbers - like Napol- eon's army on the march - I thought "I'll never do it". "It's worth getting a friend to help", she says; so why not use our friendly Speccy? Look carefully at it. First, all the numbers start with a '9', so that's something the com- puter can look after; there's no point wearing your own fingers out doing the same thing over and over again. That's one of the things com- puters are for! Secondly, it's much easier to keep in the correct place if you arrange to enter the numbers in rows of eight, to match the print- out in Your Spectrum. Thirdly, it would be nice to have the computer keep the score, by getting it to print out the line and column numbers as it goes along - another thing it's good at. So here's the result of a short session at the keyboard. It enabled me to key in all 1024 bytes in about half an hour. You can go back and correct a section by entering GO TO 200 as a direct command and then INPUTting the line number on cue. I'm confident enough of the result to think there are some glitches in the listing in the last few lines, but I don't know exactly what they should be to get a properly drawn pattern. Also, there's a misprint in the code listing: 'ED 5B B1 5C', half-way down page 22, should be 'ED 5B B0 5C', in order to load the x coordinate. Anyhow, all mazes baffle me, even when printed out in full - let alone seen in bits through a square keyhole! John Durst, Swerford, Oxon -- letter from Your Spectrum #6 (Aug.1984) -- !0.......^.........^.........^.. !B 1 POKE 23658,8: CLEAR 57340 5 LET col=0: LET lin=1 10 LET col=col+1: IF col=9 THEN LET col=1: LET lin=lin+1: CLS 15 PRINT AT 10,0;"MAZE DATA -"' "next entry: Line ";lin;" Entry ";col 20 IF INKEY$="" THEN GO TO 15 30 LET n=CODE INKEY$ 40 IF n=13 THEN STOP 50 IF n=45 THEN LET col=col-(co l>0): PRINT OVER 1;AT 13,0;TAB 4 +3*col;OVER 0;" ": GO TO 110 60 IF NOT ((n>=48 AND n<=57) OR (n>=65 AND n<=70)) THEN GO TO 1 0 70 LET n=n-48-7*(n>=65) 80 PRINT AT 13,0;"Entry:";OVER 1;TAB 4+3*col;OVER 0;" 9";INKEY$ 90 POKE 57343+col+8*(lin-1),n+1 6*9 110 IF INKEY$<>"" THEN GO TO 110 120 GO TO 10 199 STOP 200 INPUT "lin";lin: LET col=0 210 PAUSE 10: GO TO 10 !2.......^.........^.........^.........^.........^.........^.... Make the Spectrum do the work when keying in lots of Hex pairs. !0.......^.........^.........^.. -- !$