Home » CEEFAX disks » telesoftware3.adl » 21_11_87/T\SWR05

21_11_87/T\SWR05

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » CEEFAX disks » telesoftware3.adl
Filename: 21_11_87/T\SWR05
Read OK:
File size: 2784 bytes
Load address: 0000
Exec address: 0000
Duplicates

There is 1 duplicate copy of this file in the archive:

File contents
Mastering Sideways ROM & RAM - Module 05 - Reading arguments
------------------------------------------------------------

  In this module I will extend the interpreter introduced in Module 3
to include reading arguments which follow the * command.

  There are two MOS subroutines used to read arguments. They are
Gsinit at &FFC2 and Gsread at &FFC5.

  Gsinit should be used to initialise an argument which is to be read
using Gsread. Gsinit uses the text pointers at &F2 and &F3 with an
offset in the Y register to identify the argument address. The
argument can be enclosed by quotation marks but it does not have to
be. Gsinit is used to strip off any leading spaces and to set up an
information byte in zero page which indicates the termination
character of the argument.

  Before calling Gsinit you should clear the carry flag if you want
the second quotation mark, the first space within the argument, or a
carriage return as the terminating character. You should set the carry
flag before calling Gsinit if you do not want a space to be recognised
as a terminating character. If in doubt, set the carry flag before
calling Gsinit.

  After calling Gsinit the Y register contains an offset to the first
character of the argument and the accumulator contains the first
character of the argument. The zero flag is set if the argument is a
null string.

  For example, imagine you have typed *CURSOR ON and the interpreter
has recognised the command CURSOR. Before calling Gsinit, the text
pointers at &F2 and &F3 will point to the command with the offset in Y
pointing to the second R of CURSOR. After calling Gsinit the offset in
Y will point to the O of ON, the zero flag will be clear, and the
terminating character will be the carriage return after the N of ON.
If ON is enclosed by quotation marks the offset in Y will still point
to the O of ON and the zero flag will be clear, but the terminating
character will be the second quotation mark. If an argument is not
typed or if *CURSOR "" is typed the zero flag will be set on return
from Gsinit. Figure 5.1 shows the offset in the Y register pointing to
the end of the command before calling Gsinit and pointing to the
beginning of the argument after calling Gsinit.




       +- Y before Gsinit -+
       !                   !
       v                   v
>*CURSOR ON         >*CURSOR "ON"
         ^                    ^
         !                    !
         +-- Y after Gsinit --+

Figure 5.1 The offset in Y before and after calling Gsinit.
-----------------------------------------------------------




  Gsread is used to read each byte of the argument. This routine
should only be used following a Gsinit call or a previous Gsread.
Following Gsinit the text pointers and Y register will point to the
first byte of the argument. After calling Gsread the accumulator
contains the character read from the argument, Y is incremented to
point to the next character, X is preserved and the carry flag is set
if the terminating character has been read.

  The effect of calling Gsread is similar to, but not the same as:

  LDA (&F2),Y
  INY

  The difference exists because Gsread tests the content of A to see
if the terminating character, and hence the end of the argument, has
been read. The terminating character can be either a second quotation
mark, a space or a carriage return as defined by Gsinit. Using Gsinit
to initialise an argument and Gsread to read it is more versatile than
simply reading the argument using post-indexed indirect addressing
with the text pointers. The difference may seem insignificant with the
simple example used above but it is useful if the argument is a number
when the place value of a particular character depends on its
displacement from the terminating character. Reading numerical
arguments will be covered in module 11.

  Because the effect of using Gsread is very similar to reading a
string using post-indexed indirect addressing with the text pointers
you may be tempted to use Gsread in the interpreter to read the
unrecognised command. If you do you will find that most of the time it
will work but, sooner or later, you will start getting mysterious "bad
string" error messages. Don't be tempted into wasting your time using
Gsread in the interpreter. Stick with the method demonstrated in
Module 3.

  Figure 5.2 shows how the interpreter used in the last two modules
can be modified to read an argument.





.found
         SEC           \ terminate with Return or "
         JSR &FFC2     \ initialise argument with Gsinit
         BEQ exit      \ branch if null argument
         JSR &FFC5     \ read first character with Gsread
         BCS exit      \ branch if end of argument
         AND #&DF      \ force upper case
          .
          .
          .
.exit
         PLA           \ discard Y
         PLA           \ discard X
         PLA           \ discard A
         LDA #0        \ service call recognised
         RTS           \ return to MOS

Figure 5.2 Using Gsinit and Gsread to read an argument.
-------------------------------------------------------




  The carry flag is set before calling Gsinit. The terminating
character of the argument will be a carriage return or a second
quotation mark. After setting the carry flag Gsinit is called to
initialise the argument. If the argument is null Gsinit returns with
the zero flag set. This can be tested and branch to exit if there is
nothing to read. If the zero flag is clear there is an argument to be
read by calling Gsread for each character. Gsread will return with the
carry flag set when the terminating character is read and an
appropriate branch can be made after testing the carry flag.

  This method of reading an argument has been used in the progran
CURSOR. When the interpreter (lines 280-540) recognises the command
*CURSOR it passes control to the label ".found" (line 550). The
argument is initialised (lines 560-570) and the argument is tested
(line 580). If a null argument is detected the program returns control
to the MOS with A=0 (lines 860-910). If an argument is found the
program expects to read either ON or OFF. To test for ON or OFF the
first character can be skipped since it should be an "O" (line 590).
The next character is read using Gsread (line 600) and tested for a
terminating character (line 610) and either "F" (line 630) or "N"
(line 650). There is no need to read and test for the second F of OFF.
If the second character of the argument is "F" the cursor is switched
off (lines 690-850), if it is "N" the cursor is switched on (lines
670-850).

  When you load the object code generated by CURSOR into SWR to see
how it works it is possible to deceive yourself into believing that
there is something wrong with it. If you type *CURSOR OFF and press
Return the cursor will go off as expected. Type *CURSOR ON and it will
come back on. Everything seems OK. Type *CURSOR OFF and Return and
then type *CURSOR and Return. The cursor stays off because you have
not typed an argument. Everything is still OK. Now use the cursor keys
to copy the *CURSOR command without an argument and press Return. The
cursor comes back on when it should have stayed off. This will happen
because you will re-enable the cursor with the cursor keys. There is
nothing wrong with the argument reading technique demonstrated in the
program.





   10 REM: CURSOR
   20 MODE7
   30 HIMEM=&3C00
   40 DIM save 50
   50 diff=&8000-HIMEM
   60 comvec=&F2
   70 gsinit=&FFC2
   80 gsread=&FFC5
   90 osasci=&FFE3
  100 oscli=&FFF7
  110 FOR pass = 0 TO 2 STEP 2
  120 P%=HIMEM
  130 [       OPT pass
  140         BRK
  150         BRK
  160         BRK
  170         JMP service+diff
  180         OPT FNequb(&82)
  190         OPT FNequb((copyright+diff) MOD 256)
  200         BRK
  210 .title
  220         OPT FNequs("CURSOR")
  230 .copyright
  240         BRK
  250         OPT FNequs("(C) Gordon Horsington 1987")
  260         BRK
  270 .service
  280         CMP #4
  290         BEQ unrecognised
  300         RTS
  310 .unrecognised
  320         PHA
  330         TXA
  340         PHA
  350         TYA
  360         PHA
  370         LDX #&FF
  380 .comloop
  390         INX
  400         LDA title+diff,X
  410         BEQ found
  420         LDA (comvec),Y
  430         INY
  440         CMP #ASC(".")
  450         BEQ found
  460         AND #&DF
  470         CMP title+diff,X
  480         BEQ comloop
  490         PLA
  500         TAY
  510         PLA
  520         TAX
  530         PLA
  540         RTS
  550 .found
  560         SEC           \ Terminate with Return or "
  570         JSR gsinit
  580         BEQ exit      \ Branch if null argument
  590         INY           \ First character must be "O"
  600         JSR gsread    \ Second character "F" or "N"
  610         BCS exit      \ Branch if end of argument
  620         AND #&DF      \ Upper case
  630         CMP #ASC("F")
  640         BEQ cursoroff
  650         CMP #ASC("N")
  660         BNE exit
  670         SEC
  680         BCS cursor
  690 .cursoroff
  700         CLC
  710 .cursor
  720         PHP
  730         LDA #23
  740         JSR osasci
  750         LDA #1
  760         JSR osasci
  770         PLA
  780         AND #1
  790         JSR osasci
  800         LDA #0
  810         LDX #7
  820 .cursorloop
  830         JSR osasci
  840         DEX
  850         BNE cursorloop
  860 .exit
  870         PLA
  880         PLA
  890         PLA
  900         LDA #0
  910         RTS
  920 .lastbyte
  930 ]
  940 NEXT
  950 INPUT'"Save filename = "filename$
  960 IF filename$="" END
  970 $save="SAVE "+filename$+" "+STR$~(HIMEM)+" "+STR$~(las
      tbyte)+" FFFF8000 FFFF8000"
  980 X%=save MOD 256
  990 Y%=save DIV 256
 1000 *OPT1,2
 1010 CALL oscli
 1020 *OPT1,0
 1030 END
 1040 DEFFNequb(byte)
 1050 ?P%=byte
 1060 P%=P%+1
 1070 =pass
 1080 DEFFNequw(word)
 1090 ?P%=word MOD 256
 1100 P%?1=word DIV 256
 1110 P%=P%+2
 1120 =pass
 1130 DEFFNequd(double)
 1140 !P%=double
 1150 P%=P%+4
 1160 =pass
 1170 DEFFNequs(string$)
 1180 $P%=string$
 1190 P%=P%+LEN(string$)
 1200 =pass
