org &a07a:limit &a400

;ATLANTIC SYSTEM Speedlock buster
;(C) JUNE 1990 JOHN GIRVIN
nolist
;
;To set up the various options simply set the "flag label" for the required
;option to 1. MAXAM does the rest

;

LET get_eyup=1
LET get_game=0
LET hack    =0

;

.ink     defl 16          ;Ink to flash during loading

LA07A:   RST 0            ;This replaces the memory wiper from the original

LA07B:   POP   DE         ;Loader reaches here when loading is done (eg when
         EX    AF,AF'     ;eyup is in)
         CP    &01

LA07F:   LD    B,&7F      ;Load error routine
         LD    A,ink
         OUT   (C),A
         LD    A,&54
         OUT   (C),A
         EXX   
         POP   HL
         EXX   
         RET   C          ;NC if error, else exit loader
         EXX   
         JP    &0000

LA091:   DEC   A
         JR    NZ,LA091
         AND   A
LA095:   INC   H
         RET   Z
         LD    B,&F5
         IN    A,(C)
         XOR   C
         AND   &80
         JR    Z,LA095
         LD    B,&7F
         LD    A,ink
         OUT   (C),A
         LD    A,C
         CPL   
         LD    C,A
         EXX   
         LD    A,L
         INC   A
         AND   &0F
         LD    L,A
         OR    &20
         EXX   
         RLA   
         OUT   (C),A
         SCF   
         RET   

LA0B7:   DEC   A
         JR    NZ,LA0B7
         AND   A
LA0BB:   INC   H
         RET   Z
         LD    B,&F5
         IN    A,(C)
         XOR   C
         AND   &80
         JR    Z,LA0BB
         LD    B,&7F
         LD    A,ink
         OUT   (C),A
         LD    A,C
         CPL   
         LD    C,A
         RRA   
         LD    A,&2A
         RLA   
         OUT   (C),A
         SCF   
         RET   

LA0D7:   LD    B,&F6
         LD    A,&10
         OUT   (C),A
         EXX   
         PUSH  HL
         LD    L,&00
         EXX   
         LD    HL,LA07F
         PUSH  HL
         LD    B,&F5
         IN    A,(C)
         AND   &80
         LD    C,A
LA0ED:   CALL  LA091
         JR    NC,LA0ED
         LD    HL,&0415
LA0F5:   DJNZ  LA0F5
         DEC   HL
         LD    A,H
         OR    L
         JR    NZ,LA0F5
         LD    A,&0A
         CALL  LA091
         JR    NC,LA0ED
LA103:   LD    H,&C4
         LD    A,&1C
         CALL  LA091
         JR    NC,LA0ED
         LD    A,&DA
         CP    H
         JR    C,LA103
LA111:   LD    H,&C4
         LD    A,&1C
         CALL  LA091
         JR    NC,LA0ED
         LD    A,&DA
         CP    H
         JR    C,LA103
LA11F:   LD    IY,&A5F6
LA123:   LD    L,(IY+&00)
LA126:   LD    H,&C4
         LD    A,&1C
         CALL  LA091
         JR    NC,LA0ED
         LD    A,&D7
         CP    H
         JR    NC,LA111
         INC   L
         JR    NZ,LA126
         LD    H,&70
         LD    A,&1C
         CALL  LA091
         JR    NC,LA0ED
         LD    A,&1C
         CALL  LA091
         JR    NC,LA0ED
         LD    A,H
         CP    &CD
         JR    NC,LA15A
         CP    &9C
         JR    NC,LA11F
         INC   IY
         defb &fd,&7d     ;LD A,YL
         cp &fa
         jr nz,LA123
         JR    LA11F
LA15A:   LD    A,&0B
         LD    H,&80
         LD    L,&08
         LD    A,&0B
         JR    LA166
LA164:   LD    A,&09
LA166:   CALL  LA0B7
         RET   NC
         LD    A,&0B
         CALL  LA0B7
         RET   NC
         LD    A,&9F
         CP    H
         RL    L
         LD    H,&80
         JP    NC,LA164
         LD    A,&1D
         CP    L
         JP    NZ,&0000

         NOP   
         XOR   A
         EX    AF,AF'
         LD    H,&A1
         LD    L,&01
         LD    IY,&9C00
         LD    A,&04
         JR    LA1A6
LA18F:   LD    A,&4F
         XOR   L
         ADD   A,&DE
         LD    (IX+&00),A
         INC   IX
         DEC   DE
         LD    H,&A1
         LD    L,&01
         LD    L,&01
         LD    A,&01
         JR    LA1A6
LA1A4:   LD    A,&09
LA1A6:   CALL  LA0B7
LA1A9:   RET   NC
         LD    A,&0B
         CALL  LA0B7
         RET   NC
         LD    A,&C0
         CP    H
         RL    L
         LD    H,&A1
         JP    NC,LA1A4
         EX    AF,AF'
         XOR   L
         EX    AF,AF'
         LD    A,D
         OR    E
         JR    NZ,LA18F
LA1C1:   JP    LA07B      ;This address is modified by the loader itself
LA1C4:   LD    A,&4F
         XOR   L
         ADD   A,&DE
         LD    (IX+&00),A
         INC   IX
         DEC   DE
         LD    L,&02
         LD    A,&04
         LD    H,&B3
         CALL  LA241
         RET   NC
         LD    A,(IY+&04)
         OR    A
         JR    Z,LA239
         LD    L,C
         LD    BC,&7F00
         NOP   
         NOP   
         NOP   
         LD    C,(IY+&00)
         LD    B,(IY+&01)
         LD    IX,&0000
         ADD   IX,BC
         LD    C,L
         LD    A,&01
LA1F5:   LD    L,&02
         LD    H,&B3
         CALL  LA241
         RET   NC
         LD    A,&7F
         CP    L
         JR    Z,LA205
         LD    (&A5F5),A
LA205:   LD    L,&02
         LD    A,&08
         LD    H,&B3
         CALL  LA241
         RET   NC
         LD    E,(IY+&02)
         LD    D,(IY+&03)
         LD    L,C
         LD    BC,&0005
         ADD   IY,BC
         LD    C,L
         LD    A,E
         OR    D
         LD    H,&A1
         LD    L,&01
         LD    A,&01
         JP    NZ,LA1A6
.newadd  ld de,clever_x   ;Changes eyup jump so it goes to clever_x
         ld (LA1C1+1),de
         LD    DE,LA1A9
         PUSH  DE
         LD    DE,(&A627)
         JP    LA0BB
LA239:   LD    A,&06
         NOP   
         NOP   
         JR    LA1F5
LA23F:   LD    A,&0D
LA241:   CALL  LA0B7
         LD    A,&10
         CALL  LA0B7
         RET   NC
         LD    A,&DB
         CP    H
         RL    L
         LD    H,&B3
         JP    NC,LA23F
         RET   
LA255:   CALL  LA0D7      ;Enter here for loading bit
         LD    HL,&8000
         LD    B,&FF
LA25D:   PUSH  BC
         LD    E,&00
         LD    C,E
         LD    D,&FF
LA263:   LD    B,&F5
         IN    A,(C)
         AND   &80
         XOR   C
         JR    Z,LA2BC
         INC   E
         LD    A,C
         CPL   
         AND   &80
         LD    C,A
LA272:   DEC   D
         JP    NZ,LA263
         LD    (HL),E
         INC   HL
         POP   BC
         DJNZ  LA25D
         LD    HL,&0000
         LD    DE,&8032
         LD    B,&32
LA283:   PUSH  BC
         LD    A,(DE)
         LD    B,&00
         LD    C,A
         ADD   HL,BC
         INC   DE
         POP   BC
         DJNZ  LA283
         PUSH  HL
         LD    HL,&0000
         LD    DE,&80CD
         LD    B,&32
LA296:   PUSH  BC
         LD    A,(DE)
         LD    B,&00
         LD    C,A
         ADD   HL,BC
         INC   DE
         POP   BC
         DJNZ  LA296
         POP   BC
         LD    A,H
         OR    A
         JR    NZ,LA2B8
         AND   A
         SBC   HL,BC
         LD    BC,&0032
         AND   A
         SBC   HL,BC
         RET   C
         ADD   HL,BC
         LD    BC,&FFCD
         AND   A
         SBC   HL,BC
         RET   NC
         INC   A
LA2B8:   LD    (&A5F5),A
         RET   
LA2BC:   NOP   
         NOP   
         JP    LA272

.copyright                text &A4,"JWJG",&9,&90

.setinx  xor a            ;Replaces original "setinks" routine because it was
         ld h,a           ;in an annoying place (&a331)
         ld l,a
.ink1    push af
         ld b,(hl)
         ld c,b
         inc hl
         push hl
         call &bc32
         pop hl
         pop af
         inc a
         cp &10
         jr nz,ink1
         ld b,0
         ld c,b
         call &bc38
         ld e,6
.ink2    ld b,&f5
         in a,(c)
         rra
         jr c,ink2
.ink3    in a,(c)
         rra
         jr nc,ink3
         dec e
         jr nz,ink2
         di
         ret

list
.clever                   ;CALL here to start Atlantic
nolist

ld hl,ent
ld c,&ff
jp &bd16
.ent
di
ld hl,store               ;Copy key bytes to right place
ld de,&a5f6               ;If CALLing from BASIC then poke the key bytes at
ld bc,4                   ;&be80 or similar.
ldir

ld ix,&a5fa               ;Load the wee loader/info file to &a5fa
ld de,&c6
call LA255

ld hl,setinx              ;Redirect call to setinks routine
ld (&a695),hl
jp &a640

.clever_x

IF get_eyup
 .xx                      ;Inf. loop so you can save eyup with the MF2     
 di
 jr xx

ELSE
 pop de                   ;Else game is to be loaded and either executed
 exx                      ;or "backed up"
 ld hl,clever_y           ;Redirect exec. jump to clever_y
 ld (&bf5f),hl
 ld hl,1                  ;Stop this being LDIRed over
 ld (&bf45),hl
 ld hl,LA07B              ;Change loader back to normal
 ld (newadd+1),hl
 pop hl
 exx
 ex af,af'
 scf
 ret                      ;Exit to eyup
ENDIF

.clever_y
IF get_game
 .yy                      ;Inf. loop so you can copy game
 di
 jr yy

ELSE
                          ;Insert cheat code & exec jump in here
ENDIF
