Dyskusja:Programowanie: Detekcja stereo
From Atariki
Wersja z dnia 19:59, 25 paź 2011 KMK (Dyskusja | wkład) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) |
||
Linia 59: | Linia 59: | ||
:Najlepiej jest, kiedy właśnie tak myślisz. Nie krępuj się zatem :) [[Użytkownik:KMK|KMK]] 21:59, 25 paź 2011 (CEST) | :Najlepiej jest, kiedy właśnie tak myślisz. Nie krępuj się zatem :) [[Użytkownik:KMK|KMK]] 21:59, 25 paź 2011 (CEST) | ||
+ | |||
+ | Niestety zmienia "API" w nieintuicyjny sposób (chyba, że nazwiemy funkcję "is_mono"). | ||
+ | W rozwiązaniu Sebana kosztuje bajty ustawienie przerwań, a potem posprzątanie po nich. W rozwiązaniu KMK kosztuje to, że jeden $FF w RANDOM jeszcze o niczym nie świadczy. Jeśli dalej chcemy ciąć bajty, to można spróbować POTx - np. w jednym POKEYu odpalić szybkie skanowanie, a w drugim wolne. Jeśli szybkie włączymy w drugim POKEYu, a potem wolne w podstawowym, to nawet nie trzeba potem sprzątać. [[Użytkownik:0xF|0xF]] 12:34, 26 paź 2011 (CEST) | ||
+ | |||
+ | :Na POTach test stereo robi [[SysInfo]]. I to chyba działa, nie słyszałem narzekań. [[Użytkownik:KMK|KMK]] 13:08, 26 paź 2011 (CEST) | ||
+ | |||
+ | @fox: ale przecież KMK nie odczytuje raz $d20a... odczytuje to 256 razy, jak się którykolwiek bajt trafi nie $ff to zostanie to właśnie and-em wykryte. Moim zdaniem to prosta i czytelna metoda ;) Będzie działać na 100% :) --[[Użytkownik:Seban|Seban/SLIGHT]] 13:31, 27 paź 2011 (CEST) | ||
+ | |||
+ | @fox #2: a dobra, nie doczytałem. Znaczy nie zrozumiałem za pierwszym razem o co Fox-owi chodziło. Fox tłumaczył że u KMK właśnie 256-krotnie AND-owanie daje pewność, w przeciwieństwie do procki XXL-a ;-) To była raczej próba oświecenia XXL-a przez Fox-a :P --[[Użytkownik:Seban|Seban/SLIGHT]] 13:33, 27 paź 2011 (CEST) | ||
+ | |||
+ | Obawiam się Seban, że podobnie jak poprzednicy nie zrozumiałeś mojej poprawki. Sprawdź, nie tylko jest krótsza ale i szybsza - pętla jest przerywana. [[Użytkownik:Xxl|Xxl]] 14:54, 27 paź 2011 (CEST) | ||
+ | |||
+ | :Seban: jednak nie zrozumiałeś. Poruszyłem dwie kwestie: | ||
+ | |||
+ | :1. Procka XXLa jest poprawna i szybsza. Jedyny mankament to, że zwraca odwrotny wynik, niż pozostałe procki. | ||
+ | |||
+ | ::Nie, to nie jest jedyny mankament (w zasadzie to nie jest żaden mankament). Proponowałem "uczcić to minutą ciszy", bo w sposób bardzo skomplikowany uzyskuje to, co można bardzo prosto zrobić na mojej procedurze, to znaczy skrócić ją o 6 bajtów, pozbywając się kodu, który ustala wynik w rejestrze X. Kodu, który tam jest, bo to jest przykład i ma być klarowny. W przeciwnym wypadku A=$FF dla stereo i A=!$ff (a konkretnie to A=$00) dla mono jest równie dobrym wynikiem. [[Użytkownik:KMK|KMK]] 17:59, 27 paź 2011 (CEST) | ||
+ | |||
+ | :::Racja. I cofam to, że jest szybsza. [[Użytkownik:0xF|0xF]] 21:52, 27 paź 2011 (CEST) | ||
+ | |||
+ | :2. Zaproponowałem jeszcze inną technikę - przy pomocy rejestrów POT. Zwróciłem uwagę, że "rozwlekłość" procedury Sebana wynika z programowania przerwań, a KMK i XXL z konieczności wielokrotnego sprawdzenia RANDOM. Być może "technika POT" byłaby krótsza. Jednak wycofuję się z tego pomysłu, bo co, jeśli podłączone są wiosełka lub coś innego (w 1200XL podobno jumpery) ? | ||
+ | |||
+ | :[[Użytkownik:0xF|0xF]] 15:43, 27 paź 2011 (CEST) | ||
+ | |||
+ | @fox: no już załapałem po drugiej edycji że XXL-a też zadziała ale nie chciałem już edytować po raz trzeci mając nadzieję że sam wyprostujesz moje brednie :P I tak się stało :) nie wiem czemu ale wcześniej jakoś ubzdurałem sobie że XXL-owa wersja wylezie po pierwszym $FF (co nie jest prawdą). jednym słowem, sorki za zamieszanie. Ostatnio mało czasu na sen mam :) --[[Użytkownik:Seban|Seban/SLIGHT]] 16:25, 27 paź 2011 (CEST) | ||
+ | |||
+ | A ja dodam, że nie jest nawet najkrótsza, oto przykład: można przekazać informację za pomocą statusu procesora: | ||
+ | <pre> | ||
+ | is_stereo | ||
+ | ldx #$00 | ||
+ | stx $d20f ;halt pokey 0 | ||
+ | stx $d21f ;halt pokey 1 | ||
+ | ldy #$03 | ||
+ | sty $d21f ;release pokey 1 | ||
+ | |||
+ | _loop ror $d20a ;see if pokey 0 is halted ($d20a = $ff) | ||
+ | bcc _mono | ||
+ | dex | ||
+ | bne _loop | ||
+ | |||
+ | _mono sty $d20f | ||
+ | ;Results: | ||
+ | ;C = 0 - mono | ||
+ | ;C = 1 - stereo | ||
+ | </pre> | ||
+ | [[Użytkownik:Xxl|Xxl]] 23:54, 27 paź 2011 (CEST) | ||
+ | |||
+ | :: No pięknie, ale chyba procedura rozminęła się gdzieś po drodze z istotą metody? Chodziło o testowanie stałej wartości, a nie sprawdzenie czy przypadkiem b0 nie jest skasowany... [[Użytkownik:Mono|Mono]] 00:20, 28 paź 2011 (CEST) | ||
+ | |||
+ | :::Nie, nie, to ma sens. Bo jeśli wystąpi C=0, to znaczy, że rejestr nie jest równy $FF. Przeciwnie, jeśli C=1 cały czas, to znaczy, że RANDOM stoi na $FF. Myślę, że można xxlowi pogratulować, po tygodniu myślenia zdołał realnie zaoszczędzić 1 bajt kodu. [[Użytkownik:KMK|KMK]] 00:24, 28 paź 2011 (CEST) | ||
+ | |||
+ | To nie efekt 5 minut myślenia, nawet nie tygodnia, to efekt 20 lat:) Z 32 bajtów do 24 to niezły wynik ale myślę, że i tak nie jest to najkrótsza wersja. [[Użytkownik:Xxl|Xxl]] 11:34, 28 paź 2011 (CEST) | ||
+ | |||
+ | :20 lat pracy nad tą procedurką? Szacun. Przykro, że ktoś wyprzedził cię o tydzień. PS. dlaczego ROR? [[Użytkownik:KMK|KMK]] 14:44, 28 paź 2011 (CEST) | ||
+ | |||
+ | Lecz kompleksy :-) Z Twoim wnioskowaniem to i odpowiedz ROR zostal zapisany w gwiazdach nie wypaczy wyniku. Zawsze możesz próbować napisać lepszą/szybszą/krótszą, rzuć wyzwanie losowi albo pogódź się z nim :) [[Użytkownik:Xxl|Xxl]] 15:43, 28 paź 2011 (CEST) | ||
+ | |||
+ | :Nie wiem, czy zauważyłeś (pewnie nie), że występujesz w tej konkurencji sam. Mnie zadowala, że wykorzystanie RANDOM był nowy (najwyraźniej) pomysł. Ale życzę powodzenia. [[Użytkownik:KMK|KMK]] 16:41, 28 paź 2011 (CEST) |
Aktualna wersja
A może dałoby się zrobić to inaczej:
ldx #$00 stx $d20f ;halt pokey 0 stx $d21f ;halt pokey 1 lda #$03 sta $d21f ;release pokey 1 lda $d20a ;see if pokey 0 is halted ($d20a = $ff) ?loop and $d20a inx bne ?loop ldy #$03 sty $d20f cmp #$ff bne ?mono inx ?mono ... ;X=0 - mono ;X=1 - stereo
? Procedura jest prostsza i krótsza niż u Sebana, oraz nie używa przerwań, ale nie bardzo mam na czym sprawdzić, czy to działa. KMK 16:43, 19 paź 2011 (CEST)
- EDIT: dalsze skrócenie, do 32 bajtów. Na emulatorze działa. KMK 17:15, 19 paź 2011 (CEST)
Będzie działać na real sprzęcie. Sprawdziłem czy pokey w reset daje $FF. Dokładnie tak do działa. Pomysł bardzo fajny i o wiele prostszy niż zabawa z IRQ. --Seban/SLIGHT 20:28, 20 paź 2011 (CEST)
moze w ten sposob?
detect_stereo ldx #$00 stx $d20f ;halt pokey 0 stx $d21f ;halt pokey 1 ldy #$03 sty $d21f ;release pokey 1 lda #$ff ?loop dex beq ?stereo cmp $d20a ;see if pokey 0 is halted ($d20a = $ff) beq ?loop ?stereo sty $d20f ;Results: ;X = 0 - stereo ;X !=0 - mono
Xxl 16:21, 25 paź 2011 (CEST)
- Uczcijmy to minutą ciszy. :) KMK 19:47, 25 paź 2011 (CEST)
kolejna cykliczna "adekwatna a nawet gorsza reakcja" Drac030 :) Xxl 21:45, 25 paź 2011 (CEST)
- Najlepiej jest, kiedy właśnie tak myślisz. Nie krępuj się zatem :) KMK 21:59, 25 paź 2011 (CEST)
Niestety zmienia "API" w nieintuicyjny sposób (chyba, że nazwiemy funkcję "is_mono"). W rozwiązaniu Sebana kosztuje bajty ustawienie przerwań, a potem posprzątanie po nich. W rozwiązaniu KMK kosztuje to, że jeden $FF w RANDOM jeszcze o niczym nie świadczy. Jeśli dalej chcemy ciąć bajty, to można spróbować POTx - np. w jednym POKEYu odpalić szybkie skanowanie, a w drugim wolne. Jeśli szybkie włączymy w drugim POKEYu, a potem wolne w podstawowym, to nawet nie trzeba potem sprzątać. 0xF 12:34, 26 paź 2011 (CEST)
- Na POTach test stereo robi SysInfo. I to chyba działa, nie słyszałem narzekań. KMK 13:08, 26 paź 2011 (CEST)
@fox: ale przecież KMK nie odczytuje raz $d20a... odczytuje to 256 razy, jak się którykolwiek bajt trafi nie $ff to zostanie to właśnie and-em wykryte. Moim zdaniem to prosta i czytelna metoda ;) Będzie działać na 100% :) --Seban/SLIGHT 13:31, 27 paź 2011 (CEST)
@fox #2: a dobra, nie doczytałem. Znaczy nie zrozumiałem za pierwszym razem o co Fox-owi chodziło. Fox tłumaczył że u KMK właśnie 256-krotnie AND-owanie daje pewność, w przeciwieństwie do procki XXL-a ;-) To była raczej próba oświecenia XXL-a przez Fox-a :P --Seban/SLIGHT 13:33, 27 paź 2011 (CEST)
Obawiam się Seban, że podobnie jak poprzednicy nie zrozumiałeś mojej poprawki. Sprawdź, nie tylko jest krótsza ale i szybsza - pętla jest przerywana. Xxl 14:54, 27 paź 2011 (CEST)
- Seban: jednak nie zrozumiałeś. Poruszyłem dwie kwestie:
- 1. Procka XXLa jest poprawna i szybsza. Jedyny mankament to, że zwraca odwrotny wynik, niż pozostałe procki.
- Nie, to nie jest jedyny mankament (w zasadzie to nie jest żaden mankament). Proponowałem "uczcić to minutą ciszy", bo w sposób bardzo skomplikowany uzyskuje to, co można bardzo prosto zrobić na mojej procedurze, to znaczy skrócić ją o 6 bajtów, pozbywając się kodu, który ustala wynik w rejestrze X. Kodu, który tam jest, bo to jest przykład i ma być klarowny. W przeciwnym wypadku A=$FF dla stereo i A=!$ff (a konkretnie to A=$00) dla mono jest równie dobrym wynikiem. KMK 17:59, 27 paź 2011 (CEST)
- Racja. I cofam to, że jest szybsza. 0xF 21:52, 27 paź 2011 (CEST)
- 2. Zaproponowałem jeszcze inną technikę - przy pomocy rejestrów POT. Zwróciłem uwagę, że "rozwlekłość" procedury Sebana wynika z programowania przerwań, a KMK i XXL z konieczności wielokrotnego sprawdzenia RANDOM. Być może "technika POT" byłaby krótsza. Jednak wycofuję się z tego pomysłu, bo co, jeśli podłączone są wiosełka lub coś innego (w 1200XL podobno jumpery) ?
- 0xF 15:43, 27 paź 2011 (CEST)
@fox: no już załapałem po drugiej edycji że XXL-a też zadziała ale nie chciałem już edytować po raz trzeci mając nadzieję że sam wyprostujesz moje brednie :P I tak się stało :) nie wiem czemu ale wcześniej jakoś ubzdurałem sobie że XXL-owa wersja wylezie po pierwszym $FF (co nie jest prawdą). jednym słowem, sorki za zamieszanie. Ostatnio mało czasu na sen mam :) --Seban/SLIGHT 16:25, 27 paź 2011 (CEST)
A ja dodam, że nie jest nawet najkrótsza, oto przykład: można przekazać informację za pomocą statusu procesora:
is_stereo ldx #$00 stx $d20f ;halt pokey 0 stx $d21f ;halt pokey 1 ldy #$03 sty $d21f ;release pokey 1 _loop ror $d20a ;see if pokey 0 is halted ($d20a = $ff) bcc _mono dex bne _loop _mono sty $d20f ;Results: ;C = 0 - mono ;C = 1 - stereo
Xxl 23:54, 27 paź 2011 (CEST)
- No pięknie, ale chyba procedura rozminęła się gdzieś po drodze z istotą metody? Chodziło o testowanie stałej wartości, a nie sprawdzenie czy przypadkiem b0 nie jest skasowany... Mono 00:20, 28 paź 2011 (CEST)
- Nie, nie, to ma sens. Bo jeśli wystąpi C=0, to znaczy, że rejestr nie jest równy $FF. Przeciwnie, jeśli C=1 cały czas, to znaczy, że RANDOM stoi na $FF. Myślę, że można xxlowi pogratulować, po tygodniu myślenia zdołał realnie zaoszczędzić 1 bajt kodu. KMK 00:24, 28 paź 2011 (CEST)
To nie efekt 5 minut myślenia, nawet nie tygodnia, to efekt 20 lat:) Z 32 bajtów do 24 to niezły wynik ale myślę, że i tak nie jest to najkrótsza wersja. Xxl 11:34, 28 paź 2011 (CEST)
- 20 lat pracy nad tą procedurką? Szacun. Przykro, że ktoś wyprzedził cię o tydzień. PS. dlaczego ROR? KMK 14:44, 28 paź 2011 (CEST)
Lecz kompleksy :-) Z Twoim wnioskowaniem to i odpowiedz ROR zostal zapisany w gwiazdach nie wypaczy wyniku. Zawsze możesz próbować napisać lepszą/szybszą/krótszą, rzuć wyzwanie losowi albo pogódź się z nim :) Xxl 15:43, 28 paź 2011 (CEST)
- Nie wiem, czy zauważyłeś (pewnie nie), że występujesz w tej konkurencji sam. Mnie zadowala, że wykorzystanie RANDOM był nowy (najwyraźniej) pomysł. Ale życzę powodzenia. KMK 16:41, 28 paź 2011 (CEST)