Index du Forum
IDENTIFICATION SERVEUR : 51.77.218.153 - CLIENT : 3.233.221.149

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

TOY SHOP
Aller ŕ la page Précédente  1, 2, 3, 4  Suivante
 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Ven 07 Fév 2014, 21:02    Sujet du message: Répondre en citant

Could the second disk be 16-sec with tracks startimg at .5 with a 1 track step? Just like earlier Brody titles?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Sam 08 Fév 2014, 3:27    Sujet du message: Répondre en citant

As I understand it, both data disks are 18-sector format, though I haven't checked. However, even if they were 16-sector with .5 track start, they would not be readable with regular DOS 3.3. Toy Shop carries a regular DOS 3.3 which is used to save and load the user-created files.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Mer 19 Fév 2014, 22:05    Sujet du message: Répondre en citant

Some more info while disassembling the RWTS
1. There are some tricks, see $6A15 which calls $D000 discreetly...
2. commands

00 dd ww: turn motor on
dd: drive (1 for drive 1, 2 for drive 2)
ww: nb of seconds to wait (eg. 4 = 4s)

01 : turn motor off
no parms

02 cc tt: move arm
cc: calibrate if <> 00
tt: track to go to

03 aa: read full 18-sec track
aa: first address in RAM for first sec to load

04 aa .. rr: read 18-sec track sec-by-sec
aa..rr are 18 RAM pointers where each sector will be loaded
if aa..rr contains a 00, then the sector is ignored and not loaded
truly, it is loaded at $CF00 Wink

Up to 16 commands may exist, there is no check...

For calls 3 and 4, bit 7 and 6 can be set (eg. 43 or 44)
bit 7: 0 means "exit on error" / 1 means "retry on error"
bit 6: 0 means "do not move arm after track is read" / 1 means "move arm after track is read"

Imagine we are on track 0 and move to track 11, we want to read data starting at $2000
- turn drive on: 00 01 04 (drive 1, wait)
- move head: 02 00 11 (no calibrate)
some possibilities:
- 03 20: read T$11 at $2000
- 43 20: read T$11 at $2000 then move arm
- 83 20: read T$11 at $2000, retry on error
- C3 20: read T$11 at $2000, retry on error. If read OK, move arm

Format of a track (for Toy Shop)
1. header: D5 9D tt ss cc AA
where tt is the track, ss the sector, cc the checksum (tt v ss v cc)

2. data: A5 + 342 nibbles + cc + D4
where cc is the checksum

av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Jeu 20 Fév 2014, 18:31    Sujet du message: Répondre en citant

toinet a écrit:
Some more info while disassembling the RWTS
1. There are some tricks, see $6A15 which calls $D000 discreetly...


Yes, $D000 is the Master side A copy protection that I mentioned before.
read track 21;
phase 3 is turned on then off;
read track again;
phase 0 is turned on then off;
read track again.
Do you understand what is supposed to happen there?

toinet a écrit:
some possibilities:
- 03 20: read T$11 at $2000
- 43 20: read T$11 at $2000 then move arm
- 83 20: read T$11 at $2000, retry on error
- C3 20: read T$11 at $2000, retry on error. If read OK, move arm


Yes, I have seen these being used in different places. The routine at $6800 uses 03/43 combination to read the DOS and then seek to track $11. The print file uses 43 and 04 to reload $e000-$ffff. The prtoy file uses $84/C4 because it wants to read individual sectors.

But I still do not find any option for reading 18-sector data disks.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 20 Fév 2014, 18:36    Sujet du message: Répondre en citant

qkumba a écrit:

Do you understand what is supposed to happen there?

Have not read code further than the R-TS yet

qkumba a écrit:

But I still do not find any option for reading 18-sector data disks.

Useless data disks?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 20 Fév 2014, 22:23    Sujet du message: Répondre en citant

I've finished the disassembly and comments of the R-TS routine at $6800. I've also rewritten it to be called by a BASIC program. I used it for Master disk side B but I forgot track $9 was a regular 16-sec one, ahem...

I've made other BASIC programs (make.td1A/1b/2a/2b) to make a binary image of each Toy Disk and all... failed...

It looks like the first RTS routines may be different from the second one, I'll have to dig into that one also but let's focus on both sides of the master disk.

"Son, give me back my Mac please... I have urgent things to deal with!"
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 20 Fév 2014, 22:51    Sujet du message: Répondre en citant

This is the commented code at $6800. It is loaded by the BOOT 1 code on track 0, sector 0 (which also loads data at $1000):

Code:
*
* Toy Shop
*
* (c) 1986, Broderbund Software
* (k) 2014, LoGo
*

*----------------------------

         TYP   BIN

         ORG   $006800
         MX    %11
         lst   off

*----------------------------

SOFTEV   EQU   $03F2
PWREDUP  EQU   $03F4
KBD      EQU   $C000
KBDSTROBE EQU  $C010
SPKR     EQU   $C030
TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE1 EQU   $C054
TXTPAGE2 EQU   $C055
HIRES    EQU   $C057
RDROM1   EQU   $C08A
LCBANK1  EQU   $C08B
CLRROM   EQU   $CFFF
SETKBD   EQU   $FE89
SETVID   EQU   $FE93
RESETV   EQU   $FFFC

*---------- The beautiful equates

zp00     =     $00

ptr26    =     zp00+$26
ptr28    =     ptr26+2
ptr2A    =     ptr28+2

