Difference between revisions of "OSWORD &05"

From BeebWiki
Jump to: navigation, search
m (See Also)
m (Formatted title.)
Line 1: Line 1:
 
[[Category:OSWORD]][[Category:Second Processors]]__NOTOC__
 
[[Category:OSWORD]][[Category:Second Processors]]__NOTOC__
==OSWORD &05 (5) - Read I/O processor memory (Acorn MOS 1.00 and later)==
+
{{PageTitle|OSWORD &05 (5): Read I/O processor memory}}
 
 
 
   On entry:
 
   On entry:
 
     XY!0=address to read from
 
     XY!0=address to read from
Line 76: Line 75:
  
 
==Implementations==
 
==Implementations==
 +
Implemented in Acorn MOS 1.00 and later.
 +
 
All 8-bit Acorn systems read from whichever ROM is paged in. All except the
 
All 8-bit Acorn systems read from whichever ROM is paged in. All except the
 
BBC B+ read from main memory. The B+ recognises &FFFExxxx to read from the
 
BBC B+ read from main memory. The B+ recognises &FFFExxxx to read from the

Revision as of 15:39, 21 November 2021

OSWORD &05 (5): Read I/O processor memory
 On entry:
   XY!0=address to read from
 On exit:
   XY?4=the byte read

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.

 DEFPROCmem_call(io%,A$):LOCAL old%
 !X%=&200:REPEAT
   A%=5:CALL&FFF1:old%=256*X%?4+old%DIV256
   A%=6:X%?4=io%:CALL&FFF1:io%=io%DIV256
   ?X%=?X%+1
 UNTIL ?X%=2
 OSCLI "LINE "+A$
 !X%=&200:REPEAT
   X%?4=old%:CALL&FFF1:old%=old%DIV256
   ?X%=?X%+1
 UNTIL ?X%=2
 =B%
 :
 DEFFNmem_call(io%,B%,C%):LOCAL old%
 !X%=&200:REPEAT
   A%=5:CALL&FFF1:old%=256*X%?4+old%DIV256
   A%=6:X%?4=io%:CALL&FFF1:io%=io%DIV256
   ?X%=?X%+1
 UNTIL ?X%=2
 B%=FNbyte(136,B%,C%)
 !X%=&200:REPEAT
   X%?4=old%:CALL&FFF1:old%=old%DIV256
   ?X%=?X%+1
 UNTIL ?X%=2
 =B%
 DEFFNbyte(A%,X%,Y%)=((USR&FFF4)AND&FF00)DIV256

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

result=FNmem_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=FNmem_call(&FFE7,0,0) will call OSNEWL in the I/O processor.

You should be careful if the called code generate an error as then USERV will not be restored to its previous value.

Implementations

Implemented in Acorn MOS 1.00 and later.

All 8-bit Acorn systems read from whichever ROM is paged in. All except the BBC B+ read from main memory. The B+ recognises &FFFExxxx to read from the shadow screen memory, otherwise it reads from 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:56, 30 October 2011 (UTC) Jgharston (talk) 04:27, 29 March 2015 (UTC) Jgharston (talk) 14:01, 31 January 2016 (UTC)