git-svn-id: http://svn.code.sf.net/p/netboot65/code@40 93682198-c243-4bdb-bd91-e943c89aac3b

This commit is contained in:
jonnosan 2009-02-09 13:02:24 +00:00
parent b599be3f40
commit 6eb041bd53
4 changed files with 112 additions and 1 deletions

View File

@ -19,6 +19,7 @@ $07 1 byte opcode
$01 = VOLUME CATALOG REQUEST
$02 = READ T/S REQUEST
$03 = WRITE T/S REQUEST
$04 = INIT VOLUME REQUEST
FOR CAPABILITIES REQUEST
No further data
@ -50,6 +51,16 @@ $4C null byte (i.e. filename can be 55 bytes long, MUST be at least 1 null at t
FOR WRITE
$4d.. sector data
FOR INIT VOLUME
$00..$3c volume name (up to 56 chars, null padded)
$37 null byte
$38 system architecture ID
$39 file system ID
$3A..$3B number of tracks
$3C..$3D sector length (in bytes)
$3E..$3F ??
FOR ALL RESPONSES
$07 1 byte opcode
@ -106,6 +117,16 @@ $0A..$49 volume name (null padded 64 bytes)
FOR READ
$4A.. sector data
FOR INIT VOLUME
$00..$3c volume name (up to 56 chars, null padded)
$37 null byte
$38 system architecture ID
$39 file system ID
$3A..$3B number of tracks
$3C..$3D sector length (in bytes)
FOR ERROR
@ -131,3 +152,4 @@ $06..$0b bytes $04..$09 from original request
$0c..$4c error message (null padded 63 bytes)
$4d null byte

View File

@ -25,10 +25,12 @@ module TNDP
0x01 =>"VOLUME CATALOG REQUEST",
0x02 =>"READ SECTOR REQUEST",
0x03 =>"WRITE SECTOR REQUEST",
0x04=>"INIT VOLUME REQUEST",
0x80 =>"CAPABILITIES RESPONSE",
0x81 =>"VOLUME CATALOG RESPONSE",
0x82 =>"READ SECTOR RESPONSE",
0x83 =>"WRITE SECTOR RESPONSE",
0x84=>"INIT VOLUME RESPONSE",
0xFF =>"ERROR RESPONSE",
}
@ -357,6 +359,52 @@ SECTOR LENGTH: $#{"%04x" % sector_length}"
end
end
class CreateVolumeRequestMessage < BaseMessage
attr_reader :system_architecture,:volume_name,:track_count,:sector_length
OPCODE=0x04
def initialize(args={})
args[:opcode]=OPCODE if args[:opcode].nil?
[:system_architecture,:volume_name,:track_count,:sector_length].each do |arg|
raise "#{arg} must be specified in a #{self.class}" if args[arg].nil?
end
@system_architecture=args[:system_architecture]
@track_count=args[:track_count]
@sector_length=args[:sector_length]
@volume_name=args[:volume_name]
super(args)
end
def to_s
system_architecture_id=TNDP::SYSTEM_ARCHITECTURES[system_architecture]
super+"
VOLUME NAME: #{volume_name}
ARCHITECTURE: #{system_architecture} [$#{"%02X"%system_architecture_id}]
TRACK COUNT: $#{"%04X"%track_count}
SECTOR LENGTH: $#{"%04x" % sector_length}"
end
def to_buffer
super+[volume_name[0,MAX_VOLUME_NAME_LENGTH],TNDP::SYSTEM_ARCHITECTURES[system_architecture],track_count,sector_length].pack("Z#{TNDP::MAX_VOLUME_NAME_LENGTH+1}Cnn")
end
def self.from_buffer(buffer)
signature,version_id,transaction_id,opcode,volume_name,system_architecture_id,track_count,sector_length=buffer.unpack("Z4CnCZ#{TNDP::MAX_VOLUME_NAME_LENGTH+1}Cnn")
self.new({:signature=>signature,:version=>version_id,:transaction_id=>transaction_id,:opcode=>opcode,:volume_name=>volume_name,
:system_architecture=>TNDP::SYSTEM_ARCHITECTURES.key_by_value(system_architecture_id), :track_count=>track_count,:sector_length=>sector_length})
end
end
class CreateVolumeResponseMessage < CreateVolumeRequestMessage
OPCODE=0x84
def initialize(args={})
args[:opcode]=OPCODE
super(args)
end
end
class ErrorResponseMessage < BaseMessage
OPCODE=0xFF
attr_reader :errorcode,:error_description,:original_data_elements

