;------------------------------------------------------------------------------
;
; Copyright (c) 2006, Intel Corporation
; All rights reserved. This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License
; which accompanies this distribution.  The full text of the license may be found at
; http://opensource.org/licenses/bsd-license.php
;
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
;
; Module Name:
;
;   FlushCacheLine.Asm
;
; Abstract:
;
;   AsmFlushCacheLine function
;
; Notes:
;
;------------------------------------------------------------------------------

    .code

;------------------------------------------------------------------------------
; VOID
; EFIAPI
; AsmFlushCacheLine (
;   IN      VOID                      *LinearAddress
;   );
;------------------------------------------------------------------------------
AsmFlushCacheLine   PROC
    clflush [rcx]
    mov     rax, rcx
    ret
AsmFlushCacheLine   ENDP

    END

;------------------------------------------------------------------------------
;
; Copyright (c) 2006, Intel Corporation
; All rights reserved. This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License
; which accompanies this distribution.  The full text of the license may be found at
; http://opensource.org/licenses/bsd-license.php
;
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
;
; Module Name:
;
;   FlushCacheLine.Asm
;
; Abstract:
;
;   AsmFlushCacheLine function
;
; Notes:
;
;------------------------------------------------------------------------------

    .code

;------------------------------------------------------------------------------
; VOID *
; EFIAPI
; AsmFlushCacheLine (
;   IN      VOID                      *LinearAddress
;   );
;------------------------------------------------------------------------------
AsmFlushCacheLine   PROC
    clflush [rcx]
    mov     rax, rcx
    ret
AsmFlushCacheLine   ENDP

    END

Change VOID into VOID * in function header

git-svn-id: 5648d1bec6962b0a6d1d1b40eba8cf5cdb62da3d@650 6f19259b-4bc3-4df7-8a09-765794883524


TITLE Linear/Sequential search implemented in x86 assembly (MASM)
; Search for a value in an array of bytes by comparing each value with a key
; return the position of the key
; O(n) time complexity
; the address of the first element in the array must be in the edx
; and the arrays length in the ecx register
; the index of the key is returned in the eax register

.386	; minimum CPU required to run the program
.model flat, stdcall ; identifies the memory model for the program,
					; in this case its protected mode. It also tells which
					; calling convention to use for procedures
.stack 4096

.data
data db 42, 40, 70, 90, 62, 70, 40 ; our array of data

.code
; implementation of sequential search
SequentialSearch PROC
	xor eax, eax 			; clear eax register just in case
BEGIN_LOOP:
	cmp BYTE PTR[edx], bl   ; if [edx] == bl
	je FOUND				;    then goto FOUND
	inc eax                 ; else increment eax
	inc edx                 ; increment edx
	loop BEGIN_LOOP			; automatically decrements ecx register
FOUND:
	ret
SequentialSearch ENDP

; entry point
main PROC
	mov bl, 90 ; search for 92 in array
	mov edx, OFFSET data
	mov ecx, LENGTHOF data
	call SequentialSearch
main ENDP

END main

Add linear search in x86 assembly lang

Add linear search in x86 assembly lang


.nds
.relativeinclude on
.erroronwarning on

; This patch adds a text popup if the player tries to enter the Forest of Doom portrait before it's unlocked.
; This is necessary for portrait randomizer when the Forest of Doom portrait isn't in the normal location, since the normal event only works in that sector.

@Overlay119Start equ 0x023C0000
@FreeSpace equ 0x023C0000

.open "ftc/arm9.bin", 02000000h

.org 0x02079350 ; Location of code normally run when the Forest of Doom portrait is locked. (todo test if it affects other locked portraits)
  beq @FreeSpace

.close

.open "ftc/overlay9_119", @Overlay119Start

.org @FreeSpace
  ldr  r2,=20FC48Eh ; Bitfield of buttons pressed this frame.
  ldrh r2,[r2]
  ands r2,r2,40h ; Up.
  beq  20793FCh ; If up was not just pressed, continue on with the normal code without showing the message.

  ldr  r0,=4BEh ; Load text index 4BE. Originally this is just an unused string ("The Lost Village") but this should be changed in the text editor to say:
  ; "You must beat Stella and talk to Wind\nto unlock the Forest of Doom."
  bl   2050544h ; Call ShowTextPopup.
  b    20793FCh ; Then continue on with the rest of the code.
  .pool

.close

Add patch to display popup when attempting to enter forest portrait


			.regalias count s1
			.regalias source s2
			.regalias dest s3
			.regalias temp s4

_start		temp = 0xf
			cr30 = temp				; start all strands

			count = mem_l[length]
			source = &dataStart
			dest = source + count

			count = count >> 2		; divide by 4
			temp = cr0				; get strand ID
			temp = temp * count		; compute offset
			source = source + temp	; compute source offset for this strand
			dest = dest + temp		; compute dest offset for this strand

loop		temp = mem_b[source]
			mem_b[dest] = temp
			source = source + 1
			dest = dest + 1
			count = count - 1
			if count goto loop

			cr31 = s0		; halt simulation

length		.word 2048
dataStart	.word 0

			.regalias count s1
			.regalias source s2
			.regalias dest s3
			.regalias temp s4

_start		temp = 0xf
			cr30 = temp				; start all strands

			count = mem_l[length]
			source = &dataStart
			dest = source + count

			count = count >> 2		; divide by 4
			temp = cr0				; get strand ID
			temp = temp * count		; compute offset
			source = source + temp	; compute source offset for this strand
			dest = dest + temp		; compute dest offset for this strand

loop		temp = mem_b[source]
			mem_b[dest] = temp
			source = source + 1
			dest = dest + 1
			count = count - 1
			if count goto loop

			; Update number of finished strands
			s0 = &running_strands
retry		s1 = mem_sync[s0]
			s1 = s1 - 1
			s2 = s1
			mem_sync[s0] = s1
			if !s1 goto retry

wait_done	if s2 goto wait_done	; Will fall through on last ref (s2 = 1)
			cr31 = s0				; halt

running_strands .word 4

length		.word 2048
dataStart	.word 0

Add synchronization at the end of the copy test.


; Sandbox asm file template to start experimenting from

SECTION .data
SECTION .text

  global _start

_start:
  nop

  mov eax,'WXYZ'	; You can use a string as an immediate value
			; in a soure operand. Debugger will show 0x5A595857
			; which is the binary ascii equivalent.

  mov eax,1		; Code for Exit Syscall
  mov ebx,0		; Return a code of zero
  int 80H		; Make kernel call

SECTION .bss

Add experiment showing use of string as immediate value in source operand.


;;----------------------------------------------------------------------------;;
;;  Move images in rupe (zoom) menu.
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

; Familiar brand image
.thumb
.org 0x0215A810
  MOV r1, #0x52     ; X pos, originally 0x52
  MOV r2, #0x4C     ; Y pos, originally 0x4C

;;----------------------------------------------------------------------------;;
;;  Move images in rupe (zoom) menu.
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

; Familiar brand image
.thumb
.org 0x0215A810
  MOV r1, #0x40     ; X pos, originally 0x52
  MOV r2, #0x4C     ; Y pos, originally 0x4C

; Familiar type image
.org 0x0215A87C
  MOV r1, #0x5C     ; X pos, originally 0x70
  MOV r2, #0x4B     ; Y pos, originally 0x4B

Move familiar type image in zoom menu

Hack: Move familiar type image in zoom menu


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

; Disables the start button exiting the quests menu.
; The B button can be used to exit the quest menu instead.
; This prevents taking quest rewards over and over by exiting before the quest is marked as complete.

; Changes how the quest menu handles button presses.
; Normally the value at [r13,14h] being 2 means B was pressed, and 3 means start was pressed.
; When B is pressed on the quest list, it changes the value to 3 to simulate the player exiting with start.
; Instead we change it so 4 is the value needed to exit the menu, and make B pressed on the quest list set the value to 4 instead of 3.
; Start still just sets it to 3, which is now ignored.
.org 0x02040848
  cmp r0, 4h ; This is the value it must be to exit the quest menu.
.org 0x0204041C
  moveq r0, 4h ; This is the value set when pressing B on the quest list.
.org 0x0204083C
  movle r0, 4h ; This is the value set when the quest list is empty in some cases.
.org 0x0204052C
  mov r0, 4h ; This is the value set when the quest list is empty in other cases.

.close

Add patch to fix infinite quest rewards bug in PoR


; Sandbox asm file template to start experimenting from
; converts the Snippet string in memory to lowercase by looping and
; adding 32 to each byte in the string

SECTION .data
	Snippet db "KANGAROO"
SECTION .text

  global _start

_start:
		nop

		mov ebx,Snippet
		mov eax,8
	DoMore: add byte [ebx],32
		inc ebx
		dec eax
		jnz DoMore

		mov eax,1		; Code for Exit Syscall
		mov ebx,0		; Return a code of zero
		int 80H		; Make kernel call

SECTION .bss

Convert a string from uppercase to lowercase.


; Test program to bit-bang a single character out SOD as serial async data

        org     00000H

BITTIME equ     0113h          ; Time delay for a single bit
OUTBITS equ	00Bh

START:
        mvi     c,'T'           ; Send a test character
COUT:
        di
        mvi     b,OUTBITS       ; Number of output bits
        xra     a               ; Clear carry for start bit
CO1:
        mvi     a,080H          ; Set the SDE flag
        rar                     ; Shift carry into SOD flag
        cmc                     ;   and invert carry.  Why? (serial is inverted?)
        sim                     ; Output data bit
        lxi     h,BITTIME       ; Load the time delay for one bit width
CO2:
        dcr     l               ; Wait for bit time
        jnz     CO2
        dcr     h
        jnz     CO2
        stc                     ; Shift in stop bit(s)
        mov     a,c             ; Get char to send
        rar                     ; LSB into carry
        mov     c,a             ; Store rotated data
        dcr     b
        jnz     CO1             ; Send next bit
        ei

        lxi     h,03fffH        ; Wait a while before sending the character again
CHILL:
        dcr     l
        jnz     CHILL
        dcr     h
        jnz     CHILL

        jmp     START

Add example asm files for testing

Add example asm files for testing


; Sandbox asm file template to start experimenting from

SECTION .data
SECTION .text

  global _start

_start:
  nop

  mov eax,1		; Code for Exit Syscall
  mov ebx,0		; Return a code of zero
  int 80H		; Make kernel call

SECTION .bss

Add tabs to sandbox template.

Add tabs to sandbox template.


.nds
.relativeinclude on
.erroronwarning on

; This patch slightly changes the code that calculates what percentage of the map you have explored so that the total number of tiles can be easily changed, allowing the percentage to be correct with modded maps.

.open "ftc/arm9.bin", 02000000h

