Added new ASM register fields, made std_divide use scratch registers
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
DataHoarder 2021-08-06 00:04:44 +02:00
parent 93a5ae1c13
commit e3535abed0
3 changed files with 57 additions and 28 deletions

View file

@ -59,7 +59,18 @@
.constant api_BSM_STATUS.PCIe_Warm_Reset_Deassert_Starting 0x00000010 ;; PCIe warm reset deassert starting
.constant api_BSM_STATUS.PCIe_Warm_Reset_Deassert_Completed 0x00010010 ;; PCIe warm reset deassert completed
.constant api_BSM_STATUS.ISR_Starting 0x000F0011 ;; ISR starting
.constant api_BSM_STATUS.Interrupt_Host_Y 0x00000011 ;; Interrupt Host Y (mask 0xFFF0FFFF)
.constant api_BSM_STATUS.Interrupt_Host 0x00000011 ;; Interrupt Host Y (mask 0xFFF0FFFF)
.constant api_BSM_STATUS.Interrupt_Host_0 0x00000011
.constant api_BSM_STATUS.Interrupt_Host_1 0x00010011
.constant api_BSM_STATUS.Interrupt_Host_2 0x00020011
.constant api_BSM_STATUS.Interrupt_Host_3 0x00030011
.constant api_BSM_STATUS.Interrupt_Host_4 0x00040011
.constant api_BSM_STATUS.Interrupt_Host_5 0x00050011
.constant api_BSM_STATUS.Interrupt_Host_6 0x00060011
.constant api_BSM_STATUS.Interrupt_Host_7 0x00070011
.constant api_BSM_STATUS.Interrupt_Host_8 0x00080011
.constant api_BSM_STATUS.Interrupt_Processing_OutOfReset 0x01000011 ;; Interrupt Processing, OutOfReset (mask 0xFFF0FFFF)
.constant api_BSM_STATUS.Interrupt_Processing_VPD 0x02000011 ;; Interrupt Processing, VPD (mask 0xFFF0FFFF)
.constant api_BSM_STATUS.Interrupt_Processing_HotReset 0x04000011 ;; Interrupt Processing, HotReset (mask 0xFFF0FFFF)

View file

@ -358,27 +358,43 @@
;; These require offsets to be accessed
.constant PCIE_PF_BASE, %0x100000
.constant PCIE_PF_OFFSET, 0x100000
.constant PCIE_IB, PCIE_PF_BASE +0x13000
.bitfield PCIE_IB.HotReset 0
.bitfield PCIE_IB.DeviceStateChange 1
.bitfield PCIE_IB.Mailbox 2
.bitfield PCIE_IB.VPD_Request 3
.bitfield PCIE_IB.SramError 4
.bitfield PCIE_IB.PFLR 5
.bitfield PCIE_IB.DataPathReset 6
.bitfield PCIE_IB.OutOfReset 7
.bitfield PCIE_IB.NotInReset 8
.bitfield PCIE_IB.Timeout 9
.bitfield PCIE_IB.VFLR 10
.constant PCIE_IP, PCIE_PF_BASE +0x13000
.bitfield PCIE_IP.HotReset 0
.bitfield PCIE_IP.DeviceStateChange 1
.bitfield PCIE_IP.Mailbox 2
.bitfield PCIE_IP.VPD_Request 3
.bitfield PCIE_IP.SramError 4
.bitfield PCIE_IP.PFLR 5
.bitfield PCIE_IP.DataPathReset 6
.bitfield PCIE_IP.OutOfReset 7
.bitfield PCIE_IP.NotInReset 8
.bitfield PCIE_IP.Timeout 9
.bitfield PCIE_IP.VFLR 10
.constant PCIE_IM, PCIE_PF_BASE +0x13001
.constant PCIE_IB, PCIE_PF_BASE +0x13002
.constant PCIE_SERDES_CTRL_0, PCIE_PF_BASE +0x19010
.constant PCIE_SERDES_CTRL_1, PCIE_SERDES_CTRL_0 +2
.constant PCIE_SERDES_CTRL_2, PCIE_SERDES_CTRL_1 +2
.constant PCIE_SERDES_CTRL_3, PCIE_SERDES_CTRL_2 +2
.constant PCIE_SERDES_CTRL_4, PCIE_SERDES_CTRL_3 +2
.constant PCIE_SERDES_CTRL_5, PCIE_SERDES_CTRL_4 +2
.constant PCIE_SERDES_CTRL_6, PCIE_SERDES_CTRL_5 +2
.constant PCIE_SERDES_CTRL_7, PCIE_SERDES_CTRL_6 +2
.bitfield PCIE_SERDES_CTRL_a.Interrupt 1
.bitfield PCIE_SERDES_CTRL_a.InProgress 2
.bitfield PCIE_SERDES_CTRL_a.InterruptCode 16, 16
.bitfield PCIE_SERDES_CTRL_b.DataWrite 0, 16
.bitfield PCIE_SERDES_CTRL_b.DataRead 16, 16
.constant PCIE_SERDES_CTRL_0a, PCIE_PF_BASE +0x19010
.constant PCIE_SERDES_CTRL_0b, PCIE_SERDES_CTRL_0a +1
.constant PCIE_SERDES_CTRL_1b, PCIE_SERDES_CTRL_0a +2
.constant PCIE_SERDES_CTRL_1b, PCIE_SERDES_CTRL_1a +1
.constant PCIE_SERDES_CTRL_2b, PCIE_SERDES_CTRL_1a +2
.constant PCIE_SERDES_CTRL_2b, PCIE_SERDES_CTRL_2a +1
.constant PCIE_SERDES_CTRL_3b, PCIE_SERDES_CTRL_2a +2
.constant PCIE_SERDES_CTRL_3b, PCIE_SERDES_CTRL_3a +1
.constant PCIE_SERDES_CTRL_4b, PCIE_SERDES_CTRL_3a +2
.constant PCIE_SERDES_CTRL_4b, PCIE_SERDES_CTRL_4a +1
.constant PCIE_SERDES_CTRL_5b, PCIE_SERDES_CTRL_4a +2
.constant PCIE_SERDES_CTRL_5b, PCIE_SERDES_CTRL_5a +1
.constant PCIE_SERDES_CTRL_6b, PCIE_SERDES_CTRL_5a +2
.constant PCIE_SERDES_CTRL_6b, PCIE_SERDES_CTRL_6a +1
.constant PCIE_SERDES_CTRL_7b, PCIE_SERDES_CTRL_6a +2
.constant PCIE_SERDES_CTRL_7b, PCIE_SERDES_CTRL_7a +1

