Differences between JSW48 and JSW128 0.02HL8
;--------------------------------------------------------------------------
;(v0.00HL3) This code deals with having the scrolling title-screen message
;as an ASCIIZ string in Bank 7 rather than as 256 bytes in Bank 2.
;The principle is simple enough: each time the message is scrolled, copy
;32 bytes of message to T8474 and pass that address to the print routine.
;
;JSW48 stops scrolling when the count of characters scrolled reaches
;0DFh. JSW128 keeps this variable below 80h until the end, and then
;sets it to 0DFh when it sees the end of the string.
;
;
;48k ;128k
ORG 8474h ORG 8474h
T8474: DB ' JET-SET WILLY ' T8474: DB ' JET-SET WILLY '
DB 'by Matthew Smith' DB '128k Version 0.0'
DB ' ',7Fh,' 1984' C8494: DI
LD BC,7FFDh
LD A,17h ;Bank 7
OUT (C),A
DB 'SOFTWARE PROJECTS' LD HL,(W84D0) ;visible section
LD DE,T8474
LD BC,20h ;32 characters
LDIR
LD A,(HL) ;next char to print
PUSH AF
LD BC,7FFDh
LD A,10h ;Bank 0
DB ' Ltd . . . . ' OUT (C),A
POP AF
OR A
JR Z,R84C4 ;End of message?
LD HL,(W84D0)
INC HL
LD (W84D0),HL ;increment ptr
DB '.Guide Willy' LD A,(B85E4) ;This is set to
AND 7Fh ;0DFh at the end
LD (B85E4),A ;of the string
RET
R84C4: LD HL,TD600 ;Start of message
DB 'to collect' LD (W84D0),HL ;text in Bank 7
LD A,0DFh
LD (B85E4),A
RET
W84D0: DW TD600 ;Current pos in msg.
;
;(v0.00HL6) Support for the extra guardian types
;
;48k ;128k
TYPE0 equ 91B6h ;Arrows
TYPE3 equ 90D9h ;Ropes
defb ' all the' T84D2: defw TYPE0 ; Type 0
defw TYPE1 ; Type 1 - horizontal
defw TYPE2 ; Type 2 - vertical
defw TYPE3 ; Type 3 - rope
defb ' items a' defw TYPE0 ; Type 4 - arrow
defw TYPE5 ; Type 5 - diagonal 1
defw TYPE6 ; Type 6 - diagonal 2
defw TYPE2C ; Type 7 - clr vert
defb 'round th' defw TYPE0 ; Type 8 - spare
defw TYPE1C ; Type 9 - clr horz
defw TYPE2 ; Type 2 - vertical
defw TYPE0 ; Type 11 - spare
defb 'e house ' defw TYPE0 ; Type 12 - spare
defw TYPE5C ; Type 13 - clr diag 1
defw TYPE6C ; Type 14 - clr diag 2
defw TYPE2C ; Type 15 - clr vert
defb 'before mi' TYPE1C: call CYCLE ;Cycle colours
TYPE1: call SHGUARD ;Standard horizontal
jp TYPE0
defb 'dnight so' TYPE2C: call CYCLE ;Cycle colours
TYPE2: call SVGUARD ;Standard vertical
jp TYPE0
defb 'Maria will' TYPE5C: call CYCLE ;Cycle colours
TYPE5: call SHGUARD ;Standard horizontal
bit 7,(ix+0)
defb ' let' jr nz,MOVE_D
jr MOVE_U ;but with U/D additions
defb 'you get to' TYPE6C: call CYCLE ;Cycle colours
TYPE6: call SHGUARD ;Standard vertical
bit 7,(ix+0)
jr z,MOVE_D ;but with U/D additions
defb 'your bed. . ' MOVE_U: LD A,(IX+3) ;Move up
ADD A,(IX+4)
LD (IX+3),A
jp TYPE0 ;[HL7] bugfix
;
defb '. . . . .++' MOVE_D: LD A,(IX+3) ;Move down
SUB (IX+4)
LD (IX+3),A
jp TYPE0 ;[HL7] bugfix
;
defb '+++ Pres' CYCLE: ld a,(ix+1) ;Cycle colours
ld c,a
and 0F8h ;C = colour byte
ld b,a ;B = byte less ink
ld a,c
defb 's ENTER t' and 7 ;A = ink
inc a
cp 7 ;Cycle 2,3,4,5,6
jr c,cyc1
ld a,2
defb 'o sta' cyc1: or b
ld (ix+1),a
ret
;
; In JSW48, the remainder of the scrolling message follows. In JSW128,
; the space up to and including 8553h is currently unused.
;
;--------------------------------------------------------------------------
;
;(v0.00HL1) This patch was the first to be written, and converts JSW48 to
;JSW128. It replaces messages printed by the password system with the code
;necessary to access 64k of room data.
;
;48k ;128k
ORG 858Bh ORG 858Bh
DB 'Enter Code at' L858B: LD A,(B8420) ;A=room no.
L858E: LD E,1 ;E:=bank
CP 40h
JR Z,R85A1
LD E,3
CP 80h
DB 'grid location ' JR Z,R85A1
INC E
CP 0C0h
JR Z,R85A1
LD E,6
R85A1: LD BC,7FFDh
DI
OUT (C),E
OR 0C0h
LD H,A ;HL:=source addr.
DB ' Sorry, try code at' LD L,0
LD DE,T8000
LD BC,0100h
LDIR
LD BC,7FFDh
LD A,10h ;Bank 0
OUT (C),A
LD A,I ;Should ints be enabled?
DB ' location ' CP 3Eh
JR Z,R85C2
EI
R85C2:
;
;(v0.02HL5) This patch was added to support dynamic switching on/off of the
; "superjump" poke. The previous JSW128 code here was:
; ;;;JP L8922 ;Return to JSW48 code
; ;;;DB ' '
;It now reads:
LD HL,T80DE ;Border colour
LD DE,T8E34 ;Poke address
JP L8915 ;Remainder of patch
;
;--------------------------------------------------------------------------
;
;(v0.00HL2)
;
; In JSW48, this area holds the title screen tune and the in-game tune.
; In JSW128, this contains code to deal with the 128k music.
;
; The flag B85FB is the "stop tune" flag. If it is set to 8, the current
;tune is stopped (in Ian Collier's original TUNE.BIN, ERRNO was used, so
;that a 9 STOP report would stop the music).
;
;TUNE.BIN works by having three pointers (6 bytes) to the three tune
;channels at TFE8E. The I register will contain 0F8h if the tune is playing,
;or 3Eh if it has stopped.
;
; Note: In JSW128 Hacklevel 9, this code has been rewritten. The previous
; (HL8 and below) code is shown after the current code.
;
;
;48k ;128k
ORG 85FBh ORG 85FBh
DB 51h B85FB: DB 51h
DB 3Ch,33h,51h L85FC: LD A,(0C400h)
DB 3Ch,33h CP 9 ;Cheat mode on?
DB 51h,3Ch,33h LD HL,TF700 ;In-game tune
DB 51h,3Ch JR C,R8609 LD I,A
DB 33h,3Ch,33h LD HL,TF902 ;Cheat mode tune
DB 51h,3Ch,33h R8609: CALL CFEC6 ;Select tune
DB 3Ch,33h,51h JP L88FC ;Start game
DB 3Ch,33h,51h C860F: CALL CFEC0 ;Stop tune
DB 3Ch,33h,51h LD HL,4000h
DB 3Ch RET
DB 33h,4Ch,3Ch L8616: LD HL,TF902 ;Cheat mode tune
DB 33h,4Ch,3Ch CALL CFEC6 ;Select tune
DB 33h,4Ch,39h JP L89AD ;Back to game
DB 2Dh,4Ch,39h,2Dh DS 12 ;These bytes
DB 51h,40h,2Dh,51h ;are spare
DB 3Ch,33h,51h,3Ch ;for now
;
; Versions prior to HL9 had these functions inlined:
;
ORG 85FBh
B85FB: DB 51h
L85FC: LD A,8
LD (B85FB),A
LD A,0F8h
LD I,A
EI ;Ensure TUNE.BIN sees
HALT ;the stop flag
LD HL,TF700 ;In-game tune
LD DE,TFE8E ;TUNE.BIN tune ptrs
LD BC,6
LDIR
XOR A
LD (B85FB),A ;Reset stop flag
CALL CFA00 ;Start playing tune
EI
JP L88FC ;Start the game
C861E: LD A,8 ;Stop tune
LD (B85FB),A
LD HL,4000h
RET
;
;(v0.00HL8) Attempt to tidy up the Superjump a bit. This code is called when
; Willy is coming out of a jump, and aligns his Y-coordinate to the nearest 8.
; There isn't room for the entire patch here, so the remainder is at 8995h.
;
DB 36h,5Bh,40h,36h C8627: LD (B85D1),A
DB 66h,51h,3Ch,51h LD A,(B85CF)
DB 3Ch JP L8995
;
;At 864Ch in JSW128 is the memory map. This is not used by the game
;itself, but JSWED uses it to keep track of where sprites (60h),
;guardian tables (2xh,4xh,4xh,4xh), and teleporter data (61h) have
;been stored, and what locations are reserved (80h or higher).
;
DB 4Ch,3Ch,2Dh,28h DB 00h,00h,80h,80h ;9800
DB 40h,33h,51h,40h DB 60h,60h,60h,60h
DB 33h,2Dh,40h,36h DB 21h,41h,41h,41h ;A000
DB 20h,40h,36h,3Dh DB 80h,80h,60h,60h
DB 79h,3Dh,0FFh,80h DB 60h,60h,60h,60h ;A800
DB 72h,66h,60h,56h DB 60h,60h,60h,60h
DB 66h,56h,56h,51h DB 60h,60h,60h,60h ;B000
DB 60h,51h,51h,56h DB 60h,60h,60h,60h
DB 56h,56h,56h,80h DB 60h,60h,60h,60h ;B800
DB 72h,66h,60h,56h DB 60h,60h,60h,60h
DB 66h,56h,56h,51h DB 80h,80h,80h,80h ;C000
DB 60h,51h,51h,56h DB 80h,22h,42h,42h
DB 56h,56h,56h,80h DB 42h,60h,60h,60h ;C800
DB 72h,66h,60h,56h DB 60h,60h,00h,60h
DB 66h,56h,56h,51h DB 60h,60h,60h,60h ;D000
DB 60h,51h,51h,56h DB 60h,60h,60h,60h
DB 66h,56h,56h,80h DB 00h,60h,00h,60h ;D800
DB 72h,66h,60h,56h DB 60h,60h,60h,60h
DB 66h,56h,40h,56h DB 00h,00h,00h,00h ;E000
DB 66h,80h,66h,56h DB 00h,00h,00h,00h
DB 56h,56h,56h DB 00h,00h,61h ;E800
;
;--------------------------------------------------------------------------
;
;(v0.00HL1) This code replaces some of the copy-protection code. It deals
;with 8-bit room numbers (as opposed to 6-bit) in the object locations table.
;
;48k ;128k
ORG 869Fh ORG 869Fh
L869F: LD HL,4000h L869F: LD A,H ;The object location
ADD A,1Ch ;table is now at C000h,
LD DE,4001h LD H,A ;ie A400h + 1C00h.
LD C,(HL)
LD BC,1AFFh SUB 1Ch
LD H,A
LD (HL),0 LD A,(B8420) ;Room
LDIR CP C
PUSH AF
LD IX,T858B LD C,(HL)
RES 7,C
POP AF
CALL C86C3 JP NZ,L9452
JP Z,L87CA BIT 6,C
LD IX,T85AB JP Z,L9452
CALL C86C3 JP L93E2
;
;(v0.00HL1) This code (C86BB) is to extend the WRITETYPER teleport cheat
;to use keys 7 and 8 as well.
;
C86BB: AND 1Ch
JP Z,L87CA XOR 1Ch
RLCA
JP 0 RLCA
RLCA
RET
;--------------------------------------------------------------------------
;(v0.00HL2) Some more of the protection system bites the dust. This code
;is entered from the cheat code in the C400h-C4FFh page; it cleans up
;the stack and jumps to a new room.
;
;48k ;128k
ORG 87BEh ORG 87BEh
LD (IX+21h),E DB 0DDh,73h ;unused
L87C0: NOP
LD BC,18h NOP
NOP
NOP
R87C4: DJNZ R87C4 POP BC
DEC C POP BC
JR NZ,R87C4 JP L858E
RET
;
;--------------------------------------------------------------------------
;
;(v0.00HL1) The code to draw the title screen. JSW128 blanks the attributes
;rather than copying them in from T9800.
;
;48k ;128k
ORG 8819h ORG 8819h
LD BC,17FFh LD BC,1AFFh ;Clear attrs as well
LD (HL),0 LD (HL),0
LDIR LDIR
LD HL,T9800 LD HL,T9800
LD BC,300h LD BC,300h
LDIR NOP ;Don't use JSW48 attrs
NOP
;
; Whereas JSW48 generates the triangle shape, JSW128 stores it as a bitmap
;in Bank 7 and copies it in. The bitmap only covers the top 2/3 of the screen,
;so it is 4k in size.
;
; The JSW128 title screen has three sets of attributes, each 512 bytes.
;These are stored immediately after the screen in Bank 7.
;
; After the title screen has been copied, JSW128 starts the title screen
;tune.
;
ORG 8841h ORG 8841h
LD DE,5800h DI
LD A,17h ;Bank 7
L8844: LD A,(DE) LD BC,7FFDh
OR A
JR Z,R888E OUT (C),A
CP 0D3h PUSH BC
JR Z,R888E LD HL,TC000
CP 9 LD DE,T4000
JR Z,R888E
CP 2Dh LD BC,1000h ;Top 2thirds
JR Z,R888E LDIR
CP 24h LD DE,6000h ;attrs*3
JR Z,R888E
LD C,0 LD BC,600h ;512*3
CP 8 LDIR
JR Z,R8871 POP BC ;7FFDh
CP 29h LD A,10h ;Bank 0
JR Z,R8871 OUT (C),A
CP 2Ch DI
JR Z,R886E LD HL,6000h
CP 5 LD DE,5880h ;title attributes
JR Z,R8871 LD BC,0200h
LD C,10h
JR R8871 LDIR
R886E: LD A,25h LD HL,TEC2A ;title screen tune
LD (DE),A
R8871: LD A,E LD DE,T752A ;29994
AND 1
RLCA LD BC,0AD6h ;2774
RLCA
RLCA
OR C LDIR
LD C,A
LD B,0 LD HL,T752A ;29994
LD HL,T8431 ;slope shape LD DE,TFE8E ;Tune pointers
ADD HL,BC
PUSH DE LD BC,6
BIT 0,D
LD D,40h LDIR
JR Z,R8888 XOR A
LD D,48h LD (B85FB),A ;Reset "stop" flag
R8888: LD B,6 CALL CFA00 ;start tune
CALL C969B XOR A
POP DE OUT (0FEh),A ;Zap border
R888E: INC DE NOP
LD A,D NOP ;Unused in JSW128
CP 5Ah NOP
NOP
JP NZ,L8844 NOP
NOP
NOP
LD BC,1Fh LD BC,1Fh
DI EI ;In JSW128, allow tune to play
;
; In JSW128, there is extra code when you decide to start the game, since
; the 128k music code has to be switched to play the in-game tune.
;
ORG 88AEh ORG 88AEh
JP NZ,L88FC ;start game R88AE: JP NZ,L85FC ; start game w/tune
;
; Do the scrolling message 128k-style. In JSW48, add an offset; in JSW128,
;read 32 characters into the message buffer and use them.
;
ORG 88C8h ORG 88C8h
LD IX,T8454 CALL C8494
LD E,A LD IX,T8474
LD D,0
ADD IX,DE NOP
NOP
;
; The "start game" check here is a JR. So send it to a jump.
;
ORG 88ECh ORG 88ECh
JR NZ,L88FC;start game JR NZ,R88AE ;JSW128 start game
;--------------------------------------------------------------------------
;
; (v0.00HL1) The other half of the original patch. This is the code to get
; room data.
;
;48k ;128k
ORG 8912h ORG 8912h
L8912: LD A,(B8420) ;room no. JP L858B ;Read 128k room data
;
; (v0.02HL5) Flow of execution returns here halfway through the Superjump
; patch. HL->border colour; DE=poke address
; If bit 7 of the border colour is set, then the Superjump POKE
; is turned on; otherwise it is turned off.
;
OR 0C0h L8915: LD A,0BCh ;Turn it off
LD H,A LD (DE),A
LD L,0 BIT 7,(HL) ;Bit 7 of border = flag
LD DE,T8000 JR Z,R891F
LD BC,100h LD A,2Ch ;Turn it on
LD (DE),A
LDIR R891F: RES 7,(HL)
NOP
;--------------------------------------------------------------------------
;
;(v0.00HL2) Code to support multiple guardian tables.
;
;48k ;128k
ORG 8930h ORG 8930h
LD H,14h LD H,0
ADD HL,HL CALL CC4B6 ;Find table addr.
ADD HL,HL
ADD HL,HL
;
;--------------------------------------------------------------------------
;
;(v0.00HL2) Add the cheat mode status to the lives display.
;
;(v0.00HL8) In HL2-HL7, space from 8995-899C was unused. It now contains
; the last few bytes of the Superjump fix (marked [**]). This
; attempts to ensure Willy is correctly vertically aligned as he
; comes out of a Superjump.
;
;48k ;128k
ORG 8992h ORG 8992h
RET Z JP LEB00
LD B,A ;B=lives count
R8994: LD C,0 L8995: AND 0F8h ;[**]
PUSH HL LD (B85CF),A
PUSH BC
LD A,(B85E1) RET
RLCA NOP
RLCA NOP
RLCA L899D: PUSH BC ;Fix for PAUSE bug
AND 60h LD HL,T9A00
LD E,A
LD D,9Dh LD DE,T5A00
CALL C9456 LD BC,0100h
POP BC
POP HL LDIR
INC HL
INC HL POP BC
DJNZ R8994 JP L8B12
RET
;--------------------------------------------------------------------------
;
;(v0.00HL2) Restrict the keys that can cause a pause
;
;48k ;128k
ORG 8AC8h ORG 8AC8h
AND 1Fh AND 1
CP 1Fh ;A-G CP 1 ;A only
;--------------------------------------------------------------------------
;
;(v0.00HL1) When restoring lower screen attributes after a PAUSE, save BC
;(this is a JSW48 fix relocated to an area made spare in JSW128)
;
;48k ;128k
ORG 8B07h ORG 8B07h
LD HL,T9A00 JP L899D ;need to save BC
;up to 8B11h is spare
;--------------------------------------------------------------------------
;
;(v0.00HL2) Modifications to support 128k in-game tune
;
;48k ;128k
ORG 8B3Ah ORG 8B3Ah
JR NZ,R8B70 JR NZ,R8B55
XOR A LD A,I ;Has tune stopped?
LD (B85E0),A CP 3Eh
LD A,(B85E1) JR NZ,R8B55
INC A LD HL,TFEC9 ;In-game tune
;HL8 and earlier
;used TF700 here.
LD (B85E1),A LD DE,TFE8E ;Tune pointers
AND 7Eh LD BC,6
RRCA
LD E,A
LD D,0 LDIR
LD HL,T865F CALL CFEC3
ADD HL,DE NOP
LD A,(B85CC) NOP
NOP
NOP
RLCA NOP
;
;Versions before HL9 had the call to CFEC3 inlined:
;
; XOR A
; LD (B85FB),A
; CALL CFA00
; EI
; -- hence the NOPs.
;
RLCA R8B55: XOR A
SUB 1Ch LD (B85E0),A
NEG LD A,(B85E1)
ADD A,(HL)
LD D,A INC A
LD A,(80DEh) LD (B85E1),A
LD E,D
LD BC,3 LD A,(B85E2) ;Stop tune?
R8B63: OUT (0FEh),A AND 2
DEC E JR Z,R8B6F
JR NZ,R8B6B LD A,8
LD E,D
XOR 18h LD (B85FB),A ;Set stop flag
R8B6B: DJNZ R8B63 NOP
DEC C NOP
JR NZ,R8B63 NOP
;
;--------------------------------------------------------------------------
;
;(v0.01HL4) The following patch is applied only if the teleporter overlay
;has been added. It can be added to JSW128 or JSW48.
;
R8B70: LD BC,0EFFEh CALL CEA00 ;Teleporter overlay
;--------------------------------------------------------------------------
;
;(v0.00HL1) Extend WRITETYPER to keys 7 and 8.
;
;48k ;128k
ORG 8B7Ah ORG 8B7Ah
AND 10h CALL C86BB
XOR 10h NOP
RLCA NOP
;--------------------------------------------------------------------------
;
;(v0.00HL2) Immediately after the check for WRITETYPER, check for the other
;cheat mode command.
;
;48k ;128k
ORG 8B9Ch ORG 8B9Ch
JP Z,L89AD JP Z,LC401
LD A,(B8420) LD A,(B8420) ;Room
CP 1Ch CP 1Ch
JP NZ,L89AD JP NZ,LC401
;
;--------------------------------------------------------------------------
;
; (v0.00HL2) Before switching to the "game over" screen, turn off the tune.
;
;48k ;128k
ORG 8C4Ah ORG 8C4Ah
LD HL,4000h CALL C860F
;Before HL9, this went to C861E.
;but the music code rearrangement
;moved this code up in memory.
;
;--------------------------------------------------------------------------
; (v0.00HL2) Hooked by the cheat mode - invincibility & antigravity toggles.
;
;48k ;128k
ORG 8E56h ORG 8E56h
LD A,(B80A0) CALL CEC00
;--------------------------------------------------------------------------
;(v0.00HL2) Keyboard limiting; probably connected with the larger number of
;keys which can be used in WRITETYPER mode.
;
;48k ;128k
ORG 8F1Bh ORG 8F1Bh
DB 0E7h DB 0EFh
;
;--------------------------------------------------------------------------
;
;(v0.00HL2) Hooked by the cheat mode - fast inter-room teleportation.
;
;48k ;128k
ORG 8F6Dh ORG 8F6Dh
LD BC,7EFEh CALL CC4BF
;
;--------------------------------------------------------------------------
;
;(v0.00HL8) Attempt to tidy up the Superjump a bit.
;
;48k ;128k
ORG 8F9Eh ORG 8F9Eh
LD (B85D1),A CALL C8627
;
;--------------------------------------------------------------------------
;
;(v0.00HL6) Guardian animation completely rewritten. I have not provided
; 48k source for this bit.
;
; This code decides what type of guardian we are editing, and calls the
;correct movement subroutine.
;
org 090CAh
;
and 0Fh ;Treat bits 0-3 as type. This works as long as
ld l,a ;vertical types are the same however bit 3 is set.
ld h,0
add hl,hl
ld de,jtbl ;Sprite types jump table, 16 bytes
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
jp (hl)
;
;MUST END BEFORE 90D9h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;(v0.0HL6) More rewrites to sprite movement
;
; The horizontal and vertical movement are now implemented as subroutines
;called from TYPE1 and TYPE2.
;
org 9133h ;Horizontal movement redone as subroutine
SHGUARD:
BIT 7,(IX+0) ;Going right?
JR NZ,R915C
LD A,(IX+0)
SUB 20H ;Next frame
AND 7FH
LD (IX+0),A
CP 60H
RET C
MOVE_L: LD A,(IX+2) ;Hit left bound?
AND 1FH
CP (IX+6)
JR Z,R9156 ;$+07
DEC (IX+2) ;Move left
RET
R9156:
LD B,80h
JR REV1
; LD (IX+0),81H ;Reverse.
; RET
R915C: LD A,(IX+0)
ADD A,20H ;Bits 5,6 of type = frame counter
OR 80H
LD (IX+0),A
CP 0A0H ;Wrapped round animation. Move sprite.
RET NC
MOVE_R: LD A,(IX+2)
AND 1FH ;Is X within the horizontal bounds?
CP (IX+7)
JR Z,R9179 ;Reached the end. Reverse.
INC (IX+2) ;Move.
RET
R9179:
;
; LD (IX+0),61H - changes sprite type, Bad Thing.
;
LD B,60h
REV1: LD A,(IX+0)
AND 01Fh
OR B
LD (IX+0),A ;Reset frame.
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Vertical
;
SVGUARD: LD A,(IX+0) ;Flip bit 3 (vertical tick?)
XOR 8
LD (IX+0),A
AND 18H ;If bit 4 set, animate every frame.
JR Z,SVNANI ;otherwise, animate every other frame.
LD A,(IX+0)
ADD A,20H ;Bump frame
LD (IX+0),A
SVNANI:
LD A,(IX+3) ;Height / position
ADD A,(IX+4) ;Direction, U/D, and speed
LD (IX+3),A
CP (IX+7) ;At limit?
JR NC,REVU ;$+0F
CP (IX+6)
JR Z,R91A8 ;$+04
RET NC
R91A8: LD A,(IX+6)
LD (IX+3),A
;
;Vertical reverse
;
REVU: LD A,(IX+4) ;Reverse direction
NEG
LD (IX+4),A
RET
;
;MUST END BEFORE 91B6h
;
;--------------------------------------------------------------------------
;
;(v0.00HL1) The other half of the 8-bit object locations patch
;
;48k ;128k
ORG 93D7h ORG 93D7h
R93D7: LD C,(HL) JP L869F
RES 7,C
LD A,(B8420) NOP ;Spare
NOP
NOP
OR 40h NOP
NOP
CP C NOP
;
;--------------------------------------------------------------------------
;
;(v0.01HL4) The Sprite Override patch. Rooms now have a Sprite Override
;flag at ROOM+0EDh, and if it is >=80h then it contains the page for Willy's
;sprite.
;
;This replaces the previous special-case code for the Nightmare Room.
;
;48k ;128k
ORG 9653h ORG 9653h
LD A,(B8420) LD A,(B80ED)
CP 1Dh ;Nightmare? CP 80h
JR NZ,R9660 JR C,R9660
LD D,0B6h LD D,A
NOP
;
;--------------------------------------------------------------------------
;(v0.00HL2) Replace the Spectrum font with a user-defined one
;
;48k ;128k
ORG 9691h ORG 9691h
LD H,7 ;3800 / 800 LD H,18h ; C000 / 800
LD L,A LD L,A
SET 7,L ;3C00 / 800 NOP
NOP
;
;--------------------------------------------------------------------------
;(v0.00HL2) Replace the intro tune beeper routine with code to animate
;the opening screen by rotating the three sets of attributes.
;
;48k ;128k
ORG 96A2h ORG 96A2h
C96A2: LD A,(HL) C96A2: NOP
CP 0FFh LD HL,6000h
RET Z
LD BC,64h L96A6: LD DE,5800h
XOR A LD BC,200h
LD E,(HL)
LD D,E
R96AC: OUT (0FEh),A LDIR
DEC D LD B,0Ah ;Wait 1/5 sec.
JR NZ,R96B4 R96B0: LD A,I ;3Eh if tune stopped
LD D,E
XOR 18h CP 3Eh
R96B4: DJNZ R96AC RET Z
HALT
EX AF,AF' DJNZ R96B0
LD A,C
CP 32h NOP
NOP
JR NZ,R96BE NOP
RL E LD A,H ;62h, 64h or 66h
CP 66h ;Just done no. 3?
R96BE: EX AF,AF' JR NZ,R96C2
DEC C
JR NZ,R96AC LD H,60h
CALL C96C9 CALL C96C9 ;Check for key
RET NZ RET NZ
INC HL JP L96A6
JR C96A2
;
;--------------------------------------------------------------------------