.org 0x02026B54
  mul r0, r0, r1 ; Multiplies the number of explored map tiles (in r0) by 0d1000 (in r1) (for 100.0%, 4 digits including the decimal point).
  ldr r1, =401h ; The total number of map tiles. (The base game has 0x400 tiles, but we put 401 instead because the assembler would optimize 400 into a shifted immediate and then the randomizer couldn't easily change this later on.)
  bl 02075B28h ; Divide
  add r13, r13, 4h
  pop r15
  .pool

.close

Add patch to change number of map tiles in DoS


; Copyright 2015 Philipp Oppermann
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;    http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.

global long_mode_start
extern main

section .text
bits 64
long_mode_start:

    ; call rust main
    call main
    ; print `OKAY` to screen
    mov rax, 0x2f592f412f4b2f4f
    mov qword [0xb8000], rax
    hlt

; Prints `ERROR: ` and the given error code to screen and hangs.
; parameter: error code (in ascii) in al
error:
    mov rbx, 0x4f4f4f524f524f45
    mov [0xb8000], rbx
    mov rbx, 0x4f204f204f3a4f52
    mov [0xb8008], rbx
    mov byte [0xb800e], al
    hlt

Add an 64-bit error function

Add an 64-bit error function


.nds
.relativeinclude on
.erroronwarning on

; This patch makes resistances in PoR act like resistances in DoS and OoE.
; In vanilla PoR, if an enemy resists even one element of an attack, it will resist the attack.
; This changes it so the enemy must resist all elements of the attack to resist the attack.

.open "ftc/overlay9_0", 021CDF60h

.org 0x021DA1F8
  mvn r0, r5 ; Negate the bitfield of resistances.
  and r0, r0, r7 ; AND the attack's damage types with the negated resistances to find what elements were not resisted.
  ands r0, r0, 0FFh ; Only consider the first 8 resistances. Others have no effect.
  bne 021DA224h ; If any elements were not resisted, do not resist the attack.
  mov r0, r1, asr 1h ; Resisted, so halve the damage. (This was originally a float multiply by 0.5x, but we used up too much space so simplify it to a shift instead.)
  nop
  nop
  nop

.close

Add patch to make PoR enemy resistances behave like DoS and OoE


;;----------------------------------------------------------------------------;;
;;  Align the position of the numbers in blackjack minigame of casino.
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;
.arm

;; Number of rounds played
.org 0x02095FC0
    ADD r1, r6, #0x00 + 0x1C      ; X position

;;----------------------------------------------------------------------------;;
;;  Align the position of the numbers in blackjack minigame of casino.
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;
.arm

;; Number of rounds played
.org 0x02095FC0
    ADD r1, r6, #0x00 + 0x12      ; X position

Fix position of blackjack player plays

Fix position of blackjack player plays


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

.org 0x02051F90 ; Where the original game's code for loading area/sector/room indexes is.
  b 020BFC00h ; Jump to some free space, where we will put our own code for loading the area/sector/room indexes.

.org 0x020BFC00 ; Free space.
  mov r5,0h        ; Load the area index into r5.
  strb r5,[r0,515] ; Store the area index to the ram address where r0 will read it later.
  mov r5,0h        ; Load the sector index into r5.
  mov r4,0h        ; Load the room index into r4.
  b 02051F94h      ; Return to where we came from.

.close

.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

.org 0x02051F90 ; Where the original game's code for loading area/sector/room indexes is.
  b 020BFC00h ; Jump to some free space, where we will put our own code for loading the area/sector/room indexes.

.org 0x020BFC00 ; Free space.
  mov r5,0h        ; Load the area index into r5.
  strb r5,[r0,515h] ; Store the area index to the ram address where r0 will read it later. (0x02111785)
  mov r5,0h        ; Load the sector index into r5.
  mov r4,0h        ; Load the room index into r4.
  b 02051F94h      ; Return to where we came from.

.close

Fix bug when changing PoR starting area

Fix bug when changing PoR starting area


; Volume Label
db 'BOOTDISK' ; File Name
db '   '      ; File Extension
db 0x08       ; Attribute
db 0x00       ; Reserved for NT
db 0x01       ; Creation
dw 0x0000     ; Creation Time
dw 0x0000     ; Creation Date
dw 0x0000     ; Last Access Data
dw 0x0000     ; FAT32 Upper Half
dw 0x8000     ; Last Write Time
dw 0x475F     ; Last Write Date
dw 0x0000     ; Starting Cluster
dd 0x00000000 ; File Size

; Second-Stage File
db 'STAGE2  ' ; File Name
db 'BIN'      ; File Extension
db 0x05       ; Attribute (Read-only: 1; System: 4)
db 0x00       ; Reserved for NT
db 0x01       ; Creation
dw 0x0000     ; Creation Time
dw 0x0000     ; Creation Date
dw 0x0000     ; Last Access Data
dw 0x0000     ; FAT32 Upper Half
dw 0x8000     ; Last Write Time
dw 0x475F     ; Last Write Date
dw 0x0000     ; Starting Cluster
dd 0x00000200 ; File Size

pad: times (14*512)-($-$$) db 0

; Volume Label
db 'BOOTDISK' ; File Name
db '   '      ; File Extension
db 0x08       ; Attribute
db 0x00       ; Reserved for NT
db 0x01       ; Creation
dw 0x0000     ; Creation Time
dw 0x0000     ; Creation Date
dw 0x0000     ; Last Access Data
dw 0x0000     ; FAT32 Upper Half
dw 0x8000     ; Last Write Time
dw 0x475F     ; Last Write Date
dw 0x0000     ; Starting Cluster
dd 0x00000000 ; File Size

; Second-Stage File
db 'STAGE2  ' ; File Name
db 'BIN'      ; File Extension
db 0x05       ; Attribute (Read-only: 1; System: 4)
db 0x00       ; Reserved for NT
db 0x01       ; Creation
dw 0x0000     ; Creation Time
dw 0x0000     ; Creation Date
dw 0x0000     ; Last Access Data
dw 0x0000     ; FAT32 Upper Half
dw 0x8000     ; Last Write Time
dw 0x475F     ; Last Write Date
dw 0x0002     ; Starting Cluster
dd 0x00000200 ; File Size

pad: times (14*512)-($-$$) db 0

Fix error with root directory entry for STAGE2.BIN


.gba
.relativeinclude on
.erroronwarning on

.open "ftc/rom.gba", 08000000h

; Allow skipping events with start, even if you haven't beaten the game once yet.
.org 0x0805B56C
  mov r0, 3h

.close

Add patch to enable skipping AoS cutscenes on first playthrough


// Super Smash Bros. flash on Z cancel demonstration

arch n64.cpu
endian msb
//output "", create

include "LIB\N64.inc"
include "LIB\macros.inc"

origin 0x0
insert "LIB\Super Smash Bros. (U) [!].z64"

origin 0x0CB528
base 0x80150AE8 // Z cancel
jal Flash

origin 0x33204
base 0x80032604
scope Flash: {
  addiu sp, -0x18
  sw ra, 0x14 (sp)
  jal 0x80142D9C // Original instruction
  sw v1, 0x10 (sp) // Save v1
  lw v1, 0x10 (sp) // Restore v1
  lw t0, 0x0160 (v1)
  slti t1, t0, 0x000B
  beqz t1, End // If within frame window
  nop
  Flash:
    lw a0, 0x04 (v1) // Pointer
    //lli a1, 0x08 // Sparkle
    lli a1, 0x2B // Yellow
    jal 0x800E9814 // Flash
    or a2, r0, r0
  End:
    lw ra, 0x14 (sp)
    jr ra
    addiu sp, 0x18
}

Add flash on Z cancel demo

Add flash on Z cancel demo


.nds
.relativeinclude on
.erroronwarning on

; This patch fixes the bug where the common enemy version of The Creature sets his boss death flag.

.open "ftc/overlay9_60", 022D7900h

.org 0x022D7D14
  ; Check if Var A is 0 (common enemy/boss rush version) and skip setting the boss death flag if so.
  ; This code already existed around here in vanilla, we're just moving it up a few lines to before setting the boss death flag instead of after.
  ldrh r1, [r1, 3Ch]
  cmp r1, 0h
  beq 0x022D7D30

  ; Then set the boss death flag.
  ldr r2, [r0, 76Ch]
  orr r2, r2, 200h
  str r2, [r0, 76Ch]

.close

Add patch to fix bug where common enemy creature sets boss death flag


; =============================================================================
; Copyright (C) 2015 Manolis Fragkiskos Ragkousis -- see LICENSE.TXT
; =============================================================================

;;; Print routine
;;; ebx contains a null terminated string

%ifndef PRINT_STRING_PM
%define PRINT_STRING_PM

[bits 32]
VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f

print_string_pm:
        pusha
        mov edx, VIDEO_MEMORY

print_string_pm_loop:
        mov al, [ebx]
        mov ah, WHITE_ON_BLACK

        cmp al, 0
        je print_string_pm_done

        mov [edx], ax
        add ebx, 1
        add edx, 2

        jmp print_string_pm_loop

print_string_pm_done:
        popa
        ret

%endif

Add routine for 32bit print.

Add routine for 32bit print.

* print/print_string_32bit.asm: New file.


.nds
.relativeinclude on
.erroronwarning on

; This patch makes Balore detect which side of the room the player enters from, and if it's from the left, he moves himself to face left.

.open "ftc/overlay9_23", 022FF9C0h

@Overlay41Start equ 0x02308920
@FreeSpace equ @Overlay41Start + 0x140

.org 0x022FFD44
  b @BaloreFacePlayer

.close

.open "ftc/overlay9_41", @Overlay41Start

.org @FreeSpace
@BaloreFacePlayer:
  mov r0, r5
  bl 021C3278h ; GetPlayerXPos
  cmp r0, 80000h ; X pos 0x80, halfway through the leftmost screen
  bge @BaloreFaceRight
@BaloreFaceLeft:
  mov r0, 0h ; Var A
  mov r1, 0F0000h ; X pos
  str r1, [r5, 2Ch]
  b @BaloreFacePlayerEnd
@BaloreFaceRight:
  mov r0, 1h ; Var A
  ; We don't set X pos here because we assume Balore's X pos was already properly set for facing right.
@BaloreFacePlayerEnd:
  ; Go back to Balore's normal code to set the direction he faces
  ; We make sure r0 has Var A in it - but not Balore's real Var A, just the one to check for the purposes of deciding the direction he faces.
  b 0x022FFD48

.close

DoS: Add patch to make Balore face left if player enters from left


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in equip menu
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

;; Item name
.arm
.org 0x020821B8
  MOV r1, #0x83     ; X pos, originally 0x84

;; Item quantity
.arm
.org 0x02082228
  MOV r1, #0xDB     ; X pos, originally 0xDD

;; Level
.arm
.org 0x2080544
  MOV r1, #0x79 + 2 ; X poss

Move level number in equip menu

Move level number in equip menu


; 0x0000
; RST 0x00
    jp boot
; Magic Number
; 0x0003
.db "KK"

; 0x0008
; RST 0x08
.fill 0x08-$
rkcall:
    jp kcall
.fill 0x10-$
; 0x0010
; RST 0x10
rlcall:
    jp lcall
.fill 0x18-$
; 0x0018
; RST 0x18
    jp reboot
.fill 0x20-$
; 0x0020
; RST 0x20
    jp pcall
.fill 0x28-$
; 0x0028
; RST 0x28
    jp bcall
.fill 0x30-$
; 0x0030
; RST 0x30
    ret
.fill 0x38-$
; 0x0038
; RST 0x38
; SYSTEM INTERRUPT
    jp sysInterrupt
; 0x003B

.fill 0x53-$
; 0x0053
    jp boot
; 0x0056
.db 0xFF, 0xA5, 0xFF
.fill 0x64-$
.exec git describe --dirty ; Version string
.db 0

; 0x0000
; RST 0x00
    jp boot
; Magic Number
; 0x0003
.db "KK"

; 0x0008
; RST 0x08
.fill 0x08-$
rkcall:
    jp kcall
.fill 0x10-$
; 0x0010
; RST 0x10
rlcall:
    jp lcall
.fill 0x18-$
; 0x0018
; RST 0x18
    jp reboot
.fill 0x20-$
; 0x0020
; RST 0x20
    jp pcall
.fill 0x28-$
; 0x0028
; RST 0x28
    jp bcall
.fill 0x30-$
; 0x0030
; RST 0x30
    ret
.fill 0x38-$
; 0x0038
; RST 0x38
; SYSTEM INTERRUPT
    jp sysInterrupt
; 0x003B

.fill 0x53-$
; 0x0053
    jp boot
; 0x0056
.db 0xFF, 0xA5, 0xFF
.fill 0x64-$
.exec git describe --dirty=+ ; Version string
.db 0

Modify version string to be more concise

Swap "-dirty" with "+"


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_25", 022D7900h

; Skip the screen where the player has to draw an emblem and press OK when starting a new game.

.org 0x022DAAB0 ; Code in the name entry menu after you finished typing in your name that would normally take you to the emblem drawing screen next.
  mov r11, 19h ; We set the return value to 0x19, which is the state for the scrolling prologue introduction.
  nop
  nop
  nop
  nop
  nop
  nop

.close

Add patch to skip emblem drawing screen in PoR


.nds
.relativeinclude on
.erroronwarning on

; This patch makes Gravedorcus not immediately damage the player if they enter from the left door.

.open "ftc/overlay9_33", 022B73A0h

.org 0x022BA230
  ; Remove branch that would make Gravedorcus's intro cutscene play if you enter the room from the right.
  nop

.org 0x022BA250
.area 0x20 ; Lines 022BA258-022BA26C were for the cutscene we skipped over, so we get 0x18 extra bytes to work with from that.
  ; Set Gravedorcus's state to 5 instead of 1.
  ; This causes Gravedorcus to start at X position 0x100 and shooting projectiles to the left, which is dodgeable, while spawning right on top of the player and moving to the right is not dodgeable.
  mov r0, 5h
  strb r0, [r5, 0Dh]

  ; Replace the two lines we overwrote at the start (return)
  add r13, r13, 10h
  pop r3-r5,r15
.endarea

.close

Add patch to fix Gravedorcus from left entrance


;;----------------------------------------------------------------------------;;
;;  Align the position of the numbers in military minigame of casino.
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm
.org 0x0207E900
  MOV r1, #0xB+19       ; X pos
  MOV R2, #3            ; Y pos

;;----------------------------------------------------------------------------;;
;;  Align the position of the numbers in military minigame of casino.
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm
.org 0x0207E900
  MOV r1, #0xB+19       ; X pos
  MOV R2, #2            ; Y pos

Move up the number of military games

Move up the number of military games


.nds
.relativeinclude on
.erroronwarning on

; Always have the Dowsing Hat effect of beeping when there's a hidden blue chest, even if you don't have Dowsing Hat equipped.

.open "ftc/overlay9_19", 021FFFC0h

.org 0x0221AE30 ; Where the blue chest loads your currently equipped head armor.
  mov r0, 7h ; Dowsing Hat

.close

Add patch to always enable dowsing hat effect


.nds
.relativeinclude on
.erroronwarning on

@Overlay41Start equ 0x023E0100
@FreeSpace equ 0x023E0100

.open "ftc/overlay9_0", 0219E3E0h

.org 0x021EEF00
  b @FreeSpace

.close

.open "ftc/overlay9_41", @Overlay41Start

.org @FreeSpace
  ; TODO: Don't allow using during boss fights.

  mov r0, 0h ; Sector index
  mov r1, 1h ; Room index
  mov r2, 80h ; X pos
  mov r3, 60h ; Y pos
  bl 02026AD0h ; SetDestinationRoomSectorAndRoomIndexes
  ldr r1, =020F6DF4h
  mov r0, 6h
  strb r0, [r1] ; We set the current type of transition mode (020F6DF4) to 6, meaning a warp of some kind.
  mov r0, 0h
  strb r0, [r1,1h]

  ; Enable control of the player, in case they were using the slide puzzle and controls were disabled.
  bl 021F64BCh

  ; Below is copy pasted, it triggers the game to unpause.
  mov     r0,44h
  bl      2029BF0h
  mov     r0,0h
  mvn     r1,0Fh
  mov     r2,8h
  bl      20080DCh
  mov     r2,3h
  ldr     r0,=208AC20h
  strb    r2,[r9,0Dh]
  ldr     r1,[r0]
  ldrb    r0,[r1,8h]
  cmp     r0,17h
  strneb  r2,[r1,0Ah]
  ; Above is copy pasted, it triggers the game to unpause

  mov r4, 42h ; This tells the rest of the consumable code to use one of the consumable, and play the consumable-used SFX.
  b 0x021EF0F8 ; Return to the consumable code.

  ; Alternate code to not use one of the tickets up:
  ; mov r0, 42h ; This is the SFX that will be played.
  ; b 0x021EF264 ; Return to the consumable code.

  .pool

.close

Add asm patch to implement magical tickets in DoS


.nds
.relativeinclude on
.erroronwarning on

; Fixes the boss rush versions of certain bosses so they play the boss music when they're created.
; This is for the boss randomizer.

@Overlay119Start equ 0x02308EC0
@FreeSpace equ @Overlay119Start + 0x4C0

.open "ftc/overlay9_119", @Overlay119Start

.org @FreeSpace
@InitializeEnemyAndOverridePlayBossMusic:
  push r14
  push r1 ; Preserve the music ID

  bl 021D9184h ; InitializeEnemyFromDNA (replaces the line we overwrote to call this custom function)

  pop r0 ; Get the music ID out of the stack
  bl 0204D374h ; PlaySongWithVariableUpdatesExceptInBossRush

  ; Set bit to make the song that was set override the BGM.
  ldr r0, =0211174Ch
  ldr r1, [r0]
  orr r1, r1, 00040000h
  str r1, [r0]

  pop r15

@InitializeEnemyAndOverridePlayBossMusicForLegion:
  push r14
  mov r1, 12h ; Music ID for Destroyer
  bl @InitializeEnemyAndOverridePlayBossMusic
  pop r15

.pool

.close

.open "ftc/overlay9_52", 022D7900h

; Legion
.org 0x022D7A24
  bl @InitializeEnemyAndOverridePlayBossMusicForLegion

.close

.open "ftc/overlay9_64", 022D7900h

; Death
.org 0x022D7BD0
  ; This line usually prevented the code for starting the boss music from running in Jonathan mode.
  ; Just remove it.
  nop

.close

.open "ftc/overlay9_63", 022D7900h

; Stella
.org 0x022D7A4C
  ; This line usually prevented the code for starting the boss music from running in Jonathan mode.
  ; Just remove it.
  nop

.close

Add patch to fix some PoR bosses not playing music in boss rando


.386
.model flat
exception_handler proto
.safeseh exception_handler
end

.386
.model flat
exception_handler proto c
.safeseh exception_handler
end

Fix Windows compileation for VS 2010

Fix Windows compileation for VS 2010


; This file is a part of the IncludeOS unikernel - www.includeos.org
;
; Copyright 2015 Oslo and Akershus University College of Applied Sciences
; and Alfred Bratterud
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.

global __arch_start:function
extern kernel_start

[BITS 32]

;; @param: eax - multiboot magic
;; @param: ebx - multiboot bootinfo addr
__arch_start:

    ;; Create stack frame for backtrace
    push ebp
    mov ebp, esp

    ;; hack to avoid stack protector
    mov DWORD [0x1014], 0x89abcdef

    ;; Push params on 16-byte aligned stack
    sub esp, 8
    and esp, -16
    mov [esp], eax
    mov [esp+4], ebx

    call kernel_start

    ;; Restore stack frame
    mov esp, ebp
    pop ebp
    ret

sentinel_table:
    dd sentinel_table ;; 0x0
    dd 0 ;; 0x8
    dd 0 ;; 0x10
    dd 0 ;; 0x18
    dd 0 ;; 0x20
    dd 0x123456789ABCDEF

Remove unused sentinel table for i686

i686: Remove unused sentinel table for i686


\ This software is the Kestrel-3's first milestone: print a bunch of "A"
\ characters to the console.

	$2000 ORG		( RISC-V ISA spec says we boot here. )

	0 x31 auipc		( X31 = address of next insn )
	assume-gp		( This lets us load big constants )

	x31 gl> uart-port x2 ld	( X2 = uart transmit port )
	x0 65 x3 addi		( X3 = ASCII code for "A" )
-> .again
	x3 x2 0 sb		( send "A" to console )
	.again x0 jal		( repeat forever )

-> uart-port	$0F000000.00000000 D,

\ This software is the Kestrel-3's first milestone: print a bunch of "A"
\ characters to the console.

	$2000 ORG		( RISC-V ISA spec says we boot here. )

	0 x31 auipc		( X31 = address of next insn )
	assume-gp		( This lets us load big constants )

	x31 gl> uart-port x2 ld	( X2 = uart transmit port )
	x0 65 x3 addi		( X3 = ASCII code for "A" )
-> .again
	x3 x2 0 sb		( send "A" to console )
	x31 gl> .ctr x4 ld	( count how many "A"s we send )
	x4 1 x4 addi
	x4 x31 gs> .ctr sd
	.again x0 jal		( repeat forever )

-> uart-port	$0F000000.00000000 D,
-> .ctr		0.0 D,

Test source update to test both gl> and gs>


;;----------------------------------------------------------------------------;;
;;  Increase textbox size in request menu
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

;; # REQUEST TITLE #
.arm
.org 020C5804h
MOV     r1, #0x49   ; X Position: original 0x50
MOV     r2, #4      ; Y Position: original 0x03

;; # STAMP GIVEN #
.org 020C5950h
MOV     r1, #0xCD + 10  ; X position

.org 020C5968h
MOV     r1, #0xCE + 10  ; X position (to paint twice - bold effect)

Fix the bold effect for stamps in request menu


# multiboot config and setup
.set ALIGN,     1<<0                # align modules on page boundaries
.set MEMINFO,   1<<1                # provide memory map
.set FLAGS,     ALIGN | MEMINFO     # flags
.set MAGIC,     0x1BADB002          # header magic
.set CHECKSUM,  -(MAGIC + FLAGS)    # checksum to prove multi
.section .multiboot
    .align 4
    .long MAGIC
    .long FLAGS
    .long CHECKSUM

# configure early stack (to be replaced once gdt loaded)
.section .stack, "aw", @nobits
    stack_bottom:
        .skip 16384
    stack_top:

.section .text
    .extern     entry
    .global     _start
    .type       _start, @function
    _start:
        mov     $stack_top,%esp
        call    entry
    _stop:
        cli
        1: hlt
        jmp 1b

.size _start, . - _start

# multiboot config and setup
.set ALIGN,     1 << 0              # align modules on page boundaries
.set MEMINFO,   1 << 1              # provide memory map
.set FLAGS,     ALIGN | MEMINFO     # flags
.set MAGIC,     0x1BADB002          # header magic
.set CHECKSUM,  -(MAGIC + FLAGS)    # checksum to prove multi

.section .multiboot

.align  4
.long   MAGIC
.long   FLAGS
.long   CHECKSUM

# configure early stack (to be replaced once gdt loaded)
.section .stack, "aw", @nobits

stack_bottom:
    .skip   16384
stack_top:

.section .text

.extern entry
.extern load_gdt
.global _start
.type   _start, @function
_start:
    movl    $stack_top,%esp
    #call    load_gdt
    call    entry
    cli
halt:
    hlt
    jmp     halt

.size _start, . - _start

Add call for load_gdt, but disabled because it triple faults


use32
global  _interrupt_handler_kbd_wrapper
global  int_handler
global test1
global  run_interrupt
align   4

extern _interrupt_handler_kbd

_interrupt_handler_kbd_wrapper:
    pushad
    call    _interrupt_handler_kbd
    popad
    iret

run_interrupt:
   int 33
   ret

int_handler:
   pushad
   mov ax, 0x08
   mov gs, ax
   call  _interrupt_handler_kbd
   popad
   iret

idt:
   resd 50*2

idtr:
   dw (50*8)-1
   dd idt

test1:
   lidt [idtr]

   mov eax,int_handler
   mov [idt+33*8],ax
   mov word [idt+33*8+2],0x08
   mov word [idt+33*8+4],0x8E00
   shr eax,16
   mov [idt+33*8+6],ax

   mov eax,int_handler
   mov [idt+1*8],ax
   mov word [idt+1*8+2],0x08
   mov word [idt+1*8+4],0x8E00
   shr eax,16
   mov [idt+1*8+6],ax

   ret

use32
global  _interrupt_handler_kbd_wrapper
global  int_handler
global test1
global  run_interrupt
align   4

extern _interrupt_handler_kbd

_interrupt_handler_kbd_wrapper:
    pushad
    call    _interrupt_handler_kbd
    popad
    iret

run_interrupt:
   int 33
   ret

int_handler:
   pushad
   mov ax, 0x08
   mov gs, ax
   call  _interrupt_handler_kbd
   popad
   iret

idt:
   resd 50*2

idtr:
   dw (50*8)-1
   dd idt

test1:
   lidt [idtr]

   mov eax,int_handler
   mov [idt+33*8],ax
   mov word [idt+33*8+2],0x08
   mov word [idt+33*8+4],0x8E00
   shr eax,16
   mov [idt+33*8+6],ax

   ret

Remove unnecessary entry from IDT

Remove unnecessary entry from IDT


.nds
.relativeinclude on
.erroronwarning on

; This patch makes the drawbridge in DoS stay down permanently once you've lowered it once.
; The button will stay depressed, so that you don't need to worry about hitting it every time you walk into the room from the right.

.open "ftc/overlay9_0", 0219E3E0h

.org 0x021A27C8 ; When Soma walks/jumps off the button after pressing it, this line would normally re-raise the button.
  nop ; Remove it so the button doesn't instantly come up.
.org 0x021A2260 ; This line runs when the drawbridge is created, if the drawbridge has already been lowered previously.
  ; Originally this line was doing something useless, storing 0 to a value which is just 0 by default anyway. So we can replace it.
  strb r3, [r4, 5h] ; Store 1 to the button's "pressed" state so the player can't press it again.

.close

Add patch to keep DoS drawbridge down once lowered


taskswapHandler :
	pop ecx	; pop eip into ecx
		pusha
		mov ebx, [currentTaskNum]	; get the current task
		imul ebx, TASK_OBJ_SIZE
		add ebx, RunningTaskList
		mov [ebx+Task_eip], ecx
		mov [ebx+Task_stackLoc], esp	; store the relevent things
			; get the next Task object into ebx
			taskswapHandler.goLoop :
			add ebx, TASK_OBJ_SIZE
			cmp ebx, RunningTaskListEnd
				jge taskswapHandler.doneZeroing
			mov ebx, RunningTaskList
			taskswapHandler.doneZeroing :
			cmp dword [ebx+Task_id], 0
				je taskswapHandler.goLoop
			taskswapHandler.noloopback :
		mov esp, [ebx+Task_stackLoc]
		popa
	push dword [ebx+Task_eip]
	iret

currentTaskNum :
	dd 0x0
RunningTaskList :
	times 32*TASK_OBJ_SIZE db 0x0	; 32 tasks max atm
RunningTaskListEnd :

Task_id equ 0x0
Task_stackLoc equ 0x4
Task_eip equ 0x8
TASK_OBJ_SIZE equ 0xC

registerTask :	; eip in ecx
	pusha
		mov ebx, RunningTaskList
		registerTask.loop :
		cmp dword [ebx+Task_id], 0
			je registerTask.foundTask
		add ebx, TASK_OBJ_SIZE
		jmp registerTask.loop
		registerTask.foundTask :
		mov eax, [currentTaskId]
		mov [ebx+Task_id], eax
		mov [ebx+Task_eip], ecx
		add eax, 1
		mov [currentTaskId], eax
		mov edx, ebx
		sub eax, 1
		mov ebx, TASK_STACK_SIZE
		call Guppy.malloc
		add ebx, TASK_STACK_SIZE*0x200
		mov [edx+Task_stackLoc], ebx
	popa
	ret
unregisterTask :	; ID in ecx
	pusha
		mov ebx, RunningTaskList
		unregisterTask.loop :
		cmp dword [ebx+Task_id], ecx
			je unregisterTask.foundTask
		unregisterTask.foundTask :
		xor ecx, ecx
		mov [ebx+Task_id], ecx
	popa
	ret
currentTaskId :
dd 0x0
TASK_STACK_SIZE equ 2

Add completely untested multitasking code


use32

global _GLOBAL_OFFSET_TABLE_
global __morestack
global abort
global memcmp
global memcpy
global malloc
global free
global start

extern main

start:
    ; rust functions compare esp against [gs:0x30] as a sort of stack guard thing
    ; as long as we set [gs:0x30] to dword 0, it should be ok
    mov [gs:0x30], dword 0
    ; clear the screen a slightly different colour
    mov edi, 0xb8000
    mov ecx, 80*25*2
    mov al, 1
    rep stosb
    ; jump into rust
    call main
    jmp $

_GLOBAL_OFFSET_TABLE_:

__morestack:

abort:
    jmp $

memcmp:
    jmp $

memcpy:
    jmp $

malloc:
    jmp $

free:
    jmp $

use32

global __morestack
global abort
global memcmp
global memcpy
global malloc
global free
global start

global _GLOBAL_OFFSET_TABLE_
_GLOBAL_OFFSET_TABLE_ equ 0

extern main

start:
    ; rust functions compare esp against [gs:0x30] as a sort of stack guard thing
    ; as long as we set [gs:0x30] to dword 0, it should be ok
    mov [gs:0x30], dword 0
    ; clear the screen a slightly different colour
    mov edi, 0xb8000
    mov ecx, 80*25*2
    mov al, 1
    rep stosb
    ; jump into rust
    call main
abort:
__morestack:
memcmp:
memcpy:
malloc:
free:
    jmp $

Set global GOT at 0 and merge infinite loops


BasicUpstart2(start)

	* = $0810 "Main"
start:

	rts

BasicUpstart2(start)

	* = $0810 "Main"
start:
	jsr	loadmap

	rts

loadmap:
        lda #fname_end-fname
        ldx #<fname
        ldy #>fname
        jsr $FFBD     //; call SETNAM
        lda #$01
        ldx $BA
//#; last used dev number
        bne skip
        ldx #$08      //; default to device 8
skip:  ldy #$00      //; $00 means: load to new address
        jsr $FFBA     //; call SETLFS

        ldx #<$1000
        ldy #>$1000
        lda #$00      //; $00 means: load to memory (not verify)
        jsr $FFD5     //; call LOAD
        bcs error    //; if carry set, a load error has happened
        rts
error:

//	; Accumulator contains BASIC error code

//        ; most likely errors:
//        ; A = $05 (DEVICE NOT PRESENT)
//        ; A = $04 (FILE NOT FOUND)
//        ; A = $1D (LOAD ERROR)
//        ; A = $00 (BREAK, RUN/STOP has been pressed during loading)

//        ... error handling ...
	sta $d020
        rts

fname:  .text "MAP1A"
fname_end:

* = $1000 "map data section"
map:
	.fill 1000,0
mapend:

Add optimistic disk loading code to get the map into 000


%include "Ab/State.nasm"

extern ab_act

global ab_interpret_func

section .text

ab_interpret_func:
    call ab_act
    ret

%include "Ab/State.nasm"

extern ab_act

global ab_interpret_func

section .text

; Byte* ab_interpret_func(ExecState*, ExecAction)
ab_interpret_func:
    push rbx
    mov rbx, rdi
    call ab_act
    cmp byte [rbx + ExecState.st_b + ExecStateB.condition], ExecCond_HALTED
    je ab_exit
    int 3
ab_exit:
    pop rbx
    ret

Check the state->st_b.condition when returining from the interpreter

Right now we are checking to make sure that the halted state is set.
This is not correct.  Eventually we will want to add a mechanism for
specifying if we are transfering from the interpreter to compiled code.

Signed-off-by: Andrew Young <9b1c84997b9b503084a7ab9e0b7da3894895a5c3@gmail.com>


global _start

section .data
	align 16

%include "header.inc"

    sub esp, 128
    fldz
    fld1
    fsave [esp]
    frstor [esp]

%include "footer.inc"

Add test for fsave and frstor

Add test for fsave and frstor


.cpu "6502"
.format "flat"
* = $F000

BackgroundColor = $80
INT_Byte_SIZE = 1

VSYNC = $00
VBLANK = $01
WSYNC = $02
COLUBK = $09
TIM64T = $296
INTIM = $284

push .macro address, size
	.for i = \address, i <= \address + (\size - 1), i = i + 1
		LDA i
		PHA
	.next
.endmacro

popTo .macro address, size
	.for i = \address + (\size - 1), i >= \address, i = i - 1
		PLA
		STA i
	.next
.endmacro

// Can replace a consecutive ".push(...) .popTo(...)" as an optimization.
// Copies directly between 2 addresses without using PHA/PLA
copyTo .macro fromAddress, toAddress, size
	.for i = 0, i < \size, i = i + 1
		.let source = \fromAddress + i
		.let destination = \toAddress + i
		LDA source
		STA destination
	.next
.endmacro

Start
	SEI
	CLD
	LDX #$FF
	TXS
	LDA #0
ClearMem
	STA 0,X
	DEX
	BNE ClearMem
MainLoop
	LDA #%00000010
	STA VSYNC
	STA WSYNC
	STA WSYNC
	STA WSYNC
	LDA #43
	STA TIM64T
	LDA #0
	STA VSYNC

	INC BackgroundColor
	//.push BackgroundColor, INT_Byte_SIZE
	//.popTo COLUBK, INT_Byte_SIZE
	// Compiler should optimize above to:
	.copyTo BackgroundColor, COLUBK, INT_Byte_SIZE

WaitForVBlankEnd
	LDA INTIM
	BNE WaitForVBlankEnd
	STA WSYNC
	STA VBLANK
	LDY #192

ScanLoop
	STA WSYNC
	DEY
	BNE ScanLoop

	LDA #2
	STA WSYNC
	STA VBLANK
	LDY #30
OverScanWait
	STA WSYNC
	DEY
	BNE OverScanWait
	JMP MainLoop

// Special memory locations. Tells the 6502 where to go.
* = $FFFC
.word Start
.word Start

Add proof of concept file for using assembler macros instead of instructions.


;;----------------------------------------------------------------------------;;
;;  Increase textbox size in request menu
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

;; # REQUEST TITLE #
.arm
.org 020C5804h
MOV     r1, #0x49   ; X Position: original 0x50
MOV     r2, #4      ; Y Position: original 0x03

;; # STAMP GIVEN #
.org 020C5950h
MOV     r1, #0xCD + 10  ; X position

Move stamp gives in request menu

Move stamp gives in request menu


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

; Skip the screen where the player has to sign their name and press OK when starting a new game.

.org 0x02045E8C ; Code that sets the name signing menu's state to 3 after zeroing out the name pixel data.
  movne r0, 6h ; Instead set the state to 6, meaning the state where the player has pressed OK and the new game is now starting.

.close

.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

; Skip the screen where the player has to sign their name and press OK when starting a new game.

.org 0x02045E8C ; Code that sets the name signing menu's state to 3 after zeroing out the name pixel data.
  movne r0, 6h ; Instead set the state to 6, meaning the state where the player has pressed OK and the new game is now starting.

.org 0x02045E78 ; Code that displays the name signing menu on the screen.
  nop ; Delete it to prevent the name signing screen from being visible for a split second when starting a new game.

.close

Tweak to skip name signing patch

Tweak to skip name signing patch


// load sid music

.var music = LoadSid("res/jeff_donald.sid")
//.var music = LoadSid("res/demo.sid")
.pc = music.location
.fill music.size, music.getData(i)

.var picture = LoadBinary("res/dcc.prg")
.pc = $2000 - 2 "Bitmap Data"
.fill picture.getSize(), picture.get(i)

// load sid music

//.var music = LoadSid("res/jeff_donald.sid")
.var music = LoadSid("res/demo.sid")
.pc = music.location "Music"
.fill music.size, music.getData(i)

.pc = $2000 - 2 "Bitmap Data"
.var picture = LoadBinary("res/dcc.prg")
.fill picture.getSize(), picture.get(i)

//----------------------------------------------------------
// Print the music info while assembling
.print ""
.print "SID Data"
.print "--------"
.print "location=$"+toHexString(music.location)
.print "init=$"+toHexString(music.init)
.print "play=$"+toHexString(music.play)
.print "songs="+music.songs
.print "startSong="+music.startSong
.print "size=$"+toHexString(music.size)
.print "name="+music.name
.print "author="+music.author
.print "copyright="+music.copyright

.print ""
.print "Additional tech data"
.print "--------------------"
.print "header="+music.header
.print "header version="+music.version
.print "flags="+toBinaryString(music.flags)
.print "speed="+toBinaryString(music.speed)
.print "startpage="+music.startpage
.print "pagelength="+music.pagelength

Print additional info about SID file

Print additional info about SID file


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This makes it so you don't need to draw a Magic Seal to kill a boss.

.org 0x02213C04 ; Location of the boss-killed code for loading the current game mode.
  mov r0, 1 ; Always load 1 (meaning Julius mode).

.close

.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This patch makes it so you don't need to draw a Magic Seal to kill a boss.

.org 0x02213C04 ; Location of the seal drawing code for loading the current game mode.
  mov r0, 1 ; Always load 1 (meaning Julius mode).

; The above change causes a bug with the practice seal menu, where attempting to practice a seal will cause the screen to go black and the game to softlock.
.org 0x021F1BF8 ; Location of code in the practice menu to decide which type of seal to do.
  mov r1, 0 ; Instead of setting argument r1 to 2 (meaning a practice seal) we set it to 0 (meaning an automatically drawn example seal). This doesn't softlock the game.

.close

Fix bug in dos seal drawing skip patch

Fix bug in dos seal drawing skip patch


    org $0fff

load_address:
    $01 $10 @(low basic_end) @(high basic_end) $01 $00 $9e "4109" 0
basic_end:
    $00 $00

    org $0fff

load_address:
    $01 $10 @(low basic_end) @(high basic_end) $01 $00 $9e @(princ main nil) 0
basic_end:
    $00 $00

Make SYS call to label main, not the end of the BASIC program.


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in team menu
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm

;; Character face icon
.org 0x02130478
  ADD     R2, R2, #0x19 - 1     ; Y position

;; Health state
.org 0x02130A08
  MOV     R2, #0x2A + 1         ; Y position

;; Technique name
.org 0x021311AC
  MOV     R2, #7 - 3            ; Y position

;; Technique magic
.org 0x021311EC
  MOV     R2, #8 - 2            ; Y position

Move technique name and PM in team menu

Move technique name and PM in team menu


;
; Assembly "Hello, World!" for Linux
;

/* Properly defined in <sys/syscall.h> */
%define SYS_exit	1
%define SYS_write	4

	section .text

	global _start
_start:
	; gdb doesn't like to stop at the entry point address, so
	; we put a nop here for pure convenience
	nop

write_hello:
	mov edx, hello_len
	mov ecx, hello

.loop:
	mov eax, SYS_write
	mov ebx, 1			; stdout
	int 80h

	cmp eax, -4096
	ja error

	add ecx, eax
	sub edx, eax
	jnz .loop

ok:
	mov eax, SYS_exit
	xor ebx, ebx
	int 80h
	hlt

error:
	mov eax, SYS_exit
	mov ebx, 1		; Error
	int 80h
	hlt

	section .rodata
hello:	db "Hello, World!", 10
hello_len equ $-hello

Add Linux "hello world" example

Add Linux "hello world" example


.nds
.relativeinclude on
.erroronwarning on

; This patch makes Gergoth appear on the right half of his room when the player enters from the left so he's not on top of the player.

.open "ftc/overlay9_36", 022FF9C0h

.org 0x022FFAF0 ; Code in Gergoth's initialization that normally floors him in different ways depending on his var A.
  ; First we simplify the flooring code (to make room for new code) by always doing the same thing instead of having 4 different possibilities for 4 different var As.
  mov r0, 0B0000h
  str r0, [r5, 30h] ; Set Gergoth's Y pos to 0xB0.

  ldr r0, =020CA95Ch
  ldr r0, [r0] ; Load player's X pos.
  cmp r0, 80000h ; Check if player came in on the left half of the room.
  movlt r0, 0C0000h
  strlt r0, [r5, 2Ch] ; Move Gergoth's X pos to 0xC0, close to the right wall.
  b 022FFB48h
  .pool

.close

Add patch to make gergoth not be on top of player coming from left


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This patch starts the player with the Tower Key in Julius mode.
; This is so the player doesn't get softlocked by the randomizer in Julius mode.

.org 0x021F6280
  ; Give all 5 magic seals (simplified version of the original code that was here)
  mov r4, 1Fh
  ldr r0, =020F7254h
  strb r4, [r0]
  ; Then give Tower Key
  mov r0, 2h
  mov r1, 39h
  bl 021E7870h ; GiveItem
  b 021F62A8h ; Jump to after the constant pool
  .pool

.close

Add patch to start Julius with the Tower Key


[ORG 0x10800]

PMode:
	mov eax, 0xFEEDFACE
	mov ecx, 0xF00DD00D
	mov edx, 0xBAADBEEF
.jmpy:
	hlt
	jmp .jmpy

[ORG 0x10800]
[BITS 32]
PMode:
	mov eax, 0x10
	mov ds, ax
	mov es, ax
	mov fs, ax
	mov gs, ax
	mov ss, ax
	mov esp, 0x90000
	mov ebp, esp
.jmpy:
	hlt
	jmp .jmpy

Change setup for protected mode

Change setup for protected mode


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This makes it so that all melee weapons can break balore blocks, not just Julius's whip.

.org 0x02212AB0 ; Branch of a switch statement taken for all melee weapons except Julius's whip.
  b 02212D64h ; Instead take the branch taken for Julius's whip.

.close

Add asm patch to break balore blocks with any weapon


processor 6502
include "vcs.h"
include "macro.h"

SEG
ORG $F000

Reset

StartOfFrame

; Start of vertical blank processing
lda #0
sta VBLANK

lda #2
sta VSYNC

; 3 scanlines of VSYNCH signal...
sta WSYNC
sta WSYNC
sta WSYNC

lda #0

sta VSYNC

; 37 scanlines of vertical blank...
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC

; 192 scanlines of picture...
ldx #0
REPEAT 192; scanlines
    inx
    stx COLUBK
    sta WSYNC
REPEND

lda #%01000010

sta VBLANK                     ; end of screen - enter blanking

; 30 scanlines of overscan...
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC
sta WSYNC

jmp StartOfFrame

ORG $FFFA

.word Reset          ; NMI
.word Reset          ; RESET
.word Reset          ; IRQ

END

Add in example that was provided to create a basic "kernel" for the atari game for rendering to the screen.


//============================================================
// .efo header
//============================================================

.pc = $0

.text "EFO2"          // fileformat magic
.word prepare         // prepare routine
.word setup           // setup routine
.word interrupt       // irq handler
.word 0               // main routine
.word 0               // fadeout routine
.word 0               // cleanup routine
.word 0               // location of playroutine call

// tags
//.byt "P", $04, $07    // range of pages in use
//.byt "I",$10,$1f      // range of pages inherited
//.byt "Z",$02,$03      // range of zero-page addresses in use
//.byt "S"              // i/o safe
//.byt "X"              // avoid loading
//.byt "M",<play,>play  // install music playroutine
.byte 0                 // end-of-tags

.word load_addr

load_addr:
.import source "init.asm"
.import source "fx.asm"
.import source "main.asm"

//============================================================
// .efo header
//============================================================

.pc = $2000

.text "EFO2"          // fileformat magic
.word prepare         // prepare routine
.word setup           // setup routine
.word interrupt       // irq handler
.word 0               // main routine
.word 0               // fadeout routine
.word 0               // cleanup routine
.word 0               // location of playroutine call

// tags
//.byt "P", $04, $07    // range of pages in use
//.byt "I",$10,$1f      // range of pages inherited
//.byt "Z",$02,$03      // range of zero-page addresses in use
//.byt "S"              // i/o safe
//.byt "X"              // avoid loading
//.byt "M",<play,>play  // install music playroutine
.byte 0                 // end-of-tags

.word load_addr

load_addr:
.import source "init.asm"
.import source "fx.asm"
.import source "main.asm"

Fix load address - still not working :(

Fix load address - still not working :(


taskswapHandler :
	pop ecx	; pop eip into ecx
		pusha
		mov ebx, [currentTaskNum]	; get the current task
		imul ebx, TASK_OBJ_SIZE
		add ebx, RunningTaskList
		mov [ebx+Task_eip], ecx
		mov [ebx+Task_stackLoc], esp	; store the relevent things
			; get the next Task object into ebx
			taskswapHandler.goLoop :
			add ebx, TASK_OBJ_SIZE
			cmp ebx, RunningTaskListEnd
				jge taskswapHandler.doneZeroing
			mov ebx, RunningTaskList
			taskswapHandler.doneZeroing :
			cmp dword [ebx+Task_id], 0
				je taskswapHandler.goLoop
			taskswapHandler.noloopback :
		mov esp, [ebx+Task_stackLoc]
		popa
	push dword [ebx+Task_eip]
	iret

currentTaskNum :
	dd 0x0
RunningTaskList :
	times 32*TASK_OBJ_SIZE db 0x0	; 32 tasks max atm
RunningTaskListEnd :

Task_id equ 0x0
Task_stackLoc equ 0x4
Task_eip equ 0x8
TASK_OBJ_SIZE equ 0xC

registerTask :	; eip in ecx
	pusha
		mov ebx, RunningTaskList
		registerTask.loop :
		cmp dword [ebx+Task_id], 0
			je registerTask.foundTask
		add ebx, TASK_OBJ_SIZE
		jmp registerTask.loop
		registerTask.foundTask :
		mov eax, [currentTaskId]
		mov [ebx+Task_id], eax
		mov [ebx+Task_eip], ecx
		add eax, 1
		mov [currentTaskId], eax
		mov edx, ebx
		sub eax, 1
		mov ebx, TASK_STACK_SIZE
		call Guppy.malloc
		add ebx, TASK_STACK_SIZE*0x200
		mov [edx+Task_stackLoc], ebx
	popa
	ret
unregisterTask :	; ID in ecx
	pusha
		mov ebx, RunningTaskList
		unregisterTask.loop :
		cmp dword [ebx+Task_id], ecx
			je unregisterTask.foundTask
		unregisterTask.foundTask :
		xor ecx, ecx
		mov [ebx+Task_id], ecx
	popa
	ret
currentTaskId :
dd 0x0
TASK_STACK_SIZE equ 2


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in the effect of items
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.thumb
;; Item effect
.org 0x02117D4E
  MOV    R1, #0x60 ; X POS -> Original 0x62

;; Slot color
.org 0x021170DE
  MOV    R1, #0x9E - 4 ; X POS

.thumb
;; Increase the size of the item name textbox
.org 0x02116E90
  MOV     R0, #0x14 + 1     ; Width / 8

Increase textbox width of item name in menu


.nds
.relativeinclude on
.erroronwarning on

; In vanilla PoR Martial Art does not take bonus STR (e.g. from STR Boost) into account when calculating its damage.
; This patch causes it to take bonus STR into account.

.open "ftc/overlay9_0", 021CDF60h

.org 0x022176CC
  ldrsh r1, [r4, 18h] ; Load bonus STR from 02111FEC
  add r0, r0, r1 ; Add base STR (already in r0) to bonus STR
  mov r0, r0, lsl 1h ; Double the strength value to get the damage martial art should do (same as in vanilla, except in vanilla it used float multiplication instead of shifting)
  nop
  nop

.close

Add PoR patch to fix bonus STR not affecting martial art


; Based on http://codekata.com/kata/kata09-back-to-the-checkout/

			org	8000h

include src/zx-spec.asm

			spec_init

	describe 'price'
		it 'Returns 0 for no items'

			ld	a,$FF
			call	price
			assert_a_equal	0

			spec_end

price			proc
			ret
			endp

			end	8000h

; Based on http://codekata.com/kata/kata09-back-to-the-checkout/

			org	8000h

include src/zx-spec.asm

			spec_init

	describe 'price'
		it 'Returns 0 for no items'

			ld	a,$FF
			call	price
			assert_a_equal	0

			spec_end

price			proc
			ld	a,0
			ret
			endp

			end	8000h

Return 0 for no items

Return 0 for no items


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_22", 02223E00h

; Shanoa mode: Makes Ecclesia and Wygol be unlocked from the start.
.org 0x0223B7F4 ; Code that would normally set Ecclesia as the default unlocked area.
  ldr r14, =021003CCh
  ldr r0, [r14]
  mov r1, 0x0000003C ; Sets both bits for Ecclesia and Wygol
  orr r0, r0, r1
  str r0, [r14]
  b 0223B840h
  .pool

.close

Add patch to make wygol unlocked from the start in OoE


LLB R1, 70 #Address
LHB R1, 0xCC
LLB R2, 59
LLB R12, 34
LLB R13, 45
LLB R14, 78

SW R1, R1, 0
SW R12, R1, 1
SW R13, R1, 2
SW R14, R1, 3

LW R3, R1, 0
ADD R4, R2, R2
LW R7, R1, 1
ADD R4, R4, R4
LW R8, R1, 2
ADD R4, R4, R4
LW R9, R1, 3
ADD R4, R4, R4

SW R2, R1, 0
LW R5, R1, 1
LW R6, R1, 3
HLT

LLB R1, 0x70 #Address
LHB R1, 0xCC
LLB R2, 59
LLB R12, 34
LLB R13, 45
LLB R14, 78

SW R1, R1, 0
SW R12, R1, 1
SW R13, R1, 2
SW R14, R1, 3

LW R3, R1, 0
ADD R4, R2, R2
LW R7, R1, 1
ADD R4, R4, R4
LW R8, R1, 2
ADD R4, R4, R4
LW R9, R1, 3
ADD R4, R4, R4

SW R2, R1, 0
LW R5, R1, 1
LW R6, R1, 3
HLT

Write to 0x70 instead 46

Write to 0x70 instead 46


	bits 64
	VFMADDPD xmm0, xmm1, [0], xmm3
	VFMADDPD xmm0, xmm1, xmm2, [0]
	VFMADDPD ymm0, ymm1, [0], ymm3
	VFMADDPD ymm0, ymm1, ymm2, [0]

Fix file with no final newline

test: Fix file with no final newline

Fix test/br2030823.asm, which had no final newline.

Signed-off-by: H. Peter Anvin <8a453bad9912ffe59bc0f0b8abe03df9be19379e@zytor.com>


;Testname=unoptimized; Arguments=-O0 -fbin -obr3187743.bin; Files=stdout stderr br3187743.bin
;Testname=optimized;   Arguments=-Ox -fbin -obr3187743.bin; Files=stdout stderr br3187743.bin

	bits 64

	vlddqu	xmm0,[edi]
	vlddqu	ymm0,[edi]

Add test for BR 3187743

test: Add test for BR 3187743

Signed-off-by: Cyrill Gorcunov <7a1ea01eee6961eb1e372e3508c2670446d086f4@gmail.com>


;
; Copyright Mehdi Sotoodeh.  All rights reserved.
; <mehdisotoodeh@gmail.com>
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that source code retains the
; above copyright notice and following disclaimer.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;

include defines.inc

PUBPROC readTSC
    rdtscp
    shl     rdx,32
    xchg    eax,edx
    xchg    rdx,rax
    ret
ENDPROC readTSC
END

;
; Copyright Mehdi Sotoodeh.  All rights reserved.
; <mehdisotoodeh@gmail.com>
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that source code retains the
; above copyright notice and following disclaimer.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;

include defines.inc

PUBPROC readTSC
    rdtscp
    shl     rdx,32
    add     rax,rdx
    ret
ENDPROC readTSC
END

Include upper 32-bits of tsc.

Include upper 32-bits of tsc.


.nds
.relativeinclude on
.erroronwarning on

; This patch fixes issues that could happen in the first room of the castle if the player got one of the bad endings before seeing the cutscene with Hammer in that first room.
; The cutscene with Hammer would play at the same time as the bad ending cutscene, and could allow skipping the cutscene to get out of the room, escaping from the bad ending.

@Overlay41Start equ 0x02308920
@FreeSpace equ @Overlay41Start + 0x1DC

.open "ftc/overlay9_0", 0219E3E0h

.org 0x021C84DC ; In Object5ECreate (cutscene in the first room of the castle with Hammer)
  bne @CheckInBadEnding

.close

.open "ftc/overlay9_41", @Overlay41Start

.org @FreeSpace
@CheckInBadEnding:
  ldr r1, =020F7188h ; Bitfield of event flags
  ldr r1, [r1]
  ands r1, r1, 24000h ; Check the two bad ending flags
  beq 0x021C84F4 ; If neither are set, continue on with this event code
  b 0x021C84E0 ; Otherwise, delete this event
  .pool

.close

Add patch to prevent overlapping events in first room of DoS


.nds
.relativeinclude on
.erroronwarning on

; This patch makes it so getting a boss orb in Mystery Manor or Ecclesia will reload the room.
; This is because the cutscene after beating Albus/Barlowe won't play until the room is reloaded.
; Albus/Barlowe normally reload the room on defeat, but in boss randomizer something else needs to do it.

@Overlay86Start equ 0x022EB1A0
@FreeSpace equ 0x022EB1A0 + 0x48

.open "ftc/arm9.bin", 02000000h

.org 0x02061254 ; At the end of the function for the boss orb being picked up
  b @BossOrbCheckReloadRoom

.close

.open "ftc/overlay9_86", @Overlay86Start ; Free space overlay

.org @FreeSpace
@BossOrbCheckReloadRoom:
  ldr r0, =02100790h
  ldrb r0, [r0] ; Read the current game mode
  cmp r0, 0h ; Shanoa mode
  bne @BossOrbCheckReloadRoomEnd

  ldr r0, =020FFCB9h
  ldrb r0, [r0] ; Read the current area index
  cmp r0, 0Eh ; Mystery Manor
  beq @BossOrbReloadRoomMysteryManor
  cmp r0, 2h ; Ecclesia
  bne @BossOrbCheckReloadRoomEnd

@BossOrbReloadRoomEcclesia:
  mov r0, 2h ; Area, Ecclesia
  mov r1, 0h ; Sector
  mov r2, 6h ; Room
  b @BossOrbReloadRoom

@BossOrbReloadRoomMysteryManor:
  mov r0, 0Eh ; Area, Mystery Manor
  mov r1, 0h ; Sector
  mov r2, 9h ; Room

@BossOrbReloadRoom:
  mov r3, 0C0h ; X pos
  mov r4, 0B0h ; Y pos
  str r3, [r13]
  bl 0203AFD0h ; TeleportPlayer
  bl 0203B014h ; TriggerRoomTransition

@BossOrbCheckReloadRoomEnd:
  ; Return to the normal boss orb code
  add r13, r13, 34h ; Replace line overwritten to jump here
  b 2061258h
  .pool

.close

Add patch for boss orbs to reload some boss rooms in OoE


	bits 64

	mov rax,1234567890abcdefh
	mov eax,1234567890abcdefh
	mov rax,dword 1234567890abcdefh
	mov rax,qword 1234567890abcdefh
	mov dword [rsi],1234567890abcdefh
	mov qword [rsi],1234567890abcdefh
	mov dword [rsi],dword 1234567890abcdefh
	mov qword [rsi],dword 1234567890abcdefh
;	mov qword [rsi],qword 1234567890abcdefh		; Error
;	mov [rsi],qword 1234567890abcdefh		; Error
	mov [rsi],dword 1234567890abcdefh

Test of immediate handling on 64-bit mode


.nds
.relativeinclude on
.erroronwarning on

; This patch makes the color at index 2 in Shanoa's palette (the glyph on her back) not glow and switch between colors automatically.

.open "ftc/arm9.bin", 02000000h

.org 0x0208C990
  nop

.close

Add patch to remove Shanoa back glow

Add patch to remove Shanoa back glow


;;----------------------------------------------------------------------------;;
;;  Reduce the font space
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm

.org 020C64E0h
.area 4h
  MOV     R1, #8 - 4
.endarea

;;----------------------------------------------------------------------------;;
;;  Reduce the font space
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm

.org 020C64E0h
.area 4h
  MOV     R1, #8 - 8
.endarea

Remove any space between chars

Keyboard: Remove any space between chars


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in familiars menu
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

;; # FAMILIAR DESCRIPTION #
.org 020B6770h
MOV     r4, #0x9A       ; Y Position: original 0x97
.org 020B677Ch
MOV     r1, #8          ; X Position: original 0x08

;; # FAMILIAR OBJECTS #
.org 020B6604h
MOV     r1, #0x73       ; X Position: Original 0x74
ADD     r2, r2, #0x6B   ; Y Position: Original 0x6B

;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in familiars menu
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm

;; # FAMILIAR DESCRIPTION #
.org 020B6770h
MOV     r4, #0x9A       ; Y Position: original 0x97
.org 020B677Ch
MOV     r1, #8          ; X Position: original 0x08

;; # FAMILIAR OBJECTS #
.org 020B6604h
MOV     r1, #0x73       ; X Position: Original 0x74
ADD     r2, r2, #0x6B   ; Y Position: Original 0x6B

;; # MONEY GIVEN #
.org 020B671Ch
MOV R1, #0xCD + 9       ; X Position

Fix familiar money give number position

Fix familiar money give number position


;Testname=noerr; Arguments=-felf64 -ogotoff64.o; Files=stdout stderr gotoff64.o
;Testname=err; Arguments=-DERROR -felf64 -ogotoff64.o; Files=stdout stderr gotoff64.o

	bits 64
	default rel

	extern foo

	mov r15,[foo wrt ..got]
	lea r12,[foo wrt ..got]
%ifdef ERROR
	lea rax,[foo wrt ..gotoff]
	mov rax,[foo wrt ..gotoff]
%endif

	default abs

	mov r15,[foo wrt ..got]
	lea r12,[foo wrt ..got]
	mov rax,[qword foo wrt ..got]
%ifdef ERROR
	lea rax,[foo wrt ..gotoff]
	mov rax,[foo wrt ..gotoff]
%endif
	mov rax,[qword foo wrt ..gotoff]

Test for various ELF64 GOT references

Test for various ELF64 GOT references

Try to test for various GOT references in ELF64.

Signed-off-by: H. Peter Anvin <8a453bad9912ffe59bc0f0b8abe03df9be19379e@zytor.com>


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in the casino dialogs
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

; Money number
.arm
.org 0x02134F78
  MOV     R1, #0x16     ; X pos, original 0x8

; Number of coins
.org 0x02134FB0
  MOV     R1, #0x6E     ; X pos, original 0x60

Move number of casino coins

Move number of casino coins


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in team menu
;;  Copyright 2015 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.arm

;; Character face icon
.org 0x02130478
  ADD     R2, R2, #0x19 - 1     ; Y position

;; Health state
.org 0x02130A08
  MOV     R2, #0x2A + 1         ; Y position

Move health state in team menu

Move health state in team menu


	.file	"context.asm"
	.text
	.align	2
	.global	kernel_enter
	.type	kernel_enter, %function
kernel_enter:
	mov	r2, lr
	mrs	r3, spsr

	msr	cpsr, #0x9F 		/* system */
	stmfd	sp!, {r0, r2-r12, lr}
	mov	r2, sp
	msr	cpsr, #0x93 		/* supervisor */
	ldmfd   sp!, {r4-r12, lr}
/*	mov     sp, #0x1000 */
	b	syscall_handle (PLT)
	.size	kernel_enter, .-kernel_enter

	.align	2
	.global	kernel_exit
	.type	kernel_exit, %function
kernel_exit:
	@ r0 holds address of user stack
	stmfd	sp!, {r4-r12, lr}

	msr	cpsr, #0x9F		/* System */
	mov	sp, r0
	ldmfd	sp!, {r0, r2-r12, lr}
	msr	cpsr, #0x93		/* Supervisor */

	msr	spsr, r3
	movs	pc, r2
	.size	kernel_exit, .-kernel_exit

	.file	"context.asm"
	.text
	.align	2
	.global	kernel_enter
	.type	kernel_enter, %function
kernel_enter:
	mov	r2, lr
	mrs	r3, spsr

	msr	cpsr, #0x9F 		/* system */
	stmfd	sp!, {r0, r2-r12, lr}
	mov	r2, sp
	msr	cpsr, #0x93 		/* supervisor */
	ldmfd   sp!, {r4-r12, lr}
/*	mov     sp, #0x100000 */
	b	syscall_handle (PLT)
	.size	kernel_enter, .-kernel_enter

	.align	2
	.global	kernel_exit
	.type	kernel_exit, %function
kernel_exit:
	@ r0 holds address of user stack
	stmfd	sp!, {r4-r12, lr}

	msr	cpsr, #0x9F		/* System */
	mov	sp, r0
	ldmfd	sp!, {r0, r2-r12, lr}
	msr	cpsr, #0x93		/* Supervisor */

	msr	spsr, r3
	movs	pc, r2
	.size	kernel_exit, .-kernel_exit

Set the stack-less kernel stack to a safe value


# Example code, just demonstrating each instruction
  add $2 $0
  sub $3 $1
  rand $4 5
label:
  load $6 $7
  store $8 $9
  jal label
  jr $10
  beq $11 label
  bgt $12 label
  set $13 $14
  seti $15 16

Add sample code for ApplePi.

Add sample code for ApplePi.


x0	= 0
ra	= 1
dsp	= 2
rsp	= 3
gp	= 4
gvp	= 5
x16	= 16
x17	= 17
x18	= 18

	include	"sdtest.asm"

	; exit the emulator.

emu_exit:
	andi	x16, x16, 255
	slli	x16, x16, 8
	addi	rsp, rsp, -8
	sd	x16, 0(rsp)
	csrrw	x0, rsp, $780
	jal	x0, *

	; Initialize the BSPL runtime environment.
	; Then, kick off our tests.

_cold:	addi	rsp, x0, $400
	add	dsp, rsp, rsp
	add	gvp, dsp, dsp
	jal	x0, _

	; CPU cold boots here.

	adv	$FFF00, $CC
	jal	x0, _cold

zero	= 0
ra	= 1
dsp     = 2    ; Data stack pointer.
rsp     = 3    ; Return stack pointer.
gvp     = 4    ; Global variables pointer.
gp	= 13

dr16	= 5
dr17	= 6
dr18	= 7
dr19	= 8
dr20	= 9
dr21	= 10
dr22	= 11
dr23	= 12

x0	= 0
x16	= 16
x17	= 17
x18	= 18

	include	"sdtest.asm"

	; exit the emulator.

emu_exit:
	andi	x16, x16, 255
	slli	x16, x16, 8
	addi	rsp, rsp, -8
	sd	x16, 0(rsp)
	csrrw	x0, rsp, $780
	jal	x0, *

	; Initialize the BSPL runtime environment.
	; Then, kick off our tests.

_cold:	addi	rsp, x0, $400
	add	dsp, rsp, rsp
	add	gvp, dsp, dsp
	jal	x0, _

	; CPU cold boots here.

	adv	$FFF00, $CC
	jal	x0, _cold

Make work with new BSPL ABI reqs

Make work with new BSPL ABI reqs


global _main
global _start
extern _puts

section .text
_main:
  add rsi, 8
_start:
  push rdi
  push rsi
comp:
  sub rsp, 8
  cmp rdi, 1
  jg nz
  je zero
nz:
  mov rdi, [rsi]
  jmp loop
zero:
  mov rdi, y
loop:
  call _puts
  add rsp, 8
  pop rsi
  pop rdi
  jmp _start
  ret

section .data
y: db 'y'

Implement yes in NASM for Mac OS X 64-bit


.nds
.relativeinclude on
.erroronwarning on

; If the player enters the lighthouse from one of the top doors while Brachyura is still alive, they would normally get softlocked.
; This patch teleports the player to the bottom of the room in that case so they can fight Brachyura as normal.
; Also, if the player enters it from the bottom right door the wall there would softlock the player and prevent them from entering, so that wall is removed.

@Overlay86Start equ 0x022EB1A0
@FreeSpace equ 0x022EB1A0

.open "ftc/overlay9_53", 022C1FE0h

.org 0x022C3A68 ; Code that runs if misc flag 0 is not set, before initializing the breakable ceilings.
  b @TeleportPlayerIfAtTop

.org 0x022C331C ; Code that calls GetEntitySlot to create the right wall.
  mov r0, 0h ; Don't create the right wall.

.close

.open "ftc/overlay9_86", @Overlay86Start ; Free space overlay

.org @FreeSpace
@TeleportPlayerIfAtTop:
  ldr r0, =02109850h
  ldr r1, [r0, 4h] ; Load player's Y
  cmp r1, 9C0h*1000h
  movlt r2, 0A70h*1000h
  strlt r2, [r0, 4h] ; If the player's Y is < 9C0 teleport them to the bottom of the room. This is in case they entered from one of the top doors.
  movlt r2, 80h*1000h
  strlt r2, [r0] ; Also change the player's X to be in the middle of the room.

  ldr r0, =022CD3F4h ; Replaces the line of code we overwrote to jump to free space
  b 022C3A6Ch ; Return
  .pool

.close

Add patch to prevent softlocks entering lighthouse from wrong door


;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in the effect of items
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.thumb
.org 0x02117D4E
  MOV    R1, #0x60 ; X POS -> Original 0x62

;;----------------------------------------------------------------------------;;
;;  Align the position of the textbox in the effect of items
;;  Copyright 2014 Benito Palacios (aka pleonex)
;;
;;  Licensed under the Apache License, Version 2.0 (the "License");
;;  you may not use this file except in compliance with the License.
;;  You may obtain a copy of the License at
;;
;;      http://www.apache.org/licenses/LICENSE-2.0
;;
;;  Unless required by applicable law or agreed to in writing, software
;;  distributed under the License is distributed on an "AS IS" BASIS,
;;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;  See the License for the specific language governing permissions and
;;  limitations under the License.
;;----------------------------------------------------------------------------;;

.thumb
;; Item effect
.org 0x02117D4E
  MOV    R1, #0x60 ; X POS -> Original 0x62

;; Slot color
.org 0x021170DE
  MOV    R1, #0x9E - 4 ; X POS

Move slot color in item menu

Move slot color in item menu


	bits 64

	lar ax,bx
	lar ax,[rsi]
	lar ax,word [rsi]
	lar eax,bx
	lar eax,[rsi]
	lar eax,word [rsi]
	lar rax,bx
	lar rax,[rsi]
	lar rax,word [rsi]

	lsl ax,bx
	lsl ax,[rsi]
	lsl ax,word [rsi]
	lsl eax,bx
	lsl eax,[rsi]
	lsl eax,word [rsi]
	lsl rax,bx
	lsl rax,[rsi]
	lsl rax,word [rsi]

Fix BR 1490407: size of the second operand of LAR/LSL

The second operand of LAR/LSL is always 16 bits.


.nds
.relativeinclude on
.erroronwarning on

; Fixes a vanilla bug where skipping the cutscene after you kill Death too quickly will prevent Death's boss death flag from being set.
; As a result of that bug the boss doors would relock after you exit the room, though Death himself wouldn't ever be fightable again.

.open "ftc/overlay9_64", 022D7900h

.org 0x022D8B18
  nop

.close

Add armips patch to fix the vanilla PoR death softlock


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 021CDF60h

; This patch makes Charlotte always use spells at full power, even when only half-charged.

.org 0x02214DC8 ; Where the base multiplier for a spell is located (usually 1).
  addne r2, r4, 2h ; Change it to 2.

.org 0x021F1C40 ; Where the bonus multiplier you get for fully charging a spell is located (usually 1).
  ;movge r0, 0h ; Change it to 0. This is so fully charging a spell won't get a 3x multiplier, and instead it will stay at simply 2x (fully charged).
; You can remove the above two lines if you want fully charged spells to have a 3x multiplier, which actually does work correctly, making spells do 3x damage, and depending on the spell can even do other things like increasing the number of projectiles or the size of the projectiles past the normal limit.
; There are a few minor bugs if you choose to have spells with a 3x multiplier. For example, Spirit of Light will fire only 1 projectile instead of 3 like you'd expect, Ice Needles will all be grouped together instead of spread out among a circle, and Nightmare will use the smaller size instead of the bigger one.

.close

PoR: Add patch to make spells always act fully charged


.nds
.relativeinclude on
.erroronwarning on

; This patch causes you to always have the Gambler Glasses effect of showing percentages instead of star ratings for enemy drops.

.open "ftc/arm9.bin", 02000000h

.org 0x02053074 ; Checks if you have Gambler Glasses equipped to see if it should hide the stars.
  mov r0, 2h ; Head armor 2, Gambler Glasses
.org 0x02053790 ; Checks if you have Gambler Glasses equipped to see if it should show the percentages.
  mov r0, 2h ; Head armor 2, Gambler Glasses

.close

Add patch to always show drop percentages in PoR


.nds
.relativeinclude on
.erroronwarning on

; Disables the special doors of the sliding puzzle in Demon Guest House.

.open "ftc/arm9.bin", 02000000h

.org 0x0202738C
  ; This is where, upon going through any door, the game would start checking your current sector/room indexes to see if the door you went through was a sliding puzzle door.
  ; The original code here had a return that was conditional and only ran if your sector index is not 1 (Demon Guest House).
  ; We change it to an unconditional return so the special behavior of the sliding puzzle doors never activates.
  mov r0, 0h
  pop r4-r8,r14
  bx r14

.close

Add ARMIPS patch to disable sliding puzzle


//============================================================
// color washer routine
//============================================================

colwash:
    lda color+$00      // load the current first color from table
    sta color+$28      // store in in last position of table to reset the cycle
    ldx #$00           // init X with zero

cycle1:
    lda color+1,x      // Start cycle by fetching next color in the table...
    sta color,x        // ...and store it in the current active position.
    sta $d990,x        // put into Color Ram
    inx                // increment X-Register
    cpx #$28           // have we done 40 iterations yet?
    bne cycle1         // if no, continue

colwash2:
    lda color2+$28     // load current last color from second table
    sta color2+$00     // store in in first position of table to reset the cycle
    ldx #$28

cycle2:
    lda color2-1,x     // Start cycle by fetching previous color in the table...
    sta color2,x       // ...and store it in the current active position.
    sta $d9df,x        // put into Color Ram
    dex                // decrease iterator
    bne cycle2         // if x not zero yet, continue

    rts                // return from subroutine

//============================================================
// color washer routine
//============================================================

colwash:
    lda color+$00      // load the current first color from table
    sta color+$27      // store in in last position of table to reset the cycle
    ldx #$00           // init X with zero

cycle1:
    lda color+1,x      // Start cycle by fetching next color in the table...
    sta color,x        // ...and store it in the current active position.
    sta $d990,x        // put into Color Ram
    inx                // increment X-Register
    cpx #$28           // have we done 40 iterations yet?
    bne cycle1         // if no, continue

colwash2:
    lda color2+$27     // load current last color from second table
    sta color2+$00     // store in in first position of table to reset the cycle
    ldx #$28

cycle2:
    lda color2-1,x     // Start cycle by fetching previous color in the table...
    sta color2,x       // ...and store it in the current active position.
    sta $d9df,x        // put into Color Ram
    dex                // decrease iterator
    bne cycle2         // if x not zero yet, continue

    rts                // return from subroutine

Fix last position offset on colorwasher fx


[BITS 64]

%include "src/asm_routines/constants.asm"

global start
extern rust_main

section .entry
start:
    ; update segments
    mov dx, gdt_selector_data   ; data selector
    mov ss, dx  ; stack segment
    mov ds, dx  ; data segment
    mov es, dx  ; extra segment
    mov fs, dx  ; f-segment
    mov gs, dx  ; g-segment

    ; set up stack
    mov esp, stack_top

    ; get to kernel
    call rust_main

    ; rust main returned, print `OS returned!`
    mov rax, 0x4f724f204f534f4f
    mov [0xb8000], rax
    mov rax, 0x4f724f754f744f65
    mov [0xb8008], rax
    mov rax, 0x4f214f644f654f6e
    mov [0xb8010], rax
    hlt

; reserve space for stack
section .bss
stack_bottom:
    resb 4096
stack_top:

[BITS 64]

%include "src/asm_routines/constants.asm"

global start
extern rust_main

section .entry
start:
    ; update segments
    mov dx, gdt_selector_data   ; data selector
    mov ss, dx  ; stack segment
    mov ds, dx  ; data segment
    mov es, dx  ; extra segment
    mov fs, dx  ; f-segment
    mov gs, dx  ; g-segment

    ; set up stack
    mov rsp, stack_top

    ; get to kernel
    call rust_main

    ; rust main returned, print `OS returned!`
    mov rax, 0x4f724f204f534f4f
    mov [0xb8000], rax
    mov rax, 0x4f724f754f744f65
    mov [0xb8008], rax
    mov rax, 0x4f214f644f654f6e
    mov [0xb8010], rax
    hlt

; reserve space for stack
section .bss
stack_bottom:
    resb 4096
stack_top:

Use rsp as stack pointer, not esp

Use rsp as stack pointer, not esp


; JUMP.ASM
; Make a jump and then hang

; Tell the compiler that this is offset 0.
; It isn't offset 0, but it will be after the jump.
[ORG 0]

        jmp 07C0h:start         ; Goto segment 07C0

start:
        ; Update the segment registers
        mov ax, cs
        mov ds, ax
        mov es, ax

hang:                           ; Hang!
        jmp hang

times 510-($-$$) db 0
dw 0AA55h

; 1.ASM
; Print "====" on the screen and hang

; Tell the compiler that this is offset 0.
; It isn't offset 0, but it will be after the jump.
[ORG 0]

        jmp 07C0h:start     ; Goto segment 07C0

start:
        ; Update the segment registers
        mov ax, cs
        mov ds, ax
        mov es, ax

        mov ah, 9           ; Print "===="
        mov al, '='         ;
        mov bx, 7           ;
        mov cx, 4           ;
        int 10h             ;

hang:                       ; Hang!
        jmp hang

times 510-($-$$) db 0
dw 0AA55h

Print "===" to the screen

Print "===" to the screen


	bits 64
	extern foo

	mov eax,[foo]
	mov rax,[foo]
	mov rax,[qword foo]

	mov eax,foo
	mov rax,dword foo
	mov rax,qword foo

	dd foo
	dq foo

test: Add a test for various 32- and 64-bit relocations

Test signedness in a couple of different contexts.

Signed-off-by: H. Peter Anvin <8a453bad9912ffe59bc0f0b8abe03df9be19379e@zytor.com>


bits 32
section .text
    align   4
    dd      0x1BADB002
    dd      0x00
    dd    - (0x1BADB002 + 0x00)

global start
extern main

start:
    cli
    mov     esp, kstack
    call    main
    hlt

section .bss
resb    8192
kstack:

bits 32
section .text
    align   4
    dd      0x1BADB002
    dd      0x00
    dd    - (0x1BADB002 + 0x00)

global start
extern entry

start:
    cli
    mov     esp, kstack
    call    entry
    hlt

section .bss
resb    8192
kstack:

Change name of entry function

Change name of entry function


.nds
.relativeinclude on
.erroronwarning on

; This adds a single pixel hole to all doors drawn on the map to increase visibility, like in PoR and OoE.

@Overlay41Start equ 0x02308920
@FreeSpace equ @Overlay41Start + 0x108

.open "ftc/arm9.bin", 02000000h

.org 0x020240B0
  ; Handles drawing left/right doors on the left edge of even-numbered columns.
  bne @DrawLeftRightDoorEvenColumn
  nop
  nop

.org 0x020240FC
  ; Handles drawing left/right doors on the left edge of odd-numbered columns.
  bne @DrawLeftRightDoorOddColumn
  nop
  nop

.org 0x020242A8
  ; Handles drawing up/down doors in even-numbered columns.
  ; 3 is the index of the door color in the palette, while 1 is the index of the room fill color in the palette.
  .word 0x00003133
.org 0x020242B4
  ; Handles drawing up/down doors in odd-numbered columns.
  .word 0x31330000

.close

.open "ftc/overlay9_41", @Overlay41Start

.org @FreeSpace
@DrawLeftRightDoorEvenColumn:
  cmp r4, 2 ; On the center pixel of an even-numbered row, skip drawing the door pixel
  beq 2024138h
  cmp r4, 6 ; On the center pixel of an odd-numbered row, skip drawing the door pixel
  beq 2024138h

  ; If we're not on a center pixel, simply draw the door pixel like the original code did and return.
  orr r0, r0, 3h
  str r0, [r5, r4, lsl 2h]
  b 2024138h
@DrawLeftRightDoorOddColumn:
  cmp r4, 2 ; On the center pixel of an even-numbered row, skip drawing the door pixel
  beq 2024138h
  cmp r4, 6 ; On the center pixel of an odd-numbered row, skip drawing the door pixel
  beq 2024138h

  ; If we're not on a center pixel, simply draw the door pixel like the original code did and return.
  orr r0, r0, 30000h
  str r0, [r5, r4, lsl 2h]
  b 2024138h

.close

Add patch to add holes into the doors on the map for DoS


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This makes it so that all melee weapons can break balore blocks, not just Julius's whip.

.org 0x02212AB0 ; Branch of a switch statement taken for all melee weapons except Julius's whip.
  b 02212D64h ; Instead take the branch taken for Julius's whip.

.close

.nds
.relativeinclude on
.erroronwarning on

.open "ftc/overlay9_0", 0219E3E0h

; This makes it so that all melee weapons can break balore blocks, not just Julius's whip.

.org 0x02212AB0 ; Branch of a switch statement taken for all melee weapons except Julius's whip.
  b 02212D64h ; Instead take the branch taken for Julius's whip.

; Next we need to make sure the player has Balore's soul.

.org 0x02212E94 ; Line in the whip code that would normally call 021D5210 to break the blocks.
  b @CheckDestroyBaloreBlocks ; Instead jump to our own code to check if the player has Balore's soul.

.close

.open "ftc/arm9.bin", 02000000h

.org 0x020C0290 ; Free space
@CheckDestroyBaloreBlocks:
  mov r5, r14
  mov r0, 0h
  bl 0220F81Ch
  cmp r0, 1h ; Check if Balore soul is active.
  beq @DestroyBaloreBlocks ; Destroy blocks if it is.
  ldr r0,=020F740Eh
  ldrb r0, [r0]
  cmp r0, 1h ; Otherwise check if the current player character is Julius.
  beq @DestroyBaloreBlocks ; Destroy blocks if it is.
  b 02212E98h ; Didn't meet either condition, so return without destroying them.
@DestroyBaloreBlocks:
  mov r0, r5
  mov r1, r12
  mov r2, r4
  bl 021D5210h ; Call function to destroy blocks.
  b 02212E98h ; Return
  .pool

.close

Update patch to break balore blocks

Update patch to break balore blocks


add $t0, $t1, $t2
sub $s0, $t0, $v0
exit
beq $3, $8, 3
nop
nop

add $t0, $t1, $t2
sub $s0, $t0, $v0
exit
add $t0, $t1, $t2
nop
nop

Remove the branch for clarity

Remove the branch for clarity


.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

.org 0x02051F90 ; Where the original game's code for loading area/sector/room indexes is.
  b 020BFC00h ; Jump to some free space, where we will put our own code for loading the area/sector/room indexes.

.org 0x020BFC00 ; Free space.
  mov r5,0h        ; Load the area index into r5.
  strb r5,[r0,515h] ; Store the area index to the ram address where r0 will read it later. (0x02111785)
  mov r5,0h        ; Load the sector index into r5.
  mov r4,0h        ; Load the room index into r4.
  b 02051F94h      ; Return to where we came from.

.close

.nds
.relativeinclude on
.erroronwarning on

.open "ftc/arm9.bin", 02000000h

.org 0x02051F90 ; Where the original game's code for loading area/sector/room indexes is.
  b 020BFC00h ; Jump to some free space, where we will put our own code for loading the area/sector/room indexes.

.org 0x020BFC00 ; Free space.
  mov r5,0h        ; Load the area index into r5.
  strb r5,[r0,515h] ; Store the area index to the ram address where r0 will read it later. (0x02111785)
  mov r5,0h        ; Load the sector index into r5.
  mov r4,0h        ; Load the room index into r4.
  b 02051F94h      ; Return to where we came from.

.org 0x02051F80 ; The case statement for Old Axe Armor mode's starting room initialization.
  b 0x02051F88 ; Change it to take the same branch as the other three modes.

.close

Fix changing starting room in PoR not changing Old Axe Armor mode's starting room