Programmera om prisskylt till något annat...
Programmera om prisskylt till något annat...
Ytterligare en stor prisskylt av samma typ som Skogen och Former Mazda också bygger om. Jag avser att behålla hårdvaran som den är och programmera om befintliga MCU's med egen programvara.
Har bara hunnit se lite som hastigast på korten. Styrkortet har en PIC18F2520 med 20MHz kristall. Denna är en hyfsat kraftfull sak med 16K programsteg och 1.5k RAM. Finns en stiftlist på kortet, kanske för att flasha om.
Sifferkorten har en 12F629, 1K programsteg och tämligen lite RAM. Vpp är dessvärre ansluten till en BC-någonting transistor som används som diod med emitter/bas hopkopplade och kollektorn till Vdd. Ingen aning varför denna finns där, den förhindrar i varje fall att lägga på 12V för att flasha MCU'n. Får skära en linje på kortet, den är lätt att skarva efteråt.
Skall givetvis försöka läsa av kretsarna som de är, men blir väldigt förvånad om tillverkaren inte har nollat code protect i kretsarnas config word. Kommer det ut något annat än nollor skall det bli intressant att försöka disassemblera det.
Siffrorna drivs från shiftregister avsedda för ändamålet. De har konstant strömutgång där strömmen sätts med ett motstånd. LED sitter i grupper med 1, 2 eller 3 dioder. De med 1 eller 2 har seriemotstånd på 200 eller 100 ohm för att ta upp en del av effekten som annars hamnat i drivkretsarna. Strömmen är 20mA, så 80 eller 40 mW avlastas från drivkretsen per sådan utgång.
Har någon av Er andra ritat upp något schema från korten?
Vill tacka för arbetet med att mappa upp vilken bit som styr vilken LED-grupp. Samt även anslutningskabeln till sifferkorten.
Har bara hunnit se lite som hastigast på korten. Styrkortet har en PIC18F2520 med 20MHz kristall. Denna är en hyfsat kraftfull sak med 16K programsteg och 1.5k RAM. Finns en stiftlist på kortet, kanske för att flasha om.
Sifferkorten har en 12F629, 1K programsteg och tämligen lite RAM. Vpp är dessvärre ansluten till en BC-någonting transistor som används som diod med emitter/bas hopkopplade och kollektorn till Vdd. Ingen aning varför denna finns där, den förhindrar i varje fall att lägga på 12V för att flasha MCU'n. Får skära en linje på kortet, den är lätt att skarva efteråt.
Skall givetvis försöka läsa av kretsarna som de är, men blir väldigt förvånad om tillverkaren inte har nollat code protect i kretsarnas config word. Kommer det ut något annat än nollor skall det bli intressant att försöka disassemblera det.
Siffrorna drivs från shiftregister avsedda för ändamålet. De har konstant strömutgång där strömmen sätts med ett motstånd. LED sitter i grupper med 1, 2 eller 3 dioder. De med 1 eller 2 har seriemotstånd på 200 eller 100 ohm för att ta upp en del av effekten som annars hamnat i drivkretsarna. Strömmen är 20mA, så 80 eller 40 mW avlastas från drivkretsen per sådan utgång.
Har någon av Er andra ritat upp något schema från korten?
Vill tacka för arbetet med att mappa upp vilken bit som styr vilken LED-grupp. Samt även anslutningskabeln till sifferkorten.
- FormerMazda
- Inlägg: 6230
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Programmera om prisskylt till något annat...
Skulle vara väldigt intressant om du lyckas dissasemblera PICarna och se hur deras seriella protokoll är gjort.
I övrigt har jag nog inget mer att bidra med annat än mappningen då, men den har du ju redan sett, eller skogens.
I övrigt har jag nog inget mer att bidra med annat än mappningen då, men den har du ju redan sett, eller skogens.
Re: Programmera om prisskylt till något annat...
Nu har jag monterat av styrkort och en siffra och börjat förbereda att göra något av dessa saker.
Har läst av configuration word från sifferkortet och konstaterat att, precis som väntat, Code Protect och Data Protect är båda nollade. Game Over när det gäller att undersöka befintlig programvara. Det är bara till att utföra Bulk Erase och flasha in egen programvara i sifferkorten.
Har inte provat att läsa av något från styrkortet, men skulle bli ytterligt förvånad om det är öppet för avläsning.
Styrkortet är 4-lagers, men bör vara möjligt att följa det som behövs för att konstatera vad pinnarna på dess PIC är anslutna till. Där är en pinne som går parallellt till alla fyra siffrorna och fyra pinnar var och en till en av siffrorna. Siffrornas matning går genom ett motstånd på 100mOhm. En 4052 analog switch väljer vilken som via en OP går till A/D i PIC. Där finns även en okänd vit komponent med en öppning på toppen. Den har ingen text och troligtvis 2 anslutningar. Gissar på en fuktsensor. Hur denna är kopplad samt temperatur-/ljus-sensorerna på de små "punktkorten" är anslutna återstår att följa upp. Finns även en utgång för fläktstyrning.
Kortet är definitivt användbart till såväl klocka som något annat.
Ni som inte använder det till Era projekt, släng det inte i återvinningen. Det är en kraftfull PIC-18 och definitivt användbart även som del i något helt annat.
Nu tar det ett tag att få till ny firmware för sifferkorten. Det här är inget prioriterat projekt.
Har läst av configuration word från sifferkortet och konstaterat att, precis som väntat, Code Protect och Data Protect är båda nollade. Game Over när det gäller att undersöka befintlig programvara. Det är bara till att utföra Bulk Erase och flasha in egen programvara i sifferkorten.
Har inte provat att läsa av något från styrkortet, men skulle bli ytterligt förvånad om det är öppet för avläsning.
Styrkortet är 4-lagers, men bör vara möjligt att följa det som behövs för att konstatera vad pinnarna på dess PIC är anslutna till. Där är en pinne som går parallellt till alla fyra siffrorna och fyra pinnar var och en till en av siffrorna. Siffrornas matning går genom ett motstånd på 100mOhm. En 4052 analog switch väljer vilken som via en OP går till A/D i PIC. Där finns även en okänd vit komponent med en öppning på toppen. Den har ingen text och troligtvis 2 anslutningar. Gissar på en fuktsensor. Hur denna är kopplad samt temperatur-/ljus-sensorerna på de små "punktkorten" är anslutna återstår att följa upp. Finns även en utgång för fläktstyrning.
Kortet är definitivt användbart till såväl klocka som något annat.
Ni som inte använder det till Era projekt, släng det inte i återvinningen. Det är en kraftfull PIC-18 och definitivt användbart även som del i något helt annat.
Nu tar det ett tag att få till ny firmware för sifferkorten. Det här är inget prioriterat projekt.
- FormerMazda
- Inlägg: 6230
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Programmera om prisskylt till något annat...
Denna vita komponent letar jag efter, men det enda jag kan se på mitt kort är den LED som sitter mellan kontakterna X3 och X4.
Spänningssätts kortet så blinkar den, som en jag-lever-puls eller nåt.
Skrivskyddet var väl väntat, men om du spänningssätter kortet och har siffror anslutna på X4-X7 så visas lite siffror i uppstarten, och då går en del trafik ut till dom.
Ifall du vill glänsa kan du ju alltid sniffa och lösa upp protokollet.
Spänningssätts kortet så blinkar den, som en jag-lever-puls eller nåt.
Skrivskyddet var väl väntat, men om du spänningssätter kortet och har siffror anslutna på X4-X7 så visas lite siffror i uppstarten, och då går en del trafik ut till dom.
Ifall du vill glänsa kan du ju alltid sniffa och lösa upp protokollet.
Re: Programmera om prisskylt till något annat...
När jag tittar noga så ja, det är en LED. Såg ut precis som ett galler med något luddigt under på bilden jag tog med mobilen för att kunna se något så smått.
Gjorde ett till misstag, gammal och trött som jag är. Läste Config Word bakvänt, men såg sedan att det här kan ju inte stämma. Måste ju vara INTOSC, inte kristall. Läste det sedan rätt, som little endian. HUPP! Code Protect är en etta Gjorde en avläsning och det fungerade... Oerhört förvånad. Tur jag upptäckte det innan Bulk Erase. Skall läsa av dataminnet också, det kräver lite firmware till min hembyggda enhet.
Gjorde ett till misstag, gammal och trött som jag är. Läste Config Word bakvänt, men såg sedan att det här kan ju inte stämma. Måste ju vara INTOSC, inte kristall. Läste det sedan rätt, som little endian. HUPP! Code Protect är en etta Gjorde en avläsning och det fungerade... Oerhört förvånad. Tur jag upptäckte det innan Bulk Erase. Skall läsa av dataminnet också, det kräver lite firmware till min hembyggda enhet.
- FormerMazda
- Inlägg: 6230
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Programmera om prisskylt till något annat...
Väldigt spännande!
Min skylt väntar på bättre tider ändå, så vem vet, kanske tar det ett annat spår nu om du hittar nåt kul?
Min skylt väntar på bättre tider ändå, så vem vet, kanske tar det ett annat spår nu om du hittar nåt kul?
Re: Programmera om prisskylt till något annat...
Eftersom jag ändå inte begriper mig på det så lär jag inte ha någon användning för det (eller dom små-PIC-arna som jag lött loss).
Skänkes om någon är intresserad.
Re: Programmera om prisskylt till något annat...
Har testat med ett löst sifferkort och det var inga större problem att flasha om befintlig MCU. En transistor använd som diod måste kapas bort för att kunna lägga på Vpp. Funkade OK med bulk erase och Vpp efter Vdd trots att /MCLR är satt som ingång.
Ljusstyrkan är verkligen enorm. En riktig ljussmocka att tända samtliga LED's med 100% styrka. Med c:a 1kHz PWM och 1µs (tror jag, till/från back-to-back) är det fortfarande på gränsen för att ha inomhus på natten.
Har precis börjat försöka disassemblera original firmware i siffrorna. Det lutar åt ny firmware, originalet tänder LED's i grupper och det är ju klart trevligare att kunna styra hårdvarugrupperna var för sig. Har inte kommit så långt ännu som att reda ut hur det är grupperat. Inte hellre kommandona för att sätta dem eller ställa ljusstyrkan.
Det är i varje fall synkron data. Klocka på PIC pinne 5, parallell till alla fyra siffrorna. Klockar troligen in på stigande flank. Data på PIC pinne 4.
Finns det någon de-compiler för PIC, ungefär 15 år gammal kod? Detta är säkert compiler-genererat. Görs onödiga saker och fullständig idiotkod på sina ställen.
Ljusstyrkan är verkligen enorm. En riktig ljussmocka att tända samtliga LED's med 100% styrka. Med c:a 1kHz PWM och 1µs (tror jag, till/från back-to-back) är det fortfarande på gränsen för att ha inomhus på natten.
Har precis börjat försöka disassemblera original firmware i siffrorna. Det lutar åt ny firmware, originalet tänder LED's i grupper och det är ju klart trevligare att kunna styra hårdvarugrupperna var för sig. Har inte kommit så långt ännu som att reda ut hur det är grupperat. Inte hellre kommandona för att sätta dem eller ställa ljusstyrkan.
Det är i varje fall synkron data. Klocka på PIC pinne 5, parallell till alla fyra siffrorna. Klockar troligen in på stigande flank. Data på PIC pinne 4.
Finns det någon de-compiler för PIC, ungefär 15 år gammal kod? Detta är säkert compiler-genererat. Görs onödiga saker och fullständig idiotkod på sina ställen.
Re: Programmera om prisskylt till något annat...
Har kommit en god bit med disassembleringn. Jag svamlade i förra inläget, det är individuellt styrda utgångar. Programmet är gjort för att kunna användas med längre skiftregister. Upp till 12 bytes, 96 bits, kan det nog hantera. Förmodligen i någon display med punktmatris.
Allt är nu disassemblerat utom en matematikblob som endast används för att mangla inställningen för intensitet.
Det kan nog funka med denna originalkod, men då måste intensiteten modifieras i hårdvara och/eller får koden ändras lite. För att bli lagom i ett mörkt rum måste pulserna kortas ner till det yttersta av vad som är möjligt och det kommer originalkoden inte i närheten av. Dessutom är nog strömmen satt onödigt nära AMR, så sannolikheten att led's går sönder är onödigt hög.
Editerar i befintlig post, det är ju en förtydligan av befintlig text, ingen info tas bort och ytterligare en postning blir för tjatig.
Följande är min egen tolkning av hur formatet mellan styrkort och sifferkort ser ut. Den kan innehålla fel och gör det nog också. Det är ännu otestat, Källan är en tolkning av programkoden.
Bitsen klockas in på negativ flank på PIC pinne 5 som är flanktriggad. Data skall in på PIC pinne 4. Klockan ger en interrupt, varefter ingången samplas av programvara. Det finns även en timer som ger interrupts med knappt 0.5ms intervall. Har inte räknat hur lång dess kod är, men måste ju exekvera klart på <0.5ms. Därför måste data hållas kvar längre än som så för att samplas korrekt.
Programmet tycks vara avsett att kunna användas till flera olika siffermoduler. Det kan ta emot 8 eller 12 bytes med displaymönster. Det shiftas ut till drivkretsarna med den först mottagna byten först. Detta sker efter att hela datablocket tagits emot.
Kan nog vara lagom med 1kHz klocka och växla data samtidigt med klockans negativa flank. Data shiftas in med högsta biten först i varje byte. För att markera slut på ett kommando skall klockan hållas kvar på låg nivå under minst 3ms. Ungefär 5 till 10 bör fungera.
Med originalkortet går klockan ut parallellt till alla fyra siffrorna. Data skall hållas låg på de siffror som inte skall ta emot något kommando. Noll är en kommandokod som ignoreras
Det finns tre kommandon:
Sätt displaymönster: 0x53 följt av ytterligare 8 eller 12 bytes. 6 bytes verkar inte finnas. Det blir de 6 sist skickade som kommer att användas på de här aktuella sifferkorten. Detta kommando måste upprepas oftare än varje sekund, annars släcks displayen. Efter 30 sekunder utan detta kommando resetas sifferkortet.
Sätt intensitet: 0x56 följt av en byte intensitetsvärde. Detta manglas på okänt sätt innan det används för PWM av displayen. Räknaren värdet compareras mot räknar från 0 till 0x14 med 0.5ms intervall.
LED-test: 0x5c följt av en byte där bits 2:0 anger bit och de höga bitsen anger byte där aktuell bit släcks. När PWM-räknaren vänder släcks denna bit och tänds på nytt efter 1.5ms. En strömmätning på styrkortet kan då avgöra om led är hel.
Tror det var former mazda som testade lite att mäta på de aktuella signalerna. Kan Du bekräfta eller avfärda att ovanstående är rimligt? Jag är som Ni vet invalid och har stökigt att mäta på dessa klumpiga saker.
Skall koppla in styrkortet, pröva att läsa av det och sedan testa om jag kan få ut något på sifferkorten med dess originalprogram. Det tar ett tag, måst mäta upp hårdvaran för att veta vilka pinnar på PIC som gör vad.
Programmet i styrkortet kommer jag inte att göra någon tolkning av mer än möjligen små fragment, då det är stort och helt ointressant för hobbybruk.
Allt är nu disassemblerat utom en matematikblob som endast används för att mangla inställningen för intensitet.
Det kan nog funka med denna originalkod, men då måste intensiteten modifieras i hårdvara och/eller får koden ändras lite. För att bli lagom i ett mörkt rum måste pulserna kortas ner till det yttersta av vad som är möjligt och det kommer originalkoden inte i närheten av. Dessutom är nog strömmen satt onödigt nära AMR, så sannolikheten att led's går sönder är onödigt hög.
Editerar i befintlig post, det är ju en förtydligan av befintlig text, ingen info tas bort och ytterligare en postning blir för tjatig.
Följande är min egen tolkning av hur formatet mellan styrkort och sifferkort ser ut. Den kan innehålla fel och gör det nog också. Det är ännu otestat, Källan är en tolkning av programkoden.
Bitsen klockas in på negativ flank på PIC pinne 5 som är flanktriggad. Data skall in på PIC pinne 4. Klockan ger en interrupt, varefter ingången samplas av programvara. Det finns även en timer som ger interrupts med knappt 0.5ms intervall. Har inte räknat hur lång dess kod är, men måste ju exekvera klart på <0.5ms. Därför måste data hållas kvar längre än som så för att samplas korrekt.
Programmet tycks vara avsett att kunna användas till flera olika siffermoduler. Det kan ta emot 8 eller 12 bytes med displaymönster. Det shiftas ut till drivkretsarna med den först mottagna byten först. Detta sker efter att hela datablocket tagits emot.
Kan nog vara lagom med 1kHz klocka och växla data samtidigt med klockans negativa flank. Data shiftas in med högsta biten först i varje byte. För att markera slut på ett kommando skall klockan hållas kvar på låg nivå under minst 3ms. Ungefär 5 till 10 bör fungera.
Med originalkortet går klockan ut parallellt till alla fyra siffrorna. Data skall hållas låg på de siffror som inte skall ta emot något kommando. Noll är en kommandokod som ignoreras
Det finns tre kommandon:
Sätt displaymönster: 0x53 följt av ytterligare 8 eller 12 bytes. 6 bytes verkar inte finnas. Det blir de 6 sist skickade som kommer att användas på de här aktuella sifferkorten. Detta kommando måste upprepas oftare än varje sekund, annars släcks displayen. Efter 30 sekunder utan detta kommando resetas sifferkortet.
Sätt intensitet: 0x56 följt av en byte intensitetsvärde. Detta manglas på okänt sätt innan det används för PWM av displayen. Räknaren värdet compareras mot räknar från 0 till 0x14 med 0.5ms intervall.
LED-test: 0x5c följt av en byte där bits 2:0 anger bit och de höga bitsen anger byte där aktuell bit släcks. När PWM-räknaren vänder släcks denna bit och tänds på nytt efter 1.5ms. En strömmätning på styrkortet kan då avgöra om led är hel.
Tror det var former mazda som testade lite att mäta på de aktuella signalerna. Kan Du bekräfta eller avfärda att ovanstående är rimligt? Jag är som Ni vet invalid och har stökigt att mäta på dessa klumpiga saker.
Skall koppla in styrkortet, pröva att läsa av det och sedan testa om jag kan få ut något på sifferkorten med dess originalprogram. Det tar ett tag, måst mäta upp hårdvaran för att veta vilka pinnar på PIC som gör vad.
Programmet i styrkortet kommer jag inte att göra någon tolkning av mer än möjligen små fragment, då det är stort och helt ointressant för hobbybruk.
Re: Programmera om prisskylt till något annat...
Här är min preliminära disassemblering och tolkning av programkoden.
Det finns två interruptkällor, klocka för seriell indata och en timer med c:a 0.5ms intervall. Timern används för PWM av ljusstyrkan, samt tidbas för all annan timing i programmet.
Huvudloopen kollar när det gått 3ms sedan senaste klocka och försöker då utföra ett kommando med mottagen data. Den nollställer även watchdog så länge som kommando med displaydata tagits emot de senaste 30s. Efter 1s utan denna data släcker den siffran.
Innan ett kommando används konrolleras att det inte är 0, är jämn byte och minst två bytes har mottagits. Kommandona kollar därefter att längden är ok.
Kommandot för displaydata shiftar ut och latchar denna, samtidigt som varje byte sparas i RAM för att vid behov användas av en testfunktion.
Sättning av intensitet manglar värdet på något sätt innan det används. Har inte försökt tolka manglingen. Talet 5 ingår är allt jag vet om detta... Den som känner sig hågad är välkommen att tolka denna del.
Kommandot för displaytest startar en sekvens där data i drivkretsarnas shiftregister, placerad där av testfunktionen, latchas till utgångarna. Sedan shiftas ursprunglig data ut. Detta görs i två omgångar, troligen för att interrupten inte skall "bita sig i svansen". På tredje interrupt latchas ursprunglig data. Styrkortet kan mäta varje sifferkorts strömförbrukning och genom denna blink detektera om led's är hela.
Den här koden är inte för Microship's helvetesassembler med tungbrytande opkoder och ultrabakvänd addressering. Koden är inte tillhyfsad ännu så den är redo att assemblera. Antar att den är drägligt läsbar trots dessa faktorer.
Några detaljer om assemblern. sbr/sbs=skip bit reset/set, rmb/smb=reset/set memory bit, tfz=test for zero, # är immediate address, a, inte w, är accumulator.
Det finns två interruptkällor, klocka för seriell indata och en timer med c:a 0.5ms intervall. Timern används för PWM av ljusstyrkan, samt tidbas för all annan timing i programmet.
Huvudloopen kollar när det gått 3ms sedan senaste klocka och försöker då utföra ett kommando med mottagen data. Den nollställer även watchdog så länge som kommando med displaydata tagits emot de senaste 30s. Efter 1s utan denna data släcker den siffran.
Innan ett kommando används konrolleras att det inte är 0, är jämn byte och minst två bytes har mottagits. Kommandona kollar därefter att längden är ok.
Kommandot för displaydata shiftar ut och latchar denna, samtidigt som varje byte sparas i RAM för att vid behov användas av en testfunktion.
Sättning av intensitet manglar värdet på något sätt innan det används. Har inte försökt tolka manglingen. Talet 5 ingår är allt jag vet om detta... Den som känner sig hågad är välkommen att tolka denna del.
Kommandot för displaytest startar en sekvens där data i drivkretsarnas shiftregister, placerad där av testfunktionen, latchas till utgångarna. Sedan shiftas ursprunglig data ut. Detta görs i två omgångar, troligen för att interrupten inte skall "bita sig i svansen". På tredje interrupt latchas ursprunglig data. Styrkortet kan mäta varje sifferkorts strömförbrukning och genom denna blink detektera om led's är hela.
Den här koden är inte för Microship's helvetesassembler med tungbrytande opkoder och ultrabakvänd addressering. Koden är inte tillhyfsad ännu så den är redo att assemblera. Antar att den är drägligt läsbar trots dessa faktorer.
Några detaljer om assemblern. sbr/sbs=skip bit reset/set, rmb/smb=reset/set memory bit, tfz=test for zero, # är immediate address, a, inte w, är accumulator.
Kod: Markera allt
* variables, not yet in assembler syntax
$20 intsav.a
$21 bit flags
0 rxidle receiving not in
1 wdtout set causes watchdog timer to run out
2 t0ocurd set when tmr0 int has occured
$22 rx.shreg shift register
$23 rx.bit bit storage
$24 rx.bytcnt byte counter
$25 rx.timer block ready timer
$26 rx.bitcnt bits counter
$27 unused0 unused
$28 clrtmr clear display timer
$29 pwmcnt tmr0 tick counter for pwm
$2a intens display intensity
$2b extwdt extension of watchdog timer
$2c maxptrn #last accepted pattern bytes
$2d exttmr0 extension of tmr0
$2e-$39 disptrn display pattern
$3a-$46 rxbuf receive buffer
$47 pad0 scratchpad
$48
$49
$4a txpnt transmit byte pointer, from main
$4b txbyte transmitted byte, from main
$4c intsav.statx extra status intsave
$4d txpnti transmit byte pointer, from interrupt
$4e txbytei transmitted byte, from interrupt
$4f tststat test state
$50 syspad0
$51 syspad1
$55 intsav.status
$56 intsav.iadres
$57 intsav.pclath
$58 syspad2
$59 syspad3
$5a intsav.syspad2
$5b intsav.syspad3
$5c intsav.syspad1
$5d intsav.syspad0
****** reset vector
*
0000 83 01 stz status clr status
0001 00 30 lod a,#$00 clr pclath
0002 8a 00 lod pclath,a
0003 56 28 jmp init jmp to init
****** irq transfers here
*
0004 a0 00 irqrtn lod $20,a irq vector, save a
0005 03 08 lod a,status get status..
0006 83 01 stz status ..and clear it
0007 d5 00 lod $55,a save status
0008 04 08 lod a,iadres save iadres
0009 d6 00 lod $56,a
000a 0a 08 lod a,pclath save pclath..
000b d7 00 lod $57,a
000c 8a 01 stz pclath ..and clear it
* save some system vars
000d 50 08 lod a,$50
000e dd 00 lod $5d,a
000f 51 08 lod a,$51
0010 dc 00 lod $5c,a
0011 58 08 lod a,$58 adr^ low?
0012 da 00 lod $5a,a
0013 59 08 lod a,$59 adr^ high?
0014 db 00 lod $5b,a
0015 03 08 lod a,status get status
0016 83 12 rmb status,bsela bank0
0017 cc 00 lod $4c,a save status again??
****** tmr0 irq, 281 counts at 500kHz about 500µs
*
0018 0b 19 sbr intcon,t0if timer0 irq..
0019 8b 1e sbs intcon,t0ie ..and enabled?
001a 21 28 jmp tryinp no, try nxt
001b 0b 11 rmb intcon,t0if is tmr0, clear irq
001c 19 30 lod a,#$19 re-init tmr0
001d 81 00 lod tmr0,a
001e 83 12 rmb status,bsela bank0
001f ad 22 jsr tmr0act do tmr0 action??
0020 21 15 smb bitflg.t0ocurd ??
****** input clock irq
*
0021 8b 18 tryinp sbr intcon,inpif input irq..
0022 0b 1e sbs intcon,inpie ..and enabled?
0023 42 28 jmp $0042 no,
0024 00 30 rxirq lod a,#$00 is input, assume zero
0025 85 19 sbr port,mclr inbit is zero, keep it
0026 01 30 lod a,#$01 was one
0027 a3 00 lod rx.bit,a save received bit
0028 8b 10 rmb intcon,inpif clr intflag
0029 21 10 rmb bitflg,0 signal receive in progress
002a a5 01 stz rx.timer clear block ready timer
002b a6 08 tfz rx.bitcnt first bit in data block?
002c 03 19 sbr status,z
002d a4 01 stz rx.bytcnt yes, clear byte counter
002e 22 08 lod a,rx.shreg left shift in received bit
002f 22 07 add a,rx.shreg
0030 23 07 add a,rx.bit
0031 a2 00 lod rx.shreg,a
0032 69 30 lod a,#$69 13 byte + 2 bits 106 bits received?
0033 26 02 sur a,rx.bitcnt
0034 03 18 sbr status,cy
0035 42 28 jmp intret yes, stop counting, rxirq done
0036 a6 0a inc rx.bitcnt count received bits
0037 26 08 lod a,rx.bitcnt get #bits
0038 07 39 and a,#$07 at even byte?
0039 03 1d sbs status,z
003a 42 28 jmp intret no, rxirq done
003b 24 08 lod a,rx.bytcnt get rx adr counter
003c 3a 3e add a,#rxbuf add in base adr
003d 84 00 lod iadres,a set address
003e 22 08 lod a,rx.shreg get received byte
003f 80 00 lod idata,a store it
0040 a4 0a inc rx.bytcnt nxt adr
0041 a2 01 stz rx.shreg clear rx shreg
* fall through to return
****** return from interrupt
*
0042 4c 08 intret lod a,$4c restore extra save, why??
0043 83 00 lod status,a
0044 83 12 rmb status,bsela bank0
0045 5d 08 lod a,$5d restore system vars
0046 d0 00 lod $50,a
0047 5c 08 lod a,$5c
0048 d1 00 lod $51,a
0049 5a 08 lod a,$5a
004a d8 00 lod $58,a
004b 5b 08 lod a,$5b
004c d9 00 lod $59,a
004d 56 08 lod a,$56 restore regs
004e 84 00 lod iadres,a
004f 57 08 lod a,$57
0050 8a 00 lod pclath,a
0051 55 08 lod a,$55
0052 83 00 lod status,a
0053 a0 0e swn $20
0054 20 0e swn a=$20
0055 09 00 rti irq done
****** first part of initialization
0056 22 30 init lod a,#$22 clear mem from here..
0057 84 00 lod iadres,a
0058 4f 30 lod a,#$4f ..to there
0059 6c 20 jsr clrmem do it
005a 21 30 lod a,#$21 clear mem from here..
005b 84 00 lod iadres,a
005c 22 30 lod a,#$22 ..to there
005d 6c 20 jsr clrmem do it
005e 83 01 stz status clear status
005f 03 30 lod a,#$03 high from adr of rom table
0060 d9 00 lod $59,a
0061 fe 30 lod a,#$fe low from adr
0062 d8 00 lod $58,a
0063 4f 30 lod a,#$4f to adr in ram
0064 84 00 lod iadres,a
0065 50 30 lod a,#$50 end adr in ram
0066 70 20 jsr romcpy do it
0067 83 01 stz status clr status
0068 f5 2a jmp init2 do more init, then enter main loop
****** clear memory
* iadres=start, a=stop, not included
*
0069 04 06 clrmem1 eor a,iadres get back stop adr
006a 80 01 stz idata do clear
006b 84 0a inc iadres nxt adr
006c 04 06 clrmem eor a,iadres at stop?
006d 03 1d sbs status,z
006e 69 28 jmp clrmem1 no, do nxt byte
006f 00 34 rtl a,#$00 yes, return zero
****** copy from rom table to ram
* $58/59=romadr low/high, iadres=to adr, a=end adr in ram
*
0070 d0 00 romcpy lod $50,a save end adr
0071 7b 20 .nxt jsr $007b read from rom table
0072 80 00 lod idata,a put read data
0073 84 0a inc iadres nxt adr
0074 04 08 lod a,iadres at end?
0075 50 06 eor a,$50
0076 03 19 sbr status,z
0077 00 34 rtl a,#$00 yes, return zero
0078 71 28 jmp .nxt no, do nxt bt
****** read from rom table, inc rom adr
* enter at tblread, $58/59=romadr low/high, inc's romadr
*
0079 83 12 rmb status,bsela
007a d8 00 lod $58,a
007b d9 1b tblread sbr $59,7 top bit set, why??
007c 84 28 jmp $0084 yes
007d 59 08 lod a,$59 set high bt
007e 8a 00 lod pclath,a
007f 58 08 lod a,$58 get low adr
0080 d8 0a inc $58 inc low adr
0081 03 19 sbr status,z fold over?
0082 d9 0a inc $59 yes, inc high adr
0083 82 00 lod pcl,a do a read and return
****** read from ram, inc ram adr
* $58/59=ramadr low/high, inc's ramadr
*
0084 83 13 ramread rmb status,irp set iadres bank 0
0085 59 18 sbr $59,0 adr in bank 1?
0086 83 17 smb status,irp set iadres bank 1
0087 58 08 lod a,$58 get low adr
0088 d8 0a inc $58 inc ramadr
0089 84 00 lod iadres,a set adr^
008a 00 08 lod a,idata get dat
008b 08 00 rts done
****** a large unused block
*
008c ff 3f add a,#$ff
008d ff 3f add a,#$ff
* a lot of blanks removed
021a ff 3f add a,#$ff
021b ff 3f add a,#$ff
****** init port
*
021c 07 30 iniport lod a,#$07 comparators off
021d 83 12 rmb status,bsela bank0
021e 99 00 lod cmcon,a set comparator mode
021f cc 30 lod a,#$cc pin 4/5, bit 3/4 as inputs
0220 83 16 smb status,bsela bank1
0221 85 00 lod tris,a set tris
0222 e0 30 lod a,#$e0 rise enable, lower data clk latch
0223 83 12 rmb status,bsela bank0
0224 85 00 lod port,a set port
0225 08 00 rts done
****** clear all of display and pattern memory
* does it for 13 bytes, 6 is needed
*
0226 83 12 clrall rmb status,bsela bank 0
0227 c7 01 stz $47 init byte counter
0228 47 08 .nxt lod a,$47 get counter
0229 2e 3e add a,#disptrn add in base adr
022a 84 00 lod iadres,a clear display memory
022b 80 01 stz idata
022c 00 30 lod a,#$00 get zero == all LED's off
022d 83 12 rmb status,bsela bank0
022e 72 22 jsr shftout do output
022f c7 0a inc $47 nxt display pos
0230 0c 30 lod a,#$0c end count, inclusive
0231 47 02 sur a,$47 at end?
0232 03 1c sbs status,cy
0233 28 2a jmp $0228 no, do nxt
0234 05 16 smb port,latch yes, shake latch
0235 05 12 rmb port,latch
0236 08 00 rts done
****** shift out one byte
* another one using another storage address $4e...
* a=byte to shift out, bit7 goes first
*
shftouti
0237 83 12 rmb status,bsela bank0
0238 ce 00 lod $4e,a keep byte
0239 ce 1f sbs $4e,7 bit7 set?
023a 3d 2a jmp $023d no
023b 85 14 smb port,shdata yes, 1 to data
023c 3e 2a jmp $023e go shake clk
023d 85 10 rmb port,shdata 0 to data
023e 05 14 smb port,shclk shake clk
023f 05 10 rmb port,shclk
0240 4e 1f sbs $4e,6 do rest of bits the same stupid way
0241 44 2a jmp $0244
0242 85 14 smb port,shdata
0243 45 2a jmp $0245
0244 85 10 rmb port,shdata
0245 05 14 smb port,shclk
0246 05 10 rmb port,shclk
0247 ce 1e sbs $4e,5
0248 4b 2a jmp $024b
0249 85 14 smb port,shdata
024a 4c 2a jmp $024c
024b 85 10 rmb port,shdata
024c 05 14 smb port,shclk
024d 05 10 rmb port,shclk
024e 4e 1e sbs $4e,4
024f 52 2a jmp $0252
0250 85 14 smb port,shdata
0251 53 2a jmp $0253
0252 85 10 rmb port,shdata
0253 05 14 smb port,shclk
0254 05 10 rmb port,shclk
0255 ce 1d sbs $4e,3
0256 59 2a jmp $0259
0257 85 14 smb port,shdata
0258 5a 2a jmp $025a
0259 85 10 rmb port,shdata
025a 05 14 smb port,shclk
025b 05 10 rmb port,shclk
025c 4e 1d sbs $4e,2
025d 60 2a jmp $0260
025e 85 14 smb port,shdata
025f 61 2a jmp $0261
0260 85 10 rmb port,shdata
0261 05 14 smb port,shclk
0262 05 10 rmb port,shclk
0263 ce 1c sbs $4e,1
0264 67 2a jmp $0267
0265 85 14 smb port,shdata
0266 68 2a jmp $0268
0267 85 10 rmb port,shdata
0268 05 14 smb port,shclk
0269 05 10 rmb port,shclk
026a 4e 1c sbs $4e,0
026b 6e 2a jmp $026e
026c 85 14 smb port,shdata
026d 6f 2a jmp $026f
026e 85 10 rmb port,shdata
026f 05 14 smb port,shclk
0270 05 10 rmb port,shclk
0271 08 00 rts done
****** shift out one byte
* this one uses adr $4b
* a=byte to shift out, bit7 goes first
*
0272 83 12 shftout rmb status,bsela bank0
0273 cb 00 lod $4b,a keep byte
0274 cb 1f sbs $4b,7 bit7 set?
0275 78 2a jmp $0278 no
0276 85 14 smb port,shdata yes, 1 to data
0277 79 2a jmp $0279 go shake clk
0278 85 10 rmb port,shdata 0 to data
0279 05 14 smb port,shclk shake clk
027a 05 10 rmb port,shclk
027b 4b 1f sbs $4b,6 do rest of bits the same stupid way
027c 7f 2a jmp $027f
027d 85 14 smb port,shdata
027e 80 2a jmp $0280
027f 85 10 rmb port,shdata
0280 05 14 smb port,shclk
0281 05 10 rmb port,shclk
0282 cb 1e sbs $4b,5
0283 86 2a jmp $0286
0284 85 14 smb port,shdata
0285 87 2a jmp $0287
0286 85 10 rmb port,shdata
0287 05 14 smb port,shclk
0288 05 10 rmb port,shclk
0289 4b 1e sbs $4b,4
028a 8d 2a jmp $028d
028b 85 14 smb port,shdata
028c 8e 2a jmp $028e
028d 85 10 rmb port,shdata
028e 05 14 smb port,shclk
028f 05 10 rmb port,shclk
0290 cb 1d sbs $4b,3
0291 94 2a jmp $0294
0292 85 14 smb port,shdata
0293 95 2a jmp $0295
0294 85 10 rmb port,shdata
0295 05 14 smb port,shclk
0296 05 10 rmb port,shclk
0297 4b 1d sbs $4b,2
0298 9b 2a jmp $029b
0299 85 14 smb port,shdata
029a 9c 2a jmp $029c
029b 85 10 rmb port,shdata
029c 05 14 smb port,shclk
029d 05 10 rmb port,shclk
029e cb 1c sbs $4b,1
029f a2 2a jmp $02a2
02a0 85 14 smb port,shdata
02a1 a3 2a jmp $02a3
02a2 85 10 rmb port,shdata
02a3 05 14 smb port,shclk
02a4 05 10 rmb port,shclk
02a5 4b 1c sbs $4b,0
02a6 a9 2a jmp $02a9
02a7 85 14 smb port,shdata
02a8 aa 2a jmp $02aa
02a9 85 10 rmb port,shdata
02aa 05 14 smb port,shclk
02ab 05 10 rmb port,shclk
02ac 08 00 rts done
****** tmr0 interrupt activity
*
02ad 14 30 tmr0act lod a,#$14 intensity counter foldover limit
02ae 83 12 rmb status,bsela bank0
02af a9 0a inc pwmcnt count tmr0 ticks
02b0 29 02 sur a,pwmcnt count past limit?
02b1 03 18 sbr status,cy
02b2 a9 01 stz pwmcnt yes, reset it
02b3 2a 08 lod a,intens get intensity value
02b4 29 02 sur a,pwmcnt counter past intensity?
02b5 03 18 sbr status,cy
02b6 b9 2a jmp $02b9 yes
02b7 85 12 rmb port,enable no, turn on led's
02b8 e8 2a jmp tester pwm done
02b9 85 16 smb port,enable turn off led's
02ba e8 2a jmp tester pwm done
****** shift out display ram to led's
* 6 bytes start at $2e are shifted out
* latching done before shifts
* done in every first pwm period
*
02bb a9 08 t0 tfz pwmcnt first in pwm period?
02bc 03 1d sbs status,z
02bd 08 00 rts no-hold test
02be 05 16 smb port,latch shake latch turning off tested led
02bf 05 12 rmb port,latch
02c0 cd 01 stz $4d init byte counter
02c1 4d 08 .nxt lod a,$4d get byte counter
02c2 2e 3e add a,#disptrn add in base adr
02c3 84 00 lod iadres,a
02c4 00 08 lod a,idata get data
02c5 83 12 rmb status,bsela bank0
02c6 37 22 jsr shftouti shift out to display
02c7 cd 0a inc $4d nxt byte
02c8 06 30 lod a,#$06 first 6 byytes to do
02c9 4d 02 sur a,$4d done?
02ca 03 1c sbs status,cy
02cb c1 2a jmp .nxt no, do nxt
02cc cf 01 stz tststat nxt test state is #1
02cd cf 0a inc tststat
02ce 08 00 rts done
02cf 06 30 t1 lod a,#$06 start cnt at last 6 bytes
02d0 cd 00 lod $4d,a init byte counter
02d1 2c 08 .nxt lod a,maxptrn done or no 2:nd digit present?
02d2 4d 02 sur a,$4d
02d3 03 18 sbr status,cy
02d4 dd 2a jmp .done yes, exit
02d5 4d 08 lod a,$4d get byte counter
02d6 2e 3e add a,#disptrn add in base adr
02d7 84 00 lod iadres,a
02d8 00 08 lod a,idata get data
02d9 83 12 rmb status,bsela bank0
02da 37 22 jsr shftouti shift out to display
02db cd 0a inc $4d nxt byte
02dc d1 2a jmp .nxt do nxt
02dd 02 30 .done lod a,#$02 nxt test state is #2
02de cf 00 lod tststat,a
02df 08 00 rts done
02e0 05 16 t2 smb port,latch shake latch
02e1 05 12 rmb port,latch
02e2 03 30 lod a,#$03 nxt test state is #3 == idle
02e3 cf 00 lod tststat,a
02e4 08 00 rts done
02e5 03 30 test00 lod a,#$03 re-init
02e6 cf 00 lod tststat,a
02e7 08 00 rts done
02e8 4f 08 tester lod a,tststat get test state
02e9 03 19 sbr status,z state 0?
02ea bb 2a jmp dis0out yes, display output #0
02eb 01 3a eor a,#$01 routine #1?
02ec 03 19 sbr status,z
02ed cf 2a jmp dis1out routine #1, only shift output #1
02ee 03 3a eor a,#$03 routine #2?
02ef 03 19 sbr status,z
02f0 e0 2a jmp latchit routine #2, shake strobe
02f1 01 3a eor a,#$01 garbage?
02f2 03 19 sbr status,z
02f3 08 00 rts no, done
02f4 e5 2a jmp test00 garbage, re-init
02f5 83 12 init2 rmb status,bsela bank 0
02f6 ff 23 jsr $03ff get value for osccal
02f7 83 16 smb status,bsela bank1
02f8 90 00 lod osccal,a set osccal
02f9 40 30 lod a,#$40 wpu on, rising edge int, ..
* ..int clk for tmr0, rising edge ..
* ..presc on tmr0, divide by 2
02fa 81 00 lod option,a set option
02fb 37 30 lod a,#$37 wpu on all, but not pin4/bit3
02fc 95 00 lod wpu,a set wpu
02fd 30 30 lod a,#$30 gie off, peie off, t0nt on, extint on
* ioc off, tmr0 extint ioc flags clear
02fe 8b 00 lod intcon,a set intcon
02ff 64 00 cwt reset watchdog
0300 83 12 rmb status,bsela bank0
0301 1c 22 jsr iniport prepare port for use
0302 21 11 rmb bitflg.t0ocurd init ram ??
0303 21 14 smb bitflg,0
0304 a9 01 stz pwmcnt
0305 aa 01 stz intens display intensity
0306 a7 01 stz $27
0307 ad 01 stz exttmr0
0308 a6 01 stz rx.bitcnt
0309 a5 01 stz rx.timer rx block ready timer
030a 0c 30 lod a,#$0c
030b ac 00 lod maxptrn,a
030c 19 30 lod a,#$19 set tmr0 timeout
030d 81 00 lod tmr0,a
030e 64 00 cwt reset watchdog
030f 26 22 jsr clrall blank display and display ram
0310 a1 10 rmb bitflg.wdtout ext. watchdog not pending to expire
0311 8b 17 smb intcon,gie turn on irq
* init done fall through to main loop
receive timeout 3ms
clear timeout 1s
wdt timeout 30s
set pattern 0x53
set intensity 0x56
clear a segment 0x5c
****** main loop
*
0312 a1 1c main sbs bitflg.wdtout ??
0313 64 00 cwt reset watchdog
0314 21 1d sbs bitflg.t0ocurd has tmr0 interrupt occured?
0315 37 2b jmp .idle no
0316 21 11 rmb bitflg.t0ocurd yes, clr flag
0317 ad 0a inc exttmr0 count timer interrupts
0318 fa 30 lod a,#$fa get limit, 125ms
0319 2d 02 sur a,exttmr0 limit reached?
031a 03 1c sbs status,cy
031b 24 2b jmp $0324 no, not timed out
031c ad 01 stz exttmr0 reset timeout counter
031d a8 08 tfz clrtmr clear timer expired?
031e 03 19 sbr status,z
031f 21 2b jmp @+2 compilers...
0320 a8 03 dec clrtmr no, count it down
0321 ab 08 tfz extwdt extended watchdog timeout?
0322 03 1d sbs status,z
0323 ab 03 dec extwdt no, count it down
0324 21 18 .noto sbr bitflg,0 receiving?
0325 37 2b jmp .idle no
0326 a5 0a inc rx.timer count up rx block ready timer
0327 05 30 lod a,#$05 time to execute received command?
0328 25 02 sur a,rx.timer
0329 03 1c sbs status,cy
032a 37 2b jmp .idle no
032b 26 08 lod a,rx.bitcnt yes, get #bits received
032c 07 39 and a,#$07 even bytes?
032d 03 1d sbs status,z
032e 34 2b jmp .rxclr no, discard and reset rx
032f 10 30 lod a,#$10 at least 16 bits received?
0330 26 02 sur a,rx.bitcnt
0331 83 12 rmb status,bsela bank0
0332 03 18 sbr status,cy less than 16 bits, discard and reset
0333 3f 23 jsr trycmd got a command, try to do it
0334 ba 01 .rxclr stz $3a clear command byte
0335 21 14 smb bitflg,0 signal no rxclocks received
0336 a6 01 stz rx.bitcnt reset receive bit counter
0337 28 0b .idle dsz a=clrtmr clear timer expired?
0338 3b 2b jmp .noclr
0339 83 12 rmb status,bsela bank0
033a 26 22 jsr clrall clear display
033b 2b 0b .noclr dsz a=extwdt extended wdt expired?
033c 12 2b jmp main no, repeat main loop
033d a1 14 smb bitflg.wdtout yes, let watchdog time out
033e 12 2b jmp main repeat main loop
033f 83 12 trycmd rmb status,bsela
0340 ca 01 stz $4a
0341 c9 01 stz $49
0342 c8 01 stz $48
0343 bb 2b jmp disptch
****** command 0x53
* set display pattern and display it
* first byte sent is command,
* other 12 or 8 is display pattern
* last 6 are shown on the led's
*
0344 26 08 setptrn lod a,rx.bitcnt get #bits received
0345 68 3a eor a,#$68 104 bits = 13 bytes?
0346 03 19 sbr status,z
0347 4c 2b jmp $034c yes, set display pattern
0348 26 08 lod a,rx.bitcnt get #bits received
0349 48 3a eor a,#$48 72 bits = 9 bytes?
034a 03 1d sbs status,z
034b 08 00 rts no, just return
034c 26 08 lod a,rx.bitcnt get #bits received
034d d0 00 lod $50,a init counter
034e 03 10 rmb status,cy /8 for #bits to #bytes
034f d0 0c ror $50
0350 03 10 rmb status,cy
0351 d0 0c ror $50
0352 03 10 rmb status,cy
0353 50 0c ror a=$50 compiler crazyness...
0354 d0 00 lod $50,a
0355 50 03 dec a=$50 -1 for command byte
0356 ac 00 lod maxptrn,a set #used pattern bytes
0357 ca 01 stz $4a init counter
0358 2c 08 .nxt lod a,maxptrn get limit
0359 4a 02 sur a,$4a done?
035a 03 18 sbr status,cy
035b 6e 2b jmp .finish yes
035c 4a 0a inc a=$4a get offset +1 = skip command byte
035d 3a 3e add a,#rxbuf add in base adr to received bytes
035e 84 00 lod iadres,a set adr
035f 00 08 lod a,idata get data
0360 d0 00 lod $50,a keep it
0361 4a 08 lod a,$4a get offset
0362 2e 3e add a,#disptrn add in base adr to display pattern
0363 84 00 lod iadres,a set adr
0364 50 08 lod a,$50 get data and..
0365 80 00 lod idata,a ..set display pattern
0366 4a 08 lod a,$4a compiler crazy, get offset
0367 2e 3e add a,#disptrn add inbase adr to display pattern
0368 84 00 lod iadres,a set adr
0369 00 08 lod a,idata get just stored data
036a 83 12 rmb status,bsela bank0
036b 72 22 jsr shftout shift it out to display
036c ca 0a inc $4a nxt byte
036d 58 2b jmp .nxt do nxt
036e 05 16 .finish smb port,latch shake strobe
036f 05 12 rmb port,latch
0370 08 30 lod a,#$08 reset display clear timer
0371 a8 00 lod clrtmr,a
0372 f0 30 lod a,#$f0 reset extended watchdog
0373 ab 00 lod extwdt,a
0374 08 00 rts done
****** command 0x56, set intensity
* set intensity
*
0375 26 08 setint lod a,rx.bitcnt get #bits received
0376 10 3a eor a,#$10 16 bits?
0377 03 1d sbs status,z
0378 08 00 rts no, just return
0379 05 30 lod a,#$05 mangling constant
037a d1 00 lod $51,a
037b 3b 08 lod a,$3b get value
037c c8 23 jsr magic mangle it
037d aa 00 lod intens,a set intensity
037e 08 00 rts
****** command 0x5c
* test a led output
* turn off a led in display pattern,
* 2:nd received byte, 2:0 = bit, 6:3 = byte in disptrn
* shifts out new attern, then restores it at disptrn
*
037f 26 08 ledtest lod a,rx.bitcnt get #bits received
0380 10 3a eor a,#$10 16 bits?
0381 03 1d sbs status,z
0382 08 00 rts no, just return
0383 3b 08 lod a,$3b get #1 received byte
0384 d0 00 lod $50,a right shift 3 bits
0385 03 10 rmb status,cy
0386 d0 0c ror $50
0387 03 10 rmb status,cy
0388 d0 0c ror $50
0389 03 10 rmb status,cy
038a 50 0c ror a=$50
038b c9 00 lod $49,a save right shifted value = offset
038c 3b 08 lod a,$3b get #1 received byte again
038d 07 39 and a,#$07 mask out 3 lowest bits
038e c8 00 lod $48,a save them = bitmask
038f 0c 30 lod a,#$0c offset in range ?
0390 49 02 sur a,$49
0391 03 18 sbr status,cy
0392 08 00 rts no, return
0393 49 08 lod a,$49 get offset
0394 2e 3e add a,#disptrn add in base adr
0395 84 00 lod iadres,a set adr
0396 00 08 lod a,idata get and..
0397 c7 00 lod $47,a ..keep byte
0398 49 08 lod a,$49 get offset
0399 2e 3e add a,#disptrn add in base adr
039a 84 00 lod iadres,a set adr
039b 80 30 lod a,#$80 init bit to shift
039c d0 00 lod $50,a
039d 48 08 lod a,$48 get lower 3 bits..
039e d1 00 lod $51,a ..save them..
039f d1 0a inc $51 ..as 1-relative number
03a0 a3 2b jmp .shift go shifting down $50
03a1 03 10 .nxtsh rmb status,cy do shift
03a2 d0 0c ror $50
03a3 d1 0b .shift dsz $51 shifts done?
03a4 a1 2b jmp .nxtsh
03a5 50 09 not a=$50 get inverted bit pattern
03a6 80 05 and idata,a turn off selected bit
03a7 ca 01 stz $4a init byte counter
03a8 2c 08 .nxtout lod a,maxptrn get limit
03a9 4a 02 sur a,$4a at end?
03aa 03 18 sbr status,cy
03ab b4 2b jmp .finish yes
03ac 4a 08 lod a,$4a get counter
03ad 2e 3e add a,#disptrn add in base adr
03ae 84 00 lod iadres,a set adr
03af 00 08 lod a,idata get data
03b0 83 12 rmb status,bsela bank0
03b1 72 22 jsr shftout shift out data
03b2 ca 0a inc $4a nxt byte
03b3 a8 2b jmp .nxtout do nxt
03b4 49 08 .finish lod a,$49 get offset
03b5 2e 3e add a,#disptrn add in base adr
03b6 84 00 lod iadres,a set adr
03b7 47 08 lod a,$47 get saved byte..
03b8 80 00 lod idata,a ..and restore it
03b9 cf 01 stz tststat start test sequence
03ba 08 00 rts done
****** command dispatcher
*
03bb 3a 08 disptch lod a,$3a get received byte #0 = command
03bc 03 19 sbr status,z is it blank?
03bd 08 00 rts yes, just return
03be 53 3a eor a,#$53 code 0x53?
03bf 03 19 sbr status,z
03c0 44 2b jmp setptrn yes
03c1 05 3a eor a,#$05 code 0x56?
03c2 03 19 sbr status,z
03c3 75 2b jmp setint
03c4 0a 3a eor a,#$0a code 0x5c?
03c5 03 1d sbs status,z
03c6 08 00 rts was garbage, just return
03c7 7f 2b jmp ledtest yes
****** some math magic just for intensity value
*
*
*
03c8 d0 00 magic lod $50,a
03c9 d4 01 stz $54
03ca 03 10 rmb status,cy
03cb fd 30 lod a,#$fd
03cc 51 07 add a,$51
03cd 03 1c sbs status,cy
03ce ef 2b jmp $03ef
03cf d3 01 stz $53
03d0 f0 30 lod a,#$f0
03d1 51 05 and a,$51
03d2 03 1d sbs status,z
03d3 d7 2b jmp $03d7
03d4 04 30 lod a,#$04
03d5 d3 00 lod $53,a
03d6 d1 0e swn $51
03d7 d2 01 stz $52
03d8 03 10 rmb status,cy
03d9 d3 0a inc $53
03da d1 0d rol $51
03db 03 1c sbs status,cy
03dc d9 2b jmp $03d9
03dd d1 0c ror $51
03de 51 08 lod a,$51
03df 50 02 sur a,$50
03e0 03 18 sbr status,cy
03e1 d0 00 lod $50,a
03e2 d2 0d rol $52
03e3 d3 0b dsz $53
03e4 dd 2b jmp $03dd
03e5 d4 1f sbs $54,7
03e6 e9 2b jmp $03e9
03e7 d2 09 not $52
03e8 d2 0a inc $52
03e9 52 08 lod a,$52
03ea d4 1f sbs $54,7
03eb 08 00 rts
03ec d0 09 not $50
03ed d0 0a inc $50
03ee 08 00 rts
03ef d1 0c ror $51
03f0 03 18 sbr status,cy
03f1 f8 2b jmp $03f8
03f2 d1 0c ror $51
03f3 03 1c sbs status,cy
03f4 d0 01 stz $50
03f5 03 10 rmb status,cy
03f6 d0 0c ror $50
03f7 03 1c sbs status,cy
03f8 03 10 rmb status,cy
03f9 50 08 lod a,$50
03fa d2 00 lod $52,a
03fb d0 01 stz $50
03fc d0 0d rol $50
03fd e5 2b jmp $03e5
03fe 03 34 rtl a,#$03
03ff 80 34 rtl a,#$80 osccal factory preset value
- FormerMazda
- Inlägg: 6230
- Blev medlem: 27 februari 2006, 14:59:36
- Ort: Asby (Östergötland)
Re: Programmera om prisskylt till något annat...
Jo jag mätte lite, men kom inte fram till mycket alls tyvärr, annat än att efter uppstart så hade jag nån ständig dataström.Tror det var former mazda som testade lite att mäta på de aktuella signalerna. Kan Du bekräfta eller avfärda att ovanstående är rimligt? Jag är som Ni vet invalid och har stökigt att mäta på dessa klumpiga saker.
Men med begränsade kunskaper och utan att veta hastigheter, data och stopbitar så gick jag inte vidare, blir för mycket att vrida och vända på innan jag ens vet vad jag ska försöka koda av liksom.
Visste jag exakt baudrate, data och stop och allt (9600,8,1,NONE ?) så kunde man väl testa att skicka enligt din assemblering. Men det blir fortfarande ett svårt test för mig om data krävs oftare än varje sekund exempelvis.
Re: Programmera om prisskylt till något annat...
Det finns ingen baudrate eller start/stoppbitar. Möjligtvis att SPI skulle kunna användas för att skicka data, men halva klockperioden blir bortkastad.
Data skall sättas tillsammans med klockans negativa flank och vara kvar till nästa negativa flank, eller minst motsvarande tid för sista bit. Klockperioden skall vara klart längre än 500µs. När kommando/data sänts skall klockan hållas stilla mer än 3ms.
En Arduino som skickar SPI 300bps och håller data stabil efter negativ flank på klockan bör funka för att testa om signalen skall skapas av något befintligt. Annars är det lätt och bäst att generera den i programvara. Originalkortet gör det så.
Allt trassel beror på vad de har använts till. Alternativet att visa blaj vid fel finns inte.
Data skall sättas tillsammans med klockans negativa flank och vara kvar till nästa negativa flank, eller minst motsvarande tid för sista bit. Klockperioden skall vara klart längre än 500µs. När kommando/data sänts skall klockan hållas stilla mer än 3ms.
En Arduino som skickar SPI 300bps och håller data stabil efter negativ flank på klockan bör funka för att testa om signalen skall skapas av något befintligt. Annars är det lätt och bäst att generera den i programvara. Originalkortet gör det så.
Allt trassel beror på vad de har använts till. Alternativet att visa blaj vid fel finns inte.