OldComp.cz http://oldcomp.cz/ |
|
C64 a timre v CIA http://oldcomp.cz/viewtopic.php?f=32&t=1074 |
Stránka 1 z 2 |
Autor: | zz_indigo [ 11.02.2014, 13:41 ] |
Předmět příspěvku: | C64 a timre v CIA |
Neviete pouziva nejaka rutina interne timre v CIA? Rad by som ich pouzil v jednom projekte ale nemozem najst ci ich nieco nahodou nepouziva (RS232/serial/.....) |
Autor: | LHS [ 11.02.2014, 14:07 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Časovače CIA se nejčastěji používaj pro přehrávání samplů: http://codebase64.org/doku.php?id=base:nmi_sample_player a nějaký další příklady (např. pro stabilizaci rasteru) jsou na Codebase: http://codebase64.org/doku.php?id=base:cia Ale neni to zrovna procházka růžovou zahradou: http://ordinace.nova.cz |
Autor: | zz_indigo [ 11.02.2014, 22:06 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
LHS píše: Časovače CIA se nejčastěji používaj pro přehrávání samplů: http://codebase64.org/doku.php?id=base:nmi_sample_player a nějaký další příklady (např. pro stabilizaci rasteru) jsou na Codebase: http://codebase64.org/doku.php?id=base:cia Ale neni to zrovna procházka růžovou zahradou: http://ordinace.nova.cz To co potrtebujem ja je vcelku jednoduche. mne len ide oto aby som nerozosral basic. Potrebujem totiz spravit rutinu ktora na zaklade casovacou vude riadit serva na gameporte. Jeden casovac bude robit prerusenie kazdych 20mS druhy variabilne od 1 az 2 ms. ide mi len oto neodrezat si klavesnicu. |
Autor: | LHS [ 11.02.2014, 23:11 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
No právě tato na pohled jednoduchá aplikace může být problematická. Já dva časovače na C64 nezkoušel. Jde nějak udělat, že běží dva (a generují signály pro přerušení), ale mohou používat jen jeden pointer pro přerušení (= oba časovače vyvolají stejnou rutinu). Co se děje v případě kolize nevim. Ale když budeš mít jeden časovač a přepínat mu dva různý časy, vyjde to minimálně nastejno. Právě proto neni velká čás problematiky CIA na C64 moc zdokumentovaná, protože je to dost nepoužitelný (kdysi jsem se ptal Sociho, jestli ví něco o těch seriových linkách CIA vyvedených na user port a nevěděl, protože je to něco, co nemá sebemenší využití). Tohle je nejjednodušší kód, který pustí časovač, který vyvolává NMI. Snad jde nějak zapnout i druhý, ale ten by taky vyvolával NMI. Akorát jde společně s NMI provozovat IRQ sei lda #<nmi01 ldx #>nmi01 sta $318 stx $319 lda #$4c ldx #$0 sta $dd05 stx $dd04 lda #%10000001 sta $dd0d lda #%00000001 sta $dd0e cli - jmp - nmi01 lda $dd0d inc $d020 rti |
Autor: | LHS [ 11.02.2014, 23:17 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Ještě koukam, že jde snad nějak na adrese $DD0D na bitech 0 a 1 číst, jestli časovač doběhl. Když by byla rutina (bez NMI přerušení), co by dokola četla tyto bity, asi by se tim nějaký řízení časem dalo udělat. Ale bohužel více nemohu sloužit. |
Autor: | zz_indigo [ 12.02.2014, 13:46 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
LHS píše: No právě tato na pohled jednoduchá aplikace může být problematická. Já dva časovače na C64 nezkoušel. Jde nějak udělat, že běží dva (a generují signály pro přerušení), ale mohou používat jen jeden pointer pro přerušení (= oba časovače vyvolají stejnou rutinu). Co se děje v případě kolize nevim. To problem nieje Nesmies byt rozmaznany To ze viacere zdroje vygeneruju prerusenie je v pohode. V takych pripadoch kontrolujes status register. pomocou ICR nastavys co vsetko ma generovat prerusenia. - pretecenie Timeru A - Pretecenie Timeru B - Serial port full/empty - Flag pin A ked ho precitas tak zistis ci dane CIA vygenerovalo IRQ alebo niekto iny. Nie je to tak pekne ako prerusenia 8080/z80/AVR ale nie je to ziadna hroza Jak som vravel problem mam len v tom ze som nenasiel ci ich basic/kernal na nieco pouziva a ak ano ktore. naprogramovat prerusovaciu rutinu nie je problem. (Ci pojde na prvy krat netusim ale inak to problem nie je) |
Autor: | LHS [ 12.02.2014, 16:56 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Tak si nakóduj i rutinu pro obsluhu klávesnice a budeš za vodou. |
Autor: | zz_indigo [ 12.02.2014, 20:41 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
LHS píše: Tak si nakóduj i rutinu pro obsluhu klávesnice a budeš za vodou. hahaha. To nepotrebujem ak budem vediet ktore casovace su volne tak tam to dam a spravim si rutinu ktora vybavy moej veci a ak to nebude pre mna poslem to povodnej rutine (rtobil som to uz za cias MSDOSu. |
Autor: | zz_indigo [ 12.02.2014, 21:36 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Tak nakoniec som upratal na stole a nastartoval C64 a uz viem. TimerA v prvej cia je pouivay rutinou na obsluhu klavesnice. (a blikania kurzoru) Timer je nastaveny vo Freerun mode a vola presusenie. TimerA zastavym tak koniec. pomoze len reset. Timer sa po kazdom preteceny znova loaduje takze zmenou hodnoty na Hi byte casovaca sa zmeni reakcia klavesnice. Poke 56325,16 zvysi freq blikania a reakcie klavesnice na nepouzitelnu uroven. Poke 56325,255 zas znizi na skoro nepouzitelnu. Takze vyzera to ze TimerB v prvej CIA a oba timre v druhej CIA sa nepouzivaju. Dakujem vsetkym za "pomoc". |
Autor: | LHS [ 13.02.2014, 10:15 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Když bys do mého příkladu místo JMP - napsal RTS, vrátíš se do Basicu. Ale klávesnice stejně blbne (EDIT: fakticky možná blbne jen vypisování na obrazovku, ne čtení klávesnice). A když pustím oba časovače, C64 se zasekne. Problém způsobuje JMP $EA31, na který skáče IRQ, který používá Basic. Pokud IRQ nekončí JMP $EA31, nemůžeš do Basicu (neuvažuju variantu, že by sis napsal svojí rutinu, která Basic obsouloží). Tato rutina používá časovače CIA. Jak? Nevim. Jen vim, že dochází ke konfliktu. Problém je, že v této rutině je i obsluha klávesnice. Když budeš psát svůj program, který se nevrací do Basicu, ale na konci IRQ voláš $EA31, časovače stejně blbnou. Možná by mohlo fungovat, že bys zapnul jen časovač A na CIA2 (ten co se startuje adresou $DD0E), v IRQ končil $EA31 a klávesnici četl na adrese $CB. Ale úspěch nezaručuju. Když nebudeš volat $EA31, adresa $CB není naplňována. Přikládám příklad, kdy oba časovače CIA 2 vyvolávají NMI, každý v jiném času, běží IRQ a i hlavní program. Kód: jsr $e5a0
jsr $e544 sei lda #$1 sta $d01a sta $dc0d lda #<irq01 ldx #>irq01 sta $314 stx $315 lda #$1b sta $d011 lda #$98 sta $d012 lda #<nmi01 ldx #>nmi01 sta $318 stx $319 lda #$ff ldx #$ff sta $dd05 stx $dd04 lda #$00 ldx #$ff sta $dd07 stx $dd06 lda #%10000011 sta $dd0d lda #%00000001 sta $dd0e sta $dd0f cli - inc $0500 jmp - nmi01 lda $dd0d pha and #%00000001 beq + inc $0402 + pla and #%00000010 beq + inc $0404 + rti irq01 inc $d021 ldx #$10 - dex bne - dec $d021 inc $d019 ; jmp $ea31 pla tay pla tax pla rti |
Autor: | zz_indigo [ 13.02.2014, 12:41 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Pozrel som to zbezne a myslim ze tam mas dva problemy. Na prvy si prisiel sam. Nemozes pouzit RTI ale mas skakat. A ten druhy: Pred JMP as obnovyt registre. Kedze kernal rutina ich zas uklada a obnovuje. Podla toho co som nakoniec dohladal to funguje takto. IRQ -> Spravy sa nejaka predpriprava -> Skoci sa na IRQ vektor definovany v RAM. Takze rutina ma byt spravena takto: Zazalohujem registre -> spravim co chcem -> obnovym registre -> Skocim na povodny vektor. -------------------- Celkovo som nad tym rozmyslal a prisiel som k zaveru ze bude lepsie to robit na CIA-2 1.) neobmedzim tym tolko basic. NMI pouziva basic len pre RS232 a restore tlacitko. 2.) oba citace budu na tom istom CIA (kedze Citac A na CIA 1 je pouzivany Basicom) ------------------- p.s. NMI je osetrene v Kernaly takto: (IRQ ani nechci vydiet tam vysi klavesnica, blikanie kurzoru, serial a aj casete) Kód: ; NMI entry
FE43 78 SEI FE44 6C 18 03 JMP ($0V nich budu informacie pre basic/kernal funkciu prerusenia.318) ; normally FE47 ; standard NMI routine FE47 48 PHA FE48 8A TXA FE49 48 PHA FE4A 98 TYA FE4B 48 PHA FE4C A9 7F LDA #$7F FE4E 8D 0D DD STA $DD0D FE51 AC 0D DD LDY $DD0D FE54 30 1C BMI $FE72 FE56 20 02 FD JSR $FD02 FE59 D0 03 BNE $FE5E FE5B 6C 02 80 JMP ($8002) ; cartridge warm start FE5E 20 BC F6 JSR $F6BC FE61 20 E1 FF JSR $FFE1 FE64 D0 0C BNE $FE72 ; BRK routine FE66 20 15 FD JSR $FD15 FE69 20 A3 FD JSR $FDA3 FE6C 20 18 E5 JSR $E518 FE6F 6C 02 A0 JMP ($A002) ; internal NMI FE72 98 TYA FE73 2D A1 02 AND $02A1 FE76 AA TAX FE77 29 01 AND #$01 FE79 F0 28 BEQ $FEA3 FE7B AD 00 DD LDA $DD00 FE7E 29 FB AND #$FB FE80 05 B5 ORA $B5 FE82 8D 00 DD STA $DD00 FE85 AD A1 02 LDA $02A1 FE88 8D 0D DD STA $DD0D FE8B 8A TXA FE8C 29 12 AND #$12 FE8E F0 0D BEQ $FE9D FE90 29 02 AND #$02 FE92 F0 06 BEQ $FE9A FE94 20 D6 FE JSR $FED6 FE97 4C 9D FE JMP $FE9D FE9A 20 07 FF JSR $FF07 FE9D 20 BB EE JSR $EEBB FEA0 4C B6 FE JMP $FEB6 FEA3 8A TXA FEA4 29 02 AND #$02 FEA6 F0 06 BEQ $FEAE FEA8 20 D6 FE JSR $FED6 FEAB 4C B6 FE JMP $FEB6 FEAE 8A TXA FEAF 29 10 AND #$10 FEB1 F0 03 BEQ $FEB6 FEB3 20 07 FF JSR $FF07 FEB6 AD A1 02 LDA $02A1 FEB9 8D 0D DD STA $DD0D FEBC 68 PLA; standard NMI routine FE47 48 PHA FE48 8A TXA FE49 48 PHA FE4A 98 TYA FE4B 48 PHA FE4C A9 7F LDA #$7F FE4E 8D 0D DD STA $DD0D FE51 AC 0D DD LDY $DD0D FE54 30 1C BMI $FE72 FE56 20 02 FD JSR $FD02 FE59 D0 03 BNE $FE5E FE5B 6C 02 80 JMP ($8002) ; cartridge warm start FE5E 20 BC F6 JSR $F6BC FE61 20 E1 FF JSR $FFE1 FE64 D0 0C BNE $FE72 ; BRK routine FE66 20 15 FD JSR $FD15 FE69 20 A3 FD JSR $FDA3 FE6C 20 18 E5 JSR $E518 FE6F 6C 02 A0 JMP ($A002) ; internal NMI FE72 98 TYA FE73 2D A1 02 AND $02A1 FE76 AA TAX FE77 29 01 AND #$01 FE79 F0 28 BEQ $FEA3 FE7B AD 00 DD LDA $DD00 FE7E 29 FB AND #$FB FE80 05 B5 ORA $B5 FE82 8D 00 DD STA $DD00 FE85 AD A1 02 LDA $02A1 FE88 8D 0D DD STA $DD0D FE8B 8A TXA FE8C 29 12 AND #$12 FE8E F0 0D BEQ $FE9D FE90 29 02 AND #$02 FE92 F0 06 BEQ $FE9A FE94 20 D6 FE JSR $FED6 FE97 4C 9D FE JMP $FE9D FE9A 20 07 FF JSR $FF07 FE9D 20 BB EE JSR $EEBB FEA0 4C B6 FE JMP $FEB6 FEA3 8A TXA FEA4 29 02 AND #$02 FEA6 F0 06 BEQ $FEAE FEA8 20 D6 FE JSR $FED6 FEAB 4C B6 FE JMP $FEB6 FEAE 8A TXA FEAF 29 10 AND #$10 FEB1 F0 03 BEQ $FEB6 FEB3 20 07 FF JSR $FF07 FEB6 AD A1 02 LDA $02A1 FEB9 8D 0D DD STA $DD0D FEBC 68 PLA FEBD A8 TAY FEBE 68 PLA FEBF AA TAX FEC0 68 PLA FEC1 40 RTI FEBD A8 TAY FEBE 68 PLA FEBF AA TAX FEC0 68 PLA FEC1 40 RTI |
Autor: | LHS [ 13.02.2014, 13:08 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Když jsem to zkoušel, tak oba rozběhnuté časovače CIA2 v kombinaci s IRQ zakončeným jmp $ea31 padaj. Ale může to být závislé na typu cartridge zastrčeném v expansion portu (možná - registry po resetu AR vypadaj jinak než bez něj). RTI je jediný způsob ukončení přerušení. Někdy se IRQ ukončuje jmp $ea81 a když se podiváš do ROMky, je tam Kód: pla tay pla tax pla rti Pokud není vypnutý kernal, pointer na IRQ není na FFFE, ale na 0314. A pokud je IRQ voláno přes 0314, registry se uloží "samy" na stack. A vyzvednout se musí výše uvedeným způsobem. Já si je radši vyzvednu sám, pokud z nějakého důvodu potřebuju vypnout kernal, nemusim měnit ukončení IRQ (a taky je to rychlejší např. při časování VICu). EDIT: sorry, jsem se překouk. V tom NMI se registry obnovovat musí, pokud je ve svých rutinách měníš. |
Autor: | LHS [ 13.02.2014, 13:44 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
Když nerozhodim regA v NMI, což moje rutina dělala, tak lze psát v Basicu a přitom běží oba CIA 2 timery i vlastní IRQ Problém bych viděl akorát v tom, že ta kernal rutina NMI přepisuje adresu $DD0D a tím moje časovače stopne. Kód: jsr $e5a0
jsr $e544 sei lda #$1 sta $d01a sta $dc0d lda #<irq01 ldx #>irq01 sta $314 stx $315 lda #$1b sta $d011 lda #$98 sta $d012 lda #<nmi01 ldx #>nmi01 sta $318 stx $319 lda #$ff ldx #$ff sta $dd05 stx $dd04 lda #$00 ldx #$ff sta $dd07 stx $dd06 lda #%10000011 sta $dd0d lda #%00000001 sta $dd0e sta $dd0f cli rts nmi01 sta regA+1 lda $dd0d pha and #%00000001 beq + inc $0402 + pla and #%00000010 beq + inc $0404 + regA lda #$0 rti irq01 inc $d021 ldx #$10 - dex bne - dec $d021 inc $d019 jmp $ea31 |
Autor: | LHS [ 13.02.2014, 14:25 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
A další věc, co z toho vyplývá. Když to, co dělam s adresama $DDxx udělam s adresame $DCxx (za předpokladu, že prdim na Basic), tak se IRQ volá stejně jako NMI. Takže běží 4 časovače, CIA1 vyvolává IRQ a CIA2 NMI. Akorát už IRQ nemůže být závislé na raster paprsku. Aby fungovala adresa D01A, musí se časovač CIA1-A vypnout. Ale i pak běží IRQ závislé na rasteru a i na časovači CIA1-B |
Autor: | zz_indigo [ 13.02.2014, 14:52 ] |
Předmět příspěvku: | Re: C64 a timre v CIA |
LHS píše: Když nerozhodim regA v NMI, což moje rutina dělala, tak lze psát v Basicu a přitom běží oba CIA 2 timery i vlastní IRQ Ja mam racej istotu LHS píše: Problém bych viděl akorát v tom, že ta kernal rutina NMI přepisuje adresu $DD0D a tím moje časovače stopne. nestopne. DD0D je interupt a status register. zapisom 7F povie ze chce vediet ci niekdo z CIA2 vyvolal prerusenie. ak nie tak skoci na rutinu ktora riesi restore klavesu. Ak ano tak zacne riesit Seriovy port. Takze mne bi malo stacit skocit po skonceny mojej casti prace na FE56. (tym baypassnem rutinu ktora sa stara o CIA2) |
Stránka 1 z 2 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |