Difference between revisions of "OSWORD &06"

From BeebWiki
Jump to: navigation, search
(Implementations: ...it uses STAIX not STAIY)
m (.)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
 
[[Category:OSWORD]][[Category:Second Processors]]__NOTOC__
 
[[Category:OSWORD]][[Category:Second Processors]]__NOTOC__
==OSWORD &06 (6) - Write I/O processor memory (Acorn MOS 1.00 and later)==
+
{{PageTitle|OSWORD &06 (6): Write I/O processor memory}}
 
 
 
   On entry:
 
   On entry:
 
     XY!0=address to write to
 
     XY!0=address to write to
Line 7: Line 6:
  
 
Some systems recognise screen memory at &FFFExxxx and sideways ROMs at
 
Some systems recognise screen memory at &FFFExxxx and sideways ROMs at
&FFrr8000-&FFrrBFFF.
+
&FFrr8000 - &FFrrBFFF.
  
 
==Coding==
 
==Coding==
Line 63: Line 62:
  
 
==Implementations==
 
==Implementations==
 +
Implemented in Acorn MOS 1.00 and later.
 +
 
All 8-bit Acorn systems write to whichever ROM/RAM is paged in. All except
 
All 8-bit Acorn systems write to whichever ROM/RAM is paged in. All except
 
the BBC B+ write to main memory. The B+ recognises &FFFExxxx to write to the
 
the BBC B+ write to main memory. The B+ recognises &FFFExxxx to write to the

Latest revision as of 17:50, 7 January 2023

OSWORD &06 (6): Write I/O processor memory
 On entry:
   XY!0=address to write to
   XY?4=byte to be written.

Some systems recognise screen memory at &FFFExxxx and sideways ROMs at &FFrr8000 - &FFrrBFFF.

Coding

The following routines can be used to copy data to and from I/O memory regardless of the location of the calling program. It requires X%=>5-byte control block, Y%=X%DIV256.

 DEFPROCmem_rd(io%,mem%,num%)
 A%=5:REPEAT
   !X%=io%:CALL&FFF1:?mem%=X%?4
   io%=io%+1:mem%=mem%+1:num%=num%-1
 UNTILnum%<1:ENDPROC
 :
 DEFPROCmem_wr(io%,mem%,num%)
 A%=6:REPEAT
   !X%=io%:X%?4=?mem%:CALL&FFF1
   io%=io%+1:mem%=mem%+1:num%=num%-1
 UNTILnum%<1:ENDPROC
 
 REM To read a single byte:
 !X%=addr:A%=5:CALL&FFF1:byte=X%?4
 :
 REM To write a single byte
 X%?4=byte:!X%=addr:A%=6:CALL&FFF1

By copying code to the I/O processor and the I/O processor's USERV you can call an arbitary address in the I/O processor. These routines can be used if you know your program has complete control of USERV and does not have to restore it, or restores it elsewhere.

 DEFPROCio_call(io%,A$)
 !X%=&200:A%=6:REPEAT
   X%?4=io%:CALL&FFF1
   io%=io%DIV256:?X%=?X%+1
 UNTIL ?X%=2
 OSCLI "LINE "+A$
 ENDPROC
 :
 DEFFNio_call(io%,B%,C%)
 !X%=&200:A%=6:REPEAT
   X%?4=io%:CALL&FFF1
   io%=io%DIV256:?X%=?X%+1
 UNTIL ?X%=2
 =FNbyte(136,B%,C%)
 DEFFNbyte(A%,X%,Y%)=((USR&FFF4)AND&FF00)DIV256

PROCio_call(address,"string") will call address, entering with A=0 and XY pointing to string. For example, PROCio_call(&FFF7,"HELP") calls OSCLI in the I/O processor.

result=FNio_call(address,param1,param2) will call address, entering with A=1, X=param1 and Y=param2, and will return the result in XY. For example, result=FNio_call(&FFE7,0,0) will call OSNEWL in the I/O processor.

Implementations

Implemented in Acorn MOS 1.00 and later.

All 8-bit Acorn systems write to whichever ROM/RAM is paged in. All except the BBC B+ write to main memory. The B+ recognises &FFFExxxx to write to the shadow screen memory, otherwise it writes to main memory. It is possible to write a modified Tube Host that intercepts OSWORD 5 and 6 to access extended memory, but most programs rely on adding an extra OSWORD call.

See Also

Jgharston 23:54, 30 October 2011 (UTC) Jgharston (talk) 04:28, 29 March 2015 (UTC) Jgharston (talk) 14:02, 31 January 2016 (UTC)