zp26     =     ptr26
zp27     =     zp26+1
zp28     =     zp27+1

dpTRACK  =     $2C
dpSECTOR =     $2D

zp2E     =     dpSECTOR+1
zp2F     =     zp2E+1
zp30     =     zp2F+1
zp3A     =     zp30+$A
zp3B     =     zp3A+1

curPHASE =     $F0
curSLOT  =     $FD
wishedTRACK =  $FE

*---------- Tables

L6E00    =     $6E00      ; nibble table
L6E43    =     $6E43      ; table of RAM ptr
L6E49    =     L6E43+6    ; ditto
L6E4F    =     L6E49+6    ; ditto
L6E55    =     L6E4F+6    ; have sectors been read?

*----------------------------

L6800    JMP   L6B1E

readDATA LDY   #$04
L6805    DEY
         BEQ   L6874

* check for A5

         JSR   readNIBBLE
         CPX   #$A5
         BNE   L6805

* Read nibbles

         LDY   #$00
         LDA   zp3A
L6813    LDX   $C0EC
         BPL   L6813
         EOR   zp3A
         EOR   L6E00,X
         STA   zp2F
         LDA   L6E00,X
         ASL
         ASL
         STA   zp30
L6826    LDX   $C0EC
         BPL   L6826
         AND   #$C0
         ORA   L6E00,X
         STA   (ptr26),Y
         STA   zp3A
         LDA   zp30
         ASL
         ASL
L6838    LDX   $C0EC
         BPL   L6838
         STA   zp30
         AND   #$C0
         ORA   L6E00,X
         STA   (ptr28),Y
         STA   zp3B
         LDA   zp30
         ASL
L684B    LDX   $C0EC
         BPL   L684B
         ASL
         ORA   L6E00,X
         STA   (ptr2A),Y
         EOR   zp3B
         EOR   zp2F
         INY
         BNE   L6813

* The checksum

L685D    LDX   $C0EC
         BPL   L685D
         EOR   L6E00,X
         EOR   zp3A
         AND   #$3F
         BNE   L6874

* end data marker

         JSR   readNIBBLE
         CPX   #$D4
         BNE   L6874
         CLC
         RTS
L6874    SEC
         RTS

*----------

readNIBBLE LDX $C0EC
         BPL   readNIBBLE
         LDA   L6E00,X
         RTS

*----------

read18   LDY   #$00       ; low pointers
         STY   ptr26
         STY   ptr28
         STY   ptr2A

*--- A 18-sec track is divided into
*--- six chunks of three sectors

         LDY   #$05
         LDA   #$30       ; "0"
         STA   zp2E
]lp      STA   L6E55,Y    ; L688D
         DEY
         BPL   ]lp

L6893    DEC   zp2E
         BEQ   L68C0
         JSR   readHEADER
         BCS   L6893

         LDA   dpTRACK    ; right track?
         CMP   wishedTRACK
         CLC
         BNE   L68BF

         LDA   L6E55,Y    ; sector read?
         BEQ   L6893      ; yes
         JSR   readDATA   ; read sector
         BCS   L6893

         LDA   #$00       ; tell sector
         LDY   dpSECTOR   ; has just
         STA   L6E55,Y    ; been read

         LDY   #$05       ; are there sectors
]lp      LDA   L6E55,Y    ; remaining?
         BNE   L6893
         DEY
         BPL   ]lp
         INY              ; no
L68BF    RTS
L68C0    SEC              ; yes
         RTS

*----------

readHEADER LDY #$FA
         STY   zp30
L68C6    INY
         BNE   L68CD
         INC   zp30
         BEQ   L68C0
L68CD    JSR   readNIBBLE
L68D0    CPX   #$D5
         BNE   L68C6
         JSR   readNIBBLE
         CPX   #$9D
         BNE   L68D0
         JSR   readNIBBLE
         STA   dpTRACK
         JSR   readNIBBLE
         STA   dpSECTOR
         JSR   readNIBBLE
         EOR   dpTRACK
         EOR   dpSECTOR
         BNE   L68C6
         JSR   readNIBBLE
         CPX   #$AA
         BNE   L68C6
         CLC
         LDY   dpSECTOR

         LDA   L6E43,Y    ; ptr to 1st sector
         STA   ptr26+1
         LDA   L6E49,Y    ; ptr to 2nd sector
         STA   ptr28+1
         LDA   L6E4F,Y    ; ptr to 3rd sector
         STA   ptr2A+1
         RTS

*----------------------------
* INIT NIBBLE TABLE
*
* A: slot
*----------------------------

L6908    STA   L69F4+1
         ORA   #$8C
         STA   readNIBBLE+1
         STA   L6813+1
         STA   L6826+1
         STA   L6838+1
         STA   L684B+1
         STA   L685D+1

         LDY   #$3F       ; make nibble table
L6921    LDX   L692C,Y
         TYA
         STA   L6E00,X
         DEY
         BPL   L6921
         RTS

L692C    HEX   96979A9B9D9E9FA6A7ABACADAEAFB2B3
         HEX   B4B5B6B7B9BABBBCBDBEBFCBCDCECFD3
         HEX   D6D7D9DADBDCDDDEDFE5E6E7E9EAEBEC
         HEX   EDEEEFF2F3F4F5F6F7F9FAFBFCFDFEFF

*----------------------------
* MOVE ARM
*
*   A: track to go
* $F0: current phase (track *2)
*----------------------------

