Home » CEEFAX disks » telesoftware8.adl » 19-08-88/T\SWR07

19-08-88/T\SWR07

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 » telesoftware8.adl
Filename: 19-08-88/T\SWR07
Read OK:
File size: 2AF2 bytes
Load address: 0000
Exec address: FFFFFFFF
Duplicates

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

File contents
Mastering Sideways ROM & RAM - Module 07 - Osword
-------------------------------------------------

  The new Osbyte demonstrated in Module 6 used the X and Y registers to
pass two parameters to a new routine. Osword is a similar concept to
Osbyte except that parameters are passed in a parameter block the
address of which is sent to the Osword routine in the X and Y registers.
The low byte of the address is in X and the high byte in Y.

  Osword uses the same three consecutive zero page bytes as Osbyte to
store the values of the A, X and Y registers. The accumulator value for
the most recent Osword (or Osbyte) is stored in &EF. The X register
value is stored in &F0 and the Y register value is stored in &F1.

  Oswords &00 to &0D are used by the MOS. Oswords &7D to &7F are used by
the DFS and Oswords &E0 to &FF are passed to the user vector (USERV) at
&200. You can define any other Osword in your SWR programs but it is
wise to use TRACE to make sure the number you intend to use is available
as an unused Osword on your machine. The example program in this module
will define Osword 100 (&64).

  Using TRACE to find the service request for an unrecognised Osword
involves a bit more typing than using it to find the service request for
an unrecognised Osbyte.

  Load the object code generated by TRACE into SWR and press the Break
key. Call Osword 100 using a dummy parameter block address with the
trace active. You should get the response shown in figure 7.1 which
shows that service call 8 is used and that the address of the parameter
block is only available from &F0 and &F1 and not directly from the index
registers.




>A%=100:X%=100:Y%=100:CALL &FFF1
 A=08 X=0F Y=00 Unrecognised Osword
>

Figure 7.1 Service trace for unrecognised Osword.
-------------------------------------------------




  Defining a new Osword is no more difficult than defining a new Osbyte
but it more useful because you can pass more than two parameters to and
from the new routine in the parameter block.

  Up to 256 new routines can share the same Osword number by using the a
byte of the parameter block as an index on the available routines. For
example, if the number stored in the first byte of the parameter block
is n, your Osword interpreter could pass control to the (n+1)th routine.
The outline Osword interpreter in figure 7.2 does not use this type of
extended Osword.




.service
         PHA           \ push accumulator
         CMP #8        \ is it unrecognised Osword?
         BEQ newosword \ branch if it is
.exit
         PLA           \ pull accumulator
         RTS           \ return and give other roms the call
.newosword
         LDA &EF       \ load Osword number
         CMP #100      \ is it 100?
         BNE exit      \ branch if not Osword 100
          .
          .            \ new routine goes in here
          .
         LDX &F0       \ make sure X and &F0 are identical
         LDY &F1       \ make sure Y and &F1 are indenical
         PLA           \ pull A pushed by interpreter
         LDA #0        \ other roms ignore this call
         RTS           \ return to MOS

Figure 7.2 An Osword interpreter.
---------------------------------



  The service entry point of the outline interpreter in figure 7.2 will
have a jump to the label ".service". On entering the interpreter the
accumulator is pushed on the stack and then compared with 8 to see if
the call is an unrecognised Osword. If it is not the accumulator is
pulled off the stack and control is returned to the MOS. If the call is
for an unrecognised Osword the number stored in &EF is loaded into the
accumulator and compared with the number of the new Osword, in this
example 100.

  If the unrecognised Osword number stored in &EF is not 100 the
accumulator is pulled off the stack and control is returned to the MOS.
If it is 100 then the new routine can be executed. The address of the
parameter block can be read from &F0 (low byte) and &F1 (high byte). The
parameter block must be in the I/O processor.

  After completing the new routine you should ensure that the index
registers and their zero page copies are identical. In figure 7.2 it is
assumed that the contents of &EF, &F0 and &F1 have not been altered. The
accumulator was pushed on the stack by the interpreter and it is pulled
back off to balance the stack. The accumulator is reset to zero to
inform other roms that the service call has been recognised and control
is returned to the MOS. On return the MOS copies the Osword number into
the accumulator.

  Unlike Osbyte, Osword does not use &F0 and &F1 to write any results.
If your new routines write any results these must be written in the
parameter block. &EF, &F0 and &F1 should be restored before returning
from Osword.

  The program OSWORD uses an interpreter similar to the one outlined in
figure 7.2 to implement a PRINT TAB(X,Y) routine as Osword 100 (&64).
This routine gives access to PRINT TAB in both BASIC and machine code.

  To use the new Osword you need to load the object code generated by
the program OSWORD into SWR and press the Break key. Any program which
uses the new routine must define a parameter block to contain the two
byte address of a text string and the two bytes for the screen X and Y
co-ordinates of the first character of the string. Because four bytes of
information are needed for this routine an Osbyte could not be used. The
progrm OSWDEMO shows how to set up the parameter block in Assembly
language.




   10 REM  OSWDEMO
   20 MODE7
   30 DIM mcode &100
   40 osword=&FFF1
   50 FOR pass=0 TO 2 STEP 2
   60 P%=mcode
   70 [       OPT pass
   80         LDA #100
   90         LDX #pblock MOD 256
  100         LDY #pblock DIV 256
  110         JSR osword
  120         LDA #100
  130         LDX #pblock2 MOD 256
  140         LDY #pblock2 DIV 256
  150         JSR osword
  160         RTS
  170 .pblock
  180         OPT FNequw(text)
  190         OPT FNequb(5)
  200         OPT FNequb(11)
  210 .pblock2
  220         OPT FNequw(text)
  230         OPT FNequb(5)
  240         OPT FNequb(12)
  250 .text
  260         OPT FNequb(141)
  270         OPT FNequb(131)
  280         OPT FNequs("Demonstration of new Osword")
  290         OPT FNequb(13)
  300 ]
  310 NEXT
  320 CALL mcode
  330 END
  340 DEFFNequb(byte)
  350 ?P%=byte
  360 P%=P%+1
  370 =pass
  380 DEFFNequw(word)
  390 ?P%=word MOD 256
  400 P%?1=word DIV 256
  410 P%=P%+2
  420 =pass
  430 DEFFNequd(double)
  440 !P%=double
  450 P%=P%+4
  460 =pass
  470 DEFFNequs(string$)
  480 $P%=string$
  490 P%=P%+LEN(string$)
  500 =pass





  The new Osword 100 can be used in any text mode but OSWDEMO uses it to
print a string in double height, yellow, Mode 7 characters. OSWDEMO must
run in the I/O processor.

  The first two bytes of the parameter blocks store the address of the
text block (lines 180 and 220). The third byte of the parameter blocks
store the screen X co-ordinate of the first byte of the string (lines
190 and 230) and the fourth byte stores the screen Y co-ordinate of the
first byte of the string (lines 200 and 240).

  Before calling the new Osword (lines 110 and 150) the accumulator is
loaded with the new Osword number (lines 80 and 120), the X register
with the low byte of the parameter block address (lines 90 and 130), and
the Y register with the high byte of the parameter block address (lines
100 and 140). Osword 100 prints the string on the screen and returns
with A, X and Y registers preserved.

  The program OSWORD uses an Osword interpreter (lines 270-370) similar
to the one outlined in figure 7.2. After recognising the new Osword
(lines 350-370) the new routine preserves the two zero page bytes it
uses to print the string by pushing them on the stack (lines 380-410).

  The address of the parameter block is stored in &F0 (low byte) and &F1
(high byte). These two zero page memory locations are used with
post-indexed indirect addressing to read the contents of the parameter
block. The Y register is reset to zero (line 420) and the address of the
text block is read from the parameter block and stored in zero page
ready to print the text string (lines 430-470). The screen X and Y
co-ordinates are read from the parameter block and the text cursor is
positioned using the machine code equivalent of VDU 31,x,y (lines
480-550). The text string is then printed on the screen (lines 560-640).

  The zero page locations used by the print routine are pulled off the
stack and restored (lines 650-680). The index registers are restored
(lines 690-700), the accumulator is reset to zero to inform the other
roms that the service call has been recognised (lines 710-720) and
contol is returned to the MOS (line 730).





   10 REM: OSWORD
   20 MODE7
   30 HIMEM=&3C00
   40 DIM save 50
   50 diff=&8000-HIMEM
   60 address=&70
   70 accumulator=&EF
   80 xregister=&F0
   90 yregister=&F1
  100 osasci=&FFE3
  110 oscli=&FFF7
  120 FOR pass = 0 TO 2 STEP 2
  130 P%=HIMEM
  140 [       OPT pass
  150         BRK
  160         BRK
  170         BRK
  180         JMP service+diff
  190         OPT FNequb(&82)
  200         OPT FNequb((copyright+diff) MOD 256)
  210         BRK
  220         OPT FNequs("OSWORD")
  230 .copyright
  240         BRK
  250         OPT FNequs("(C) Gordon Horsington 1987")
  260         BRK
  270 .service
  280         PHA
  290         CMP #8
  300         BEQ newosword
  310 .exit
  320         PLA
  330         RTS
  340 .newosword
  350         LDA accumulator
  360         CMP #100
  370         BNE exit
  380         LDA address
  390         PHA
  400         LDA address+1
  410         PHA
  420         LDY #0
  430         LDA (xregister),Y
  440         STA address
  450         INY
  460         LDA (xregister),Y
  470         STA address+1
  480         LDA #31
  490         JSR osasci
  500         INY
  510         LDA (xregister),Y
  520         JSR osasci
  530         INY
  540         LDA (xregister),Y
  550         JSR osasci
  560         LDY #&FF
  570 .printloop
  580         INY
  590         LDA (address),Y
  600         BEQ finish
  610         JSR osasci
  620         CMP #13
  630         BNE printloop
  640 .finish
  650         PLA
  660         STA address+1
  670         PLA
  680         STA address
  690         LDX xregister
  700         LDY yregister
  710         PLA
  720         LDA #0
  730         RTS
  740 .lastbyte
  750 ]
  760 NEXT
  770 INPUT'"Save filename = "filename$
  780 IF filename$="" END
  790 $save="SAVE "+filename$+" "+STR$~(HIMEM)+" "+STR$~(las
      tbyte)+" FFFF8000 FFFF8000"
  800 X%=save MOD 256
  810 Y%=save DIV 256
  820 *OPT1,2
  830 CALL oscli
  840 *OPT1,0
  850 END
  860 DEFFNequb(byte)
  870 ?P%=byte
  880 P%=P%+1
  890 =pass
  900 DEFFNequw(word)
  910 ?P%=word MOD 256
  920 P%?1=word DIV 256
  930 P%=P%+2
  940 =pass
  950 DEFFNequd(double)
  960 !P%=double
  970 P%=P%+4
  980 =pass
  990 DEFFNequs(string$)
 1000 $P%=string$
 1010 P%=P%+LEN(string$)
 1020 =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 37  20 2d 20 4f 73 77 6f 72  |odule 07 - Oswor|
