Voir le sujet pr�c�dent :: Voir le sujet suivant |
Auteur |
Message |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 25 Sep 2007, 10:52 Sujet du message: Snake Byte (Sirius Software, 1981-1982) |
|
|
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
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
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 :
- 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
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
Toinet |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 25 Sep 2007, 10:53 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 25 Sep 2007, 10:54 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 25 Sep 2007, 11:24 Sujet du message: |
|
|
My modified first boot process at $0800. Note that the ROM routine could have been reused, it is only for fun
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 |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 25 Sep 2007, 11:26 Sujet du message: |
|
|
My modified program loading code at $0400. Shorter, faster
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 |
|
![](templates/subSilver/images/spacer.gif) |
|