WE - ROM ACORN ATOM UTILITY ROMINTRODUCTION
Watford Electronics © 1983
WE-ROM is a set of extensions to ATOM BASIC designed to make the life of the occasional machine-code user easier. The average user will only need to make use of the ATOM's built in assembler to modify existing assembler programs and to create short sequences of machine-code to speed up BASIC operation. The former is usually to do such things as modify purchased games software to use their own joysticks etc. Such users find such tools as a disassembler essential. WE-ROM's tools for modification of machine-code programs are especially easy to use, primarily by keeping the 'assemble to' pointer set to the current location being viewed. In addition to the machine-code aspects, WE-ROM also provides some of the most useful extensions to ATOM BASIC. Some examples are: high speed tape interface, two key rollover on the keyboard, easier scanning of the keyboard from programs, and easily expandable without recourse to assembler. The commands For a better understanding of the commands, try typing in the examples given. ABDO Abort DO loop ABD. Use when leaving from the middle of a DO loop. 10 DO 20 ABDO; GOTO 40 30 PRINT "This will never happen"; UNTIL 0 40 PRINT "I will do this indefinitely"' 50 GOTO 10 Use of ABDO prevents BASIC giving ERROR 18 in this example. ABFOR Abort FOR...NEXT loop A. Use when leaving from the middle of a FOR...NEXT loop, exactly as ABDO, preventing ERROR 111. ABSUB Abort subroutine ABS. This removes references to a current subroutine, so that you can jump directly from the subroutine to any point in the main program, rather than going back to the command after the GOSUB which called the subroutine. Prevents BASIC error 2. AUTO Automatic line numbering AU. AUTO start, increment This will generate line numbers startin gwith 'stat', and incrementing by 'increment' each successive line. The increment can be negative if desired. If any line number outside 0...32767 is generated the command aborts. Both 'start' and 'increment' default to 10 if not specified. Certain control codes have meaning within the AUTO mode: Control A (or ESC) cancels the current line and leaves AUTO. Control X cancels the current line and reissues the current line number. Control B cancels the current line and issues the _previous_ line number. Control N cancels the current line and issues the next line number. BREAK Set machine-code breakpoint BR. Used to trap the assembler 'BRK' execution (and hence BASIC errors) displaying all processor registers and flags. Restores text mode. Eg. BREAK #2800;GENERATE AN ERROR PC AC STATUS IX IY SP C55C 53 -V-B---C 08 01 1FD The address specified in the BREAK instruction is the address at which 'BRK' assembler instruction is to be placed. The previous contents of that location are saved, and restored when the BREAK instruction is used with no address after it. NB. BASIC rests its own 'BRK' trapping prior to each prompt ('>'), so if BREAK is used in immediate mode the RUN or LINK etc. must be on the same line as the BREAK instruction. Only the most recent use of BREAK can be restored. CHAIN Load and RUN a BASIC program CH. Used in the same way as LOAD, but RUNs the program automatically after loading. Unlike the use of '*RUN', this command correctly sets up 'TOP' and the array pointers. CURSOR Moves the cursor CU. CURSOR horizontal position, vertical position The cursor is moved to the desired position on the text screen. Eg. CURSOR 13,4;PRINT "HERE I AM" NB. The top left hand corner is 0,0. DATA Used with READ and RESTORE DA. This command is ignored upon execution. It contains data to be read byt a READ statement. Each data item is spearated from others on the same line by a comma. Numeric data can be an expression within brackets, or a constant. If string data needs leading spaces or commas the whole string must be enclosed within quotes. Eg. 1000DATA 3,(2*A+RND%5),A STRING," A STRING, WITH A ," NB. When DATA statements appear in your program, _NEVER_ abbreviate DO to D., otherwise statements after the D. will be treated as data. Placing the data beyond all statements and 'RESTORE'ing to the first line of DATA relaxes this requirement. DELETE Delete blocks of BASIC lines DE. DELETE first line number, last line number Deletes all lines numbered between the two specified lines inclusive. DISASSEMBLE Disassemble an area of memory DI. DISASSEMBLE first address, last address If first address is omitted contents of variable N is used. If last address is omitted 65535 is assumed. If no commas appear first address = last address is assumed. If ',P' is appended to the command the disassembly listing is appended to the current program. If ',W' is appended to the command the listing pauses at the end of each line. Only one of the P or W may be specified. Eg. DISASSEMBLE #A002,#A040,W Upon exit from disassembly, two BASIC variables are altered: N points to the next location to be disassembled. P points to the last location disassembled (for patching). Eg. DISASSEMBLE #2800 2800 08 PHP [INY 0 2800 C8 INY DISASSEMBLE 2801 C4 0A CPY #0A [LDA @1 0 2801 A9 01 LDA @1 DUMP Dump memory to the screen DU. DUMP first address, last address Parameters are entered as for DISASSEMBLE, except the ',P' has no effect. Thus DUMP can conveniently start where DISASSEMBLE leaves off. Ef. DISASSEMBLE #A03C,#A03E A03C 6C 52 00 JMP (#0052) DUMP,#A050 A03F 4B 45 59 AC E7 52 KEY--R A045 45 41 44 A8 54 43 EAD-TC A04B 55 52 53 4F 52 AC URSOR- Control codes (0...31) are typed as '.'. Upon exit BASCI variable N contains the next address to be dumped. EXIT Leave user defined command EX. This command is described fully in the section 'Extending even further' FIND Searches programs FIND This command lists all lines containing a particular string, which may be enclosed in quotes. Eg. FIND PRINT FIND " THEN" KBD Engages two key rollover KB. Selects for all further input, a two key rollover/debounced input routine. KEY Keyboard scanner K. KEY variable Scans the keyboard and stores key value (ASCII) in 'variable'. If no key is pressed 0 is returned. KEY variable, key number Scans the key with ASCII value 'key number' and stores in 'variable' either true (-1) or false (0), depending on whether the key is pressed. This command uses some non-standarad key numbers: 129 - SHIFT 135 - REPT., CTRL. and SHIFT 130 - CONTROL 136 - LOCK 131 - SHIFT and CONTROL 137 - <-> 132 - REPEAT 138 - | 133 - REPEAT and SHIFT 139 - COPY 134 - REPEAT and CONTROL MODIFY Memory modification M. MODIFY address Enters monitor mode with address specified, displaying: Addess HEX contents ASCII ':' prompt After the prompt any of the following may be entered: - Move back one byte "string Enter string into memory without trailing return @char Enter 'Control' char into memory eg. @L ;basic Execute BASIC commands eg. ;DUMP [assem Assemble into memory eg. [LDA 8 'return' Advance one byte Anything else is taken (if possible) as two HEX digits and stored. NB: Variable P points to the current modifable byte, so to change the location use ';P=...'. Use ESC to leave MODIFY. ONERROR BASIC error trapping O. Eg. ONERROR GOTO 1000 When an error occurs within a BASIC program the statements following the ONERROR are executed. In the example, when an error occurs in the program, control is transferred to line 1000 with the GOTO statement. ONERROR OFF or the BASIC prompt will restore standard error handling. NB. ?0 = Error number, ?1, ?2 = Error line number. READ Read data into variables REA. Eg. READ A,$#2800 Standard BASIC read; copies data from DATA statements into specified variables. An example of the use of READ is: 10RESTORE;REM VERY important! 20READ N;REM number to do 30FOR A=1 TO N 40READ B 50PRINT B 60NEXT A 70END 80DATA 5,1,2,3,4,5 NB. RESTORE _must_ be executed before the first READ. RESTORE Set data pointer RES. Eg. RESTORE Subsequent searches for DATA will begin from the beginning of the program. Eg. RESTORE 20 Subsequent searches for DATA will start from line 20. A label can be used instead of a line number. TAPE Select tape speed T. Eg. TAPE 0 Selects 300 baud Eg. TAPE 1 Selects 1200 baud Both routines indicate operation by placing each transferred byte at the top right corner of the screen. NB. When using 1200 baud, you may find a higher incidence of tape errors. This is because there is less redundancy in the stored information. It is therefore recommended that all important programs are saved at 300 baud also. Extending even further To add a new BASIC command, select an unused text space (ie. ?18=...; NEW). Type a line 0 containing '0REM$%command name'. Then enter a program in BASIC to perform the desired operation. The command is ended by using the EXIT statement. Eg. ?18=#82;REM in screen memory NEW; REM clean up the new text space 0REM$%HELLO 10PRINT "Hello There!"' 20EXIT HELLO;REM Test the new command Hello There! > NB. Command names must not start with a space. Parameters can be transferred to the command, by placing them after the command name eg. 'HELLO 3'. Parameters are read within the command by the use of the READ statement. All parameters (there can be more than one, separated by commas) must be READ otherwise an error will occur upon EXIT from the command. Eg. ?18=#82;REM select a text space NEW; REM be tidy 0REM$%MP 5REM This command is called MP 10READ Q,$#2800;REM READ a number and a string 20IF Q<1 THEN EXIT 23;REM If printing less than once give error 23 30FOR P=1 TO Q;PRINT $#2800;NEXT P 40EXIT MP 3,"*" ***>MP 0,"*" ERROR 23 >MP 5,"HELLO" HELLOHELLOHELLOHELLOHELLO> If an expression is put after the EXIT command, the expression is evaluated, and the calling program is given the ERROR of that value. Labels should not be used within commands. 'RESTORE' should not be used within a command. Variables P and Q are local to the command, so their values are restored on EXIT. Always leave commands via EXIT or END. Do _NOT_ allow a command to call itself. Commands need 19 bytes workspace at their end, so do not use any locations below TOP+19. All possible text spaces from #400 to #A000 are scanned for possible commands. A sample editing session using WE-ROM commands Set up a program to put '*'s in the top half of the screen. >P=#2800 [LDY @0;LDA @#2A;STA #8000,Y;INY;BNE #2804;RTS;] 0 2800 A0 00 LDY @0 0 2802 A9 2A LDA @#2A 0 2804 99 00 80 STA #8000,Y 0 2807 C8 INY 0 2808 D0 FA BNE #2804 0 280A 60 RTS Try it out. >LINK #2800 Check register contents after first loop. >BREAK #2808;LINK #2800 PC AC STATUS IX IY SP 2808 2A ---B---- AF 01 1FD Disengage breaking, and restore program. >BREAK We want to fill with something else... >DISASSEMBLE #2800,,W 2800 A0 00 LDY @#00 2802 A9 2A LDA @#2A A graphic character will do... >[LDA @#41 0 2802 A9 41 LDA @#41 Check the rest of the program. >DISASSEMBLE ,,W 2804 99 00 80 STA #8000,Y 2807 C8 INY 2808 D0 FA BNE #2804 280A 60 RTS Try it out. >LINK #2800 Changing the fill character another way... >MODIFY #2800 2800 A0 ; 2801 00 .; 2802 A9 -; 2803 41 A:"C 2804 99 9:- 2803 43 C:2A 2804 99 9:- 2803 2A *:> The fill character was changed twice, once to 'C' and then back to '*'. Error codes used by your ROM 1 Invalid variable name in KEY statement. 21 Error in use of AUTO, either used within a program, or comma not used between operands. 22 Out of DATA in a READ statement. 110 FIND used within a program. 175 Comma missing in CURSOR statement. 208 Error in DELETE command, either DELETE used within a program, or no comma between operands, or first line to be DELETEd is after the last. 221 Error in READ statement, READing into an invalid variable or a string in page zero, or comma missing within a DATA statement. Nore: BASIC will issue an ERROR 175, if an expression is used in place of a number as a paramter to these commands, without placing the expression in brackets. Variables on their own need not be parenthesised. Memory usage by the utility ROM The ROM uses locations #50-#7F as short term working storage. Locations #238-#23D are used as semi-permanent storage, thus: #238 Flag for READ =0 If 'RESTOREd' 255 If READing parameters for user command. #239,A DATA pointer for READ. #23B,C Location to replace stored byte for BREAK. #23D Stored byte for BREAK. Locations #21C,D are used by the AUTO command temporarily to store the old vector for reading a character from the keyboard. There is within the Utility ROM another keyboard input routine other than that selceted by 'KBD', this is similar to that selected by 'KBD', but editing is disabled, and editing keys return 'ASCII' codes greater than 128 (See 'KEY' command). Select this input routine by '?#20A=#34;?#20B=#AD'.