nedoPC.org

Community of electronics hobbyists established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 03 Oct 2022 15:10



Reply to topic  [ 48 posts ]  Go to page 1, 2, 3, 4  Next
6502 Dendy-Computer 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Я пристреливаюсь что-то такое компьютерное сделать из дендиков, и в этой
связи обратил внимание на такой интересный и весьма раритетный картридж,
как Keyboard Transformer.

Image

Конечно, хотелось бы иметь в дендике ПЗУ загрузчика, как в "Специалисте",
но таких аналогов для приставки я не нашел. А 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, сделав весьма хорошие
фотки обеих сторон платы картриджа. :kruto:

Это они - в уменьшенном виде со следами моих реверсивных изысканий. Честно
говоря, в первый раз делаю реверс по фотографиям, когда нет возможности
протыкать искомую дорожку тестером... :lol:

Image

Image


В итоге получилось вот такая схема этой самой Keyboard Transformer card:

Image
Image
Посмотреть схему целиком

Схемотехника у авторов местами не совсем корректна на мой взгляд, что я
склонен объяснить стремлением ужаться в малый объём картриджа.

Но мне не совсем понравилось, что на /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... А схемы подключения клавиатур обсуждали здесь.
:wink:

PPS. SPECIAL THANKS TO CaH4e3!!!
.

_________________
iLavr


Last edited by Lavr on 24 Aug 2015 13:54, edited 4 times in total.



31 Mar 2013 16:09
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20348
Location: Silicon Valley
Reply with quote
Некоторое количество народа стало приходить в этот топик отсюда:

http://www.famicomworld.com/forum/index.php?topic=12072.0

_________________
:eugeek: https://twitter.com/Shaos1973


24 Aug 2015 12:39
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Если я правильно понял, то некто решил написать для 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 07:07
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Интересно, что у китайцев был практически полноценный детский компьютер на базе NES/Famicom.
Attachment:
SalesPic.jpg
SalesPic.jpg [ 39.47 KiB | Viewed 31410 times ]

Quote:
It is essentially a Famicom clone with a built-in disk drive; however, it was designed as a learning tool for children and an introduction into the world of BASIC and LOGO programming.
Not only can Famicom games be played in the unit, but several peripherals can also be connected to it, including a mouse, keyboard, tape drive, and CD-ROM drive. The PCJr was obviously an attempt at a mini-computer that would sell for a fraction of a real DOS PC. Included with a new Dr. PC Jr. are three OS and program disks that offer DOS functions, a word processor, BASIC and LOGO, and a typing tutor.

http://mypage.direct.ca/c/ccovell/nesdev.html
http://mypage.direct.ca/c/ccovell/dev1.html

_________________
iLavr


13 Aug 2017 07:05
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Похоже, что "на новом витке" я к этому проекту возвращаюсь... :wink:

И небольшое замечание в связи со схемой из старта топика: все номиналы деталей там по идее
должны быть верными, поскольку те, которые явно не видны и не угадывались из фотографий,
я выставил такие, которые есть на аналогичных узлах других похожих схем.

И, в частности, у меня там есть пометка "диод припаян неверно?" - я не мог "прозвонить" диод
по фотографии, но очень похожий по виду реальный диод у меня звонился не так, как должно
быть "по идее"... А по идее - диод должен притягивать к нулевому потенциалу, поскольку это
запрещает дальнейшую передачу данных.

Аналогичная схема подключения ХТ-клавиатуры к ZX-Spectrum выглядит вот так:
Attachment:
XT_KBD_.gif
XT_KBD_.gif [ 17.61 KiB | Viewed 31351 times ]

Здесь явно притягивают линию к нулевому потенциалу транзистором! А вот на схеме выше
предполагаемая полярность включения диода сомнительна, что я и указал.

Ну и я тут озадачился вопросом, а PS/2-клавиатура тоже приостановит передачу, если притянуть
линию данных к нулевому потенциалу
?
Что-то ответ на этот вопрос нигде мне не встретился явно... :-?

_________________
iLavr


18 Aug 2017 07:09
Profile
Senior