View file

@ -10,6 +10,8 @@
.reserve std_PARAMETER_0 0x1E2
.reserve std_PARAMETER_1 0x1E3
;; Used for offset pointer access
.constant std_THIS %0
.constant RRET std_RETURN_VALUE ;;Alias
.constant RRET_X std_RETURN_VALUE_EXTRA ;;Alias
@ -55,7 +57,7 @@
;; Ephemeral registers to be used within functions. These values may not be kept when calling other functions. They can be used when returning values if necessary.
;; Some std functions might restore these values.
.reserve std_EPHEMERAL_REGISTER_0 0x1F0
.reserve std_EPHEMERAL_REGISTER_1 0x1F1
.reserve std_EPHEMERAL_REGISTER_1 0x1F1
.reserve std_EPHEMERAL_REGISTER_2 0x1F2
.reserve std_EPHEMERAL_REGISTER_3 0x1F3
.reserve std_EPHEMERAL_REGISTER_4 0x1F4
@ -123,16 +125,16 @@ std_divide:
MOV BSM_COUNTER_0, 32 ; Move bits left to counter (8 * 4)
MOV RRET, P0 ; Move dividend to RRET (quotient)
MOV RRET_X, 0 ; Move remainder to RRET_X
MOV R0, 0
MOV S0, 0
.divide:
MOV R0, RRET ; Move quotient to temp R0
MOV S0, RRET ; Move quotient to temp S0
ADD RRET, RRET, RRET ; quotient = quotient + quotient
ADD RRET_X, RRET_X, RRET_X ; remainder = remainder + remainder + ...
SHL R0, RRET, R0 ; quot << R0
ADD RRET_X, RRET_X, R0 ; remainder = ... + (quot << R0)
SHL S0, RRET, S0 ; quot << S0
ADD RRET_X, RRET_X, S0 ; remainder = ... + (quot << S0)
SUB R0, RRET_X, P1 ; compare rem >= divisor
BNE R0, 0, 1 <31, @.no_reduce
SUB S0, RRET_X, P1 ; compare rem >= divisor
BNE S0, 0, 1 <31, @.no_reduce
SUB RRET_X, RRET_X, P1 ; remainder = remainder - divisor
ADD RRET, RRET, 1 ; quotient = quotient + 1
.no_reduce: