license

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