.................................................................................
-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