Lavr wrote: А схему подключения РС-клавиатуры к Keyboard Transformer тож распотрошили?
Меня очень заинтересовал этот руссифицированный Васик с XT-клавиатурой,
и я почитал код, прикидывая схемотехнические решения.
Довольно прозрачно вырисовывается, что в основе лежит 9-разрядный
сдвиговый регистр, как в схеме для
ZX-Spectrum:
* Увеличить
"Радиолюбитель" 1995 ¹12 --- Подключение ХТ-клавиатуры к "ZX SPECTRUM"
после "задвига" в него стартового бита и 8-ми информационных, стартовый бит
вызывает прерывание - ну как в схеме
IBM РС XT.
* Увеличить
(Хотя эта схема из родного мануала оригинальной РС XT - здесь что-то типа явных опечаток
имеет место быть, на мой взгляд.)
Анализ кода показал, что скан-код из сдвигового регистра читают через мультиплексор -
старший ниббл и младший ниббл.
Ну это и в родной
Family-Basic клавиатуре есть похожее решение.
Но вот отдельные части кода ввергли меня в ступор...
Возможно - я чего-то не знаю? Знатоки
6502 или
FamiCom - подскажите!
Вот код чтения скан-кода клавиатуры из регистра сдвига:
Code: Select all
; 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: Select all
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: Select all
af4b: LDA $5001 @ $5001 - $AF
af4e: AND #$FF
Зачем "пробивать" через #$FF все биты считанного из порта байта?
И вот это сделано явно преднамеренно, но снова смысл не понятен:
Code: Select all
af6a: LDA #$00
af6c: LDA $5002? @ $5002 - $AF
Зачем загружать чем-то аккумулятор, если чтение из порта этот байт убьёт?
Можно бы списать на случайность, но далее такой приём повторяется, и значения
в аккумулятор загружаются всякий раз - разные:
Code: Select all
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
Если трюк преднамеренный - в чём его смысл?