Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.79 - CLIENT : 3.236.231.61

 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 

Snake Byte (Sirius Software, 1981-1982)

 
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: 3077
Localisation: Le Chesnay, France

MessagePosté le: Mar 25 Sep 2007, 10:52    Sujet du message: Snake Byte (Sirius Software, 1981-1982) Répondre en citant

What has 48K Bytes and is addictive? Snake Byte! It's the game that works like a charm. A tail of Perilous Purple Plums that's ahead of its time. A game you can sink your teeth into. An antidote for boredom. Snake Byte. Fangs alot, Sirius Software!

It is the first game I ever played on an Apple II in 1983 Wink


DISK STRUCTURE
It is a non-standard disk, only T0/S0 can be copied! Each track contains the equivalent of thirteen sectors with markers DD AD DA followed by thirteen 512 4*4 coded nibbles.

Last but not least, the first track is track 1.5 Wink


BOOT TRACE
Sirius games are actively protected against boot tracing. That is quite mandatory as, once loaded, there are no more calls to the disk, meaning all the program is loaded into memory!

- 9600<C600.C6FFM
- 96FB: AD E8 C0 60
- 9600G
Bing! At $0801, the program loads 1024 bytes from $0400 to $07FF, clears memory, EORs our boot page, resets the stack pointer, EORs ZP and then jumps to the next boot stage at $0400

Let's get the code:
- 96FB: A9 14 8D 12 08 A9 18 8D B1 08 A9 00 8D B7 08 4C 01 08
- 9600G
Bing! We now have the $0400..$07FF code at $1400..$17FF.
We have another ZP eoring, the setting of the reset vector, another EOR, another stack pointer change.
Beginning at $0472, the real load process, which ends in $0500 where memory is once more EORed. It finally jumps to $7680!

Let's try to get the program (unless you have a IIgs and enter the control panel Wink:
- 96FB: A9 80 8D 7E 08 A9 02 8D 7F 08 4C 01 08
- 0280: 48 A9 59 8D 1C 05 A9 FF 8D 1D 05 68 4C 00 04
- 9600G
Bing! The program should now be completely loaded into memory.


MEMORY ORGANIZATION
- T0/S0 - $0800..$08FF
- T0/S1..4 - $0400..$07FF
- T1.5 - $1400..$1FFF
- T2.5 - $2000..$2BFF
- T3.5 - $2800..$33FF (buffer crosses what has been previously loaded)
- T4.5 - $3400..$3FFF
- T5.5 - $4000..$4BFF
- T6.5 - $4C00..$57FF
- T7.5 - $5800..$63FF
- T8.5 - $6400..$6FFF
- T9.5 - $7000..$7BFF
- TA.5 - $7C00..$87FF


DISK COPY
You now have all the information to get the complete game and create a DOS binary file. As always, I believe it is better to rewrite the read routines Wink

The following messages will contain the original boot codes and my own versions.

What you have to take care of is the stack pointer which is really important in a Sirius software. If you do not set it correctly, the game will hang. Take care also of the false opcodes at $7680, ah! I like such games.


GETTING THE STACK POINTER VALUES
At $0867, you have the first EOR routine that sets the stack pointer. The second one at $045F. We cannot modify the original, that would change the stack pointer value. So what?
Make a copy of the EOR code somewhere else in memory and executes it, just print out the result, let me show you what to do for the first routine:
- 0367<0867.0871M
- 0371: 20 DA FD 60
- 0365: A2 00
- 365G
=> result is #$20


That's all folks. You have all the useful information to make a backup of it Wink

Toinet
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: 3077
Localisation: Le Chesnay, France

MessagePosté le: Mar 25 Sep 2007, 10:53    Sujet du message: Répondre en citant

The original boot 0 code at $0800:

Code:

*
* SIRIUS SOFTWARE: SNAKE BYTE
*

         ORG   $0800
         MX    %11
         LST   OFF
*
*
*

TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE1 EQU   $C054
HIRES    EQU   $C057

*
*
*

L0800    HEX   01

         STA   TXTCLR
         STA   MIXCLR
         STA   TXTPAGE1
         STA   HIRES
         LDX   $2B
         LDA   #$04       ; LOAD DATA AT $0400
         STA   $11
         LDY   #$00
         STY   $10
L0817    LDA   $C08C,X
         BPL   L0817
L081C    CMP   #$DD
         BNE   L0817
L0820    LDA   $C08C,X
         BPL   L0820
         CMP   #$AD
         BNE   L081C
L0829    LDA   $C08C,X
         BPL   L0829
         CMP   #$DA
         BNE   L081C