moveARM  ASL
         STA   zp28
         CMP   curPHASE
         BEQ   L69C0
         LDA   #$00
         STA   zp26
L6977    LDA   curPHASE
         STA   zp27
         SEC
         SBC   zp28
         BEQ   L69B1
         BCS   L6988
         EOR   #$FF
         INC   curPHASE
         BCC   L698C
L6988    ADC   #$FE
         DEC   curPHASE
L698C    CMP   zp26
         BCC   L6992
         LDA   zp26
L6992    CMP   #$0C
         BCS   L6997
         TAY
L6997    SEC
         JSR   L69B5
         LDA   L69CE,Y
         JSR   L69C3
         LDA   zp27
         CLC
         JSR   L69B7
         LDA   L69DA,Y
         JSR   L69C3
         INC   zp26
         BNE   L6977
L69B1    JSR   L69C3
         CLC
L69B5    LDA   curPHASE
L69B7    AND   #$03
         ROL
         ORA   curSLOT
         TAX
         LDA   $C080,X
L69C0    LDX   curSLOT
         RTS

L69C3    LDX   #$13
L69C5    DEX
         BNE   L69C5
         SEC
         SBC   #$01
         BNE   L69C3
         RTS

L69CE    HEX   01302824201E1D1C1C1C1C1C
L69DA    HEX   702C26221F1E1D1C1C1C1C1C

*----------------------------
* RWTS 18-SEC ENTRY POINT
*----------------------------

theCMD   HEX   00

* Get the stack pointer

RWTS     PLA
         STA   L6B1A+1
         PLA
         STA   L6B1A+2

         BIT   CLRROM

         LDA   curSLOT    ; is our RWTS init'ed?
L69F4    CMP   #$00
         BEQ   L69FB      ; yes

         JSR   L6908      ; first init

*---------- Get the command

L69FB    JSR   readMLI
         STA   theCMD
         AND   #$0F
         ASL
         TAX
         LDA   L6A52,X
         STA   L6A11+1
         LDA   L6A52+1,X
         STA   L6A11+2

L6A11    JSR   $FFFF      ; execute it

         PHP              ; save status

         LDA   zp00       ; test flag $C0
L6A17    CMP   #$C0
L6A19    BCS   L6A27      ; >= go

L6A1B    PLP              ; restore status
         LDA   L6B1A+2
         PHA
         LDA   L6B1A+1
         PHA
L6A24    LDY   #$07       ; and return to
         RTS              ; the caller

*--- Ooohhhh

L6A27    PLP              ; restore
         PHP              ; save
         BCS   L6A1B      ; exit on error
         DEC   L6A2E+1    ; 4..3..2

* prior to being called, 6A2E=4
* on first call, 6A2E=3 (see above)

L6A2E    LDA   #$04       ; 3=3 ?
         CMP   #$03
         BEQ   L6A4F      ; yes, jmp $D000

* on next call, 6A2E will be 2 then 1 then 0
* we do nothing, we exit until 6A2E=0

         TAY              ; 2
         BNE   L6A1B

         STA   L6A17+1    ; C9 C0 => C9 00
         STA   L6A24+1    ; A0 07 => A0 00
         STA   L6A4F+2    ; 4C 00 D0 => 4C 00 00

         LDA   #$EA       ; BCS L6A27
         STA   L6A19      ;  becomes
         STA   L6A19+1    ; NOP NOP

         INC   curPHASE   ; next phase x 2
         INC   curPHASE   ; equals next track
         JMP   L6BDE

L6A4F    JMP   $D000

*---------- Command pointers

L6A52    DA    doMOTORON  ; 00 turn motor on
         DA    doMOTOROFF ; 01 turn motor off
         DA    doMOVEARM  ; 02 move arm
         DA    doREAD18T  ; 03 read 18T
         DA    doREAD18S  ; 04 read 18S

*----------
* MOTOR ON
*  cmd: 00 dd ww
*   dd: drive (1 or 2)
*   ww: nb of secs
*

doMOTORON LDX  curSLOT    ; CMD 0: DRIVE ON

         JSR   readMLI    ; parm 1: drive
         ORA   curSLOT
         TAY
         LDA   $C089,Y
         LDA   $C089,X

         JSR   readMLI    ; parm 2: wait
         BEQ   L6A82
         STA   zp26
L6A71    LDY   #$17
         LDX   #$00
L6A75    JSR   L68BF      ; => RTS
         DEX
         BNE   L6A75
         DEY
         BNE   L6A75
         DEC   zp26
         BNE   L6A71
L6A82    RTS

*----------
* MOTOR OFF
*  cmd: 01
*   no parms
*

doMOTOROFF LDX curSLOT    ; CMD 1: DRIVE OFF
         LDA   $C088,X
         RTS

*----------
* MOVE ARM
*  cmd: 02 cc tt
*   cc: 00 (do not calibrate) / <>00 (calibrate)
*   tt: track to move arm to
*

doMOVEARM JSR  readMLI    ; CMD 2: MOVE ARM
         BEQ   L6AA5

         LDA   #$FF       ; calibrate
         STA   wishedTRACK
         JSR   read18     ; read header
         BCC   L6AA2

         LDA   #$A0       ; read error
         STA   curPHASE
         LDA   #$00       ; ask for track 0
         JSR   moveARM    ; move arm
         LDA   #$00       ; tell it to the RWTS

L6AA2    ASL              ; track x 2
         STA   curPHASE   ; is my phase ;-)