00000000  4d 61 73 74 65 72 69 6e  67 20 53 69 64 65 77 61  |Mastering Sidewa|
00000010  79 73 20 52 4f 4d 20 26  20 52 41 4d 20 2d 20 4d  |ys ROM & RAM - M|
00000020  6f 64 75 6c 65 20 30 35  20 2d 20 52 65 61 64 69  |odule 05 - Readi|
00000030  6e 67 20 61 72 67 75 6d  65 6e 74 73 0d 2d 2d 2d  |ng arguments.---|
00000040  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00000070  2d 2d 2d 2d 2d 2d 2d 2d  2d 0d 0d 20 20 49 6e 20  |---------..  In |
00000080  74 68 69 73 20 6d 6f 64  75 6c 65 20 49 20 77 69  |this module I wi|
00000090  6c 6c 20 65 78 74 65 6e  64 20 74 68 65 20 69 6e  |ll extend the in|
000000a0  74 65 72 70 72 65 74 65  72 20 69 6e 74 72 6f 64  |terpreter introd|
000000b0  75 63 65 64 20 69 6e 20  4d 6f 64 75 6c 65 20 33  |uced in Module 3|
000000c0  0d 74 6f 20 69 6e 63 6c  75 64 65 20 72 65 61 64  |.to include read|
000000d0  69 6e 67 20 61 72 67 75  6d 65 6e 74 73 20 77 68  |ing arguments wh|
000000e0  69 63 68 20 66 6f 6c 6c  6f 77 20 74 68 65 20 2a  |ich follow the *|
000000f0  20 63 6f 6d 6d 61 6e 64  2e 0d 0d 20 20 54 68 65  | command...  The|
00000100  72 65 20 61 72 65 20 74  77 6f 20 4d 4f 53 20 73  |re are two MOS s|
00000110  75 62 72 6f 75 74 69 6e  65 73 20 75 73 65 64 20  |ubroutines used |
00000120  74 6f 20 72 65 61 64 20  61 72 67 75 6d 65 6e 74  |to read argument|
00000130  73 2e 20 54 68 65 79 20  61 72 65 0d 47 73 69 6e  |s. They are.Gsin|
00000140  69 74 20 61 74 20 26 46  46 43 32 20 61 6e 64 20  |it at &FFC2 and |
00000150  47 73 72 65 61 64 20 61  74 20 26 46 46 43 35 2e  |Gsread at &FFC5.|
00000160  0d 0d 20 20 47 73 69 6e  69 74 20 73 68 6f 75 6c  |..  Gsinit shoul|
00000170  64 20 62 65 20 75 73 65  64 20 74 6f 20 69 6e 69  |d be used to ini|
00000180  74 69 61 6c 69 73 65 20  61 6e 20 61 72 67 75 6d  |tialise an argum|
00000190  65 6e 74 20 77 68 69 63  68 20 69 73 20 74 6f 20  |ent which is to |
000001a0  62 65 20 72 65 61 64 0d  75 73 69 6e 67 20 47 73  |be read.using Gs|
000001b0  72 65 61 64 2e 20 47 73  69 6e 69 74 20 75 73 65  |read. Gsinit use|
000001c0  73 20 74 68 65 20 74 65  78 74 20 70 6f 69 6e 74  |s the text point|
000001d0  65 72 73 20 61 74 20 26  46 32 20 61 6e 64 20 26  |ers at &F2 and &|
000001e0  46 33 20 77 69 74 68 20  61 6e 0d 6f 66 66 73 65  |F3 with an.offse|
000001f0  74 20 69 6e 20 74 68 65  20 59 20 72 65 67 69 73  |t in the Y regis|
00000200  74 65 72 20 74 6f 20 69  64 65 6e 74 69 66 79 20  |ter to identify |
00000210  74 68 65 20 61 72 67 75  6d 65 6e 74 20 61 64 64  |the argument add|
00000220  72 65 73 73 2e 20 54 68  65 0d 61 72 67 75 6d 65  |ress. The.argume|
00000230  6e 74 20 63 61 6e 20 62  65 20 65 6e 63 6c 6f 73  |nt can be enclos|
00000240  65 64 20 62 79 20 71 75  6f 74 61 74 69 6f 6e 20  |ed by quotation |
00000250  6d 61 72 6b 73 20 62 75  74 20 69 74 20 64 6f 65  |marks but it doe|
00000260  73 20 6e 6f 74 20 68 61  76 65 20 74 6f 0d 62 65  |s not have to.be|
00000270  2e 20 47 73 69 6e 69 74  20 69 73 20 75 73 65 64  |. Gsinit is used|
00000280  20 74 6f 20 73 74 72 69  70 20 6f 66 66 20 61 6e  | to strip off an|
00000290  79 20 6c 65 61 64 69 6e  67 20 73 70 61 63 65 73  |y leading spaces|
000002a0  20 61 6e 64 20 74 6f 20  73 65 74 20 75 70 20 61  | and to set up a|
000002b0  6e 0d 69 6e 66 6f 72 6d  61 74 69 6f 6e 20 62 79  |n.information by|
000002c0  74 65 20 69 6e 20 7a 65  72 6f 20 70 61 67 65 20  |te in zero page |
000002d0  77 68 69 63 68 20 69 6e  64 69 63 61 74 65 73 20  |which indicates |
000002e0  74 68 65 20 74 65 72 6d  69 6e 61 74 69 6f 6e 0d  |the termination.|
000002f0  63 68 61 72 61 63 74 65  72 20 6f 66 20 74 68 65  |character of the|
00000300  20 61 72 67 75 6d 65 6e  74 2e 0d 0d 20 20 42 65  | argument...  Be|
00000310  66 6f 72 65 20 63 61 6c  6c 69 6e 67 20 47 73 69  |fore calling Gsi|
00000320  6e 69 74 20 79 6f 75 20  73 68 6f 75 6c 64 20 63  |nit you should c|
00000330  6c 65 61 72 20 74 68 65  20 63 61 72 72 79 20 66  |lear the carry f|
00000340  6c 61 67 20 69 66 20 79  6f 75 20 77 61 6e 74 0d  |lag if you want.|
00000350  74 68 65 20 73 65 63 6f  6e 64 20 71 75 6f 74 61  |the second quota|
00000360  74 69 6f 6e 20 6d 61 72  6b 2c 20 74 68 65 20 66  |tion mark, the f|
00000370  69 72 73 74 20 73 70 61  63 65 20 77 69 74 68 69  |irst space withi|
00000380  6e 20 74 68 65 20 61 72  67 75 6d 65 6e 74 2c 20  |n the argument, |
00000390  6f 72 20 61 0d 63 61 72  72 69 61 67 65 20 72 65  |or a.carriage re|
000003a0  74 75 72 6e 20 61 73 20  74 68 65 20 74 65 72 6d  |turn as the term|
000003b0  69 6e 61 74 69 6e 67 20  63 68 61 72 61 63 74 65  |inating characte|
000003c0  72 2e 20 59 6f 75 20 73  68 6f 75 6c 64 20 73 65  |r. You should se|
000003d0  74 20 74 68 65 20 63 61  72 72 79 0d 66 6c 61 67  |t the carry.flag|
000003e0  20 62 65 66 6f 72 65 20  63 61 6c 6c 69 6e 67 20  | before calling |
000003f0  47 73 69 6e 69 74 20 69  66 20 79 6f 75 20 64 6f  |Gsinit if you do|
00000400  20 6e 6f 74 20 77 61 6e  74 20 61 20 73 70 61 63  | not want a spac|
00000410  65 20 74 6f 20 62 65 20  72 65 63 6f 67 6e 69 73  |e to be recognis|
00000420  65 64 0d 61 73 20 61 20  74 65 72 6d 69 6e 61 74  |ed.as a terminat|
00000430  69 6e 67 20 63 68 61 72  61 63 74 65 72 2e 20 49  |ing character. I|
00000440  66 20 69 6e 20 64 6f 75  62 74 2c 20 73 65 74 20  |f in doubt, set |
00000450  74 68 65 20 63 61 72 72  79 20 66 6c 61 67 20 62  |the carry flag b|
00000460  65 66 6f 72 65 0d 63 61  6c 6c 69 6e 67 20 47 73  |efore.calling Gs|
00000470  69 6e 69 74 2e 0d 0d 20  20 41 66 74 65 72 20 63  |init...  After c|
00000480  61 6c 6c 69 6e 67 20 47  73 69 6e 69 74 20 74 68  |alling Gsinit th|
00000490  65 20 59 20 72 65 67 69  73 74 65 72 20 63 6f 6e  |e Y register con|
000004a0  74 61 69 6e 73 20 61 6e  20 6f 66 66 73 65 74 20  |tains an offset |
000004b0  74 6f 20 74 68 65 20 66  69 72 73 74 0d 63 68 61  |to the first.cha|
000004c0  72 61 63 74 65 72 20 6f  66 20 74 68 65 20 61 72  |racter of the ar|
000004d0  67 75 6d 65 6e 74 20 61  6e 64 20 74 68 65 20 61  |gument and the a|
000004e0  63 63 75 6d 75 6c 61 74  6f 72 20 63 6f 6e 74 61  |ccumulator conta|
000004f0  69 6e 73 20 74 68 65 20  66 69 72 73 74 0d 63 68  |ins the first.ch|
00000500  61 72 61 63 74 65 72 20  6f 66 20 74 68 65 20 61  |aracter of the a|
00000510  72 67 75 6d 65 6e 74 2e  20 54 68 65 20 7a 65 72  |rgument. The zer|
00000520  6f 20 66 6c 61 67 20 69  73 20 73 65 74 20 69 66  |o flag is set if|
00000530  20 74 68 65 20 61 72 67  75 6d 65 6e 74 20 69 73  | the argument is|
00000540  20 61 0d 6e 75 6c 6c 20  73 74 72 69 6e 67 2e 0d  | a.null string..|
00000550  0d 20 20 46 6f 72 20 65  78 61 6d 70 6c 65 2c 20  |.  For example, |
00000560  69 6d 61 67 69 6e 65 20  79 6f 75 20 68 61 76 65  |imagine you have|
00000570  20 74 79 70 65 64 20 2a  43 55 52 53 4f 52 20 4f  | typed *CURSOR O|
00000580  4e 20 61 6e 64 20 74 68  65 20 69 6e 74 65 72 70  |N and the interp|
00000590  72 65 74 65 72 0d 68 61  73 20 72 65 63 6f 67 6e  |reter.has recogn|
000005a0  69 73 65 64 20 74 68 65  20 63 6f 6d 6d 61 6e 64  |ised the command|
000005b0  20 43 55 52 53 4f 52 2e  20 42 65 66 6f 72 65 20  | CURSOR. Before |
000005c0  63 61 6c 6c 69 6e 67 20  47 73 69 6e 69 74 2c 20  |calling Gsinit, |
000005d0  74 68 65 20 74 65 78 74  0d 70 6f 69 6e 74 65 72  |the text.pointer|
000005e0  73 20 61 74 20 26 46 32  20 61 6e 64 20 26 46 33  |s at &F2 and &F3|
000005f0  20 77 69 6c 6c 20 70 6f  69 6e 74 20 74 6f 20 74  | will point to t|
00000600  68 65 20 63 6f 6d 6d 61  6e 64 20 77 69 74 68 20  |he command with |
00000610  74 68 65 20 6f 66 66 73  65 74 20 69 6e 20 59 0d  |the offset in Y.|
00000620  70 6f 69 6e 74 69 6e 67  20 74 6f 20 74 68 65 20  |pointing to the |
00000630  73 65 63 6f 6e 64 20 52  20 6f 66 20 43 55 52 53  |second R of CURS|
00000640  4f 52 2e 20 41 66 74 65  72 20 63 61 6c 6c 69 6e  |OR. After callin|
00000650  67 20 47 73 69 6e 69 74  20 74 68 65 20 6f 66 66  |g Gsinit the off|
00000660  73 65 74 20 69 6e 0d 59  20 77 69 6c 6c 20 70 6f  |set in.Y will po|
00000670  69 6e 74 20 74 6f 20 74  68 65 20 4f 20 6f 66 20  |int to the O of |
00000680  4f 4e 2c 20 74 68 65 20  7a 65 72 6f 20 66 6c 61  |ON, the zero fla|
00000690  67 20 77 69 6c 6c 20 62  65 20 63 6c 65 61 72 2c  |g will be clear,|
000006a0  20 61 6e 64 20 74 68 65  0d 74 65 72 6d 69 6e 61  | and the.termina|
000006b0  74 69 6e 67 20 63 68 61  72 61 63 74 65 72 20 77  |ting character w|
000006c0  69 6c 6c 20 62 65 20 74  68 65 20 63 61 72 72 69  |ill be the carri|
000006d0  61 67 65 20 72 65 74 75  72 6e 20 61 66 74 65 72  |age return after|
000006e0  20 74 68 65 20 4e 20 6f  66 20 4f 4e 2e 0d 49 66  | the N of ON..If|
000006f0  20 4f 4e 20 69 73 20 65  6e 63 6c 6f 73 65 64 20  | ON is enclosed |
00000700  62 79 20 71 75 6f 74 61  74 69 6f 6e 20 6d 61 72  |by quotation mar|
00000710  6b 73 20 74 68 65 20 6f  66 66 73 65 74 20 69 6e  |ks the offset in|
00000720  20 59 20 77 69 6c 6c 20  73 74 69 6c 6c 20 70 6f  | Y will still po|
00000730  69 6e 74 0d 74 6f 20 74  68 65 20 4f 20 6f 66 20  |int.to the O of |
00000740  4f 4e 20 61 6e 64 20 74  68 65 20 7a 65 72 6f 20  |ON and the zero |
00000750  66 6c 61 67 20 77 69 6c  6c 20 62 65 20 63 6c 65  |flag will be cle|
00000760  61 72 2c 20 62 75 74 20  74 68 65 20 74 65 72 6d  |ar, but the term|
00000770  69 6e 61 74 69 6e 67 0d  63 68 61 72 61 63 74 65  |inating.characte|
00000780  72 20 77 69 6c 6c 20 62  65 20 74 68 65 20 73 65  |r will be the se|
00000790  63 6f 6e 64 20 71 75 6f  74 61 74 69 6f 6e 20 6d  |cond quotation m|
000007a0  61 72 6b 2e 20 49 66 20  61 6e 20 61 72 67 75 6d  |ark. If an argum|
000007b0  65 6e 74 20 69 73 20 6e  6f 74 0d 74 79 70 65 64  |ent is not.typed|
000007c0  20 6f 72 20 69 66 20 2a  43 55 52 53 4f 52 20 22  | or if *CURSOR "|
000007d0  22 20 69 73 20 74 79 70  65 64 20 74 68 65 20 7a  |" is typed the z|
000007e0  65 72 6f 20 66 6c 61 67  20 77 69 6c 6c 20 62 65  |ero flag will be|
000007f0  20 73 65 74 20 6f 6e 20  72 65 74 75 72 6e 0d 66  | set on return.f|
00000800  72 6f 6d 20 47 73 69 6e  69 74 2e 20 46 69 67 75  |rom Gsinit. Figu|
00000810  72 65 20 35 2e 31 20 73  68 6f 77 73 20 74 68 65  |re 5.1 shows the|
00000820  20 6f 66 66 73 65 74 20  69 6e 20 74 68 65 20 59  | offset in the Y|
00000830  20 72 65 67 69 73 74 65  72 20 70 6f 69 6e 74 69  | register pointi|
00000840  6e 67 20 74 6f 0d 74 68  65 20 65 6e 64 20 6f 66  |ng to.the end of|
00000850  20 74 68 65 20 63 6f 6d  6d 61 6e 64 20 62 65 66  | the command bef|
00000860  6f 72 65 20 63 61 6c 6c  69 6e 67 20 47 73 69 6e  |ore calling Gsin|
00000870  69 74 20 61 6e 64 20 70  6f 69 6e 74 69 6e 67 20  |it and pointing |
00000880  74 6f 20 74 68 65 0d 62  65 67 69 6e 6e 69 6e 67  |to the.beginning|
00000890  20 6f 66 20 74 68 65 20  61 72 67 75 6d 65 6e 74  | of the argument|
000008a0  20 61 66 74 65 72 20 63  61 6c 6c 69 6e 67 20 47  | after calling G|
000008b0  73 69 6e 69 74 2e 0d 0d  0d 0d 0d 20 20 20 20 20  |sinit......     |
000008c0  20 20 2b 2d 20 59 20 62  65 66 6f 72 65 20 47 73  |  +- Y before Gs|
000008d0  69 6e 69 74 20 2d 2b 0d  20 20 20 20 20 20 20 21  |init -+.       !|
000008e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000008f0  20 20 20 21 0d 20 20 20  20 20 20 20 76 20 20 20  |   !.       v   |
00000900  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000910  76 0d 3e 2a 43 55 52 53  4f 52 20 4f 4e 20 20 20  |v.>*CURSOR ON   |
00000920  20 20 20 20 20 20 3e 2a  43 55 52 53 4f 52 20 22  |      >*CURSOR "|
00000930  4f 4e 22 0d 20 20 20 20  20 20 20 20 20 5e 20 20  |ON".         ^  |
00000940  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000950  20 20 5e 0d 20 20 20 20  20 20 20 20 20 21 20 20  |  ^.         !  |
00000960  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000970  20 20 21 0d 20 20 20 20  20 20 20 20 20 2b 2d 2d  |  !.         +--|
00000980  20 59 20 61 66 74 65 72  20 47 73 69 6e 69 74 20  | Y after Gsinit |
00000990  2d 2d 2b 0d 0d 46 69 67  75 72 65 20 35 2e 31 20  |--+..Figure 5.1 |
000009a0  54 68 65 20 6f 66 66 73  65 74 20 69 6e 20 59 20  |The offset in Y |
000009b0  62 65 66 6f 72 65 20 61  6e 64 20 61 66 74 65 72  |before and after|
000009c0  20 63 61 6c 6c 69 6e 67  20 47 73 69 6e 69 74 2e  | calling Gsinit.|
000009d0  0d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |.---------------|
000009e0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00000a00  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 0d 0d 0d 0d  |------------....|
00000a10  0d 20 20 47 73 72 65 61  64 20 69 73 20 75 73 65  |.  Gsread is use|
00000a20  64 20 74 6f 20 72 65 61  64 20 65 61 63 68 20 62  |d to read each b|
00000a30  79 74 65 20 6f 66 20 74  68 65 20 61 72 67 75 6d  |yte of the argum|
00000a40  65 6e 74 2e 20 54 68 69  73 20 72 6f 75 74 69 6e  |ent. This routin|
00000a50  65 0d 73 68 6f 75 6c 64  20 6f 6e 6c 79 20 62 65  |e.should only be|
00000a60  20 75 73 65 64 20 66 6f  6c 6c 6f 77 69 6e 67 20  | used following |
00000a70  61 20 47 73 69 6e 69 74  20 63 61 6c 6c 20 6f 72  |a Gsinit call or|
00000a80  20 61 20 70 72 65 76 69  6f 75 73 20 47 73 72 65  | a previous Gsre|
00000a90  61 64 2e 0d 46 6f 6c 6c  6f 77 69 6e 67 20 47 73  |ad..Following Gs|
00000aa0  69 6e 69 74 20 74 68 65  20 74 65 78 74 20 70 6f  |init the text po|
00000ab0  69 6e 74 65 72 73 20 61  6e 64 20 59 20 72 65 67  |inters and Y reg|
00000ac0  69 73 74 65 72 20 77 69  6c 6c 20 70 6f 69 6e 74  |ister will point|
00000ad0  20 74 6f 20 74 68 65 0d  66 69 72 73 74 20 62 79  | to the.first by|
00000ae0  74 65 20 6f 66 20 74 68  65 20 61 72 67 75 6d 65  |te of the argume|
00000af0  6e 74 2e 20 41 66 74 65  72 20 63 61 6c 6c 69 6e  |nt. After callin|
00000b00  67 20 47 73 72 65 61 64  20 74 68 65 20 61 63 63  |g Gsread the acc|
00000b10  75 6d 75 6c 61 74 6f 72  0d 63 6f 6e 74 61 69 6e  |umulator.contain|
00000b20  73 20 74 68 65 20 63 68  61 72 61 63 74 65 72 20  |s the character |
00000b30  72 65 61 64 20 66 72 6f  6d 20 74 68 65 20 61 72  |read from the ar|
00000b40  67 75 6d 65 6e 74 2c 20  59 20 69 73 20 69 6e 63  |gument, Y is inc|
00000b50  72 65 6d 65 6e 74 65 64  20 74 6f 0d 70 6f 69 6e  |remented to.poin|
00000b60  74 20 74 6f 20 74 68 65  20 6e 65 78 74 20 63 68  |t to the next ch|
00000b70  61 72 61 63 74 65 72 2c  20 58 20 69 73 20 70 72  |aracter, X is pr|
00000b80  65 73 65 72 76 65 64 20  61 6e 64 20 74 68 65 20  |eserved and the |
00000b90  63 61 72 72 79 20 66 6c  61 67 20 69 73 20 73 65  |carry flag is se|
00000ba0  74 0d 69 66 20 74 68 65  20 74 65 72 6d 69 6e 61  |t.if the termina|
00000bb0  74 69 6e 67 20 63 68 61  72 61 63 74 65 72 20 68  |ting character h|
00000bc0  61 73 20 62 65 65 6e 20  72 65 61 64 2e 0d 0d 20  |as been read... |
00000bd0  20 54 68 65 20 65 66 66  65 63 74 20 6f 66 20 63  | The effect of c|
00000be0  61 6c 6c 69 6e 67 20 47  73 72 65 61 64 20 69 73  |alling Gsread is|
00000bf0  20 73 69 6d 69 6c 61 72  20 74 6f 2c 20 62 75 74  | similar to, but|
00000c00  20 6e 6f 74 20 74 68 65  20 73 61 6d 65 20 61 73  | not the same as|
00000c10  3a 0d 0d 20 20 4c 44 41  20 28 26 46 32 29 2c 59  |:..  LDA (&F2),Y|
00000c20  0d 20 20 49 4e 59 0d 0d  20 20 54 68 65 20 64 69  |.  INY..  The di|
00000c30  66 66 65 72 65 6e 63 65  20 65 78 69 73 74 73 20  |fference exists |
00000c40  62 65 63 61 75 73 65 20  47 73 72 65 61 64 20 74  |because Gsread t|
00000c50  65 73 74 73 20 74 68 65  20 63 6f 6e 74 65 6e 74  |ests the content|
00000c60  20 6f 66 20 41 20 74 6f  20 73 65 65 0d 69 66 20  | of A to see.if |
00000c70  74 68 65 20 74 65 72 6d  69 6e 61 74 69 6e 67 20  |the terminating |
00000c80  63 68 61 72 61 63 74 65  72 2c 20 61 6e 64 20 68  |character, and h|
00000c90  65 6e 63 65 20 74 68 65  20 65 6e 64 20 6f 66 20  |ence the end of |
00000ca0  74 68 65 20 61 72 67 75  6d 65 6e 74 2c 20 68 61  |the argument, ha|
00000cb0  73 0d 62 65 65 6e 20 72  65 61 64 2e 20 54 68 65  |s.been read. The|
00000cc0  20 74 65 72 6d 69 6e 61  74 69 6e 67 20 63 68 61  | terminating cha|
00000cd0  72 61 63 74 65 72 20 63  61 6e 20 62 65 20 65 69  |racter can be ei|
00000ce0  74 68 65 72 20 61 20 73  65 63 6f 6e 64 20 71 75  |ther a second qu|
00000cf0  6f 74 61 74 69 6f 6e 0d  6d 61 72 6b 2c 20 61 20  |otation.mark, a |
00000d00  73 70 61 63 65 20 6f 72  20 61 20 63 61 72 72 69  |space or a carri|
00000d10  61 67 65 20 72 65 74 75  72 6e 20 61 73 20 64 65  |age return as de|
00000d20  66 69 6e 65 64 20 62 79  20 47 73 69 6e 69 74 2e  |fined by Gsinit.|
00000d30  20 55 73 69 6e 67 20 47  73 69 6e 69 74 0d 74 6f  | Using Gsinit.to|
00000d40  20 69 6e 69 74 69 61 6c  69 73 65 20 61 6e 20 61  | initialise an a|
00000d50  72 67 75 6d 65 6e 74 20  61 6e 64 20 47 73 72 65  |rgument and Gsre|
00000d60  61 64 20 74 6f 20 72 65  61 64 20 69 74 20 69 73  |ad to read it is|
00000d70  20 6d 6f 72 65 20 76 65  72 73 61 74 69 6c 65 20  | more versatile |
00000d80  74 68 61 6e 0d 73 69 6d  70 6c 79 20 72 65 61 64  |than.simply read|
00000d90  69 6e 67 20 74 68 65 20  61 72 67 75 6d 65 6e 74  |ing the argument|
00000da0  20 75 73 69 6e 67 20 70  6f 73 74 2d 69 6e 64 65  | using post-inde|
00000db0  78 65 64 20 69 6e 64 69  72 65 63 74 20 61 64 64  |xed indirect add|
00000dc0  72 65 73 73 69 6e 67 0d  77 69 74 68 20 74 68 65  |ressing.with the|
00000dd0  20 74 65 78 74 20 70 6f  69 6e 74 65 72 73 2e 20  | text pointers. |
00000de0  54 68 65 20 64 69 66 66  65 72 65 6e 63 65 20 6d  |The difference m|
00000df0  61 79 20 73 65 65 6d 20  69 6e 73 69 67 6e 69 66  |ay seem insignif|
00000e00  69 63 61 6e 74 20 77 69  74 68 20 74 68 65 0d 73  |icant with the.s|
00000e10  69 6d 70 6c 65 20 65 78  61 6d 70 6c 65 20 75 73  |imple example us|
00000e20  65 64 20 61 62 6f 76 65  20 62 75 74 20 69 74 20  |ed above but it |
00000e30  69 73 20 75 73 65 66 75  6c 20 69 66 20 74 68 65  |is useful if the|
00000e40  20 61 72 67 75 6d 65 6e  74 20 69 73 20 61 20 6e  | argument is a n|
00000e50  75 6d 62 65 72 0d 77 68  65 6e 20 74 68 65 20 70  |umber.when the p|
00000e60  6c 61 63 65 20 76 61 6c  75 65 20 6f 66 20 61 20  |lace value of a |
00000e70  70 61 72 74 69 63 75 6c  61 72 20 63 68 61 72 61  |particular chara|
00000e80  63 74 65 72 20 64 65 70  65 6e 64 73 20 6f 6e 20  |cter depends on |
00000e90  69 74 73 0d 64 69 73 70  6c 61 63 65 6d 65 6e 74  |its.displacement|
00000ea0  20 66 72 6f 6d 20 74 68  65 20 74 65 72 6d 69 6e  | from the termin|
00000eb0  61 74 69 6e 67 20 63 68  61 72 61 63 74 65 72 2e  |ating character.|
00000ec0  20 52 65 61 64 69 6e 67  20 6e 75 6d 65 72 69 63  | Reading numeric|
00000ed0  61 6c 0d 61 72 67 75 6d  65 6e 74 73 20 77 69 6c  |al.arguments wil|
00000ee0  6c 20 62 65 20 63 6f 76  65 72 65 64 20 69 6e 20  |l be covered in |
00000ef0  6d 6f 64 75 6c 65 20 31  31 2e 0d 0d 20 20 42 65  |module 11...  Be|
00000f00  63 61 75 73 65 20 74 68  65 20 65 66 66 65 63 74  |cause the effect|
00000f10  20 6f 66 20 75 73 69 6e  67 20 47 73 72 65 61 64  | of using Gsread|
00000f20  20 69 73 20 76 65 72 79  20 73 69 6d 69 6c 61 72  | is very similar|
00000f30  20 74 6f 20 72 65 61 64  69 6e 67 20 61 0d 73 74  | to reading a.st|
00000f40  72 69 6e 67 20 75 73 69  6e 67 20 70 6f 73 74 2d  |ring using post-|
00000f50  69 6e 64 65 78 65 64 20  69 6e 64 69 72 65 63 74  |indexed indirect|
00000f60  20 61 64 64 72 65 73 73  69 6e 67 20 77 69 74 68  | addressing with|
00000f70  20 74 68 65 20 74 65 78  74 20 70 6f 69 6e 74 65  | the text pointe|
00000f80  72 73 0d 79 6f 75 20 6d  61 79 20 62 65 20 74 65  |rs.you may be te|
00000f90  6d 70 74 65 64 20 74 6f  20 75 73 65 20 47 73 72  |mpted to use Gsr|
00000fa0  65 61 64 20 69 6e 20 74  68 65 20 69 6e 74 65 72  |ead in the inter|
00000fb0  70 72 65 74 65 72 20 74  6f 20 72 65 61 64 20 74  |preter to read t|
00000fc0  68 65 0d 75 6e 72 65 63  6f 67 6e 69 73 65 64 20  |he.unrecognised |
00000fd0  63 6f 6d 6d 61 6e 64 2e  20 49 66 20 79 6f 75 20  |command. If you |
00000fe0  64 6f 20 79 6f 75 20 77  69 6c 6c 20 66 69 6e 64  |do you will find|
00000ff0  20 74 68 61 74 20 6d 6f  73 74 20 6f 66 20 74 68  | that most of th|
00001000  65 20 74 69 6d 65 20 69  74 0d 77 69 6c 6c 20 77  |e time it.will w|
00001010  6f 72 6b 20 62 75 74 2c  20 73 6f 6f 6e 65 72 20  |ork but, sooner |
00001020  6f 72 20 6c 61 74 65 72  2c 20 79 6f 75 20 77 69  |or later, you wi|
00001030  6c 6c 20 73 74 61 72 74  20 67 65 74 74 69 6e 67  |ll start getting|
00001040  20 6d 79 73 74 65 72 69  6f 75 73 20 22 62 61 64  | mysterious "bad|
00001050  0d 73 74 72 69 6e 67 22  20 65 72 72 6f 72 20 6d  |.string" error m|
00001060  65 73 73 61 67 65 73 2e  20 44 6f 6e 27 74 20 62  |essages. Don't b|
00001070  65 20 74 65 6d 70 74 65  64 20 69 6e 74 6f 20 77  |e tempted into w|
00001080  61 73 74 69 6e 67 20 79  6f 75 72 20 74 69 6d 65  |asting your time|
00001090  20 75 73 69 6e 67 0d 47  73 72 65 61 64 20 69 6e  | using.Gsread in|
000010a0  20 74 68 65 20 69 6e 74  65 72 70 72 65 74 65 72  | the interpreter|
000010b0  2e 20 53 74 69 63 6b 20  77 69 74 68 20 74 68 65  |. Stick with the|
000010c0  20 6d 65 74 68 6f 64 20  64 65 6d 6f 6e 73 74 72  | method demonstr|
000010d0  61 74 65 64 20 69 6e 0d  4d 6f 64 75 6c 65 20 33  |ated in.Module 3|
000010e0  2e 0d 0d 20 20 46 69 67  75 72 65 20 35 2e 32 20  |...  Figure 5.2 |
000010f0  73 68 6f 77 73 20 68 6f  77 20 74 68 65 20 69 6e  |shows how the in|
00001100  74 65 72 70 72 65 74 65  72 20 75 73 65 64 20 69  |terpreter used i|
00001110  6e 20 74 68 65 20 6c 61  73 74 20 74 77 6f 20 6d  |n the last two m|
00001120  6f 64 75 6c 65 73 0d 63  61 6e 20 62 65 20 6d 6f  |odules.can be mo|
00001130  64 69 66 69 65 64 20 74  6f 20 72 65 61 64 20 61  |dified to read a|
00001140  6e 20 61 72 67 75 6d 65  6e 74 2e 0d 0d 0d 0d 0d  |n argument......|
00001150  0d 2e 66 6f 75 6e 64 0d  20 20 20 20 20 20 20 20  |..found.        |
00001160  20 53 45 43 20 20 20 20  20 20 20 20 20 20 20 5c  | SEC           \|
00001170  20 74 65 72 6d 69 6e 61  74 65 20 77 69 74 68 20  | terminate with |
00001180  52 65 74 75 72 6e 20 6f  72 20 22 0d 20 20 20 20  |Return or ".    |
00001190  20 20 20 20 20 4a 53 52  20 26 46 46 43 32 20 20  |     JSR &FFC2  |
000011a0  20 20 20 5c 20 69 6e 69  74 69 61 6c 69 73 65 20  |   \ initialise |
000011b0  61 72 67 75 6d 65 6e 74  20 77 69 74 68 20 47 73  |argument with Gs|
000011c0  69 6e 69 74 0d 20 20 20  20 20 20 20 20 20 42 45  |init.         BE|
000011d0  51 20 65 78 69 74 20 20  20 20 20 20 5c 20 62 72  |Q exit      \ br|
000011e0  61 6e 63 68 20 69 66 20  6e 75 6c 6c 20 61 72 67  |anch if null arg|
000011f0  75 6d 65 6e 74 0d 20 20  20 20 20 20 20 20 20 4a  |ument.         J|
00001200  53 52 20 26 46 46 43 35  20 20 20 20 20 5c 20 72  |SR &FFC5     \ r|
00001210  65 61 64 20 66 69 72 73  74 20 63 68 61 72 61 63  |ead first charac|
00001220  74 65 72 20 77 69 74 68  20 47 73 72 65 61 64 0d  |ter with Gsread.|
00001230  20 20 20 20 20 20 20 20  20 42 43 53 20 65 78 69  |         BCS exi|
00001240  74 20 20 20 20 20 20 5c  20 62 72 61 6e 63 68 20  |t      \ branch |
00001250  69 66 20 65 6e 64 20 6f  66 20 61 72 67 75 6d 65  |if end of argume|
00001260  6e 74 0d 20 20 20 20 20  20 20 20 20 41 4e 44 20  |nt.         AND |
00001270  23 26 44 46 20 20 20 20  20 20 5c 20 66 6f 72 63  |#&DF      \ forc|
00001280  65 20 75 70 70 65 72 20  63 61 73 65 0d 20 20 20  |e upper case.   |
00001290  20 20 20 20 20 20 20 2e  0d 20 20 20 20 20 20 20  |       ..       |
000012a0  20 20 20 2e 0d 20 20 20  20 20 20 20 20 20 20 2e  |   ..          .|
000012b0  0d 2e 65 78 69 74 0d 20  20 20 20 20 20 20 20 20  |..exit.         |
000012c0  50 4c 41 20 20 20 20 20  20 20 20 20 20 20 5c 20  |PLA           \ |
000012d0  64 69 73 63 61 72 64 20  59 0d 20 20 20 20 20 20  |discard Y.      |
000012e0  20 20 20 50 4c 41 20 20  20 20 20 20 20 20 20 20  |   PLA          |
000012f0  20 5c 20 64 69 73 63 61  72 64 20 58 0d 20 20 20  | \ discard X.   |
00001300  20 20 20 20 20 20 50 4c  41 20 20 20 20 20 20 20  |      PLA       |
00001310  20 20 20 20 5c 20 64 69  73 63 61 72 64 20 41 0d  |    \ discard A.|
00001320  20 20 20 20 20 20 20 20  20 4c 44 41 20 23 30 20  |         LDA #0 |
00001330  20 20 20 20 20 20 20 5c  20 73 65 72 76 69 63 65  |       \ service|
00001340  20 63 61 6c 6c 20 72 65  63 6f 67 6e 69 73 65 64  | call recognised|
00001350  0d 20 20 20 20 20 20 20  20 20 52 54 53 20 20 20  |.         RTS   |
00001360  20 20 20 20 20 20 20 20  5c 20 72 65 74 75 72 6e  |        \ return|
00001370  20 74 6f 20 4d 4f 53 0d  0d 46 69 67 75 72 65 20  | to MOS..Figure |
00001380  35 2e 32 20 55 73 69 6e  67 20 47 73 69 6e 69 74  |5.2 Using Gsinit|
00001390  20 61 6e 64 20 47 73 72  65 61 64 20 74 6f 20 72  | and Gsread to r|
000013a0  65 61 64 20 61 6e 20 61  72 67 75 6d 65 6e 74 2e  |ead an argument.|
000013b0  0d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |.---------------|
000013c0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
000013e0  2d 2d 2d 2d 2d 2d 2d 2d  0d 0d 0d 0d 0d 20 20 54  |--------.....  T|
000013f0  68 65 20 63 61 72 72 79  20 66 6c 61 67 20 69 73  |he carry flag is|
00001400  20 73 65 74 20 62 65 66  6f 72 65 20 63 61 6c 6c  | set before call|
00001410  69 6e 67 20 47 73 69 6e  69 74 2e 20 54 68 65 20  |ing Gsinit. The |
00001420  74 65 72 6d 69 6e 61 74  69 6e 67 0d 63 68 61 72  |terminating.char|
00001430  61 63 74 65 72 20 6f 66  20 74 68 65 20 61 72 67  |acter of the arg|
00001440  75 6d 65 6e 74 20 77 69  6c 6c 20 62 65 20 61 20  |ument will be a |
00001450  63 61 72 72 69 61 67 65  20 72 65 74 75 72 6e 20  |carriage return |
00001460  6f 72 20 61 20 73 65 63  6f 6e 64 0d 71 75 6f 74  |or a second.quot|
00001470  61 74 69 6f 6e 20 6d 61  72 6b 2e 20 41 66 74 65  |ation mark. Afte|
00001480  72 20 73 65 74 74 69 6e  67 20 74 68 65 20 63 61  |r setting the ca|
00001490  72 72 79 20 66 6c 61 67  20 47 73 69 6e 69 74 20  |rry flag Gsinit |
000014a0  69 73 20 63 61 6c 6c 65  64 20 74 6f 0d 69 6e 69  |is called to.ini|
000014b0  74 69 61 6c 69 73 65 20  74 68 65 20 61 72 67 75  |tialise the argu|
000014c0  6d 65 6e 74 2e 20 49 66  20 74 68 65 20 61 72 67  |ment. If the arg|
000014d0  75 6d 65 6e 74 20 69 73  20 6e 75 6c 6c 20 47 73  |ument is null Gs|
000014e0  69 6e 69 74 20 72 65 74  75 72 6e 73 20 77 69 74  |init returns wit|
000014f0  68 0d 74 68 65 20 7a 65  72 6f 20 66 6c 61 67 20  |h.the zero flag |
00001500  73 65 74 2e 20 54 68 69  73 20 63 61 6e 20 62 65  |set. This can be|
00001510  20 74 65 73 74 65 64 20  61 6e 64 20 62 72 61 6e  | tested and bran|
00001520  63 68 20 74 6f 20 65 78  69 74 20 69 66 20 74 68  |ch to exit if th|
00001530  65 72 65 20 69 73 0d 6e  6f 74 68 69 6e 67 20 74  |ere is.nothing t|
00001540  6f 20 72 65 61 64 2e 20  49 66 20 74 68 65 20 7a  |o read. If the z|
00001550  65 72 6f 20 66 6c 61 67  20 69 73 20 63 6c 65 61  |ero flag is clea|
00001560  72 20 74 68 65 72 65 20  69 73 20 61 6e 20 61 72  |r there is an ar|
00001570  67 75 6d 65 6e 74 20 74  6f 20 62 65 0d 72 65 61  |gument to be.rea|
00001580  64 20 62 79 20 63 61 6c  6c 69 6e 67 20 47 73 72  |d by calling Gsr|
00001590  65 61 64 20 66 6f 72 20  65 61 63 68 20 63 68 61  |ead for each cha|
000015a0  72 61 63 74 65 72 2e 20  47 73 72 65 61 64 20 77  |racter. Gsread w|
000015b0  69 6c 6c 20 72 65 74 75  72 6e 20 77 69 74 68 20  |ill return with |
000015c0  74 68 65 0d 63 61 72 72  79 20 66 6c 61 67 20 73  |the.carry flag s|
000015d0  65 74 20 77 68 65 6e 20  74 68 65 20 74 65 72 6d  |et when the term|
000015e0  69 6e 61 74 69 6e 67 20  63 68 61 72 61 63 74 65  |inating characte|
000015f0  72 20 69 73 20 72 65 61  64 20 61 6e 64 20 61 6e  |r is read and an|
00001600  0d 61 70 70 72 6f 70 72  69 61 74 65 20 62 72 61  |.appropriate bra|
00001610  6e 63 68 20 63 61 6e 20  62 65 20 6d 61 64 65 20  |nch can be made |
00001620  61 66 74 65 72 20 74 65  73 74 69 6e 67 20 74 68  |after testing th|
00001630  65 20 63 61 72 72 79 20  66 6c 61 67 2e 0d 0d 20  |e carry flag... |
00001640  20 54 68 69 73 20 6d 65  74 68 6f 64 20 6f 66 20  | This method of |
00001650  72 65 61 64 69 6e 67 20  61 6e 20 61 72 67 75 6d  |reading an argum|
00001660  65 6e 74 20 68 61 73 20  62 65 65 6e 20 75 73 65  |ent has been use|
00001670  64 20 69 6e 20 74 68 65  20 70 72 6f 67 72 61 6e  |d in the progran|
00001680  0d 43 55 52 53 4f 52 2e  20 57 68 65 6e 20 74 68  |.CURSOR. When th|
00001690  65 20 69 6e 74 65 72 70  72 65 74 65 72 20 28 6c  |e interpreter (l|
000016a0  69 6e 65 73 20 32 38 30  2d 35 34 30 29 20 72 65  |ines 280-540) re|
000016b0  63 6f 67 6e 69 73 65 73  20 74 68 65 20 63 6f 6d  |cognises the com|
000016c0  6d 61 6e 64 0d 2a 43 55  52 53 4f 52 20 69 74 20  |mand.*CURSOR it |
000016d0  70 61 73 73 65 73 20 63  6f 6e 74 72 6f 6c 20 74  |passes control t|
000016e0  6f 20 74 68 65 20 6c 61  62 65 6c 20 22 2e 66 6f  |o the label ".fo|
000016f0  75 6e 64 22 20 28 6c 69  6e 65 20 35 35 30 29 2e  |und" (line 550).|
00001700  20 54 68 65 0d 61 72 67  75 6d 65 6e 74 20 69 73  | The.argument is|
00001710  20 69 6e 69 74 69 61 6c  69 73 65 64 20 28 6c 69  | initialised (li|
00001720  6e 65 73 20 35 36 30 2d  35 37 30 29 20 61 6e 64  |nes 560-570) and|
00001730  20 74 68 65 20 61 72 67  75 6d 65 6e 74 20 69 73  | the argument is|
00001740  20 74 65 73 74 65 64 0d  28 6c 69 6e 65 20 35 38  | tested.(line 58|
00001750  30 29 2e 20 49 66 20 61  20 6e 75 6c 6c 20 61 72  |0). If a null ar|
00001760  67 75 6d 65 6e 74 20 69  73 20 64 65 74 65 63 74  |gument is detect|
00001770  65 64 20 74 68 65 20 70  72 6f 67 72 61 6d 20 72  |ed the program r|
00001780  65 74 75 72 6e 73 20 63  6f 6e 74 72 6f 6c 0d 74  |eturns control.t|
00001790  6f 20 74 68 65 20 4d 4f  53 20 77 69 74 68 20 41  |o the MOS with A|
000017a0  3d 30 20 28 6c 69 6e 65  73 20 38 36 30 2d 39 31  |=0 (lines 860-91|
000017b0  30 29 2e 20 49 66 20 61  6e 20 61 72 67 75 6d 65  |0). If an argume|
000017c0  6e 74 20 69 73 20 66 6f  75 6e 64 20 74 68 65 0d  |nt is found the.|
000017d0  70 72 6f 67 72 61 6d 20  65 78 70 65 63 74 73 20  |program expects |
000017e0  74 6f 20 72 65 61 64 20  65 69 74 68 65 72 20 4f  |to read either O|
000017f0  4e 20 6f 72 20 4f 46 46  2e 20 54 6f 20 74 65 73  |N or OFF. To tes|
00001800  74 20 66 6f 72 20 4f 4e  20 6f 72 20 4f 46 46 20  |t for ON or OFF |
00001810  74 68 65 0d 66 69 72 73  74 20 63 68 61 72 61 63  |the.first charac|
00001820  74 65 72 20 63 61 6e 20  62 65 20 73 6b 69 70 70  |ter can be skipp|
00001830  65 64 20 73 69 6e 63 65  20 69 74 20 73 68 6f 75  |ed since it shou|
00001840  6c 64 20 62 65 20 61 6e  20 22 4f 22 20 28 6c 69  |ld be an "O" (li|
00001850  6e 65 20 35 39 30 29 2e  0d 54 68 65 20 6e 65 78  |ne 590)..The nex|
00001860  74 20 63 68 61 72 61 63  74 65 72 20 69 73 20 72  |t character is r|
00001870  65 61 64 20 75 73 69 6e  67 20 47 73 72 65 61 64  |ead using Gsread|
00001880  20 28 6c 69 6e 65 20 36  30 30 29 20 61 6e 64 20  | (line 600) and |
00001890  74 65 73 74 65 64 20 66  6f 72 20 61 0d 74 65 72  |tested for a.ter|
000018a0  6d 69 6e 61 74 69 6e 67  20 63 68 61 72 61 63 74  |minating charact|
000018b0  65 72 20 28 6c 69 6e 65  20 36 31 30 29 20 61 6e  |er (line 610) an|
000018c0  64 20 65 69 74 68 65 72  20 22 46 22 20 28 6c 69  |d either "F" (li|
000018d0  6e 65 20 36 33 30 29 20  6f 72 20 22 4e 22 0d 28  |ne 630) or "N".(|
000018e0  6c 69 6e 65 20 36 35 30  29 2e 20 54 68 65 72 65  |line 650). There|
000018f0  20 69 73 20 6e 6f 20 6e  65 65 64 20 74 6f 20 72  | is no need to r|
00001900  65 61 64 20 61 6e 64 20  74 65 73 74 20 66 6f 72  |ead and test for|
00001910  20 74 68 65 20 73 65 63  6f 6e 64 20 46 20 6f 66  | the second F of|
00001920  20 4f 46 46 2e 0d 49 66  20 74 68 65 20 73 65 63  | OFF..If the sec|
00001930  6f 6e 64 20 63 68 61 72  61 63 74 65 72 20 6f 66  |ond character of|
00001940  20 74 68 65 20 61 72 67  75 6d 65 6e 74 20 69 73  | the argument is|
00001950  20 22 46 22 20 74 68 65  20 63 75 72 73 6f 72 20  | "F" the cursor |
00001960  69 73 20 73 77 69 74 63  68 65 64 0d 6f 66 66 20  |is switched.off |
00001970  28 6c 69 6e 65 73 20 36  39 30 2d 38 35 30 29 2c  |(lines 690-850),|
00001980  20 69 66 20 69 74 20 69  73 20 22 4e 22 20 74 68  | if it is "N" th|
00001990  65 20 63 75 72 73 6f 72  20 69 73 20 73 77 69 74  |e cursor is swit|
000019a0  63 68 65 64 20 6f 6e 20  28 6c 69 6e 65 73 0d 36  |ched on (lines.6|
000019b0  37 30 2d 38 35 30 29 2e  0d 0d 20 20 57 68 65 6e  |70-850)...  When|
000019c0  20 79 6f 75 20 6c 6f 61  64 20 74 68 65 20 6f 62  | you load the ob|
000019d0  6a 65 63 74 20 63 6f 64  65 20 67 65 6e 65 72 61  |ject code genera|
000019e0  74 65 64 20 62 79 20 43  55 52 53 4f 52 20 69 6e  |ted by CURSOR in|
000019f0  74 6f 20 53 57 52 20 74  6f 20 73 65 65 0d 68 6f  |to SWR to see.ho|
00001a00  77 20 69 74 20 77 6f 72  6b 73 20 69 74 20 69 73  |w it works it is|
00001a10  20 70 6f 73 73 69 62 6c  65 20 74 6f 20 64 65 63  | possible to dec|
00001a20  65 69 76 65 20 79 6f 75  72 73 65 6c 66 20 69 6e  |eive yourself in|
00001a30  74 6f 20 62 65 6c 69 65  76 69 6e 67 20 74 68 61  |to believing tha|
00001a40  74 0d 74 68 65 72 65 20  69 73 20 73 6f 6d 65 74  |t.there is somet|
00001a50  68 69 6e 67 20 77 72 6f  6e 67 20 77 69 74 68 20  |hing wrong with |
00001a60  69 74 2e 20 49 66 20 79  6f 75 20 74 79 70 65 20  |it. If you type |
00001a70  2a 43 55 52 53 4f 52 20  4f 46 46 20 61 6e 64 20  |*CURSOR OFF and |
00001a80  70 72 65 73 73 0d 52 65  74 75 72 6e 20 74 68 65  |press.Return the|
00001a90  20 63 75 72 73 6f 72 20  77 69 6c 6c 20 67 6f 20  | cursor will go |
00001aa0  6f 66 66 20 61 73 20 65  78 70 65 63 74 65 64 2e  |off as expected.|
00001ab0  20 54 79 70 65 20 2a 43  55 52 53 4f 52 20 4f 4e  | Type *CURSOR ON|
00001ac0  20 61 6e 64 20 69 74 20  77 69 6c 6c 0d 63 6f 6d  | and it will.com|
00001ad0  65 20 62 61 63 6b 20 6f  6e 2e 20 45 76 65 72 79  |e back on. Every|
00001ae0  74 68 69 6e 67 20 73 65  65 6d 73 20 4f 4b 2e 20  |thing seems OK. |
00001af0  54 79 70 65 20 2a 43 55  52 53 4f 52 20 4f 46 46  |Type *CURSOR OFF|
00001b00  20 61 6e 64 20 52 65 74  75 72 6e 20 61 6e 64 0d  | and Return and.|
00001b10  74 68 65 6e 20 74 79 70  65 20 2a 43 55 52 53 4f  |then type *CURSO|
00001b20  52 20 61 6e 64 20 52 65  74 75 72 6e 2e 20 54 68  |R and Return. Th|
00001b30  65 20 63 75 72 73 6f 72  20 73 74 61 79 73 20 6f  |e cursor stays o|
00001b40  66 66 20 62 65 63 61 75  73 65 20 79 6f 75 20 68  |ff because you h|
00001b50  61 76 65 0d 6e 6f 74 20  74 79 70 65 64 20 61 6e  |ave.not typed an|
00001b60  20 61 72 67 75 6d 65 6e  74 2e 20 45 76 65 72 79  | argument. Every|
00001b70  74 68 69 6e 67 20 69 73  20 73 74 69 6c 6c 20 4f  |thing is still O|
00001b80  4b 2e 20 4e 6f 77 20 75  73 65 20 74 68 65 20 63  |K. Now use the c|
00001b90  75 72 73 6f 72 20 6b 65  79 73 0d 74 6f 20 63 6f  |ursor keys.to co|
00001ba0  70 79 20 74 68 65 20 2a  43 55 52 53 4f 52 20 63  |py the *CURSOR c|
00001bb0  6f 6d 6d 61 6e 64 20 77  69 74 68 6f 75 74 20 61  |ommand without a|
00001bc0  6e 20 61 72 67 75 6d 65  6e 74 20 61 6e 64 20 70  |n argument and p|
00001bd0  72 65 73 73 20 52 65 74  75 72 6e 2e 20 54 68 65  |ress Return. The|
00001be0  0d 63 75 72 73 6f 72 20  63 6f 6d 65 73 20 62 61  |.cursor comes ba|
00001bf0  63 6b 20 6f 6e 20 77 68  65 6e 20 69 74 20 73 68  |ck on when it sh|
00001c00  6f 75 6c 64 20 68 61 76  65 20 73 74 61 79 65 64  |ould have stayed|
00001c10  20 6f 66 66 2e 20 54 68  69 73 20 77 69 6c 6c 20  | off. This will |
00001c20  68 61 70 70 65 6e 0d 62  65 63 61 75 73 65 20 79  |happen.because y|
00001c30  6f 75 20 77 69 6c 6c 20  72 65 2d 65 6e 61 62 6c  |ou will re-enabl|
00001c40  65 20 74 68 65 20 63 75  72 73 6f 72 20 77 69 74  |e the cursor wit|
00001c50  68 20 74 68 65 20 63 75  72 73 6f 72 20 6b 65 79  |h the cursor key|
00001c60  73 2e 20 54 68 65 72 65  20 69 73 0d 6e 6f 74 68  |s. There is.noth|
00001c70  69 6e 67 20 77 72 6f 6e  67 20 77 69 74 68 20 74  |ing wrong with t|
00001c80  68 65 20 61 72 67 75 6d  65 6e 74 20 72 65 61 64  |he argument read|
00001c90  69 6e 67 20 74 65 63 68  6e 69 71 75 65 20 64 65  |ing technique de|
00001ca0  6d 6f 6e 73 74 72 61 74  65 64 20 69 6e 20 74 68  |monstrated in th|
00001cb0  65 0d 70 72 6f 67 72 61  6d 2e 0d 0d 0d 0d 0d 0d  |e.program.......|
00001cc0  20 20 20 31 30 20 52 45  4d 3a 20 43 55 52 53 4f  |   10 REM: CURSO|
00001cd0  52 0d 20 20 20 32 30 20  4d 4f 44 45 37 0d 20 20  |R.   20 MODE7.  |
00001ce0  20 33 30 20 48 49 4d 45  4d 3d 26 33 43 30 30 0d  | 30 HIMEM=&3C00.|
00001cf0  20 20 20 34 30 20 44 49  4d 20 73 61 76 65 20 35  |   40 DIM save 5|
00001d00  30 0d 20 20 20 35 30 20  64 69 66 66 3d 26 38 30  |0.   50 diff=&80|
00001d10  30 30 2d 48 49 4d 45 4d  0d 20 20 20 36 30 20 63  |00-HIMEM.   60 c|
00001d20  6f 6d 76 65 63 3d 26 46  32 0d 20 20 20 37 30 20  |omvec=&F2.   70 |
00001d30  67 73 69 6e 69 74 3d 26  46 46 43 32 0d 20 20 20  |gsinit=&FFC2.   |
00001d40  38 30 20 67 73 72 65 61  64 3d 26 46 46 43 35 0d  |80 gsread=&FFC5.|
00001d50  20 20 20 39 30 20 6f 73  61 73 63 69 3d 26 46 46  |   90 osasci=&FF|
00001d60  45 33 0d 20 20 31 30 30  20 6f 73 63 6c 69 3d 26  |E3.  100 oscli=&|
00001d70  46 46 46 37 0d 20 20 31  31 30 20 46 4f 52 20 70  |FFF7.  110 FOR p|
00001d80  61 73 73 20 3d 20 30 20  54 4f 20 32 20 53 54 45  |ass = 0 TO 2 STE|
00001d90  50 20 32 0d 20 20 31 32  30 20 50 25 3d 48 49 4d  |P 2.  120 P%=HIM|
00001da0  45 4d 0d 20 20 31 33 30  20 5b 20 20 20 20 20 20  |EM.  130 [      |
00001db0  20 4f 50 54 20 70 61 73  73 0d 20 20 31 34 30 20  | OPT pass.  140 |
00001dc0  20 20 20 20 20 20 20 20  42 52 4b 0d 20 20 31 35  |        BRK.  15|
00001dd0  30 20 20 20 20 20 20 20  20 20 42 52 4b 0d 20 20  |0         BRK.  |
00001de0  31 36 30 20 20 20 20 20  20 20 20 20 42 52 4b 0d  |160         BRK.|
00001df0  20 20 31 37 30 20 20 20  20 20 20 20 20 20 4a 4d  |  170         JM|
00001e00  50 20 73 65 72 76 69 63  65 2b 64 69 66 66 0d 20  |P service+diff. |
00001e10  20 31 38 30 20 20 20 20  20 20 20 20 20 4f 50 54  | 180         OPT|
00001e20  20 46 4e 65 71 75 62 28  26 38 32 29 0d 20 20 31  | FNequb(&82).  1|
00001e30  39 30 20 20 20 20 20 20  20 20 20 4f 50 54 20 46  |90         OPT F|
00001e40  4e 65 71 75 62 28 28 63  6f 70 79 72 69 67 68 74  |Nequb((copyright|
00001e50  2b 64 69 66 66 29 20 4d  4f 44 20 32 35 36 29 0d  |+diff) MOD 256).|
00001e60  20 20 32 30 30 20 20 20  20 20 20 20 20 20 42 52  |  200         BR|
00001e70  4b 0d 20 20 32 31 30 20  2e 74 69 74 6c 65 0d 20  |K.  210 .title. |
00001e80  20 32 32 30 20 20 20 20  20 20 20 20 20 4f 50 54  | 220         OPT|
00001e90  20 46 4e 65 71 75 73 28  22 43 55 52 53 4f 52 22  | FNequs("CURSOR"|
00001ea0  29 0d 20 20 32 33 30 20  2e 63 6f 70 79 72 69 67  |).  230 .copyrig|
00001eb0  68 74 0d 20 20 32 34 30  20 20 20 20 20 20 20 20  |ht.  240        |
00001ec0  20 42 52 4b 0d 20 20 32  35 30 20 20 20 20 20 20  | BRK.  250      |
00001ed0  20 20 20 4f 50 54 20 46  4e 65 71 75 73 28 22 28  |   OPT FNequs("(|
00001ee0  43 29 20 47 6f 72 64 6f  6e 20 48 6f 72 73 69 6e  |C) Gordon Horsin|
00001ef0  67 74 6f 6e 20 31 39 38  37 22 29 0d 20 20 32 36  |gton 1987").  26|
00001f00  30 20 20 20 20 20 20 20  20 20 42 52 4b 0d 20 20  |0         BRK.  |
00001f10  32 37 30 20 2e 73 65 72  76 69 63 65 0d 20 20 32  |270 .service.  2|
00001f20  38 30 20 20 20 20 20 20  20 20 20 43 4d 50 20 23  |80         CMP #|
00001f30  34 0d 20 20 32 39 30 20  20 20 20 20 20 20 20 20  |4.  290         |
00001f40  42 45 51 20 75 6e 72 65  63 6f 67 6e 69 73 65 64  |BEQ unrecognised|
00001f50  0d 20 20 33 30 30 20 20  20 20 20 20 20 20 20 52  |.  300         R|
00001f60  54 53 0d 20 20 33 31 30  20 2e 75 6e 72 65 63 6f  |TS.  310 .unreco|
00001f70  67 6e 69 73 65 64 0d 20  20 33 32 30 20 20 20 20  |gnised.  320    |
00001f80  20 20 20 20 20 50 48 41  0d 20 20 33 33 30 20 20  |     PHA.  330  |
00001f90  20 20 20 20 20 20 20 54  58 41 0d 20 20 33 34 30  |       TXA.  340|
00001fa0  20 20 20 20 20 20 20 20  20 50 48 41 0d 20 20 33  |         PHA.  3|
00001fb0  35 30 20 20 20 20 20 20  20 20 20 54 59 41 0d 20  |50         TYA. |
00001fc0  20 33 36 30 20 20 20 20  20 20 20 20 20 50 48 41  | 360         PHA|
00001fd0  0d 20 20 33 37 30 20 20  20 20 20 20 20 20 20 4c  |.  370         L|
00001fe0  44 58 20 23 26 46 46 0d  20 20 33 38 30 20 2e 63  |DX #&FF.  380 .c|
00001ff0  6f 6d 6c 6f 6f 70 0d 20  20 33 39 30 20 20 20 20  |omloop.  390    |
00002000  20 20 20 20 20 49 4e 58  0d 20 20 34 30 30 20 20  |     INX.  400  |
00002010  20 20 20 20 20 20 20 4c  44 41 20 74 69 74 6c 65  |       LDA title|
00002020  2b 64 69 66 66 2c 58 0d  20 20 34 31 30 20 20 20  |+diff,X.  410   |
00002030  20 20 20 20 20 20 42 45  51 20 66 6f 75 6e 64 0d  |      BEQ found.|
00002040  20 20 34 32 30 20 20 20  20 20 20 20 20 20 4c 44  |  420         LD|
00002050  41 20 28 63 6f 6d 76 65  63 29 2c 59 0d 20 20 34  |A (comvec),Y.  4|
00002060  33 30 20 20 20 20 20 20  20 20 20 49 4e 59 0d 20  |30         INY. |
00002070  20 34 34 30 20 20 20 20  20 20 20 20 20 43 4d 50  | 440         CMP|
00002080  20 23 41 53 43 28 22 2e  22 29 0d 20 20 34 35 30  | #ASC(".").  450|
00002090  20 20 20 20 20 20 20 20  20 42 45 51 20 66 6f 75  |         BEQ fou|
000020a0  6e 64 0d 20 20 34 36 30  20 20 20 20 20 20 20 20  |nd.  460        |
000020b0  20 41 4e 44 20 23 26 44  46 0d 20 20 34 37 30 20  | AND #&DF.  470 |
000020c0  20 20 20 20 20 20 20 20  43 4d 50 20 74 69 74 6c  |        CMP titl|
000020d0  65 2b 64 69 66 66 2c 58  0d 20 20 34 38 30 20 20  |e+diff,X.  480  |
000020e0  20 20 20 20 20 20 20 42  45 51 20 63 6f 6d 6c 6f  |       BEQ comlo|
000020f0  6f 70 0d 20 20 34 39 30  20 20 20 20 20 20 20 20  |op.  490        |
00002100  20 50 4c 41 0d 20 20 35  30 30 20 20 20 20 20 20  | PLA.  500      |
00002110  20 20 20 54 41 59 0d 20  20 35 31 30 20 20 20 20  |   TAY.  510    |
00002120  20 20 20 20 20 50 4c 41  0d 20 20 35 32 30 20 20  |     PLA.  520  |
00002130  20 20 20 20 20 20 20 54  41 58 0d 20 20 35 33 30  |       TAX.  530|
00002140  20 20 20 20 20 20 20 20  20 50 4c 41 0d 20 20 35  |         PLA.  5|
00002150  34 30 20 20 20 20 20 20  20 20 20 52 54 53 0d 20  |40         RTS. |
00002160  20 35 35 30 20 2e 66 6f  75 6e 64 0d 20 20 35 36  | 550 .found.  56|
00002170  30 20 20 20 20 20 20 20  20 20 53 45 43 20 20 20  |0         SEC   |
00002180  20 20 20 20 20 20 20 20  5c 20 54 65 72 6d 69 6e  |        \ Termin|
00002190  61 74 65 20 77 69 74 68  20 52 65 74 75 72 6e 20  |ate with Return |
000021a0  6f 72 20 22 0d 20 20 35  37 30 20 20 20 20 20 20  |or ".  570      |
000021b0  20 20 20 4a 53 52 20 67  73 69 6e 69 74 0d 20 20  |   JSR gsinit.  |
000021c0  35 38 30 20 20 20 20 20  20 20 20 20 42 45 51 20  |580         BEQ |
000021d0  65 78 69 74 20 20 20 20  20 20 5c 20 42 72 61 6e  |exit      \ Bran|
000021e0  63 68 20 69 66 20 6e 75  6c 6c 20 61 72 67 75 6d  |ch if null argum|
000021f0  65 6e 74 0d 20 20 35 39  30 20 20 20 20 20 20 20  |ent.  590       |
00002200  20 20 49 4e 59 20 20 20  20 20 20 20 20 20 20 20  |  INY           |
00002210  5c 20 46 69 72 73 74 20  63 68 61 72 61 63 74 65  |\ First characte|
00002220  72 20 6d 75 73 74 20 62  65 20 22 4f 22 0d 20 20  |r must be "O".  |
00002230  36 30 30 20 20 20 20 20  20 20 20 20 4a 53 52 20  |600         JSR |
00002240  67 73 72 65 61 64 20 20  20 20 5c 20 53 65 63 6f  |gsread    \ Seco|
00002250  6e 64 20 63 68 61 72 61  63 74 65 72 20 22 46 22  |nd character "F"|
00002260  20 6f 72 20 22 4e 22 0d  20 20 36 31 30 20 20 20  | or "N".  610   |
00002270  20 20 20 20 20 20 42 43  53 20 65 78 69 74 20 20  |      BCS exit  |
00002280  20 20 20 20 5c 20 42 72  61 6e 63 68 20 69 66 20  |    \ Branch if |
00002290  65 6e 64 20 6f 66 20 61  72 67 75 6d 65 6e 74 0d  |end of argument.|
000022a0  20 20 36 32 30 20 20 20  20 20 20 20 20 20 41 4e  |  620         AN|
000022b0  44 20 23 26 44 46 20 20  20 20 20 20 5c 20 55 70  |D #&DF      \ Up|
000022c0  70 65 72 20 63 61 73 65  0d 20 20 36 33 30 20 20  |per case.  630  |
000022d0  20 20 20 20 20 20 20 43  4d 50 20 23 41 53 43 28  |       CMP #ASC(|
000022e0  22 46 22 29 0d 20 20 36  34 30 20 20 20 20 20 20  |"F").  640      |
000022f0  20 20 20 42 45 51 20 63  75 72 73 6f 72 6f 66 66  |   BEQ cursoroff|
00002300  0d 20 20 36 35 30 20 20  20 20 20 20 20 20 20 43  |.  650         C|
00002310  4d 50 20 23 41 53 43 28  22 4e 22 29 0d 20 20 36  |MP #ASC("N").  6|
00002320  36 30 20 20 20 20 20 20  20 20 20 42 4e 45 20 65  |60         BNE e|
00002330  78 69 74 0d 20 20 36 37  30 20 20 20 20 20 20 20  |xit.  670       |
00002340  20 20 53 45 43 0d 20 20  36 38 30 20 20 20 20 20  |  SEC.  680     |
00002350  20 20 20 20 42 43 53 20  63 75 72 73 6f 72 0d 20  |    BCS cursor. |
00002360  20 36 39 30 20 2e 63 75  72 73 6f 72 6f 66 66 0d  | 690 .cursoroff.|
00002370  20 20 37 30 30 20 20 20  20 20 20 20 20 20 43 4c  |  700         CL|
00002380  43 0d 20 20 37 31 30 20  2e 63 75 72 73 6f 72 0d  |C.  710 .cursor.|
00002390  20 20 37 32 30 20 20 20  20 20 20 20 20 20 50 48  |  720         PH|
000023a0  50 0d 20 20 37 33 30 20  20 20 20 20 20 20 20 20  |P.  730         |
000023b0  4c 44 41 20 23 32 33 0d  20 20 37 34 30 20 20 20  |LDA #23.  740   |
000023c0  20 20 20 20 20 20 4a 53  52 20 6f 73 61 73 63 69  |      JSR osasci|
000023d0  0d 20 20 37 35 30 20 20  20 20 20 20 20 20 20 4c  |.  750         L|
000023e0  44 41 20 23 31 0d 20 20  37 36 30 20 20 20 20 20  |DA #1.  760     |
000023f0  20 20 20 20 4a 53 52 20  6f 73 61 73 63 69 0d 20  |    JSR osasci. |
00002400  20 37 37 30 20 20 20 20  20 20 20 20 20 50 4c 41  | 770         PLA|
00002410  0d 20 20 37 38 30 20 20  20 20 20 20 20 20 20 41  |.  780         A|
00002420  4e 44 20 23 31 0d 20 20  37 39 30 20 20 20 20 20  |ND #1.  790     |
00002430  20 20 20 20 4a 53 52 20  6f 73 61 73 63 69 0d 20  |    JSR osasci. |
00002440  20 38 30 30 20 20 20 20  20 20 20 20 20 4c 44 41  | 800         LDA|
00002450  20 23 30 0d 20 20 38 31  30 20 20 20 20 20 20 20  | #0.  810       |
00002460  20 20 4c 44 58 20 23 37  0d 20 20 38 32 30 20 2e  |  LDX #7.  820 .|
00002470  63 75 72 73 6f 72 6c 6f  6f 70 0d 20 20 38 33 30  |cursorloop.  830|
00002480  20 20 20 20 20 20 20 20  20 4a 53 52 20 6f 73 61  |         JSR osa|
00002490  73 63 69 0d 20 20 38 34  30 20 20 20 20 20 20 20  |sci.  840       |
000024a0  20 20 44 45 58 0d 20 20  38 35 30 20 20 20 20 20  |  DEX.  850     |
000024b0  20 20 20 20 42 4e 45 20  63 75 72 73 6f 72 6c 6f  |    BNE cursorlo|
000024c0  6f 70 0d 20 20 38 36 30  20 2e 65 78 69 74 0d 20  |op.  860 .exit. |
000024d0  20 38 37 30 20 20 20 20  20 20 20 20 20 50 4c 41  | 870         PLA|
000024e0  0d 20 20 38 38 30 20 20  20 20 20 20 20 20 20 50  |.  880         P|
000024f0  4c 41 0d 20 20 38 39 30  20 20 20 20 20 20 20 20  |LA.  890        |
00002500  20 50 4c 41 0d 20 20 39  30 30 20 20 20 20 20 20  | PLA.  900      |
00002510  20 20 20 4c 44 41 20 23  30 0d 20 20 39 31 30 20  |   LDA #0.  910 |
00002520  20 20 20 20 20 20 20 20  52 54 53 0d 20 20 39 32  |        RTS.  92|
00002530  30 20 2e 6c 61 73 74 62  79 74 65 0d 20 20 39 33  |0 .lastbyte.  93|
00002540  30 20 5d 0d 20 20 39 34  30 20 4e 45 58 54 0d 20  |0 ].  940 NEXT. |
00002550  20 39 35 30 20 49 4e 50  55 54 27 22 53 61 76 65  | 950 INPUT'"Save|
00002560  20 66 69 6c 65 6e 61 6d  65 20 3d 20 22 66 69 6c  | filename = "fil|
00002570  65 6e 61 6d 65 24 0d 20  20 39 36 30 20 49 46 20  |ename$.  960 IF |
00002580  66 69 6c 65 6e 61 6d 65  24 3d 22 22 20 45 4e 44  |filename$="" END|
00002590  0d 20 20 39 37 30 20 24  73 61 76 65 3d 22 53 41  |.  970 $save="SA|
000025a0  56 45 20 22 2b 66 69 6c  65 6e 61 6d 65 24 2b 22  |VE "+filename$+"|
000025b0  20 22 2b 53 54 52 24 7e  28 48 49 4d 45 4d 29 2b  | "+STR$~(HIMEM)+|
000025c0  22 20 22 2b 53 54 52 24  7e 28 6c 61 73 0d 20 20  |" "+STR$~(las.  |
000025d0  20 20 20 20 74 62 79 74  65 29 2b 22 20 46 46 46  |    tbyte)+" FFF|
000025e0  46 38 30 30 30 20 46 46  46 46 38 30 30 30 22 0d  |F8000 FFFF8000".|
000025f0  20 20 39 38 30 20 58 25  3d 73 61 76 65 20 4d 4f  |  980 X%=save MO|
00002600  44 20 32 35 36 0d 20 20  39 39 30 20 59 25 3d 73  |D 256.  990 Y%=s|
00002610  61 76 65 20 44 49 56 20  32 35 36 0d 20 31 30 30  |ave DIV 256. 100|
00002620  30 20 2a 4f 50 54 31 2c  32 0d 20 31 30 31 30 20  |0 *OPT1,2. 1010 |
00002630  43 41 4c 4c 20 6f 73 63  6c 69 0d 20 31 30 32 30  |CALL oscli. 1020|
00002640  20 2a 4f 50 54 31 2c 30  0d 20 31 30 33 30 20 45  | *OPT1,0. 1030 E|
00002650  4e 44 0d 20 31 30 34 30  20 44 45 46 46 4e 65 71  |ND. 1040 DEFFNeq|
00002660  75 62 28 62 79 74 65 29  0d 20 31 30 35 30 20 3f  |ub(byte). 1050 ?|
00002670  50 25 3d 62 79 74 65 0d  20 31 30 36 30 20 50 25  |P%=byte. 1060 P%|
00002680  3d 50 25 2b 31 0d 20 31  30 37 30 20 3d 70 61 73  |=P%+1. 1070 =pas|
00002690  73 0d 20 31 30 38 30 20  44 45 46 46 4e 65 71 75  |s. 1080 DEFFNequ|
000026a0  77 28 77 6f 72 64 29 0d  20 31 30 39 30 20 3f 50  |w(word). 1090 ?P|
000026b0  25 3d 77 6f 72 64 20 4d  4f 44 20 32 35 36 0d 20  |%=word MOD 256. |
000026c0  31 31 30 30 20 50 25 3f  31 3d 77 6f 72 64 20 44  |1100 P%?1=word D|
000026d0  49 56 20 32 35 36 0d 20  31 31 31 30 20 50 25 3d  |IV 256. 1110 P%=|
000026e0  50 25 2b 32 0d 20 31 31  32 30 20 3d 70 61 73 73  |P%+2. 1120 =pass|
000026f0  0d 20 31 31 33 30 20 44  45 46 46 4e 65 71 75 64  |. 1130 DEFFNequd|
00002700  28 64 6f 75 62 6c 65 29  0d 20 31 31 34 30 20 21  |(double). 1140 !|
00002710  50 25 3d 64 6f 75 62 6c  65 0d 20 31 31 35 30 20  |P%=double. 1150 |
00002720  50 25 3d 50 25 2b 34 0d  20 31 31 36 30 20 3d 70  |P%=P%+4. 1160 =p|
00002730  61 73 73 0d 20 31 31 37  30 20 44 45 46 46 4e 65  |ass. 1170 DEFFNe|
00002740  71 75 73 28 73 74 72 69  6e 67 24 29 0d 20 31 31  |qus(string$). 11|
00002750  38 30 20 24 50 25 3d 73  74 72 69 6e 67 24 0d 20  |80 $P%=string$. |
00002760  31 31 39 30 20 50 25 3d  50 25 2b 4c 45 4e 28 73  |1190 P%=P%+LEN(s|
00002770  74 72 69 6e 67 24 29 0d  20 31 32 30 30 20 3d 70  |tring$). 1200 =p|
00002780  61 73 73 0d                                       |ass.|
00002784
21_11_87/T\SWR05.m0
21_11_87/T\SWR05.m1
21_11_87/T\SWR05.m2
21_11_87/T\SWR05.m4
21_11_87/T\SWR05.m5