Mail has been fixed; you should now be able to confirm your e-mail address, watch pages, and the like.
Please report any issues on Discord.

Arkanoid II: Revenge of DOH (Amstrad CPC)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Arkanoid II: Revenge of DOH

Developer: Ocean
Publisher: Imagine Software
Platform: Amstrad CPC
Released in EU: 1988


SourceIcon.png This game has uncompiled source code.
DevMessageIcon.png This game has a hidden developer message.


Source Code Fragments

A good chunk of code can be seen, scattered through the game. These can be seen with a hex editor at the hex addresses listed below in the .dsk dump. Note that these code fragments are repeated multiple times and some instances are more complete than others.

3D00:

org &ae00,&4000
nolist
limit &ffff

ld hl,(&be7d)
ld a,(hl)                  ;current drive
ld (drive+1),a

ld c,&ff
ld hl,start
call &bd16

.start
call &bccb
.drive ld a,0
ld hl,(&be7d)
ld (hl),a

ld a,0
call &bc0e
ld bc,&000
call &bc38
ld hl,colour_palette
ld b,16
xor a
.do_colours
push bc
push af
ld c,(hl)
inc hl
ld b,c
push hl
call &bc32
pop hl
pop af
pop bc
inc a
djnz do_colours

call load_block
call exec_it
ld hl,&4000
ld de,&c000
ld bc,&4000
ldir

call load_block

call load_block
di
jp &3089

.load_block
ld hl,end_filename-1
inc (hl)

ld b,end_filename-filename
ld hl,filename
ld de,&c000
call &bc77
ex de,hl
call &bc83
push hl
call &bc7a
pop hl
ret

.exec_it
jp (hl)

.execution_address defw 0

.colour_palette
defb 0,&d,&1a,&15,&19,&9,&18,&0a,&14,&1,&2,&b,&10,&f,&3,&6

.filename
defb "ARKANOID.BI0"
.end_filename

4091:

.routine_address          equ &35fc

org routine_address
nolist
write"arkanoid.lod"

let mode=1                          ;screen mode

.load_address             equ &4000;address to put file

.km_initialise            equ &bb00
.txt_output               equ &bb5a
.cas_in_open              equ &bc77
.cas_in_direct            equ &bc83
.cas_in_close             equ &bc7a
.cas_in_abandon           equ &bc7d

.kl_init_back             equ &bcce
.kl_l_rom_disable         equ &b909

;; ** STORE DATA USED BY PROGRAM THAT WILL BE CORRUPTED BY INITIALISATION OF **
;; ** FIRMWARE **

di
ld (stack+1),sp             ;save stack used by program
ld sp,&c000                 ;new stack used by firmware and load routines

;; ** SAVE DATA OVERWRITTEN BY FIRMWARE **
;; !!EXAMPLE!!

ld hl,&a800
ld de,&c100
ld bc,&c000-&a800
ldir

ld hl,&0000
ld bc,&0040
ldir


;;ld hl,&a800                  
;;ld de,&c000                 ;upper firmware area (&a800?-&c000)

;;ld a,4
;;.next push af

4E00:

;;push de
;;ld bc,&600
;;ldir
;;pop de
;;ld a,d
;;add a,8
;;ld d,a
;;pop af
;;dec a
;;jr nz,next

;;ld h,&00                    ;firmware lower jumpblock (&0000-&0040)
;;ld l,0
;;ld c,&40
;;ldir
ld hl,here
ld de,&c000
ld bc,end-here
push de
ldir
ret

;; ** INITIALISE ALTERNATE REGISTER SET FOR FIRMWARE **
.here
exx
ld bc,&7f00+%10001000+mode  ;initialise lower rom and select mode
out (c),c                   ;this routine must be located above &4000
exx  
ex af,af'
xor a
ex af,af'

;; ** INITIALISE FIRMWARE **

call &0044                  ;initialise lower jumpblock (&0000-&0040)
                            ;and high kernal jumpblock (&b800-&bae4)
call &08bd                  ;initialise firmware jumpblock entries
                            ;(&bb00- ...)
call km_initialise          ;initialise keyboard manager
call kl_l_rom_disable       ;disable lower rom

;; ** INITIALISE DISK ROM FOR LOADING/SAVING **

ld c,7                      ;disk rom
ld de,&0040                 ;lowest useable byte of memory
ld hl,&b0ff                 ;highest useable byte of memory
call kl_init_back           ;initialise disk rom

xor a                       ;select drive (A)
ld (&ac00),a

ld a,&ff
ld (&be78),a                ;turn of disc error messages

ld a,&c9
ld (txt_output),a           ;prevent printing of text characters
                            ;don't get error messages corrupting screen

;; ** LOAD FILE USING FIRMWARE **

ld b,end_filename-filename  ;length of filename
ld hl,filename              ;address of filename in memory
ld de,load_address          ;address to put file/2k buffer to use (unused since
                            ;read direct used
call cas_in_open            ;open file

ld hl,load_address                      ;HL = load address, BC = length of file
call cas_in_direct          ;read it
call cas_in_close           ;close it


;; ** RESTORE DATA WHICH WOULD HAVE BEEN OVERWRITTEN BY FIRMWARE **
;; !!EXAMPLE!!
di
ld hl,&c100
ld de,&a800
ld bc,&c000-&a800
ldir
ld de,&0000
ld bc,&0040
ldir

;;ld hl,&c000                 ;copy back data
;;ld de,&a800

;;ld a,4
;;.next2 push af
;;push hl
;;ld bc,&0600
;;ldir  
;;pop hl
;;ld a,h
;;add a,8
;;ld h,a
;;pop af
;;dec a
;;jr nz,next2

;;ld d,&00                    ;copy back &0000-&0040
;;ld e,0
;;ld c,&40
;;ldir  

.stack ld sp,0              ;old stack back and...
ret                         ;...exit to program!!

.filename
defb "ARKANOID.LV0"
.end_filename
.end

Developer Message

A small message can be found at A005 in the .dsk dump:

HELLO HACKERS STOP PEEKING (SORRY) AT MY (RUSHED) CODE.
THERE IS A CHEAT MODE IF YOU CAN FIND IT ????