L6AA5    JSR   readMLI    ; parm 2: track to go
         STA   wishedTRACK
         JMP   moveARM

*----------
* READ FULL 18-SEC TRACK
*  cmd 03 (bit 7 and 6)
*   aa: RAM pointer of 1st sec
*  cmd 04 (bit 7 and 6)
*   aa .. rr: RAM pointers, 00 to ignore sec
*
* bit 7: retry on error if set, exit on error if 0
* bit 6: move arm to next track if set, do not move arm if 0
*
* bit 7 is checked first, bit 6 afterwards
* you cannot move the arm if read is not OK
*

doREAD18T LDX  #$01       ; CMD 3: READ FULL TRACK
         HEX   2C
doREAD18S LDX  #$12       ; CMD 4: READ SECTOR TRACK

         JSR   prepareREAD
L6AB5    JSR   read18
         BCS   L6AC7
         BEQ   L6AC7

         ASL              ; next phase
         STA   curPHASE
         LDA   wishedTRACK
         JSR   moveARM    ; move arm
         JMP   L6AB5      ; loop

L6AC7    BIT   theCMD     ; now, test the cmd
         BCS   L6AD1      ; error?
         BVC   L6AD0      ; bit 6
         INC   wishedTRACK
L6AD0    RTS

*---

L6AD1    BPL   L6AD0      ; Error but no retry

* Beeeeeppppppppp

         LDY   #$00       ; Error
L6AD5    TYA
         BIT   SPKR
L6AD9    SEC
         SBC   #$01
         BNE   L6AD9
         DEY
         BNE   L6AD5
         BEQ   L6AB5      ; But retry

*----------

* Read parms of MLI

prepareREAD STX zp26
         LDX   #$00
]lp      JSR   readMLI
         STA   L6E43,X
         INX
         CPX   zp26       ; stop at 1 for 18T or $12 for 18S
         BCC   ]lp

* Fill in RAM table with RAM ptr

         TAY              ; A is now a Y
]lp      INY              ; Y++
         CPX   #$12
         BEQ   L6AFF
         TYA              ; save in table
         STA   L6E43,X
         INX              ; next until #$12
         BNE   ]lp

L6AFF    DEX

* Correct RAM pointer if 00

]lp      LDA   L6E43,X    ; replace 00 RAM pointer
         BNE   L6B0A      ; with
         LDA   #$CF       ; $CF00
         STA   L6E43,X
L6B0A    DEX
         BPL   ]lp

* Now, prepare the read

         LDA   wishedTRACK
         JMP   moveARM

*---------- Read MLI value ;-)

readMLI  INC   L6B1A+1
         BNE   L6B1A
         INC   L6B1A+2
L6B1A    LDA   $FFFF      ; value to read
         RTS

*----------------------------

L6B1E    STX   curSLOT    ; slot*16

         INC   $10F4      ; BUG??

         LDA   #$00
         STA   zp00
         STA   curPHASE   ; current phase
         STA   curPHASE
         TAX
         DEX
         TXS              ; stack pointer #$FF
         INX
L6B2F    LDA   $1000,X
         STA   $0300,X
         INX
         BNE   L6B2F

L6B38    LDA   L6C65,X
         STA   $0300,X
         INX
         BPL   L6B38

*----------------------------

         JSR   RWTS       ; move arm
         HEX   020001

         JSR   RWTS       ; read 18T
         HEX   4320
         BCS   L6B85

         JSR   RWTS       ; read 18T
         HEX   4332
         BCS   L6B85

         JSR   RWTS       ; read 18T
         HEX   4340
         BCS   L6B85

         JSR   RWTS       ; read 18T
         HEX   0352
         BCS   L6B85

         JSR   RWTS       ; move arm
         HEX   02001C

         JSR   RWTS       ; turn motor off
         HEX   01

         BIT   TXTPAGE1
         BIT   MIXCLR
         BIT   HIRES
         BIT   TXTCLR
         JSR   L6C48      ; wait
         BIT   TXTPAGE2
         JSR   L6C48      ; wait
         JMP   L6B88      ; next

L6B85    JMP   $0300

         lst   on

L6B88    LDA   LCBANK1    ; $C08B
         LDA   LCBANK1    ; $C08B

         JSR   RWTS       ; turn motor on
         HEX   000104     ; drive 1 / wait 4

         JSR   RWTS       ; read 18T
         HEX   4308
         BCS   L6B85

         JSR   RWTS       ; read 18S
         HEX   441A1B1C1D1E1F
         HEX   00         ; This is $6BA5, see below
         HEX   9A9B9C9D9E9FA0A1A2A3A4
         BCS   L6B85

         lst   off

         JSR   RWTS       ; read 18T
L6BB6    HEX   43A5
         BCS   L6B85

         JSR   RWTS       ; read 18S
         HEX   44B7B8B9BABBBCBDBEBF00D000000000000000
         BCS   L6B85

* This activates a call to $D000 ;-)

         LDA   L6B88+2    ; AD 8B 'C0'
         STA   zp00

         JSR   RWTS       ; read 18T
         HEX   43E0
         BCS   L6B85

*----------

L6BDE    JSR   RWTS       ; move arm
         HEX   020011

         LDA   curSLOT
         LSR
         LSR
         LSR
         LSR
         STA   $AA6A
         TAY
         LDA   curPHASE
         STA   $0478,Y

         LDA   L6BB6+1    ; 43 'A5'