Joined: 30 Mar 2017 01:55
Posts: 137
Reply with quote
я пользовалась вот этим описанием, когда кодила драйвер мышки и клавиатуры для свой платы:
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 07:50
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Я и сам английский вроде неплохо знаю... но тут что-то засомневался и даже гугл-транслятор
притянул за уши...
Получается, что в интерфейсе PS/2 чтобы приостановить передачу, надо притянуть к "земле"
не данные а сам такт
?
Quote:
Мышь PS / 2 и клавиатура реализуют двунаправленный синхронный последовательный протокол. Шина «простаивает», когда обе линии высоки (открытый коллектор). Это единственное состояние, когда клавиатура / мышь разрешена, чтобы начать передачу данных. Хост имеет полный контроль над шиной и может заблокировать связь в любое время, потянув за линию тактовой частоты.

Устройство всегда генерирует тактовый сигнал. Если хост хочет отправить данные, он должен сначала заблокировать связь с устройством, потянув за Низкие часы. Затем хост вытаскивает данные на низком уровне и освобождает часы. Это состояние «Запрос на отправку» и сигнализирует устройству о начале генерации тактовых импульсов.

Основная информация: Bus states
Данные = высокое, Часы = высокая: состояние бездействия.
Данные = высокое, Часы = низкая: Связь законсервировано.
Данные = низкая, Часы = высокая: Хост запроса на Отправить


Но это наш интернет даёт и другой вариант: http://4a4ik.blogspot.ru/2015/07/ps2.html
Quote:
Есть 3 начальных состояния линий Data и Clock:
Data = 1, Clock = 1 - хост ждёт данные от устройства
Data = 1, Clock = 0 - хост хочет передать данные устройству
Data = 0, Clock = 0 - Передача данных запрещена

_________________
iLavr


18 Aug 2017 11:53
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
В общем, чтобы стать отдельным удобным Dendy-Computer-ом у обычного Dendy устройств
ввода-вывода маловато, хотя аппаратно в современной "капельке" UM6561 напихано богато
ресурсов - никакой "Специалист" или "Спектрум", пожалуй, не сравнится... 8)

Я еще когда делал реверс Keyboard Transformer собрал богатый материал по УВВ для Dendy,
NES и иже с ними.
Ну и накануне мы с коллегой rw6hrm обсудили в его ветке некоторые аспекты ввода программ
с кассетного магнитофона, а также интерфейс клавиатуры, благо клавиатурный Dendy у коллеги
rw6hrm свой собственный есть.

Я не считаю кассетный интерфейс атавизмом, ибо в настоящее время вполне можно вводить и выводить
программы такого формата с помощью сотового телефона, и я вот тут подобный пример успешно
продемонстрировал
.
Даром, что тот убогий телефон не мог играть даже форматы .WAV и .MP3 ! :roll:

Ну и я немного поработал над схемами интерфейса клавиатуры и магнитофона, чтобы сделать их
более понятными и читаемыми:
Attachment:
FC Keyboard Key Schematic.gif
FC Keyboard Key Schematic.gif [ 7.03 KiB | Viewed 31318 times ]
Attachment:
FC Family Basic Keyboard.gif
FC Family Basic Keyboard.gif [ 9.59 KiB | Viewed 31318 times ]

На мой взгляд - схемотехнически ничего сложного особенно для людей, знакомых со схемотехникой
отечественных клонов ZX-Spectrum.
Есть только один непривычный момент: по выходу OUT2 через DD3.2 резисторы NR притягивают к
положительному потенциалу, но в этот же момент через диод VD1 запирают ввод с магнитофона.
Т.е. ввод с магнитофона и опрос клавиатуры никогда не работают одновременно.
Что, как я вижу, есть некоторый недостаток... :osad:
У "Специалиста" самый "быстрый" бит 0 порта ввода отвечал за магнитофонный ввод, а вслед за ним
бит 1 порта ввода обслуживал отдельную кнопку, которой можно было оперативно вмешаться в процесс
ввода с магнитофона - скажем, прервать его...

Ну и внешняя раскладка клавиатуры обсуждаемой схемы выглядит вот так:
Attachment:
KeyBoard-Lay.gif
KeyBoard-Lay.gif [ 97.81 KiB | Viewed 31318 times ]


Насчет формата записи на кассету есть информация следующего характера.
Это может быть:
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. :lol:

