Sorcery_Brews Sorcery Brews
User Manual: Pdf Sorcery_Brews
Open the PDF directly: View PDF .
Page Count: 128
Download | |
Open PDF In Browser | View PDF |
• • • • •7 ~ ••••• .. ... SORCERY BREWS CONCOCTED BY HOWARD ARRINGTON COPYRIGHT (C) 1981 BY HOWARD ARRINGTON A PRODUCT OF THE GLOBAL SOFTWARE NETWORK This manual is a treasury of programming tricks that are specific to the Exidy Sorcerer computer, although much is applicable to other microcomputers that employ either Microsoft Basic or a Z80 microprocessor. With this ready reference of valuable examples at your fingertips, your programming efforts will be greatly simplified, and your programs will be more professional in both appearance and performance. Using this manual will unleash the hidden powers of your Sorcerer. You will graduate from being an apprentice to being a full wizard as you study and use the brews concocted by masters of the Sorcerer. • T ABLE OF CONTENTS CHAPTER 1 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 RELOCATE BASIC PROGRAMS TO A DIFFERENT RUN ADDRESS END-OF-PROGRAM ADDRESS FOR ROMPAC BASIC CSAVE BASIC AND MACHINE LANGUAGE ROUTINES TOGETHER SAVE A CHARACTER SET AND A BASIC PROGRAM TOGETHER AUTO-EXECUTE BASIC PROGRAMS FIND TOP-OF-MEMORY IN ADDRESSES FOOO-F001 HEX ARRAY SPACE REQUIREMENT CONCEAL 'REM' AND LINE NUMBER IN LISTINGS MACHINE CODE ROUTINES HIDDEN IN BASIC REMARKS THREE MEMORY SIZE DEPENDENT BYTES IN THE BASIC WORK AREA AN IDEAL PROGRAM START FASTER BASIC EXECUTION MERGE TWO BASIC PROGRAMS TOGETHER CHAPTER 2 2.01 2.02 2.03 2.04 2.05 2.06 2.07 2.08 2.09 2.10 2.11 2.12 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20 2.21 2.22 BASIC PROGRAM TIPS BASIC COMMANDS CLEAR COMMAND RESTORE nnnn WILL RESTORE TO A SPECIFIC LINE NUMBER SWAP INTEGER VARIABLES LEN(STR$(l)) IS 2 BECAUSE A SPACE PRECEDES THE DIGIT MID$ FUNCTION EXAMPLES USE CHR$(64) TO PRINT THE '@' SIGN ORDER OF PRECEDENCE FOR NUMERICAL OPERATIONS FLOATING POINT INACCURACIES NUMERICAL RELATIONS LOGICAL OPERATOR TRUTH TABLES ONE SECOND DELAY LOOP IN BASIC A 0.81 SECOND DELAY LOOP IN THE MONITOR A 3.24 SECOND DELAY LOOP IN THE MONITOR MULTIPLE LINE CHARACTER STRINGS PRINT DECIMAL NUMBER IN HEXADECIMAL PRINT DECIMAL NUMBER IN HEXADECIMAL PRINT DECIMAL NUMBER IN HEXADECIMAL CONVERT HEXADECIMAL TO DECIMAL CONVERT DECIMAL TO HEXADECIMAL MENU SELECTION UTILIZING 'IF X THEN RUN' STATEMENT CARTESIAN COORDINATES FROM POLAR EQUATIONS SHELL SORT SUBROUTINE TO PUT ARRAY Z() IN ASCENDING ORDER CHAPTER 3 3.01 3.02 3.03 3.04 3.05 3.06 3.07 3.08 3.09 3.10 3.11 3.12 KEYBOARD --- VIDEO DOUBLE SPACE LISTINGS SCREEN POKE ADDRESS FOR ANY ROW AND COLUMN MAKE THE CURSOR DISAPPEAR AFTER A PRINT STATEMENT REMOVE CURSOR FROM SCREEN SCREEN ADDRESSING SYNC SCREEN MOTION WITH VIDEO HORIZONTAL SYNC 'PULSE PRINT AT SUBROUTINE PLACE CURSOR AT ROW AND COLUMN PLACE CURSOR AT ROW AND COLUMN DRAW BOX ROUTINE CREATE INVERSE VIDEO CHARACTER SET CREATE DOUBLE WIDE CHARACTER SET CHAPTER 6 6.01 6.02 6.03 6.04 6.05 6.06 --- ACCEPT 'YES' ANSWER WITH INPUT OF 'y', 'YE' OR 'YES' KEYBOARD SCAN OR 'GET' COMMAND PRINT ON LINE AFTER INPUT STATEMENT INPUT STRINGS CONTAINING COMMAS AND '@' SYMBOLS KEYBOARD SCAN FOR 'GRAPHIC', 'CONTROL', AND 'SHIFT' WAIT FOR USER TO PRESS 'SHIFT' KEY TO CONTINUE CHAPTER 5 5.01 5.02 5.03 5.04 5.05 5.06 5.07 5.08 5.09 5.10 5.11 5.12 FUNCTIONS RANDOM NUMBER FUNCTION RANDOMIZE FUNCTION INT FUNCTION EXAMPLES SGN() FUNCTION DEF FUNCTION RULES DECIMAL POINT ALIGNMENT TABULATED PRINTING OF DOLLARS AND CENTS ROUND OFF FUNCTION ASCII CODE FOR A HEX DIGIT FIX COMMAND BASE 10 LOGORITHM PI = 3.14159 = 355/113 CHAPTER 4 4.01 4.02 4.03 4.04 4.05 4.06 --- JOYSTICKS JOYSTICK / KEYBOARD STANDARD FOR THE SORCERER JOYSTICK INTERFACE STANDARD TO PARALLEL PORT JOYSTICK CIRCUIT DIAGRAM JOYSTICK EXAMPLE USING BASIC STATEMENTS JOYSTICK EXAMPLE USING MACHINE LANGUAGE SOFTWARE MACHINE LANGUAGE JOYSTICK ROUTINE . CHAPTER 7 7.01 7.02 7.03 7.04 PRINCIPLE OF ONE VOICE SOUND ONE VOICE MUSIC ROUTINE PIEZO SPEAKER AUDIO PROMPTER CONTROL IG I BEEP CHAPTER 8 8.01 8.02 MONITOR --- MACHINE LANGUAGE INTERFACE PROTECT MEMORY FOR MACHINE LANGUAGE ROUTINES CALL A MACHINE LANGUAGE ROUTINE FASTER USR() PARAMETER PASSING POKE MACHINE HEX CODE INTO MEMORY PASS ARGUMENT IN IAI REGISTER TO MACHINE LANGUAGE ROUTINE PASS TWO PARAMETERS USING THE OUT I,J INSTRUCTION PASS ROUTINE ADDRESS IN USR() FUNCTION CALL MULTIPLE USR() ROUTINES SELECTED BY THE LETTER IN () UP-LOADER FOR MACHINE LANGUAGE ROUTINES CHAPTER 11 11.01 11.02 11.03 11.04 11.05 --- MONITOR POKE ADDRESSES MONITOR WORKAREA USEFUL MONITOR ROUTINES AND THEIR FUNCTIONS RELOCATE THE MONITOR STACK ERASE MEMORY BY FILLING IT WITH ZEROES EXECUTE MONITOR COMMANDS FROM A BASIC PROGRAM CHAPTER 10 10.01 10.02 10.03 10.04 10.05 10.06 10.07 10.08 10.09 --- BASIC ROMPAC BASIC ROMPAC MAP BASIC ROMPAC WORK AREA CHAPTER 9 9.01 9.02 9.03 9.04 9.05 9.06 --- SOUND --- MACHINE CODE ROUTINES ROW - COLUMN ROTATION OF A CHARACTER CELL IMAGE DRIVER TO CONVERT TO >SA FILES. PINE WOOD DERBY CONTROLLER PINE WOOD DERBylS BASIC PROGRAM IDEAL MACHINE LANGUAGE PROGRAM START CHAPTER 12 12.01 12.02 12.03 12.04 12.05 12.06 12.07 12.08 12.09 SAVE SAVE CP/M BIOS CP/M --- CP/M --- WORD PROCESSOR --- DEVELOPMENT PAC PAUSE DEVELOPMENT PAC LISTINGS MEMORY PARTITIONS FOR 32K CONFIGURATION I/O VECTOR ASSIGNMENTS SAMPLE COMMANDS CHAPTER 18 18.01 18.02 EDITOR FOR BASIC WORD PROCESSOR PRINTER DRIVER SALVAGE WORD PROCESSOR FILE FROM RESET PRINTER DRIVER TO SEND ESCAPE SEQUENCES CHAPTER 17 17.01 17.02 17.03 17.04 --- ROMPAC BASIC PROGRAM ON CP/M DISK WORD PROCESSOR ROMPAC FILES ON CP/M DISK COMMANDS MODIFICATION TO GIVE BACKSPACE TYPE RUBOUTS LOAD ROUTINE OF WP FILES FOR DEVPAC CHAPTER 16 16.01 16.02 16.03 CASSETTE TAPE EDITOR FOR BASIC INSTRUCTIONS EDITOR FOR BASIC SOURCE LISTING CHAPTER 15 15.01 15.02 15.03 15.04 15.05 --- WRITE DATA TO CASSETTE TAPE READ DATA FROM CASSETTE TAPE CHAPTER 14 14.01 14.02 I/O DRIVERS RS232 OUTPUT DRIVER ROUTINE RS232 DRIVER WITH PERFERATION SKIP CONTROL RS232 INPUT DRIVER ROUTINE DUMB TERMINAL ROUTINE VARIABLE LINE LENGTHS FOR PRINTERS CENTRONICS SCREEN PRINT ROUTINE CENTRONICS PRINTER DRIVER ACCESS CENTRONICS PRINTER DRIVER FROM BASIC PROGRAMMING THE UART FOR PARITY OPTIONS CHAPTER 13 13.01 13.02 --- --- PLOTTING BEAUTIFUL BIRTHDAY PLOTS 3-D FUNCTION PLOTS USING SHADED PRINT DENSITY .J. ~:~. CHAPTER 19 19.01 19.02 19.03 19.04 19.05 19.06 19.07 19.08 19.09 19.10 19.11 19.12 19.13 19.14 --- TABLES AND FORMS BASIC'S TOKENS HEX - BINARY CONVERSION TABLE POWERS OF 2 TABLE DECIMAL - HEXADECIMAL CONVERSION TABLE CONTROL CODES AND THEIR FUNCTIONS GRAPHIC CHARACTER DESIGNER'S FORM MACHINE LANGUAGE CODING FORM SERIAL INTERFACE PINOUTS PARALLEL INTERFACE PINOUTS DATA PORT ASSIGNMENTS ASCII CHARACTER SET KEYBOARD STRUCTURE GRAPHIC CHARACTER STARTING ADDRESSES ONE STROKE BASIC COMMANDS - - - - - - - - - - ----------- FORWARD "In promulgating your esoteric cognitations, or articulating your superficial sentimentalities and amicable, philosophical or psychological observations, beware of platitudinous ponderosity. Let your conversational communications possess a clarified conciseness, a compact comprehensibleness, coalescent consistency, and a concantenated cogency. Eschew all conglomerations of flatulent garrulity, jejune babblement and asinine affectation. Let your extemporaneous and unpremeditated expatiations have intelligibility and vivacious vivacity, without rodomontade and thrasonical bombast. Sedulously avoid all polysyllabic profundity, pompous prolixity, osittaceous vacuity, ventriloquial verbosity, and veniloquent vapidity. Shun double-entendres, pruvient jocosity, and pestiferous profanity, obscurant or apparent. In other words, write plainly, briefly, naturally, sensibly, truthfully, purely. Keep from complexities; don't put on airs; write what you mean; and don't forget that others are trying to understand you. Simply stated -- Reread this paragraph until you understand the veniloquent vapidity." I've tried to heed this good counsel throughout this manual. To my patient wife MARILYN • --- CHAPTER 1 PROGRAM TIPS 1.01 RELOCATE PROGRAMS TO A DIFFERENT RUN ADDRESS. BYE >EN 149 0149: 00 10 / >EN OFFF OFFF: 0 / >PP EXIT TO THE MONITOR. CHANGE POINTER IN 149 HEX. NEW BASIC START ADDRESS OF 1000 HEX. ZERO BYTE BEFORE START ADDRESS. GO ENTER BASIC PROGRAM FROM KEYBOARD. PROGRAM CAN BE RUN AND CSAVED IN NORMAL FASHION. TO CLOAD, THOUGH, 0149 HEX MUST BE ALTERED AS ABOVE. THIS ALLOWS A BASIC PROGRAM TO HAVE A PROTECTED MEMORY SPACE FOR MACHINE LANGUAGE ROUTINES FROM 01D5H TO ONE BYTE BEFORE THE START OF YOUR RELOCATED BASIC PROGRAM. -------------------------------------------------------------- 1.02 END-OF-PROGRAM ADDRESS FOR ROMPAC BASIC. BYE >DU 1B7 1B8 ADDR 0 1 2 01BO: .. .. EXIT TO MONITOR ADDRESS STORED IN THESE TWO BYTES. 3 4 5 6 7 yy 8 xx HEX ADDRESS IS STORED IN REVERSE BYTE ORDER IN ADDRESS 01B7 AND 01B8 HEX. ADDRESS IS READ AS xxyy. -------------------------------------------------------------- 1.03 eSA VE BASIC AND MACHINE LANGUAGE ROUTINES. PLACE MACHINE LANGUAGE ROUTINES IN MEMORY JUST BEYOND THE END OF A BASIC PROGRAM. PUT THE ADDRESS TO SAVE THROUGH IN BYTES 1B7 AND 1B8. EXAMPLE: IF MACHINE CODE OCCUPIES TO ADDRESS 264F HEX. BYE >EN 1B7 01B7: 4F 26 / >PP CSAVE XMPLE ENTER NEW ENDING ADDRESS. SAVE BASIC AND ROUTINES. WHEN THE BASIC PROGRAM AND THE MACHINE CODE RELOAD, THE MACHINE CODE NEEDS TO BE MOVED BACK TO ITS ORIGINAL ADDRESS IN MEMORY. BE CAREFUL THAT VARIABLE STORAGE DOES NOT OVERWRITE IT WHEN THE BASIC PROGRAM RUNS. ~~~.-----~- ------ 1.04 SAVE A CHARACTER SET AND A BASIC PROGRAM TOGETHER. BYE >DU 1B7 1B8 >SA XMPLE FCOO xxyy >LO XMPLE >PP RUN FIND END OF PROGRAM ADDRESS. SAVE THROUGH xxyy FROM 1B7 1B8. TO RERUN YOUR PROGRAM. ============================================================== 1.05 AUTO-EXECUTE BASIC PROGRAMS PROGRAM MUST HAVE A LINE O. EXAMPLE: 0 REM FIND PROGRAM END IN 1B7-1B8 HEX FOR xxyy ADDRESS. >SE X=C858 >SE F=4D >SA PROG 1B7 xxyy (AUTO EXECUTE ADDRESS) (FILE TYPE) LOAD AND AUTO EXECUTE WITH >LOG =============================================================== 1.06 FIND TOP-OF-MEMORY IN ADDRESSES FOOO-F001 HEX. 100 RAMSIZE = PEEK(-4095) * 256 + PEEK(-4096) ============================================================== 1.07 ARRAY SPACE REQUIREMENT THE NUMBER OF BYTES REQUIRED TO STORE AN ARRAY IS: (# OF ELEMENTS) * 4 + (# OF DIMENSIONS) * 2 + 6 EXAMPLE: 100 DIM A(10,10) : REM USES 494 BYTES : REM 494 = 11*11*4+2*2+6 ============================================================= 1.08 CONCEAL 'REM' AND LINE NUMBER IN SCREEN LISTINGS. ONE CAN CONCEAL THE LINE NUMBER OF REMARK STATEMENTS BY USING THE FOLLOWING TRICK. THE APPEARANCE OF REMARK STATEMENTS IMPROVES BECAUSE THEY READILY STAND OUT. SAMPLE OUTPUT: 100 PRINT /lTHIS IS A SAMPLE SCREEN LISTING/I --- A REMARK, BUT NO 'REM' OR LINE # SHOWS --120 PRINT /lLINE NUMBER 110 IS PRESENT, YET HIDDEN II TO DO THE ABOVE TO A REMARK STATEMENT, DO THE FOLLOWING: 1. TYPE THE LINE NUMBER AND 'REM', IE. 110 REM 2. NOW, PRESS THE CURSOR LEFT KEY SEVEN OR MORE TIMES TO MOVE THE CURSOR ALL THE WAY BACK TO THE LEFT MARGIN. 3. USE THE SPACE BAR TO ERASE THE VISIBLE LINE NUMBER AND THE 'REM' LETTERS. 4. NOW, PRESS 'LINE FEED I TO INSERT A BLANK LINE. 5. TYPE THE REMARK STATEMENT'S TEXT. 6. TYPE ANOTHER 'LINE FEED I TO INSERT A BLANK LINE BELOW. 7. FINALLY, TERMINATE THE LINE WITH CARRIAGE RETURN. =============================================================== 1.09 MACHINE CODE ROUTINES HIDDEN IN BASIC REMARKS ONE CAN STORE A SHORT MACHINE LANGUAGE ROUTINE AS PART OF BASIC STATEMENT BY PUTTING IT IN A REM STATEMENT. IT WILL AUTOMATICALLY BE SAVED AND LOADED WITH THE BASIC PROGRAM. EXAMPLE: 100 REM < A LINE FULL OF SPACES > 110 REM THE REST OF THE PROGRAM FOLLOWS IN MEMORY THE FIRST LINE LOOKS LIKE: 01D5: yy xx 64 00 SF 01DA: 20 20 20 20 20 20 20 20 20 20 20 20 etc. THE xxyy IS THE LINK POINTER ADDRESS OF WHERE THE NEXT LINE STARTS. THE LINE NUMBER OF 100 IS STORED AS 64 00. THE 'REM' COMMAND IS STORED AS SF. STARTING IN ADDRESS 01DA ARE ALL THE SPACES OF THE REM TEXT. YOU CAN INSERT A SHORT MACHINE LANGUAGE ROUTINE IN THE ADDRESS SPACE BETWEEN 01DAH AND xxyy, FOR EXAMPLE. ONCE THE CODE IS INSERTED, DON'T ALTER THE REM STATEMENT OR ANY LINE WHICH MIGHT PRECEED THE REM STATEMENT. ALSO, THE CODE INSERTED CANNOT CONTAIN A 00 BYTE AS BASIC WILL TREAT IT AS AN END-OF-LINE MARKER. 1.10 THREE MEMORY SIZE DEPENDENT BYTES IN THE BWA 0145-6H 0192-3H 01A6-7H - POINTER TO TOP OF BASIC STACK. POINTER TO HIGHEST RAM LOCATION. POINTER TO TOP OF FREE STRING SPACE. IF THE BASIC WORK AREA FROM 0100H THROUGH 01D4H IS SAVED WITH A BASIC PROGRAM IN THIS FASHION: >SA PROG 100 xxyy, THE PROGRAM WILL NOT RUN ON A MACHINE WHICH HAS LESS MEMORY THAN THE MACHINE ON WHICH THE PROGRAM WAS RECORDED. THE CONFLICT CAN BE OVERCOME BE LOADING BYTES 0146H, 0193H, AND 01A7H WITH THE CORRECT VALUE, IE. THE DEFAULT VALUE LOADED BY BASIC ON POWER UP. THE VALUE IS 03EH FOR A 16K MACHINE, 07EH FOR A 32K MACHINE, AND OBEH FOR A 48K MACHINE. --------------------------------------------------------------- 1.11 AN IDEAL PROGRAM START o 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 REM --PROGRAM NAME . REM AUTHOR'S COPYRIGHT NOTICE REM PROGRAM DATE AND VERSION NUMBER . REM DEFINE CURSOR CONTROL VARIABLES CL$=CHR$(l) : CP$=CHR$(12) : CH$=CHR$(17) CR$=CHR$(19): CU$=CHR$(23) : CD$=CHR$(26) REM COMPUTE MEMORY SIZE TO LOCATE MONITOR WORK AREA MS=256*PEEK(-4095)+PEEK(-4096) IF MS>32767 THEN MS=MS-65536 REM LOCATE MONITOR WORK AREA CONTROL BYTES PC=MS-47 :REM PC is printer control poke address. SS=MS-48 :REM SS is screen speed poke address. BR=MS-49 :REM BR is baud rate poke address. ============================================================== 1.12 FASTER BASIC EXECUTION BASIC STARTS AT THE BEGINNING OF A ,PROGRAM AND SCANS THROUGH LOOKING FOR THE LINE NUMBER REFERENCED BY A GOSUB, IF-THEN, OR GOTO. OPTIMIZE BY HAVING OFTEN CALLED LINE NUMBERS NEAR THE , BEGINNING OF A PROGRAM. HAVE SELDOM USED LINES, SUCH AS PROGRAM INSTRUCTIONS AND INITIALIZATION, AT THE BOTTOM OF A PROGRAM. 1.13 MERGE TWO BASIC PROGRAMS TOGETHER. 1. THE LINE NUMBERS IN THE PROGRAM TO BE MERGED MUST BE GREATER THAN THE LAST LINE NUMBER IN THE FIRST PROGRAM. USE A LINE RENUMBERING PROGRAM IF NECESSARY TO ACCOMPLISH THIS. 2. LOAD THE FIRST PROGRAM INTO MEMORY. FIND ITS END LOACATION IN ADRESS 01B7 AND 01B8 HEX. 3. USE THE END ADDRESS TO FIND THE THREE ZEROS IN MEMORY MARKING THE END OF THE PROGRAM. WRITE DOWN THE ADDRESS OF THE SECOND ZERO. 4. USE THE MONITOR TO LOAD THE PROGRAM TO BE MERGED. USE >LO FILENAME 1 xxyy WHERE xxyy IS THE ADDRESS OF THE SECOND ZERO FROM STEP #3. 5. ADD THE MERGING PROGRAM'S SIZE TO xxyy TO HELP LOCATE THE THREE ZEROS AT THE END OF THE TWO COMBINED PROGRAMS. 6. STORE THE ADDRESS OF THE THIRD ZERO IN BYTES 01B7 AND 01B8 HEX. THE ADDRESS IS STORED IN REVERSE BYTE ORDER. 7. IN BASIC, ADD AND DELETE A LINE NUMBER 0, IE. 0 REM THIS WILL RECOMPUTE ALL OF THE LINK POINTERS. THE TWO PROGRAMS ARE NOW MERGED AND CAN BE SAVED ON TAPE. • . CHAPTER 2 --- BASIC COMMANDS 2.01 CLEAR COMMAND 100 CLEAR xx,yy • xx IS THE NUMBER OF BYTES TO RESERVE FOR STRING SPACE. yy IS THE TOP-OF-MEMORY ADDRESS FOR THIS STRING SPACE . EXAMPLE: 100 CLEAR 500,24576 500 BYTES ARE RESERVED FOR STRING MANIPULATIONS. THE STRING WORKSPACE WILL START AT 6000 HEX AND GROW DOWNWARD IN MEMORY TOWARD THE VARIABLE STORAGE SPACE. MEMORY FROM 6000 HEX TO THE BOTTOM OF THE MONITOR STACK WORKSPACE IS NOW 'PROTECTED' MEMORY AVAILABLE FOR MACHINE LANGUAGE ROUTINES. --------------------------------------------------------------- 2.02 RESTORE nnnn WILL RESTORE TO A SPECIFIC LINE #. =============================================================== 2.03 SWAP INTEGER VARIABLES 100 A=A XOR B B: B=B XOR A : A=A XOR B =============================================================== 2.04 LEN(STR$(1»=2 SINCE A SPACE PRECEDES THE DIGIT. USE A$ = MID$(STR$(J),2) TO EXTRACT JUST THE DIGITS. --------------------------------------------------------------- 2.05 MID$ FUNCTION EXAMPLES. 100 110 120 130 140 A$="1234567890" PRINT MID$(A$,3,2) PRINT MID$(A$,3,4) PRINT MID$(A$,3) PRINT MID$(A$,8,5) MID$(A$,l,J) = LEFT$(A$,J) • REM REM REM REM OUTPUT OUTPUT OUTPUT OUTPUT "34" "3456" "34567890" "890" 2.06 USE CHR$(64) TO PRINT THE '@' SIGN. EXAMPLE: 100 PRINT "5 APPLES ";CHR$(64);" 15 CENTS EACH" =============================================================== 2.07 ORDER OF PRECEDENCE FOR NUMERICAL OPERATIONS 1. 2. 3. 4. 5. 6. () EXPRESSIONS IN PARENTHESES. EXPONENTIATION. - NEGATION * / MULTIPLICATION AND DIVISION + ADDITION AND SUBTRATION NUMERICAL RELATIONS = EQUAL <> NOT EQUAL < LESS THAN > GREATER THAN <= LESS THAN OR EQUAL >= GREATER THAN OR EQUAL 7. NOT 8. AND 9. OR A --------------------------------------------------------------- 2.08 FLOATING POINT INACCURACIES 100 J= 30*30 : X= 30 2 : PRINT J,X A BOTH SHOULD PRINT 900, HOWEVER THE SECOND NUMBER IS PRINTED AS 900.001 BECAUSE ALL OPERATIONS EMPLOY ONLY SIX DIGITS OF ACCURACY. THUS, ONE MAY HAVE TO TEST FOR A BOUNDED CONDITION RATHER THAN FOR EQUALITY. FOR EXAMPLE: 110 IF X>899.997 AND X<900.003 THEN PRINT II X = 900 II --------------------------------------------------------------- 2.09 NUMERICAL RELATIONS IF A RELATION IS 'TRUE ' , A VALUE OF -1 IS RETURNED. IF A RELATION IS 'FALSE ' , A VALUE OF 0 IS RETURNED. EXAMPLE: OUTPUT: 100 PRINT 1=2, 1<2, 2=2, IIAII=IIAII, IIABII=IIAC II o -1 -1 -1 o 2.10 LOGICAL OPERA TOR TRUTH TABLES AND I J I AND J ------------------------- OR 0 0 1 1 0 1 0 1 0 0 0 1 I J I OR J ------------------------- o o o o 1 1 1 1 o 1 1 1 EXAMPLE: J AND 255 = JUST THE LOWER BYTE THIS IS A QUICK WAY TO GET THE LOWER BYTE OF AN ADDRESS TO POKE. 15 AND 13 = 13 IN BINARY 1111 AND 1101 = 1101 -1 AND J = J BECAUSE -1 IS ALL ONES. 5 OR 2 = 7 IN BINARY 5 AND 2 = 0 0101 OR 0010 = 0111 NOT 0 = -1 FALSE = 0 TRUE = -1 NOT J = -(J+1) TWO'S COMPLEMENT. =============================================================== 2.11 ONE SECOND DELAY LOOP IN BASIC 100 FOR J=1 TO 500:NEXT J --------------------------------------------------------------- 2.12 A 0.81 SECOND DELAY LOOP IN THE MONITOR 100 POKE 260,39 : POKE 261,224 110 X=USR(O) : REM 0.81 SEC DELAY WITH EACH CALL THIS 'CASSETTE OFF' ROUTINE GIVES 0.81 SECONDS OF DELAY. ===========~========================================== ========= 2.13 A 3.24 SECOND DEL A V LOOP IN THE MONITOR 100 POKE 260,160 : POKE 261,226 110 X=USR(O) : REM 3.24 SEC DELAY WITH EACH CALL 2.14 MULTIPLE LINE CHARACTER STRINGS. GRAPHICAL FIGURES WHICH OCCUpy THREE OR FOUR PRINT LINES AND ARE A FEW CHARACTERS WIDE MAY BE CREATED IN A SINGLE STRING AND PRINTED WITH ONE PRINT STATEMENT. A SINGLE PRINT STATEMENT USED TO PLACE THE FIGURE ON THE SCREEN IS MUCH FASTER THAN PRINTING THE FIGURE WITH MULTIPLE PRINT STATEMENTS. '" EXAMPLE: .. 100 A$ = "***** * * * * *****" 110 PRINT A$ THE ABOVE PROGRAM WILL PRINT A BOX MADE FROM ASTERISKS. THERE ARE HIDDEN CHARACTERS IN LINE 100 THAT MAKE THE STRING A$ PRINT THE BOX ON FOUR LINES. A STRING BEGINS AND ENDS WITH QUOTE MARKS, AND MAY CONTAIN ANY CHARACTERS. OUR STRING CONTAINS THE ASTERISKS THAT ARE SEEN, PLUS 'LINE FEED', 'CURSOR LEFT' AND 'SPACE' CHARACTERS. THE STRING CONSISTS OF THE FOLLOWING SEQUENCE OF CHARACTERS IN THE ORDER PRESSED FROM THE KEYBOARD: A$ = * * ** ** * * * *****" II THE STRING A$ IS 38 CHARACTERS IN LENGTH. IS A LINE FEED CHARACTER. IS A CURSOR LEFT CHARACTER. --------------------------------------------------------------2.15 PRINT DECIMAL NUMBER IN HEXADECIMAL. 0000: 0004: 0005: 0008: 0009: ED 5B 07 01 ENTRY LD 57 LD CD EB E1 CALL C1 POP C9 RET DE,(0107H) D,A OE1E8H BC ;GET I # IN E ;GET J # IN D ;PRINT HEX # ;RELIEVE STACK ROUTINE MUST RESIDE AT ADDRESS 0 FOR RST OH COMMAND. 100 110 120 130 POKE 262,199 : REM 'OUT I,J' BECOMES RST OH COMMAND. INPUT X : REM X IS DECIMAL # TO PRINT IN HEX. I=X : IF X>32767 THEN I=x-65536 OUT I AND 255, X/256 : REM HEX # IS PRINTED. ---------- -- ------ ----- ------- 2.16 PRINT DECIMAL NUMBER IN HEXADECIMAL 0000: CD DO C7 0003: C3 E8 E1 100 POKE 260,0 110 X = USR(J) • ;GET USR() # ;PRINT HEX # ENTRY CALL OC7DOH JP OE1E8H POKE 261,0 : REM USR() ENTRY ADDRESS : REM PRINT HEX VALUE OF J --------------------------------------------------------------- 2.17 PRINT DECIMAL NUMBER IN HEXADECIMAL. 0000 0003 11 yy xx C3 E8 El ENTRY LD JP DE,nn OE1E8H nn IN DECIMAL PRINT HEX # TO USE THE ABOVE MACHINE LANGUAGE ROUTINE, FIRST PLACE DECIMAL NUMBER TO CONVERT IN BYTES 1 AND 2. EXAMPLE: 100 POKE 260,0 : POKE 261,0 : REM USR() ADDR 110 POKE 1,J AND 255 : POKE 2,J/256 120 X=USR(O) : REM PRINT HEX EQUIVALENT OF J =============================================================== 2.18 CONVERT HEXADECIMAL TO DECIMAL 100 110 120 130 140 150 160 170 DEF FNA(X) = (X AND 15) - 9 * (X > 64) . A$ = IFC07" : REM TYPICAL HEXADECIMAL # TO CONVERT . N=O : FOR J=l TO LEN(A$) N=N*16 + FNA(ASC(MID$(A$,J») : NEXT J PRINT A$; II HEXADECIMAL EQUALS "; N; II DECIMAL" =============================================================== 2.19 CONVERT DECIMAL TO HEXADECIMAL 100 110 120 130 140 150 160 N = 4000 : REM TYPICAL NUMBER TO CONVERT TO HEX J = N : A$="II :REM A$ TO RECEIVE HEXADECIMAL DIGITS I = J AND 15 : J = INT(J/16) A$= CHR$(I+48 - 7*(I > 9» + A$ : IF J>O THEN 130 . PRINT N;" DECIMAL EQUALS ";A$;" HEXADECIMAL" 2.20 MENU SELECTION USING 'IF X THEN RUN' STATEMENT 100 PRINT IIMENU SELECTION II 110 PRINT II 1 - FIRST PROGRAM II 120 PRINT II 2 - SECOND PROGRAM II 130 PRINT II 3 - THIRD PROGRAM II 140 · 150 INPUT IIENTER SELECTION NUMBER II;X 160 IF X=l THEN RUN 1000 170 IF X=2 THEN RUN 2000 180 IF X=3 THEN RUN 3000 190 PRINT IIENTER NUMBER FROM 1 TO 3, PLEASE II 200 1000 REM FIRST PROGRAM 2000 REM --- SECOND PROGRAM --3000 REM --- THIRD PROGRAM --'RUN ' ALL VARIABLES ARE RESET BY THE .' GOTO 150 I COMMAND. -------------------------------------------------------------- 2.21 CARTESIAN COORDINATES FROM POLAR EQUATIONS. 100 110 120 130 140 200 210 220 230 240 250 260 270 FOR TH = 0 TO 180 R = COS(TH / 57.2958) GOSUB 200 NEXT TH : END REM PLOT MANY POINTS REM SAMPLE POLAR FUNCTION REM CONVERT TO (X,Y) · REM --- CONVERT RADIUS R AND ANGLE TH TO (X,Y) --- · X = R Y = R * SIN(TH / 57.2958) * COS(TH / 57.2958) REM --- NOW SCALE AND PLOT COORDINATE (X,Y) --RETURN --------------------------------------------------------------- 2.22 SHELL SORT TO PUT ARRAY 100 110 120 130 140 150 160 170 180 ZO IN ASCENDING ORDER D = N :REM N=# OF ELEMENTS IN ARRAY Z() D = INT(D/2) FOR I=l TO N-D IF Z(I) <= Z(I+D) THEN 160 T=Z(I) : Z(I)=Z(I+D) : Z(I+D)=T IF I>D THEN IF Z(I-D) > Z(I) THEN I=I-D GOTO 140 NEXT I IF D > 1 THEN 110 RETURN . --- CHAPTER 3 FUNCTIONS 3.01 RANDOM NUMBER FUNCTION J=RND(X) PRODUCES THE FOLLOWING DEPENDING ON X: X>O X=O X 0 INT(xx.yy) = xx INT(7.36) = 7 xx.yy < 0 INT(xx.yy) = xx - 1 INT(-7.3) = -8 ============================================================== 3.04 SGNO FUNCTION SGN(X) = 1 WHEN SGN(X) = 0 WHEN SGN(X) = -1 WHEN X > X = X < o. o. o. . - ---------- ---, ~-- ----~~ 3.05 DEF FUNCTION RULES THE FIRST 2 LETTERS MUST BE IFNI. THE THIRD CHARACTER MUST BE A LETTER. ADDITIONAL CHARACTERS ARE OPTIONAL. THE NAME CANNOT CONTAIN ANY RESERVED WORDS. ONLY THE 2 CHARACTERS AFTER THE FN MAKE THE NAME UNIQUE. EXAMPLES: FNA( FNX1( FNAA( FNSQ( FNUPPER( THE ARGUMENT VARIABLE IS A DUMMY USED TO 'MAP' VALUES INTO THE FUNCTION IF DESIRED. OTHER VARIABLES IN THE FUNCTION USE THEIR CURRENT VALUES. EXAMPLE: 100 DEF FNA(J)= J * J + X 110 J=5 : X=3 : PRINT FNA(2) OUTPUT: 7 SINCE J WAS THE DUMMY ARGUMENT, IT MAPPED A 2 INTO THE FUNCTION RATHER THAN USE ITS CURRENT VALUE OF 5. THE CURRENT VALUE OF X WAS USED. THUS, 7 = 2 * 2 + 3. =============================================================== 3.06 DECIMAL POINT ALIGNMENT 100 DEF FNA(J)= (J=O) - (ABS(J) 9) EXAMPLE: OUTPUT: PRINT CHR$(FNA(14» D =============================================================== 3.10 FIX COMMAND 100 DEF FNA(J) = SGN(J) * INT(ABS(J» EXAMPLE: OUTPUT: PRINT FNA(-5.2) -5 =============================================================== 3.11 BASE 10 LOGORITHM 100 DEF FNLOG10(J) = LOG(J) * 0.4342945 EXAMPLE: OUTPUT: PRINT FNLOG10(1000) 3 =============================================================== 3.12 PI = 3.14159 = 355/113 57.2958 = 180 / PI 100 DEF FND(J) = J * PI / 180 110 DEF FNR(J) = J * 180 / PI REM DEGREES TO RADIANS REM RADIANS TO DEGREES ----------- CHAPTER 4 --- KEYBOARD 4.01 ACCEPT 'YES' ANSWER WITH INPUT OF 'Y', 'YE' OR 'YES' 100 INPUT "ENTER 'YES' OR 'NO''';A$ 110 IF LEFT$("YES",LEN(A$»=A$ THEN PRINT "YES" =============================================================== 4.02 KEYBOARD SCAN OR 'GET' COMMAND 100 POKE 318,195 : POKE 320,224 110 X=INP(9) : A$=CHR$(X) X = ASCII VALUE OF KEY DEPRESSED. X = 0 IF NO KEY IS DEPRESSED. A$= CHARACTER KEYED. 'RETURN' NOT REQUIRED. --------------------------------------------------------------4.03 PRINT ON LINE AFTER INPUT STATEMENT. 100 B$="ENTER EXAMPLE TEXT" 110 PRINT B$;:INPUT A$ 120 PRINT TAB(LEN(B$)+LEN(A$)+5);CHR$(23);"THANK YOU" THE ABOVE EXAMPLE TABS BEYOND THE LENGTH OF THE USER'S INPUT TO PRINT THE COMPUTER'S RETURN RESPONSE ON THE SAME LINE AS THE INPUT. =============================================================== 4.04 INPUT STRINGS CONTAINING COMMAS AND '@' SYMBOLS 100 110 120 200 210 220 POKE 318,195 : POKE 320,224 GOSUB 200 : PRINT A$ : END : A$="" : REM INPUT A$ UNTIL RECEIVED J = INP(9) : IF J=13 THEN RETURN A$ = A$ + CHR$(J) : GOTO 210 4.05 KEYBOARD SCAN OF 'GRAPHIC', 'CONTROL', AND 'SHIFT'. 100 J=INP(254) AND 31 J J J J J = 31 = 21 = 7 = 5 = 23 IF IF IF IF IF 'CONTROL' KEY IS DEPRESSED. 'GRAPHIIC' KEY IS DEPRESSED. 'SHIFT' KEY IS DEPRESSED. 'GRAPHIC - SHIFT' KEYS ARE DEPRESSED. 'NO KEY IS DEPRESSED. 'SHIFT LOCK ' KEY MUST BE DOWN. =============================================================== 4.06 WAIT FOR USER TO PRESS 'SHIFT' KEY TO CONTINUE. 100 PRINT "PRESS 'SHIFT' TO CONTINUE" 110 WAIT 254,31,23 120 PRINT "I WAS WAITING FOR YOU. THANKS. II CHAPTER 5 --- VIDEO 5.01 DOUBLE SPACE LISTINGS. POKE 322,0 : LIST --------------------------------------------------------------- 5.02 SCREEN POKE ADDRESS FOR ANY ROW AND COLUMN. 100 DEF FNA(J) = R * 64 + C - 3968 R = ROW NUMBER FROM 0 TO 29. C = COLUMN NUMBER FROM 0 TO 63. --------------------------------------------------------------- 5.03 MAKE THE CURSOR DISAPPEAR AFTER A PRINT. 100 PRINT CHR$(17); : POKE -3968,32 OR, JUST REPLACE THE CHARACTER UNDER THE CURSOR WITH: 100 POKE 260,232 : POKE 261,233 : J=USR(O) --------------------------------------------------------------- 5.04 REMOVE CURSOR FROM SCREEN. 100 PRINT CHR$(12) : POKE -3904,32 --------------------------------------------------------------- 5.05 SCREEN ADDRESSING ADDRESS OF THE FIRST COLUMN IN EACH VIDEO LINE. LINE# HEX ----- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 F080 FOCO F100 F140 F180 F1CO F200 F240 F280 F2CO F300 F340 F380 F3CO F400 POKE DECIMAL ------------ -3968 -3904 -3840 -3776 -3712 -3648 -3584 -3520 -3456 -3392 -3328 -3264 -3200 -3136 -3072 LINE# ----16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 HEX F440 F480 F4CO F500 F540 F580 F5CO F600 F640 F680 F6co F700 F740 F780 F7CO POKE DECIMAL ------------ -3008 -2944 -2880 -2816 -2752 -2688 -2624 -2560 -2496 -2432 -2368 -2304 -2240 -2176 -2112 5.06 SYNC SCREEN MOTION WITH VIDEO HORIZONTAL SYNC. 100 WAIT 254,32 THIS WILL REMOVE SCREEN FLICKER AND DISAPPEARANCE OF CHARACTERS DURING SCREEN MOTION DUE TO BEING OUT OF SYNC WITH THE SCREEN REFRESH CIRCUITRY. -------------~---------------------------------------- ----------------------------------------------------------------------- 5.07 PRINT AT SUBROUTINE 100 CLEAR 200 : REM CURSOR DOWN 110 R$=CHR$(26) : REM CURSOR RIGHT 120 C$=CHR$(19) 130 FOR J=l TO 6 : R$=R$+R$ : C$=C$+C$ : NEXT J 140 R$=CHR$(17)+R$ : REM ADD CURSOR HOME 150 160 REM --- PRINT TEXT AT ROW R, COLUMN C --170 180 R=5 : C=10 : A$="THIS IS AN EXAMPLE" : GOSUB 1000 190 END 200 1000 REM --- PRINT AT SUBROUTINE --1010 : 1020 PRINT LEFT$(R$,R);LEFT$(C$,C);A$ : RETURN =============================================================== 5.08 PLACE CURSOR AT ROW AND COLUMN. THIS ROUTINE MUST BE LOCATED STARTING AT ADDRESS 0, BECAUSE THE 'OUT' INSTRUCTION IS MADE INTO A RST OH COMMAND. 0000: 0001: 0004: 0007: 0009: OOOA: OOOB: OOOC: OOOD: OOOE: OOOF: 0012: 0015: 0018: OOlE: 001D: OOlE: 001F: E5 CD 2A 26 29 29 29 29 29 29 FD FD FD CD 36 El Cl C9 A2 E1 07 01 00 75 74 77 CC 20 68 69 6A E9 ENTRY PUSH CALL LD LD ADD ADD ADD ADD ADD ADD LD LD LD CALL LD POP POP RET HL OE1A2H HL,(0107H) H,O HL,HL HL,HL HL,HL HL,HL HL,HL HL,HL (IY+68H),L (IY+69H),H (IY+6AH),A OE9CCH (HL),20H HL BC ;GET IY ;GET ROW # ;*2 ;*4 ;*8 ;*16 ;*32 ;*64 ;ROW ADDRESS ;COL ADDRESS ;MOVE CURSOR ;STORE SPACE ;RELIEVE STACK CALLING THE ROUTINE WILL MOVE THE CURSOR TO THE REFERENCED SCREEN POSITION AND PLACE A SPACE THERE. EXAMPLE: 100 POKE 262,199 : REM INSERT RST OH COMMAND 110 OUT 7,15 : REM CURSOR TO ROW 7, COL 15 120 PRINT "TEXT STARTS ON ROW 7, COLUMN 15" =============================================================== 5.09 PLACE CURSOR AT ROW AND COLUMN. 0000: 0001: ROW COL DEFB 0 DEFB 0 ; 0002: 0005: 0008: 0009: OOOB: oooc: DODD: OOOE: OOOF: 0010: 0011: 0014: 0017: 001A: 001D: 001F: CD 2A 7C 26 29 29 29 29 29 29 FD FD FD CD 36 C9 A2 E1 00 00 00 75 74 77 CC 20 68 69 6A E9 ENTRY CALL LD LD LD ADD ADD ADD ADD ADD ADD LD LD LD CALL LD RET OE1A2H HL, (ROW) A,H H,O HL,HL HL,HL HL,HL HL,HL HL,HL HL,HL (IY+68H),L (IY+69H) , H (IY+6AH) ,A OE9CCH (HL),20H POKE ROW NUMBER IN ADDRESS O. POKE COLUMN NUMBER IN ADDRESS 1. ;GET IY ;*2 ;*4 ;*8 ;*16 ;*32 ;*64 ;ROW ADDRESS ;COL ADDRESS ;MOVE CURSOR ;STORE SPACE RANGE 0 - 29. RANGE 0 - 63. CALLING THE ROUTINE WILL MOVE THE CURSOR TO THE REFERENCED SCREEN POSITION AND PLACE A SPACE THERE. EXAMPLE: 100 110 120 130 140 200 POKE 260,2 : POKE 261,0 : REM USR() ADDR R=7 : C=15 : GOSUB 200 PRINT "TEXT STARTS ON ROW 7, COLUMN 15" STOP . POKE O,R : POKE 1,C : J=USR(O) : RETURN 5.10 DRAW BOX ROUTINE THIS ROUTINE WILL DRAW A BOX AROUND A TEXT STRING. PUT STARTING LOCATING OF STRING IN ROW AND COL, AND ITS SIZE IN LENGTH. THIS ROUTINE USES THE CURSOR PLACEMENT ROUTINE OF 5.09 0020: 00 2430: 2433: 2434: 2435: 2436: 2439: 243A: 243D: 243F: 2442: 2443: 2445: 2446: 2448: 2449: 244c: 244D: 244E: 244F: 2450: 2452: 2453: 2455: 2456: 2458: 245B: 245C: 245E: 245F: 2461: 2462: 2464: 2466: 2468: 21 35 23 35 3A 47 CD 36 11 19 36 19 36 E5 11 19 D1 23 13 36 EB 36 EB 10 11 23 36 19 36 19 36 3E 2E C3 00 00 CURSOR EQU LENGTH ORG 20H DEFB 0 BOX 20 00 00 02 BC 40 00 A2 BE 80 FF HaRZ 97 97 F6 40 00 BD A2 BF 00 00 09 00 ORG LD DEC INC DEC LD LD CALL LD LD ADD LD ADD LD PUSH LD ADD POP INC INC LD EX LD EX DJNZ LD INC LD ADD LD ADD LD LD LD JP .,. 02H 2430H HL,ROW (HL) HL (HL) A, (LENGTH) B,A CURSOR (HL),OBCH DE,040H HL,DE (HL),OA2H HL,DE (HL),OBEH HL DE,OFF80H HL,DE DE HL DE (HL),097H DE,HL (HL),097H DE,HL HORZ-$ DE,040H HL (HL),OBDH HL,DE (HL),OA2H HL,DE (HL),OBFH A,OOOH L,OOOH CURSOR+7 .- ;STRING START ;BOX CORNER ;CURSOR TO CORNER ;TOP LEFT CORNER ;DOWN ONE ROW ;LEFT SIDE ;DOWN ONE ROW ;BOTTOM CORNER ;SAVE CORNER ADDR ;UP THREE ROWS ;HL = TOP ADDR ;DE = BOTTOM ADDR ;DRAW TOP LINE ;DRAW BOTTOM LIN~ ;LOOP ON LENGTH ;TOP RIGHT CORNER ;RIGHT SIDE ;BOTTOM CORNER ;CURSOR TO HOME 5.11 CREATE INVERSE VIDEO CHARACTER SET 100 FOR J=-1024 TO -1 110 POKE J,256 + NOT PEEK(J-1024) 120 NEXT J USE THE IGRAPHIC I AND THE ISHIFT GRAPHIC I KEYS TO DISPLAY THE INVERSE VIDEO CHARACTER SET. THE SAME THING IS DONE BELOW IN MACHINE LANGUAGE: 0000: 0001: 0002: 0003: 0004: 0007: OOOA: OOOD: OOOE: OOOF: 0010: 0011: 0012: 0013: 0015: 0016: 0017: 0018: 0019: E5 D5 C5 F5 21 11 01 7E 2F 12 23 13 OB 20 F1 C1 D1 E1 C9 00 F8 00 FC 00 04 F8 ENTRY PUSH PUSH PUSH PUSH LD LD LD LOOP LD CPL LD INC INC DEC JR POP POP POP POP RET HL DE BC AF HL,OF800H DE,OFCOO BE,0400H A, (HL) ;SAVE REGS ;CHARACTER SOURCE ; DESTINATION ;1024 COUNTER ;GET A ROW ;INVERT IT ;MOVE IT DOWN (DE) , A ;HL = HL + 1 HL ;DE = DE + 1 DE ;COUNT IT BC NZ,LOOP-$ ;REPEAT TIL DONE AF BC DE ;RESTORE REGS HL NOW THAT THE INVERSE CHARACTER SET HAS BEEN CREATED, LET1S PRINT INVERSE TEXT FROM THE STRING A$. 200 300 310 320 330 340 INPUT A$ : GOSUB 300 : GOTO 200 . REM THIS ROUTINE PRINTS A$ IN INVERSE VIDEO : FOR J=l TO LEN(A$) PRINT CHR$(ASC(MID$(A$,J» OR 128); : NEXT J RETURN 5.12 CREATE DOUBLE WIDE CHARACTER SET 64 ASCII CHARACTERS FROM ASCII 20H (SPACE) THROUGH ASCII 5FH (UNDERSCORE) WILL BE MADE INTO DOUBLE WIDE CHARACTERS USING THE 128 AVAILABLE GRAPHIC CHARACTERS. THIS DOUBLE WIDE CHARACTER SET INCLUDES THE DIGITS, SYMBOLS, AND THE UPPER CASE LETTERS. THIS ROUTINE WILL CREATE THE DOUBLE WIDE CHARACTER SET. 100 110 120 130 140 FOR J= 32 TO 95 : I=(J-256)*8 : K=(2*J-192)*8 FOR L= 0 TO 7 : M=PEEK(I+L) : N=INT(M/16): P=M AND 15 R=O : s=o : FOR T= 0 TO 3 : V=2AT R=R+(N AND V)*V*3 : S=S+(P AND V)*V*3 : NEXT T POKE K+L,R : POKE K+L+8,S : NEXT L,J A CHARACTER WITH ASCII VALUE J CAN BE PRINTED IN DOUBLE WIDTH USING THE TWO GRAPHIC CHARACTERS WITH ASCII VALUE OF 2*J + 64 AND 2*J + 65. SEE THE FOLLOWING EXAMPLE. 150 A$="SAMPLE TEXT STRING TO PRINT" 160 FOR 1=1 TO LEN(A$) : J=ASC(MID$(A$,I»*2+64 170 PRINT CHR$(J);CHR$(J+1); : NEXT I OR, YOU MAY WISH TO HAVE THE CHARACTERS SENT TO THE VIDEO DISPLAYED IN DOUBLE SIZE AUTOMATICALLY. THIS CAN BE ACCOMPLISHED USING THE FOLLOWING VIDEO DRIVER. CHANGE THE >SE O=xxyy VECTOR ADDRESS TO POINT TO THIS ROUTINE, IE. >SE 0=0000, OR POKE 32720,0 POKE 32721,0 FOR 32K. 0000: 0002: 0005: 0006: 0008: OOOB: OOOC: FE FA 87 c6 CD 3C C3 20 1B EO 40 1B EO 1B EO CP JP ADD ADD CALL INC JP 32 M,VIDEO A,A A,64 VIDEO A VIDEO ;CHAR BEFORE SPACE ;YES, EXIT TO VIDEO ;J*2 ;J*2+64 ;PRINT LEFT HALF ;J*2+65 ;PRINT RIGHT HALF I I CHAPTER 6 --- JOYSTICKS 6.01 JOYSTICK / KEYBOARD STANDARD FOR THE SORCERER This standard has been adopted by several software houses in the USA and in Australia. Software offered by these vendors which employs joystick/keyboard control will conform to this standard. It is suggested that all SORCERER owners use this standard for international compatibility of software and hardware. Two joysticks may be attached to the INPUT of the parallel port. UNIT #1 uses the LOW-order 4 bits, and UNIT #2 uses the HIGH-order 4 bits. Each unit may steer in the four basic directions, LEFT, RIGHT, UP, DOWN, as well as in the four diagonal directions. Both units operate independently, and simultaneous operation is permitted. FIRE BUTTON control may be included, and has priority over directional control of the joystick unit it is attached to. FIRE BUTTON is activated by grounding both BIT 0 and BIT I for unit #1, and BIT 4 and BIT 5 for unit #2 . KEYBOARD has priority over JOYSTICK, and overrides both joystick units if used. KEYBOARD INPUT RESULT is returned as the RESULT CODE of joystick unit #1, with joystick unit #2 disabled. Keyboard directional control is via the arrow (normally cursor control) keys in the NUMERIC KEYPAD only. The SHIFT key need not be depressed when using these keys. FIRE BUTTON on the keyboard is the NUMERIC-PAD 115 11 key (HOME). Optional FIRE BUTTONS may be SKIP/TAB or SPACE BAR. FIRE BUTTON overrides directional keys on the keyboard. II II In the event that both the LEFT and the RIGHT keys are pressed together, it is treated as NO INPUT. The same rule applies to depressing both the UP and the DOWN keys together. The UP/LEFT (117 11 ), UP/RIGHT (119 11 ), DOWN/LEFT (11111) and DOWN/RIGHT (113 11 ) keys on the numeric-pad are optional. For programming in z80 machine code, the 8-bit INPUT RESULT CODE is returned in the A-register. No other registers are affected .. If there is no input, then return with a zero in the A-register and with the Z-flag set. 6.02 JOYSTICK INTERFACE STANDARD TO PARALLEL PORT BIT PIN FUNCTION BIT PIN FUNCTION 12 24 13 25 12/24 20 UNIT #2 UNIT #2 UNIT #2 UNIT #2 UNIT #2 +5 VOLT -------- 0 1 2 3 0-1 10 22 11 23 10/22 8 UNIT #1 UNIT #1 UNIT #1 UNIT #1 UNIT #1 Ground -------- LEFT RIGHT UP DOWN FIRE 4 5 6 7 4-5 LEFT RIGHT UP DOWN FIRE SUPPLY --------------------------------------------------------------- 6.03 JOYSTICK CIRCUIT DIAGRAM ATARI joysticks can be easily modified to connect directly to the parallel port. A 4.7K 1/4 watt resistor pulls-up each direction input to +5 volts at the nodes marked with ·Y· in the diagram. The FIRE BUTTON employs the two diodes between the LEFT and the RIGHT direction inputs, and GROUND connects to the common line. When the joystick selects a direction, or the fire button is pressed, a switch closes which changes the input bit from +5 volts to ground. switch UP Y »------------+----0 0----+ DOWN Y »------------+----0 RIGHT Y »--------+---+----0 I I 0----+ I I 0----+ I I \ / DIODE V FIRE +--------0 I A / \ ----I LEFT I DIODE I I I I I I I 0----+ I I I I I I I Y ---»--------+-----+--0 0----+ I GROUND I »-------------------------+ 6.04 JOYSTICK EXAMPLE USING BASIC STATEMENTS 100 A = 255 - INP(255) : REM READ PARALLEL PORT 110 IF (A AND 3)= 3 THEN IIFIRE BUTTON UNIT #1 120 IF (A AND 48)=48 THEN IIFIRE BUTTON UNIT #2 11 11 130 140 150 160 IF IF IF IF A A A A AND AND AND AND 1 2 4 8 170 180 190 200 IF IF IF IF A A A A AND 16 AND 32 AND 64 AND 128 THEN II UNIT #1 LEFT II THEN II UNIT #1 RIGHT II THEN II UNIT #1 UP II THEN II UNIT #1 DOWN II THEN THEN THEN THEN 210 GOTO 100 : REM UNIT UNIT II UNIT II UNIT II II #2 #2 #2 #2 LEFT II RIGHT II UP II DOWN II SCAN AGAIN Use the Basic statements to observe the state of the joysticks. The text strings tell what to do after determining the condition of the joysticks. If you branch to a routine to service Unit #1, be sure to return to the testing of Unit #2 so that it can operate simultaneous with Unit #1. =============================================================== 6.05 JOYSTICK EXAMPLE USING MACHINE LANGUAGE CODE The joystick source lising of section 6.06 is a useful routine that loads into memory from address 0 through A4 hex. To use the routine from a Basic program, set the USR() jump address to 0 as shown on line 100 below. Now initialize the location of each joystick cursor by placing a screen row number and a column number in the following addresses using POKE statements: (See example on line 110 below.) ADDRESS 2 3 4 5 6 - #1, RANGE (1. .. 30). #1, RANGE (1. .. 64) . #2, RANGE (1. .. 30). #2, RANGE (1. .. 64). UNITS: = 1 UNIT #1 ONLY = 2 UNIT #2 ONLY = 3 BOTH UNITS FIRING. 7,8 - SCREEN ADDRESS OF UNIT #1 9,10 - SCREEN ADDRESS OF UNIT #2 100 110 120 130 140 150 160 170 ROW # COLUMN # ROW # COLUMN # FIRE FOR UNIT UNIT UNIT UNIT BOTH POKE 260,0:POKE 261,0:PRINT CHR$(12):REM POKE 2,1:POKE 3,1:POKE 4,1:POKE 5,1 :REM Z=USR(O) :REM L=PEEK(2)*64+PEEK(3)-4033 :REM POKE L,ASC(1I1 :REM M=PEEK(9)+PEEK(10)*256-65536 :REM POKE M,50 :REM GOTO 120 :REM 11 ) USR() ADDR INITIALIZE GET JOYSTICK SCREEN ADDR CURSOR #1 ANOTHER WAY CURSOR #2 DO AGAIN 6.06 MACHINE LANGUAGE JOYSTICK ROUTINE This routine reads the status of the joysticks connected to the parallel port and updates the ROW, COLUMN and FIRE variables for each joystick. The routine will keep the row variables in the range of (1~ .. 30), and the column variables in the range of (1 ... 64). The user's Basic program can access these variables to compute the screen position of each joystick, or read directly the contents of ADDR1 and ADDR2. Section 6.05 gives an example of how Basic might access this routine. 0000: 18 09 ENTRY JR START-$ 0002: 0003: 0004: 0005: 0006: 0007: 0009: ROW1 COL1 ROW2 COL2 FIRE ADDR1 ADDR2 , LEFT1 RIGHT1 UP1 DOWN1 FIRE1 LEFT2 RIGHT2 UP2 DOWN2 FIRE2 DEFB DEFB DEFB DEFB DEFB DEFW DEFW 1 1 1 1 0 0 0 EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0 1 2 3 3 4 5 6 7 48 IN CPL OR LD LD RET A,(OFFH) ;GET JOYSTICK A HL,FIRE (HL),OOOH Z ;ANY ACTIVITY PUSH AND CP JR INC POP PUSH AND CP JR INC INC AF FIRE1 FIRE1 NZ,L001D-$ (HL) AF AF FIRE2 FIRE2 NZ,L0027-$ (HL) (HL) 01 01 01 01 00 00 00 00 00 , ,. OOOB: OOOD: OOOE: OOOF: 0012: 0014: DB FF 2F B7 21 06 00 36 00 c8 0015: 0016: 0018: 001A: 001C: 001D: 001E: 001F: 0021: 0023: 0025: 0026: F5 E6 FE 20 34 F1 F5 E6 FE 20 34 34 START 03 03 01 L001D 30 30 02 - --------_. ~~ ;REMOVE FIRES ;RET IF IDLE ;FIRE1 ACTIVE ;FIRE2 ACTIVE H D = COLUMN = COLUMN 1 2 L E = ROW = ROW 1 2 INCREMENT COL IF RIGHT INCREMENT ROW IF DOWN DECREMENT COL IF LEFT DECREMENT ROW IF UP ; 0027: 0028: 002B: 002F: 0031: 0033: 0034: 0036: 0038: 0039: 003B: 003D: 003E: 0040: 0042: 0043: 0045: 0047: 0048: 004A: 004c: 004D: 004F: 0051: 0052: 0054: 0056: F1 2A ED CB 28 25 CB 28 15 CB 28 24 CB 28 14 CB 28 2D CB 28 1D CB 28 2C CB 28 lC 02 00 5B 04 00 47 01 L0027 67 01 L0034 4F 01 L0039 6F 01 L003E 57 01 L0043 77 01 L0048 5F 01 Lo04D 7F 01 L0052 POP LD LD BIT JR DEC BIT JR DEC BIT JR INC BIT JR INC BIT JR DEC BIT JR DEC BIT JR INC BIT JR INC AF HL, (ROW1) DE, (ROW2) LEFT1,A Z,L0034-$ H LEFT2,A Z,L0039-$ D RIGHT1,A Z,L003E-$ H RIGHT2,A Z,L0043-$ D UP1,A Z,L0048-$ L UP2,A Z,L004D-$ E DOWN1,A Z,L0052-$ L DOWN2,A Z,L0057-$ E COLUMN RANGE: ROW RANGE: 0057: 0059: 005A: 005C: 005D: 005E: 0060: 0061: 0063: 0064: 0066: 0067: 0068: 006A: 3E BD 20 2D BB 20 ID 3E BC 20 25 BA 20 15 1F ,. L0057 01 01 41 L005D L0061 01 01 Lo067 LD CP JR DEC CP JR DEC LD CP JR DEC CP JR DEC 1 - 64 1 - 30 A,31 L NZ,L005D-$ L E NZ,L0061-$ E A,65 H NZ,L0067-$ H D NZ,L006B-$ D ;ROW LIMIT ;COL LIMIT ,. 006B: 006D: 006E: 0070: 0071: 0072: 0074: 0075: 0076: 007B: 0079: 007A: 007C: 3E BD 20 2C BB 20 1C BC 20 24 BA 20 14 007D: ooBO: 00B4: 00B7: OOBA: OOBD: 0090: 0093: 22 ED CD 22 2A CD 22 C9 00 L006B 01 L0071 01 L0075 01 L0079 01 ,. 02 53 94 07 04 94 09 00 L007D 04 00 00 00 00 00 00 LD CP JR INC CP JR INC CP JR INC CP JR INC A,OOOH L NZ,L0071-$ L E NZ,L0075-$ E H NZ,L0079-$ H D NZ,L007D-$ D ;KEEP > 0 LD LD CALL LD LD CALL LD RET (ROW1),HL (ROW2) ,DE ADDRESS (ADDR1),HL HL,(ROW2) ADDRESS (ADDR2),HL ;ROW1 - COL1 ;ROW2 - COL2 ;SCREEN ADDR1 ;SCREEN ADDR2 CONVERT ROW AND COL TO A SCREEN ADDRESS STORED IN ADDR1 AND ADDR2 , 0094: 0095: 0097: 0099: 009A: 009B: 009C: 009D: 009E: 009F: OOAO: 00A3: 00A4: 5C 16 00 26 00 29 29 29 29 29 29 19 11 3F FO 19 C9 ADDR = SCREEN BASE ADDRESS LD LD LD ADD ADD ADD ADD ADD ADD ADD LD ADD RET + E,H D,OOOH H,OOOH HL,HL HL,HL HL,HL HL,HL HL,HL HL,HL HL,DE DE,OF03FH HL,DE -----~--- ROW * 64 + COL ;DE = COL ;HL = ROW *2 ,· *4 ,· *B ,· *16 ; *32 ;HL = ROW*64 ;ROW + COL ;SCREEN BASE ----- CHAPTER 7 --- SOUND 7.01 PRINCIPLE OF ONE VOICE SOUND Generating sound from your Sorcerer is not that difficult, and this discussion will help you get started by detailing a machine language routine to generate music. Letls use the parallel port as a means to output a signal to an external speaker since the Sorcerer does not have an internal speaker like some other computers do. I DO NOT recommend connecting a small 8 ohm speaker directly between one of the parallel portis output bits and ground. It is safer to have an output bit drive a transistorls base via a 1K resistor, and let the transistor switch current through a small speaker. Or, you may wish to use the music interface board that comes with our four voice Music System. The statement: 10 FOR I=l TO 100:0UT 255,255:0UT 255,0:NEXT I generates a low pitched note by toggling the output bits on the parallel port from high to low, back to high. It may be sufficient for your needs, but provides no control over the pitch of the sound. However, it illustrates the principle of how sound will be generated in machine language. The following code generates notes. 0000: 0001: 0002: 0003: 0006: 0007: 0008: 0009: OOOB: OOOD: OOOF: 0010: 0011: 0012: 0014: 0015: 0016: 0017: F5 C5 E5 21 79 2F 4F 06 D3 10 2B 7D B4 20 E1 C1 F1 C9 60 00 40 FF FE F2 ENTER PUSH PUSH PUSH LD TOP LD CPL LD LD OUT LOOP DJNZ DEC LD OR JR POP POP POP RET AF BC HL HL,DURATION A,C ;SAVE REGISTERS USED ; LENGTH OF SOUND ; TOGGLE OUTPUT BITS C,A B,PITCH (OFFH) ,A LOOP-$ HL A,L H NZ,TOP-$ HL BC AF ;FREQUENCY CONTROL ;TO PARALLEL PORT ; DELAY ;DOWN COUNT DURATION ;IS COUNT = o ? ;LOOP WHILE HL<>O ;RESTORE REGISTERS ;RETURN FROM SUBROUTINE You can vary the pitch by changing the values loaded into register B (ie. contents of address OAH.) How long the note is played is controlled by the duration value loaded into HL (ie. the contents of address 04H and 05H.) The routine above suffers from the effect of having the delay loop nested inside of the duration loop. If the delay loop is tight, then the duration is accordingly shortened, since the total time in the routine is the product of the two loop parameters. A routine which has a duration independent of the frequency is given in 7.02 7.02 ONE VOICE MUSIC ROUTINE FREQ DURATION SPEED OODO: 00D1: 00D2: 00D3: 00D4: 00D6: 00D9: OODA: OODD: 00E1: 00E3: 00E4: 00E7: 00E8: 00E9: OOEB: OOEE: OOFO: 00F1: 00F2: 00F3: 00F4: F5 C5 D5 E5 FD 21 4E 11 FD D3 OD C2 2F 4E FD DA FD E1 D1 C1 F1 C9 EQU EQU EQU ,. ORG PUSH PUSH PUSH PUSH PUSH E5 FC 00 ENTER LD LD FF 14 LD 2A FD 00 LD LOOP OUT FF DEC JP E9 00 CPL LD SKIP ADD 19 E1 00 JP E1 POP POP POP POP POP RET OFCH OFDH 14FFH ;STORE PITCH # IN 253 ;DURATION # IN 254 - 255. ;TEMPO FOR ENTIRE SONG. ODOH AF BC DE HL IY HL,FREQ C, (HL) DE, SPEED IY, (DUR) (OFFH),A C NZ,SKIP ;LOCATE ON ZERO PAGE ;SAVE REGISTERS C, (HL) IY,DE C,LOOP IY HL DE BC AF ;GET FREQUENCY # ;GET DURATION ;TO PARALLEL PORT ;IS IT TIME TO TOGGLE ;TOGGLE OUTPUT ;RELOAD FREQUENCY COUNT ;LOOP UNTIL DURATION UP ;RESTORE REGISTERS ; RETURN To use the above routine from Basic, store the frequency number in byte 253 with POKE 253,FREQ. Store the duration in bytes 254, and 255 with POKE 254,DURATION:POKE 255,0. Usually control from (254) is sufficient, and keep (255) at zero. Call the routine through the USR() function by poking the entry address into 260, and 261: POKE 260,214:POKE 261,O:X=USR(0). Here are frequency numbers to generate notes for one octave. Higher octaves can be obtained by dividing these numbers by 2, 4, and 8, etc. C - 268 E - 213 G# - 169 C# - 253 F - 201 A - 160 D - 239 F# - 190 A# - 151 D# - 226 G - 179 B - 142 Although the above music routine is fun and easy, its usefulness is no comparison to the enjoyment you'll get from the four voice Music System from Arrington Software Service. "I 7.02 ONE VOICE MUSIC ROUTINE FREQ DURATION SPEED EQU EQU EQU , ORG OODO: F5 PUSH 00D1: C5 PUSH 00D2: D5 PUSH 00D3: E5 PUSH 00D4: FD E5 PUSH 00D6: 21 FC 00 ENTER LD LD 00D9: 4E OODA: 11 FF FF LD LD OODD: FD 2A FD 00 LOOP OUT 00E1: D3 FF DEC 00E3: OD JP 00E4: C2 E9 00 CPL 00E7: 2F 00E8: 4E LD SKIP ADD 00E9: FD 19 OOEB: DA E1 00 JP OOEE: FD E1 POP OOFO: E1 POP 00F1: D1 POP 00F2: C1 POP POP 00F3: F1 00F4: C9 RET OFCH OFDH FFFFH ;STORE PITCH # IN 252 ;DURATION # IN 254 - 253. ;TEMPO FOR ENTIRE SONG. ODOH AF BC DE HL IY HL,FREQ C, (HL) DE,SPEED IY, (DUR) (OFFH),A C NZ , SKIP ;LOCATE ON ZERO PAGE ;SAVE REGISTERS C, (HL) IY,DE C,LOOP IY HL DE BC AF ;GET FREQUENCY # ;GET DURATION ;TO PARALLEL PORT ;TS IT TIME TO TOGGLE ;TOGGLE OUTPUT ;RELOAD FREQUENCY COUNT ;LOOP UNTIL DURATION UP ;RESTORE REGISTERS ; RETURN Tp use the above routine from Basic, store the frequency number in byte 252 with POKE 252,FREQ. Store the duration in bytes 254, and 253 with POKE 254,DURATION:POKE 253,0. Usually control from (254) is s~fficient, and keep (253) at zero. Call the routine through the USR() function by poking the entry address into 260, and 261: POKE 260,208:POKE 261,0:X=USR(0). Here are frequency numbers to generate notes for one octave. Higher octaves can be obtained by dividing these numbers by 2, 4, and 8, etc. C - 268 E - 213 G# - 169 C# - 253 F - 201 A - 160 D - 239 F# - 190 A# - 151 D# - 226 G - 179 B - 142 Although the above music routine is fun and easy, its usefulness is no comparison to the enjoyment you'll get from the four voice Music System from Arrington Software Service. f 7.03 PIEZO SPEAKER AUDIO PROMPTER A miniature 4.7 KHz piezo speaker can be purchased at Radio Shack for three dollars and connected directly to the Sorcerer's parallel port. Connect the red wire to pin 4, and the black wire to pin 8. The piezo speaker is a self contained chamber which resonates at a fixed frequency when activated with a voltage between 3 and 9 volts. Although I chose to connect the red wire to bit 7 of the port, any of the eight bit outputs will work equally well. The statement of OUT 255,128 causes bit 7 of the port to go to a logical high, thus sourcing the speaker with 5 volts. The 5 volts causes the speaker to continually sound until bit 7 is returned to a logical low with an OUT 255,0. The 255 is the address of the parallel port. Sending the command sequence of OUT 255,128:0UT 255,0 will cause the speaker to chirp since it sees a brief 5 volt pulse. This audio addition to the Sorcerer is inexpensive and has found frequent use in programs to signal an event in a program's execution, or to prompt the user that an input is required at the keyboard. This speaker cannot be used to reproduce the music spoken of in 7.01, 7.02, and 7.04. Also, it will not produce the sound that accompanies much of the game software on the market. --------------------------------------------------------------- 7.04 CONTROL 'G' BEEP THIS ROUTINE INTERCEPTS CONTROL 'G' CHARACTERS SENT TO THE VIDEO DRIVER AND OUTPUTS A BEEP. USE THE MUSIC INTERFACE BOARD FROM OUR MUSIC SYSTEM. ACTIVATE WITH 0000: 0002: 0005: 0006: 0007: OOOA: OOOB: OOOC: OOOD: OOOF: 0011: 0013: 0014: 0015: 0016: 0018: 0019: 001A: FE C2 C5 E5 21 79 2F 4F 06 D3 10 2B 7D B4 20 E1 C1 cg 07 FO E9 >SE 0=0 ENTER 60 00 TOP 40 FF FE F2 LOOP CP JP PUSH PUSH LD LD CPL LD LD OUT DJNZ DEC LD OR JR POP POP RET 7 NZ,VIDEO BC HL HL,DURATION A,C ;CONTROL G ? ;EXIT IF NOT ;LENGTH OF ;TOGGLE OUTPUT C,A B,PITCH (OFFH) , A LOOP-$ HL A,L H NZ,TOP-$ HL BC ; FREQUENCY ;PARALLEL PORT ; DELAY ;DOWN COUNT ;IS COUNT=O ? ;LOOP IF HL<>O ; RETURN - - - - _... _---------- CHAPTER 8 --- BASIC ROMPAC 8.01 BASIC ROMPAC MAP by P. HOLMICK NOTES: (1) Floating Point variables occupy 4 bytes. (2) ACC is the floating point accumulator 01BF to 01C2. (OlBF) = Least significant byte. (OlCO) = Next most significant byte. (OlC1) = Most significant byte. (OlC2) = Exponent. (3) NTF is the Number,Type Flag (0190). (0190) = 1 for Strings (0190) = 0 for Numbers (4) For arithmetic operations requiring 2 operands, one is usually the ACC, and the other is either (HL) or BCDE, where BCDE contains: B = Exponent.' C = Most significant byte. D = Next most significant byte. E = Least significant byte. (5) HL is used as the text pointer for most of the comparison or conversion routines. ADDRESS COOO: C06B: C075: coBo: COB2: COB5: coc6: FUNCTIONAL DESCRIPTION Moves a block of memory from C25B-C2A6 to 0100-014E. BASIC Warm Start "BYTES FREE" string. String address for double CR-LF. String address for single CR-LF. "EXIDY STANDARD BASIC VER 1.0 ..... etc." message string. Command Jump Table. D606,D6CA,D61C,0103,CEE9,D24A,CF17,DBBA,D999,D4AB,D908, DAOE,DA14,DA75,DABA,D6FE,D1BB,CF9F,D225,D19A,D1AB,D1BB, D1EB,D1F5 COF6: BASIC Token Table. END,FOR,NEXT,DATA,BYE,INPUT,DIM,READ,LET,GOTO,RUN,IF, RESTORE GOSUB,RETURN,REM,STOP,OUT,ON,NULL,WAIT,DEF,POKE, PRINT,CONT,LIST CLEAR,CLOAD,CSAVE,NEW,TAB(,TO,FN,SPC(, THEN,NOT,STEP,+,-,*,/,A, AND,OR,>,=,<,SGN,INT,ABS,USR, FRE,INP,POS,SQR,RND,LOG,EXP,COS,SIN,TAN,ATN,PEEK,LEN, STR$,VAL,ASC,CHR$,LEFT$,RIGHT$,MID$ C1El: Command Jump Table continued. C709,C62E,CB34,CBB5,E003,CA43,CD4F,CA72,C8CC,C872,C855, C944,C6DD,C861,CB90,CBB7,C707,D256,C926,C748,D25C,CF1F, D705,C96B,C735,C5C6,CBOF,D341,D2C9,C41A •. C21D: Jump Table for Arithmetic Operators (+,-,*,/,A,AND,OR) D7A2,D3AA,D4EA,D54B,D8C3,CCA8,CCA7 Includes a one-byte "precedence" value for each operator which tells the Interpreter the order of arithmetic computations. C232: start of Error Codes Table (2 Bytes each) C258: start of 4EH bytes to be copied into BASIC CONTROL AREA from 0100H C2A3: " ERROR" message C2AA: " IN " message. C2AF: "READY " message. C2B7: "BREAK" message. C2BD: Used by ... loops to manipulate SP so that knows where the last statement ends. C2EO: Gets variable name from a line of BASIC - loads it into the variable area. C2E6: Move bottom of program further down in memory. BC = Destination address. DE = Stopping address, ie. stop when HL = DE. HL = End of program address, ie. source address. C2F1: Check to see that there's enough free memory for next operation. C309: OM ERROR C30E: Puts last-used line number into (0147) so that BASIC will print "?SN ERROR IN xx". Where xx=Data Line Number C314: SN ERROR C317: /0 ERROR C31A: NF ERROR C320: UF ERROR C322: Prints error message. To use this routine, load the E register with Oto 24H before jumping here. -----------------------------------Error Message E = nn -----------------------------------NF Next Without For 00 SN Syntax 02 RG Return Without Gosub 04 OD Out of Data 06 FC Illegal Function Call 08 OV Calculation Overflow OA OM Out of Memory OC UL Undefined Line Number OE BS Bad Subscript 10 DD Redimensioned Array 12 /0 Division by Zero 14 ID Illegal Direct Mode 16 TM Type Mismatch 18 OS Out of String Space 1A LS String too Long 1C ST String Formula too complex 1E CN Can't Continue 20 UF Undefined User Function 22 MO Missing Operand 24 ------------------------------------ C359: C366: C3DD: C3EO: C3FA: C41A: C426: C45A: C467: C521: C53A: C565: C574: C57A: Print II READY II - back to DIRECT COMMAND mode. Same as C359 except doesn't print IIREADY". Reset Program pointers - rejustify Link Pointers. Rejustify Link Pointers (see also D394). This can be used to RECOVER a BASIC program after or RESET or even if the original program hasn't been over-written. Searches for a particular Line Number in a BASIC program. To search DE = required line number If found BC = Start of Line HL = Start of next line. Carry Flag is set (=1). Part of routine. Entering here resets HIMEM, STRING Space, and variable area pointers BUT doesn't destroy the first Link bytes thus not lIerasing" the program. Keyboard Input. Prints "?II then jumps to C53A. This routine scans the input Buffer and converts lower case to upper case (unless the text is enclosed in quotes) - converts BASIC reserved words to TOKENs. Resets HL = 014B and puts 3 zeros at end of program. Inputs a string of characters from the keyboard until RETURN is pressed. Uses the buffer from o14c to o18c. On exit, HL=014B and B=number of characters entered. This is where BASIC tests for buffer overflow but DOESN'T do anything about it !!! (Perhaps JR Z C550 would be a suitable patch.) Compares HL with DE and sets the flags accordingly. Z flag set when DE = HL. C flag set when DE < HL. Tests for lIexpected" characters such as commas, semicolons, and left and right brackets. To use HL should point to the BASIC text to test. CALL C57A II , Test for comma. NOTE: If a match is NOT made, then an ?SN error results II C585: Prints the character in the A register. This calls the Monitor Send Vector, EOOC. C5B4: This could be used to implement a or function. Inputs one character to the A register. Calls the Monitor Receive Vector, E009, but will not return until a key is pressed ! C5C6: C62E:
C66E: C689: Re-entry point to BASIC interpreter. HL should be pointing to the zero byte at the end of the line, or the colon in a multi- statement line. C6AD: BASIC Interpreter starts here. HL should point to the byte before the actual text to be interpreted. C6CD: Skips over blanks in the BASIC text by incrementing HL. The Carry Flag is set if the next character is a number. C6DD: C6F8: This is the routine that's supposed to pause LISTings if ESC or RUN/STOP was pressed, however the byte at C701 is wrong. It should be 1BH instead of 13H. .. C707: c709: C70E: Prints "BREAK" if CONTROL-C pressed in DIRECT MODE, else "BREAK IN .... line number" if in RUN MODE. C735: C74B: C75A: CLOAD* jumps here. (OlAF) = FF and (OlAC) = 01 C75F: CSAVE* jumps here. (OlAF) = 01 and (OlAC) = 01 Used by CSAVE* C7B9: Write 4 bytes to tape. C792: Input 4 bytes from tape. Used by CLOAD* C7B6: Turn off cassette motors - finish up. C7BC: Tests for alpha-character pointed to by HL, and resets Carry Flag if found. C7C4: As for C7DO below, but first evaluates a BASIC expression pointed to by HL, then puts result into ACC. ?FC ERROR if negative. C7DO: DE = INTeger value of floating point value in ACCumulator C7E5: FC ERROR C7EA: DE = Hex of numeric string pointed to by HL. On exit, HL points to first non digit character. CBOF: where n=string space, N=top of BASIC RAM. CB55: CB5B: Go address for >LOG BASIC programs. The program must have Line Number 0 and FILE Type must be CB72: cBBB: UL ERROR CB90: CB99: RG ERROR CBB5: CBB7: cBcc: C91F: Moves a variable (4 bytes) from ACC to (HL). On exit, HL points to the delimiter and DE points to the first of the 4 bytes in the variable area. C926: C944: C96B: C9B2: Do a CR-LF unless cursor is in the first column. C9BF: Do a CR-LF. C9C9: Delay by sending number of NULL characters in (0141). C9F1: Here for or initially. CA01: CA04: CA1B: "?REDO FROM START " message string. CA43: CA72: CAFF: "?EXTRA IGNORED " message string. CB10: Used by . CB34: CB7F: Calls CB93 to evaluate BASIC expression - check for TM Error. CBB2: Checks for NTF=O ==> Numeric Operation. ==> String Operation. CBB3: Checks for NTF=l CBBA: TM ERROR CB8F: Tests for left bracket and evaluates the expression. Jumps to ?SN ERROR if left bracket not found. Evaluates BASIC expression, pointed to by HL. CB93: CCOA: Used by several routines (esp.CB93) to test for +, .,_,11, , and evaluates them if found: Also indexes into Jump Table at coc6 to get addresses for thru CC14: MO ERROR CC45: Evaluate expression then check for right bracket 11)11, else ?SN ERROR. CC5E: Loads ACC with variable - sets NTF. HL should point to variable name. CC6F: All commands to and to pass through here. Numeric routines : to jump to CC96. IIStringll routines : to continue on to CC7D. CC96: and others, jump from here. ACC = (SP) OR ACC. CCA7: ACC = (SP) AND ACC. cCA8: CD2F: CD4F: CD54: This routine searches for a variable (name pointed to by HL) and either (1) Returns its address in DE or (2) Creates the variable if not found. CDF8: Make ACC point to READY CE4D: DD ERROR CE5E: BS ERROR CEE9: CF17: CF1A: ACC = Floating point of value in A. CF1F: CF42: cF8o: Checks to see if Sorcerer is in RUN mode or DIRECT mode. CF89: ID ERROR CF9F: CFC4: Loads (OlA2)=String Length in A. (OlA4)=Start address of string in DE. CFD3: Counts number of characters in a string. On entry: HL should point to start of ASCII string. On exit : BC = string length HL = address of delimiter. DOOF: ST ERROR D015: Prints a string using C585. Again, HL must point to start of string. D02E: First checks if there's still free string space. ?OS ERROR if none. After a CALL D02E, DE points to start of sub-string. A = sub-string length. D093: String Space Garbage Collection routine. D10F: D146: Sets up registers before continuing to D14F. On entry : Return address - pointer to 4 bytes of string information are on the Stack. II II • I, " D14F: Used by string commands to remove sub-strings. On entry : L=sub-string length. BC=start address of sub-string within main DE=start address of new string. D159: D17A: D18B: D19A: D1AB: D1BB: D1EB: D1F5: D225: D240: D24A: D256: D25C: D27A: D28D: D2A1: D2A4: D2AD: D2BD: D2C9: D2CE: D304: D310: D336: D341: D346: D384: Tests for a right bracket 11)11 after RIGHT$, LEFT$ or MID$ On return, B=substring length. Used by to evaluate - load the port value. A = Hex of numeric string pointed to by HL. FC ERROR if > 255. Writes 2 bytes to tape. (Byte is in A). Writes 1 byte to tape. Reads 1 byte from tape. Writes 1 byte to tape. Finish off CSAVE. Put program FILENAME (max.5 chars) into 16 byte tape output file header which starts at (IY+47H). If length of FILENAME < 5 then pad to right with blanks. This is part of . Loads (01B7) with the end of the CLOADed program, prints IIREADy and re-creates the link pointers. Repair the link pointers in a BASIC program. ACC = ACC + 0.5 ACC = (HL) + ACC ADDITION ACC = (HL) - ACC SUBTRACTION ACC = BCDE - ACC ACC = BCDE + ACC Sets ACC = Zero by making the floating point exponent (01C2)=O. OV ERROR BCDE = - BCDE ACC = ACC * LOG(2) ACC = (SP) * ACe ACC = BCDE * Aec ACC = (SP) * Ace ACC = BCDE / ACC Ace = ACC * 10 Checks if Ace = O? and sets Z flag if it is. ll D394: D39D: D3AO: D3A6: D3AC: D3AF: D415: D451: D462: D4AB: D4E3: D4EA: D4EC: D54B: D54D: D5EO: D5F7: D606: D60E: ACC = Floating Point of BADE. This routine can be used to return values to the USR(x) function. B = Exponent A = MSB including Sign Bit D = NSB E = LSB. (A=O for +ve) For -65536 < x < +65536: XOR A (A=FF for -ve) LD B, 9BH LD DE, NNnn JP D60E D61C: D620: Part of ABS routine, the only difference is that it doesn't test the ACC for zero. D62B: (SP) = ACC. Loads the floating point value from the ACC to the stack To get it back, POP BC then POP DE. D635: ACC = (HL). Loads floating point value (4 bytes) from HL to ACC. D63B: ACC = BCDE. D643: BCDE = ACC D646: BCDE = (HL) D64F: (HL) = ACC D652: (HL) = (DE). Move 4 bytes from location pointed to by DE to HL. D654: (HL) = (DE). Move # bytes in B register. D65D: ACC = - ACC D672: Compares ACC with BCDE. If ACC < BCDE then A = FFH (-1) ACC = BCDE then A = 00 ACC > BCDE then A = 01 D6CA: D6FE: D705: D716: ACC = Floating Point of Numeric String pointed to by HL. D7C6: Numeric String = ACC. (Opposite of D716). DB90: Compares ACC with 999,999. DB9F: Floating point 0.5 (OO/OO/OO/BO). DBBA: DBC3: ACC = (SP) A ACC (POWER) D90B: D94B: Table of floating point constants used by EXP - SQR. D95D: FF/FF/7F/7F = 0.5 00/00/BO/B1 =-1 00/00/00/B1 = +1 D999: DA02: Tables of data used by RND. DAOE: = SIN(x + PI/2) DA14: = x - x A3/3! + x A5/5! - x A7/7! + x 9/9! However, the actual expansion used is: SIN(2Plx) = 2Plx - (2Plx)A3/3! + (2Plx)A5/5! (2Plx)A7/7! + (2Plx)A9/9! Only the first 5 terms of the series are required for 6 digit precision. The above coefficients are located from DA61 to DA74. A DA58:Table of floating point constants (4 bytes each) used by SIN - COS. DB/OF/49/81 = 1.5708 radians = 90 degrees. 00/00/00/7F = 0.25 DA60: 05 = Number of terms required to calc. SIN - COS DA61: BA/D7/1E/86 = +39.7107 = (2PI)A9/9! approx. allows for round-off. 64/26/99/87 = -76.575 = (2PI)A7/7! exactly. 58/34/23/87 = +81.6022 = (2PI)A5/5! approx. EO/5D/A5/86 = -41.3417 = (2PI)A3/3! exactly. DA/OF/49/83 = + 6.28319 = (2PI) = 360 degrees. DA75: = / DA8A: DAB1: Table of floating point constants used by ATN. DAD6: [EMPTY ROM from here till DFFA !! ] DFFA: BASIC Warm Start, jumps to C06B. DFFD: BASIC Cold Start, jumps to COOO. 8.02 BASIC ROMPAC WORK AREA ADDR SIZE DESCRIPTION 100: 3 z80 jump instruction to Basic warm start: C3 6B CO Used if work area and program are saved as a CP/M .COM file. 103: 3 z80 jump instruction to USR() function routine. Default address is to the FC ERROR routine. The user can insert the address of his routine with: POKE 260,AD AND 255 : POKE 261,AD / 256 106: 3 OUT (nn),A instruction. Used by the OUT I,J command. 109: 14 Fast 4 byte subtract routine used by floating point divide for speed. 117: 35 Pseudo-random number data used as tables and counters by Basic's RND function. 13A: 4 Last psuedo-random number generated by RND, in floating point, for RND(O). 13E: 3 IN A,(nn) instruction. 141: 1 Number of ASCII nulls to print after a carriage return. Defaults to 1. 142: 1 Terminal line length. 143: 1 Column number of last PRINT with comma field, ie. the start of the last 14 character field. 144: 1 CTRL 0 output suppression flag. 145: 2 Pointer to top of Basic stack. 147: 2 Current line number. 149: 2 Pointer to start of Basic program text, ie. 01D5H. Used by INP() function. Defaults to 64. OH = output. OFFH = no output. OFFFEH during initialization. OFFFFH in direct mode. 14B: 67 Terminal input buffer. direct command line. Starts with a comma. 18E: 1 Current terminal column position. 18F: 1 o when 190: 1 Number Type Flag. (See Note 3 above). Also used by CD54 to locate - create variables. <> 0 when used by . .' 191: 1 MUlti-Statement Line Flag. = 0 if multi-statement line <> 0 if only one statement on line. 192: 2 Pointer to highest RAM location, ie. HIMEM. 194: 18 Internal pointers used for string constant, variable and string space maintenance. 1A2: 2 Length of string that was just printed. 1A4: 2 start address of string that was just printed. 1A6: 2 Pointer to top of free string space. command. 1A8: 2 Internal pointer used in string space garbage collection. 1AA: 2 Current DATA line number. lAC: 1 Used by and . = 64H when used by = 80H when used by lAD: 1 Used by . Should = 0 for return. Also, last character entered from keyboard during input. 1AE: 1 Used by - to distinguish between them. = 0 for . < >0 for . 1AF: 1 Temporary storage for HL. Sometimes used to store current or last position reached in a line of BASIC before extra processing was required. Also used to store pointer to value of variable in variable area. 1B1: 2 Pointer to end of current line being processed by BASIC. This can be useful for passing names instead of numbers as arguments of the USR() function. Points to instruction in the Basic program about to be executed when CTRL-C is used to stop execution. 1B3: 2 Line number in program. 1B5: 2 Pointer to current statement in program to be executed next. 1B7: 2 Pointer to start of variable space at end of program. 1B9: 2 Pointer to start of array space. 1BB: 2 Pointer to end of RAM memory in use, ie. end of variable storage space. Set by CLEAR n Set by CTRL-C or STOP. 1BD: 2 Pointer to current item in DATA list. 1BF: 4 Floating point numeric accumulator. 1C3: 17 Internal storage used for floating point printout and multiplication. 1D4: 1 Zero to signify end of imaginary first program line. 1D5: x Start of Basic program storage. • .. --- CHAPTER 9 MONITOR 9.01 MONITOR POKE ADDRESSES >SE S=xx s=o S=10 >SE T=xx SCREEN SPEED FASTEST. SLOWER. 8K 8143 16K 16335 32K 32719 48K -16433 32K 32718 48K -16434 POWER-ON DEFAULT. BAUD RATE 8K 8142 16K 16334 T=O 1200 BAUD FOR SERIAL PORT AND CASSETTE TAPE. EXAMPLE: POKE 32718,64 :REM 1200 BAUD. T=l 300 BAUD FOR SERIAL PORT AND CASSETTE TAPE. EXAMPLE: POKE 32718,0 : REM 300 BAUD. >SE O=yy V P L S xxyy - >SE I=xx K P S xxyy - OUTPUT PORT VIDEO DRIVER PARALLEL OUT CENTRONICS CASSETTE OUT USER DEFINED INPUT PORT KEYBOARD PARALLEL IN CASSETTE IN USER DEFINED 8K 8144-5 OE01BH OE021H OE993H OE012H xxyy 8K 8146-7 OE018H OE01EH OEOOFH xxyy 16K 16336-7 POKE POKE POKE POKE POKE 32720,27 :POKE 32720,33 :POKE 32720,147:POKE 32720,18 : POKE 32720,yy :POKE 16K 16338-9 POKE POKE POKE POKE 32K 32720-1 32K 32722-3 32722,24 32722,30 32722,15 32722,yy : POKE :POKE :POKE :POKE 48K -16432-1 32721,224 32721,224 32721,233 32721,224 32721,xx 48K -16430-29 32723,224 32723,224 32723,224 32723,xx 9.02 MONITOR WORKAREA (IY+nn) RAM +00 91 +3C +3D +3E +3F +41 +43 +44 +45 +46 +47 +4C +4D +4E +50 +52 +54 +57 +5C +5D +5E +60 +62 +64 +67 +68 +6A +6c +6D CD CE CF DO D2 D4 D5 D6 D7 D8 DD DE DF El E3 E5 E8 ED EE EF Fl F3 F5 F8 F9 FB FD FE DESCRIPTION 60 BYTE MONITOR COMMAND BUFFER. ASCII TEXT IS TERMINATED BY A CARRIAGE RETURN, ODH. PORT OFEH STATUS. BAUD RATE. 1200 BAUD= 040H. 300 BAUD= 00 HEX. SEND DELAY TIME FROM >SE S=nn COMMAND. CURRENT SEND ROUTINE ADDRESS FROM >SE O=xxyy. CURRENT RECEIVE ROUTINE ADDRESS FROM >SE I=xxyy. BATCH MODE STATUS. O=NORMAL l=BATCH MODE. MONITOR OUTPUT PROMPT OF 1>1. BAUD RATE - MOTOR CONTROL 10H=MOTOR1 20H=MOTOR2 TAPE INPUT AND OUTPUT CRC CHECK DATA BYTE. FIVE LETTER OUTPUT FILE NAME FROM >SA AND CSAVE OUTPUT FILE HEADER ID. USUALLY 55H. OUTPUT FILE TYPE FROM >SE F=nn COMMAND. 2-BYTE LENGTH OF FILE IN BYTES. 2-BYTE PROGRAM LOAD ADDRESS. BASIC=01D5H. 2-BYTE PROGRAM >GO ADDRESS. >SE X=xxyy COMMAND. 3 RESERVED BYTES. FIVE LETTER INPUT FILE NAME FROM >LO AND CLOAD. INPUT FILE HEADER ID. INPUT FILE TYPE. 2-BYTE LENGTH OF INPUT FILE IN BYTES. 2-BYTE PROGRAM LOAD ADDRESS FROM TAPE. 2-BYTE PROGRAM >GO ADDRESS FROM TAPE. 3 RESERVED BYTES. CHARACTER UNDER THE CURSOR. 2-BYTE SCREEN OFFSET FOR ROW CURSOR IS ON. 2-BYTE COLUMN NUMBER CURSOR IS IN [0-63]. LAST CHARACTER FROM KEYBOARD FOR REPEAT FUNCTION. 2 BYTES OF RESERVED SPACE. 9.03 USEFUL MONITOR ROUTINES AND THEIR FUNCTIONS. ADDR EOOO E003 Eo06 E009 EOOC EOOF E012 E015 E018 E01B E02l E993 E024 E027 E02A E02D E13A E1A2 ElBA E1C9 E1D4 E1E8 E1ED E205 E22F E23D E2D2 E4D3 E538 E562 E597 E5A2 E638 E6B9 E78A E858 E85C E884 E8Al E98A E9Bl E9CC E9D6 EB10 EC1E EDFE DESCRIPTION MONITOR COLD START. MONITOR WARM START. JUMP TO HERE FROM YOUR PROGRAMS. RELOCATE MONITOR STACK TO ADDRESS PASSED IN REGISTER HL. RECEIVE: RETURN CHARACTER IN 'A' AND 'NZ' FLAG. SEND: SEND CHARACTER IN 'A' TO CURRENT OUTPUT DEVICE. SERIAL IN: READ CHARACTER FROM UART. SERIAL OUT: SEND CHARACTER TO UART. QUICK CHECK: RETURN 'NZ' IF 'CTRL-C', 'RUN/STOP' OR 'ESC I KEYBOARD: ROUTINE FOR RECEIVE IF >SE I=K. KEYBOARD SCAN VIDEO: ROUTINE FOR SEND IF >SE O=V. VIDEO DISPLAY PARALLEL OUT: SEND CHARACTER TO PARALLEL PORT. CENTRONICS OUT: HANDSHAKE CHARACTER TO CENTRONICS PRINTER TURN CASSETTE MOTOR ON. REGISTER B CONTAINS 1 OR 2. TURN CASSETTE MOTOR OFF. TAPE SAVE ROUTINE. TAPE LOAD ROUTINE. MONITOR INPUT ROUTINE FILLS 60 BYTE INPUT BUFFER. FIND MONITOR WORKAREA AND PUT BASE ADDRESS IN REGISTER IY MESSAGE: OUTPUT TEXT STRING THAT ENDS WITH A ZERO BYTE. ERROR: PRINT ERROR MESSAGE AND DIAGNOSTIC MESSAGE. OVER: PROCESS THE BATCH MODE OVER COMMAND. PRINT HEXADECIMAL NUMBER IN REGISTER IDE' IN HEX. PRINT HEXADECIMAL NUMBER IN REGISTER 'A' IN HEX. PRINT CARRIAGE RETURN AND LINE FEED. PARSE INPUT COMMAND STRING. PUT ASCII HEX NUMBER IN REGISTER IDEI. REVERSE OF E1E8H. SEND THE NUMBER OF BLANKS IN REGISTER 'B'. DUMP COMMAND PROCESSOR. ENTER COMMAND PROCESSOR. MOVE COMMAND PROCESSOR. GO COMMAND PROCESSOR. SET COMMAND PROCESSOR. SAVE COMMAND PROCESSOR. FILES COMMAND PROCESSOR. LOAD COMMAND PROCESSOR. BATCH COMMAND PROCESSOR. CREATE COMMAND PROCESSOR. LIST COMMAND PROCESSOR. TEST COMMAND PROCESSOR. PP COMMAND PROCESSOR. CLEAR THE DISPLAY AND REWRITE THE GRAPHIC CHARACTER SET. MOVE CURSOR TO ROW AND COLUMN NUMBER IN MWA+68 AND MWA+6A FIND THE CURSOR ROW AND COLUMN NUMBERS. REPLACE CHARACTER UNDER THE CURSOR. KEYBOARD INPUT TABLES TO DECODE THE ASCII VALUE TO RETURN CHARACTER SET FOR THE FIRST 64 GRAPHIC CHARACTERS. 9.04 RELOCATE THE MONITOR STACK. >EN 0 0000: 21 yy xx C3 06 EO / >GO 0 THE MONITOR STACK ON POWER UP BUILDS FROM THE LAST MEMORY LOCATION DOWNWARD. IN A 32K MACHINE THIS IS AT 7FFFH. THE STACK CAN BE RELOCATED ELSEWHERE IN MEMORY BY PROVIDING A DIFFERENT LAST ADDRESS IN yy xx OF THE ABOVE CODE. , EXAMPLE: 1/ TO RELOCATE TO 6FFFH, USE 21 FF 6F C3 06 EO / --------------------------------------------------------------- 9.05 ERASE MEMORY BY FILLING IT WITH ZEROES. BYE >EN 0 0000: 0 / >MO 0 7FOO 1 EXIT TO THE MONITOR. BYTE 0 CONTAINS THE FILL CHARACTER. ZERO MEMORY THROUGH ADDRESS 7FOO HEX. =============================================================== 9.06 EXECUTE MONITOR COMMANDS FROM A BASIC PROGRAM 100 110 120 130 140 150 C$ = "LO 1 3800"+CHR$(13) : REM TYPICAL COMMAND M = PEEK(-~096)+PEEK(-4095)*256-111 IF M>32767 THEN M=M-65536 FOR I=l TO LEN(CM$) POKE M+I,ASC(MID$(C$,I,l»: NEXT I :REM PUT IN BUFFER POKE 260,138:POKE 261,231:X=USR(0) :REM DO COMMAND • ---~~---~-- -----~-~-~------ CHAPTER 10 --- M. CODE INTERFACE 10.01 PROTECT MEMORY FOR MACHINE LANGUAGE ROUTINES 1. 2. 3. 0000 - DOFF HEX IS NEVER USED BY THE ROMPAC BASIC. RELOCATE THE STACK. USE THE MEMORY ABOVE THE STACK. CLEAR xx,yy CREATES A WINDOW ABOVE THE STRING SPACE. =============================================================== 10.02 CALL A MACHINE LANGUAGE ROUTINE 100 POKE 260,ADDR AND 255 : POKE 261,ADDR/256 110 X=USR(O) ADDR CONTAINS THE ADDRESS OF THE ROUTINE. PLACE THE ADDRESS OF THE ROUTINE IN BYTES 260 AND 261. INVOKE THE CALL TO THE ROUTINE WITH THE USR() FUNCTION. A 'RET' INSTRUCTION IN THE ROUTINE WILL RETURN TO BASIC. =============================================================== 10.03 FASTER USRO PARAMETER PASSING. 100 J=USR(O) : J=PEEK(X) 110 J=PEEK(USR(X» LINE 110 IS EQUAVALENT TO LINE 100, BUT FASTER. ---------------------------------------------------------------------------------~---------------------------------- --------- 10.04 POKE MACHINE HEX CODE INTO MEMORY. 100 110 120 130 140 150 160 200 DEF FNA(X) = (X AND 15) - 9 * (X > 64) READ J : REM FIRST DATA ITEM IS # OF BYTE TO POKE : FOR I=O TO J-1 : READ A$ K = FNA(ASC(A$» * 16 + FNA(ASC(RIGHT$(A$,1») POKE OFFSET + I,K : NEXT I : DATA 6,11,00,00,C3,EB,E1 : REM EXAMPLE HEX CODE THIS ROUTINE CONVERTS HEX CODE INTO DECIMAL TO POKE. THE CODE LOADS BEGINNING AT THE ADDRESS OF 'OFFSET'. --------------------------------------------------------------- 10.05 PASS ARGUMENT IN 'A' REGISTER TO MACHINE CODE 100 POKE 262,195 : POKE 264,ADDR/256 110 OUT ADDR AND 255, X ADDR CONTAINS THE ADDRESS OF THE ROUTINE. THE 'OUTI COMMAND INVOKES THE CALL TO THE ROUTINE. ARGUMENT X IS PASSED TO THE ROUTINE IN THE ACCUMULATOR. 10.06 PASS TWO PARAMETERS USING THE OUT I,J INSTRUCTION. CHANGE THE 'OUT I,J ' INSTRUCTION TO A RST OH COMMAND. THE RST OH IS A MACHINE LANGUAGE RESTART TO ADDRESS O. IT IS JUST LIKE A CALL INSTRUCTION, EXCEPT IT OCCUPIES ONLY ONE BYTE OF MEMORY. 100 POKE 262,199 : REM 'OUT ' IS NOT A 'RST OH ' 110 OUT I,J : REM CALL YOUR ROUTINE AT ADDRESS O. YOUR MACHINE LANGUAGE ROUTINE MUST RESIDE AT ADDRESS O. THE I PARAMETER FROM THE OUT COMMAND IS PASSED IN ADDRESS 0107H, AND THE J PARAMETER IS PASSED IN THE z80 ACCUMULATOR. TO RETURN TO BASIC, YOU MUST POP THE RST RETURN ADDRESS OFF OF THE STACK SO THAT THE RETURN ADDRESS FOR THE 'OUT ' COMMAND IS USED INSTEAD. --------------------------------------------------------------- 10.07 PASS ROUTINE ADDRESS IN USRO FUNCTION CALL. 0000: CD DO C7 0003: D5 0004: C9 ENTRY CALL OC7DOH PUSH DE RET ;GET USR() # ;CALL ADDRESS ;GOTO ROUTINE 100 POKE 260,0 : POKE 261,0 : REM USR() ENTRY ADDRESS 110 X = USR(AD) : REM JUMP TO MEMORY ADDRESS IN AD THE USR() FUNCTION WILL ENTER THE ROUTINE AT ADDRESS 0, AND THEN JUMP THE ADDRESS PASSED AS A PARAMETER IN THE VARIABLE AD. YOUR CODE AT ADDRESS AD WOULD END WITH A NORMAL 'RET' TO RETURN TO BASIC. IF YOUR ROUTINE USES REGISTER HL, YOU SHOULD PUSH HL UPON ENTRY, AND THEN POP HL JUST BEFORE RETURNING. =============================================================== 10.08 MULTIPLE USRO ROUTINES SELECTED BY LETTER IN O. 100 110 120 130 POKE 260,0 . X = USR(A) X = USR(B) POKE 261,0 : REM ONLY ONE ENTRY ADDRESS. : REM EXECUTE ROUTINE "A" : REM EXECUTE ROUTINE "B" THE ADDRESSES FOR THE ABOVE ROUTINES ARE FOUND IN A TABLE. THE TABLE CONTAINS THE MATCH LETTER, SUCH AS "A" '" FOLLOWED BY THE ADDRESS OF THE ROUTINE. A ZERO BYTE IN THE MATCH LETTER POSITION WILL TERMINATE THE TABLE. .; I, I ... \ I V '1 ~1 V 0000: 0003: 0006: 0008: 0009: OOOA: OOOC: OOOD: OOOE: OOOF: 0012: 0013: 0015: 0016: 0017: 0018: 001B: 001C: 001D: 001E: 001F: 0021: 0022: 0023: 0024: 0025: 0026: 0027: 0028: 002A: 002B: 002D: CD 2A 3E 2B BE 20 23 23 7E 21 BE 28 47 AF BE CA 78 23 23 23 18 23 7E 23 66 6F E9 41 yy 42 yy 00 A2 E1 B1 01 B2 FC 27 00 OC E5 C7 F1 xx xx ENTRY CALL LD LD LP1 DEC CP JR INC INC LD LD LP2 CP JR LD XOR CP JP LD INC INC INC JR FOUND INC LD INC LD LD JP TABLE DEFB DEFW DEFB DEFW DEFB OE1A2H HL,(01B1H) A,OB2H HL (HL) NZ,LP1-$ HL HL A, (HL) HL,TABLE (HL) Z,FOUND-$ B,A A (HL) Z,OC7E5H A,B HL HL HL LP2-$ HL A, (HL) HL H, (HL) L,A (HL) IAI A-LABEL IBI B-LABEL 00 ;GET IY ;BASIC POINTER ;USR( TOKEN ;POINTER BACK ;FOUND USR( YET ;KEEP LOOKING ;SKIP OVER ;POINT LETTER ;GET LETTER ;TABLE BASE ;MATCH ?? ;JUMP IF MATCH ;SAVE LETTER ;LOAD ZERO ;TABLE END ?? ;?FC ERROR ;RESTORE LETTER ;SKIP LETTER ;SKIP yy ADDR ;SKIP xx ADDR ;TRY NEXT MATCH ;SKIP LETTER ;GET yy ADDRESS ;SKIP yy ADDR ;GET xx ADDRESS ;HL = xxyy ADDR ;GOTO ROUTINE ;MATCH LETTER ;ROUTINE ADDR ;MATCH LETTER ;ROUTINE ADDR ;TABLE END FLAG --------------------------------------------------------------- 10.09 UP-LOADER FOR MACHINE LANGUAGE ROUTINES THIS SHORT ROUTINE IS USEFUL FOR MOVING MACHINE CODE TO ITS PROPER ORG ADDRESS AFTER BEING LOADED AT A DIFFERENT ADDRESS. j ! V 0100: 0103: 0106: 0109: 010B: 01 11 21 ED C3 yy yy yy BO yy xx xx xx xx ENTER LD LD LD LDIR JP BC , LENGTH DE,TO HL,FROM START ;# OF BYTES TO MOVE ;DESTINATION ADDRESS ;SOURCE ADDRESS ;BLOCK MOVE ;PROGRAM START THIS ROUTINE IS PARTICULARLY USEFUL IN CP/M ENVIRONMENTS WHERE THE CODE HAS BEEN MOVED DOWN TO 0110H WITH THE MONITOR AND THEN SAVED ON DISK. WHEN THE PROGRAM IS LOADED FROM DISK, CP/M EXECUTES THIS UP-LOADER WHICH LOADED JUST AHEAD OF THE PROGRAM. THE PROGRAM IS MOVED TO ITS PROPER ADDRESS AND EXECUTED. --- ---------- CHAPTER 11 --- M. CODE ROUTINES 11.01 ROW - COLUMN ROTATION OF A CHARACTER CELL ENTER WITH AN ASCII CHARACTER IN REGISTER A. , THE BIT PATTERN FOR THE CHARACTER IS CONVERTED FROM ITS ROW BY ROW FORMAT INTO COLUMN BY COLUMN DOT DATA THAT CAN BE USED TO FIRE EIGHT HAMMERS OF A GRAPHICS PRINTER. TO ACTIVATE, SET THE OUTPUT VECTOR TO THIS DRIVER. 1 6500: 6501: 6502: 6503: 6504: 6506: 6507: 6508: 6509: 650C: 650D: 650F: ,· 6511: 6513: 6514: , 6516: 6517: 6518: 6519: 651A: 651B: 651C: C5 D5 E5 6F 26 29 29 29 11 19 1E OE 00 00 F8 08 80 ORG PUSH PUCH PUSH LD LD ADD ADD ADD LD ADD LD LD 6500H BC DE HL L,A H,O HL,HL HL,HL HL,HL DE,OF800H HL,DE E,8 C,80H ;*2 >SE 0=6500 ;HL = ASCII CHAR ;*4 ;*8 ;ASCII TABLE BASE ;TABLE POINTER ;COL LOOP COUNTER ;AND MASK BIT 7 16 00 E5 06 08 LOOP1 LD PUSH LD D,O HL B,8 ;CLEAR D ;SAVE HL NEXT LOOP ;ROW LOOP COUNTER 7E A1 B2 07 57 23 10 F8 LOOP2 LD AND OR RLCA LD INC DJNZ A, (HL) ;GET PATTERN ;MASK BIT OFF ; COMBINE ;ROTATE A LEFT ;RESAVE IN D ;NEXT ROW PATTERN ;GET 8 ROW BITS C D D,A HL LOOP2~$ COMPENSATE FOR MASK SHIFT, UNEVEN SHIFTING ,· LD B,E 651E: 43 LOOP3 RRCA 651F: OF 6520: 10 FD DJNZ LOOP3-$ ;ROTATE BACK , 6522: 6524: 6526: 6527: 6528: ,· 652A: 652B: 652C: 652D: D3 FF CB 09 E1 1D 20 E7 OUT RRC POP DEC JR (255),A C HL E NZ,LOOP1-$ E1 D1 C1 C9 POP POP POP RET HL DE BC ;SEND COL TO PRINTER ;ROTATE MASK ;ADDRESS BASE ;DO 8 COLUMNS ;BACK TO MAIN PROG 11.02 IMAGE DRIVER TO CONVERT TO >SA FILES. This is a simple, yet very useful, driver that converts any video output to a memory image. Two frequent uses of this driver are: convert a Basic program into its ASCII file, and convert a disassembler listing into a word processor file. 0000: 0001: 0004: 0005: 0006: 0009: OOOA: OOOD: E5 2A OD 00 77 23 22 OD 00 E1 C3 1B EO yy xx EXAMPLE: 1. ENTRY PUSH LD LD INC LD POP JP POINT DEFW HL HL,(POINT) (HL) , A HL (POINT),HL HL OE01BH xxyy ;GET POINTER ;CREATE IMAGE ;NEXT MEM CELL ;PUT POINTER ;TO VIDEO TOO ;START ADDRESS CREATE A WORD PROCESSOR FILE FROM DISASSEMBLER. INSERT WORD PROCESSOR ROMPAC. 2. USE THE MONITOR TO LOAD A MACHINE LANGUAGE DISASSEMBLER SUCH AS: >LO DIS32 3. LOAD THE ABOVE DRIVER. 4. START ADDRESS IS BOFH: OOOD: OF oB / 5. CHANGE OUTPUT VECTOR: >SE 0=0000 6. EXECUTE DISASSEMBLER. >GO 6AOO 7. DISASSEMBLE ROUTINE OF INTEREST. B. EXIT DISASSEMBLER BACK TO MONITOR. 9. RESTORE VIDEO VECTOR. >SE O=V 10. FIND FINAL ADDRESS IN (POINT). >DU D E ONE MIGHT SAVE THE FILE AT THIS POINT WITH >SA NAME oBOF xxyy 11. ENTER 03 INTO THIS FINAL ADDRESS. THIS PROVIDES THE END-OF-FILE MARKER FOR THE WORD PROCESSOR. 12. EXECUTE WORD PROCESSOR. >PP YOUR FILE SHOULD BE PRESENT. IT MAY BE DOUBLE SPACED SINCE THE WORD PROCESSOR CONVERTS BOTH AND INTO s. 13. USE THIS MACRO TO REMOVE DOUBLE SPACING. D1 F1 COMMAND> A COMMAND> B. COMMAND> A200 (SAVE MACRO) (START ON LINE TO DELETE) (EXECUTE MACRO) 11.03 PINE WOOD DERBY CONTROLLER The following machine language and basic programs are included as illustrations of how to use the Sorcerer to monitor external events. In this case, photo detectors were mounted in each of three racing lanes for a Cub Scout Pine Wood Derby. As the hand made cars crossed the finish line, the photo detector light source would be interrupted. The Sorcerer would observe the changed state of the photo detectors and stop that car's timer. After all three cars had crossed the finish line, the three timers would be displayed in large block lettering for the anxious audience to read. The resolution of the timing was around 1 milisecond which kept parents and their sons from arguing over whose car was the fastest. PINE WOOD DERBY CONTROLLER 4000: 18 05 , 4002: 00 4003: 00 ~004: 00 4005: 00 , 4007: 4009: 400B: , , THE , 400D: 400F: 4012: 4015: DB FF CB 47 20 FA GATE IS OPEN. 3E 32 32 32 01 02 40 03 40 04 40 4018: 401A: 401C: 401E: 401F: 4021: 4024: DB CB 20 F5 3E 32 F1 FF 4F 07 4025: 4027: 4029: 402A: 402C: 402F: CB 20 F5 3E 32 Fl 57 07 ,. , ENTRY ORG JR 4000H SKIP-$ CARl CAR2 CAR3 COUNT DEFB DEFB DEFB DEFW 0 0 0 0 BUFF EQU 0 SKIP IN BIT JR A, (OFFH) O,A NZ,L4007-$ ;WAIT FOR START ;GATE TO OPEN THE CARS ARE ON THEIR WAY DOWN THE TRACK FINISH 00 02 40 L4025 00 03 40 .. .~~~- ~--- .. -- ...... ---~ - LD LD LD LD A,OOlH (CAR1),A (CAR2),A (CAR3),A IN BIT JR PUSH LD LD POP A,(OFFH) 1,A NZ,L4025-$ AF A,OOOH (CARl) ,A AF ;WATCH FINISH LINE ;IS CARl ACROSS? ;JUMP IF NOT BIT JR PUSH LD LD POP 2,A NZ,L4030-$ AF A,OOOH (CAR2),A AF ;IS CAR2 ACROSS? ;JUMP IF NOT -- -- ;START ALL TIMERS ;STOP TIMER #1 ;STOP TIMER #2 , 4030: 4032: 4034: 4035: 4037: 403A: , CB 20 F5 3E 32 F1 5F 07 L4030 00 04 40 BIT JR PUSH LD LD POP 3,A NZ,L403B-$ AF A,OOOH (CAR3),A AF ;IS CAR3 ACROSS? ;JUMP IF NOT ;STOP TIMER #3 ; UPDATE TIMER CLOCK, WHICH IS A SIMPLE INCREMENTING COUNTER. ,· 403B: 403E: 403F: 4040: 4041: 4042: 4044: 4045: 4046: 4047: ,· 2A 05 40 7D 3C 27 6F 3E 00 8c 27 67 22 05 40 L403B LD LD INC DAA LD LD ADC DAA LD LD HL,(COUNT) A,L A L,A A,OOOH A,H H,A (COUNT),HL • ;GET TIMER. ;HL = 4 DECIMAL ; DIGITS RATHER ; A BINARY #. ;HL = HL + 1 ;REPLACE TIMER ; UPDATE EACH CARIS DISPLAY ON CRT WITH NEW COUNT VALUE UNTIL THE RACE IS OVER WHEN ALL FLAGS = o. , CARIS FINISH FLAG = O. ,· 404A: 404D: 404E: 4050: 4053: 3A B7 28 11 CD 02 40 4056: 4059: 405A: 405C: 405F: 3A B7 28 11 CD 03 40 4062: 4065: 4066: 4068: 406B: 3A B7 28 11 CD ,· ,· , LD OR JR LD CALL A,(CAR1) A Z,L4056-$ DE,BUFF+4H MOVE L4056 LD OR JR LD CALL A, (CAR2) ;IS CAR2 ACROSS? A Z,L4062-$ DE,BUFF+OCH ;CARIS BUFFER MOVE ;LOAD NEW TIME L4062 LD OR JR LD CALL A, (CAR3) ;IS CAR3 ACROSS? A Z,L406E-$ DE,BUFF+14H ;CARIS BUFFER MOVE ;LOAD NEW TIME L406E CALL MESSAGE 06 04 00 7D 40 06 OC 00 7D 40 04 40 06 14 00 7D 40 406E: CD A9 40 ,· ;IS CARl ACROSS? ;CARIS BUFFER ;LOAD NEW TIME ;NEW CRT DISPLAY ; NOW CHECK TO SEE IF ALL CARS ARE ACROSS ,· 4071: 4074: 4075: 4076: 4077: 4078: 11079 : 407C: 21 02 40 7E 23 B6 23 B6 C2 18 40 C9 LD LD INC OR INC OR JP RET HL,CAR1 A, (HL) HL (HL) HL (HL) NZ,FINISH J, ;CHECK FIRST FLAG ;CAR2 FINISH FLAG ;CAR3 FINISH FLAG ;DONE IF ALL = 0 ;BACK TO BASIC THIS ROUTINE LOADS EACH CARIS BUFFER WITH THE ASCII CHARACTERS THAT MAKE UP THE FOUR DECIMAL DIGIT COUNT IN HL. , • " ENTER WITH A CARIS UNIQUE BUFFER ADDRESS IN DE. 407D: 4080: 4081: 4082: 4084: 4086: 4088: 408A: 408c: 408D: 408E: 408F: 4091: 4093: 4094: 4095: 4096: 4098: 409A: 409C: 409E: 40AO: 40A1: 40A2: 40A3: 40A5: 40A7: 40A8: , 2A EB 7A CB CB CB CB F6 77 23 7A E6 F6 77 23 7B CB CB CB CB F6 77 23 7B E6 F6 77 C9 05 40 3F 3F 3F 3F 30 OF 30 3F 3F 3F 3F 30 OF 30 MOVE LD EX LD SRL SRL SRL SRL OR LD INC LD AND OR LD INC LD SRL SRL SRL SRL OR LD INC LD AND OR LD RET HL,(COUNT) DE,HL A,D A A A A 030H (HL) , A HL A,D OOFH 030H (HL),A HL A,E ;GET TIMER VALUE ;HL = BUFFER ADDR ;DE = 4 DIGITS ;FIRST ASCII DIGIT ;PUT IT IN BUFFER ;2ND ASCII DIGIT ;PUT IT IN BUFFER A A A A 030H (HL) , A HL A,E OOFH 030H (HL) , A ;3RD ASCII DIGIT ;PUT IT IN BUFFER ;4TH ASCII DIGIT ;PUT IT IN BUFFER THIS ROUTINE DISPLAYS A 24 CHARACTER BUFFER IN THE CRT IN THREE ROWS OF EIGHT CHARACTERS EACH. THE CHARACTERS ARE DISPLAYED IN LARGE BLOCK SIZE WHERE EACH DOT OCCUPIES A FULL CHARACTER CELL. THE START ADDRESS OF THE BUFFER IS BUFF. 40A9: 40AB: 40AF: 40B2: 40B4: 40B6: 40B7: 40B8: 40B9: 40BB: 40BE: 40CO: 40C1: 40C2: 40C3: FD FD 21 OE 06 7E C5 E5 FD CD FD E1 C1 23 11 E5 21 00 F1 00 00 03 08 E5 D7 40 E1 08 00 MESSAGE PUSH LD LD LD NEXTROW LD NEXTCOL LD PUSH PUSH PUSH CALL POP POP POP INC LD IY IY,OF100H HL,BUFF C,003H B,008H A,(HL) BC HL IY DISPLAY IY HL BC HL DE,8 ;TOP OF SCREEN ;C = # OF ROWS ;B = # OF CHARS ;GET ASCII CHAR ;SHOW IN BIG SIZE ;MOVE SCRN POINTER 40c6: 40c8: 40CA: 40CB: 40CD: 40DO: 40D2: 40D4: 40D6: FD 10 OD 28 11 FD 18 FD C9 19 EC 07 40 02 19 EO E1 L40D4 ADD DJNZ DEC JR LD ADD J"R POP RET IY,DE NEXTCOL-$ C Z,L40D4-$ DE,0240H IY,DE NEXTROW-$ IY ;NEXT CHARACTER ;THIS ROW DONE ;ANY MORE TO DO? ;MOVE SCRN POINTER ; TO NEXT ROW. ;SCREEN COMPLETE .. THIS ROUTINE CREATES A LARGE SIZE CHARACTER FROM THE BIT PATTERN FOR THE ASCII CHARACTER. THE CHARACTER IS LOCATED BY HAVING IY POINT TO THE TOP LEFT CORNER OF THE CHARACTER. ,. ENTER WITH ASCII CHARACTER IN A, AND SCREEN LOCATION IN IY. 40D7: 40D9: 40DA: 40DC: 40DD: 40DE: 40DF: 40E2: 40E3: 40E4: 40E6: 40E7: 40E9: 40ED: 40EF: 40F3: 40F5: 40F7: 40F8: 40F9: 40FC: 40FE: 40FF: OE 6F 26 29 29 29 11 19 7F 06 07 38 FD 18 FD FD 10 OD c8 11 FD 23 18 08 00 00 F8 08 06 36 00 20 04 36 00 CO 23 EF 38 00 19 E2 DISPLAY LD LD LD ADD ADD ADD LD ADD CHAR LD LD RLCA COL J"R LD J"R WHITE LD NEXT INC DJNZ DEC RET LD ADD INC J"R C,008H L,A H,OOOH HL,HL HL,HL HL,HL DE,OF800H HL,DE A, (HL) B,008H ;ROW COUNTER ;OFFSET = ASCII*8 ;START OF BIT MAP ;HL = PATTERN ADDR ;A = FIRST ROW ;CELL WIDTH ;DETERMINE WHITE OR BLACK DOT. ; C,WHITE-$ (IY+000H),020H ; BLACK NEXT-$ (IY+OOOH),OCOH ; WHITE IY COL-$ ;LOOP CELL WIDTH ;COUNT THIS ROW C :EXIT AFTER 8TH Z ;POINT START NEXT DE,038H IY,DE ; ROW ON SCREEN. ;NEXT ROW PATTERN HL CHAR-$ • 11.04 PINE WOOD DERBY'S BASIC PROGRAM • 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 540 550 560 570 REM PINE WOOD DERBY REM CREATE SOLID WHITE GRAPHIC CHARACTER IN ASCII #192 FOR 1=1 TO 8:POKE -513+I,255:NEXT I REM ESTABLISH USR() ADDRESS FOR 4000H. POKE 261,64 REM CLEAR SCREEN, PUT MESSAGE IN 24 BYTE BUFFER . PRINT CHR$ ( 12) : A$ = READY GET SET GO. FOR I=1T024:POKE I-1,ASC(MID$(A$,I,1»:NEXT I II REM II NOW SEND BUFFER TO CRT IN LARGE LETTERS POKE 260,169:X=USR(X) REM REM REM REM REM REM SCREEN LOOKS LIKE THIS WITH 3 ROWS OF 8 CHARACTERS: REM REM NOW WAIT FOR THE GATE TO OPEN AND START TIMERS CALL MACHINE CODE ROUTINE AT 4000H. READY GET SET GO . POKE 260,0:X=USR(X) REM REM REM . RACE IS NOW OVER. SORT TIMES FOR 1ST, 2ND, 3RD PLACE TIMES FOUND IN BUFFER AS ASCII DIGITS. CONVERT TO A DECIMAL VALUE. K=4 K=12: K=20: F=49: REM IF IF IF IF IF IF GOSUB GOSUB GOSUB G=F : 900 900 900 H=F A=X : REM K = BUFFER OFFSET B=X C=X REM F=G=H= ASCII ZERO SORT WINNER, 2ND AND 3RD PLACE A>B A>C B>A B>C C>A C>B THEN THEN THEN THEN THEN THEN F=F+l F=F+l G=G+l G=G+l H=H+l H=H+l - ---.-~-.---- 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750 760 770 780 790 800 810 900 910 920 930 · · POKE PUT 1ST, 2ND, 3RD PLACEMENT IN BUFFER · REM NOW DISPLAY WINNERS IN LARGE LETTERS · REM 0,65 POKE 8,66 POKE16,67 POKE 2,F POKE 1,45 POKE 9,45 POKE17,45 POKE10,G POKE 3,32 POKE11,32 POKE19,32 POKE18,H POKE 260,169 : X=USR(X) PRINT CHR$(17);" LANE · REM REM REM REM REM REM · REM REM · SCREEN LOOKS LIKE THIS: · REM HEADINGS LANE - PLACE - TIMER A-2 8034 B-1 7892 C-3 8047 WAIT FOR OPERATOR TO START NEXT RACE. USER HITS RETURN TO CONTINUE. · INPUT II · REM PLACE "; press RETURN to race again II;A$:GOT0200 CONVERT 4 ASCII CHARACTERS FROM BUFFER INTO NUMBER X=O:FOR I=K TO K+4:J=PEEK(I)-30:X=X*10+J:NEXT I:RETURN ----~ -- ------ • 11.05 IDEAL MACHINE LANGUAGE PROGRAM START PROGRAM NAME AUTHOR'S COPYRIGHT NOTICE PROGRAM DATE AND VERSION NUMBER , PROGRAM DESCRIPTION MONITOR EQU 0100: 0103: 0106: 0109: 010C: 010F: C3 C3 C3 C3 C3 C3 yy yy yy yy yy yy xx xx xx xx xx xx OE003H ;EQUATE LABELS COUNT ORG 0500H DEFB 0 ;ORG VARIABLES ENTER WARM SEND RECEIVE PRINTER SOUND ORG JP JP JP JP JP JP ;ORG PROGRAM ;JUMP COLD START ;JUMP WARM START ;OUTPUT DRIVER ;INPUT DRIVER ;PRINTER DRIVER ;SOUND ROUTINES 0100H COLDST WARMST VIDEO KEYBRD OUTPUT NOISE ETC HAVING THE PROGRAM START AT 100H MAKES IT EASY TO PLACE PROGRAM ON CP/M DISK. 0112: CO 0113: FE 0114: , START PROGRAM WITH VECTOR JUMPS TO THE VARIOUS MAJOR ROUTINES USED BY THE PROGRAM. THUS, IF A USER MUST MODIFY THE PROGRAM TO SUIT HIS SYSTEM, HE ONLY HAS TO CHANGE THE JUMP ADDRESS TO ACCESS HIS NEW SUBSTITUTE ROUTINE. BAUD PORT , DEFB OCOH DEFB OFEH ;SYSTEM PARAMETERS ;STORED HERE NOW PLACE A TABLE OF SYSTEM PARAMETERS USED SUCH AS BAUD RATE. A USER WHO USES A DIFFERENT PARAMETER NOW ONLY HAS TO STORE THE DIFFERENT VALUE HERE. MAIN ???? ?? ETC. ;BEGIN MAIN PROGRAM CHAPTER 12 --- I/O DRIVERS 12.01 RS232 OUTPUT DRIVER ROUTINE 0000: 0001: 0002: 0005: 0007: 0009: OOOA: OOOD: 0010: 0011: F5 F5 FD F6 D3 F1 CD CD F1 C9 7E 3D 80 FE 12 EO 1B EO ENTRY PUSH PUSH LD OR OUT POP CALL CALL POP RET AF AF A, (IY+03DH) 80H (OFEH) , A AF OE012H OE01BH AF ;SAVE CHARACTER ;UART CONTROL ;SET BIT 7 ;TURN RS232 ON ;GET CHARACTER ;RS232 CHAR OUT ;SEND TO VIDEO ;GET CHARACTER ; RETURN TO DIRECT ALL OUTPUT TO BOTH THE RS232 PORT AND TO THE VIDEO, USE THE MONITOR COMMAND: >SE O=xxyy WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING THE COMMAND WOULD BE >SE 0=0000. ~O RESTORE THE OUTPUT TO JUST THE VIDEO DRIVER USE: >SE O=V • THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE . =============================================================== 12.02 RS232 DRIVER WITH PERFERATION SKIP. THE ROUTINE WILL COUNT THE NUMBER OF LINES PRINTED AND AUTOMATICALLY ISSUE A FORM FEED AFTER 54 LINES OF PRINT. 0000: 0001: 0002: 0005: 0007: 0009: OOOA: OOOD: 0010: 0011: 0013: 0014: 0015: 0018: 0019: 001B: 001D: 001F: 0022: 0023: 0026: 0027: F5 F5 FD F6 D3 Fl CD CD Fl FE CO F5 3A 3C FE 20 3E CD AF 32 Fl cg 7E 3D 80 FE 12 EO 1B EO OA FF FF 36 06 OC 12 EO FF FF ENTRY PUSH PUSH LD OR OUT POP CALL CALL POP CP RET PUSH LD INC CP JR LD CALL XOR EXIT LD POP RET AF AF A, (IY+03DH) 80H (OFEH),A AF OE012H OE01BH AF OAH NZ AF A, (OFFFFH) A 54 NZ,EXIT-$ A,OCH OE012H A (OFFFFH) , A AF ;SAVE CHARACTER ;UART CONTROL ;SET BIT 7 ;TURN RS232 ON ;GET CHARACTER ;RS232 CHAR OUT ;SEND TO VIDEO ;GET CHARACTER ;TEST FOR LF ;RETURN IF NOT ;SAVE CHARACTER ;LINE COUNTER ;# = # + 1 ;54 LINES YET? ;EXIT IF NOT 54 ;GET FORM FEED ;RS232 CHAR OUT ;COUNTER = 0 ;RESAVE COUNTER ;GET CHARACTER ; RETURN SYNCHRONIZE THE LINE COUNTER WITH PAPER TOP-OF-FORM BY ENTERING A 0 INTO BYTE FFFF HEX. EXAMPLE: OR >EN FFFF FFFF: 0 / FROM THE MONITOR. POKE -1,0 FROM BASIC. TO LIST BASIC PROGRAM USE: POKE -l,O:LIST TO DIRECT ALL OUTPUT TO BOTH THE RS232 PORT AND" TO THE VIDEO, USE THE MONITOR COMMAND: >SE O=xxyy WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING THE COMMAND WOULD BE >SE 0=0000. TO RESTORE THE OUTPUT TO JUST THE VIDEO DRIVER USE: >SE O=V THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE. --------------------------------------------------------------- 12.03 RS232 INPUT DRIVER ROUTINE. 0000: 0003: 0005: 0007: FD F6 D3 C3 7E 3D 80 FE OF EO ENTRY LD OR OUT JP A, (IY+03DH) 80H (OFEH) , A OEOOFH ;UART CONTROL ;SET BIT 7 ;TURN ON RS232 ;GET RS232 INPUT TO RECEIVE ALL INPUT FROM THE RS232 PORT, USE THE MONITOR COMMAND: >SE I=xxyy WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING THE COMMAND WOULD BE >SE 1=0000. ONE LOOSES KEYBOARD CONTROL OF THE SORCERER WHEN THE INPUT IS SET TO THE ABOVE RS232 INPUT DRIVER. PERHAPS A BETTER USE OF THE ROUTINE WOULD BE TO CALL IT FROM AN APPLICATION PROGRAM WITH THE INP() FUNCTION. EXAMPLE: 100 POKE 318,195:POKE 320,0 110 X=INP(O) : A$=CHR$(X) THE INP() EXAMPLE USES AN ENTRY ADDRESS OF 0000 HEX. A$ IS THE CHARACTER RECEIVED FROM THE RS232 ROUTINE. THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE. 12.04 DUMB TERMINAL ROUTINE GET CHARACTERS FROM KEYBOARD AND SEND TO RS232. CHARACTERS RECEIVED FROM RS232 SENT TO VIDEO SCREEN. RETURN TO CALLING PROGRAM IF I RUN/STOP I KEY IS PRESSED. ORG 2470H LD OUT IN BIT RET CALL JR PUSH IN BIT JR POP OUT IN BIT JR IN CALL JR A,OCOH (OFEH) , A A, (OFEH) o ,A Z OEB1CH Z,SCAN-$ AF A, (OFDH) o ,A Z,UART-$ AF (OFCH) , A A,(OFDH) 1,A Z,LOOP -$ A, (OFCH) OE01BH LOOP-$ ; 2470: 2472: 2474: 2476: 2478: 2479: 247C: 247E: 247F: 2481: 2483: 2485: 2486: 2488: 248A: 248C: 248E: 2490: 2493: . 3E D3 DB CB c8 CD 28 F5 DB CB 28 F1 D3 DB CB 28 DB CD 18 CO FE FE 47 DUMB LOOP 1C EB OA FD 47 FA UART FC FD 4F E6 FC 1B EO DF SCAN ;BAUD - RS232 ON ;TURN RS232 ON ;LOOK FOR IRIS I ;ABORT IF IRIS I ;SCAN KEYBOARD ;SKIP IF NO INPUT ;WAIT UART DONE ; SEND CHARACTER ; CHAR RECEIVED ;LOOP IF NOTHING ;GET INCOMING CHAR ;SEND TO VIDEO ;LOOP ---------------------------------------------------------------~---------------------------------------------------- ---------- 12.05 VARIABLE LINE LENGTHS FOR PRINTERS. 100 POKE 322,J J = LINE LENGTH FROM 0 TO 255. BASIC WILL ISSUE A WHEN THE LINE LENGTH IS EXCEEDED. EXAMPLE: 100 POKE 322,132 : REM 132 CHARACTER LINE =============================================================== 12.06 CENTRONICS SCREEN PRINT ROUTINE 100 110 120 130 140 150 160 POKE 262,195 : POKE 264,233 AD = -3968 FOR R = 0 TO 29 : FOR C = 0 TO 63 OUT 147,PEEK(AD) : AD = AD + 1 NEXT C OUT 147,13 : REM SEND AT END-OF-LINE NEXT R THE POKE STATEMENTS ON LINE 100 INITIALIZE THE ROUTINE. EACH lOUT 147,##1 SENDS ONE ASCII CHARACTER TO THE MONITORIS CENTRONICS DRIVER ROUTINE. 12.07 CENTRONICS PRINTER DRIVER 100 OUT 255,J OR 128 110 OUT 255,J 120 OUT 255,J OR 128 THESE THREE OUT STATEMENTS SEND THE ASCII CHARACTER VALUE IN J, AND STROBE THE HANDSHAKE ON BIT 7. THIS METHOD OF SENDING CHARACTERS TO A CENTRONICS PRINTER IS MUCH SLOWER THAN THE METHOD OF 12.06 WHERE THE IOUT I COMMAND PASSES THE ASCII DIRECTLY TO THE MONITORIS CENTRONICS 'ROUTINE. --------------------------------------------------------------- 12.08 ACCESS CENTRONICS PRINTER DRIVER FROM BASIC. 100 110 120 130 140 200 RAMSIZE = PEEK(-4095) * 256 + PEEK(-4096) IF RAMSIZE > 32767 THEN RAMSIZE = RAMSIZE - 65536 . POKE RAMSIZE - 47,147 REM TURN PRINTER ON POKE RAMSIZE - 47,240 REM TURN PRINTER OFF THE ABOVE IS EQUIVALENT TO >SE O=L AND >SE O=V. --------------------------------------------------------------- 12.09 PROGRAMMING THE UART FOR PARITY OPTIONS THE UART USED FOR SERIAL TRANSMISSION CAN BE PROGRAMMED FOR VARIOUS PARITY AND STOP BIT OPTIONS. 0000: 3E xx 0002: D3 FD 0004: C9 START 7 6 5 4 X X X P FORMAT= X P PS S NB2 = = = = - LD OUT RET A,VALUE ;CONTROL PARAMETER (OFDH),A ;PROGRAM UART ;BACK TO MAIN PROGRAM 3 2 1 0 (8 BIT POSITIONS) PS S NB2 NB1 DONIT CARE BIT POSITION PARITY ENABLE: O=ENABLED l=NONE PARITY SELECT: O=ODD l=EVEN # OF STOP BITS: O=ONE l=TWO BITS NB1 = NUMBER OF BITS PER CHARACTER NB2 NB1 # OF BITS 005 016 107 118 EXAMPLE: VALUE = OEH = 00001110 BINARY 7 BITS PER CHARACTER 2 STOP BITS PARITY ENABLED PARITY EVEN CHAPTER 13 --- CASSETTE TAPE 13.01 WRITE OAT A TO CASSETTE TAPE 100 110 120 130 140 150 160 170 180 190 200 210 220 MS=256*PEEK(-4095)+PEEK(-4096) : REM MEMORY SIZE IF MS>32767 THEN MS=MS-65536 POKE MS-45,8 : POKE MS-44,1 : REM DISABLE KEYBOARD POKE MS-41,16 REM MOTOR #1 CONTROL OUT 254,16 : REM TURN ON MOTOR #1. POKE MS-47,18:POKE MS-46,244: REM OUTPUT TO TAPE FOR J=l TO 10 FOR K=l TO 100:NEXT K REM DELAY BETWEEN DATA PRINT A$(J);II,II;A(J) REM PRINT DATA ON TAPE NEXT J POKE MS-47,27 REM RESTORE VIDEO OUT 254,0 REM OFF MOTOR #1 POKE MS-45,24:POKE MS-44,224: REM RESTORE KEYBOARD BOTH STINGS AND NUMBERS MAY BE PRINTED ON THE TAPE. SEPARATES THE DATA TO MATCH THE INPUT STATEMENT. THE FILE CREATED HAS NO NAME AND NO CRC ERROR CHECKING. KEYBOARD IS DISABLED SO THAT ITS USUAL SCAN DOES NOT TURN THE CASSETTE MOTORS OFF . 11,11 .' --------------------------------------------------------------- 13.02 READ DATA FROM CASSETTE TAPE 400 410 420 430 440 450 460 470 480 490 500 MS=256*PEEK(-4095)+PEEK(-4096) : REM MEMORY SIZE IF MS>32767 THEN MS=MS-65536 POKE MS-45,15:POKE MS-44,224: REM TAPE TO INPUT POKE MS-41,16 : REM MOTOR #1 CONTROL OUT 254,16 : REM TURN ON MOTOR #1. FOR J=l TO 10 FOR K=l TO 30:NEXT K REM DELAY < THAN WHEN WRITTEN INPUT A$(J),A(J) REM INPUT DATA FROM TAPE NEXT J POKE MS-45,24 REM RESTORE INPUT TO KEYBOARD OUT 254,0 REM TURN OFF MOTOR #1 THIS ROUTINE READS THE DATA TAPES CREATED BY 13.01. THE INPUT STATEMENT ON LINE 470 IS A MATCHED STATEMENT TO THE PRINT STATEMENT ON LINE 180. THE INPUT VECTOR POINTS TO THE TAPE INPUT ROUTINE RATHER THAN TO THE KEYBOARD. CHAPTER 14 --- EDITOR FOR BASIC 14.01 EDITOR FOR BASIC INSTRUCTIONS. TO USE >LO EDIT >SE I=7000 >pp (Load the editor from 14.02) (For 32K version, ie. ORG address) (Exit back to Basic) Any cursor movement key, HOME, or TAB will activate edit mode as indicated by the inverse video cursor. CTRL E Expand the line by moving the rightmost characters one space right for insertion ahead of the cursor. CTRL R Reduce the line by deleting the character under the cursor. Rightmost characters move one space left. RUBOUT Rubout the character under the cursor and replace with a space. Note that RUBOUT is now unshifted. CTRL N Renumber all program statements in increments of 10 starting at 100. Starting line number is stored in bytes 7136 and 7137 hex, and the increment is stored in bytes 71A1 and 71F9 hex if you desire to change them. Example: >EN 7136 7136: E8 03 / >EN 71A1 71A1: 64 / >EN 71F9 71F9: 64 / >pp (Enter Monitor by typing BYE ) (Change starting line # to 1000) (Changes increment to 100) (Exit back to Basic) CTRL U -Up (ie. revive) a program lost due to mistakenly typing NEW or CLOAD. (Hard reset destroys a portion of your program near the start. However, you may be able to revive from hard reset by using CTRL U, listing the program, and deleting the line number that is messed up. Loosing a couple lines at the start of a program from a hard reset is better than loosing the entire program.) TAB Tab to the preset tabs i.n columns 1, 9, 17, 25, 33, 41, 49, 57, and enter edit mode. INVERSE CURSOR The editor's cursor is the inverse video of the character it is sitting on top of. LINE NUMBER EDITING Editing a statement's line number will COpy the line under the new line number. The original line still exits and may deleted, if you desire, by typing the old line number and RETURN. WRITING CODE Preferably enter edit mode before starting a statement. (If you enter the edit mode DURING the typing of a line, all of the text on the screen will be added behind what you have already typed. Therefore, return to the line in edit mode and hit RETURN a second time. Basic will then have the line as it appears on the screen.) TRANSPARENCY When not in edit mode, the keyboard functions normally wherein you may RUN, CSAVE, LIST, write code, insert or delete lines, etc. The Monitor's >SE I=K will restore the regular Sorcerer keyboard routine. CLEAR Using CLEAR will no longer generate a SYNTAX ERROR message. CTRL X Cross reference the Basic program's variables and statement references such as GOTO, GOSUB, RESTORE, etc. This feature is present ONLY if you bought our CROSS REFERENCE program and added it to your Editor for Basic. 14.02 EDITOR FOR BASIC SOURCE LISTING 7000: 7003: 7004: 7005: 7006: 7007: 7009: 700C: 700E: 7010: 7013: 7015: 7017: 7019: 701B: 701D: 701F: 7021: 7023: 7025: 7027: 7029: 702B: 702D: 702F: 7031: 7033: 7035: 7037: 703A: 703C: 703F: 7041: 7043: 7045: 7047: 7049: 704B: 704D: 704E: 7051: 7052: 7053: 7055: 7057: 7059: 705B: 705D: 705F: 7062: 7065: CD c8 C5 D5 E5 FD CD FE 20 CD 18 FE 28 FE 28 FE 28 FE 28 FE 28 FE 28 FE 28 FE 28 FE CA FE CA FE 20 3E 18 FE 20 3E 47 3A B7 78 28 FE 28 FE 20 3E 32 CD CD 1C EB E5 A2 OC 05 OC 71 01 46 11 42 13 3E 17 3A 1A 36 OB 62 05 73 12 7C OE 35 15 19 7F 04 5F 06 5F 02 7F EDITOR E1 EO L7015 71 71 18 71 32 OD 7D 7F 02 08 18 71 OC EO D6 E9 L7047 L704D VIDEO ORG CALL RET PUSH PUSH PUSH PUSH CALL CP JR CALL JR CP JR CP JR CP JR CP JR CP JR CP JR CP JR CP JR CP JP CP JP CP JR LD JR CP JR LD LD LD OR LD JR CP JR CP JR LD LD CALL CALL 7000H OEB1CH Z BC DE HL IY OE1A2H OOCH NZ,L7015-$ OEOOCH CLEAR-$ 001H Z,VIDEO-$ 011H Z,VIDEO-$ 013H Z,VIDEO-$ 017H Z,VIDEO-$ 01AH Z,VIDEO-$ OOBH Z,TAB-$ 005H Z,EXPAND-$ 012H Z,REDUCE-$ OOEH Z,RENUM 015H Z,CLOAD 07FH NZ,L7047-$ A,05FH L704D-$ 05FH NZ,L704D-$ A,07FH B,A A, (FLAG) A A,B Z,END-$ OODH Z,LINE-$ 07FH NZ,VIDEO-$ A,008H (FLAG),A OEOOCH OE9D6H ;SCAN KEYBOARD ;RETURN IF NOTHING ;GET IY ;CLEAR KEY? ;CLEAR VIDEO CRT ;RET WITH NOTHING ;CURSOR LEFT ;CURSOR HOME ;CURSOR RIGHT ;CURSOR UP ;CURSOR DOWN ;TAB ;CTRL E - EXPAND ;CTRL R - REDUCE ;CTRL N - RENUMBER ;CTRL U - UP PROG ; RUBOUT ; CHANGE TO UNDERSC ; UNDERSCORE ;CHANGE TO RUBOUT ;RESTORE CHAR ;EXIT NORMAL MODE ; ; RUBOUT ; BACKSPACE ;ENTER EDIT MODE ;CHAR TO VIDEO ;GET CURSOR ADDR ,. REVERSE VIDEO CHARACTER UNDER CURSOR 706B: 706A: 706D: 706F: 7070: 7071: 7072: 7075: 7076: 707A: 707C: 707D: 707E: 70B1: 70B2: 70B4: , 70B6: 70B7: 70B9: 70BB: 70BC: 70BD: 70BE: 36 FD 26 29 29 29 11 19 DD 06 7E 2F DD 23 DD 10 FE 6E 67 00 00 FB 21 FO FF OB 77 00 23 F6 AF FE 00 FD E1 E1 D1 C1 C9 INVERSE LD LD LD ADD ADD ADD LD ADD LD LD LD L707C CPL LD INC INC DJNZ (HL),OFEH L,(IY+067H) H,OOOH HL,HL HL,HL HL,HL DE,OFBOOH HL,DE IX,OFFFOH B,OOBH A, CHL) ;INVERSE VIDEO ;CHAR UNDER CURSOR CLEAR END XOR CP POP POP POP POP RET A OOOH IY HL DE BC ;RETURN NOTHING ;SET Z FLAG CALL LD ADD AND LD LD CALL JR OE9EBH A,(IY+06AH) A,OOBH 03BH (IY+06AH) , A (FLAG) , A OEgCCH INVERSE-$ :REPLACE CURSOR ; COLUMN NUMBER ;ASCII OFFSET ;TABLE BASE ;HL = BIT PATTERN ;GRAPHIC CHAR 254 ;ROW COUNTER ;GET BIT PATTERN ; INVERSE (IX+OOOH),A ;CREATE GRAPHICS ;NEXT ROW HL IX ;LOOP B TIMES L707C-$ ;EXIT PERFORM TAB FUNCTION ; 70BF: 7092: 7095: 7097: 7099: 709C: 70gF: 70A2: ,. CD FD c6 E6 FD 32 CD 1B EB 7E oB 3B 77 1B CC C4 E9 6A 6A 71 Eg TAB L709C ;UNIFORM TABS ;NEW COLUMN ;ENTER EDIT MODE ;MOVE CURSOR ;INVERSE VIDEO EXPAND OR REDUCE LINE ONE CHARACTER AT CURSOR LOCATION 70A4: 70A7: 70A9: 70AA: 70AB: 70AC: 70AE: 70AF: CD 2B E5 D1 2B ED 23 1B c4 70 13 BB OB EXPAND CALL JR PUSH POP DEC LDDR INC JR DELTA Z,L70BC-$ HL DE HL HL L70BC-$ ;GET SCREEN ADDRS ;SHIFT LINE RIGHT , 70B1: 70B4: 70B6: 70B7: 70B8: 70B9: 70BB: 70BC: 70BE: 70BF: 70C2: CD 28 D5 E1 23 ED 2B 3E 77 CD 18 c4 70 06 REDUCE BO 20 L70BC CC E9 A4 CALL JR PUSH POP INC LDIR DEC LD LD CALL JR DELTA Z,L70BC-$ DE HL HL HL A,020H (HL) , A OE9CCH INVERSE-$ ;GET SCREEN ADDRS ;SHIFT LINE LEFT ;INSERT SPACE ;SAVE CURSOR CALCULATE NUMBER OF CHARACTERS TO SHIFT ON , 70C4: 70C7: 70C8: 70CA: 70CC: 70CD: 70CE: 70DO: 70D1: 70D2: 70D3: 70D4: 70D5: EXIT: CD 7D E6 D6 2F 4F 06 EB C5 E1 19 B1 C9 E8 E9 3F 40 00 DE = PRESENT CURSOR ADDR. DELTA CALL LD AND SUB CPL LD LD EX PUSH POP ADD OR RET OE9E8H A,L 03FH o40H C,A B,OOOH DE,HL BC HL HL,DE C HL = LINE END ADDR. ;REPLACE CURSOR ;BC = # CHAR ;DE = PRESENT ;HL = LINE END ;TEST BC=O COPY EDITED LINE FROM SCREEN TO REPLACE ONE IN MEMORY , HL,NEW ;NEW INPUT VECTOR 70D6: 21 F4 70 LINE LD (IY+041H),L LD 70D9: FD 75 41 (IY+042H),H LD 70DC: FD 74 42 ;GET LINE END ADDR 70DF: CD c4 70 CALL DELTA LD B,041H ;65 CHAR DEFAULT 70E2: 06 41 LD A,020H 70E4: 3E 20 CP (HL) L70E6 70E6: BE JR NZ,L70ED-$ 70E7: 20 04 DEC HL 70E9: 2B DJNZ L70E6-$ ;SUBTRACT SPACES 70EA: 10 FA ;B <> 0 70EC: 04 INC B A,B ;# CHAR TO MOVE 70ED: 78 L70ED LD (IY+06AH),000H ;FIRST COLUMN LD 70EE: FD 36 6A 00 JR L709C-$ ;GO UPDATE MEMORY 70F2: 18 A8 , PUT ADDRESS OF NEXT LINE IN (NEXT) 7141: 7144: 7147: 7148: 7149: 714A: 714B: 714F: 7150: 7151: 7154: 7155: 2A 22 5E 23 56 23 ED 7B B2 CA 23 23 54 72 4E 72 53 54 72 E6 71 NEXT LIN LD LD LD INC LD INC LD LD OR JP INC INC HL, (NEXT) (PRESENT),HL E, (HL) HL D,(HL) ;DE = NEXT LINE HL (NEXT),DE A,E D Z,PASS2 HL HL LOOK FOR REM, GOTO, GOSUB, THEN , LOOK LD A,(HL) 7156: 7E INC HL 7157: 23 L7158 CP OOOH 7158: FE 00 JR Z,NEXTLIN-$ 715A: 28 E5 CP o8FH 715C: FE 8F 715E: 28 E1 JR Z,NEXTLIN-$ 7160: FE 89 CP 089H 7162: 28 OE JR Z,GOTO-$ 7164: FE 8D CP 08DH 7166: 28 OA JR Z,GOTO-$ 7168: FE 8c CP o8CH JR Z,GOTO-$ 716A: 28 06 716c: FE A2 CP OA2H 716E: 28 02 JR Z,GOTO-$ JR LOOK-$ 7170: 18 E4 PROCESS GOTO, GOSUB, THEN STATEMENTS , GOTO PUSH HL 7172: E5 CALL OC7EAH 7173: CD EA C7 LD ( POINT) , HL 7176: 22 50 72 XOR A 7179: AF 717A: C1 POP BC SBC HL,BC 717B: ED 42 LD (LENGTH),HL 717D: 22 56 72 ;TEST END OF PROG ;GET CHARACTER ;END OF LINE? ;REM ? ;GOTO ? ; GOSUB ? ;RESTORE ? ; THEN ;CONTINUE SEARCH ;SAVE BEGIN ADDR ;CONVERT TO BINARY ;END OF # ADDR ;LENGTH OF LINE # SEARCH FOR LINE # MATCH ; 7180: 7183: 7186: 7189: 718A: 718B: 718c: 718D: 718E: 718F: 7191: 7192: 7193: 7194: 7195: 7196: 7197: 719A: 719C: 719D: 71AO: 71A3: 71A4: 71A7: 71A8: 71A9: 71AA: , n1 58 72 52 72 D5 01 L7189 48 74 C5 10 52 72 OA 00 52 72 OJ .... 69 60 18 DD LD LD LD LD INC LD INC LD OR JR PUSH LD INC LD EX POP CALL JR PUSH LD LD ADD LD POP LD LD JR HL,(INIT) (COUNT),HL HL,01D5H c, (HL) HL B, (HL) HL A,C B Z,L71D9-$ DE E, (HL) HL D, (HL) DE,HL DE OC574H Z,L71AC-$ DE HL,(COUNT) DE,10 HL,DE (COUNT),HL ;INITIALIZE LINE # ;NEXT LINE ADDR ;END OF PROG? ;SAVE MATCH # ; CURRENT LINE # ; COMPARE HL-DE ;NO MATCH ;ADD 10 TO COUNT 1"'\1':' uc. L,C H,B L7189-$ ;NEXT LINE ADDR FOUND MATCH, CONVERT LINE # TO DECIMAL AND REPLACE 71AC: 71AF: 71B2: 71B5: 71B9: 71BA: 71BD: 71CO: 71C1: 71C3: 71C4: 71C5: 71C6: 71C9: 71CA: 71CE: ,. 2A 22 21 4E 23 46 23 79 BO 28 D5 5E 23 56 EB D1 CD 28 D5 2A 11 19 22 CD 2A CD ED 41 CD CD 7D E6 4F 78 91 FC 2B DD DD B2 52 BB 4B C9 72 D7 56 72 L71AC A2 E1 D6 E9 07 OC 72 2A 50 72 2B CALL LD CALL LD LD CALL CALL LD AND LD LD SUB CALL DEC LD DEC OC9B2H HL,(COUNT) OD7BBH BC,(LENGTH) B,C OE1A2H OE9D6H A,L 007H C,A A,B C M,EXPAND HL IX, (POINT) IX ;FIRST COLUMN ;# TO CONVERT ;PRINT DECIMAL # ;LENGTH OF # ;GET IY ;GET CURSOR ADDR ;MOVE PROG DOWN MOVE NUMBER ON SCREEN TO MEMORY IN REVERSE ORDER 71DO: 71D1: 71D4: 71D5: 71D7: 7E DD 77 00 2B DD 2B 10 F7 L71DO LD LD DEC DEC DJNZ A, (HL) (IX+OOOH),A ; TRANSFER CHAR HL IX L71DO-$ , CHECK FOR COMMA AFTER NUMBER 71D9: 71DC: 71DD: 71DF: 71EO: 71E3: , 2A 7E FE 23 CA C3 50 72 L71D9 2C 72 71 58 71 LD LD CP INC JP JP HL,(POINT) A, (HL) 02CH HL Z,GOTO L7158 ;LAST LOOK ADDR ; IS IT A COMMA? ;YES, CONVERT # ;NO, CONTINUE SCAN PASS TWO - RENUMBER ALL LINES 71E6: 71E9: 71ED: 71EE: 71EF: 71FO: 71F1: 71F2: 71F3: 71F5: 71F6: 71F7: 71F8: 71FB: 71FC: 71FD: 71FE: 71FF: , 7201: 7204: 7207: 7209: 21 ED 4E 23 46 23 79 BO 28 73 23 72 21 19 EB 69 60 18 D5 01 5B 58 72 EC 21 CD 3E C3 AF C2 15 DO OD 87 70 PASS2 LD LD LD INC LD INC LD OR JR LD INC LD LD ADD EX LD LD JR HL,01D5H DE,(INIT) C,(HL) HL B, (HL) HL A,C B Z,L7201-$ (HL) , E HL (HL) , D HL,10 HL,DE DE,HL L,C H,B L71ED-$ L7201 LD CALL LD JP HL,OC2AFH OD015H A,OODH END EXPAND PUSH PUSH LD SUB LD LD PUSH LD ADD LD LD ADD LD EX LD BC HL A,C B C,A B,OOOH BC HL, (NEXT) HL,BC (NEXT),HL HL,(POINT) HL,BC (POINT),HL DE,HL HL,(OlB7H) L71ED OC OA 00 ;START OF PROGRAM ;NEW LINE NUMBER ;GET FORWARD LINK ;END OF PROGRAM? ;STORE NEW LINE # ;DEFAULT INCREMENT ;LOOP TIL PROG END ;PRINT READY ;RETURN MOVE PROGRAM DOWN , 720C: 720D: 720E: 720F: 7210: 7211: 7213: 7214: 7217: 7218: 721B: 721E: 721F: 7222: 7223: C5 E5 79 90 4F 06 C5 2A 09 22 2A 09 22 EB 2A 00 54 72 54 72 50 72 50 72 B7 01 ;A ; # TO MOVE ;ADJUST POINTERS ;ADJUST POINTERS ;NEW PROG END ADDR 7226: 7227: 7228: 722B: 722C: 722E: 722F: 7230: 7231: 7232: 7233: 7235: 7238: E5 09 22 E5 ED E5 C1 D1 E1 03 ED 2A C1 7239: 723A: 723B: 723C: 723D: 723E: 7240: 7241: 7242: 7243: 7244: 7245: 7246: 7247: 7248: ,. 724A: 724B: 724C: 724D: 5E 23 56 7B B2 28 OA 2B EB 09 EB 73 23 72 E1 C1 41 C9 L724A 724E: 7250: 7252: 7254: 7256: 7258: 00 00 00 00 00 00 PRESENT POINT COUNT NEXT LENGTH INIT ,. , B7 01 52 B8 4E 72 RELINK EB 18 EF PUSH ADD LD PUSH SBC PUSH POP POP POP INC LDDR LD POP HL HL,BC (01B7H),HL HL HL,DE HL BC DE HL BC LD INC LD LD OR JR DEC EX ADD EX LD INC LD EX JR E, (HL) HL D, (HL) A,E D Z,L724A-$ HL DE,HL HL,BC DE,HL (HL) , E HL (HL) •D DE,HL RELINK-$ POP POP LD RET HL BC B,C DEFW DEFW DEFW DEFW DEFW DEFW 0 0 0 0 0 0 ;MOVE PROG DOWN HL,(PRESENT) ;DISTANCE MOVED BC ;RELINK BOTTOM ;AT PROG END? ; ADJUST LINK ;RELINK FINISHED CHAPTER 15 --- CP/M 15.01 SAVE ROMPAC BASIC PROGRAM ON CP/M DISK. REQUIREMENT: .. DISK BOOT ADDRESS MUST NOT CONFLICT WITH THE ROMPAC ADDRESSES OF COOO - DFFF HEX. CLOAD XMPLE BYE >DU 1B7 1B8 01B7: C4 24 >GO B900 A>SAVE 36 XMPLE.COM A>XMPLE READY RUN CLOAD PROGRAM FROM TAPE. FIND END OF BASIC PROGRAM. TYPICAL END-OF-PROGRAM ADDRESS. TYPICAL DISK BOOT ADDRESS. STORE xx BLOCKS ON DISK. LOAD PROGRAM FROM DISK. PRINTED BY BASIC ROMPAC. EXECUTE ROMPAC BASIC. JUST CONVERT CONTENTS OF BYTE 1B8 TO DECIMAL FOR xx. WHEN CP/M LOADS THE PROGRAM AND BEGINS EXECUTION, IT FINDS A JP OC06BH AT 100H. THIS JUMP WAS PLACED AT 100H BY THE BASIC ROMPAC. =============================================================== 15.02 SAVE WORD PROCESSOR ROMPAC FILES ON CP/M DISK. REQUIREMENT: DISK BOOT ADDRESS MUST NOT CONFLICT WITH THE ROMPAC ADDRESSES OF COOO - DFFF HEX. COMMAND> X >DU 74A 74B 074A: 45 1A >EN 100 0100: C3 03 CO >GO B900 A>SAVE 26 WPFILE.COM A>WPFILE EXIT TO MONITOR FROM WP ROMPAC. FIND END OF WORD PROCESSOR FILE. TYPICAL END-OF-FILE ADDRESS NEED JUMP TO ROMPAC WARM START. TYPICAL DISK BOOT ADDRESS. SAVE xx BLOCKS THROUGH FILE END. 26 DECIMAL = 1A HEX FROM 74B. RELOAD AND JUMP TO WARM START. --------.-~-"-----. --~.-~--,~----~-- ..... ~~~~~ 15.03 CP/M COMMANDS PIP PIP PIP PIP PIP PIP A:=B:XXX.COM A:=B:*.* B:=C:*.COM B:PROG.BAK=C:PROG.COM B:=C:*.COM[V] PIP B:XXX=A:YYY PIP B:=A:XXX.* Copy XXX file from B to A Copy all files from B to A Copy all COM files from C to B Make backup of PROG from C to B Copies all COM files from C to B with verification . Copy YYY from A to B and rename XXX Copy all files with name of XXX on A onto B REN REN REN REN REN NEW.COM=OLD.COM NEW.BAK=OLD.COM XXX.BAK=XXX.COM C:XXX.COM=YYY.COM Rename Rename Rename Rename file name file OLD type COM to NEW type BAK filetype filename YYY on C to XXX ERA ERA ERA ERA ERA ERA XXX. COM *.DAT XXX.* * * C:*.COM Erase Erase Erase Erase Erase filename XXX with type COM all file types of DAT all files with name of XXX all files all COM type files on C SAVE A>SAVE xx PROGNAME.COM A>SAVE xx B:PROGNAME.COM Save file on A Save file on B CTRL CHARACTERS CTRL X - delete line typed CTRL R - retype line CTRL C - reboot system (warm) ----~- -- -~---~ 15.04 BIOS MODIFICATIONS TO GIVE BACKSPACE TYPE RUBOUTS CONSOLE INPUT This routine must get a character from the console, and return the character in the ACCUMULATOR. If the character is a RUBOUT, then a new delete flag is set to cause the backspace sequence of characters to be sent to the VIDEO display by the CONSOLE OUTPUT driver. , B24D: B250: B253: B256: B259: B25B: B25E: B260: B263: B265: B266: B268: B26B: B26D: CD CA CD CA FE CA FE CA FE CO 3E 32 3E C9 26 4D 09 4D OB 6E 09 71 7F B2 B2 EO B2 CINP A,l DELF A,7FH ;IS A CHARACTER READY? ;NO--WAIT FOR IT. ;GET THE CHARACTER. ;TRY AGAIN IF NOT IN TIME ;IS THE CHARACTER A TAB? ;YES--CONVERT IT. ;IS IT A CONTROL I ? ;YES-;IS THIS AN UNDERSCORE? ;NO, FINISHED WITH CINP ;SET , DELETE FLAG ;CHANGE TO RUBOUT MVI RET A,'I'_40H ;CHANGE TO THE CP/M TAB MVI RET A,'K ' -40H ;CHANGE TO CONTROL K. CALL JZ CALL JZ CPI JZ CPI JZ CPI RNZ MVI STA MVI RET B2 B2 01 EA B2 7F B26E: 3E 09 B270: C9 TABIT B271: 3E OB B273: C9 UNTAB , ,. CSTAT CINP KEYBRD CINP 'K'-40H TABIT 'I'-40H UNTAB 5FH CONSOLE OUTPUT This routine will be called with the character to be output in the IC I REGISTER. If the delete flag is set, then generate the characters to erase the deleted character from the video display rathar than echo it. , B274: B277: B279: B27C: B27D: B280: B282: B285: B287: B28A: B28c: 3A FE C2 E5 21 3E CD 3E CD 3E CD EA B2 01 97 B2 EB 01 1B 20 1B 01 1B B2 EO EO EO COUT LDA CPI JNZ PUSH LXI MVI CALL MVI CALL MVI CALL DELF 1 JMPRBO ;CHECK , DELETE FLAG ;NO, GO JMPRBO H H,CHAR2 A,l VIDEO A,020H VIDEO A,l VIDEO ;MOVE CURSOR LEFT ;SPACE ERASE CHAR ;MOVE CURSOR LEFT B28F: B290: B291: B293: B296: 34 E1 3E 00 32 EA B2 C9 B297: B298: B299: B29C: B29E: B2A1: B2A3: B2A6: B2A7: B2AA: B2AC: B2AF: B2B1: B2B1I: B2B5: B2B7: B2BA: B2BB: 79 E5 21 FE CA FE CA 35 C2 3E CD 3E CD 79 36 CD E1 C9 B2EA: 00 EB B2 OD B5 B2 OC B5 B2 B7 B2 OD 1B EO OA 1B EO 42 1B EO INR POP MVI STA RET ,. JMPRBO MOV PUSH LXI CPI JZ CPI JZ DCR JNZ MVI CALL MVI CALL MOV NEW MVI VOUT CALL POP RET DELF M H A,O DELF ;ADJUST CHAR COUNT A,C H H,CHAR2 ODH NEW OCH NEW M VOUT A,13 VIDEO A,10 VIDEO A,C M,1I2H VIDEO H ;GET IT TO THE ACUM. ;SAVE HL. ;POINT TO CHAR COUNT ;CARRIAGE RETURN? ORG OB2EAH DEFB 0 ; RESET DELETE FLAG ;FORM FEED? ;COUNT OFF CHAR. ;GO WORK. ;SEND CR ;SEND A LINE FEED ;CHARACTER TO ACCUM ;RESET CHARACTER COUNT ;MORE WORK. ;JUST LIKE WE CAME IN ;BACK TO CALLER ;IE. AFTER END OF BIOS ;DELETE FLAG ... 15.05 CP/M LOAD ROUTINE OF WP FILES FOR DEVPAC This program operates with the Development Pac by bringing a Word Processor File into the DEVPAC file area from CP/M disk. The program then sets the I/O vectors, and jumps to the Development Pac. COPYRIGHT (C), Frank Root, Sept. 16, 19B1 BDOS OPENF READF DMAF FILE FCB FCBCR BUFINC , OPEN , MAIN ORG EQU EQU EQU EQU EQU 100H 0005H 15 20 26 05ABOH EQU EQU EQU 5CH FCB+32 BOH LD LD CALL CP RET XOR LD DE,FCB C,OPENF BDOS 255 ;OPEN NAMED FILE (FCBCR) ,A ;SET FIRST RECORD TO 0 PUSH LD LD CALL CALL CP JR POP RET BC ;SAVE BC BC,FILE (FILBUF),BC MOVBUF DISKR 0 ;CHECK FOR ERROR Z,LOOP-$ BC ;BACK TO CPM ON READ ERROR PUSH LD LD ADD LD POP CALL CALL CP JR POP RET HL ;SAVE HL HL,(FILBUF) BC,BUFINC ;BUFFER LENGTH HL,BC (FILBUF),HL HL MOVBUF DISKR 0 ;CHECK FOR ERROR Z,LOOP-$ BC ;BACK TO CPM ON READ ERROR Z A ;DOS ENTRY POINT ;FILE OPEN ;READ FUNCTION ;SET DMA ADDRESS FUNCTION ;START ADDRESS OF FILE FOR ;46K MEMORY CONFIGURATION ;FILE CONTROL BLOCK ;CURRENT (NEXT) RECORD ;READ BLOCK LENGTH ;CHECK FOR OPEN ERROR ;BAD OPEN , LOOP DISKR PUSH PUSH PUSH LD LD CALL POP POP POP CP JR RET HL DE BC DE,FCB C,READF BDOS BC DE HL PUSH PUSH PUSH LD LD CALL POP POP POP RET HL ;MOVE BUFFER TO RAM DE BC DE, (FILBUF) C,DMAF BDOS BC DE HL EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU OFOIEH OF020H LD LD LD LD LD LD LD LD LD LD LD LD LD BC,SK (CI),BC BC,SV (CO),BC BC,AO (OI),BC BC,AI (00) , BC BC,BO (SI), BC BC,SV (SO),BC BC,FILE 1 Z,FINIS-$ ;READ ONE BUFFER FROM DISK ;CHECK FOR EOF ; MOVBUF , CI CO or 00 SI SO SK SV AO AI BO , FINIS OF022H OF024H OF026H OF028H OC547H OC54EH OC60AH OC5F5H OC624H ;SET DEVELOPMENT PAC VECTORS ELOOP , FILBUF INC LD CP JR XOR LD POP POP JP BC A, (BC) OIAH NZ,ELOOP-$ ;NOW PUT A 10 1 AT EOF ;IS IT DISK EOF MARKER? A (Be) , A BC BC OEOOOH DEFW 0 END --------~--- -~-- ;POP DISKR RETURN ADDRESS ;RESTORE BC FROM MAIN PUSH ;TO RESET ADDRESS OF DEVPAC CHAPTER 16 --- WORD PROCESSOR 16.01 WORD PROCESSOR PRINTER DRIVER INSTALL YOUR OWN PRINTER DRIVER BY PUTTING THE ADDRESS OF YOUR ROUTINE IN BYTES 7E7 AND 7E8 HEX. USES DRIVER #1 IN THE Y TABLE. 0000: 21 yy xx 0003: 22 E7 07 ENTRY LD LD HL,NEWDRIVER (07E7H),HL --------------------------------------------------------------- 16.02 SALVAGE WORD PROCESSOR FILE FROM RESET. IF THE WORD PROCESSOR RESETS, AND YOU ARE CURSING BECAUSE YOUR FILE WASN'T SAVED ON TAPE OR DISK YET, ALL IS NOT LOST. YOU MAY BE ABLE TO SALVAGE YOUR FILE (EVERYTHING EXCEPT FOR THE FIRST 175 CHARACTERS.) GO TO THE MONITOR AND TRY: >MO 800 8CE 801 >PP YOUR FILE IS STILL IN MEMORY, AND ONLY THE FIRST FEW LINES OF TEXT HAVE BEEN LOST. THESE LOST LINES WILL HAVE TO BE REENTERED. --------------------------------------------------------------- 16.03 PRINTER DRIVER TO SEND ESCAPE SEQUENCES THIS DRIVER PATCHES INTO THE WORD PROCESSOR ROMPAC PRINTER DRIVER TO ALLOW ONE TO SEND ESCAPE SEQUENCES TO ACCESS A PRINTER'S SPECIAL FEATURES SUCH AS FONT SIZES AND FORM FEED. CREATE A TABLE OF ESCAPE SEQUENCES THAT YOUR PRINTER UNDERSTANDS AT THE END OF THIS ROUTINE. THE TABLE IS CONSTRUCTED WITH A MATCH LETTER FOLLOWED BY A FIVE BYTE ESCAPE SEQUENCE. THUS, THE TABLE IS A MULTIPLE OF 6 BYTES IN LENGTH. THIS DRIVER WATCHES FOR AN @ SIGN IN THE WORD PROCESSOR TEXT TO SIGNAL THAT THE NEXT LETTER IS TO GENERATE SOME DESIRED ESCAPE SEQUENCE. NEITHER THE @ SIGN, NOR THE FOLLOWING MATCH LETTER WILL BE PRINTED. INSTEAD, THE ROUTINE WILL SEARCH THE TABLE FOR THIS LETTER AND SEND THE 5 BYTE SEQUENCE THAT FOLLOWS THE MATCH LETTER. AFTER LOADING THIS ROUTINE, >GO 0 TO INITIALIZE THE ROUTINE. THE ROUTINE WILL PATCH ITSELF INTO THE WORD PROCESSOR PRINTER DRIVER. IN THE 'Y' TABLE, USE PRINTER ROUTINE #1. ; 0000: 0001: 0004: 0007: OOOA: AF 32 21 22 C3 61 OD E7 FA 00 00 07 DF INITZ XOR LD LD LD JP A (FLAG) , A HL,DRIVER (07E7H),HL ODFFAH ; CLEAR FLAG ;WP VECTOR ;GO WARM START ,· THE FOLLOWING DRIVER NOW SUBSTITUTES FOR THE REGULAR WORD PROCESSOR PRINTER ROUTINE. WHEN THE @ SIGN IS SEEN, A FLAG IS SET TO INDICATE THAT THE NEXT CHARACTER SHOULD SELECT A SEQUENCE FROM THE TABLE. OOOD: OOOE: OOOF: 0010: 0011: 0014: 0015: 0017: 0018: 001A: 001C: 001F: ,· F5 C5 E5 4F 3A B7 20 79 FE 20 32 18 DRIVER 61 00 OA 40 lC 61 00 1A 0022: 32 61 00 0025: 0028: 0029: 002A: 002C: 002D: 002F: 0030: 0031: 0032: 0033: 0034: 0035: A NZ,CTRL-$ A,C 040H NZ,PRINT-$ (FLAG) ,A EXIT-$ ;SAVE REGISTERS ;SAVE CHARACTER ;IS FLAG SET ;JP IF COMMAND ;GET CHARACTER ;TEST @ SIGN ;GO PRINT CHAR ;REMEMBER @ ;EXIT 21 7E B7 28 B9 28 23 23 23 23 23 23 18 62 00 CTRL LOOP OB 10 F1 XOR A 1D (FLAG) ,A LD LD OR JR CP JR INC INC INC INC INC INC JR HL,BASE A, (HL) A Z,METOO-$ C Z,FOUND-$ HL HL HL HL HL HL LOOP-$ ;CLEAR FLAG ;TABLE BASE ;GET LETTER ;TEST 0 END ;NOT IN TABLE ;MATCH CHAR? ;GO SEND SEQ. ;SKIP TO NEXT ; ENTRY IN ; TABLE WHEN ; THERE IS NO ; MATCH. ;SEQ IS 6 LONG SEND THE CHARACTER TO THE WORD PROCESSOR PRINTER DRIVER. 0037: 0038: 003B: 003C: 003D: 003E: , AF BC HL C,A A, (FLAG) AN @ SIGN WAS THE PREVIOUS CHARACTER. TAKE THE PRESENT CHARACTER AND SEARCH THE TABLE FOR A MATCH. IF WE ARRIVE AT THE BOTTOM OF THE TABLE WITHOUT A MATCH, THEN GO AHEAD AND PRINT THE CHARACTER. THIS ALLOWS THE @ SIGN TO BE PRINTED FROM OUR TEXT BY USING TWO @ SIGNS TOGETHER. 0021: AF ,· PUSH PUSH PUSH LD LD OR JR LD CP JR LD JR 79 CD 90 DE E1 C1 F1 C9 METOO PRINT EXIT LD CALL POP POP POP RET A,C ODE90H HL BC AF A SEQUENCE HAS BEEN LOCATED IN THE TABLE. 5 BYTES THAT FOLLOW IN THE TABLE. 005A: 005C: 005E: 0060: DB FD CB 47 28 FA c9 LOOP3 IN BIT JR RET A,(OFDH) O,A Z,LOOP3-$ ;GET CHARACTER ;WP SERIAL ;RESTORE REGS ;BACK TO WP NOW SEND OUT THE ;WAIT FOR UART ------ -~ .. --. - , 0061: 00 .' , 0062: 0063: 0064: 0065: 0066: 0067: , 0068: 45 1B 26 6B 31 00 00 ESC CR LF BELL NULL EQU EQU EQU EQU EQU FLAG DEFB 0 BASE DEFB DEFB DEFB DEFB DEFB DEFB 1BH ODH OAH 07H OOH 'E' ESC ') , 'k' '1' NULL DEFB 0 ;USEFUL EQUATES ;MATCH LETTER ;ESC SEQUENCE FIVE BYTES ; LONG ;FILLER NULL ;0 MATCH ENDS ;TABLE. OTHER SEQUENCES FOR YOUR SERIAL PRINTER WOULD CONTINUE AT ADDRESS 0068H. JUST BE SURE TO MARK THE END OF THE TABLE WITH A 0 BYTE IN THE POSITION WHERE A MATCH LETTER WOULD GO. ALSO, PAD A SEQUENCE WITH 'NULL' FILLER CHARACTERS IF IT IS LESS THAN FIVE BYTES IN LENGTH AS IN THE ABOVE EXAMPLE. EXAMPLE TEXT: .. . @E ENTER EXPANDED MODE. @C ENTER COMPRESSED MODE. @N RETURN TO NORMAL SIZED PRINT . THE @E, @N, AND @C DO NOT PRINT WHEN THE FEATURE IS ACCESSED. THEY ARE SHOWN IN THE EXAMPLE TEXT AS IT WOULD APPEAR ON THE VIDEO DISPLAY . . 16.03 CORRECTION , AN @ SIGN WAS lHE PREVIOUS CHARAC1ER. TAKE THE PRESENT CHARACTER AND SEARCH THE TABLE FOR A MATCH. IF WE ARRIVE AT THE BOTTOM OF THE TABLE WITHOUT A MATCH~ THEN GO AHEAD AND PRINT THE CHARACTER. THIS ALLOWS THE @ SIGN TO BE PRINTED FROM OUR TEXT BY USING TWO @ SIGNS TOGETHER. ~ \ 0021: 0022: 0025: 0028: 0029: 002A: 002C: 002D: 002F: 0030: 0031: 0()32: 0033: 0034: 00:35: , , AF 32 61 00 21 62 00 7E B7 28 OB F.{9 28 23 23 23 CTRL I...OClP XOR LD L.D LD JR A (FLAG) ; A HL,BASE A, ('·il...) A Z > METClO-"~; CP C 01< JR INC INC INC INC INC INC JR ;~3 23 ;~3 18 F1 BASE LETTEH }TEST 0 END ~NClT IN TABLE ~MATCH CHAR? i GO SEND SE(~ , TO NEXT .,i SlOP ENTRY IN ,, TABLE WHEN THERE IS NCl • i MATCH. iSLQ I C" (:) LONG ~TABLE ~GET Z, FOUND--~; HL. HL Ht. HI... HL HI... .;:) LD()P ._$ SEND THE CHARACTER TO THE WORD PROCESSOR PRINTER DRIVER. 0037: 0038: 003B: 003C: 003D: 003E: 79 CD 90 DE £1 C1 F1 C9 METOCl PRINT EXIT LD CALI... PClP POP PDP RET A,C (1)[90H HL i i AF iRESTORE REGS i BACI( TO !.LJP Be A SEQUENCE HAS BEEN LOCATED IN THE TABLE, S BYTES THAT FClLLOW IN THE TABLE, 003F: o04j. : 0042: 0()43: 0046: 0047: 0049: , FLAG ~CLEAR 06 23 7E CD 23 10 18 OS FOUND I...OOP2 4B 00 F9 FO LD INC tD CALL INC DJNZ JR GET CHAI~ACTEF-~ WP ~:)ER I i~L.. NOW SEND OUT THE B,OOSH ~ ~3END 5 BYTEr:) BYTE lit.. ;FII~ST A> OiL) f:lER IAL HL ;SERIAL OUT ~NEXT BYTE LOOP;:'~-!~ > L.C)OP EX 11 --!I; i DONE l'Hr~lJ ~:) NmJ A SERIAL PRINTER ROUTINE FOR 1200 BAUD OR 300 BAUD, THIS RClU1INE IS USED TO SEND OUT THE SEQUENCE SO THAT THE WORD PRClCESSClR CANNClT HAVE CONTROL UNTIL WE ARE THROUGH, .> 004B: 004C: 004F: 0051: 0053: 0056: 0057: O()SA: OO~lC : OOSE: 0060: SERIAL FS FD F6 D3 FD F1 CD DB CB 28 C9 7E 3D 80 FE 77 45 12 EO FD 47 FA LOOP3 PUSH LD OR ClUT tD AF POP AF L.E012 A.(OFDH) O,A Z > LOOP3-··$ CALL IN BIT JR RET P" (IY+03DH) 0801-1 (OFEH).A (IY+04~;H) ,A ;BAUD RATE i RS;~32 DN iTAPE STATUS ~SERIAL OUT iWPIIl FOR UART \ i \ \ J I j CHAPTER 17 --- DEVELOPMENT PAC 17.01 PAUSE DEVELOPMENT PAC LISTINGS 0000: 0003: 0005: 0006: 0009: OOOB: OOOC: CD 20 7A CD FE CO C3 15 CO FB 1B EO OA 1B EO ENTRY CALL JR LD CALL CP RET JP QUICKCHECK NZ,ENTRY-$ A,D VIDEO LINEFEED NZ VIDEO UNDER DDTBO, CHANGE THE :SO AND :CO VECTORS TO 0000 HEX. NOW, HOLDING DOWN THE RUN/STOP KEY WILL PAUSE A LISTING. =============================================================== 17.02 MEMORY PARTITIONS FOR 32K CONFIGURATION. #1 - I/O AND STACK 7DOO - 7FFF #2 - PROGRAM SOURCE, 'B' BUFFER 3E80 - 7CFF #3 - ASSEMBLED CODE, 'A' BUFFER 1F40 - 3E7F #4 - USER LOAD AREA 013A - 1F3F #5 - ASSEMBLER'S RAM SPACE 0100 - 0139 #6 - USER LOAD AREA 0000 - DOFF =============================================================== 17.03 I/O VECTOR ASSIGNMENTS: VECTOR EDITOR ASSEMBLER CASSETTE :CI :CO :SK :SV :SK :SV :SK :SV CHANNEL :OI :00 :AO :AI :AO :AI :I1 :01 ASSEMBLER :SI :SO :BI :SV :BO :SV :I1 :01 SOURCE 17.04 SAMPLE COMMANDS .M :SI :SI :BI :BO ;CHANGE FROM EDITOR TO ASSEMBLER ;CHANGE BACK TO :BI FOR EDITOR .E E003 .E :AS ;EXIT TO MONITOR ;EXIT TO ASSEMBLER .E :ED .E :ER ;ENTER EDITOR TO START NEW FILE ;REENTER EDITOR TO MODIFY A FILE .L 0,200 ;CALL LOADER WITH 0 OFFSET TO ORG ;BUILD SYMBOL TABLE AT 200H LABEL-$ ;RELATIVE ADDRESSING USES -$ ;LABELS DO NOT HAVE A I: I CHAPTER 18 --- PLOTTING 18.01 BEAUTIFUL BIRTHDAY PLOTS THE PROGRAM LISTING USES AN HP7225A PLOTTER WHICH IS VERY INTELLIGENT. HOWEVER, YOU CAN SUBSTITUTE EQUIVALENT PLOTTER CONTROL COMMANDS FOR YOUR PLOTTER • • 100 110 120 130 140 150 160 1.70 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500 510 520 530 540 REM BIRTHDAY PLOTS CLEAR 150:DIM R(18,18) REM REM POKE AN RS232 DRIVER IN MEMORY AND USE IT TO SEND PLOTTER CONTROL SEQUENCES VIA PRINT STRINGS. · J=O TO 14:READ I:POKE J,I:NEXT J FOR DATA 245,245,62,128,211,254,241,205,18 DATA 224,205,27,224,241,201 · INPUT "NAME"; N$ INPUT "RANDOM NUMBER";A:J=RND(-A*2-1) REM REM · FIND MONITOR WORK AREA AND CHANGE OUTPUT VECTOR TO POINT TO THE RS232 DRIVER ROUTINE. M=256*PEEK(-4095)+PEEK(-4096)-65536 POKE M-47,0:POKE M-46,0 REM REM TURN PLOTTER ON, INITIALIZE IT, AND IDENTIFY THE PHYSICAL AREA OF THE PLOTTING WINDOW. PRINT CHR$(27)+".(IN;" PRINT "IPI328,1000,9328,6769;" PRINT SI . 3, .4; REM SIZE LETTERING WIDTH AND HEIGHT II REM II : THIS LOOP SELECTS RANDOM POINTS TO CREATE THE PLOT B=RND(I)*.1 + .02 C=INT(RND(1)*10)+7 E=0:D=0:G=1000:F=1000 FOR H=lTOC R(H,l)=RND(l)*lOOO IF R(H,l)<=D THEN 460 D=R(H,I) IF R(H,I»=F THEN 480 F=R(H,I) R(H,2)=RND(1)*1000 IF R(H,2)<=E THEN 510 E=R(H,2) IF R(H,2»=G THEN 530 G=R(H,2) NEXT H 550 560 570 580 590 600 610 620 630 640 650 660 670 680 690 700 710 720 730 740 750 760 770 780 790 800 810 820 830 840 850 REM NOW MAP THE LOGICAL WINDOW TO THE PLOTTING SURFACE . PRINT ISC";F;D;G-.1*(E-G);E;II;1I REM PLOT THE BIRTHDAY PLOT . PRINT IPAI;R(1,1);R(1,2);";PD;" FOR H=lT050 R(C+1,1)~R(1,1) R(C+1,2)=R(1,2) FOR I=1TOC+1 PRINT IPAI;INT(R(I,l»;INT(R(I,2»;I;" IF I>C THEN 700 R(I,1)=B*(R(I+1,1)-R(I,1»+R(I,1) R(I,2)=B*(R(I+1,2)-R(I,2»+R(I,2) NEXT I NEXT H REM LABEL THE PLOT WITH THE NAME TEXT : PRINT "PU;PAI;(D-F)*.5;G-.1*(E-G)I;" A$=MID$(STR$(A),2)+" II+N$ R=LEN(A$)/2 PRINT ICPI;R;-1;";1I PRINT "LB#";A$;CHR$(3) REM TURN PLOTTER OFF, AND RESTORE VECTOR TO >SE O=V PRINT "IN;II;CHR$(27)+II.)1I POKE M-47,27:POKE M-46,224 END SUMMARY OF 7225A PLOTTER CONTROLS USED IN THE EXAMPLE: IPx1,y1,x2,y2 SCx1,y1,x2,y2 PAx,y PU PD CPx,y LB SIx,y - WINDOW CORNER POINTS ON PLOTTER SURFACE SCALE LOGICAL CORNER POINTS TO PHYSICAL WINDOW MOVE PEN TO ABSOLUTE LOGICAL POINT OF (x,y) PEN UP PEN DOWN MOVE RELATIVE x CHARACTER WIDTHS, Y HEIGHTS LETTER TEXT STRING WHICH FOLLOWS LETTER WIDTH x, HEIGHT Y IN CENTIMETERS 18.02 3-D FUNCTION PLOTS USING SHADED PRINT DENSITY It 100 REM PATTERNS 110 . 120 REM PUT FUNCTION TO BE GRAPHED IN FNZ()= ON LINE 140 130 . 140 DEF FNZ(X)=COS(X)*COS(Y) :REM SAMPLE 3-D FUNCTION 150 . 160 L=18:GOSUB 5000 170 INPUT "DOMAIN OF X-AXIS ";X1,X2 :REM TRY -7,7 180 U=(X2-X1)/64 190 INPUT "DOMAIN OF Y-AXIS ";Y1,Y2 :REM TRY -7,7 200 W=-(Y1-Y2)/30 210 INPUT "RANGE OF FUNCTION"; R1, R2 : REM TRY -1. 01,1. 01 220 L=L/(R2-R1):PRINT CHR$(12):Y=Y1 230 FOR J=l TO 30:X=X1:FOR I=l TO 64 240 P=INT(L*(FNZ(X)-R1»+192 : POKE -4033+I+J*64,P 250 X=X+U : NEXT I : Y=Y+W : NEXT J 260 GOTO 260 : REM ENDLESS LOOP SO DISPLAY IS NOT RUINED 270 END 5000 REM --DEFINE GRAPHIC SYMBOLS 5010 FOR I=l TO L*8: READ A: POKE -513+I,A: NEXT I: RETURN 6000 DATA 0,0,0,0,0,0,0,0 6010 DATA 0,0,32,0,0,0,2,0 6020 DATA 0,32,0,4,64,0,8,0 6030 DATA 4,64,16,1,8,128,2,32 6040 DATA 65,16,20,33,132,16,66,8 6050 DATA 146,32,9,128,17,138,16,69 6060 DATA 145,74,17,68,137,18,132,82 6070 DATA 41,138,98,41,146,41,196,41 6080 DATA 85,74,101,146,73,178,74,149 6090 DATA 85,42,83,186,86,170,165,102 6100 DATA 85,229,85,174,85,202,85,171 6110 DATA 93,234,87,186,213,174,117,171 6120 DATA 109,222,245,107,218,183,247,251 6130 DATA 237,119,221,119,237,190,111,219 6140 DATA 190,238,251,222,123,238,190,247 6150 DATA 251,191,238,254,247,127,253,223 6160 DATA 255,223,255,254,255,191,255,251 6170 DATA 255,255,255,255,255,255,255,255 ---------- -------~- CHAPTER 19 -- T ABLES AND FORMS 19.01 BASIC'S TOKENS HEX -8O 1 2 3 4 5 6 7 8 9 A B C D E F END FOR NEXT DATA BYE INPUT DIM READ LET GOTO RUN IF RESTORE GOSUB RETURN REM EXAMPLE: -9- -A- -B- -c- STOP OUT ON NULL WAIT DEF POKE PRINT CaNT LIST CLEAR CLOAD CSAVE NEW TAB TO FN SPC THEN NOT STEP INT ABS USR FRE INP pas SQR RND LOG EXP CO'S SIN TAN ATN PEEK LEN STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ 8F - REM + * / A AND OR > = < SGN BE - PEEK c6 - MID$ =============================================================== 19.02 HEXADECIMAL - BINARY CONVERSION TABLE o - 0000 1 - 0001 2 - 0010 3 - 0011 4 - 0100 5 - 0101 6 - 0110 7 - 0111 8 9 A B C - 1000 1001 1010 1011 1100 D - 1101 E - 1110 F - 1111 --------------------------------------------------------------- 19.03 POWERS OF 2 TABLE: 0-1 1 2 - 3 4 5 - 2 4 8 16 32 6 - 64 7 - 128 8 - 256 2 A N 9 10 11 12 13 14 15 16 17 512 - 1024 - 2048 - 4096 - 8192 - 16384 - 32768 - 65536 -131072 19.04 DECIMAL - HEXADECIMAL CONVERSION TABLE 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 - 00 01 02 03 04 05 06 07 08 09 OA OB OC OD OE OF 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 48 49 50 51 52 53 54 55 56 57 5B 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 - 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4c 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 96 97 98 99 100 101 102 103 104 105 106 107 loB 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 - 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8c 8D 8E 8F 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 - 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F AO A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF BO B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 - co 240 - FO Cl 241 - Fl C2 242 - F2 C3 243 - F3 c4 244 - F4 C5 245 - F5 c6 . 246 - F6 C7 247 - F7 ·248 - FB C8 cg 249 - F9 CA 250 - FA CB 251 - FB CC 252 - FC CD 253 - FD CE 254 - FE CF 255 - FF DO Dl D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF EO E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF 19.05 CONTROL CODES AND THEIR FUNCTIONS HEX DEC CONTROL ------- 00 01 02 03 04 05 06 07 08 09 OA OB OC OD OE OF 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D IE IF 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 @ A B C D E F G H T ..L J K L N 0 P Q R S T U V w X Y Z [ \ ] A SYMBOL -----NULL SOH STX ETX EOT ENQ ACK BELL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 Dc4 NAK SYN ETB CAN EM SUB ESC FS GS RS US FUNCTION ----------CURSOR LEFT RUB OUT LINE FEED CLEAR SCREEN RETURN STOP INPUT HOME CURSOR RIGHT CURSOR UP CURSOR DOWN ESCAPE FUNCTIONS ACCESSED USING CHR$() . EXAMPLE: 100 PRINT CHR$(12);:REM CLEARS SCREEN 19.06 GRAPHIC CHARACTER DESIGNER'S FORM 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 19.07 MACHINE LANGUAGE CODING FORM ROUTINE NAME: PAGE DESCRIPTION: DATE ADDRESS OBJECT CODE LABEL INSTRUCTION REMARKS OF 19.08 SERIAL INTERFACE PINOUTS PIN# 1 2 3 4 5 6 7 8 9 10 11 12 13 SIGNAL SHIELD 1 RS232 OUT RS232 IN GROUND AUX 1 GROUND GROUND GROUND +12 VOLTS UNUSED RS232 IN MOTOR #1+ MOTOR #2+ PIN# 14 15 16 17 18 19 20 21 22 23 24 25 SIGNAL SHIELD 2 MIC 1 MIC 2 GROUND AUX 2 GROUND EAR 1 EAR 2 UNUSED RS232 OUT MOTOR #1MOTOR #2- =============================================================== 19.09 PARALLEL INTERFACE PINOUTS PIN# 1 2 3 4 5 6 7 8 9 10 11 12 13 SIGNAL GROUND OUTPUT DATA ACCEPTED OUTPUT DATA AVAILABLE OUTPUT BIT 7 OUTPUT BIT 6 OUTPUT BIT 5 OUTPUT BIT 4 GROUND INPUT DATA AVAILABLE INPUT BIT 0 INPUT BIT 2 INPUT BIT 4 INPUT BIT 6 PIN# 14 15 16 17 18 19 20 21 22 23 24 25 SIGNAL UNUSED +5 VOLTS OUTPUT BIT 0 OUTPUT BIT 1 OUTPUT BIT 2 OUTPUT BIT 3 +5 VOLTS INPUT DATA ACCEPTED INPUT BIT 1 INPUT BIT 3 INPUT BIT 5 INPUT BIT 7 19.10 DATA PORT ASSIGNMENTS PORT OFCH BIT INPUT FUNCTION OUTPUT FUNCTION 0 1 252 2 3 4 5 6 7 OFDH 0 1 253 2 3 4 5 6 7 OFEH 0 1 254 2 3 4 5 6 7 OFFH SERIAL INPUT DATA BYTE SERIAL OUTPUT DATA BYTE SERIAL OUT BUFFER EMPTY SERIAL DATA AVAILABLE OVER-RUN FRAMING ERROR PARITY ERROR UNUSED UNUSED UNUSED BITS PER CHARACTER NB1 BITS PER CHARACTER NB2 NUMBER OF STOP BITS PARITY SELECT NO PARITY UNUSED UNUSED UNUSED I I KEYBOARD I DATA I BYTE (5 BITS) I HORIZONTAL SYNC PULSE PARALLEL OUTPUT READ PARALLEL INPUT AVAILABLE I I KEYBOARD I SCAN COLUMN I MOTOR #1 CONTROL MOTOR #2 CONTROL BAUD RATE SELECT O=CASSETTE 1=RS232 0 1 255 2 3 4 5 6 7 PARALLEL INPUT DATA BYTE PARALLEL OUTPUT DATA BYTE 19.11 ASCII CHARACTER SET LSB 0 1 2 3 4 5 6 7 8 9 A B C D -E F LSB 0 1 2 3 4 5 6 7 8 MSB MSB 9 A B C D E F KEY: 0 ----NUL SOH STX ETX EaT ENG ACK BELL BS HT LF VT FF CR SO SI 8 ----- GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR 1 2 3 4 5 6 7 8 9 0 1 ----- DLE DCl DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS VS A ! II # $ % AMP I ( ) * + 3 . / A 9 ----- 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I E R T Y U I a P [ ] A S D F G H @ ; = > ? K L M N a ----- Q a R S T b c d P q r U e V W g v w x h i j k 1 m n ] A UNDER D y z { I } RUB 0 E ----- GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS s t u f \ A 7 ----- [ C ----GS 1 GS 2 GS 3 GS 4 GS 5 GS 6 GS 7 GS 8 GS 9 GS 0 GS GS GS GS TAB GS Q GS W 6 5 ----P X Y Z J B ----GR / GR K GR KGR L GR K7 GR ; GR K8 GR @ GR K9 GR K/ GR \ GR RUB GR K4 GR Z GR K6 GR X GR K* GR C GR Kl GR V GR K2 GR B GR K3 GR N GR K+ GR M GR KO GR , GR K. GR . GR K= ----GR J 4 ----- < ----- GR GR GR GR GR GR GR GR GR GR GR GR GR TAB GR Q GR W GR 2 ----SPACE E R T Y U I a P [ ] A S D F G H F ----GS J GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS ----- GS GS GS GS ; @ GS GS \ RUB GS GS Z X GS C GS V GS B GS N GS M GS , GS . GS K L / KK7 K8 K9 K/ K4 K6 K* Kl K2 K3 K+ KO K. K= GR = GRAPHIC GS = GRAPHIC AND SHIFT Kl = KEYPAD 1 MSB= MOST SIGNIFICANT BYTE LSB= LEAST SIGNIFICANT BYTE EXAMPLE: GRAPHIC SHIFT TAB = CD HEX (205 DECIMAL) 19.12 KEYBOARD STRUCTURE: OUT (OFEH),nn AND IN A,(OFEH) THE KEY IS DEPRESSED WHEN THE BIT IS A LOGICAL LOW. OUT BIT 0 nn o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 BIT 1 BIT 2 STOP CLEAR GRAPHIC REPEAT CTRL SPACE X C F Z D A S R B V N I L M K , / \ UNDERLINE KEYPAD + KEYPAD 0 KEYPAD NOT USED @ RETURN KEYPAD * KEYPAD 1 KEYPAD 2 NOT USED BIT 3 BIT 4 SHFTLOCK SKIP SHIFT ESC Q 1 2 E vi 4 G T H J o Y U 9 5 , P ] LINEFEED KEYPAD / KEYPAD 4 KEYPAD 5 NOT USED 3 6 7 8 o [ A KEYPAD KEYPAD KEYPAD KEYPAD 8 6 NOT USED KEYPAD 7 KEYPAD 9 = KEYPAD 3 =============================================================== 19.13 GRAPHIC CHARACTER STARTING ADDRESSES ASC KEY 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR HEX 1 2 3 4 5 6 7 8 9 0 FCOO Fc08 FC10 FC18 FC20 FC28 FC30 FC38 FC40 Fc48 FC50 FC58 Fc60 TAB FC68 Q FC70 W FC78 A DEC ASC KEY -1024 -1016 -1008 -1000 -992 -984 -976 -968 -960 -952 -944 -936 -928 -920 -912 -904 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS HEX 1 2 3 4 5 6 7 8 9 0 FEOO FE08 FE10 FEl8 FE20 FE28 FE30 FE38 FE40 FE48 FE50 FE58 FE60 TAB FE68 Q FE70 W FE78 A DEC -512 -504 -496 -488 -1~80 -472 -464 -456 -448 -440 -432 -424 -416 -408 -400 -392 KEY: 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR E R T Y U I 0 P [ ] A S D F G H FC80 Fc88 FC90 FC98 FCAO FCA8 FCBO FCB8 FCCO Fcc8 FCDO FCD8 FCEO FCE8 FCFO FCF8 -896 -888 -880 -872 -864 -856 -848 -840 -832 -824 -816 -808 -800 -792 -784 -776 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS E R T Y U I 0 P FE80 FE88 FE90 FE98 FEAO FEA8 FEBO FEB8 FECO FEC8 FEDO FED8 FEEO FEE8 FEFO FEF8 -384 -376 -368 -360 -352 -344 -336 -328 -320 -312 -304 -296 -288 -280 -272 -264 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR FDOO FD08 L FD10 FD18 ; @ FD20 FD28 \ RUB FD30 Z FD38 X FD40 C FD48 V FD50 B FD58 N FD60 M FD68 , FD70 FD78 -768 -760 -752 -744 -736 -728 -720 -712 -704 -696 -688 -680 -672 -664 -656 -648 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS FFOO FF08 FF10 L , FF18 @ FF20 FF28 \ RUB FF30 Z FF38 X FF40 C FF48 V FF50 B FF58 N FF60 M FF68 , FF70 FF78 -252 -244 -236 -228 -220 -212 -204 -196 -188 -180 -172 -168 -160 -152 -144 -136 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR / KK7 K8 K9 K/ K4 K6 K* K1 K2 K3 K+ KO K. K= FD80 FD88 FD90 FD98 FDAO FDA8 FDBO FDB8 FDCO FDC8 FDDO FDD8 FDEO FDE8 FDFO FDF8 -640 -632 -624 -616 -608 -600 -592 -584 -576 -568 -560 -552 -544 -536 -528 -520 2JW 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS GS KK7 K8 K9 K/ K4 K6 K* K1 K2 K3 K+ KO K. K= FF80 FP88 FF90 FF98 FFAO FFA8 FFBO FFB8 FFCO FFC8 FFDO FFD8 FFEO FFE8 FFFO FFF8 -128 -120 -112 -104 -96 -88 -80 -72 -64 -56 -48 -40 -32 -24 -16 -8 J K GR = GRAPHIC [ ] A S D F G H GS = GRAPHIC AND SHIFT J K / K1 = KEYPAD 1 19.14 ONE-STROKE BASIC COMMANDS ASC KEYS COMMAND ----- ------- 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR END FOR NEXT DATA BYE 0 INPUT DIM READ LET GOTO RUN IF A RESTORE TAB GOSUB Q RETURN W REM 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR E R T Y U I 0 P ( ] A S D F G H 160 161 162 163 164 165 166 167 168 169 170 171 172 173 17 1l 175 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR FN SPC( THEN NOT @ STEP + \ RUB Z X / "C V AND B OR N > M = , < . SGN KEY: 1 2 3 4 5 6 7 8 9 0 ASC KEYS 192 193 194 195 196 197 198 GS GS GS GS GS GS GS 1 2 3 4 5 6 7 COMMAND ------STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR GR / KK7 K8 K9 K/ Kl,J K6 K* Kl K2 K3 K+ KO K. K= INT. ABS USR FRE INP POS SQR RND LOG EXP COS SIN TAN ATN PEEK LEN ----- STOP OUT ON NULL WAIT DEF POKE PRINT CONT LIST CLEAR CLOAD CSAVE NEW TAB( TO J K L ; GR = GRAPHIC KEY GS = GRAPHIC AND SHIFT KEYS • ARRINGTON SOFTWARE SERVICE 9522 Linstock, Boise, Idaho 83704 U.S.A. ~G~ ~ HOW TO ORDER: ASTRO ATTACKER $21.95 is similar to the arcade game called "ASTRO BLASTER". This action game for the Sorcerer is far superior to all other Sorcerer games because of its high resolution graphics, sound, variety and playability. Astro Attacker graphics are extremely advanced. The display is of the console inside your astro fighter craft. In your console window you see the enemy ships placed against a background of continuously moving stars. Gauges also indicate the amount of fuel remaining and the temperature of your lazer cannons. If you fire too frequently you can overheat the lazers, or if you move recklessly you may run out of fuel. Your challenge is to survive and destroy the Spinners, the Lazer Ships, the Rockets, the Flame Throwers, and the Meteor shower. Docking with the mother ship is crucial to survival as this restores your shield strength and fuel, and cools your lazer cannon. With each succeeding level of play, survival becomes more difficult as the enemy ships attack with greater frequency and quickness. Superb sound too. ALL L- PRICES ARE IN U.S. DOLLARS PRODUCT PRICE i i I I I I OVERSEAS POSTAGE: ADD $3 . NO POSTAGE CHARGE IN USA & CANADA i VIS4 ,'• • TOTAL ENCLOSE: (A) A CHECK IN U.S. DOLLARS DRAWN ON A U.S. BANK, MONEY ORDER OR CASH FOR THE ABOVE AMOUNT, OR (B) CREDIT CARD, EXPIRATION DATE ...j ~+tlJ ~,..~ " ot~ oG~ c:I ~,.." c,'" <:>e<:> o~e":; 1>-C> \.'(\e o,Y.l-e 0"- e",e ~e(, \.0 ,,:;e~o ~0\}'I. \e1>-,,:;e ~'(\o ,-\e' ~ ~e~":; ,,~o~ 0'<:. (,1>- -.:s-''':; NUMBER: ............. , ............... , ....... My name and address: ASTRO ATTACKER NAME ........................................ v q;j.;'':;; , III 00 i f'~ c' SCORE: 08753 STREET: ......... ' ............................ CITY/STATE ................................... ~iJv I POSTCODE ............. COUNTRY: ............. 'I + HIGH: 0875.::3 I PlEASE DESCRIBE YOUR COMPUTER CONFIGURATI .... HIGH QUALITY SOFTWARE AT A LOW PRICE MAIL YOUR ORDER TO: Please let us know if you should not be receiving this catalog so we can remove your name from our mailing list - - -----_._-- ENSIGN SOFTWARE 2312 N. COLE RD., SUITE E BOISE, IDAHO 83704 U.S.A. PHONE: (208) 378-8086 LIMITED WARRANTY SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN NO EVENT WILL ENSIGN SOFTWARE BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE ANY OF OUR PRODUCTS. YOU ASSUME RESPONSIBILITY FOR THE SELECTION OF THE PRODUCTS TO ACHIEVE YOUR INTENDED RESULTS, AND FORTHE INSTALLATION, REPAIR, USE AND RESULTS OBTAINED FROM THE PRODUCTS. AUTHORS: We seek excellent programs to market worldwide. Our royalties are generous, and our interest in having satisfied customers is keen. We invite you to join with us and our distributors to bring your product into the marketplace. Submit programs for evaluation along with documentation and your phone number. ENSIGN SOFTWARE 2312 N. Cole Rd., Suite E, Boise, Idaho 83704 U.S.A.
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.3 Linearized : No XMP Toolkit : Adobe XMP Core 4.2.1-c041 52.342996, 2008/05/07-21:37:19 Create Date : 2018:08:21 07:57:35-08:00 Modify Date : 2018:08:21 08:19:22-07:00 Metadata Date : 2018:08:21 08:19:22-07:00 Producer : Adobe Acrobat 9.0 Paper Capture Plug-in Format : application/pdf Document ID : uuid:70e5553e-a6ac-0d4f-94eb-843847a22ca4 Instance ID : uuid:0c72944b-285c-c446-b98e-29c3ebbb7579 Page Layout : SinglePage Page Mode : UseNone Page Count : 128EXIF Metadata provided by EXIF.tools