L6BF6    STA   L6800+1    ; 4C '1E' 6B
         CLC
         ADC   #$08       ; A5+8=AD
L6BFC    STA   L6800      ; AD A5 6B = LDA $6BA5
                          ; will be replaced with EA A9 00

         LDA   RDROM1
         JSR   $A7D4
         JSR   SETVID
         JSR   SETKBD
         JSR   $A851

         LDA   #$00
         STA   SOFTEV
         TAX
         LDA   #$03
         STA   SOFTEV+1
         TAY
         EOR   #$A5
         STA   PWREDUP

         LDA   LCBANK1
         LDA   LCBANK1

         STX   RESETV
         STY   RESETV+1

         LDA   #$20       ; 8D 01 68
         STA   L6BF6+1    ; 8D 20 68
         STA   $F1
         LDX   #$00       ; $B700
         STA   L6BFC      ; 8D 00 68 => 20 00 68 => JSR !!
         STX   $48
         LDA   #$B7
         STA   $49
         STX   $35
         LDA   #$14
         STA   $22
         STA   $25
         JMP   $0800

*---------- Wait for a little time

L6C48    LDA   #$00
         TAX
         TAY
         STA   $01
L6C4E    BIT   KBD
         BMI   L6C61
         INX
         BNE   L6C4E
         INY
         BNE   L6C4E
         INC   $01
         LDA   $01
         CMP   #$04
         BCC   L6C4E
L6C61    BIT   KBDSTROBE
         RTS

*----------------------------

L6C65    LDA   LCBANK1    ; 6C65 GOES TO 300
         LDA   LCBANK1
         LDX   #$00
L6C6D    LDA   #$00
         TAY
L6C70    STA   $0800,Y
         STA   $0900,Y
         STA   $0A00,Y
         STA   $0B00,Y
         STA   $0C00,Y
         STA   $0D00,Y
         STA   $0E00,Y
         STA   $0F00,Y
         INY
         BNE   L6C70
         INX
         CPX   #$17
         BCC   L6C96
         BEQ   L6C9A
         CPX   #$1E
         BCS   L6CB0
L6C96    LDA   #$08
         BNE   L6C9C
L6C9A    LDA   #$10
L6C9C    STA   $01
L6C9E    LDA   $030D,Y
         CLC
         ADC   $01
         STA   $030D,Y
         INY
         INY
         INY
         CPY   #$16
         BCC   L6C9E
         BCS   L6C6D
L6CB0    LDA   RDROM1
         INC   PWREDUP
         JMP   (RESETV)

         HEX   00
         HEX   1D

         STA   $89
         LDA   $82
         ORA   $83
         BNE   L6CC6
         JMP   $0DCF

L6CC6    LDA   #$80
         CMP   $82
         TXA
         SBC   $83
         BVS   L6CD4
         BMI   L6CD4
         JMP   $0CDD

L6CD4    LDA   #$80
         STA   $84
         STX   $85
         JMP   $0CE5

         LDA   $82
         STA   $84
         LDA   $83
         STA   $85
         LDA   $85
         PHA
         LDA   $84
         PHA
         LDA   $87
         PHA
         LDA   $86
         PHA
         TXA
         PHA
         LDA   #$02
         PHA
         LDA   $89
         PHA
         LDA   $88
         PHA
         JSR   $494A
         SBC   $00,X
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 20 Fév 2014, 22:53    Sujet du message: Répondre en citant

The rewritten R-TS (no more W as there is no write routine), moved at $1000 which can be called by a BASIC program.

It needs enhancements on arm movement but it answered my first needs...

Code:
*
* Toy Shop
*
* (c) 1986, Broderbund Software
* (k) 2014, LoGo
*

*----------------------------

         TYP   BIN

         ORG   $001000
         MX    %11
         lst   off

*----------------------------

SPKR     EQU   $C030
LCBANK1  EQU   $C08B
CLRROM   EQU   $CFFF

*---------- The beautiful equates

ptr26    =     $26
ptr28    =     ptr26+2
ptr2A    =     ptr28+2

zp26     =     ptr26
zp27     =     zp26+1
zp28     =     zp27+1

dpTRACK  =     $2C
dpSECTOR =     dpTRACK+1

zp2E     =     dpSECTOR+1
zp2F     =     zp2E+1
zp30     =     zp2F+1
zp3A     =     zp30+$A
zp3B     =     zp3A+1


curPHASE =     $FD
curSLOT  =     curPHASE+1
wishedTRACK =  curSLOT+1

*----------------------------

         jmp   initALL    ; $1000 - 4096: init
         jmp   readONE    ; $1003 - 4099: read track no move
         jmp   readMOVE   ; $1006 - 4102: read track move arm

*----------------------------

readDATA LDY   #$04
L6805    DEY
         BEQ   L6874

* check for A5

         JSR   readNIBBLE
         CPX   #$A5
         BNE   L6805

* Read nibbles

         LDY   #$00
         LDA   zp3A
L6813    LDX   $C0EC
         BPL   L6813
         EOR   zp3A
         EOR   L6E00,X
         STA   zp2F
         LDA   L6E00,X
         ASL
         ASL
         STA   zp30
L6826    LDX   $C0EC
         BPL   L6826
         AND   #$C0
         ORA   L6E00,X
         STA   (ptr26),Y
         STA   zp3A
         LDA   zp30
         ASL
         ASL
