;sd header is placed here .incdir "F:\git\goldmomo_endlos\assembler_files\ucore\" .include "boot_level_sdHeader.s" .include "include\ucore_ctrl.i" ;start at address 32 here .def cmdToReciveWait 9 ;*********************************************************************** ;* user code start ;*********************************************************************** userLevel nop nop nop nop nop gpci r7,2 ;next 4 + X br setupVideo nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;read sdcard to sram movei r0,startBlock nop moveih r0,>startBlock nop rqldi r0,0 ;low rqldi r0,1 ;high nop ld r2 ld r3 movei r1,UcI2CSoftPortACtrl nop moveih r1,>UcI2CSoftPortACtrl ;video has 4mb offset + 32 blocks code nop add r2,r2,r1 addtqi r3,r3,0 nop ;r3:r2 current block movieLoop push r3 push r2 movei r1,$0 movei r0,$e0 moveih r1,$f0 ;r1:r0 = $f000 10e0 moveih r0,$10 gpci r7,2 ; br sdCardReadBlocks movei r4,$10 ;block cnt-1 delay slot nop ;delay slot nop ;delay slot moveih r4,$1 ;delay slot gpci r7,2 br sleep movei r0,4 ;5ms delay slot nop ;delay slot nop ;delay slot nop ;delay slot rqpop rqpop nop pop r2 pop r3 movei r0,$1a nop moveih r0,$1 nop add r2,r2,r0 addtqi r3,r3,0 br movieLoop nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;no error check return sdError loop br loop nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;****************************** ;* ;* sdCardReadBlocks ;* ;* r1:r0 = destination address ;* r3:r2 = startblock ;* r4 = block count - 1 ;* ;* return ;* ;* r0 = 0 (load ok) ;* sdCardReadBlocks ;prolog push r5 push r6 push r7 ;setup burst address movei r5,$10 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base + $10 nop esadr r6,r5 movei r5,2 ;enable burst est r0,2 ;low est r1,3 ;high est r5,0 ;enable burst (push total fifo out) ; r3:r2 = startblock , r4 = block count - 1 blockLoop push r2 push r3 push r4 ;display to 7seg (debug) gpci r7,2 ;next 4 + X br longToHexMap or r1,r2,r2 ;delay slot or r0,r3,r3 ;delay slot nop ;delay slot nop ;delay slot gpci r7,2 ;next 4 + X br drawHex nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;---> block loop (r3:r2 = current block) ;reset reciver movei r5,$10 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base + $15 movei r0,3 ;reset reciver , burst enable esadr r6,r5 est r0,0 ;is sdhc (no -> current block * 512) movei r0,sdCardIsSDHC nop moveih r0,>sdCardIsSDHC nop rqldi r0,0 nop nop ld r0 nop cmpeqi r0,0 brtc sdhcBlkCalcContinue ;is sdhc so in blocks nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;r3:r2 * 512 ;r3 r2 ;aaaa aaaa bbbb bbbb cccc cccc dddd dddd ;bbbb bbbc cccc cccd dddd ddd0 0000 0000 moveih r3,0 ;r3 = 0000 0000 bbbb bbbb *1 or r0,r2,r2 ;r0 = cccc cccc dddd dddd *2 moveih r2,0 ;r2 = dddd dddd 0000 0000 *3 swp r3,r3 ;r3 = bbbb bbbb 0000 0000 *4 swp r2,r2 ;r2 = dddd dddd cccc cccc *5 add r3,r3,r3 ;r3 = bbbb bbb0 0000 0000 *6 lsri r0,7 ;r0 = 0000 000c cccc cccd *7 add r2,r2,r2 ;r2 = dddd ddd0 0000 0000 *8 or r3,r3,r0 ;r3 = bbbb bbbc cccc cccd *9 sdhcBlkCalcContinue ;send single block read (CMD17) gpci r7,2 ;next 4 + X br sdCardSendCmd movei r0,17 ;cmd delay slot or r1,r2,r2 ;r1 arg low delay slot or r2,r3,r3 ;r2 arg high delay slot movei r3,0 ;48 bit delay slot ;recive gpci r7,2 ;next 4 + X br sdCardReciveCmd movei r1,$ff ; delay slot nop ; delay slot moveih r1,$ff ;65536 = timeout delay slot nop ; delay slot ;test recive result [ r0 = status (4 = ok | 2 = error | 1 = timeout) ] movei r7,3 nop and r2,r0,r7 ;error / time out nop cmpeqi r2,0 brtc sdCardReadBlocksError movei r0,1 ;delay slot nop ;delay slot nop ;delay slot nop ;wait for transfer finish movei r5,$10 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base + $10 nop esadr r6,r5 waitSdReadFinish erqldi 0 eld r0 nop cmpeqi r0,$f brtc waitSdReadFinish nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;check fifos <8192-512 movei r5,$15 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base + $15 nop esadr r6,r5 waitSdFifoLoad erqldi 0 erqldi 1 erqldi 2 erqldi 3 eld r0 eld r1 eld r2 eld r3 cmplo r0,r1 ;r0 set reciver to 48bit / 1 -> set reciver to 136 bit ;* ;* sdCardSendCmd push r5 push r6 movei r5,$00 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base moveih r0,2 ;reset $0002 CMDX swp r3,r3 ;r3 = 000x 0000 esadr r6,r5 muli r3,4 ;reset first (reset read after write) est r0,0 ;reset ; moveih r0,1 ;start $0001 CMDX est r1,3 ;low argument or r0,r0,r3 ;add reciver mode est r2,2 ;high argument est r0,0 ;cmd + start est r0,7 ;write sync (to wait for real startup) est r0,7 est r0,7 rqpop rqpop jmpi r7,0 pop r6 ;delay slot pop r5 ;delay slot nop ;delay slot nop ;delay slot ;****************************** ;* ;* sdCardReciveCmd ;* ;* r1 = timeout count -1 ;* ;* return ;* ;* r0 = status (4 = ok | 2 = error | 1 = timeout) ;* r1 = recived cmd ;* r2 = recived arg low ;* r3 = recived arg high ;* r4 = expected crc, recived crc ;* r5 = ptr to 8 words (full data recived if mode is 136 bit) ;* sdCardReciveCmd push r6 movei r5,$00 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base nop esadr r6,r5 ;wait for respons sdCardReciveCmdRead erqldi 0 ;status movei r4,6 ;110 eld r0 ;RO RE SP (Recive Ok, Recive Error, Send in Progress) nop and r2,r0,r4 nop cmpeqi r2,0 ;if not 'not' ok or error retry brtc sdCardReciveCmdFinish nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot subi r1,1 brts sdCardReciveCmdRead nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;timeout addi r0,1 ;set timeout in status sdCardReciveCmdEpilog rqpop jmpi r7,0 movei r5,sdCardReciveCmdFullDataBuffer ;delay slot pop r6 ;delay slot moveih r5,>sdCardReciveCmdFullDataBuffer ;delay slot nop ;delay slot sdCardReciveCmdFinish ;* r1 = recived cmd ;* r2 = recived arg low ;* r3 = recived arg high ;* r4 = expected crc, recived crc ;* r5 = ptr to 8 words (full data recived if mode is 136 bit) ;get 48 bit values ;erqldi 3 ;cmd erqldi 3 ;arg low erqldi 2 ;arg high erqldi 1 ;ecrc crc or r1,r0,r0 nop lsri r1,8 movei r5,$02 movei r6,$00 moveih r5,$00 moveih r6,$A0 ;sd card base + 2 ;eld r1 eld r2 eld r3 eld r4 esadr r6,r5 ;base for 136bit mode movei r5,sdCardReciveCmdFullDataBuffer erqldi 0 moveih r5,>sdCardReciveCmdFullDataBuffer erqldi 1 erqldi 2 erqldi 3 erqldi 4 erqldi 5 erqldi 6 erqldi 7 push r7 movei r7,7 sdCardReciveCmdReadLongArg eld r6 ;127 .. 112 subi r7,1 brts sdCardReciveCmdReadLongArg st r5,r6 ;delay slot addi r5,1 ;delay slot nop ;delay slot nop ;delay slot rqpop br sdCardReciveCmdEpilog nop ;delay slot pop r7 ;delay slot nop ;delay slot nop ;delay slot sdCardReciveCmdFullDataBuffer .space 8 ;****************************** ;* ;* sleep ;* ;* r0 = (cnt in ms) -1 ;* ;* sleep push r1 sleepLoopOut movei r1,$4c nop moveih r1,$45 nop sleepLoopIn subi r1,1 brts sleepLoopIn nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot subi r0,1 brts sleepLoopOut nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot rqpop jmpi r7,0 nop ;delay slot pop r1 ;delay slot nop ;delay slot nop ;delay slot ;****************************** ;* ;* r0 value ;* r1 count-1 (8 words)) ;* r3:r2 dest ; memset clearLoop esadr r3,r2 est r0,0 est r0,1 est r0,2 est r0,3 est r0,4 est r0,5 est r0,6 est r0,7 subi r1,1 brts clearLoop addi r2,8 ;delay slot addtqi r3,r3,0 ;delay slot nop ;delay slot nop ;delay slot jmpi r7,0 nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;****************************** ;* ;* setupVideo ;* setupVideo push r7 movei r0,videoDefault ;source movei r1,UcTimer2Ctrl ;dest-1 moveih r0,>videoDefault moveih r1,>UcTimer2Ctrl movei r2,26 ;27-1 setupVideoLoop rqldi r0,0 addi r0,1 addi r1,1 ld r3 subi r2,1 brts setupVideoLoop st r1,r3 ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot jmpi r7,0 nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ; clear screen movei r2,$00 ;destination movei r3,$00 moveih r2,$00 moveih r3,$f0 ;p(0,0) = f000 0000 gpci r7,2 ;next 4 + X br clearLoop movei r1,$8c ; count delay slot movei r0,$00 ; value delay slot moveih r1,$27 ; count delay slot nop ; delay slot rqpop nop nop pop r7 nop jmpi r7,0 nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;********************************************************************* ;* data ;********************************************************************* videoDefault ;AD NAME NEW DEFAULT word $0001 ;10 VIDEO_ON 1 1 (ON) word $0097 ;11 HSYNC (D = 11 .. 0) 152-1 152-1 word $017f ;12 HSTART (D = 11 .. 0) 384-1 384-1 word $017d ;13 HMEMSTART (D = 11 .. 0) 382-1 382-1 word $071f ;14 HSTOP (D = 11 .. 0) 1824-1 1824-1 word $076f ;15 HTOTAL (D = 11 .. 0) 1904-1 1904-1 word $0002 ;16 VSYNC (D = 10 .. 0) 3-1 3-1 word $001e ;17 VSTART (D = 10 .. 0) 31-1 31-1 word $03a2 ;18 VSTOP (D = 10 .. 0) 931-1 931-1 word $03a3 ;19 VTOTAL (D = 10 .. 0) 932-1 932-1 word $0000 ;1a LC ADDER LOW $0000 $0000 word $0080 ;1b LC ADDER HIGH $0080 $0040 word $0000 ;1c LC ADDER LATCH X X word $0000 ;1d LC START (10 .. 0) Pixeloffset $0000 $0000 word $0000 ;1e X X word $0000 ;1f X X word $0008 ;20 HLOADSTART 8 8 word $0170 ;21 HLOADSTOP 360+8 180+8 word $001e ;22 VLOADSTART 31-1 31-1 word $03a2 ;23 VLOADSTOP 931-1 931-1 word $0002 ;24 VLOADNEXT 2 4 word $0000 ;25 MEM_STARTADR_store low $0000 $0000 word $f000 ;26 MEM_STARTADR_store high $f000 $f000 word $0000 ;27 MEM_LINEOFFSET_store low $0000 $0000 word $0000 ;28 MEM_LINEOFFSET_store high $0000 $0000 word $0002 ;29 MEM_MODE_store 2 2 (X1R5G5B5X1R5G5B5) word $0000 ;2a LATCH MEM_STARTADR/LINEOFFSET/MODE X X ;--------------- ; longToHexMap ; ; r0 = high value ; r1 = low value ; r7 = rpc ; longToHexMap push r0 push r1 push r2 push r3 push r4 push r5 push r6 push r7 movei r2,hexMap movei r7,hex7seg movei r5,$f ;msk moveih r2,>hexMap ;8 h moveih r7,>hex7seg movei r6,1 highLow or r3,r0,r0 or r4,r0,r0 lsri r3,12 lsri r4,8 and r3,r3,r5 and r4,r4,r5 add r3,r3,r7 add r4,r4,r7 rqldi r3,0 rqldi r4,0 nop ld r3 ld r4 nop st r2,r3 ;8;4 addi r2,1 nop st r2,r4 ;7;3 addi r2,1 or r3,r0,r0 and r4,r0,r5 lsri r3,4 nop and r3,r3,r5 nop add r3,r3,r7 add r4,r4,r7 rqldi r3,0 rqldi r4,0 nop ld r3 ld r4 nop st r2,r3 ;6;2 addi r2,1 nop st r2,r4 ;5;1 addi r2,1 or r0,r1,r1 ;next 4 digits subi r6,1 brts highLow nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot rqpop rqpop rqpop pop r7 pop r6 pop r5 rqpop rqpop rqpop pop r4 pop r3 pop r2 rqpop rqpop nop pop r1 pop r0 jmpi r7,0 nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot ;-- 0 ;-- ### ;-- 5 # # 1 ;-- #6# ;-- 4 # # 2 ;-- ### ;-- 3 hex7seg word %00111111 ; 0 word %00000110 ; 1 word %01011011 ; 2 word %01001111 ; 3 word %01100110 ; 4 word %01101101 ; 5 word %01111101 ; 6 word %00000111 ; 7 word %01111111 ; 8 word %01101111 ; 9 word %01110111 ; A word %01111100 ; b word %00111001 ; C word %01011110 ; d word %01111001 ; E word %01110001 ; F ;--------------- ; drawHex ; ; r7 = rpc ; ; scratch r0,r1 ; drawHex push r0 push r1 push r2 push r3 push r4 movei r0,hexMap movei r1,Uc7SegHex76 moveih r0,>hexMap moveih r1,>Uc7SegHex76 ;r1 = (hex7:hex6) movei r2,0 drawHexLoop rqldi r0,0 rqldi r0,1 addi r0,2 ld r3 ;hex n ld r4 ;hex n + 1 swp r3,r3 nop or r4,r4,r3 nop st r1,r4 subi r1,1 cmpeqi r2,6 brtc drawHexLoop addi r2,2 ;delay slot (t is not used so hazard can ignored) nop ;delay slot nop ;delay slot nop ;delay slot rqpop rqpop rqpop pop r4 pop r3 pop r2 rqpop rqpop nop pop r1 pop r0 jmpi r7,0 nop ;delay slot nop ;delay slot nop ;delay slot nop ;delay slot hexMap word $10 ;h0 word $11 word 0 word 0 word 0 word 0 word 0 word 0 ;h7 .org 8192 .incdir "F:\git\goldmomo_endlos\gfx" .incbin "video_sd_4mb_offset.raw"