................................................................................. -P-R-O-J-E-C-T- CBM 2001/3001- ________ ______ _____ ________ _____ ___ __ ______________ /________ /_ ___ __ _________(_)__ ______ __ /_/ / __ ___/_ //_/ _ __/ __ / / /_ ___/_ /__ | / / _ _ _, _// /_/ / /__ _ ,< / __/ /_ _ /_/ /_ / _ / __ |/ // __/ /_/ |_| ____/___/ /_/|_| ___/__/ /_____/ /_/ /_/ _____/ ___/ v0.1 ................................................................................. __ __ __ __ __ __ __ __ __ __ status : 0% |__|__|__|__|__|__|__|__|__|__| 100% | 25% ................................................................................. ein neues laufwerk fuer die cbm 2001/3001 (basic 2.0) rechner ist in arbeit. es wird (erstmal) ein mit akku gepuffertes 512kb sram als datenspeicher nutzen. als verbindung dient der userport des cbm und das herz des virtuellen laufwerks ist ein atmel mega8515l. beide prozessoren werden in assembler programmiert, um die hoechst moegliche leistung auf beiden seiten zu erreichen. nach ersten tests sind datenraten von knapp 20kb/s moeglich. letztlich werden ladezeiten unter 3 sekunden fuer jedes programm bis 32kb angestrebt. das sollte fuer jeden nutzer im ertraeglichen rahmen liegen. ;) prinzip verbindung zwischen avr und userport speicher banking uebertragungs-protokoll quelltexte befehls-interpreter directory formatieren directory als 512 byte rohdaten zum cbm uebertragen update diary die verbindung zum avr : pet avr pa0..7 <-> porta ca1 <- pb0 (strobe) cb2 -> pb1 (clock) die restlichen ports des avr werden fuer die beschaltung der zusaetzlichen komponenten verwendet. in der ersten version sind 8 baenke a 64kb geplant. jede dieser baenke wird ein directory von $0000-$01ff haben. in diesem segment werden 16 eintraege x 32 byte fuer den pet nutzbar sein. beim zugriff auf eine bank wird automatisch das directory direkt in den bildschirm-speicher geladen. so kann der speicherbedarf auf das notwendigste reduziert und laestiges scrollen gespart werden. fuer das abrufen diese bank-directories, von denen es 8 geben wird, muss natuerlich ein file- browser programmiert werden. dieser soll in der endgueltigen version als steckbares rom erstellt werden. geladen wird einfach per hotkey und speichern wird mit auslesen der passenden pointer realisiert. directory-eintrag : id , dateiname, flag, blocks, (lade-)adresse,( pointer (sram)), ungenutzt $01, $10 , $01 , $01 , $02 (lo/hi) ,( $02 (lo/hi) ), ($09) $0b byte(s) banking: 512kb sram +----------------+ a18 |1 * 32| vcc a16 |2 31| a15 a14 |3 30| a17 a12 |4 29| we a7 |5 28| a13 a6 |6 27| a8 a5 |7 26| a9 a4 |8 25| a11 a3 |9 24| oe a2 |10 23| a10 a1 |11 22| ce a0 |12 21| d7 d0 |13 20| d6 d1 |14 19| d5 d2 |15 18| d4 gnd |16 17| d3 +----------------+ a16 a17 a18 bank ----+----+-----+------ 0 0 0 0 1 0 0 1 0 1 0 2 1 1 0 3 0 0 1 4 1 0 1 5 0 1 1 6 1 1 1 7 die drei oberen leitungen des sram werden mit pe0-2 des avr gebanked. so sind 8 baenke a 64kb mit jeweils 16 eintragen moeglich. gesamt sind das mit einem ram : 128 einzelne dateien. der ram-chip wird mit einem kleinen akku gepuffert. so bleiben die daten nach dem ausschalten erhalten. protokoll: empfangen vom avr: _h__ _____ ______ clock ( gesteuert vom pet) (cb2) |_| |_| byte byte <-- vom avr (pa0..7) _ _ _l____| |______| |___ strobe vom avr (ca1) ;------------------------------------------------------------------------------------------------------- avr: .macro protokoll poll: in mp,pinb ; poll for clock="0 " andi mp,2 cpi mp,2 breq poll in mp,pinb ori mp,1 ; set strobe out portb,mp andi mp,254 out portb,mp .endmacro ; send byte ;------------------------------------------------------------------------------------------------------- cbm 2001/3001: lda clock and #31 ora #192 sta clock ; clock 0 ora #244 sta clock ; clock 1 cstrobe lda strobe cmp #64 ; strobe hi ? beq cstrobe lda buf ; get byte die clock-phase von cb2 (pet) ist so kurz wie moeglich. danach wird sofort das strobe vom avr abgewartet, damit diese zugegeben sehr gewagte ;) verbindung nicht entgleist. der avr schafft das senden des strobe-hi ueber den flakengetriggerten ca1-ausgang und eines bytes auf porta, bevor der pet "lda buf" erreichen kann. ;------------------------------------------------------------------------------ ; command ;------------------------------------------------------------------------------ ; ; ; $00 : bank directory ; $01 : load (+ parameter) ; $02 : save (+ parameter) ; $03 : status ; $04 : validate ; $05 : format bank ; ; ; workstage : 19.8.2007 ; command: ldi count,0 ldi mp,0 out ddra,mp ; receive from cbm ldi r30, low(sram*2) ; sram zeiger ldi r31, high(sram*2) ; ist $60 pol1: in mp,pinb ; poll for clock="0 " andi mp,2 cpi mp,2 breq pol1 in mp,pinb ; set strobe ori mp,1 out portb,mp andi mp,254 out portb,mp in r16,pina ; port a in sram st z+,r16 inc count cpi count,32 ; 32 bytes in sram brne pol1 ;------------------------------------------------------------------------------ ldi r30, low(sram*2) ; sram zeiger ldi r31, high(sram*2) ; ist $60 ld r16,z+ cpi r16,5 breq format ; $05 : bank format cpi r16,0 breq directory ; $00 : bank directory rjmp ... ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------- routine zum formatieren eines directories ;-------------------------------------------------------------------------------------------------------- ; format bank : 16 x 32 bytes="512" bytes (0,5 kb) ; id $01 , filename $10 (fill: $20), flag $01 ($00 del /$01 prg), blocks ($01) ,loadaddr. $02, fillbytes $0b (fill : $ff) ;pb2: /ce ;pb4: /we . macro formatbank ldi mp,255 out ddrc,mp ; portc : address-register out ddrd,mp ; portd : data-port ldi count,0 ; cycle counter ldi ladr,0 ; sram: low-address ldi hadr,0 ; sram: hi-address ne: ldi r30, low(fbytes *2 ) ; low-byte in z ; set pointers to fillbytes ldi r31, high(fbytes *2) ; high-byte in z lpm senden, z+ ; ; fetch datas for portd redo: out portc,hadr ; set address port in mp,pinb ; flip latch clock from 0 to 1 to 0 ( a8 - a15 ) ori mp,0b00001000 out portb,mp andi mp,0b11110111 out portb,mp out portc,ladr ; address a0-a7 out portd,senden in mp,pinb ; set sram /we:0 /ce:0 : write andi mp,0b11101011 out portb,mp ori mp,0b11110100 ; and flip back to tristate /we:1 /ce:1 out portb,mp inc ladr brne goon inc hadr ; time to inc the hi-address (set a8) goon: lpm senden, z+ ; ; fetch datas for portd cpi senden,$0a brne redo inc count ; 16 cycles cpi count,16 brne ne .endmacro fbytes: .db $00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$0a,$00 ;------------------------------------------------------------------------------------------------------- directory als 512 byte rohdaten zum cbm uebertragen ;------------------------------------------------------------------------------------------------------- .macro bank_dir ldi mp,255 out ddra,mp ldi ladr,0 ; sram: low-address ldi hadr,0 ; sram: hi-address ldi mp,0 out ddrd,mp ; ddrd: sram data for input m5: out portc,hadr in mp,pinb ; flip latch clock from 0 to 1 to 0 ( a8 - a15 ) ori mp,0b00001000 out portb,mp out portc,ladr ; address a0-a7 in mp,pinb ; set sram /we:1 /ce:0 andi mp,0b11111011 out portb,mp in senden, pind ; get byte from sram ori mp,0b11110100 ; and flip back to tristate /we:1 /ce:1 out portb,mp inc ladr brne m4 inc hadr m4: protokoll out porta,senden brne m5 cpi hadr,2 brne m5 .endmacro ;------------------------------------------------------------------------------------------------------- zukunfts-musik, lose gedanken, spinnerei ... : 1. die bauteile sind sehr stromsparende varianten, d.h. man koennte 3 mignon-zellen als stromversorgung verwenden. 2. ein adapter fuer den druckerport des pc + software 3. verwendung an der cbm 8000-reihe jemand noch weitere ideen ? der aktuelle prototypen schaltplan : nicht endgueltige version ! (24.8.2007)
Letzte Änderung: 2019-01-06 09:30:11