L6838    LDX   $C0EC
         BPL   L6838
         STA   zp30
         AND   #$C0
         ORA   L6E00,X
         STA   (ptr28),Y
         STA   zp3B
         LDA   zp30
         ASL
L684B    LDX   $C0EC
         BPL   L684B
         ASL
         ORA   L6E00,X
         STA   (ptr2A),Y
         EOR   zp3B
         EOR   zp2F
         INY
         BNE   L6813

* The checksum

L685D    LDX   $C0EC
         BPL   L685D
         EOR   L6E00,X
         EOR   zp3A
         AND   #$3F
         BNE   L6874

* end data marker

         JSR   readNIBBLE
         CPX   #$D4
         BNE   L6874
         CLC
         RTS
L6874    SEC
         RTS

*----------

readNIBBLE LDX $C0EC
         BPL   readNIBBLE
         LDA   L6E00,X
         RTS

*----------

read18   LDY   #$00       ; low pointers
         STY   ptr26
         STY   ptr28
         STY   ptr2A

*--- A 18-sec track is divided into
*--- six chunks of three sectors

         LDY   #$05
         LDA   #$30       ; "0"
         STA   zp2E
]lp      STA   L6E55,Y    ; L688D
         DEY
         BPL   ]lp

L6893    DEC   zp2E
         BEQ   L68C0
         JSR   readHEADER
         BCS   L6893

         LDA   dpTRACK    ; right track?
         CMP   wishedTRACK
         CLC
         BNE   L68BF

         LDA   L6E55,Y    ; sector read?
         BEQ   L6893      ; yes
         JSR   readDATA   ; read sector
         BCS   L6893

         LDA   #$00       ; tell sector
         LDY   dpSECTOR   ; has just
         STA   L6E55,Y    ; been read

         LDY   #$05       ; are there sectors
]lp      LDA   L6E55,Y    ; remaining?
         BNE   L6893
         DEY
         BPL   ]lp
         INY              ; no
L68BF    RTS
L68C0    SEC              ; yes
         RTS

*----------

readHEADER LDY #$FA
         STY   zp30
L68C6    INY
         BNE   L68CD
         INC   zp30
         BEQ   L68C0
L68CD    JSR   readNIBBLE
L68D0    CPX   #$D5
         BNE   L68C6
         JSR   readNIBBLE
         CPX   #$9D
         BNE   L68D0
         JSR   readNIBBLE
         STA   dpTRACK
         JSR   readNIBBLE
         STA   dpSECTOR
         JSR   readNIBBLE
         EOR   dpTRACK
         EOR   dpSECTOR
         BNE   L68C6
         JSR   readNIBBLE
         CPX   #$AA
         BNE   L68C6
         CLC
         LDY   dpSECTOR

         LDA   L6E43,Y    ; ptr to 1st sector
         STA   ptr26+1
         LDA   L6E49,Y    ; ptr to 2nd sector
         STA   ptr28+1
         LDA   L6E4F,Y    ; ptr to 3rd sector
         STA   ptr2A+1
         RTS

*----------------------------
* MOVE ARM
*
*   A: track to go
* $F0: current phase (track *2)
*----------------------------

moveARM  ASL
         STA   zp28
         CMP   curPHASE
         BEQ   L69C0
         LDA   #$00
         STA   zp26
L6977    LDA   curPHASE
         STA   zp27
         SEC
         SBC   zp28
         BEQ   L69B1
         BCS   L6988
         EOR   #$FF
         INC   curPHASE
         BCC   L698C
L6988    ADC   #$FE
         DEC   curPHASE
L698C    CMP   zp26
         BCC   L6992
         LDA   zp26
L6992    CMP   #$0C
         BCS   L6997
         TAY
L6997    SEC
         JSR   L69B5
         LDA   L69CE,Y
         JSR   L69C3
         LDA   zp27
         CLC
         JSR   L69B7
         LDA   L69DA,Y
         JSR   L69C3
         INC   zp26
         BNE   L6977
L69B1    JSR   L69C3
         CLC
L69B5    LDA   curPHASE
L69B7    AND   #$03
         ROL
         ORA   curSLOT
         TAX
         LDA   $C080,X
L69C0    LDX   curSLOT
         RTS

L69C3    LDX   #$13
L69C5    DEX
         BNE   L69C5
         SEC
         SBC   #$01
         BNE   L69C3
         RTS

L69CE    HEX   01302824201E1D1C1C1C1C1C
L69DA    HEX   702C26221F1E1D1C1C1C1C1C

*----------------------------
* RWTS 18-SEC ENTRY POINT
*----------------------------

theCMD   HEX   00

* Get the stack pointer

RWTS     PLA
         STA   L6B1A+1
         PLA
         STA   L6B1A+2

*---------- Get the command

L69FB    JSR   readMLI
         STA   theCMD
         AND   #$0F
         ASL
         TAX
         LDA   L6A52,X
         STA   L6A11+1
         LDA   L6A52+1,X
         STA   L6A11+2

L6A11    JSR   $FFFF      ; execute it

         LDA   L6B1A+2
         PHA
         LDA   L6B1A+1
         PHA
         RTS              ; the caller

*---------- Command pointers

L6A52    DA    doMOTORON  ; 00 turn motor on
         DA    doMOTOROFF ; 01 turn motor off
         DA    doMOVEARM  ; 02 move arm
         DA    doREAD18T  ; 03 read 18T
         DA    doREAD18S  ; 04 read 18S

*----------
* MOTOR ON
*  cmd: 00 dd ww
*   dd: drive (1 or 2)
*   ww: nb of secs
*

doMOTORON LDX  curSLOT    ; CMD 0: DRIVE ON

         JSR   readMLI    ; parm 1: drive
         ORA   curSLOT
         TAY
         LDA   $C089,Y
         LDA   $C089,X

         JSR   readMLI    ; parm 2: wait
         BEQ   L6A82
         STA   zp26
L6A71    LDY   #$17
         LDX   #$00
L6A75    JSR   L68BF      ; => RTS
         DEX
         BNE   L6A75
         DEY
         BNE   L6A75
         DEC   zp26
         BNE   L6A71
L6A82    RTS

*----------
* MOTOR OFF
*  cmd: 01
*   no parms
*

doMOTOROFF LDX curSLOT    ; CMD 1: DRIVE OFF
         LDA   $C088,X
         RTS

*----------
* MOVE ARM
*  cmd: 02 cc tt
*   cc: 00 (do not calibrate) / <>00 (calibrate)
*   tt: track to move arm to
*

doMOVEARM JSR  readMLI    ; CMD 2: MOVE ARM
         BEQ   L6AA5

         LDA   #$FF       ; calibrate
         STA   wishedTRACK
         JSR   read18     ; read header
         BCC   L6AA2

         LDA   #$A0       ; read error
         STA   curPHASE
         LDA   #$00       ; ask for track 0
         JSR   moveARM    ; move arm
         LDA   #$00       ; tell it to the RWTS

L6AA2    ASL              ; track x 2
         STA   curPHASE   ; is my phase ;-)

L6AA5    JSR   readMLI    ; parm 2: track to go
         STA   wishedTRACK
         JMP   moveARM

*----------
* READ FULL 18-SEC TRACK
*  cmd 03 (bit 7 and 6)
*   aa: RAM pointer of 1st sec
*  cmd 04 (bit 7 and 6)
*   aa .. rr: RAM pointers, 00 to ignore sec
*
* bit 7: retry on error if set, exit on error if 0
* bit 6: move arm to next track if set, do not move arm if 0
*
* bit 7 is checked first, bit 6 afterwards
* you cannot move the arm if read is not OK
*

doREAD18T LDX  #$01       ; CMD 3: READ FULL TRACK
         HEX   2C
doREAD18S LDX  #$12       ; CMD 4: READ SECTOR TRACK

         JSR   prepareREAD
L6AB5    JSR   read18
         BCS   L6AC7
         BEQ   L6AC7

         ASL              ; next phase
         STA   curPHASE
         LDA   wishedTRACK
         JSR   moveARM    ; move arm
         JMP   L6AB5      ; loop

L6AC7    BIT   theCMD     ; now, test the cmd
         BCS   L6AD1      ; error?
         BVC   L6AD0      ; bit 6
         INC   wishedTRACK
L6AD0    RTS

*---

L6AD1    BPL   L6AD0      ; Error but no retry

* Beeeeeppppppppp

         LDY   #$00       ; Error
L6AD5    TYA
         BIT   SPKR
L6AD9    SEC
         SBC   #$01
         BNE   L6AD9
         DEY
         BNE   L6AD5
         BEQ   L6AB5      ; But retry

*----------

* Read parms of MLI

prepareREAD STX zp26
         LDX   #$00
]lp      JSR   readMLI
         STA   L6E43,X
         INX
         CPX   zp26       ; stop at 1 for 18T or $12 for 18S
         BCC   ]lp

* Fill in RAM table with RAM ptr

         TAY              ; A is now a Y
]lp      INY              ; Y++
         CPX   #$12
         BEQ   L6AFF
         TYA              ; save in table
         STA   L6E43,X
         INX              ; next until #$12
         BNE   ]lp

L6AFF    DEX

* Correct RAM pointer if 00

]lp      LDA   L6E43,X    ; replace 00 RAM pointer
         BNE   L6B0A      ; with
         LDA   #$CF       ; $CF00
         STA   L6E43,X
L6B0A    DEX
         BPL   ]lp

* Now, prepare the read

         LDA   wishedTRACK
         JMP   moveARM

*---------- Read MLI value ;-)

readMLI  INC   L6B1A+1
         BNE   L6B1A
         INC   L6B1A+2
L6B1A    LDA   $FFFF      ; value to read
         RTS

*----------------------------
* initALL
*----------------------------

initALL  LDA   #$00
         STA   curPHASE   ; current phase

         lda   #$60
         sta   curSLOT    ; slot*16

         LDY   #$3F       ; make nibble table
]lp      LDX   L692C,Y
         TYA
         STA   L6E00,X
         DEY
         BPL   ]lp
         RTS

L692C    HEX   96979A9B9D9E9FA6A7ABACADAEAFB2B3
         HEX   B4B5B6B7B9BABBBCBDBEBFCBCDCECFD3
         HEX   D6D7D9DADBDCDDDEDFE5E6E7E9EAEBEC
         HEX   EDEEEFF2F3F4F5F6F7F9FAFBFCFDFEFF

*----------------------------
* read one track
*----------------------------

readONE  jsr   RWTS       ; turn drive one on
         hex   000104

         lda   wishedTRACK
         sta   myTRACK+2

         JSR   RWTS       ; move arm
myTRACK  HEX   020001

         JSR   RWTS       ; read 18T at $2000
         HEX   0320       ; do not move arm

         jsr   RWTS       ; turn drive off
         hex   01

         rts

