' ' CF-Interface ' ' ECB-Karte für Moppel 8085 ' W.Römer 02.2015 ' ' ' Status: ' 15.02.2015 Grundroutinen Spur,Sektor setzen, lesen und schreiben ' 04.02.2015 Testroutinen lesen/schreiben ' 03.02.2015 Programmstrukturen fuer Pollingbetrieb festgelegt ' Adressen A0,A1 z.Zt. nicht notwendig ' 29.05.2014 Testprogramm Datenaustausch AVR <->ECB ' ' ' FUSES: Extended 0xff ' High 0xD9 ' Low 0xff ' ' Lockbit 0xff ' ' !Anmerkung JTAG muss abgeschaltet sein, belegt sonst PortC ' ' '----------------------------------------------------------------------------- ' ' Konzept: ECB-Karte mit 8255PIO für den Datenaustausch ' CF-Seite mit Atmega644p AVR-DOS für die Verwaltung der CF-Karte ' ' PIO Kanal A arbeitet in Betriebsart 2 (bidirektional) ' Handshake über Kanal C ' ' PIO Kanal B als Ausgabe für die Adressen A0 und A1 ' Diese bildet der AVR als Registersatz ' für den Befehl/Datenaustausch ab ' ' ! Read/Write immer aus Sicht ECB/Moppel ' ' ' Handshake: ' ' PIO <---------------------------------------> AVR ' ' Aktion Signal PIN PIN Richtung Aktion ' ' Senden /OBF PC7 ECB-Daten vorhanden D2 >> Daten im ' ------ ---- Ausgangsbuffer ' I I ' -------- ' /ACK PC6 Daten von AVR uebernommen D4 << Empfangsquittung ' -------- ------ ' I I ' ----- ' ^ ' I Daten lesen ' ' ' Empfang IBF PC5 AVR-Daten vorhanden D3 >> Empfangsbereit ' ------ ---- ' I I ' ------------- ' /STB PC4 Daten übernehmen D5 << Daten senden ' -------- ------ ' I I ' ----- ' /ACK, /STB auf 5µs eingestellt ' max Datenrate ca. 25kB/sek ' (ohne Overhead) ' ' ' ' ECB-PIO Adressen ' ' CAh Daten Kanal A ' DAh Daten Kanal B ' EAh Daten Kanal C ' FAh Steuerwort ' ' PIO-Kanal C lesen (FAh) Handshake ' ' D7 D6 D5 D4 D3 D2 D1 D0 ' . . . . . . . . ' . . . . . ' . . . . . ' . . . . 1 = INTRa Interrupt (ISR muss Bit4-7 auswerten) ' . . . . ' . . . 0 = /STBa positive Flanke lädt Daten ins Eingangsregister ' . . . ' . . 1 = IBFa logisch 1 zeigt an, das Daten ins Eingangsregister ' . . geladen sind (AVR muss dies vor dem Senden auswerten ' . . wenn 0, darf mit /STB ein Byte gesendet werden) ' . . ' . . ' . 0 = /ACKa logisch 0 stellt die Daten ins Ausgangsregister ' . sonst hochohmig ' 0 = /OBFa logisch 0, Daten stehen im Ausgangsbuffer bereit ' und können vom AVR mit /ACK abgeholt werden ' ' ' PIO PB1 PB0 ' ' AVR A1 A0 Adressen für Register ' D6 D7 ' ' 0 0 Control/Statusregister ' 0 1 Spur 0-256 ' 1 0 Sektor 0-256 (a 128Byte = 8MB) ' 1 1 Daten lesen/schreiben ' ' ' Befehle ans Controlregister (in Anlehnung an Moppel FDC und BIOS) ' ' Reset 00h Spur 0 Sektor 0 ansteuern ' SetSpur 10h Spurnummer setzen ' SetSekt 20h Sektornummer setzen ' DatRD 80h Daten vom aktuellen Sektor lesen ' DatWR A0h Daten in den aktuellen Sektor schreiben ' Format F0h Formartieren ' ' Statusregister lesen ' ' D7 D6 D5 D4 D3 D2 D1 D0 ' . . . . . . . . ' . . ' . 1 = Schreibschutz ' . ' 1 = CF nicht bereit ' ' ' '----------------------------------------------------------------------------- $regfile = "m644def.dat" $crystal = 11059200 $hwstack = 128 $swstack = 128 $framesize = 128 $baud = 9600 'Open "Com1:" As Binary As #1 ' use #1 for fs_interpreter 'Config Serialin = Buffered , Size = 20 '------------------------------------------ ' ' Test = 0 --> Daten lesen ' test = 1 --> Daten schreiben Dim Test As Bit Test = 0 ' ' ' $sim '------------------------------------------ ' Portdefinitionen ' ' Port A = Datenaustausch CF ' Port B = Steuerung CF ' Port C = Datenaustausch ECB ' Port D = Steuerung ECB ' ' Daten ECB Config Portc = Input ' ' Handshake ECB Config Portd.2 = Input Config Portd.3 = Input Config Portd.4 = Output Config Portd.5 = Output ' Hs_obf Alias Pind.2 ' /OBF ' Hs_ibf Alias Pind.3 ' IBF Hs_ack Alias Portd.4 ' /ACK Hs_stb Alias Portd.5 ' /STB ' ' Adressen für Registersatz Config Portd.6 = Input Config Portd.7 = Input ' Ecb_a0 Alias Portd.6 ' A0 Ecb_a1 Alias Portd.7 ' A1 ' ' Unterprogramme für Datenaustausch ECB ' ' ecb_statin = ECB Status für Eingabe ' ecb_statout = ECB Status für Ausgabe ' ecb_rdadr = ECB Adresse lesen ' ecb_rdbyte = 1 Byte vom ECB lesen ' ecb_wrbyte = 1 byte zum ECB schreiben ' ecb_settr = Spurregister lesen ' ecb_setsek = Sektorregister lesen ' ecb_rdsek = 1 Sektor von CF-Karte lesen und an ECB übergeben ' ecb_wrsek = 1 Sektor von ECB übernehmen und auf CF-Karte speichern Declare Sub Init Declare Sub Ecb_rdbyte Declare Sub Ecb_wrbyte Declare Sub Avr_reset Declare Sub Ecb_settr Declare Sub Ecb_setsek Declare Sub Ecb_wrsek Declare Sub Ecb_rdsek Declare Sub _rdloop ' ' Registersatz für Handshake ECB ' Dim Sek_buff(128) As Byte Dim In_tmp As Byte Dim Out_tmp As Byte ' Dim Statin As Bit ' /OBF Dim Statout As Bit ' /STB ' Dim Ecb_status As Byte ' hier kommt spaeter der Dim Ecb_track As Byte ' Status rein Dim Ecb_sektor As Byte ' Dim Z_bytesek As Byte ' Byte-Zaehler fuer ' Sektor lesen/schreiben ' ' AVR Befehle ' ' AVRres = 00h Spur 0 Sektor 0 ansteuern ' SetSpur = 10h Spurnummer setzen ' SetSekt = 20h Sektornummer setzen ' RDsek = 80h Daten vom aktuellen Sektor lesen ' WRsek = A0h Daten in den aktuellen Sektor schreiben ' DELcf = F0h Formartieren (nur den CP/M Bereich) ' Const Avrres = &H00 Const Setspur = &H10 Const Setsek = &H20 Const Rdsek = &H30 Const Wrsek = &H0A0 Const Delcf = &H0F0 Const Rdendl = &H50 ' '----------------------------------------------------------------------------- ' Print "CF-Interface" Print "warten auf Befehle" Call Init Print "AVR Reset OK" Do Call Ecb_rdbyte Print "Befehl: " ; In_tmp Select Case In_tmp Case Setspur Call Ecb_settr Case Setsek Call Ecb_setsek Case Wrsek Call Ecb_wrsek Case Rdsek Call Ecb_rdsek Case Rdendl Call _rdloop End Select Print "Spur: " ; Ecb_track Print "Sektor: " ; Ecb_sektor Print "Buffer: " ; Sek_buff(1) Print "Buffer: " ; Sek_buff(128) Waitms 1000 Loop ' '----------------------------------------------------------------------------- ' ' ' ' Daten lesen ' Sub Ecb_rdbyte Config Portc = Input Do ' warten auf Daten Loop Until Pind.2 = 0 ' /OBF = 0 Reset Hs_ack ' Waitus 2 In_tmp = Pinc ' Daten lesen Waitus 2 ' /ACK Quittung Set Hs_ack ' ' End Sub ' ' Daten schreiben ' Sub Ecb_wrbyte Config Portc = Output Do ' warten auf Bereit Loop Until Pind.3 = 0 ' IBF = 0 Portc = Out_tmp ' Daten ausgeben Reset Hs_stb Waitus 5 ' /STB ausgeben Set Hs_stb End Sub ' ' '----------------------------------------------------------------------------- ' Sub Init Set Hs_ack ' /ACK Quittung Set Hs_stb ' /STB Datenbestätigen Call Ecb_rdbyte Out_tmp = In_tmp Call Ecb_wrbyte Call Ecb_rdbyte Out_tmp = 22 Call Ecb_wrbyte Waitms 1000 End Sub ' '----------------------------------------------------------------------------- ' Sub Avr_reset Ecb_status = 0 ' hier kommt spaeter der Ecb_track = 0 ' Status rein Ecb_sektor = 0 ' Out_tmp = Ecb_status Print "Reset" ' Call Ecb_wrbyte End Sub ' Spur setzen ' Sub Ecb_settr Call Ecb_rdbyte Ecb_track = In_tmp End Sub ' ' Sektor setzen ' Sub Ecb_setsek Call Ecb_rdbyte Ecb_sektor = In_tmp End Sub ' ' Sektor schreiben aus ECB Sicht(128 Byte) ' Sub Ecb_wrsek ' Z_bytesek = 1 ' Startwert Do Call Ecb_rdbyte Sek_buff(z_bytesek) = In_tmp Z_bytesek = Z_bytesek + 1 ' naechstes Byte Loop Until Z_bytesek = 129 End Sub ' ' Sektor lesen aus ECB Sicht(128 byte) ' Sub Ecb_rdsek Z_bytesek = 1 ' Startwert Do Out_tmp = Sek_buff(z_bytesek) Call Ecb_wrbyte Z_bytesek = Z_bytesek + 1 ' naechstes Byte Loop Until Z_bytesek = 129 Call Ecb_wrbyte End Sub Sub _rdloop Do Call Ecb_rdsek Loop End Sub End 'end program