P.S. Сохранение и чтение с кассет использовали ряд игр, но в основном Family Basic.
Желающие могут послушать и опознать:
вот тут один американец выложил 2 стороны записи с фирменной кассеты к Family Basic.
Я лично с 1-го разу не опознал, на FSK - Kansas City Standard не очень похоже,
больше напоминает "Микрошу"...

_________________
iLavr


19 Aug 2017 08:03
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
На меня, возможно, обижаются здесь на форуме, когда я жестко прошу не писать недостоверные факты.

Но вот сегодня кучу времени убил проверяя казалось бы простые вещи, но в этом нашем интернете
достоверной информации становится всё меньше и меньше... правда размывается. :-?
Ну пусть тогда лично для меня и для этого форума часть правды будет лежать здесь:

1. сигнал М2 или φ2 (он же Ø2, Ф2, Phi2, F2) на слоте Dendy НЕ ИНВЕРСНЫЙ!
Attachment:
NES_Connector_.gif
NES_Connector_.gif [ 22.92 KiB | Viewed 31306 times ]

Потому что:

Image

Image


2. Правильная цоколевка дешифраторов 1533ИД4, К155ИД4, К555ИД4 вот такая:
Attachment:
К555ИД4.gif
К555ИД4.gif [ 38.2 KiB | Viewed 31306 times ]


3. Регистр ИР22 прозрачен по уровню '1', защёлкивает при переходе в '0'. Регистр ИР23 защёлкивает по фронту тактового импульса.
Attachment:
КР1533ИР22_23.jpg
КР1533ИР22_23.jpg [ 19.01 KiB | Viewed 31305 times ]

_________________
iLavr


19 Aug 2017 16:59
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Я не считаю кассетный интерфейс атавизмом, ибо в настоящее время вполне можно вводить и выводить
программы такого формата с помощью сотового телефона, и я вот тут подобный пример успешно
продемонстрировал
.

Существует вариант кассетного интерфейса и для оригинальной приставки NES:
Attachment:
NES_TapeDrv.gif
NES_TapeDrv.gif [ 8.22 KiB | Viewed 18396 times ]

С точки зрения - куда сигнал попадает в итоге аппаратно - эта схема совершенно идентична
показанной выше для Famicom, но подключается она в разъем расширения NES:
Attachment:
NES_PORT_EXT.gif
NES_PORT_EXT.gif [ 23.83 KiB | Viewed 18396 times ]


С точки зрения программного обеспечения, оба варианта идентичны, но если пример низкоуровневого
программирования и опроса клавиатуры у меня есть, то подпрограмм работы с магнитофоном я пока не нашел.
На одном англоязычном форуме я нашел подсказку:
Quote:
Castle Excellent's (game) recorder handling code mostly exists between $8000 and $80FE, and provides save games using the 1200 baud variant of Kansas City Standard.

Я нашел и декомпилировал этот код в указанной игрушке "Castle Excellent", но, к сожалению,
там лишь низкоуровневые процедуры типа задержек и вывода бита в порт.
Надо будет еще "поковырять" код, кстати сама игрушка "Castle Excellent" очень напоминает
классическую "Jet set Willy"... :wink:

_________________
iLavr


20 Aug 2017 04:08
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
На одном англоязычном форуме я нашел подсказку:
Quote:
Castle Excellent's (game) recorder handling code mostly exists between $8000 and $80FE,
and provides save games using the 1200 baud variant of Kansas City Standard.
Я нашел и декомпилировал этот код в указанной игрушке "Castle Excellent", но, к сожалению,
там лишь низкоуровневые процедуры типа задержек и вывода бита в порт.

А надо, оказывается, иногда дочитывать англоязычные источники, а не бросаться с дизассемблером
"на амбразуру" (хотя поковырять код я люблю - всегда хороший пример для подражания! :wink: )
Но как правильно мне порой подсказывают коллеги - "всё давно украдено до нас"! А в ситуации с
NES-Dendy это вдвойне справедиво, ибо приставке "в обед - сто лет", и только я всего пару лет как
надумал поиграться в коды 65хх на этой платформе... :mrgreen:

Так вот: код работы с магнитофоном давненько распотрошили:

 A partial disassembly of Castle Excellents KCS tape subs