00000030  64 0d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |d.--------------|
00000040  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00000060  2d 2d 2d 0d 0d 20 20 54  68 65 20 6e 65 77 20 4f  |---..  The new O|
00000070  73 62 79 74 65 20 64 65  6d 6f 6e 73 74 72 61 74  |sbyte demonstrat|
00000080  65 64 20 69 6e 20 4d 6f  64 75 6c 65 20 36 20 75  |ed in Module 6 u|
00000090  73 65 64 20 74 68 65 20  58 20 61 6e 64 20 59 20  |sed the X and Y |
000000a0  72 65 67 69 73 74 65 72  73 20 74 6f 0d 70 61 73  |registers to.pas|
000000b0  73 20 74 77 6f 20 70 61  72 61 6d 65 74 65 72 73  |s two parameters|
000000c0  20 74 6f 20 61 20 6e 65  77 20 72 6f 75 74 69 6e  | to a new routin|
000000d0  65 2e 20 4f 73 77 6f 72  64 20 69 73 20 61 20 73  |e. Osword is a s|
000000e0  69 6d 69 6c 61 72 20 63  6f 6e 63 65 70 74 20 74  |imilar concept t|
000000f0  6f 0d 4f 73 62 79 74 65  20 65 78 63 65 70 74 20  |o.Osbyte except |
00000100  74 68 61 74 20 70 61 72  61 6d 65 74 65 72 73 20  |that parameters |
00000110  61 72 65 20 70 61 73 73  65 64 20 69 6e 20 61 20  |are passed in a |
00000120  70 61 72 61 6d 65 74 65  72 20 62 6c 6f 63 6b 20  |parameter block |
00000130  74 68 65 0d 61 64 64 72  65 73 73 20 6f 66 20 77  |the.address of w|
00000140  68 69 63 68 20 69 73 20  73 65 6e 74 20 74 6f 20  |hich is sent to |
00000150  74 68 65 20 4f 73 77 6f  72 64 20 72 6f 75 74 69  |the Osword routi|
00000160  6e 65 20 69 6e 20 74 68  65 20 58 20 61 6e 64 20  |ne in the X and |
00000170  59 20 72 65 67 69 73 74  65 72 73 2e 0d 54 68 65  |Y registers..The|
00000180  20 6c 6f 77 20 62 79 74  65 20 6f 66 20 74 68 65  | low byte of the|
00000190  20 61 64 64 72 65 73 73  20 69 73 20 69 6e 20 58  | address is in X|
000001a0  20 61 6e 64 20 74 68 65  20 68 69 67 68 20 62 79  | and the high by|
000001b0  74 65 20 69 6e 20 59 2e  0d 0d 20 20 4f 73 77 6f  |te in Y...  Oswo|
000001c0  72 64 20 75 73 65 73 20  74 68 65 20 73 61 6d 65  |rd uses the same|
000001d0  20 74 68 72 65 65 20 63  6f 6e 73 65 63 75 74 69  | three consecuti|
000001e0  76 65 20 7a 65 72 6f 20  70 61 67 65 20 62 79 74  |ve zero page byt|
000001f0  65 73 20 61 73 20 4f 73  62 79 74 65 20 74 6f 0d  |es as Osbyte to.|
00000200  73 74 6f 72 65 20 74 68  65 20 76 61 6c 75 65 73  |store the values|
00000210  20 6f 66 20 74 68 65 20  41 2c 20 58 20 61 6e 64  | of the A, X and|
00000220  20 59 20 72 65 67 69 73  74 65 72 73 2e 20 54 68  | Y registers. Th|
00000230  65 20 61 63 63 75 6d 75  6c 61 74 6f 72 20 76 61  |e accumulator va|
00000240  6c 75 65 20 66 6f 72 0d  74 68 65 20 6d 6f 73 74  |lue for.the most|
00000250  20 72 65 63 65 6e 74 20  4f 73 77 6f 72 64 20 28  | recent Osword (|
00000260  6f 72 20 4f 73 62 79 74  65 29 20 69 73 20 73 74  |or Osbyte) is st|
00000270  6f 72 65 64 20 69 6e 20  26 45 46 2e 20 54 68 65  |ored in &EF. The|
00000280  20 58 20 72 65 67 69 73  74 65 72 0d 76 61 6c 75  | X register.valu|
00000290  65 20 69 73 20 73 74 6f  72 65 64 20 69 6e 20 26  |e is stored in &|
000002a0  46 30 20 61 6e 64 20 74  68 65 20 59 20 72 65 67  |F0 and the Y reg|
000002b0  69 73 74 65 72 20 76 61  6c 75 65 20 69 73 20 73  |ister value is s|
000002c0  74 6f 72 65 64 20 69 6e  20 26 46 31 2e 0d 0d 20  |tored in &F1... |
000002d0  20 4f 73 77 6f 72 64 73  20 26 30 30 20 74 6f 20  | Oswords &00 to |
000002e0  26 30 44 20 61 72 65 20  75 73 65 64 20 62 79 20  |&0D are used by |
000002f0  74 68 65 20 4d 4f 53 2e  20 4f 73 77 6f 72 64 73  |the MOS. Oswords|
00000300  20 26 37 44 20 74 6f 20  26 37 46 20 61 72 65 20  | &7D to &7F are |
00000310  75 73 65 64 20 62 79 0d  74 68 65 20 44 46 53 20  |used by.the DFS |
00000320  61 6e 64 20 4f 73 77 6f  72 64 73 20 26 45 30 20  |and Oswords &E0 |
00000330  74 6f 20 26 46 46 20 61  72 65 20 70 61 73 73 65  |to &FF are passe|
00000340  64 20 74 6f 20 74 68 65  20 75 73 65 72 20 76 65  |d to the user ve|
00000350  63 74 6f 72 20 28 55 53  45 52 56 29 20 61 74 0d  |ctor (USERV) at.|
00000360  26 32 30 30 2e 20 59 6f  75 20 63 61 6e 20 64 65  |&200. You can de|
00000370  66 69 6e 65 20 61 6e 79  20 6f 74 68 65 72 20 4f  |fine any other O|
00000380  73 77 6f 72 64 20 69 6e  20 79 6f 75 72 20 53 57  |sword in your SW|
00000390  52 20 70 72 6f 67 72 61  6d 73 20 62 75 74 20 69  |R programs but i|
000003a0  74 20 69 73 0d 77 69 73  65 20 74 6f 20 75 73 65  |t is.wise to use|
000003b0  20 54 52 41 43 45 20 74  6f 20 6d 61 6b 65 20 73  | TRACE to make s|
000003c0  75 72 65 20 74 68 65 20  6e 75 6d 62 65 72 20 79  |ure the number y|
000003d0  6f 75 20 69 6e 74 65 6e  64 20 74 6f 20 75 73 65  |ou intend to use|
000003e0  20 69 73 20 61 76 61 69  6c 61 62 6c 65 0d 61 73  | is available.as|
000003f0  20 61 6e 20 75 6e 75 73  65 64 20 4f 73 77 6f 72  | an unused Oswor|
00000400  64 20 6f 6e 20 79 6f 75  72 20 6d 61 63 68 69 6e  |d on your machin|
00000410  65 2e 20 54 68 65 20 65  78 61 6d 70 6c 65 20 70  |e. The example p|
00000420  72 6f 67 72 61 6d 20 69  6e 20 74 68 69 73 20 6d  |rogram in this m|
00000430  6f 64 75 6c 65 0d 77 69  6c 6c 20 64 65 66 69 6e  |odule.will defin|
00000440  65 20 4f 73 77 6f 72 64  20 31 30 30 20 28 26 36  |e Osword 100 (&6|
00000450  34 29 2e 0d 0d 20 20 55  73 69 6e 67 20 54 52 41  |4)...  Using TRA|
00000460  43 45 20 74 6f 20 66 69  6e 64 20 74 68 65 20 73  |CE to find the s|
00000470  65 72 76 69 63 65 20 72  65 71 75 65 73 74 20 66  |ervice request f|
00000480  6f 72 20 61 6e 20 75 6e  72 65 63 6f 67 6e 69 73  |or an unrecognis|
00000490  65 64 20 4f 73 77 6f 72  64 0d 69 6e 76 6f 6c 76  |ed Osword.involv|
000004a0  65 73 20 61 20 62 69 74  20 6d 6f 72 65 20 74 79  |es a bit more ty|
000004b0  70 69 6e 67 20 74 68 61  6e 20 75 73 69 6e 67 20  |ping than using |
000004c0  69 74 20 74 6f 20 66 69  6e 64 20 74 68 65 20 73  |it to find the s|
000004d0  65 72 76 69 63 65 20 72  65 71 75 65 73 74 20 66  |ervice request f|
000004e0  6f 72 0d 61 6e 20 75 6e  72 65 63 6f 67 6e 69 73  |or.an unrecognis|
000004f0  65 64 20 4f 73 62 79 74  65 2e 0d 0d 20 20 4c 6f  |ed Osbyte...  Lo|
00000500  61 64 20 74 68 65 20 6f  62 6a 65 63 74 20 63 6f  |ad the object co|
00000510  64 65 20 67 65 6e 65 72  61 74 65 64 20 62 79 20  |de generated by |
00000520  54 52 41 43 45 20 69 6e  74 6f 20 53 57 52 20 61  |TRACE into SWR a|
00000530  6e 64 20 70 72 65 73 73  20 74 68 65 20 42 72 65  |nd press the Bre|
00000540  61 6b 0d 6b 65 79 2e 20  43 61 6c 6c 20 4f 73 77  |ak.key. Call Osw|
00000550  6f 72 64 20 31 30 30 20  75 73 69 6e 67 20 61 20  |ord 100 using a |
00000560  64 75 6d 6d 79 20 70 61  72 61 6d 65 74 65 72 20  |dummy parameter |
00000570  62 6c 6f 63 6b 20 61 64  64 72 65 73 73 20 77 69  |block address wi|
00000580  74 68 20 74 68 65 0d 74  72 61 63 65 20 61 63 74  |th the.trace act|
00000590  69 76 65 2e 20 59 6f 75  20 73 68 6f 75 6c 64 20  |ive. You should |
000005a0  67 65 74 20 74 68 65 20  72 65 73 70 6f 6e 73 65  |get the response|
000005b0  20 73 68 6f 77 6e 20 69  6e 20 66 69 67 75 72 65  | shown in figure|
000005c0  20 37 2e 31 20 77 68 69  63 68 0d 73 68 6f 77 73  | 7.1 which.shows|
000005d0  20 74 68 61 74 20 73 65  72 76 69 63 65 20 63 61  | that service ca|
000005e0  6c 6c 20 38 20 69 73 20  75 73 65 64 20 61 6e 64  |ll 8 is used and|
000005f0  20 74 68 61 74 20 74 68  65 20 61 64 64 72 65 73  | that the addres|
00000600  73 20 6f 66 20 74 68 65  20 70 61 72 61 6d 65 74  |s of the paramet|
00000610  65 72 0d 62 6c 6f 63 6b  20 69 73 20 6f 6e 6c 79  |er.block is only|
00000620  20 61 76 61 69 6c 61 62  6c 65 20 66 72 6f 6d 20  | available from |
00000630  26 46 30 20 61 6e 64 20  26 46 31 20 61 6e 64 20  |&F0 and &F1 and |
00000640  6e 6f 74 20 64 69 72 65  63 74 6c 79 20 66 72 6f  |not directly fro|
00000650  6d 20 74 68 65 20 69 6e  64 65 78 0d 72 65 67 69  |m the index.regi|
00000660  73 74 65 72 73 2e 0d 0d  0d 0d 0d 3e 41 25 3d 31  |sters......>A%=1|
00000670  30 30 3a 58 25 3d 31 30  30 3a 59 25 3d 31 30 30  |00:X%=100:Y%=100|
00000680  3a 43 41 4c 4c 20 26 46  46 46 31 0d 20 41 3d 30  |:CALL &FFF1. A=0|
00000690  38 20 58 3d 30 46 20 59  3d 30 30 20 55 6e 72 65  |8 X=0F Y=00 Unre|
000006a0  63 6f 67 6e 69 73 65 64  20 4f 73 77 6f 72 64 0d  |cognised Osword.|
000006b0  3e 0d 0d 46 69 67 75 72  65 20 37 2e 31 20 53 65  |>..Figure 7.1 Se|
000006c0  72 76 69 63 65 20 74 72  61 63 65 20 66 6f 72 20  |rvice trace for |
000006d0  75 6e 72 65 63 6f 67 6e  69 73 65 64 20 4f 73 77  |unrecognised Osw|
000006e0  6f 72 64 2e 0d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |ord..-----------|
000006f0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00000710  2d 2d 2d 2d 2d 2d 0d 0d  0d 0d 0d 20 20 44 65 66  |------.....  Def|
00000720  69 6e 69 6e 67 20 61 20  6e 65 77 20 4f 73 77 6f  |ining a new Oswo|
00000730  72 64 20 69 73 20 6e 6f  20 6d 6f 72 65 20 64 69  |rd is no more di|
00000740  66 66 69 63 75 6c 74 20  74 68 61 6e 20 64 65 66  |fficult than def|
00000750  69 6e 69 6e 67 20 61 20  6e 65 77 20 4f 73 62 79  |ining a new Osby|
00000760  74 65 0d 62 75 74 20 69  74 20 6d 6f 72 65 20 75  |te.but it more u|
00000770  73 65 66 75 6c 20 62 65  63 61 75 73 65 20 79 6f  |seful because yo|
00000780  75 20 63 61 6e 20 70 61  73 73 20 6d 6f 72 65 20  |u can pass more |
00000790  74 68 61 6e 20 74 77 6f  20 70 61 72 61 6d 65 74  |than two paramet|
000007a0  65 72 73 20 74 6f 20 61  6e 64 0d 66 72 6f 6d 20  |ers to and.from |
000007b0  74 68 65 20 6e 65 77 20  72 6f 75 74 69 6e 65 20  |the new routine |
000007c0  69 6e 20 74 68 65 20 70  61 72 61 6d 65 74 65 72  |in the parameter|
000007d0  20 62 6c 6f 63 6b 2e 0d  0d 20 20 55 70 20 74 6f  | block...  Up to|
000007e0  20 32 35 36 20 6e 65 77  20 72 6f 75 74 69 6e 65  | 256 new routine|
000007f0  73 20 63 61 6e 20 73 68  61 72 65 20 74 68 65 20  |s can share the |
00000800  73 61 6d 65 20 4f 73 77  6f 72 64 20 6e 75 6d 62  |same Osword numb|
00000810  65 72 20 62 79 20 75 73  69 6e 67 20 74 68 65 20  |er by using the |
00000820  61 0d 62 79 74 65 20 6f  66 20 74 68 65 20 70 61  |a.byte of the pa|
00000830  72 61 6d 65 74 65 72 20  62 6c 6f 63 6b 20 61 73  |rameter block as|
00000840  20 61 6e 20 69 6e 64 65  78 20 6f 6e 20 74 68 65  | an index on the|
00000850  20 61 76 61 69 6c 61 62  6c 65 20 72 6f 75 74 69  | available routi|
00000860  6e 65 73 2e 20 46 6f 72  0d 65 78 61 6d 70 6c 65  |nes. For.example|
00000870  2c 20 69 66 20 74 68 65  20 6e 75 6d 62 65 72 20  |, if the number |
00000880  73 74 6f 72 65 64 20 69  6e 20 74 68 65 20 66 69  |stored in the fi|
00000890  72 73 74 20 62 79 74 65  20 6f 66 20 74 68 65 20  |rst byte of the |
000008a0  70 61 72 61 6d 65 74 65  72 20 62 6c 6f 63 6b 0d  |parameter block.|
000008b0  69 73 20 6e 2c 20 79 6f  75 72 20 4f 73 77 6f 72  |is n, your Oswor|
000008c0  64 20 69 6e 74 65 72 70  72 65 74 65 72 20 63 6f  |d interpreter co|
000008d0  75 6c 64 20 70 61 73 73  20 63 6f 6e 74 72 6f 6c  |uld pass control|
000008e0  20 74 6f 20 74 68 65 20  28 6e 2b 31 29 74 68 20  | to the (n+1)th |
000008f0  72 6f 75 74 69 6e 65 2e  0d 54 68 65 20 6f 75 74  |routine..The out|
00000900  6c 69 6e 65 20 4f 73 77  6f 72 64 20 69 6e 74 65  |line Osword inte|
00000910  72 70 72 65 74 65 72 20  69 6e 20 66 69 67 75 72  |rpreter in figur|
00000920  65 20 37 2e 32 20 64 6f  65 73 20 6e 6f 74 20 75  |e 7.2 does not u|
00000930  73 65 20 74 68 69 73 20  74 79 70 65 20 6f 66 0d  |se this type of.|
00000940  65 78 74 65 6e 64 65 64  20 4f 73 77 6f 72 64 2e  |extended Osword.|
00000950  0d 0d 0d 0d 0d 2e 73 65  72 76 69 63 65 0d 20 20  |......service.  |
00000960  20 20 20 20 20 20 20 50  48 41 20 20 20 20 20 20  |       PHA      |
00000970  20 20 20 20 20 5c 20 70  75 73 68 20 61 63 63 75  |     \ push accu|
00000980  6d 75 6c 61 74 6f 72 0d  20 20 20 20 20 20 20 20  |mulator.        |
00000990  20 43 4d 50 20 23 38 20  20 20 20 20 20 20 20 5c  | CMP #8        \|
000009a0  20 69 73 20 69 74 20 75  6e 72 65 63 6f 67 6e 69  | is it unrecogni|
000009b0  73 65 64 20 4f 73 77 6f  72 64 3f 0d 20 20 20 20  |sed Osword?.    |
000009c0  20 20 20 20 20 42 45 51  20 6e 65 77 6f 73 77 6f  |     BEQ newoswo|
000009d0  72 64 20 5c 20 62 72 61  6e 63 68 20 69 66 20 69  |rd \ branch if i|
000009e0  74 20 69 73 0d 2e 65 78  69 74 0d 20 20 20 20 20  |t is..exit.     |
000009f0  20 20 20 20 50 4c 41 20  20 20 20 20 20 20 20 20  |    PLA         |
00000a00  20 20 5c 20 70 75 6c 6c  20 61 63 63 75 6d 75 6c  |  \ pull accumul|
00000a10  61 74 6f 72 0d 20 20 20  20 20 20 20 20 20 52 54  |ator.         RT|
00000a20  53 20 20 20 20 20 20 20  20 20 20 20 5c 20 72 65  |S           \ re|
00000a30  74 75 72 6e 20 61 6e 64  20 67 69 76 65 20 6f 74  |turn and give ot|
00000a40  68 65 72 20 72 6f 6d 73  20 74 68 65 20 63 61 6c  |her roms the cal|
00000a50  6c 0d 2e 6e 65 77 6f 73  77 6f 72 64 0d 20 20 20  |l..newosword.   |
00000a60  20 20 20 20 20 20 4c 44  41 20 26 45 46 20 20 20  |      LDA &EF   |
00000a70  20 20 20 20 5c 20 6c 6f  61 64 20 4f 73 77 6f 72  |    \ load Oswor|
00000a80  64 20 6e 75 6d 62 65 72  0d 20 20 20 20 20 20 20  |d number.       |
00000a90  20 20 43 4d 50 20 23 31  30 30 20 20 20 20 20 20  |  CMP #100      |
00000aa0  5c 20 69 73 20 69 74 20  31 30 30 3f 0d 20 20 20  |\ is it 100?.   |
00000ab0  20 20 20 20 20 20 42 4e  45 20 65 78 69 74 20 20  |      BNE exit  |
00000ac0  20 20 20 20 5c 20 62 72  61 6e 63 68 20 69 66 20  |    \ branch if |
00000ad0  6e 6f 74 20 4f 73 77 6f  72 64 20 31 30 30 0d 20  |not Osword 100. |
00000ae0  20 20 20 20 20 20 20 20  20 2e 0d 20 20 20 20 20  |         ..     |
00000af0  20 20 20 20 20 2e 20 20  20 20 20 20 20 20 20 20  |     .          |
00000b00  20 20 5c 20 6e 65 77 20  72 6f 75 74 69 6e 65 20  |  \ new routine |
00000b10  67 6f 65 73 20 69 6e 20  68 65 72 65 0d 20 20 20  |goes in here.   |
00000b20  20 20 20 20 20 20 20 2e  0d 20 20 20 20 20 20 20  |       ..       |
00000b30  20 20 4c 44 58 20 26 46  30 20 20 20 20 20 20 20  |  LDX &F0       |
00000b40  5c 20 6d 61 6b 65 20 73  75 72 65 20 58 20 61 6e  |\ make sure X an|
00000b50  64 20 26 46 30 20 61 72  65 20 69 64 65 6e 74 69  |d &F0 are identi|
00000b60  63 61 6c 0d 20 20 20 20  20 20 20 20 20 4c 44 59  |cal.         LDY|
00000b70  20 26 46 31 20 20 20 20  20 20 20 5c 20 6d 61 6b  | &F1       \ mak|
00000b80  65 20 73 75 72 65 20 59  20 61 6e 64 20 26 46 31  |e sure Y and &F1|
00000b90  20 61 72 65 20 69 6e 64  65 6e 69 63 61 6c 0d 20  | are indenical. |
00000ba0  20 20 20 20 20 20 20 20  50 4c 41 20 20 20 20 20  |        PLA     |
00000bb0  20 20 20 20 20 20 5c 20  70 75 6c 6c 20 41 20 70  |      \ pull A p|
00000bc0  75 73 68 65 64 20 62 79  20 69 6e 74 65 72 70 72  |ushed by interpr|
00000bd0  65 74 65 72 0d 20 20 20  20 20 20 20 20 20 4c 44  |eter.         LD|
00000be0  41 20 23 30 20 20 20 20  20 20 20 20 5c 20 6f 74  |A #0        \ ot|
00000bf0  68 65 72 20 72 6f 6d 73  20 69 67 6e 6f 72 65 20  |her roms ignore |
00000c00  74 68 69 73 20 63 61 6c  6c 0d 20 20 20 20 20 20  |this call.      |
00000c10  20 20 20 52 54 53 20 20  20 20 20 20 20 20 20 20  |   RTS          |
00000c20  20 5c 20 72 65 74 75 72  6e 20 74 6f 20 4d 4f 53  | \ return to MOS|
00000c30  0d 0d 46 69 67 75 72 65  20 37 2e 32 20 41 6e 20  |..Figure 7.2 An |
00000c40  4f 73 77 6f 72 64 20 69  6e 74 65 72 70 72 65 74  |Osword interpret|
00000c50  65 72 2e 0d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |er..------------|
00000c60  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
00000c70  2d 2d 2d 2d 2d 0d 0d 0d  0d 20 20 54 68 65 20 73  |-----....  The s|
00000c80  65 72 76 69 63 65 20 65  6e 74 72 79 20 70 6f 69  |ervice entry poi|
00000c90  6e 74 20 6f 66 20 74 68  65 20 6f 75 74 6c 69 6e  |nt of the outlin|
00000ca0  65 20 69 6e 74 65 72 70  72 65 74 65 72 20 69 6e  |e interpreter in|
00000cb0  20 66 69 67 75 72 65 20  37 2e 32 20 77 69 6c 6c  | figure 7.2 will|
00000cc0  0d 68 61 76 65 20 61 20  6a 75 6d 70 20 74 6f 20  |.have a jump to |
00000cd0  74 68 65 20 6c 61 62 65  6c 20 22 2e 73 65 72 76  |the label ".serv|
00000ce0  69 63 65 22 2e 20 4f 6e  20 65 6e 74 65 72 69 6e  |ice". On enterin|
00000cf0  67 20 74 68 65 20 69 6e  74 65 72 70 72 65 74 65  |g the interprete|
00000d00  72 20 74 68 65 0d 61 63  63 75 6d 75 6c 61 74 6f  |r the.accumulato|
00000d10  72 20 69 73 20 70 75 73  68 65 64 20 6f 6e 20 74  |r is pushed on t|
00000d20  68 65 20 73 74 61 63 6b  20 61 6e 64 20 74 68 65  |he stack and the|
00000d30  6e 20 63 6f 6d 70 61 72  65 64 20 77 69 74 68 20  |n compared with |
00000d40  38 20 74 6f 20 73 65 65  20 69 66 0d 74 68 65 20  |8 to see if.the |
00000d50  63 61 6c 6c 20 69 73 20  61 6e 20 75 6e 72 65 63  |call is an unrec|
00000d60  6f 67 6e 69 73 65 64 20  4f 73 77 6f 72 64 2e 20  |ognised Osword. |
00000d70  49 66 20 69 74 20 69 73  20 6e 6f 74 20 74 68 65  |If it is not the|
00000d80  20 61 63 63 75 6d 75 6c  61 74 6f 72 20 69 73 0d  | accumulator is.|
00000d90  70 75 6c 6c 65 64 20 6f  66 66 20 74 68 65 20 73  |pulled off the s|
00000da0  74 61 63 6b 20 61 6e 64  20 63 6f 6e 74 72 6f 6c  |tack and control|
00000db0  20 69 73 20 72 65 74 75  72 6e 65 64 20 74 6f 20  | is returned to |
00000dc0  74 68 65 20 4d 4f 53 2e  20 49 66 20 74 68 65 20  |the MOS. If the |
00000dd0  63 61 6c 6c 20 69 73 0d  66 6f 72 20 61 6e 20 75  |call is.for an u|
00000de0  6e 72 65 63 6f 67 6e 69  73 65 64 20 4f 73 77 6f  |nrecognised Oswo|
00000df0  72 64 20 74 68 65 20 6e  75 6d 62 65 72 20 73 74  |rd the number st|
00000e00  6f 72 65 64 20 69 6e 20  26 45 46 20 69 73 20 6c  |ored in &EF is l|
00000e10  6f 61 64 65 64 20 69 6e  74 6f 20 74 68 65 0d 61  |oaded into the.a|
00000e20  63 63 75 6d 75 6c 61 74  6f 72 20 61 6e 64 20 63  |ccumulator and c|
00000e30  6f 6d 70 61 72 65 64 20  77 69 74 68 20 74 68 65  |ompared with the|
00000e40  20 6e 75 6d 62 65 72 20  6f 66 20 74 68 65 20 6e  | number of the n|
00000e50  65 77 20 4f 73 77 6f 72  64 2c 20 69 6e 20 74 68  |ew Osword, in th|
00000e60  69 73 0d 65 78 61 6d 70  6c 65 20 31 30 30 2e 0d  |is.example 100..|
00000e70  0d 20 20 49 66 20 74 68  65 20 75 6e 72 65 63 6f  |.  If the unreco|
00000e80  67 6e 69 73 65 64 20 4f  73 77 6f 72 64 20 6e 75  |gnised Osword nu|
00000e90  6d 62 65 72 20 73 74 6f  72 65 64 20 69 6e 20 26  |mber stored in &|
00000ea0  45 46 20 69 73 20 6e 6f  74 20 31 30 30 20 74 68  |EF is not 100 th|
00000eb0  65 0d 61 63 63 75 6d 75  6c 61 74 6f 72 20 69 73  |e.accumulator is|
00000ec0  20 70 75 6c 6c 65 64 20  6f 66 66 20 74 68 65 20  | pulled off the |
00000ed0  73 74 61 63 6b 20 61 6e  64 20 63 6f 6e 74 72 6f  |stack and contro|
00000ee0  6c 20 69 73 20 72 65 74  75 72 6e 65 64 20 74 6f  |l is returned to|
00000ef0  20 74 68 65 20 4d 4f 53  2e 0d 49 66 20 69 74 20  | the MOS..If it |
00000f00  69 73 20 31 30 30 20 74  68 65 6e 20 74 68 65 20  |is 100 then the |
00000f10  6e 65 77 20 72 6f 75 74  69 6e 65 20 63 61 6e 20  |new routine can |
00000f20  62 65 20 65 78 65 63 75  74 65 64 2e 20 54 68 65  |be executed. The|
00000f30  20 61 64 64 72 65 73 73  20 6f 66 20 74 68 65 0d  | address of the.|
00000f40  70 61 72 61 6d 65 74 65  72 20 62 6c 6f 63 6b 20  |parameter block |
00000f50  63 61 6e 20 62 65 20 72  65 61 64 20 66 72 6f 6d  |can be read from|
00000f60  20 26 46 30 20 28 6c 6f  77 20 62 79 74 65 29 20  | &F0 (low byte) |
00000f70  61 6e 64 20 26 46 31 20  28 68 69 67 68 20 62 79  |and &F1 (high by|
00000f80  74 65 29 2e 20 54 68 65  0d 70 61 72 61 6d 65 74  |te). The.paramet|
00000f90  65 72 20 62 6c 6f 63 6b  20 6d 75 73 74 20 62 65  |er block must be|
00000fa0  20 69 6e 20 74 68 65 20  49 2f 4f 20 70 72 6f 63  | in the I/O proc|
00000fb0  65 73 73 6f 72 2e 0d 0d  20 20 41 66 74 65 72 20  |essor...  After |
00000fc0  63 6f 6d 70 6c 65 74 69  6e 67 20 74 68 65 20 6e  |completing the n|
00000fd0  65 77 20 72 6f 75 74 69  6e 65 20 79 6f 75 20 73  |ew routine you s|
00000fe0  68 6f 75 6c 64 20 65 6e  73 75 72 65 20 74 68 61  |hould ensure tha|
00000ff0  74 20 74 68 65 20 69 6e  64 65 78 0d 72 65 67 69  |t the index.regi|
00001000  73 74 65 72 73 20 61 6e  64 20 74 68 65 69 72 20  |sters and their |
00001010  7a 65 72 6f 20 70 61 67  65 20 63 6f 70 69 65 73  |zero page copies|
00001020  20 61 72 65 20 69 64 65  6e 74 69 63 61 6c 2e 20  | are identical. |
00001030  49 6e 20 66 69 67 75 72  65 20 37 2e 32 20 69 74  |In figure 7.2 it|
00001040  20 69 73 0d 61 73 73 75  6d 65 64 20 74 68 61 74  | is.assumed that|
00001050  20 74 68 65 20 63 6f 6e  74 65 6e 74 73 20 6f 66  | the contents of|
00001060  20 26 45 46 2c 20 26 46  30 20 61 6e 64 20 26 46  | &EF, &F0 and &F|
00001070  31 20 68 61 76 65 20 6e  6f 74 20 62 65 65 6e 20  |1 have not been |
00001080  61 6c 74 65 72 65 64 2e  20 54 68 65 0d 61 63 63  |altered. The.acc|
00001090  75 6d 75 6c 61 74 6f 72  20 77 61 73 20 70 75 73  |umulator was pus|
000010a0  68 65 64 20 6f 6e 20 74  68 65 20 73 74 61 63 6b  |hed on the stack|
000010b0  20 62 79 20 74 68 65 20  69 6e 74 65 72 70 72 65  | by the interpre|
000010c0  74 65 72 20 61 6e 64 20  69 74 20 69 73 20 70 75  |ter and it is pu|
000010d0  6c 6c 65 64 0d 62 61 63  6b 20 6f 66 66 20 74 6f  |lled.back off to|
000010e0  20 62 61 6c 61 6e 63 65  20 74 68 65 20 73 74 61  | balance the sta|
000010f0  63 6b 2e 20 54 68 65 20  61 63 63 75 6d 75 6c 61  |ck. The accumula|
00001100  74 6f 72 20 69 73 20 72  65 73 65 74 20 74 6f 20  |tor is reset to |
00001110  7a 65 72 6f 20 74 6f 0d  69 6e 66 6f 72 6d 20 6f  |zero to.inform o|
00001120  74 68 65 72 20 72 6f 6d  73 20 74 68 61 74 20 74  |ther roms that t|
00001130  68 65 20 73 65 72 76 69  63 65 20 63 61 6c 6c 20  |he service call |
00001140  68 61 73 20 62 65 65 6e  20 72 65 63 6f 67 6e 69  |has been recogni|
00001150  73 65 64 20 61 6e 64 20  63 6f 6e 74 72 6f 6c 0d  |sed and control.|
00001160  69 73 20 72 65 74 75 72  6e 65 64 20 74 6f 20 74  |is returned to t|
00001170  68 65 20 4d 4f 53 2e 20  4f 6e 20 72 65 74 75 72  |he MOS. On retur|
00001180  6e 20 74 68 65 20 4d 4f  53 20 63 6f 70 69 65 73  |n the MOS copies|
00001190  20 74 68 65 20 4f 73 77  6f 72 64 20 6e 75 6d 62  | the Osword numb|
000011a0  65 72 20 69 6e 74 6f 0d  74 68 65 20 61 63 63 75  |er into.the accu|
000011b0  6d 75 6c 61 74 6f 72 2e  0d 0d 20 20 55 6e 6c 69  |mulator...  Unli|
000011c0  6b 65 20 4f 73 62 79 74  65 2c 20 4f 73 77 6f 72  |ke Osbyte, Oswor|
000011d0  64 20 64 6f 65 73 20 6e  6f 74 20 75 73 65 20 26  |d does not use &|
000011e0  46 30 20 61 6e 64 20 26  46 31 20 74 6f 20 77 72  |F0 and &F1 to wr|
000011f0  69 74 65 20 61 6e 79 20  72 65 73 75 6c 74 73 2e  |ite any results.|
00001200  0d 49 66 20 79 6f 75 72  20 6e 65 77 20 72 6f 75  |.If your new rou|
00001210  74 69 6e 65 73 20 77 72  69 74 65 20 61 6e 79 20  |tines write any |
00001220  72 65 73 75 6c 74 73 20  74 68 65 73 65 20 6d 75  |results these mu|
00001230  73 74 20 62 65 20 77 72  69 74 74 65 6e 20 69 6e  |st be written in|
00001240  20 74 68 65 0d 70 61 72  61 6d 65 74 65 72 20 62  | the.parameter b|
00001250  6c 6f 63 6b 2e 20 26 45  46 2c 20 26 46 30 20 61  |lock. &EF, &F0 a|
00001260  6e 64 20 26 46 31 20 73  68 6f 75 6c 64 20 62 65  |nd &F1 should be|
00001270  20 72 65 73 74 6f 72 65  64 20 62 65 66 6f 72 65  | restored before|
00001280  20 72 65 74 75 72 6e 69  6e 67 0d 66 72 6f 6d 20  | returning.from |
00001290  4f 73 77 6f 72 64 2e 0d  0d 20 20 54 68 65 20 70  |Osword...  The p|
000012a0  72 6f 67 72 61 6d 20 4f  53 57 4f 52 44 20 75 73  |rogram OSWORD us|
000012b0  65 73 20 61 6e 20 69 6e  74 65 72 70 72 65 74 65  |es an interprete|
000012c0  72 20 73 69 6d 69 6c 61  72 20 74 6f 20 74 68 65  |r similar to the|
000012d0  20 6f 6e 65 20 6f 75 74  6c 69 6e 65 64 20 69 6e  | one outlined in|
000012e0  0d 66 69 67 75 72 65 20  37 2e 32 20 74 6f 20 69  |.figure 7.2 to i|
000012f0  6d 70 6c 65 6d 65 6e 74  20 61 20 50 52 49 4e 54  |mplement a PRINT|
00001300  20 54 41 42 28 58 2c 59  29 20 72 6f 75 74 69 6e  | TAB(X,Y) routin|
00001310  65 20 61 73 20 4f 73 77  6f 72 64 20 31 30 30 20  |e as Osword 100 |
00001320  28 26 36 34 29 2e 0d 54  68 69 73 20 72 6f 75 74  |(&64)..This rout|
00001330  69 6e 65 20 67 69 76 65  73 20 61 63 63 65 73 73  |ine gives access|
00001340  20 74 6f 20 50 52 49 4e  54 20 54 41 42 20 69 6e  | to PRINT TAB in|
00001350  20 62 6f 74 68 20 42 41  53 49 43 20 61 6e 64 20  | both BASIC and |
00001360  6d 61 63 68 69 6e 65 20  63 6f 64 65 2e 0d 0d 20  |machine code... |
00001370  20 54 6f 20 75 73 65 20  74 68 65 20 6e 65 77 20  | To use the new |
00001380  4f 73 77 6f 72 64 20 79  6f 75 20 6e 65 65 64 20  |Osword you need |
00001390  74 6f 20 6c 6f 61 64 20  74 68 65 20 6f 62 6a 65  |to load the obje|
000013a0  63 74 20 63 6f 64 65 20  67 65 6e 65 72 61 74 65  |ct code generate|
000013b0  64 20 62 79 0d 74 68 65  20 70 72 6f 67 72 61 6d  |d by.the program|
000013c0  20 4f 53 57 4f 52 44 20  69 6e 74 6f 20 53 57 52  | OSWORD into SWR|
000013d0  20 61 6e 64 20 70 72 65  73 73 20 74 68 65 20 42  | and press the B|
000013e0  72 65 61 6b 20 6b 65 79  2e 20 41 6e 79 20 70 72  |reak key. Any pr|
000013f0  6f 67 72 61 6d 20 77 68  69 63 68 0d 75 73 65 73  |ogram which.uses|
00001400  20 74 68 65 20 6e 65 77  20 72 6f 75 74 69 6e 65  | the new routine|
00001410  20 6d 75 73 74 20 64 65  66 69 6e 65 20 61 20 70  | must define a p|
00001420  61 72 61 6d 65 74 65 72  20 62 6c 6f 63 6b 20 74  |arameter block t|
00001430  6f 20 63 6f 6e 74 61 69  6e 20 74 68 65 20 74 77  |o contain the tw|
00001440  6f 0d 62 79 74 65 20 61  64 64 72 65 73 73 20 6f  |o.byte address o|
00001450  66 20 61 20 74 65 78 74  20 73 74 72 69 6e 67 20  |f a text string |
00001460  61 6e 64 20 74 68 65 20  74 77 6f 20 62 79 74 65  |and the two byte|
00001470  73 20 66 6f 72 20 74 68  65 20 73 63 72 65 65 6e  |s for the screen|
00001480  20 58 20 61 6e 64 20 59  0d 63 6f 2d 6f 72 64 69  | X and Y.co-ordi|
00001490  6e 61 74 65 73 20 6f 66  20 74 68 65 20 66 69 72  |nates of the fir|
000014a0  73 74 20 63 68 61 72 61  63 74 65 72 20 6f 66 20  |st character of |
000014b0  74 68 65 20 73 74 72 69  6e 67 2e 20 42 65 63 61  |the string. Beca|
000014c0  75 73 65 20 66 6f 75 72  20 62 79 74 65 73 20 6f  |use four bytes o|
000014d0  66 0d 69 6e 66 6f 72 6d  61 74 69 6f 6e 20 61 72  |f.information ar|
000014e0  65 20 6e 65 65 64 65 64  20 66 6f 72 20 74 68 69  |e needed for thi|
000014f0  73 20 72 6f 75 74 69 6e  65 20 61 6e 20 4f 73 62  |s routine an Osb|
00001500  79 74 65 20 63 6f 75 6c  64 20 6e 6f 74 20 62 65  |yte could not be|
00001510  20 75 73 65 64 2e 20 54  68 65 0d 70 72 6f 67 72  | used. The.progr|
00001520  6d 20 4f 53 57 44 45 4d  4f 20 73 68 6f 77 73 20  |m OSWDEMO shows |
00001530  68 6f 77 20 74 6f 20 73  65 74 20 75 70 20 74 68  |how to set up th|
00001540  65 20 70 61 72 61 6d 65  74 65 72 20 62 6c 6f 63  |e parameter bloc|
00001550  6b 20 69 6e 20 41 73 73  65 6d 62 6c 79 0d 6c 61  |k in Assembly.la|
00001560  6e 67 75 61 67 65 2e 0d  0d 0d 0d 0d 20 20 20 31  |nguage......   1|
00001570  30 20 52 45 4d 20 20 4f  53 57 44 45 4d 4f 0d 20  |0 REM  OSWDEMO. |
00001580  20 20 32 30 20 4d 4f 44  45 37 0d 20 20 20 33 30  |  20 MODE7.   30|
00001590  20 44 49 4d 20 6d 63 6f  64 65 20 26 31 30 30 0d  | DIM mcode &100.|
000015a0  20 20 20 34 30 20 6f 73  77 6f 72 64 3d 26 46 46  |   40 osword=&FF|
000015b0  46 31 0d 20 20 20 35 30  20 46 4f 52 20 70 61 73  |F1.   50 FOR pas|
000015c0  73 3d 30 20 54 4f 20 32  20 53 54 45 50 20 32 0d  |s=0 TO 2 STEP 2.|
000015d0  20 20 20 36 30 20 50 25  3d 6d 63 6f 64 65 0d 20  |   60 P%=mcode. |
000015e0  20 20 37 30 20 5b 20 20  20 20 20 20 20 4f 50 54  |  70 [       OPT|
000015f0  20 70 61 73 73 0d 20 20  20 38 30 20 20 20 20 20  | pass.   80     |
00001600  20 20 20 20 4c 44 41 20  23 31 30 30 0d 20 20 20  |    LDA #100.   |
00001610  39 30 20 20 20 20 20 20  20 20 20 4c 44 58 20 23  |90         LDX #|
00001620  70 62 6c 6f 63 6b 20 4d  4f 44 20 32 35 36 0d 20  |pblock MOD 256. |
00001630  20 31 30 30 20 20 20 20  20 20 20 20 20 4c 44 59  | 100         LDY|
00001640  20 23 70 62 6c 6f 63 6b  20 44 49 56 20 32 35 36  | #pblock DIV 256|
00001650  0d 20 20 31 31 30 20 20  20 20 20 20 20 20 20 4a  |.  110         J|
00001660  53 52 20 6f 73 77 6f 72  64 0d 20 20 31 32 30 20  |SR osword.  120 |
00001670  20 20 20 20 20 20 20 20  4c 44 41 20 23 31 30 30  |        LDA #100|
00001680  0d 20 20 31 33 30 20 20  20 20 20 20 20 20 20 4c  |.  130         L|
00001690  44 58 20 23 70 62 6c 6f  63 6b 32 20 4d 4f 44 20  |DX #pblock2 MOD |
000016a0  32 35 36 0d 20 20 31 34  30 20 20 20 20 20 20 20  |256.  140       |
000016b0  20 20 4c 44 59 20 23 70  62 6c 6f 63 6b 32 20 44  |  LDY #pblock2 D|
000016c0  49 56 20 32 35 36 0d 20  20 31 35 30 20 20 20 20  |IV 256.  150    |
000016d0  20 20 20 20 20 4a 53 52  20 6f 73 77 6f 72 64 0d  |     JSR osword.|
000016e0  20 20 31 36 30 20 20 20  20 20 20 20 20 20 52 54  |  160         RT|
000016f0  53 0d 20 20 31 37 30 20  2e 70 62 6c 6f 63 6b 0d  |S.  170 .pblock.|
00001700  20 20 31 38 30 20 20 20  20 20 20 20 20 20 4f 50  |  180         OP|
00001710  54 20 46 4e 65 71 75 77  28 74 65 78 74 29 0d 20  |T FNequw(text). |
00001720  20 31 39 30 20 20 20 20  20 20 20 20 20 4f 50 54  | 190         OPT|
00001730  20 46 4e 65 71 75 62 28  35 29 0d 20 20 32 30 30  | FNequb(5).  200|
00001740  20 20 20 20 20 20 20 20  20 4f 50 54 20 46 4e 65  |         OPT FNe|
00001750  71 75 62 28 31 31 29 0d  20 20 32 31 30 20 2e 70  |qub(11).  210 .p|
00001760  62 6c 6f 63 6b 32 0d 20  20 32 32 30 20 20 20 20  |block2.  220    |
00001770  20 20 20 20 20 4f 50 54  20 46 4e 65 71 75 77 28  |     OPT FNequw(|
00001780  74 65 78 74 29 0d 20 20  32 33 30 20 20 20 20 20  |text).  230     |
00001790  20 20 20 20 4f 50 54 20  46 4e 65 71 75 62 28 35  |    OPT FNequb(5|
000017a0  29 0d 20 20 32 34 30 20  20 20 20 20 20 20 20 20  |).  240         |
000017b0  4f 50 54 20 46 4e 65 71  75 62 28 31 32 29 0d 20  |OPT FNequb(12). |
000017c0  20 32 35 30 20 2e 74 65  78 74 0d 20 20 32 36 30  | 250 .text.  260|
000017d0  20 20 20 20 20 20 20 20  20 4f 50 54 20 46 4e 65  |         OPT FNe|
000017e0  71 75 62 28 31 34 31 29  0d 20 20 32 37 30 20 20  |qub(141).  270  |
000017f0  20 20 20 20 20 20 20 4f  50 54 20 46 4e 65 71 75  |       OPT FNequ|
00001800  62 28 31 33 31 29 0d 20  20 32 38 30 20 20 20 20  |b(131).  280    |
00001810  20 20 20 20 20 4f 50 54  20 46 4e 65 71 75 73 28  |     OPT FNequs(|
00001820  22 44 65 6d 6f 6e 73 74  72 61 74 69 6f 6e 20 6f  |"Demonstration o|
00001830  66 20 6e 65 77 20 4f 73  77 6f 72 64 22 29 0d 20  |f new Osword"). |
00001840  20 32 39 30 20 20 20 20  20 20 20 20 20 4f 50 54  | 290         OPT|
00001850  20 46 4e 65 71 75 62 28  31 33 29 0d 20 20 33 30  | FNequb(13).  30|
00001860  30 20 5d 0d 20 20 33 31  30 20 4e 45 58 54 0d 20  |0 ].  310 NEXT. |
00001870  20 33 32 30 20 43 41 4c  4c 20 6d 63 6f 64 65 0d  | 320 CALL mcode.|
00001880  20 20 33 33 30 20 45 4e  44 0d 20 20 33 34 30 20  |  330 END.  340 |
00001890  44 45 46 46 4e 65 71 75  62 28 62 79 74 65 29 0d  |DEFFNequb(byte).|
000018a0  20 20 33 35 30 20 3f 50  25 3d 62 79 74 65 0d 20  |  350 ?P%=byte. |
000018b0  20 33 36 30 20 50 25 3d  50 25 2b 31 0d 20 20 33  | 360 P%=P%+1.  3|
000018c0  37 30 20 3d 70 61 73 73  0d 20 20 33 38 30 20 44  |70 =pass.  380 D|
000018d0  45 46 46 4e 65 71 75 77  28 77 6f 72 64 29 0d 20  |EFFNequw(word). |
000018e0  20 33 39 30 20 3f 50 25  3d 77 6f 72 64 20 4d 4f  | 390 ?P%=word MO|
000018f0  44 20 32 35 36 0d 20 20  34 30 30 20 50 25 3f 31  |D 256.  400 P%?1|
00001900  3d 77 6f 72 64 20 44 49  56 20 32 35 36 0d 20 20  |=word DIV 256.  |
00001910  34 31 30 20 50 25 3d 50  25 2b 32 0d 20 20 34 32  |410 P%=P%+2.  42|
00001920  30 20 3d 70 61 73 73 0d  20 20 34 33 30 20 44 45  |0 =pass.  430 DE|
00001930  46 46 4e 65 71 75 64 28  64 6f 75 62 6c 65 29 0d  |FFNequd(double).|
00001940  20 20 34 34 30 20 21 50  25 3d 64 6f 75 62 6c 65  |  440 !P%=double|
00001950  0d 20 20 34 35 30 20 50  25 3d 50 25 2b 34 0d 20  |.  450 P%=P%+4. |
00001960  20 34 36 30 20 3d 70 61  73 73 0d 20 20 34 37 30  | 460 =pass.  470|
00001970  20 44 45 46 46 4e 65 71  75 73 28 73 74 72 69 6e  | DEFFNequs(strin|
00001980  67 24 29 0d 20 20 34 38  30 20 24 50 25 3d 73 74  |g$).  480 $P%=st|
00001990  72 69 6e 67 24 0d 20 20  34 39 30 20 50 25 3d 50  |ring$.  490 P%=P|
000019a0  25 2b 4c 45 4e 28 73 74  72 69 6e 67 24 29 0d 20  |%+LEN(string$). |
000019b0  20 35 30 30 20 3d 70 61  73 73 0d 0d 0d 0d 0d 0d  | 500 =pass......|
000019c0  20 20 54 68 65 20 6e 65  77 20 4f 73 77 6f 72 64  |  The new Osword|
000019d0  20 31 30 30 20 63 61 6e  20 62 65 20 75 73 65 64  | 100 can be used|
000019e0  20 69 6e 20 61 6e 79 20  74 65 78 74 20 6d 6f 64  | in any text mod|
000019f0  65 20 62 75 74 20 4f 53  57 44 45 4d 4f 20 75 73  |e but OSWDEMO us|
00001a00  65 73 20 69 74 20 74 6f  0d 70 72 69 6e 74 20 61  |es it to.print a|
00001a10  20 73 74 72 69 6e 67 20  69 6e 20 64 6f 75 62 6c  | string in doubl|
00001a20  65 20 68 65 69 67 68 74  2c 20 79 65 6c 6c 6f 77  |e height, yellow|
00001a30  2c 20 4d 6f 64 65 20 37  20 63 68 61 72 61 63 74  |, Mode 7 charact|
00001a40  65 72 73 2e 20 4f 53 57  44 45 4d 4f 20 6d 75 73  |ers. OSWDEMO mus|
00001a50  74 0d 72 75 6e 20 69 6e  20 74 68 65 20 49 2f 4f  |t.run in the I/O|
00001a60  20 70 72 6f 63 65 73 73  6f 72 2e 0d 0d 20 20 54  | processor...  T|
00001a70  68 65 20 66 69 72 73 74  20 74 77 6f 20 62 79 74  |he first two byt|
00001a80  65 73 20 6f 66 20 74 68  65 20 70 61 72 61 6d 65  |es of the parame|
00001a90  74 65 72 20 62 6c 6f 63  6b 73 20 73 74 6f 72 65  |ter blocks store|
00001aa0  20 74 68 65 20 61 64 64  72 65 73 73 20 6f 66 20  | the address of |
00001ab0  74 68 65 0d 74 65 78 74  20 62 6c 6f 63 6b 20 28  |the.text block (|
00001ac0  6c 69 6e 65 73 20 31 38  30 20 61 6e 64 20 32 32  |lines 180 and 22|
00001ad0  30 29 2e 20 54 68 65 20  74 68 69 72 64 20 62 79  |0). The third by|
00001ae0  74 65 20 6f 66 20 74 68  65 20 70 61 72 61 6d 65  |te of the parame|
00001af0  74 65 72 20 62 6c 6f 63  6b 73 0d 73 74 6f 72 65  |ter blocks.store|
00001b00  20 74 68 65 20 73 63 72  65 65 6e 20 58 20 63 6f  | the screen X co|
00001b10  2d 6f 72 64 69 6e 61 74  65 20 6f 66 20 74 68 65  |-ordinate of the|
00001b20  20 66 69 72 73 74 20 62  79 74 65 20 6f 66 20 74  | first byte of t|
00001b30  68 65 20 73 74 72 69 6e  67 20 28 6c 69 6e 65 73  |he string (lines|
00001b40  0d 31 39 30 20 61 6e 64  20 32 33 30 29 20 61 6e  |.190 and 230) an|
00001b50  64 20 74 68 65 20 66 6f  75 72 74 68 20 62 79 74  |d the fourth byt|
00001b60  65 20 73 74 6f 72 65 73  20 74 68 65 20 73 63 72  |e stores the scr|
00001b70  65 65 6e 20 59 20 63 6f  2d 6f 72 64 69 6e 61 74  |een Y co-ordinat|
00001b80  65 20 6f 66 20 74 68 65  0d 66 69 72 73 74 20 62  |e of the.first b|
00001b90  79 74 65 20 6f 66 20 74  68 65 20 73 74 72 69 6e  |yte of the strin|
00001ba0  67 20 28 6c 69 6e 65 73  20 32 30 30 20 61 6e 64  |g (lines 200 and|
00001bb0  20 32 34 30 29 2e 0d 0d  20 20 42 65 66 6f 72 65  | 240)...  Before|
00001bc0  20 63 61 6c 6c 69 6e 67  20 74 68 65 20 6e 65 77  | calling the new|
00001bd0  20 4f 73 77 6f 72 64 20  28 6c 69 6e 65 73 20 31  | Osword (lines 1|
00001be0  31 30 20 61 6e 64 20 31  35 30 29 20 74 68 65 20  |10 and 150) the |
00001bf0  61 63 63 75 6d 75 6c 61  74 6f 72 20 69 73 0d 6c  |accumulator is.l|
00001c00  6f 61 64 65 64 20 77 69  74 68 20 74 68 65 20 6e  |oaded with the n|
00001c10  65 77 20 4f 73 77 6f 72  64 20 6e 75 6d 62 65 72  |ew Osword number|
00001c20  20 28 6c 69 6e 65 73 20  38 30 20 61 6e 64 20 31  | (lines 80 and 1|
00001c30  32 30 29 2c 20 74 68 65  20 58 20 72 65 67 69 73  |20), the X regis|
00001c40  74 65 72 0d 77 69 74 68  20 74 68 65 20 6c 6f 77  |ter.with the low|
00001c50  20 62 79 74 65 20 6f 66  20 74 68 65 20 70 61 72  | byte of the par|
00001c60  61 6d 65 74 65 72 20 62  6c 6f 63 6b 20 61 64 64  |ameter block add|
00001c70  72 65 73 73 20 28 6c 69  6e 65 73 20 39 30 20 61  |ress (lines 90 a|
00001c80  6e 64 20 31 33 30 29 2c  20 61 6e 64 0d 74 68 65  |nd 130), and.the|
00001c90  20 59 20 72 65 67 69 73  74 65 72 20 77 69 74 68  | Y register with|
00001ca0  20 74 68 65 20 68 69 67  68 20 62 79 74 65 20 6f  | the high byte o|
00001cb0  66 20 74 68 65 20 70 61  72 61 6d 65 74 65 72 20  |f the parameter |
00001cc0  62 6c 6f 63 6b 20 61 64  64 72 65 73 73 20 28 6c  |block address (l|
00001cd0  69 6e 65 73 0d 31 30 30  20 61 6e 64 20 31 34 30  |ines.100 and 140|
00001ce0  29 2e 20 4f 73 77 6f 72  64 20 31 30 30 20 70 72  |). Osword 100 pr|
00001cf0  69 6e 74 73 20 74 68 65  20 73 74 72 69 6e 67 20  |ints the string |
00001d00  6f 6e 20 74 68 65 20 73  63 72 65 65 6e 20 61 6e  |on the screen an|
00001d10  64 20 72 65 74 75 72 6e  73 0d 77 69 74 68 20 41  |d returns.with A|
00001d20  2c 20 58 20 61 6e 64 20  59 20 72 65 67 69 73 74  |, X and Y regist|
00001d30  65 72 73 20 70 72 65 73  65 72 76 65 64 2e 0d 0d  |ers preserved...|
00001d40  20 20 54 68 65 20 70 72  6f 67 72 61 6d 20 4f 53  |  The program OS|
00001d50  57 4f 52 44 20 75 73 65  73 20 61 6e 20 4f 73 77  |WORD uses an Osw|
00001d60  6f 72 64 20 69 6e 74 65  72 70 72 65 74 65 72 20  |ord interpreter |
00001d70  28 6c 69 6e 65 73 20 32  37 30 2d 33 37 30 29 20  |(lines 270-370) |
00001d80  73 69 6d 69 6c 61 72 0d  74 6f 20 74 68 65 20 6f  |similar.to the o|
00001d90  6e 65 20 6f 75 74 6c 69  6e 65 64 20 69 6e 20 66  |ne outlined in f|
00001da0  69 67 75 72 65 20 37 2e  32 2e 20 41 66 74 65 72  |igure 7.2. After|
00001db0  20 72 65 63 6f 67 6e 69  73 69 6e 67 20 74 68 65  | recognising the|
00001dc0  20 6e 65 77 20 4f 73 77  6f 72 64 0d 28 6c 69 6e  | new Osword.(lin|
00001dd0  65 73 20 33 35 30 2d 33  37 30 29 20 74 68 65 20  |es 350-370) the |
00001de0  6e 65 77 20 72 6f 75 74  69 6e 65 20 70 72 65 73  |new routine pres|
00001df0  65 72 76 65 73 20 74 68  65 20 74 77 6f 20 7a 65  |erves the two ze|
00001e00  72 6f 20 70 61 67 65 20  62 79 74 65 73 20 69 74  |ro page bytes it|
00001e10  0d 75 73 65 73 20 74 6f  20 70 72 69 6e 74 20 74  |.uses to print t|
00001e20  68 65 20 73 74 72 69 6e  67 20 62 79 20 70 75 73  |he string by pus|
00001e30  68 69 6e 67 20 74 68 65  6d 20 6f 6e 20 74 68 65  |hing them on the|
00001e40  20 73 74 61 63 6b 20 28  6c 69 6e 65 73 20 33 38  | stack (lines 38|
00001e50  30 2d 34 31 30 29 2e 0d  0d 20 20 54 68 65 20 61  |0-410)...  The a|
00001e60  64 64 72 65 73 73 20 6f  66 20 74 68 65 20 70 61  |ddress of the pa|
00001e70  72 61 6d 65 74 65 72 20  62 6c 6f 63 6b 20 69 73  |rameter block is|
00001e80  20 73 74 6f 72 65 64 20  69 6e 20 26 46 30 20 28  | stored in &F0 (|
00001e90  6c 6f 77 20 62 79 74 65  29 20 61 6e 64 20 26 46  |low byte) and &F|
00001ea0  31 0d 28 68 69 67 68 20  62 79 74 65 29 2e 20 54  |1.(high byte). T|
00001eb0  68 65 73 65 20 74 77 6f  20 7a 65 72 6f 20 70 61  |hese two zero pa|
00001ec0  67 65 20 6d 65 6d 6f 72  79 20 6c 6f 63 61 74 69  |ge memory locati|
00001ed0  6f 6e 73 20 61 72 65 20  75 73 65 64 20 77 69 74  |ons are used wit|
00001ee0  68 0d 70 6f 73 74 2d 69  6e 64 65 78 65 64 20 69  |h.post-indexed i|
00001ef0  6e 64 69 72 65 63 74 20  61 64 64 72 65 73 73 69  |ndirect addressi|
00001f00  6e 67 20 74 6f 20 72 65  61 64 20 74 68 65 20 63  |ng to read the c|
00001f10  6f 6e 74 65 6e 74 73 20  6f 66 20 74 68 65 20 70  |ontents of the p|
00001f20  61 72 61 6d 65 74 65 72  0d 62 6c 6f 63 6b 2e 20  |arameter.block. |
00001f30  54 68 65 20 59 20 72 65  67 69 73 74 65 72 20 69  |The Y register i|
00001f40  73 20 72 65 73 65 74 20  74 6f 20 7a 65 72 6f 20  |s reset to zero |
00001f50  28 6c 69 6e 65 20 34 32  30 29 20 61 6e 64 20 74  |(line 420) and t|
00001f60  68 65 20 61 64 64 72 65  73 73 20 6f 66 20 74 68  |he address of th|
00001f70  65 0d 74 65 78 74 20 62  6c 6f 63 6b 20 69 73 20  |e.text block is |
00001f80  72 65 61 64 20 66 72 6f  6d 20 74 68 65 20 70 61  |read from the pa|
00001f90  72 61 6d 65 74 65 72 20  62 6c 6f 63 6b 20 61 6e  |rameter block an|
00001fa0  64 20 73 74 6f 72 65 64  20 69 6e 20 7a 65 72 6f  |d stored in zero|
00001fb0  20 70 61 67 65 0d 72 65  61 64 79 20 74 6f 20 70  | page.ready to p|
00001fc0  72 69 6e 74 20 74 68 65  20 74 65 78 74 20 73 74  |rint the text st|
00001fd0  72 69 6e 67 20 28 6c 69  6e 65 73 20 34 33 30 2d  |ring (lines 430-|
00001fe0  34 37 30 29 2e 20 54 68  65 20 73 63 72 65 65 6e  |470). The screen|
00001ff0  20 58 20 61 6e 64 20 59  0d 63 6f 2d 6f 72 64 69  | X and Y.co-ordi|
00002000  6e 61 74 65 73 20 61 72  65 20 72 65 61 64 20 66  |nates are read f|
00002010  72 6f 6d 20 74 68 65 20  70 61 72 61 6d 65 74 65  |rom the paramete|
00002020  72 20 62 6c 6f 63 6b 20  61 6e 64 20 74 68 65 20  |r block and the |
00002030  74 65 78 74 20 63 75 72  73 6f 72 20 69 73 0d 70  |text cursor is.p|
00002040  6f 73 69 74 69 6f 6e 65  64 20 75 73 69 6e 67 20  |ositioned using |
00002050  74 68 65 20 6d 61 63 68  69 6e 65 20 63 6f 64 65  |the machine code|
00002060  20 65 71 75 69 76 61 6c  65 6e 74 20 6f 66 20 56  | equivalent of V|
00002070  44 55 20 33 31 2c 78 2c  79 20 28 6c 69 6e 65 73  |DU 31,x,y (lines|
00002080  0d 34 38 30 2d 35 35 30  29 2e 20 54 68 65 20 74  |.480-550). The t|
00002090  65 78 74 20 73 74 72 69  6e 67 20 69 73 20 74 68  |ext string is th|
000020a0  65 6e 20 70 72 69 6e 74  65 64 20 6f 6e 20 74 68  |en printed on th|
000020b0  65 20 73 63 72 65 65 6e  20 28 6c 69 6e 65 73 20  |e screen (lines |
000020c0  35 36 30 2d 36 34 30 29  2e 0d 0d 20 20 54 68 65  |560-640)...  The|
000020d0  20 7a 65 72 6f 20 70 61  67 65 20 6c 6f 63 61 74  | zero page locat|
000020e0  69 6f 6e 73 20 75 73 65  64 20 62 79 20 74 68 65  |ions used by the|
000020f0  20 70 72 69 6e 74 20 72  6f 75 74 69 6e 65 20 61  | print routine a|
00002100  72 65 20 70 75 6c 6c 65  64 20 6f 66 66 20 74 68  |re pulled off th|
00002110  65 0d 73 74 61 63 6b 20  61 6e 64 20 72 65 73 74  |e.stack and rest|
00002120  6f 72 65 64 20 28 6c 69  6e 65 73 20 36 35 30 2d  |ored (lines 650-|
00002130  36 38 30 29 2e 20 54 68  65 20 69 6e 64 65 78 20  |680). The index |
00002140  72 65 67 69 73 74 65 72  73 20 61 72 65 20 72 65  |registers are re|
00002150  73 74 6f 72 65 64 0d 28  6c 69 6e 65 73 20 36 39  |stored.(lines 69|
00002160  30 2d 37 30 30 29 2c 20  74 68 65 20 61 63 63 75  |0-700), the accu|
00002170  6d 75 6c 61 74 6f 72 20  69 73 20 72 65 73 65 74  |mulator is reset|
00002180  20 74 6f 20 7a 65 72 6f  20 74 6f 20 69 6e 66 6f  | to zero to info|
00002190  72 6d 20 74 68 65 20 6f  74 68 65 72 0d 72 6f 6d  |rm the other.rom|
000021a0  73 20 74 68 61 74 20 74  68 65 20 73 65 72 76 69  |s that the servi|
000021b0  63 65 20 63 61 6c 6c 20  68 61 73 20 62 65 65 6e  |ce call has been|
000021c0  20 72 65 63 6f 67 6e 69  73 65 64 20 28 6c 69 6e  | recognised (lin|
000021d0  65 73 20 37 31 30 2d 37  32 30 29 20 61 6e 64 0d  |es 710-720) and.|
000021e0  63 6f 6e 74 6f 6c 20 69  73 20 72 65 74 75 72 6e  |contol is return|
000021f0  65 64 20 74 6f 20 74 68  65 20 4d 4f 53 20 28 6c  |ed to the MOS (l|
00002200  69 6e 65 20 37 33 30 29  2e 0d 0d 0d 0d 0d 0d 20  |ine 730)....... |
00002210  20 20 31 30 20 52 45 4d  3a 20 4f 53 57 4f 52 44  |  10 REM: OSWORD|
00002220  0d 20 20 20 32 30 20 4d  4f 44 45 37 0d 20 20 20  |.   20 MODE7.   |
00002230  33 30 20 48 49 4d 45 4d  3d 26 33 43 30 30 0d 20  |30 HIMEM=&3C00. |
00002240  20 20 34 30 20 44 49 4d  20 73 61 76 65 20 35 30  |  40 DIM save 50|
00002250  0d 20 20 20 35 30 20 64  69 66 66 3d 26 38 30 30  |.   50 diff=&800|
00002260  30 2d 48 49 4d 45 4d 0d  20 20 20 36 30 20 61 64  |0-HIMEM.   60 ad|
00002270  64 72 65 73 73 3d 26 37  30 0d 20 20 20 37 30 20  |dress=&70.   70 |
00002280  61 63 63 75 6d 75 6c 61  74 6f 72 3d 26 45 46 0d  |accumulator=&EF.|
00002290  20 20 20 38 30 20 78 72  65 67 69 73 74 65 72 3d  |   80 xregister=|
000022a0  26 46 30 0d 20 20 20 39  30 20 79 72 65 67 69 73  |&F0.   90 yregis|
000022b0  74 65 72 3d 26 46 31 0d  20 20 31 30 30 20 6f 73  |ter=&F1.  100 os|
000022c0  61 73 63 69 3d 26 46 46  45 33 0d 20 20 31 31 30  |asci=&FFE3.  110|
000022d0  20 6f 73 63 6c 69 3d 26  46 46 46 37 0d 20 20 31  | oscli=&FFF7.  1|
000022e0  32 30 20 46 4f 52 20 70  61 73 73 20 3d 20 30 20  |20 FOR pass = 0 |
000022f0  54 4f 20 32 20 53 54 45  50 20 32 0d 20 20 31 33  |TO 2 STEP 2.  13|
00002300  30 20 50 25 3d 48 49 4d  45 4d 0d 20 20 31 34 30  |0 P%=HIMEM.  140|
00002310  20 5b 20 20 20 20 20 20  20 4f 50 54 20 70 61 73  | [       OPT pas|
00002320  73 0d 20 20 31 35 30 20  20 20 20 20 20 20 20 20  |s.  150         |
00002330  42 52 4b 0d 20 20 31 36  30 20 20 20 20 20 20 20  |BRK.  160       |
00002340  20 20 42 52 4b 0d 20 20  31 37 30 20 20 20 20 20  |  BRK.  170     |
00002350  20 20 20 20 42 52 4b 0d  20 20 31 38 30 20 20 20  |    BRK.  180   |
00002360  20 20 20 20 20 20 4a 4d  50 20 73 65 72 76 69 63  |      JMP servic|
00002370  65 2b 64 69 66 66 0d 20  20 31 39 30 20 20 20 20  |e+diff.  190    |
00002380  20 20 20 20 20 4f 50 54  20 46 4e 65 71 75 62 28  |     OPT FNequb(|
00002390  26 38 32 29 0d 20 20 32  30 30 20 20 20 20 20 20  |&82).  200      |
000023a0  20 20 20 4f 50 54 20 46  4e 65 71 75 62 28 28 63  |   OPT FNequb((c|
000023b0  6f 70 79 72 69 67 68 74  2b 64 69 66 66 29 20 4d  |opyright+diff) M|
000023c0  4f 44 20 32 35 36 29 0d  20 20 32 31 30 20 20 20  |OD 256).  210   |
000023d0  20 20 20 20 20 20 42 52  4b 0d 20 20 32 32 30 20  |      BRK.  220 |
000023e0  20 20 20 20 20 20 20 20  4f 50 54 20 46 4e 65 71  |        OPT FNeq|
000023f0  75 73 28 22 4f 53 57 4f  52 44 22 29 0d 20 20 32  |us("OSWORD").  2|
00002400  33 30 20 2e 63 6f 70 79  72 69 67 68 74 0d 20 20  |30 .copyright.  |
00002410  32 34 30 20 20 20 20 20  20 20 20 20 42 52 4b 0d  |240         BRK.|
00002420  20 20 32 35 30 20 20 20  20 20 20 20 20 20 4f 50  |  250         OP|
00002430  54 20 46 4e 65 71 75 73  28 22 28 43 29 20 47 6f  |T FNequs("(C) Go|
00002440  72 64 6f 6e 20 48 6f 72  73 69 6e 67 74 6f 6e 20  |rdon Horsington |
00002450  31 39 38 37 22 29 0d 20  20 32 36 30 20 20 20 20  |1987").  260    |
00002460  20 20 20 20 20 42 52 4b  0d 20 20 32 37 30 20 2e  |     BRK.  270 .|
00002470  73 65 72 76 69 63 65 0d  20 20 32 38 30 20 20 20  |service.  280   |
00002480  20 20 20 20 20 20 50 48  41 0d 20 20 32 39 30 20  |      PHA.  290 |
00002490  20 20 20 20 20 20 20 20  43 4d 50 20 23 38 0d 20  |        CMP #8. |
000024a0  20 33 30 30 20 20 20 20  20 20 20 20 20 42 45 51  | 300         BEQ|
000024b0  20 6e 65 77 6f 73 77 6f  72 64 0d 20 20 33 31 30  | newosword.  310|
000024c0  20 2e 65 78 69 74 0d 20  20 33 32 30 20 20 20 20  | .exit.  320    |
000024d0  20 20 20 20 20 50 4c 41  0d 20 20 33 33 30 20 20  |     PLA.  330  |
000024e0  20 20 20 20 20 20 20 52  54 53 0d 20 20 33 34 30  |       RTS.  340|
000024f0  20 2e 6e 65 77 6f 73 77  6f 72 64 0d 20 20 33 35  | .newosword.  35|
00002500  30 20 20 20 20 20 20 20  20 20 4c 44 41 20 61 63  |0         LDA ac|
00002510  63 75 6d 75 6c 61 74 6f  72 0d 20 20 33 36 30 20  |cumulator.  360 |
00002520  20 20 20 20 20 20 20 20  43 4d 50 20 23 31 30 30  |        CMP #100|
00002530  0d 20 20 33 37 30 20 20  20 20 20 20 20 20 20 42  |.  370         B|
00002540  4e 45 20 65 78 69 74 0d  20 20 33 38 30 20 20 20  |NE exit.  380   |
00002550  20 20 20 20 20 20 4c 44  41 20 61 64 64 72 65 73  |      LDA addres|
00002560  73 0d 20 20 33 39 30 20  20 20 20 20 20 20 20 20  |s.  390         |
00002570  50 48 41 0d 20 20 34 30  30 20 20 20 20 20 20 20  |PHA.  400       |
00002580  20 20 4c 44 41 20 61 64  64 72 65 73 73 2b 31 0d  |  LDA address+1.|
00002590  20 20 34 31 30 20 20 20  20 20 20 20 20 20 50 48  |  410         PH|
000025a0  41 0d 20 20 34 32 30 20  20 20 20 20 20 20 20 20  |A.  420         |
000025b0  4c 44 59 20 23 30 0d 20  20 34 33 30 20 20 20 20  |LDY #0.  430    |
000025c0  20 20 20 20 20 4c 44 41  20 28 78 72 65 67 69 73  |     LDA (xregis|
000025d0  74 65 72 29 2c 59 0d 20  20 34 34 30 20 20 20 20  |ter),Y.  440    |
000025e0  20 20 20 20 20 53 54 41  20 61 64 64 72 65 73 73  |     STA address|
000025f0  0d 20 20 34 35 30 20 20  20 20 20 20 20 20 20 49  |.  450         I|
00002600  4e 59 0d 20 20 34 36 30  20 20 20 20 20 20 20 20  |NY.  460        |
00002610  20 4c 44 41 20 28 78 72  65 67 69 73 74 65 72 29  | LDA (xregister)|
00002620  2c 59 0d 20 20 34 37 30  20 20 20 20 20 20 20 20  |,Y.  470        |
00002630  20 53 54 41 20 61 64 64  72 65 73 73 2b 31 0d 20  | STA address+1. |
00002640  20 34 38 30 20 20 20 20  20 20 20 20 20 4c 44 41  | 480         LDA|
00002650  20 23 33 31 0d 20 20 34  39 30 20 20 20 20 20 20  | #31.  490      |
00002660  20 20 20 4a 53 52 20 6f  73 61 73 63 69 0d 20 20  |   JSR osasci.  |
00002670  35 30 30 20 20 20 20 20  20 20 20 20 49 4e 59 0d  |500         INY.|
00002680  20 20 35 31 30 20 20 20  20 20 20 20 20 20 4c 44  |  510         LD|
00002690  41 20 28 78 72 65 67 69  73 74 65 72 29 2c 59 0d  |A (xregister),Y.|
000026a0  20 20 35 32 30 20 20 20  20 20 20 20 20 20 4a 53  |  520         JS|
000026b0  52 20 6f 73 61 73 63 69  0d 20 20 35 33 30 20 20  |R osasci.  530  |
000026c0  20 20 20 20 20 20 20 49  4e 59 0d 20 20 35 34 30  |       INY.  540|
000026d0  20 20 20 20 20 20 20 20  20 4c 44 41 20 28 78 72  |         LDA (xr|
000026e0  65 67 69 73 74 65 72 29  2c 59 0d 20 20 35 35 30  |egister),Y.  550|
000026f0  20 20 20 20 20 20 20 20  20 4a 53 52 20 6f 73 61  |         JSR osa|
00002700  73 63 69 0d 20 20 35 36  30 20 20 20 20 20 20 20  |sci.  560       |
00002710  20 20 4c 44 59 20 23 26  46 46 0d 20 20 35 37 30  |  LDY #&FF.  570|
00002720  20 2e 70 72 69 6e 74 6c  6f 6f 70 0d 20 20 35 38  | .printloop.  58|
00002730  30 20 20 20 20 20 20 20  20 20 49 4e 59 0d 20 20  |0         INY.  |
00002740  35 39 30 20 20 20 20 20  20 20 20 20 4c 44 41 20  |590         LDA |
00002750  28 61 64 64 72 65 73 73  29 2c 59 0d 20 20 36 30  |(address),Y.  60|
00002760  30 20 20 20 20 20 20 20  20 20 42 45 51 20 66 69  |0         BEQ fi|
00002770  6e 69 73 68 0d 20 20 36  31 30 20 20 20 20 20 20  |nish.  610      |
00002780  20 20 20 4a 53 52 20 6f  73 61 73 63 69 0d 20 20  |   JSR osasci.  |
00002790  36 32 30 20 20 20 20 20  20 20 20 20 43 4d 50 20  |620         CMP |
000027a0  23 31 33 0d 20 20 36 33  30 20 20 20 20 20 20 20  |#13.  630       |
000027b0  20 20 42 4e 45 20 70 72  69 6e 74 6c 6f 6f 70 0d  |  BNE printloop.|
000027c0  20 20 36 34 30 20 2e 66  69 6e 69 73 68 0d 20 20  |  640 .finish.  |
000027d0  36 35 30 20 20 20 20 20  20 20 20 20 50 4c 41 0d  |650         PLA.|
000027e0  20 20 36 36 30 20 20 20  20 20 20 20 20 20 53 54  |  660         ST|
000027f0  41 20 61 64 64 72 65 73  73 2b 31 0d 20 20 36 37  |A address+1.  67|
00002800  30 20 20 20 20 20 20 20  20 20 50 4c 41 0d 20 20  |0         PLA.  |
00002810  36 38 30 20 20 20 20 20  20 20 20 20 53 54 41 20  |680         STA |
00002820  61 64 64 72 65 73 73 0d  20 20 36 39 30 20 20 20  |address.  690   |
00002830  20 20 20 20 20 20 4c 44  58 20 78 72 65 67 69 73  |      LDX xregis|
00002840  74 65 72 0d 20 20 37 30  30 20 20 20 20 20 20 20  |ter.  700       |
00002850  20 20 4c 44 59 20 79 72  65 67 69 73 74 65 72 0d  |  LDY yregister.|
00002860  20 20 37 31 30 20 20 20  20 20 20 20 20 20 50 4c  |  710         PL|
00002870  41 0d 20 20 37 32 30 20  20 20 20 20 20 20 20 20  |A.  720         |
00002880  4c 44 41 20 23 30 0d 20  20 37 33 30 20 20 20 20  |LDA #0.  730    |
00002890  20 20 20 20 20 52 54 53  0d 20 20 37 34 30 20 2e  |     RTS.  740 .|
000028a0  6c 61 73 74 62 79 74 65  0d 20 20 37 35 30 20 5d  |lastbyte.  750 ]|
000028b0  0d 20 20 37 36 30 20 4e  45 58 54 0d 20 20 37 37  |.  760 NEXT.  77|
000028c0  30 20 49 4e 50 55 54 27  22 53 61 76 65 20 66 69  |0 INPUT'"Save fi|
000028d0  6c 65 6e 61 6d 65 20 3d  20 22 66 69 6c 65 6e 61  |lename = "filena|
000028e0  6d 65 24 0d 20 20 37 38  30 20 49 46 20 66 69 6c  |me$.  780 IF fil|
000028f0  65 6e 61 6d 65 24 3d 22  22 20 45 4e 44 0d 20 20  |ename$="" END.  |
00002900  37 39 30 20 24 73 61 76  65 3d 22 53 41 56 45 20  |790 $save="SAVE |
00002910  22 2b 66 69 6c 65 6e 61  6d 65 24 2b 22 20 22 2b  |"+filename$+" "+|
00002920  53 54 52 24 7e 28 48 49  4d 45 4d 29 2b 22 20 22  |STR$~(HIMEM)+" "|
00002930  2b 53 54 52 24 7e 28 6c  61 73 0d 20 20 20 20 20  |+STR$~(las.     |
00002940  20 74 62 79 74 65 29 2b  22 20 46 46 46 46 38 30  | tbyte)+" FFFF80|
00002950  30 30 20 46 46 46 46 38  30 30 30 22 0d 20 20 38  |00 FFFF8000".  8|
00002960  30 30 20 58 25 3d 73 61  76 65 20 4d 4f 44 20 32  |00 X%=save MOD 2|
00002970  35 36 0d 20 20 38 31 30  20 59 25 3d 73 61 76 65  |56.  810 Y%=save|
00002980  20 44 49 56 20 32 35 36  0d 20 20 38 32 30 20 2a  | DIV 256.  820 *|
00002990  4f 50 54 31 2c 32 0d 20  20 38 33 30 20 43 41 4c  |OPT1,2.  830 CAL|
000029a0  4c 20 6f 73 63 6c 69 0d  20 20 38 34 30 20 2a 4f  |L oscli.  840 *O|
000029b0  50 54 31 2c 30 0d 20 20  38 35 30 20 45 4e 44 0d  |PT1,0.  850 END.|
000029c0  20 20 38 36 30 20 44 45  46 46 4e 65 71 75 62 28  |  860 DEFFNequb(|
000029d0  62 79 74 65 29 0d 20 20  38 37 30 20 3f 50 25 3d  |byte).  870 ?P%=|
000029e0  62 79 74 65 0d 20 20 38  38 30 20 50 25 3d 50 25  |byte.  880 P%=P%|
000029f0  2b 31 0d 20 20 38 39 30  20 3d 70 61 73 73 0d 20  |+1.  890 =pass. |
00002a00  20 39 30 30 20 44 45 46  46 4e 65 71 75 77 28 77  | 900 DEFFNequw(w|
00002a10  6f 72 64 29 0d 20 20 39  31 30 20 3f 50 25 3d 77  |ord).  910 ?P%=w|
00002a20  6f 72 64 20 4d 4f 44 20  32 35 36 0d 20 20 39 32  |ord MOD 256.  92|
00002a30  30 20 50 25 3f 31 3d 77  6f 72 64 20 44 49 56 20  |0 P%?1=word DIV |
00002a40  32 35 36 0d 20 20 39 33  30 20 50 25 3d 50 25 2b  |256.  930 P%=P%+|
00002a50  32 0d 20 20 39 34 30 20  3d 70 61 73 73 0d 20 20  |2.  940 =pass.  |
00002a60  39 35 30 20 44 45 46 46  4e 65 71 75 64 28 64 6f  |950 DEFFNequd(do|
00002a70  75 62 6c 65 29 0d 20 20  39 36 30 20 21 50 25 3d  |uble).  960 !P%=|
00002a80  64 6f 75 62 6c 65 0d 20  20 39 37 30 20 50 25 3d  |double.  970 P%=|
00002a90  50 25 2b 34 0d 20 20 39  38 30 20 3d 70 61 73 73  |P%+4.  980 =pass|
00002aa0  0d 20 20 39 39 30 20 44  45 46 46 4e 65 71 75 73  |.  990 DEFFNequs|
00002ab0  28 73 74 72 69 6e 67 24  29 0d 20 31 30 30 30 20  |(string$). 1000 |
00002ac0  24 50 25 3d 73 74 72 69  6e 67 24 0d 20 31 30 31  |$P%=string$. 101|
00002ad0  30 20 50 25 3d 50 25 2b  4c 45 4e 28 73 74 72 69  |0 P%=P%+LEN(stri|
00002ae0  6e 67 24 29 0d 20 31 30  32 30 20 3d 70 61 73 73  |ng$). 1020 =pass|
00002af0  0d 0d                                             |..|
00002af2
19-08-88/T\SWR07.m0
19-08-88/T\SWR07.m1
19-08-88/T\SWR07.m2
19-08-88/T\SWR07.m4
19-08-88/T\SWR07.m5