L0832    LDA   $C08C,X    ; A 4*4 NIBBLE CODE
         BPL   L0832
         SEC
         ROL
         STA   $0E
L083B    LDA   $C08C,X
         BPL   L083B
         AND   $0E
         STA   ($10),Y
         INY
         BNE   L0832
         INC   $11
         LDA   $11
         CMP   #$08       ; LOOP UNTIL WE REACH $0800
         BNE   L0832

         LDA   $C080,X    ; REMEMBER WHAT APPLE SAID

         LDA   #$09       ; CLEAR MEMORY
         STA   $01        ; FROM $0800
         LDA   #$00       ;   TO $BFFF
         STA   $00
         TAY
         LDX   #$B7
L085D    STA   ($00),Y
         INY
         BNE   L085D
         INC   $01
         DEX
         BNE   L085D
         TXA              ; X=0
L0868    INX              ; X=1
         BEQ   L0871
         EOR   L0800,X    ; EOR WITH OUR BOOT PAGE
         JMP   L0868
L0871    TAX              ; MAKE IT THE STACK POINTER!
         TXS

         LDX   #$00       ; AND NOW EOR ZP
         TXA
L0876    EOR   $00,X
         INX
         BNE   L0876      ; AND PASS THE ACC VALUE TO THE

         LDX   $2B
         JMP   $0400      ; NEXT BOOT PROCESS PLEASE

         DS    $80
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: 3077
Localisation: Le Chesnay, France

MessagePosté le: Mar 25 Sep 2007, 10:54    Sujet du message: Répondre en citant

The original boot 1 code at $0400:

Code:

*
* SIRIUS SOFTWARE: SNAKE BYTE
*

         ORG   $0400
         MX    %11
         LST   OFF

*
*
*

SOFTEV   EQU   $03F2
PWREDUP  EQU   $03F4
SPKR     EQU   $C030
TXTCLR   EQU   $C050
RDBANK2  EQU   $C080
ROMIN2   EQU   $C081
WAIT     EQU   $FCA8
RESETV   EQU   $FFFC

*
*
*

L0400    LDY   #$00       ; EOR ZP
L0402    EOR   |$0000,Y
         INY
         BNE   L0402
         TAY
         BEQ   L040E
         JMP   L0540

L040E    LDA   #<L0540    ; INSTALL RESET VECTOR
         STA   SOFTEV
         LDA   #>L0540
         STA   SOFTEV+1
         EOR   #$A5
         STA   PWREDUP

         STX   $2B
         NOP

         LDA   ROMIN2     ; ZEROES HIGH MEM
         LDA   ROMIN2     ; AND SET RESET VECTOR
         LDY   #$00
         STY   $00
         LDA   #$D0
         STA   $01
L042E    LDA   ($00),Y
         STA   ($00),Y
         INY
         BNE   L042E
         INC   $01
         BNE   L042E
         LDA   #<L0540
         STA   RESETV
         LDA   #>L0540
         STA   RESETV+1
         LDA   RDBANK2

         LDA   #$A2       ; SET THE COUT TO THE REBOOT ADD
         STA   $36
         STA   $38
         LDA   #$05
         STA   $37
         STA   $39

         LDA   #$00       ; ANOTHER EOR
         TSX
         STX   $0B
         STA   $0C
         STA   $0D
         STA   $0E
         LDA   $0B
         LDX   #$00
L0461    EOR   L0400,X
         EOR   L0500,X
         EOR   L0600,X
         EOR   L0700,X
         INX
         BNE   L0461
         TAX
         TXS

         LDY   #$03       ; MOVE TO TRACK 1.5
         JSR   L04DC

L0477    LDY   $0E        ; LOAD DATA AT L05D0,Y ADD
         LDA   L05D0,Y
         BNE   L0481
         JMP   L0500

L0481    JSR   L0490      ; LOAD DATA
         JSR   L04D8      ; NEXT TRACK
         JSR   L0600      ; HGR MODE
         INC   $0E        ; NEXT PAGE PLEASE
         JMP   L0477

         HEX   A4         ; AH AH

*
* READ DATA
*

L0490    STA   $05        ; LOAD DATA (10 SECTORS A TRACK)
         CLC
         LDA   #$0C
         STA   $06
         LDY   #$00
         STY   $04
L049B    LDA   $C08C,X
         BPL   L049B
L04A0    CMP   #$DD
         BNE   L049B
L04A4    LDA   $C08C,X
         BPL   L04A4
         CMP   #$AD
         BNE   L04A0
L04AD    LDA   $C08C,X
         BPL   L04AD
         CMP   #$DA
         BNE   L04A0