Chris Covell wrote:
Here's a partial disassembly of Castle Excellent's KCS (Kansas City Standard) code.
Yes, it uses KCS, but the bit ordering is backwards in the bytes it sends compared to KCS.
KCS: 0,b0 b1 b2 b3 b4 b5 b6 b7,1,1
Castle Excellent: 0,b7 b6 b5 b4 b3 b2 b1 b0,1,1

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 hardware
TapeDump.NES: Dump NES/Famicom tool

И очень мне понравилось, что уже рализовали и мою любимую мысль - о загрузке и управлении
nedo-поделкой через LPT-порт (в данном случае - NES/Famicom/Dendy) !
Attachment:
cable-schematics.gif
cable-schematics.gif [ 15.65 KiB | Viewed 18391 times ]

FDS Writing extension for TapeDump


P.S. Если я поведал вам "боян" - не серчайте, люблю я такие простые программно-аппаратные штуки! :wink:

_________________
iLavr


20 Aug 2017 07:16
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
И очень мне понравилось, что уже рализовали и мою любимую мысль - о загрузке и управлении
nedo-поделкой через LPT-порт (в данном случае - NES/Famicom/Dendy) !

Собственно, почему меня этот факт так "неподецки" возбудил... :wink:

NES/Famicom/Dendy - платформа не очень удобная для изучения программирования
непосредственно на ней самой.
Поэтому я и прикидываю - приделать что-ли к ней современную PS/2-клавиатуру для удобства...
Нет, я понимаю, что полно всяких эмуляторов, и я сам ими пользуюсь, но без живой железки
это - не то.

Так вот какая мысль зрела: через LPT-порт имитировать для реального Dendy его джойстики,
клавиатуру и ввод/вывод с магнитофона, выход звука Dendy - затащить на звуковую карту компьютера,
а композитный видео-выход - воткнуть на вход TV-тюнера (у меня что на старом десктопе, что на
ноутбуке карты видео-захвата есть).
Получится система, где всё на экране компьютера: пишем программу, отлаживаем в эмуляторе
на компьютере - загружаем в реальный Dendy через LPT-порт - и тут же в окошке видео-захвата
видим, что получилось на самом деле на реальном железе...

_________________
iLavr


20 Aug 2017 08:52
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Я уже на страницах форума задавался вот этим вопросом:
Lavr wrote:
Lavr wrote:
Меня очень заинтересовал этот руссифицированный Васик с XT-клавиатурой,
и я почитал код, прикидывая схемотехнические решения.

Довольно прозрачно вырисовывается, что в основе лежит 9-разрядный
сдвиговый регистр, как в схеме для ZX-Spectrum:


* Увеличить
"Радиолюбитель" 1995 ¹12 --- Подключение ХТ-клавиатуры к "ZX SPECTRUM"

после "задвига" в него стартового бита и 8-ми информационных, стартовый бит
вызывает прерывание - ну как в схеме IBM РС XT.



* Увеличить

(Хотя эта схема из родного мануала оригинальной РС XT - здесь что-то типа явных опечаток
имеет место быть, на мой взгляд.
)
:-?

Анализ кода показал, что скан-код из сдвигового регистра читают через мультиплексор -
старший ниббл и младший ниббл.
Ну это и в родной Family-Basic клавиатуре есть похожее решение.

