nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 14 Nov 2018 13:15



Reply to topic  [ 20 posts ]  Go to page Previous  1, 2
6502 Dendy-Computer 
Author Message
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 1325 times ]

С точки зрения - куда сигнал попадает в итоге аппаратно - эта схема совершенно идентична
показанной выше для Famicom, но подключается она в разъем расширения NES:
Attachment:
NES_PORT_EXT.gif
NES_PORT_EXT.gif [ 23.83 KiB | Viewed 1325 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 1320 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
Display posts from previous:  Sort by  
Reply to topic   [ 20 posts ]  Go to page Previous  1, 2

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.