macro backtransnet m0
;translate a levelnet address into Amnesia coords.
{
  STMFD R13!,{R2-R3}
  LDR R1,[R12,#v.levelnet]
  SUB R1,m0,R1
  LDR R2,[R12,#v.netxsize]
  MOV R2,R2,LSL #2
  SUB R2,R2,#1
  AND R0,R1,R2
  LDR R2,[R12,#v.netysize]
  MOV R2,R2,LSL #2
  SUB R2,R2,#1
  LDR R3,[R12,#v.levelshift]
  ADD R3,R3,#2
  MOV R1,R1,LSR R3
  AND R1,R1,R2
  MOV R0,R0,LSL #12+baseshift-netshift
  MOV R1,R1,LSL #12+baseshift-netshift
  ADD R0,R0,#1<<(11+baseshift-netshift)
  ADD R1,R1,#1<<(11+baseshift-netshift)
  LDMFD R13!,{R2-R3}
}

macro backtransdata m0
;translate a leveldata address into Amnesia coords
{
  STMFD R13!,{R2-R3}
  LDR R1,[R12,#v.leveldata]
  SUB R1,m0,R1
  LDR R2,[R12,#v.netxsize]
  SUB R2,R2,#1
  AND R0,R1,R2
  LDR R2,[R12,#v.netysize]
  SUB R2,R2,#1
  LDR R3,[R12,#v.levelshift]
  MOV R1,R1,LSR R3
  AND R1,R1,R2
  MOV R0,R0,LSL #12+baseshift
  MOV R1,R1,LSL #12+baseshift
  ADD R0,R0,#1<<(11+baseshift)
  ADD R1,R1,#1<<(11+baseshift)
  LDMFD R13!,{R2-R3}
}

macro transnet m0,m1,m2
;translate the Amnesia coords in m1,m2 to a levelnet address
{
  MOV m0,m2,LSR #12+baseshift-netshift
  LDR R14,[R12,#v.levelshift]
  MOV m0,m0,LSL R14
  MOV m0,m0,LSL #netshift
  LDR R14,[R12,#v.levelnet]
  ADD m0,m0,R14
  ADD m0,m0,m1,LSR #12+baseshift-netshift
}  

macro transdata m0,m1,m2
;translate the Amnesia coords in m1,m2 to a leveldata address
{
  MOV m0,m2,LSR #12+baseshift
  LDR R14,[R12,#v.levelshift]
  MOV m0,m0,LSL R14
  LDR R14,[R12,#v.leveldata]
  ADD m0,m0,R14
  ADD m0,m0,m1,LSR #12+baseshift
}  



;rem finds the remainder of m1/3 for m1<256  
macro rem3 m0
{
  CMP m0,#192
  SUBGE m0,m0,#192
  CMP m0,#96
  SUBGE m0,m0,#96
  CMP m0,#48
  SUBGE m0,m0,#48
  CMP m0,#24
  SUBGE m0,m0,#24
  CMP m0,#12
  SUBGE m0,m0,#12
  CMP m0,#6
  SUBGE m0,m0,#6
  CMP m0,#3
  SUBGE m0,m0,#3
}  

macro DIV96 m0,m1
;divide by 96 for m1 < 6<<12
{
MOV m0,#0
CMP m1,#3<<12
SUBGE m1,m1,#3<<12
ORRGE m0,m0,#1<<7
CMP m1,#3<<11
SUBGE m1,m1,#3<<11
ORRGE m0,m0,#1<<6
CMP m1,#3<<10
SUBGE m1,m1,#3<<10
ORRGE m0,m0,#1<<5
CMP m1,#3<<9
SUBGE m1,m1,#3<<9
ORRGE m0,m0,#1<<4
CMP m1,#3<<8
SUBGE m1,m1,#3<<8
ORRGE m0,m0,#1<<3
CMP m1,#3<<7
SUBGE m1,m1,#3<<7
ORRGE m0,m0,#1<<2
CMP m1,#3<<6
SUBGE m1,m1,#3<<6
ORRGE m0,m0,#1<<1
CMP m1,#3<<5
SUBGE m1,m1,#3<<5
ORRGE m0,m0,#1
}
