Used to service rti1000 bus file service requests. The request is sent to the rti without going through the local file system. Faster but not 100% correct.
0 DUP CONSTANT #flbus_link 4+ ( links into disk service queue)
DUP CONSTANT #flbus_source 2+ ( tells the disk service routine what function to use)
DUP CONSTANT #flbus_facility 4+ ( address of task to awake)
DUP CONSTANT #flbus_count 2+ ( bytes used in buffer)
DUP CONSTANT #flbus_buffer 4+ ( buffer address)
DROP
: port_buffer>local_buffer { variable %file_block variable %buffer -- ( count) }{
variable %card }
%file_block @ $FFFF0000 AND %card !
\ buffer address from slave point of view
%file_block @ #flbus_buffer + @
%card @ >local \ rti_buffer(--
%buffer @ \ rti_buffer local_buffer(--
%file_block @ #flbus_count + W@ >R R@ \ rti_buffer local_buffer count(--
\ align count to long word so move can deal in long words.
3+ -4 AND
MOVE
R>
;
: local_buffer>port_buffer { ( addr count ) variable %file_block -- }{
variable %card }
%file_block @ $FFFF0000 AND %card !
\ buffer address from slave point of view
%file_block @ #flbus_buffer + @
%card @ >local \ addr count rti_buffer(--
SWAP
\ extend count to long word
3 + -4 AND
MOVE
;
: set_error { ( $ ) variable %file_block -- }{
variable %card
variable %count }
%file_block @ $FFFF0000 AND %card !
\ buffer address from slave point of view
%file_block @ #flbus_buffer + @
%card @ >local
\ to make life interesting we can only do word writes to
\ the RTI bus
\ We will make the packet in a local buffer round the count up
\ to a long word and move the result to the rti buffer
\ $ rti_buffer(--
OVER COUNT NIP #$count_length +
\ the comand byte
#ilan_error_string +
DUP %file_block @ #flbus_count + W!
\ round to long words
3+ -4 AND
%count !
SWAP \ rti_buffer $(--
%count @ get_buffer
buffer 1+ #$buffer $move
#error_ilan buffer C!
\ rti_buffer(--
buffer SWAP %count @ MOVE
kill_buffer
;
: wake_remote_task { variable %file_block -- }{
variable %card }
%file_block @ $FFFF0000 AND %card !
%card @ [ %port_wake _#RTI1000_dual_port_base - ]T LITERAL + W@
\ address of tasks activation area
%file_block @ #flbus_facility + @
%card @ >local
W!
;
CREATE $no_command ," Slave didn't provide a command"
ram_variable %test5
: bus_file_service_request { variable %file_block -- }{
variable %buffer
variable %sc3_addr }
#ilan_packet_max ['] get_free_buffer CATCH ?DUP IF
%file_block @ set_error
%file_block @ wake_remote_task
EXIT
THEN
%buffer !
%file_block @ %buffer @ port_buffer>local_buffer DUP IF
\ zero command is dealt with here
%buffer @ C@ IF
\ count(--
\ make sure we and not the file system is using IBM
1 %test5 +!
ibm_facility get
#ether_port sc_table #sc3 + @ %sc3_addr !
%buffer @ %sc3_addr @ #sc3_pointer + !
\ count(--
%sc3_addr @ #sc3_count + W!
( start interrupt action)
xsleep
user_base %sc3_addr @ #sc3_task + !
%buffer @ C@ %sc3_addr @ #sc3_tsk_cmd + C!
xnext
( interrupt routine has now finished)
( transfer data out of buffer)
( interrupt routine swapped buffers)
( have to read new buffer address from #sc3_pointer)
%sc3_addr @ #sc3_pointer + @ %buffer !
%buffer @ #sc3_count %sc3_addr @ + W@
ibm_facility release
%buffer @ OVER %file_block @ local_buffer>port_buffer
%buffer @ kill_free_buffer
\ count(--
%file_block @ #flbus_count + W!
%file_block @ wake_remote_task
EXIT
THEN
THEN
%buffer @ kill_free_buffer
$no_command %file_block @ set_error
%file_block @ wake_remote_task
EXIT
;
( Disk service routine)
\ -----------------------------------------------------
: service_request ( addr --)
( any sort of ilan request)
\ DUP #mc3_source + W@ #ilan_block = IF
\ ilan_service_request
\ EXIT
\ THEN
DUP #flbus_source + W@ #bus_file = IF
bus_file_service_request
EXIT
THEN
DROP
;
ram_variable %test3
: disk_action
disk_queue xawait
1 %test3 +!
disk_queue dequeue
service_request
;
target_also
&tasks
target_definitions
#clock_low task: rti_ibm_serve
BEGIN
disk_action
AGAIN
;task
target_previous_definitions
target_previous