Но вот отдельные части кода ввергли меня в ступор... :(
Возможно - я чего-то не знаю? Знатоки 6502 или FamiCom - подскажите!
Вот код чтения скан-кода клавиатуры из регистра сдвига:
Code:
;     IRQ -> AF41h; прерывание клавиатуры XT.
af41: PHA       ; сохраняем регистры
af42: TYA
af43: PHA
af44: TXA
af45: PHA

af46: LDA #$05  ; 0000.0101b
af48: STA $4016 ; reset (force row 0)

af4b: LDA $5001 @ $5001 - $AF
af4e: AND #$FF
af50: ASL       ; сдвигаем 4 младших - в старшие
af51: ASL
af52: ASL
af53: ASL
af54: AND #$F0  ; выделим только 4 старших
af5A: STA $78   ; сохраним их в $0078

af5B: LDA #$04  ; 0000.0100b
af5a: STA $4016 ; request LSB of NEXT row
af5d: NOP
af5e: NOP

af5f: LDA $5000  @ $5000 - $AF
af62: AND #$FF
af64: AND #$0F   ; выделим только 4 младших
;                  установим значения старших из $0078
af66: ORA $78    @ $0078 - $00
af68: STA $68    ; сохраним весь байт в $0068

af6a: LDA #$00
af6c: LDA $5002? @ $5002 - $AF
af6f: NOP
af70: NOP
af71: NOP
af72: NOP
af73: NOP

af74: LDA #$04   ; 0000.0100b
af76: STA $4016  ; request LSB of NEXT row

;     считаем весь байт из $0068
af79: LDA $68    @ $0068 - $00
af7b: JMP $B018


Ну удивляет в драйвере наличия обращений к отсутствующей клавиатуре
от FamiCom:
Code:
af46: LDA #$05  ; 0000.0101b
af48: STA $4016 ; reset (force row 0)

af74: LDA #$04   ; 0000.0100b
af76: STA $4016  ; request LSB of NEXT row

Ну, предположим, что авторы руссификации просто не вычистили эти куски - они вроде
как не мешают, а может и задержки фиксированные.

Но вот это мне совершенно не понятно:
Code:
af4b: LDA $5001 @ $5001 - $AF
af4e: AND #$FF

Зачем "пробивать" через #$FF все биты считанного из порта байта?

И вот это сделано явно преднамеренно, но снова смысл не понятен:
Code:
af6a: LDA #$00
af6c: LDA $5002? @ $5002 - $AF

Зачем загружать чем-то аккумулятор, если чтение из порта этот байт убьёт?

Можно бы списать на случайность, но далее такой приём повторяется, и значения
в аккумулятор загружаются всякий раз - разные:
Code:
afa0: LDA   #$06
afa2: LDA   $5004 @ $5004 = $AF
afa5: CLI;  Сброс флага I (разрешение прерываний) ?
...
afb2: LDA   #$04
afb4: LDA   $5000 @ $5000 = $AF
...
b597: LDA   #$04 ;0000.0100b
b599: LDA   $5004 @ $5084 = $AF
...
b5a0: LDA   #$FD ;1111.1101b
b5a2: LDA   $5000 @ $5000 = $AF

Если трюк преднамеренный - в чём его смысл?

Но всё встало на свои места, когда я внимательно прочитал подпрограммы обслуживания
фирменной клавиатуры Famicom.
Дело в том, что она опрашивается в несколько заходов по 4 бита, поскольку она подключена
через широкий 15-пиновый порт, но там доступны только 4 бита данных, поэтому применяется
мультиплексирование.

Авторы картриджа Keyboard Transformer схитрили, сделав аппаратную часть под имеющийся
код внутри Family Basic!
А я еще удивлялся, делая реверс, зачем регистр сдвига байта с клавиатуры читают мультиплексором
в два захода как старший и младший нибблы - когда в картридже вся шина данных доступна?
А сделали они это, чтобы не сильно патчить оригинальную подпрограмму чтения клавиатуры
внутри фирменного Family Basic! :lol:
Просто забили NOP-ами лишнее, поэтому и остались лишние "атавизмы" которые в данном случае
ни на что не влияют...
Хотя, решение в принципе правильное - так легче пропатчить Basic в кодах, если нет исходников.

Отсюда интересный вывод: в принципе PS/2- клавиатуру можно прицепить и через широкий 15-пиновый порт.

_________________
iLavr


21 Aug 2017 04:14
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Для NES/Famicom/Dendy адаптировали и софтовый интерфейс RS-232 ! :kruto:

NES to RS-232: http://forums.nesdev.com/viewtopic.php?f=9&t=6720
http://slack.net/~ant/old/nes-code/serial/cable.html
http://slack.net/~ant/old/nes-code/bootloader/

Я так озадачился интерфейсами, поскольку, видимо, придется прошивать для Dendy некое
подобие ПЗУ загрузчика, потому как, к сожалению, мой любимый трюк с загрузкой через LPT-кабель
здесь не проходит, поскольку на слот картриджа не выведен, к сожалению, сигнал готовности CPU.

По крайней мере, я пока не вижу других вариантов загружать программы в Dendy ... :-?

_________________
iLavr


21 Aug 2017 14:41
Profile
Junior

Joined: 15 Dec 2019 01:28
Posts: 6
Reply with quote
Здравствуйте уважаемый, 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 01:42
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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

Search for:
Jump to:  

Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.