( GPIO_PI)
( R.J.Wilks   3rd June 2016)

CR ." GPIO_pi"

HEX
58F80 CONSTANT GPIO_ReadData
58F81 CONSTANT GPIO_WriteData
58F82 CONSTANT GPIO_ReadOE
58F83 CONSTANT GPIO_WriteOE
58F85 CONSTANT GPIO_ExpAsGPIO
58F8B CONSTANT GPIO_ExpAsUART
58F8D CONSTANT GPIO_ExpAsMMC
58F8F CONSTANT GPIO_ReadMode
58F90 CONSTANT GPIO_WriteMode
58F9F CONSTANT GPIO_ReadExp32
58FA2 CONSTANT GPIO_WriteExp32
58FA5 CONSTANT GPIO_ReadExpOE32
58FA8 CONSTANT GPIO_WriteExpOE32
58FB4 CONSTANT GPIO_FlashOn
58FB5 CONSTANT GPIO_FlashOff
58FB6 CONSTANT GPIO_Info
58FB7 CONSTANT GPIO_I2CInfo
58FBB CONSTANT GPIO_LoadConfig
58FBC CONSTANT GPIO_ReadConfig
58FBD CONSTANT GPIO_EnableI2C
58FBE CONSTANT GPIO_GetBoard
58FBF CONSTANT GPIO_RescanI2C

68 CONSTANT OS_Memory
16 CONSTANT OS_EnterOS   ( enter Supervisor Mode)
7C CONSTANT OS_LeaveOS   ( back to User Mode)

CODE GPqboard    ( get board type in R0, R1 pointer to name)
GPIO_GetBoard SWI,
 R1 PUSH,
 R0 PUSH,
PC R14 MOV,
END-CODE

CODE GPExpMMC    ( for SPI on pins 7 to 11)
GPIO_ExpAsMMC SWI,
PC R14 MOV,
END-CODE

CODE GPEnabI2C  ( 0 .... )
 R0 POP,
 GPIO_EnableI2C SWI,
PC R14 MOV,
END-CODE

CODE GPExpGPIO   ( n....)
 R0 POP,
 GPIO_ExpAsGPIO SWI,
PC R14 MOV,
END-CODE

CODE GPRdMode      ( pin no. on stack)
 R0 POP,
 GPIO_ReadMode SWI,
 R0 PUSH,
PC R14 MOV,
END-CODE

CODE GPWrMode      ( to set pin up as GPIO)
 R0 POP,           ( pin )
 R1 POP,           ( mode 0=input 1=output 4=alt0)
 GPIO_WriteMode SWI,
PC R14 MOV,
END-CODE

CODE GPRdOE         ( set OE of pin)
 R0 POP,            ( pin no. from stack)
 GPIO_ReadOE SWI,
 R0 PUSH,           ( input/output setting on stack)
PC R14 MOV,
END-CODE

CODE GPWrOE         ( set input/output state)
 R0 POP,            ( pin no. from stack)
 R1 POP,            ( 0 for output and 1 for input)
 GPIO_WriteOE SWI,
 R0 PUSH,           ( input/output setting on stack 0 or 1)
PC R14 MOV,
END-CODE

CODE GPRdData
 R0 POP,              ( pin no. from stack)
 GPIO_ReadData SWI,
 R0 PUSH,             ( level of pin)
PC R14 MOV,
END-CODE

CODE GPWrData
 R0 POP,              ( pin no. from stack)
 R1 POP,              ( 0 for low and 1 for high)
 GPIO_WriteData SWI,
 R1 PUSH,             ( pin mask)
 R0 PUSH,             ( -1 if pin not valid, or logical address of pin)
PC R14 MOV,
END-CODE

( get bus addr for SPI control/status register)
CODE SPI_reg      ( space,addr,reason code{13} .... bus addr)       
 R0 POP,          ( 13 to r0)
 R1 POP,          ( &20204000 to r1)
 R2 POP,          ( space to r2 - say &200)
 OS_Memory SWI,
 R3 PUSH,
PC R14 MOV,
END-CODE

( Read from peripheral in SVC mode)
CODE rd_SVCmode    ( addr....n)
 R1 POP,           ( address in R1) 
 OS_EnterOS SWI,   ( enter Supervisor Mode)
 R0 [ R1 ]  LDR,   ( read value to R0)
 OS_LeaveOS SWI,
 R0 PUSH,          ( put to stack)
PC R14 MOV,
END-CODE

( Write to peripheral in SVC mode)
CODE wr_SVCmode    ( n,addr....)
 R1 POP,           ( address in R1)
 R0 POP,           ( value in R0)
 OS_EnterOS SWI,   ( enter Supervisor Mode)
 R0 [ R1 ]  STR,   ( store value at addr)
 OS_LeaveOS SWI,
PC R14 MOV,
END-CODE

DECIMAL
0 VARIABLE brdno
: getboard GPqboard CR ." board number: " DUP . brdno ! 
   DUP 30 + SWAP CR DO I C@ DUP 0= IF DROP LEAVE ELSE EMIT ENDIF LOOP ;