*----------------------------
* read one track + move arm
*----------------------------

readMOVE jsr   RWTS       ; turn drive one on
         hex   000104

         JSR   RWTS       ; read 18T at $2000
         HEX   4320       ; move arm

         jsr   RWTS       ; turn drive off
         hex   01

         rts

*----------

         ds    \

*---------- Tables

L6E00    =     $6E00      ; nibble table
L6E43    =     L6E00+$43  ; table of RAM ptr
L6E49    =     L6E43+6    ; ditto
L6E4F    =     L6E49+6    ; ditto
L6E55    =     L6E4F+6    ; have sectors been read?

         ds    \
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 20 Fév 2014, 22:55    Sujet du message: Répondre en citant

and some examples of a BASIC program that uses the rewritten code at $1000

Code:
 10 D$ =  CHR$ (4)
 20  CALL 4096
 30  PRINT D$"CREATE TD1A,TBIN"
 40  FOR T = 0 TO 34
 50  CALL 4102
 60 BY = T * (256 * 18)
 70  PRINT T,BY
 80  PRINT D$"BSAVE TD1A,A$2000,L$1200,B";BY
 90  NEXT T
 100  END


Code:
 10 D$ =  CHR$ (4)
 20  CALL 4096
 30  PRINT D$"CREATE TD1B,TBIN"
 40  FOR T = 0 TO 34
 50  CALL 4102
 60 BY = T * (256 * 18)
 70  PRINT T,BY
 80  PRINT D$"BSAVE TD1B,A$2000,L$1200,B";BY
 90  NEXT T
 100  END


Code:
 10 D$ =  CHR$ (4)
 20  CALL 4096
 30  PRINT D$"CREATE TD2A,TBIN"
 40  FOR T = 0 TO 34
 50  CALL 4102
 60 BY = T * (256 * 18)
 70  PRINT T,BY
 80  PRINT D$"BSAVE TD2A,A$2000,L$1200,B";BY
 90  NEXT T
 100  END


Code:
 10 D$ =  CHR$ (4)
 20  CALL 4096
 30  PRINT D$"CREATE TD2B,TBIN"
 40  FOR T = 0 TO 34
 50  CALL 4102
 60 BY = T * (256 * 18)
 70  PRINT T,BY
 80  PRINT D$"BSAVE TD2B,A$2000,L$1200,B";BY
 90  NEXT T
 100  END
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Sam 22 Fév 2014, 2:43    Sujet du message: Répondre en citant

I disassembled all of the files from the master disk, and the ones that carry the RTS (gentoy, print, prtoy on side 1; gedit and tedit on side 2) have identical RTS to the one that is loaded during boot. If the data disks are not readable as 18 sectors (and they are not readable as 16 sectors) then I might be correct that they are spare disks that are intended to be used for saving edited toys. That way, the user is guaranteed to have disks available, and is not forced to buy more just to save things.

Of course, the manual might tell us more, but oh, I seem to have lost my copy of it ;-).
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Sam 22 Fév 2014, 8:48    Sujet du message: Répondre en citant

I come to the same conclusion, Peter.
I have read the manual (I have the complete package) and there are no references to the toy disks as containers of existing files. There are references to blank disks being mandatory but they never tell you to use the provided disks as data disks.

I think it is a matter of reordering things...

Antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Sam 22 Fév 2014, 9:32    Sujet du message: Répondre en citant

Proposal for disk re-organization of Master disk side A:

Code:

        00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
        -----------------------------------------------
T00:    08 68 69 6A 6B 6C B7 B8 B9 BA BB BC BD BE BF 10
T01:    20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
T02:    30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
T03:    40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
T04:    50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

T1C:    08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
T1D:    18 19 1A 1B 1C 1D 1E 1F
T1E:    9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9
T1F:    AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6       D0
T20:    E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
T21:    F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
T22:    
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Sam 22 Fév 2014, 12:35    Sujet du message: Répondre en citant

See http://www.brutaldeluxe.fr/crack/toyshop_temp_5.dsk Wink

It is not a final version. It loads the program but the 18-sec routines in the DOS 3.3 files have not been modified.

Antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Dim 23 Fév 2014, 7:39    Sujet du message: Répondre en citant

I did it this way:

Code:

        00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
         -----------------------------------------------
T00:   08 68 69 6A 6B 6C
T01:   20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
T02:   30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
T03:   40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
T04:   50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

T1C:   08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
T1D:   18 19 1A 1B 1C 1D 1E 1F    9A 9B 9C 9D 9E 9F A0
T1E:   A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0
T1F:   B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF D0
T20:   E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
T21:   F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF


That way, I was able to keep the 18-sector interface code, only the read addresses had to be changed ($32 -> $30, $52 -> $50, etc), and nothing added. Even the copy protection at $d000 is used, but without engaging the phases.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Dim 23 Fév 2014, 8:26    Sujet du message: Répondre en citant

Very nice!

I skipped the $D000 execution even if it is loaded into memory.
I also laded the code at $1000 (track 0, sector F), another useless thing.

I played with GENTOY yesterday and saw that it has a table of track/sectors to load but all are in the high tracks! Nothing there for the first 18-sec tracks.
Do other .OVR files use such tracks?

The program does not behave well on a IIgs: the joystick routine makes the menus unusable, same with Swet16 (low and high speeds)

Antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Aller ŕ la page Précédente  1, 2, 3, 4  Suivante
Page 2 sur 4

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com