Difference between revisions of "84PCE:Ports:D000"

From WikiTI
Jump to: navigation, search
(Created page with "D000 - SPI SPI == Synopsis == '''Port Number:''' D000 '''Memory-mapped Address:''' F80000 '''Function:''...")
 
m (Some comments.)
Line 125: Line 125:
 
  or a,a
 
  or a,a
 
  call spiWrite
 
  call spiWrite
  xor a,a
+
  xor a,a ; not sure what this is for
 
  call spiWrite
 
  call spiWrite
 
  ld l,009h
 
  ld l,009h
Line 133: Line 133:
 
  call spiWait
 
  call spiWait
 
  ld l,$18
 
  ld l,$18
  ld a,(hl)
+
  ld a,(hl) ; dummy read
 
  ld a,(hl)
 
  ld a,(hl)
 
  ld a,(hl)
 
  ld a,(hl)

Revision as of 02:27, 1 March 2017

Synopsis

Port Number: D000

Memory-mapped Address: F80000

Function: LCD Interface

This appears to be an SPI controller that interfaces with the LCD. Non-extended commands from [1] appear to work, but there's plenty of unknown commands used by the boot code.


Port    Default    Bits    Information   
D000
F80000
0000F38C Boot code writes 180B/09 before/after turning on/off the lcd.
Bits 0-2 could be transfer size.
D004
F80004
0000182B 007FFFFF Boot code initializes to 02000B.
D008
F80008
0002000B 00000F8F Boot code initializes to 010C.
Bit 0 is set to transfer data.
Bit 7 is set/reset for reading/writing.
D00C
F8000C
000004F2 Status bits.
Boot code waits for bits 4-7 and 10 to be 0 before/after reading/writing.
D010
F80010
00002100 Unknown
D014
F80014
00000008 Unknown
D018
F80014
FIFO in/out.
D01C
F8001C
0E0F0F1F Constant, could be an ID or status.
D060
F80060
00012100 Constant, could be an ID or status.
D064
F80064
0E0F0F1F Constant, could be an ID or status.

Example

Sending

 ld a,036h ; Flips the lcd horizontally, vertically, and swaps the b and r components
 call spiCmd
 ld a,0C0h
 call spiParam

 ld a,002h ; Resetting the lcd on exit
 call spiCmd
 jp boot_InitializeHardware

; Input: A = parameter
spiParam:
 scf ; First bit is set for data
 .db 030h ; jr nc,? ; skips over one byte
; Input: A = command
spiCmd:
 or a,a ; First bit is clear for commands
 ld hl,0F80818h
 call spiWrite
 ld l,h
 ld (hl),001h
spiWait:
 ld l,00Dh
spiWait1:
 ld a,(hl)
 and a,0F0h
 jr nz,spiWait1
 dec l
spiWait2:
 bit 2,(hl)
 jr nz,spiWait2
 ld l,h
 ld (hl),a
 ret
spiWrite:
 ld b,3
spiWriteLoop:
 rla
 rla
 rla
 ld (hl),a ; send 3 bits
 djnz spiWriteLoop
 ret

Receiving

This does not appear to work, always returning 0 on the calcs I've tested, due to either a TI bug or hardware issue.

; Input: A = command
; Ouput: A = data
spiRead:
 ld hl,0F80808
 ld (hl),00Ch
 ld l,018h
 or a,a
 call spiWrite
 xor a,a ; not sure what this is for
 call spiWrite
 ld l,009h
 ld (hl),001h
 dec l
 ld (hl),081h
 call spiWait
 ld l,$18
 ld a,(hl) ; dummy read
 ld a,(hl)
 ld a,(hl)
 xor a,a
 ld bc,00300h
spiReadLoop:
 ld a,(hl)
 and a,3
 add a,a
 add a,a
 add a,a
 or a,c
 ld c,a
 djnz spiReadLoop
 ret