View File

@ -19,6 +19,10 @@ require 'LibRipXplore'
"AppleCPM"=>:cpm,
}
VOLUME_CREATION_PARAMATERS={
:apple2=>["0.chr*request.track_count*request.sector_length*16",RawDisk,A2DskPhysicalOrder,256],
:c64=>["0.chr*((17*21)+(7*19)+(6*18)+((request.track_count-30)*17))*256",RawDisk,D64,256],
}
class TNDPServer
LISTENING_PORT=6502
@ -78,7 +82,21 @@ class TNDPServer
response=TNDP::SectorReadResponseMessage.new({:track_no=>track_no,:sector_no=>sector_no,:sector_length=>sector_length,:volume_name=>request.volume_name,:sector_data=>sector_data})
end
end
end
end
when TNDP::CreateVolumeRequestMessage::OPCODE
volume_file="#{@root_directory}/#{request.volume_name}"
volume_creation_paramaters=VOLUME_CREATION_PARAMATERS[request.system_architecture]
if volume_creation_paramaters.nil? then
response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::ARCHITECTURE_NOT_SUPPORTED,"create volume requests for #{request.system_architecture} not supported")
elsif request.sector_length!=volume_creation_paramaters[3] then
response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::INVALID_SECTOR_LENGTH,"create volume requests for #{request.system_architecture} should have sector length #{volume_creation_paramaters[3]}")
else
file_bytes=eval(volume_creation_paramaters[0],binding)
volume=FileSystemImage.new(file_bytes,volume_creation_paramaters[1],volume_creation_paramaters[2],volume_file)
volume.save_as(volume_file)
response=TNDP::CreateVolumeResponseMessage.new({:volume_name=>request.volume_name,:system_architecture=>request.system_architecture,:track_count=>request.track_count,:sector_length=>request.sector_length} )
end
else
response=TNDP::ErrorResponseMessage.create_error_response(data,TNDP::ErrorCodes::UNKNOWN_OPCODE,"unknown opcode $#{"%02X" % request.opcode}")
end

View File

@ -36,6 +36,29 @@ class TestServer <Test::Unit::TestCase
assert(capabilities_response_msg.supported_architectures[:apple2]>0,"should be at least 1 apple2 image")
assert(capabilities_response_msg.supported_architectures[:c64]>0,"should be at least 1 C64 image")
[
[:apple2,'SCRATCH_TEST.DSK',35,256],
[:apple2,'SCRATCH_TEST2.DO',40,256],
[:c64,'SCRATCH_TEST.D64',35,256],
[:c64,'SCRATCH_TEST2.D64',40,256],
].each do |a|
#try to make a new blank disk
system_architecture=a[0]
image_name=a[1]
track_count=a[2]
sector_length=a[3]
image_full_path="#{TEST_IMAGES_DIR}\\#{image_name}"
File.delete(image_full_path) if File.exist?(image_full_path)
create_volume_request_msg=TNDP::CreateVolumeRequestMessage.new({:volume_name=>image_name,:system_architecture=>system_architecture,:track_count=>track_count,:sector_length=>sector_length})
create_volume_response_msg=send_request_and_get_response(create_volume_request_msg)
assert_equal(TNDP::CreateVolumeResponseMessage::OPCODE,create_volume_response_msg.opcode,"init volume request message should have correct opcode")
assert_equal(system_architecture,create_volume_response_msg.system_architecture)
assert(File.exist?(image_full_path),"file just created should exist at #{image_full_path}")
file_system_image=RipXplore.best_fit_from_filename(image_full_path)
assert_equal(track_count,file_system_image.track_count,"file just created should have correct number of tracks")
end
raise "done"
#test every combination of host and file system
[[:apple2,:apple_dos_33],[:apple2,:prodos],[:apple2,:any],[:c64,:cbm_dos],[:any,:any],[:any,:prodos]].each do |a|
desired_system_architecture=a[0]
desired_file_system=a[1]