|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я пристреливаюсь что-то такое компьютерное сделать из дендиков, и в этой связи обратил внимание на такой интересный и весьма раритетный картридж, как Keyboard Transformer. Конечно, хотелось бы иметь в дендике ПЗУ загрузчика, как в " Специалисте", но таких аналогов для приставки я не нашел. А Keyboard Transformer cardсодержит руссифицированный Family BASIC v2.1a (оригинал - с иероглифами) и аппаратные средства, позволяющие подключить прямо к картриджу ввод- вывод с магнитофона и обычную ХТ-клавиатуру (именно ХТ-клавиатуру). Авторы этой разработки - A.Golomedov and I.Nesterov (Unreal Word Group)из Новосибирска. Разработка, конечно же давняя - 1994 года. Я поискал авторов в инете и, как мне показалось, нашел: http://ableo.ru/golomedov.ruНаписал им письмо с просьбой поделиться схемами картриджа Keyboard Transformer, но ответа так и не получил... Пришлось делать реверсивную разработку схемы Keyboard Transformer cardсамому - и в этой связи меня очень выручил CaH4e3, сделав весьма хорошие фотки обеих сторон платы картриджа. Это они - в уменьшенном виде со следами моих реверсивных изысканий. Честно говоря, в первый раз делаю реверс по фотографиям, когда нет возможности протыкать искомую дорожку тестером... В итоге получилось вот такая схема этой самой Keyboard Transformer card: Посмотреть схему целикомСхемотехника у авторов местами не совсем корректна на мой взгляд, что я склонен объяснить стремлением ужаться в малый объём картриджа. Но мне не совсем понравилось, что на /IRQ, имеющий подтягивющий резистор в схеме приставки, работает обычный выход, а на шину данных по линии D4работает выход ОК без подтяжки к чему либо... Возможно, с этим связано и кривое программирование, о котором я здесь вопрос задавал. На схеме расфасовка памяти указана, поэтому скажу несколько слов лишь о том, как организованы порты ввода-вывода: $5000 - сдвиговый регистр, получающий скан-код клавиатуры аппаратно в последовательном коде, и содержащий при чтении младший его полубайт. $5001 - сдвиговый регистр, получающий скан-код клавиатуры аппаратно в последовательном коде, и содержащий при чтении старший его полубайт. Полубайты читаются через мультиплексор, управляемый линией А0. По линии D4 из порта $5000 читается бит с магнитофона. $5002 - сброс сдвигового регистра ввода с клавиатуры и разрешение ввода нового сканкода клавиатуры. $5004 - вывод бита 1 на линию записи на магнитофон. $5000 - вывод бита 0 на линию записи на магнитофон. Ко всем портам обращаются ТОЛЬКО НА ЧТЕНИЕ: LDA $500xК порту $5003 обращения нет в виду упрощенной схемотехники, поскольку это будет одновременно чтение старшего полубайта скан-кода и сброс сдвигового регистра ввода с клавиатуры. Если кому-либо эта штука интересна для повторения " as is", то вот её прошивки: KBD_BASIC_CHR.BIN - ПЗУ видеопроцесора; KBD_BASIC_ROM.BIN - ПЗУ Unreal Word Group BASIC. PS. Если я где-то и ошибся, то лишь от неумения смотреть сквозь корпуса микросхем на фотографиях... Sorry... А схемы подключения клавиатур обсуждали здесь. PPS. SPECIAL THANKS TO CaH4e3!!!.
_________________ iLavr
Last edited by Lavr on 24 Aug 2015 12:54, edited 4 times in total.
|
31 Mar 2013 15:09 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22607 Location: Silicon Valley
|
Некоторое количество народа стало приходить в этот топик отсюда: http://www.famicomworld.com/forum/index.php?topic=12072.0
|
24 Aug 2015 11:39 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Если я правильно понял, то некто решил написать для NES программу-Монитор. A machine language monitor for NES: https://github.com/freem/nesmonИ за основу вроде как взят Монитор от Commodore : https://www.c64-wiki.com/wiki/Machine_Code_MonitorНасколько я понял, проект в работе ( This is a work in progress and is not "production ready".) и готового продукта пока нет.
_________________ iLavr
|
12 Aug 2017 06:07 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
_________________ iLavr
|
13 Aug 2017 06:05 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Похоже, что "на новом витке" я к этому проекту возвращаюсь... И небольшое замечание в связи со схемой из старта топика: все номиналы деталей там по идее должны быть верными, поскольку те, которые явно не видны и не угадывались из фотографий, я выставил такие, которые есть на аналогичных узлах других похожих схем. И, в частности, у меня там есть пометка "диод припаян неверно?" - я не мог "прозвонить" диод по фотографии, но очень похожий по виду реальный диод у меня звонился не так, как должно быть "по идее"... А по идее - диод должен притягивать к нулевому потенциалу, поскольку это запрещает дальнейшую передачу данных. Аналогичная схема подключения ХТ-клавиатуры к ZX-Spectrum выглядит вот так: Здесь явно притягивают линию к нулевому потенциалу транзистором! А вот на схеме выше предполагаемая полярность включения диода сомнительна, что я и указал. Ну и я тут озадачился вопросом, а PS/2-клавиатура тоже приостановит передачу, если притянуть линию данных к нулевому потенциалу? Что-то ответ на этот вопрос нигде мне не встретился явно...
_________________ iLavr
|
18 Aug 2017 06:09 |
|
|
Annett
Senior
Joined: 30 Mar 2017 00:55 Posts: 137
|
я пользовалась вот этим описанием, когда кодила драйвер мышки и клавиатуры для свой платы: http://www.computer-engineering.org/ps2protocol/"The PS/2 mouse and keyboard implement a bidirectional synchronous serial protocol. The bus is "idle" when both lines are high (open-collector). This is the only state where the keyboard/mouse is allowed begin transmitting data. The host has ultimate control over the bus and may inhibit communication at any time by pulling the Clock line low. The device always generates the clock signal. If the host wants to send data, it must first inhibit communication from the device by pulling Clock low. The host then pulls Data low and releases Clock. This is the "Request-to-Send" state and signals the device to start generating clock pulses."
|
18 Aug 2017 06:50 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я и сам английский вроде неплохо знаю... но тут что-то засомневался и даже гугл-транслятор притянул за уши... Получается, что в интерфейсе PS/2 чтобы приостановить передачу, надо притянуть к "земле" не данные а сам такт? Но это наш интернет даёт и другой вариант: http://4a4ik.blogspot.ru/2015/07/ps2.html
_________________ iLavr
|
18 Aug 2017 10:53 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
В общем, чтобы стать отдельным удобным Dendy-Computer-ом у обычного Dendy устройств ввода-вывода маловато, хотя аппаратно в современной "капельке" UM6561 напихано богато ресурсов - никакой "Специалист" или "Спектрум", пожалуй, не сравнится... Я еще когда делал реверс Keyboard Transformer собрал богатый материал по УВВ для Dendy, NES и иже с ними. Ну и накануне мы с коллегой rw6hrm обсудили в его ветке некоторые аспекты ввода программ с кассетного магнитофона, а также интерфейс клавиатуры, благо клавиатурный Dendy у коллеги rw6hrm свой собственный есть. Я не считаю кассетный интерфейс атавизмом, ибо в настоящее время вполне можно вводить и выводить программы такого формата с помощью сотового телефона, и я вот тут подобный пример успешно продемонстрировал. Даром, что тот убогий телефон не мог играть даже форматы .WAV и .MP3 ! Ну и я немного поработал над схемами интерфейса клавиатуры и магнитофона, чтобы сделать их более понятными и читаемыми: На мой взгляд - схемотехнически ничего сложного особенно для людей, знакомых со схемотехникой отечественных клонов ZX-Spectrum. Есть только один непривычный момент: по выходу OUT2 через DD3.2 резисторы NR притягивают к положительному потенциалу, но в этот же момент через диод VD1 запирают ввод с магнитофона. Т.е. ввод с магнитофона и опрос клавиатуры никогда не работают одновременно. Что, как я вижу, есть некоторый недостаток... У " Специалиста" самый "быстрый" бит 0 порта ввода отвечал за магнитофонный ввод, а вслед за ним бит 1 порта ввода обслуживал отдельную кнопку, которой можно было оперативно вмешаться в процесс ввода с магнитофона - скажем, прервать его... Ну и внешняя раскладка клавиатуры обсуждаемой схемы выглядит вот так: Насчет формата записи на кассету есть информация следующего характера. Это может быть: Kansas City Standard ( http://en.wikipedia.org/wiki/Kansas_City_Standard) encoding, Bell 103 ( http://en.wikipedia.org/wiki/Bell_103_modem) or Bell 202 ( http://en.wikipedia.org/wiki/Bell_202_modem), or some other arbitrary home-grown convention for encoding the audio on the tape. P.S. Сохранение и чтение с кассет использовали ряд игр, но в основном Family Basic. Желающие могут послушать и опознать: вот тут один американец выложил 2 стороны записи с фирменной кассеты к Family Basic. Я лично с 1-го разу не опознал, на FSK - Kansas City Standard не очень похоже, больше напоминает "Микрошу"...
_________________ iLavr
|
19 Aug 2017 07:03 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
На меня, возможно, обижаются здесь на форуме, когда я жестко прошу не писать недостоверные факты.Но вот сегодня кучу времени убил проверяя казалось бы простые вещи, но в этом нашем интернете достоверной информации становится всё меньше и меньше... правда размывается. Ну пусть тогда лично для меня и для этого форума часть правды будет лежать здесь: 1. сигнал М2 или φ2 (он же Ø2, Ф2, Phi2, F2) на слоте Dendy НЕ ИНВЕРСНЫЙ!Потому что:2. Правильная цоколевка дешифраторов 1533ИД4, К155ИД4, К555ИД4 вот такая:3. Регистр ИР22 прозрачен по уровню '1', защёлкивает при переходе в '0'. Регистр ИР23 защёлкивает по фронту тактового импульса. Зарубежные аналоги этих регистров 74373, 74374 ( 74LS373, 74LS374 и т.д.) соответственно.
_________________ iLavr
|
19 Aug 2017 15:59 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Существует вариант кассетного интерфейса и для оригинальной приставки NES: С точки зрения - куда сигнал попадает в итоге аппаратно - эта схема совершенно идентична показанной выше для Famicom, но подключается она в разъем расширения NES: С точки зрения программного обеспечения, оба варианта идентичны, но если пример низкоуровневого программирования и опроса клавиатуры у меня есть, то подпрограмм работы с магнитофоном я пока не нашел. На одном англоязычном форуме я нашел подсказку: Я нашел и декомпилировал этот код в указанной игрушке " Castle Excellent", но, к сожалению, там лишь низкоуровневые процедуры типа задержек и вывода бита в порт. Надо будет еще "поковырять" код, кстати сама игрушка " Castle Excellent" очень напоминает классическую " Jet set Willy"...
_________________ iLavr
|
20 Aug 2017 03:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А надо, оказывается, иногда дочитывать англоязычные источники, а не бросаться с дизассемблером " на амбразуру" ( хотя поковырять код я люблю - всегда хороший пример для подражания! ) Но как правильно мне порой подсказывают коллеги - " всё давно украдено до нас"! А в ситуации с NES-Dendy это вдвойне справедиво, ибо приставке " в обед - сто лет", и только я всего пару лет как надумал поиграться в коды 65хх на этой платформе... Так вот: код работы с магнитофоном давненько распотрошили: A partial disassembly of Castle Excellents KCS tape subs | | | | Code: ;***************************** ;Disassembly of Castle Excellent KCS loader/saver ;***************************** ; Partial work by Chris Covell ;***************************** ; ;*****************************
;***************************** ; 8000: Long delay. ;***************************** k_Long_Delay: ldx #$91 -: dex bne - rts
;***************************** ; 8006: Short delay. ;***************************** k_Short_Delay: ldx #$47 -: dex bne - rts
;***************************** ; 800C: Wait for Audio Level transition ;***************************** k_Wait_Transition: ldy #$00 ;Y will be a "loop" counter -: iny beq + ;256 loops = timeout ;----- lda $4016 ;Joystick 1 + strobe and #$02 ;Get Tape data bit eor $30 ;Is it different from last read? beq - ;If not, keep looping, inc Y eor $30 sta $30 ;$30 will contain Level after transition rts ; Y will contain # of loops until transition ;----- +: dey ;Y = FF = 256 reads with no change. rts
;***************************** ; 8021: Count Audio Level Transitions within 40 loops ;***************************** k_Count_Transitions: ldx #$28 ;Do 40 loops no matter what ldy #$00 -: lda $4016 ;Joystick 1 + strobe and #$02 eor $30 ;Transition? beq + eor $30 ;Store the change sta $30 iny dex bne - rts ;Y will contain # of transitions ;-------- +: lda $30 ;This just wastes cycles lda $30 lda $30 dex bne - rts
;***************************** ; 8041: Send Zero Bit - Single long cycle ;***************************** k_Zero_Bit: lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Long_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Long_Delay lda #$00 sta $4016 ;Joystick 1 + strobe rts
;***************************** ; 8057: Send a bit currently stored in Carry ;***************************** k_Send_Bit: bcc k_Zero_Bit ;***************************** ; 8059: Send a "One" - A Pair of short cycles. ;***************************** k_Ones_Bit: lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$00 sta $4016 ;Joystick 1 + strobe rts
;***************************** ; 807F: Waits for stable Leader tone ;***************************** k_Wait_for_Leader: lda #$04 sta $4016 ;Joystick 1 + strobe ldx #$00 stx $30 -: jsr k_Wait_Transition ;Wait for a transition cpy #$12 ;And check it's between $12 and $19 bcc k_Wait_for_Leader ;loops per transition cpy #$1A bcs k_Wait_for_Leader inx bne - ;256 transitions rts
;***************************** ; 8097: Send Leader tone for 7.04 seconds ;***************************** k_Send_Leader: lda #$21 ;#$2100 / 2400Hz * 2 sta $2F ldy #$00 -: jsr k_Ones_Bit ;Send continuous "Ones" for duration dey bne - dec $2F bne - clc rts
;***************************** ; 80A9: Send a full byte as: 0,b,11 ; CASTLE EXCELLENT SENDS THE BYTE OPPOSITE TO KCS FORMAT!! ;***************************** k_Send_Byte: jsr k_Zero_Bit ;a coded "0" is sent first ldy #$08 -: asl $17 ;MSB first!! Backwards from KCS format! jsr k_Send_Bit ;Then all 8 bits dey bne - jsr k_Ones_Bit ;Then a "1" jmp k_Ones_Bit ;Finish with a "1"
;***************************** ; 80BC: Receive a byte ; CASTLE EXCELLENT RECEIVES THE BYTE OPPOSITE TO KCS FORMAT!! ;***************************** k_Recv_Byte: lda $4016 ;Joystick 1 + strobe and #$02 beq k_Recv_Byte ;Wait for rising edge -: lda $4016 ;Joystick 1 + strobe and #$02 bne - ;Wait for falling edge sta $30 ;Save zero jsr k_Wait_Transition ;Wait 0->1 -: sty $2D ;Save timing result jsr k_Wait_Transition ;Wait 1->0 (or 0->1) tya clc adc $2D ;Add both timings together bcs - ;If over $FF, read again. cmp #$50 ;If $50 or less, read again bcc - lda #$08 sta $2E ;Counter for 8 bits -: jsr k_Count_Transitions ;How many transitions in a span (1/2400th sec?) cpy #$04 bcs + ;If more than 3 transitions... QUIT! (Bad transmission) cpy #$02 ;Carry set if >=2, cleared if 0 or 1 rol $17 ;Carry rolled into ZP tya lsr a ;If odd number of transitions, even it out bcs ++ jsr k_Wait_Transition ;Skip 1 pulse ++: jsr k_Wait_Transition dec $2E bne - lda $2D clc +: rts ;-------------------------------------------------
;------------------------------------------------- $80FF: ;Reads in Joystick 1 with NMIs off, stores in $20 and A ;------------------------------------------------- $810B: ;Reads in Joystick 1, stores in $20 and A ;------------------------------------------------- $8111: ;Read Joystick ;------------------------------------------------- $8129: ;Reads in Joystick 2 with NMIs off, stores in $20 and A ;------------------------------------------------- $8135: ;Reads in Joystick 2, stores in $20 and A ;------------------------------------------------- $813B: ;Read Joystick 2 ;------------------------------------------------- $8158: ;NMIs OFF: clears $2000.7 ;------------------------------------------------- $815E: ;NMIs_on: sets $2000.7 ;------------------------------------------------- $8164: ;Screen_off: clears $2000 ;------------------------------------------------- $816A: ;Wait VBlank start, turn on screen ;------------------------------------------------- $8175: ;Bankswitch CHR. ;------------------------------------------------- Start_KB_or_Tape_Send: ;$8180: Starts Xmission to keyboard or tape bit $1F bpl + jmp k_Send_Leader +: jsr Keyb_Next_Row lda #$00 sta $17 jsr Keyb_Write_Data lda #$AA sta $17 jsr Keyb_Write_Data lda #$55 sta $17 jmp Keyb_Write_Data
;------------------------------------------------- Start_KB_or_Tape_Recv: ;$819F: Starts Xmission from keyboard or tape bit $1F bpl + jmp k_Wait_for_Leader +: jsr Keyb_Next_Row jsr Keyb_Read_Data jsr Keyb_Read_Data lda $17 cmp #$AA bne + jsr Keyb_Read_Data lda $17 cmp #$55 bne + clc rts +: sec rts
;------------------------------------------------- Send_KB_or_Tape: ;$81C2: sends to KB or Tape depending on $1F.8 sta $17 stx $1A bit $1F bpl + jsr k_Send_Byte jmp ++ +: jsr Keyb_Write_Data ++: ldx $1A rts ;------------------------------------------------- Recv_KB_or_Tape: ;$81D6: Receives byte from KB or Tape depending on $1F.8 stx $1A bit $1F bmi + jsr Keyb_Read_Data jmp ++ +: jsr k_Recv_Byte ++: ldx $1A lda $17 rts ;------------------------------------------------- Keyb_Write_Data: ;$81EA: Writes a byte to Keyboard serially (?) ldy #$07 ;8 loops -: asl $17 ;Feed byte stored in $17 out to Keyboard lda #$00 rol a ;Bit 0 = Keyboard row reset ora #$06 ;Enable keyboard sta $4016 ;Joystick 1 + strobe and #$03 ;Disable keyboard matrix sta $4016 ;Joystick 1 + strobe dey bpl - rts ;------------------------------------------------- Keyb_Read_Data: ;$81FF: Reads only column 2 (???) of the Family BASIC keyboard? ldy #$07 ;Loop 8 times -: lda $4017 ;Joystick 2 + strobe lsr a lsr a and #$01 ;Isolate Keyboard column 2?? ora #$06 ;Enable keyboard matrix (usually resets it) sta $4016 ;Joystick 1 + strobe and #$03 ;Disable keyboard matrix sta $4016 ;Joystick 1 + strobe lsr a rol $17 ;Store column 2 data in $17. dey bpl - clc rts ;------------------------------------------------- Keyb_Next_Row: ;$821A: Increases Keyboard Row lda #$00 ;This should increment row sta $4016 ;Joystick 1 + strobe lda #$02 sta $4016 ;Joystick 1 + strobe rts ;-------------------------------------------------
| | | | |
| | | | Code: ;***************************** ;Disassembly of Castle Excellent KCS loader/saver ;***************************** ; Partial work by Chris Covell ;***************************** ; ;*****************************
;***************************** ; 8000: Long delay. ;***************************** k_Long_Delay: ldx #$91 -: dex bne - rts
;***************************** ; 8006: Short delay. ;***************************** k_Short_Delay: ldx #$47 -: dex bne - rts
;***************************** ; 800C: Wait for Audio Level transition ;***************************** k_Wait_Transition: ldy #$00 ;Y will be a "loop" counter -: iny beq + ;256 loops = timeout ;----- lda $4016 ;Joystick 1 + strobe and #$02 ;Get Tape data bit eor $30 ;Is it different from last read? beq - ;If not, keep looping, inc Y eor $30 sta $30 ;$30 will contain Level after transition rts ; Y will contain # of loops until transition ;----- +: dey ;Y = FF = 256 reads with no change. rts
;***************************** ; 8021: Count Audio Level Transitions within 40 loops ;***************************** k_Count_Transitions: ldx #$28 ;Do 40 loops no matter what ldy #$00 -: lda $4016 ;Joystick 1 + strobe and #$02 eor $30 ;Transition? beq + eor $30 ;Store the change sta $30 iny dex bne - rts ;Y will contain # of transitions ;-------- +: lda $30 ;This just wastes cycles lda $30 lda $30 dex bne - rts
;***************************** ; 8041: Send Zero Bit - Single long cycle ;***************************** k_Zero_Bit: lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Long_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Long_Delay lda #$00 sta $4016 ;Joystick 1 + strobe rts
;***************************** ; 8057: Send a bit currently stored in Carry ;***************************** k_Send_Bit: bcc k_Zero_Bit ;***************************** ; 8059: Send a "One" - A Pair of short cycles. ;***************************** k_Ones_Bit: lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$00 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$01 sta $4016 ;Joystick 1 + strobe jsr k_Short_Delay lda #$00 sta $4016 ;Joystick 1 + strobe rts
;***************************** ; 807F: Waits for stable Leader tone ;***************************** k_Wait_for_Leader: lda #$04 sta $4016 ;Joystick 1 + strobe ldx #$00 stx $30 -: jsr k_Wait_Transition ;Wait for a transition cpy #$12 ;And check it's between $12 and $19 bcc k_Wait_for_Leader ;loops per transition cpy #$1A bcs k_Wait_for_Leader inx bne - ;256 transitions rts
;***************************** ; 8097: Send Leader tone for 7.04 seconds ;***************************** k_Send_Leader: lda #$21 ;#$2100 / 2400Hz * 2 sta $2F ldy #$00 -: jsr k_Ones_Bit ;Send continuous "Ones" for duration dey bne - dec $2F bne - clc rts
;***************************** ; 80A9: Send a full byte as: 0,b,11 ; CASTLE EXCELLENT SENDS THE BYTE OPPOSITE TO KCS FORMAT!! ;***************************** k_Send_Byte: jsr k_Zero_Bit ;a coded "0" is sent first ldy #$08 -: asl $17 ;MSB first!! Backwards from KCS format! jsr k_Send_Bit ;Then all 8 bits dey bne - jsr k_Ones_Bit ;Then a "1" jmp k_Ones_Bit ;Finish with a "1"
;***************************** ; 80BC: Receive a byte ; CASTLE EXCELLENT RECEIVES THE BYTE OPPOSITE TO KCS FORMAT!! ;***************************** k_Recv_Byte: lda $4016 ;Joystick 1 + strobe and #$02 beq k_Recv_Byte ;Wait for rising edge -: lda $4016 ;Joystick 1 + strobe and #$02 bne - ;Wait for falling edge sta $30 ;Save zero jsr k_Wait_Transition ;Wait 0->1 -: sty $2D ;Save timing result jsr k_Wait_Transition ;Wait 1->0 (or 0->1) tya clc adc $2D ;Add both timings together bcs - ;If over $FF, read again. cmp #$50 ;If $50 or less, read again bcc - lda #$08 sta $2E ;Counter for 8 bits -: jsr k_Count_Transitions ;How many transitions in a span (1/2400th sec?) cpy #$04 bcs + ;If more than 3 transitions... QUIT! (Bad transmission) cpy #$02 ;Carry set if >=2, cleared if 0 or 1 rol $17 ;Carry rolled into ZP tya lsr a ;If odd number of transitions, even it out bcs ++ jsr k_Wait_Transition ;Skip 1 pulse ++: jsr k_Wait_Transition dec $2E bne - lda $2D clc +: rts ;-------------------------------------------------
;------------------------------------------------- $80FF: ;Reads in Joystick 1 with NMIs off, stores in $20 and A ;------------------------------------------------- $810B: ;Reads in Joystick 1, stores in $20 and A ;------------------------------------------------- $8111: ;Read Joystick ;------------------------------------------------- $8129: ;Reads in Joystick 2 with NMIs off, stores in $20 and A ;------------------------------------------------- $8135: ;Reads in Joystick 2, stores in $20 and A ;------------------------------------------------- $813B: ;Read Joystick 2 ;------------------------------------------------- $8158: ;NMIs OFF: clears $2000.7 ;------------------------------------------------- $815E: ;NMIs_on: sets $2000.7 ;------------------------------------------------- $8164: ;Screen_off: clears $2000 ;------------------------------------------------- $816A: ;Wait VBlank start, turn on screen ;------------------------------------------------- $8175: ;Bankswitch CHR. ;------------------------------------------------- Start_KB_or_Tape_Send: ;$8180: Starts Xmission to keyboard or tape bit $1F bpl + jmp k_Send_Leader +: jsr Keyb_Next_Row lda #$00 sta $17 jsr Keyb_Write_Data lda #$AA sta $17 jsr Keyb_Write_Data lda #$55 sta $17 jmp Keyb_Write_Data
;------------------------------------------------- Start_KB_or_Tape_Recv: ;$819F: Starts Xmission from keyboard or tape bit $1F bpl + jmp k_Wait_for_Leader +: jsr Keyb_Next_Row jsr Keyb_Read_Data jsr Keyb_Read_Data lda $17 cmp #$AA bne + jsr Keyb_Read_Data lda $17 cmp #$55 bne + clc rts +: sec rts
;------------------------------------------------- Send_KB_or_Tape: ;$81C2: sends to KB or Tape depending on $1F.8 sta $17 stx $1A bit $1F bpl + jsr k_Send_Byte jmp ++ +: jsr Keyb_Write_Data ++: ldx $1A rts ;------------------------------------------------- Recv_KB_or_Tape: ;$81D6: Receives byte from KB or Tape depending on $1F.8 stx $1A bit $1F bmi + jsr Keyb_Read_Data jmp ++ +: jsr k_Recv_Byte ++: ldx $1A lda $17 rts ;------------------------------------------------- Keyb_Write_Data: ;$81EA: Writes a byte to Keyboard serially (?) ldy #$07 ;8 loops -: asl $17 ;Feed byte stored in $17 out to Keyboard lda #$00 rol a ;Bit 0 = Keyboard row reset ora #$06 ;Enable keyboard sta $4016 ;Joystick 1 + strobe and #$03 ;Disable keyboard matrix sta $4016 ;Joystick 1 + strobe dey bpl - rts ;------------------------------------------------- Keyb_Read_Data: ;$81FF: Reads only column 2 (???) of the Family BASIC keyboard? ldy #$07 ;Loop 8 times -: lda $4017 ;Joystick 2 + strobe lsr a lsr a and #$01 ;Isolate Keyboard column 2?? ora #$06 ;Enable keyboard matrix (usually resets it) sta $4016 ;Joystick 1 + strobe and #$03 ;Disable keyboard matrix sta $4016 ;Joystick 1 + strobe lsr a rol $17 ;Store column 2 data in $17. dey bpl - clc rts ;------------------------------------------------- Keyb_Next_Row: ;$821A: Increases Keyboard Row lda #$00 ;This should increment row sta $4016 ;Joystick 1 + strobe lda #$02 sta $4016 ;Joystick 1 + strobe rts ;-------------------------------------------------
| | | | |
Но не это, собственно говоря, меня так обрадовало... А больше мне понравилось, что на основе подпрограмм для вывода на магнитофон, сделали программу-дампер картриджей, не требующий фактически аппаратных затрат: TapeDump v1.0 - a tool to dump carts without extra hardwareTapeDump.NES: Dump NES/Famicom toolИ очень мне понравилось, что уже рализовали и мою любимую мысль - о загрузке и управлении nedo-поделкой через LPT-порт (в данном случае - NES/Famicom/Dendy) ! FDS Writing extension for TapeDumpP.S. Если я поведал вам "боян" - не серчайте, люблю я такие простые программно-аппаратные штуки!
_________________ iLavr
|
20 Aug 2017 06:16 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Собственно, почему меня этот факт так "неподецки" возбудил... NES/Famicom/Dendy - платформа не очень удобная для изучения программирования непосредственно на ней самой. Поэтому я и прикидываю - приделать что-ли к ней современную PS/2-клавиатуру для удобства... Нет, я понимаю, что полно всяких эмуляторов, и я сам ими пользуюсь, но без живой железки это - не то. Так вот какая мысль зрела: через LPT-порт имитировать для реального Dendy его джойстики, клавиатуру и ввод/вывод с магнитофона, выход звука Dendy - затащить на звуковую карту компьютера, а композитный видео-выход - воткнуть на вход TV-тюнера (у меня что на старом десктопе, что на ноутбуке карты видео-захвата есть). Получится система, где всё на экране компьютера: пишем программу, отлаживаем в эмуляторе на компьютере - загружаем в реальный Dendy через LPT-порт - и тут же в окошке видео-захвата видим, что получилось на самом деле на реальном железе...
_________________ iLavr
|
20 Aug 2017 07:52 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я уже на страницах форума задавался вот этим вопросом: | | | | Lavr wrote: | | | | Lavr wrote: Меня очень заинтересовал этот руссифицированный Васик с XT-клавиатурой, и я почитал код, прикидывая схемотехнические решения. Довольно прозрачно вырисовывается, что в основе лежит 9-разрядный сдвиговый регистр, как в схеме для ZX-Spectrum: * Увеличить"Радиолюбитель" 1995 ¹12 --- Подключение ХТ-клавиатуры к "ZX SPECTRUM"после "задвига" в него стартового бита и 8-ми информационных, стартовый бит вызывает прерывание - ну как в схеме IBM РС XT. * Увеличить(Хотя эта схема из родного мануала оригинальной РС XT - здесь что-то типа явных опечаток имеет место быть, на мой взгляд.) Анализ кода показал, что скан-код из сдвигового регистра читают через мультиплексор - старший ниббл и младший ниббл. Ну это и в родной Family-Basic клавиатуре есть похожее решение. Но вот отдельные части кода ввергли меня в ступор... Возможно - я чего-то не знаю? Знатоки 6502 или FamiCom - подскажите! Вот код чтения скан-кода клавиатуры из регистра сдвига: Ну удивляет в драйвере наличия обращений к отсутствующей клавиатуре от FamiCom: Ну, предположим, что авторы руссификации просто не вычистили эти куски - они вроде как не мешают, а может и задержки фиксированные. Но вот это мне совершенно не понятно: Зачем "пробивать" через #$FF все биты считанного из порта байта? И вот это сделано явно преднамеренно, но снова смысл не понятен: Зачем загружать чем-то аккумулятор, если чтение из порта этот байт убьёт? Можно бы списать на случайность, но далее такой приём повторяется, и значения в аккумулятор загружаются всякий раз - разные: Если трюк преднамеренный - в чём его смысл? | | | | |
| | | | |
Но всё встало на свои места, когда я внимательно прочитал подпрограммы обслуживания фирменной клавиатуры Famicom. Дело в том, что она опрашивается в несколько заходов по 4 бита, поскольку она подключена через широкий 15-пиновый порт, но там доступны только 4 бита данных, поэтому применяется мультиплексирование. Авторы картриджа Keyboard Transformer схитрили, сделав аппаратную часть под имеющийся код внутри Family Basic! А я еще удивлялся, делая реверс, зачем регистр сдвига байта с клавиатуры читают мультиплексором в два захода как старший и младший нибблы - когда в картридже вся шина данных доступна? А сделали они это, чтобы не сильно патчить оригинальную подпрограмму чтения клавиатуры внутри фирменного Family Basic! Просто забили NOP-ами лишнее, поэтому и остались лишние "атавизмы" которые в данном случае ни на что не влияют... Хотя, решение в принципе правильное - так легче пропатчить Basic в кодах, если нет исходников. Отсюда интересный вывод: в принципе PS/2- клавиатуру можно прицепить и через широкий 15-пиновый порт.
_________________ iLavr
|
21 Aug 2017 03:14 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Для NES/Famicom/Dendy адаптировали и софтовый интерфейс RS-232 ! NES to RS-232: http://forums.nesdev.com/viewtopic.php?f=9&t=6720http://slack.net/~ant/old/nes-code/serial/cable.htmlhttp://slack.net/~ant/old/nes-code/bootloader/Я так озадачился интерфейсами, поскольку, видимо, придется прошивать для Dendy некое подобие ПЗУ загрузчика, потому как, к сожалению, мой любимый трюк с загрузкой через LPT-кабельздесь не проходит, поскольку на слот картриджа не выведен, к сожалению, сигнал готовности CPU. По крайней мере, я пока не вижу других вариантов загружать программы в Dendy ...
_________________ iLavr
|
21 Aug 2017 13:41 |
|
|
Velldio
Junior
Joined: 15 Dec 2019 00:28 Posts: 6
|
Здравствуйте уважаемый, Lavr. Очень заинтересовала тема изложенная Вами. Подскажите пожалуйста, удалось ли Вам реализовать подключение клавиатуры PS/2 к приставке...? У меня есть очень большое желание сделать remake приставки как описано вот здесь : https://www.emu-land.net/forum/index.ph ... 815.0.htmlНо очень хотелось бы объединить вышеуказанную конструкцию с Keyboard Transformer... То есть что бы было цельное устройство, в котором дополнительным каскадом был реализован Keyboard Transformer, и при желании можно было "поиграться" с ним... или отключив каскад (например тумблером), подключать обычные картриджи и играть... Сам прекрасно понимаю, что практического применения данной конструкции мало, но есть спортивный интерес... У меня маловато практики в данных вопросах... Не делали ли Вы схему на современных комплектующих? Реализовали ли подключение клавиатуры через разъём PS/2 или DB-15?
|
15 Dec 2019 00:42 |
|
|
Who is online |
Users browsing this forum: No registered users and 41 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|