L04B6    LDA   $C08C,X
         BPL   L04B6
         SEC
         ROL
         STA   $0F
         STA   TXTCLR
L04C2    LDA   $C08C,X
         BPL   L04C2
         AND   $0F
         STA   ($04),Y
         INY
         BNE   L04B6
         INC   $05
         DEC   $06
         BNE   L04B6
         RTS

         DB    $00
         DB    $00
         DB    $00

*
* MOVE ARM
*

L04D8    LDY   #$02       ; MOVE ARM BY 2 PHASES (1 TRACK)
         STX   $2B
L04DC    INC   $0C        ; MOVE ARM BY Y PHASES
         LDA   $0C
         AND   #$03
         ASL
         ORA   $2B
         TAX
         LDA   $C081,X
         JSR   L04F8
         LDA   $C080,X
         JSR   L04F8
         DEY
         BNE   L04DC
         LDX   $2B
         RTS
L04F8    LDA   #$40
         STA   TXTCLR
         JMP   WAIT

*
*
*

L0500    LDA   $C088,X    ; STOP DRIVE

         LDA   #$14       ; ANOTHER EOR
         STA   $81
         LDA   #$00
         STA   $80
         TAY
         LDX   #$74
L050E    EOR   ($80),Y
         INY
         BNE   L050E
         INC   $81
         DEX
         BNE   L050E
         TAY
         BNE   L0540
         JMP   $7680      ; AND JUMP

         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   0000

*
*
*

L0540    LDY   #$00       ; THE RESET ROUTINE
         STY   $00        ; CLEAR ALL RAM
         LDA   #$0C       ; BEEP
         STA   $01        ; RESET (I LIKE THE CODE)
         LDX   #$B4
         TYA
L054B    STA   ($00),Y
         INY
         BNE   L054B
         INC   $01
         DEX
         BNE   L054B
         LDA   #$C0
         STA   $00
L0559    LDY   #$C0
L055B    LDA   SPKR
         LDX   $00
L0560    DEX
         BNE   L0560
         DEY
         BNE   L055B
         LSR   $00
         BNE   L0559
         LDX   $2B
         DEX
         TXA
         LSR
         LSR
         LSR
         LSR
         ORA   #$C0
         PHA
         LDA   #$FF
         PHA
         RTS

L0579    DS    $57

*
*
*

L05D0    HEX   14202834404C5864707C

         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   0000007142F8

*
*
*

L0600    STA   TXTCLR
         RTS

L0604    DS    $FC
L0700    DS    $100
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: 3077
Localisation: Le Chesnay, France

MessagePosté le: Mar 25 Sep 2007, 11:24    Sujet du message: Répondre en citant

My modified first boot process at $0800. Note that the ROM routine could have been reused, it is only for fun Wink

Code:

*
* BOOT ROM ROUTINE
*

         org   $0800
         mx    %11
         lst   off

*
* Assume SLOT 6 !
* Really optimized !
* Maybe too much...
*

TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE1 EQU   $C054
HIRES    EQU   $C057

dpBUFFER =     $10
dpSLOT   =     $2B
dpNIBBLE =     $3C
dpSECTOR =     $3D
dpBYTE   =     $40
dpTRACK  =     $41

L0300    =     $0300
L0356    =     $0356
L0400    =     $0400
L0900    =     $0900

*
*
*

L0800    hex   01

         STA   TXTCLR
         STA   MIXCLR
         STA   TXTPAGE1
         STA   HIRES

         lda   #<L0400
         sta   dpBUFFER
         lda   #>L0400
         sta   dpBUFFER+1

         lda   #0
         sta   dpTRACK

* Set read mode

         lda   $C0EE
         lda   $C0EC
         lda   $C0EA
         lda   $C0E9

* Read header

mainLOOP ldx   dpTRACK
         lda   INTER,x
         sta   dpSECTOR

readHEADER CLC
readDATA PHP
read1    LDA   $C0EC
         BPL   *-3
read2    EOR   #$D5
         BNE   read1
         LDA   $C0EC
         BPL   *-3
         CMP   #$AA
         BNE   read2
         LDA   $C0EC
         BPL   *-3
         CMP   #$96
         BEQ   doHEADER
         PLP
         BCC   readHEADER
         EOR   #$AD
         BEQ   doDATA
         BNE   readHEADER

* Read header

