C64Power Forum
Software => Software => Wątek zaczęty przez: jad w 11 Października 2016, 11:19
-
Kolega pLayer_sct zgłosił mi problem z nagrywaniem obrazów d64 na dyskietkę za pomocą (mojego) programu d64-to-1541. Dema zgrane tym softem wysypują się w losowych momentach.
Użyłem tam procedur zapisu na dyskietkę, które wyrypałem z fast hack'em. Okazuje się, że jest z nimi coś nie teges, bo np. działające demka, po zrobieniu kopii dyskietki fast hack'emem, owe kopie też działają inaczej.
Chętnie rozwiązałbym ten problem, bo zdarza mi się czasem użyć własnego softu i chcę żeby działał dobrze.
Widzę 2 możliwości:
1. Nakłonić procedury fast hack'em do prawidłowego działania
2. Użyć innych szybkich procedur zapisu sektorów
Nie mam niestety żadnego ekspirjensu w kodowaniu stacji 1541. Może ktoś by mi pomógł?
-
Prosty temat przy okazji wkleję Ci prockę do szybkiego posyłania bloku do stacji i jego zapisu.
-
no zaczęło się od tego, że w sdbrowse mu nie działało - no to napisałem żeby sprawdził na Twoim tool-sie, bo w jest zaszyty sdbrowse :)
Ale okazało się że w obecnej wersji sdbrowse (nad którą pracuję i którą mu wysłałem), ze zmodyfikowaną Twoją procką zadziałało. Chcesz źródło ?
@Wegi, pLayer_sct zaproponował od razu żeby dorobić także exteded tracks, potrzeba jakiś specjalnych sztuczek, czy ustawić na 35 ścieżkę i przesuwać głowicę co dwa kroki ?
-
Prosty temat przy okazji wkleję Ci prockę do szybkiego posyłania bloku do stacji i jego zapisu.
Wegi, dzięki. Przydałaby się też procka formatująca ścieżkę.
-
Ale okazało się że w obecnej wersji sdbrowse (nad którą pracuję i którą mu wysłałem), ze zmodyfikowaną Twoją procką zadziałało. Chcesz źródło ?
Poproszę źródło.
-
@Wegi, pLayer_sct zaproponował od razu żeby dorobić także exteded tracks, potrzeba jakiś specjalnych sztuczek, czy ustawić na 35 ścieżkę i przesuwać głowicę co dwa kroki ?
http://csdb.dk/release/?id=81316
Takie rzeczy robi krótki program run&restore nagrywany z illegal dir
jak pamiętam...
;drivecode
*=$0400
Lda #36 ;track
sta $06
lda#$00 ;sector... ble ble i tak go nie ma na 36 sciezce
sta $07
lda #$80
sta $00
lda $00
bmi *-2
rts
I już głowica jest nad trackiem 36
@jad Sources między innymi formaterów tutaj
http://csdb.dk/release/?id=85881
-
procka przesuwu głowicy wygląda tak (w Y docelowy track):
tya
sec
sbc $22 ;current track for drive
beq ++ ;if current = target then skip the head movement
ldx #1 ;step by +1 (if current track < target track)
bcs +
;if current > target
;prepare the movement outwards to outside of the disk (to track 1)
ldx #$ff ;step by -1
eor #$ff ;change sign of the result
adc #1 ;take a absolute value of difference between tracks
+
asl ;multiply by 2, cause the step motor is 0.5 track
stx fr_temp_1 ;remember move direction
tax ;save steps counter
- clc
lda $1c00 ;motor control register
adc fr_temp_1
and #3
sta fr_temp_2
lda $1c00
and #$fc
ora fr_temp_2 ;next move direction
sta $1c00
lda #$94 ;[$94] set timer for next interation
sta $1805
- bit $1805
bmi - ;wait (about $14ff ticks)
dex ;next step
bne --
+
sty $22 ;on the target track
-
No sie zaczęło :) Czego to się nie robi żeby wygodnie oglądać demka :) Na ale wszystko dla szczytnej ideii aby nie używać pc z xu1541 tylko wszystko robic z poziomu komcia :)
Skull przy okazji takie pytanie, jest jakaś opcja aby zmniejszyć ilość wyświetlanych kolumn w tym nowym sdbrowse? Bo mi chyba ok 1 albo dwie kolumny wychodzi poza ekran
-
!to "procka.prg" , CBM
*= $0801
;-----------
VECTR1 = $FB
VECTR2 = $FD
;-----------
;-----------
;BASICLINE
!byte $0b,$08,$90,$06,$9e,$32
!byte $30,$34,$39,$00,$a0,$00
JMP STARTMW
;--------
;--------
SENDDRIV
PHA
LSR A
LSR A
LSR A
LSR A
TAX
BIT $DD00
BVC *-3
SEC
-
LDA $D012
SBC #$32
BCC +
AND #$07
BEQ -
+
LDA #$03
NOP
NOP
LDA #$03
STA $DD00
LDA TABKON,X
STA $DD00
LSR A
LSR A
AND #$F7
STA $DD00
PLA
AND #$0F
TAX
LDA TABKON,X
STA $DD00
LSR A
LSR A
AND #$F7
STA $DD00
LDA #$23
NOP
NOP
NOP
STA $DD00
RTS;-
TABKON !BYTE $07,$87,$27,$A7,$47,$C7
!BYTE $67,$E7
!BYTE $17,$97,$37,$B7,$57,$D7
!BYTE $77,$F7
;-
;--------
STARTMW
;---
JSR SEND_PRG
BCC +
rts ; error - dev not present or so
+ SEI
LDA #1 ;TRACK
JSR SENDDRIV
LDA #0 ;SECTOR
JSR SENDDRIV
LDY #$00
- LDA $0400,Y
JSR SENDDRIV
INY
BNE -
LDA #0
JSR SENDDRIV ; DISCONNECT
CLI
CLC
RTS
;----------------------
SEND_PRG
LDA #$37
STA $01
LDA #<DRIVECODE
STA MEW3+1
LDA #0
STA MWRT
LDA #>DRIVECODE
STA MEW3+2
;---
LDX #4
MEW JSR LISTEN
BCC MEWCNT
RTS
MEWCNT
LDY #$05
MEW2 LDA TXMW,Y
JSR $FFA8
DEY
BPL MEW2
LDY #$20
MEW3 LDA 1000
JSR $FFA8
INC MWRT
INC MEW3+1
BNE MEW4
INC MEW3+2
MEW4
DEY
BNE MEW3
JSR $FFAE
DEX
BNE MEW
;-
JSR LISTEN
LDY #$04
MEX1 LDA MEX,Y
JSR $FFA8
DEY
BPL MEX1
JSR $FFAE
SEI
LDA #$23
STA $DD00
BIT $DD00
BVS *-3
;LDA #$35
;STA $01
CLC
RTS
;JMP DALEJ
;-
LISTEN
LDA #$00
STA $90
LDA $BA
JSR $FFB1
LDA #$6F
JSR $FF93
LDA $90
BMI NODRIVE
CLC
RTS
NODRIVE SEC
RTS
;-
TXMW
!BYTE $20
!BYTE 4
MWRT !BYTE 0
!TEXT "W-M"
;-
MEX
!BYTE 4
!BYTE 0
!TEXT "E-M"
;--------
;--- START DRIVE CODE
;--------
DRIVECODE
;--------
!PSEUDOPC $0400
STARTER
JSR $C100
SEI
LDA #$18
STA $1C07
LDA #$7A
STA $1802
JSR SETLINE
JSR $F5E9
GTPRG
SEI
JSR READONE
BNE +
CLI
RTS
+ STA $06 ;TRACK
JSR READONE
STA $07 ;SECTOR
JSR READBLOK
LDX #0
LDA #$90
STA $0298
JSR $D57D
LDA #5
STA $6A
CLI
JSR $D599
CMP #$02
BCC GTPRG
STX $1800
JMP $E60A ;ERROR
;---
READONE
LDY #$FF
!BYTE $2C
;-
READBLOK LDY #$00
;-
READBT
LDA #$00
STA $1800
WTR1 LDA $1800
BNE *-3
PHP
LDA $1800
ASL A
PLP
EOR $1800
ASL A
ASL A
ASL A
NOP
NOP
NOP
EOR $1800
ASL A
NOP
NOP
NOP
EOR $1800
ADDR = *+2
STA $0300,Y
STA LASTGET
; NOP
INY
BNE WTR1
SETLINE
LDA #$08
STA $1800
LASTGET = *+1
LDA #$00
RTS
;--------
!REALPC
Procka zapisuje podane 256 bajtów pod wskazany track i sector. I zapętla się w oczekiwaniu na kolejny track i sector, chyba, że zostanie posłane #$00 jako track
Można to przyspieszyć, gdybyś posyłał bloki z przeplotem 8-10
-
Można to przyspieszyć, gdybyś posyłał bloki z przeplotem 8-10
Wegi, prośba. Gdybyś mógł podać przepis na przeplot, tzn. nr ścieżki - wartość przeplotu.
Sorry, na prawdę nie znam się na stacji ...
-
for i := 1 to 35 do
begin
if i < 18 then tb_manysec[i] := 21;
if ((i>17)and(i<25)) then tb_manysec[i] := 19;
if ((i>24)and(i<31)) then tb_manysec[i] := 18;
if i > 30 then tb_manysec[i] := 17;
end;
for i := 1 to 17 do
begin
maxsec := tb_manysec[i];
cntrsec := maxsec;
for i4 := 0 to maxsec do _bufenq[i4] := 255;
for i4 := 0 to maxsec do _tabsec[i4] := 255;
acc := maxsec; //maxsec
xreg := 0;
cntr1 := xreg;
cntr2 := xreg;
xreg := cntr1;
acc := cntr2;
asm
pushad
xor eax,eax // lda #0
xor ebx,ebx //tax
xor ecx,ecx //tay
@scloop:
mov bl, byte ptr [cntr1] //ldx cntr1
mov al, byte ptr [cntr2] //lda cntr2
mov byte ptr [_bufenq] + [ebx],al //sta bufenq,x
mov cl,al //tay
mov al,bl //txa
mov byte ptr [_tabsec] + [ebx],al //sta tabsec,x
inc byte ptr [cntr2] //inc cntr2
dec byte ptr [cntrsec] //dec cntrsec
je @scl4 //beq scl4
mov al, byte ptr[cntr1] //lda cntr1
clc //clc
adc al,byte ptr [interleave] //adc #interleave
cmp al, byte ptr[maxsec] //cmp maxsec
jc @scl2b //bcc scl2b
sbb al, byte ptr [maxsec] //sbc maxsec
@scl2b:
mov bl,al //tax
@scl2:
mov byte ptr[cntr1],bl //stx cntr1
mov al,byte ptr[_bufenq]+[ebx] //lda bufenq,x
cmp al , 255
je @scloop //bmi scloop
inc bl //inx
cmp bl, byte ptr [maxsec] //cpx maxsec
jc @scl2 //bcc scl2
mov bl, 0 //ldx #0
je @scl2 //beq scl2
@scl4:
popad
end; //end asm
for i4 := 0 to maxsec-1 do
begin
_tabsec[_bufenq[i4]] :=i4;
end;
for i4 := 0 to maxsec-1 do
begin
tbsec[i3] :=_tabsec[i4];
inc(i3);
end;
end;
for i := 19 to 35 do
begin
maxsec := tb_manysec[i];
cntrsec := maxsec;
for i4 := 0 to maxsec do _bufenq[i4] := 255;
for i4 := 0 to maxsec do _tabsec[i4] := 255;
acc := maxsec; //maxsec
xreg := 0;
cntr1 := xreg;
cntr2 := xreg;
xreg := cntr1;
acc := cntr2;
asm
pushad
xor eax,eax
xor ebx,ebx
xor ecx,ecx
@scloop:
mov bl, byte ptr [cntr1] //ldx cntr1
mov al, byte ptr [cntr2] //lda cntr2
mov byte ptr [_bufenq] + [ebx],al //sta bufenq,x
mov cl,al //tay
mov al,bl //txa
mov byte ptr [_tabsec] + [ebx],al //sta tabsec,x
inc byte ptr [cntr2] //inc cntr2
dec byte ptr [cntrsec] //dec cntrsec
je @scl4 //beq scl4
mov al, byte ptr[cntr1] //lda cntr1
clc //clc
adc al,byte ptr [interleave] //adc #interleave
cmp al, byte ptr[maxsec] //cmp maxsec
jc @scl2b //bcc scl2b
sbb al, byte ptr [maxsec] //sbc maxsec
@scl2b:
mov bl,al //tax
@scl2:
mov byte ptr[cntr1],bl //stx cntr1
mov al,byte ptr[_bufenq]+[ebx] //lda bufenq,x
cmp al , 255
je @scloop //bmi scloop
inc bl //inx
cmp bl, byte ptr [maxsec] //cpx maxsec
jc @scl2 //bcc scl2
mov bl, 0 //ldx #0
je @scl2 //beq scl2
@scl4:
popad
end; //end asm
end;
Jak byś korzystał z tego to program musi być zmieniony tak, żeby na ścieżkę obowiązującą uruchamiany był kodem $e0 i wtedy zapisywana byłaby cała ścieżka... bez rozkazu #$90...
-
Wegi, na X86 też w asm rzeźbisz ? No, respekt :)
-
Aha przy okazji extended tracks. Formatowanie z tego co zauważyłem programy robią na 40 ścieżek. Aczkolwiek już przy zapisie jest różnie. Najlepiej pokazuje to demo http://csdb.dk/release/?id=11586 (http://csdb.dk/release/?id=11586) gdzie pierwsza strona dyskietki zapisywana jest na 37 ścieżek, a druga na 38 ścieżek. Tak więc przy zapisie takich dyskietek chyba powinien wyskoczyć jakiś requester z pytaniem o zapis ostatniej ścieżki.
Przynajmniej z poziomu xu1541 i opencbm tak się robi przy komendzie kopiowania:
d64copy.exe plik.d64 8 -exx - gdzie parametr e określa która jako ostatnia ścieżka ma być zapisana.
-
Jeszcze jedno - dalej testuje demka i niestety Skull nowy SDBrowse wysypał sie na http://csdb.dk/release/?id=149153 (http://csdb.dk/release/?id=149153). Standardowo CBMCommand 2.3 bez problemu zapisał i demko poszło bez niespodzianek
-
przynajmniej skull ma betatestera konkretnego :)
to tylko wstawka asm w delphi @kb777
proponuję przetestować illegal dir :)
-
mała errata - wpadłem jeszcze na pomysł aby to niedziałające demko zgrać jeszcze raz pod nowym SDBrowsem ale z wyłączonym Jiffym - zadziałało, nic sie nie wiesza :) Tak więc cofam ostatnie słowa, nadal wszystko działa :)
-
w miedzyczasie gdy forum nie działało wypuściłem:
https://youtu.be/Di7XkxjUxQI
http://csdb.dk/release/?id=152470
-
w miedzyczasie gdy forum nie działało wypuściłem:
https://youtu.be/Di7XkxjUxQI
http://csdb.dk/release/?id=152470
super duper !!!
-
w miedzyczasie gdy forum nie działało wypuściłem:
https://youtu.be/Di7XkxjUxQI
http://csdb.dk/release/?id=152470
Jutro się zabiorę za piłowanie demek :)
-
Kurcze, przycina mi lewą i prawą krawędź na szerokość 1 znaku. :(
EDIT: o damn, to syncmaster 940 przycina :o cholera, a mam z niego najlepszy obraz :-\