doHEADER LDY   #$03
]lp      STA   dpBYTE
         LDA   $C0EC
         BPL   *-3
         ROL
         STA   dpNIBBLE
         LDA   $C0EC
         BPL   *-3
         AND   dpNIBBLE
         DEY
         BNE   ]lp
         PLP
         CMP   dpSECTOR   ; Right sector ?
         BNE   readHEADER
         BCS   readDATA

* Read data

doDATA   LDY   #$56
]lp      LDX   $C0EC
         BPL   *-3
         EOR   L0356-$80,X
         DEY
         STA   L0300,Y
         BNE   ]lp

]lp      LDX   $C0EC      ; Y equals 0 ;-)
         BPL   *-3
         EOR   L0356-$80,X
         STA   (dpBUFFER),Y
         INY
         BNE   ]lp

         LDX   $C0EC      ; checksum
         BPL   *-3
         EOR   L0356-$80,X
         BNE   readHEADER

* Deniblize

doNIBBLE1 LDX  #$56       ; Y equals 0 ;-)
doNIBBLE2 DEX
         BMI   doNIBBLE1
         LDA   (dpBUFFER),Y
         LSR   L0300,X
         ROL
         LSR   L0300,X
         ROL
         STA   (dpBUFFER),Y
         INY
         BNE   doNIBBLE2

* Next sector

         inc   dpTRACK    ; next sector
         inc   dpBUFFER+1 ; next buffer
         lda   dpBUFFER+1
         cmp   #>L0800
         beq   doNEXT
         jmp   mainLOOP

*

doNEXT   LDA   $C0E0      ; REMEMBER WHAT APPLE SAID

         LDA   #>L0900    ; CLEAR MEMORY
         STA   $01        ; FROM $0900
         LDA   #<L0900    ;   TO $BFFF
         STA   $00
         TAY
         LDX   #$B7       ; $B7 pages
]lp      STA   ($00),Y
         INY
         BNE   ]lp
         INC   $01
         DEX
         BNE   ]lp

         ldx   #$20
         txs

         JMP   L0400      ; NEXT BOOT PROCESS PLEASE

*
*
*

INTER    HEX   0D0B0907

         ds    7

SIGNATURE HEX  20204C4F474F2020
         HEX   2020323030372020

         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: 3077
Localisation: Le Chesnay, France

MessagePosté le: Mar 25 Sep 2007, 11:26    Sujet du message: Répondre en citant

My modified program loading code at $0400. Shorter, faster Wink

Code:

*
* SIRIUS SOFTWARE: SNAKE BYTE
*

         ORG   $0400
         MX    %11
         LST   OFF

*
*
*

dpBUFFER =     $10
dpSLOT   =     $2B
dpNIBBLE =     $3C
dpSECTOR =     $3D
dpBYTE   =     $40
dpTRACK  =     $41

L0300    =     $0300
L0356    =     $0356
L0C00    =     $0C00
L1400    =     $1400
LD000    =     $D000

SOFTEV   EQU   $03F2
PWREDUP  EQU   $03F4
SPKR     EQU   $C030
TXTCLR   EQU   $C050
RDBANK2  EQU   $C080
ROMIN2   EQU   $C081
WAIT     EQU   $FCA8
RESETV   EQU   $FFFC

*
*
*

L040E    LDA   #<L0540    ; INSTALL RESET VECTOR
         STA   SOFTEV
         LDA   #>L0540
         STA   SOFTEV+1
         EOR   #$A5
         STA   PWREDUP

         LDA   ROMIN2     ; ZEROES HIGH MEM
         LDA   ROMIN2     ; AND SET RESET VECTOR
         LDY   #<LD000
         STY   $00
         LDA   #>LD000
         STA   $01
]lp      LDA   ($00),Y
         STA   ($00),Y
         INY
         BNE   ]lp
         INC   $01
         BNE   ]lp        ; GOOD BYE WILDCARDS !

         LDA   #<L0540
         STA   RESETV
         LDA   #>L0540
         STA   RESETV+1
         LDA   RDBANK2

         LDA   #$A2       ; SET THE COUT TO THE REBOOT ADD
         STA   $36
         STA   $38
         LDA   #$05
         STA   $37
         STA   $39

         LDA   #$00       ; ANOTHER EOR
         TSX
         STX   $0B
         STA   $0C
         STA   $0D
         STA   $0E

         ldx   #$00
         txs

         JSR   L04D8      ; MOVE TO TRACK 1

L0477    LDY   $0E        ; LOAD DATA AT L05D0,Y ADD
         LDA   L05D0,Y
         BNE   L0481
         JMP   L0500

L0481    JSR   L0490      ; LOAD DATA
         JSR   L04D8      ; NEXT TRACK
         JSR   L0600      ; HGR MODE
         INC   $0E        ; NEXT PAGE PLEASE
         JMP   L0477

* HEX A4 ; AH AH

*
* READ DATA
*

L0490    STA   dpBUFFER+1 ; LOAD DATA (10 SECTORS A TRACK)

         LDA   #$0C
         STA   dpTRACK

         LDY   #$00
         STY   dpBUFFER

]lp      ldx   dpTRACK
         lda   INTER,x
         sta   dpSECTOR

         JSR   readHEADER

         inc   dpBUFFER+1
         dec   dpTRACK
         bne   ]lp
         rts

*
* MOVE ARM
*

L04D8    LDY   #$02       ; MOVE ARM BY 2 PHASES (1 TRACK)
]lp      INC   $0C        ; MOVE ARM BY Y PHASES
         LDA   $0C
         AND   #$03
         ASL
         TAX
         LDA   $C0E1,X
         JSR   L04F8
         LDA   $C0E0,X
         JSR   L04F8
         DEY
         BNE   ]lp
         RTS
L04F8    LDA   #$40
         STA   TXTCLR
         JMP   WAIT

*
*
*

L05D0    HEX   14202834404C5864707C

         ds    \

*
*
*

L0500    LDA   $C0E8

         LDA   #>L1400    ; ANOTHER EOR
         STA   $81
         LDA   #<L1400
         STA   $80
         TAY
         LDX   #$74
L050E    EOR   ($80),Y
         INY
         BNE   L050E
         INC   $81
         DEX
         BNE   L050E
         TAY
         BNE   L0540

         JMP   $7680      ; AND JUMP

         ds    34

*
*
*

L0540    LDY   #<L0C00    ; THE RESET ROUTINE
         lst   off
         STY   $00        ; CLEAR ALL RAM
         LDA   #>L0C00    ; BEEP
         STA   $01        ; RESET (I LIKE THE CODE)
         LDX   #$B4
         TYA
L054B    STA   ($00),Y
         INY
         BNE   L054B
         INC   $01
         DEX
         BNE   L054B
         LDA   #$C0
         STA   $00
L0559    LDY   #$C0
L055B    LDA   SPKR
         LDX   $00
L0560    DEX
         BNE   L0560
         DEY
         BNE   L055B
         LSR   $00
         BNE   L0559

         LDX   $2B
         DEX
         TXA
         LSR
         LSR
         LSR
         LSR
         ORA   #$C0
         PHA
         LDA   #$FF
         PHA
         RTS

         ds    \

*
*
*

L0600    STA   TXTCLR
         RTS

         ds    \

*
* We are at $0700 ;-)
*

readHEADER CLC
readDATA PHP
read1    LDA   $C0EC
         BPL   *-3
read2    EOR   #$D5
         BNE   read1
         LDA   $C0EC
         BPL   *-3
         CMP   #$AA
         BNE   read2
         LDA   $C0EC
         BPL   *-3
         CMP   #$96
         BEQ   doHEADER
         PLP
         BCC   readHEADER
         EOR   #$AD
         BEQ   doDATA
         BNE   readHEADER

* Read header

doHEADER LDY   #$03
]lp      STA   dpBYTE
         LDA   $C0EC
         BPL   *-3
         ROL
         STA   dpNIBBLE
         LDA   $C0EC
         BPL   *-3
         AND   dpNIBBLE
         DEY
         BNE   ]lp
         PLP
         CMP   dpSECTOR   ; Right sector ?
         BNE   readHEADER
         BCS   readDATA

* Read data

doDATA   LDY   #$56
]lp      LDX   $C0EC
         BPL   *-3
         EOR   L0356-$80,X
         DEY
         STA   L0300,Y
         BNE   ]lp

]lp      LDX   $C0EC      ; Y equals 0 ;-)
         BPL   *-3
         EOR   L0356-$80,X
         STA   (dpBUFFER),Y
         INY
         BNE   ]lp

         LDX   $C0EC      ; checksum
         BPL   *-3
         EOR   L0356-$80,X
doDATA1  BNE   readHEADER

* Denibblize

doNIBBLE1 LDX  #$56       ; Y equals 0 ;-)
doNIBBLE2 DEX
         BMI   doNIBBLE1
         LDA   (dpBUFFER),Y
         LSR   L0300,X
         ROL
         LSR   L0300,X
         ROL
         STA   (dpBUFFER),Y
         INY
         BNE   doNIBBLE2

* Next sector

         clc
         rts

* Interleaving

INTER    HEX   06080A0C0E
         HEX   01030507090B0D00

         ds    \
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
Page 1 sur 1

 
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