Самый крутой хак (и это не совсем хак в прямом смысле этого слова, но он проходит так же, как и некоторые из приведенных выше ответов), который я когда-либо создавал, был на моем Apple //e.
В справочном руководстве была одна строка, в которой говорилось, что $C010 — это флаг «нажатие любой клавиши».
Что оказалось правдой. Старший бит программного переключателя $C010 сообщит вам, была ли клавиша нажата или нет, несмотря на встроенное аппаратное обеспечение повторения клавиши.
Чего они не сказали вам, и все узнали на собственном горьком опыте, так это того, что не было надежного способа узнать, КАКАЯ клавиша была нажата.
Если бы вы написали небольшую программу сборки... (простите за мои ошибки, моя сборка 6502 сильно ржавая)
:1
lda $C010
cmp #$80
bcc :1 ; branch if less than? I forget how to do that.
lda $C000
jsr $FDF0 ;output the accumulator value to the screen
Таким образом, он будет зацикливаться, пока вы не нажмете клавишу, и выведет ключ, загрузив его с переключателя чтения клавиатуры $C000.
Но если вы запустите эту программу, она не будет работать правильно.
Он, безусловно, распечатывал что-то, пока вы удерживали клавишу, и ничего, когда вы этого не делали, но где-то в шине была небольшая задержка (я думаю, я не специалист по аппаратному обеспечению), поэтому, если вы нажмете «f» вы получил бы много "f". Но если вы остановитесь, а затем нажмете «g», вы получите кучу «f», прежде чем он переключится на «g».
Вы могли видеть доказательства этой проблемы в версии Gauntlet для яблока ][, вы двигались в одном направлении, а если вы пытались двигаться во втором направлении, вы немного двигались в исходном направлении, пока не прошли отставание.
На самом деле это не имело смысла, потому что чтение $C000 всегда было на 100% точным, если вы сначала не пропинговали $C010.
Я нашел эту проблему увлекательной, и после нескольких недель игры я, наконец, придумал то, что я до сих пор считаю самой крутой программой, которую я когда-либо писал.
Сама программа не имела никакого смысла, она сделала несколько бесполезных ORA, но по какой-то причине она работала и выдавала правильные значения из $C000 после запроса $C010.
Это было так круто, что я написал статью для журнала nibble, которую они приняли, но так и не опубликовали (либо потому, что они прекратили свою деятельность, либо потому, что статья читалась так, как будто она была написана 15-летним подростком, что так и было), где я написал замену программу ввода с клавиатуры и подключил ее к нулевой странице, которую все вызывают для получения ввода с клавиатуры, и я смог программно изменить задержку и частоту повторения с клавиатуры, что в противном случае было бы невозможно, поскольку это было встроено в аппаратное обеспечение. Конечно, в то время Apple //e уже уходил в прошлое, но по сей день это мой самый крутой лайфхак.
Обновление от 02.03.2010: Просматривая некоторые старые документы, я нашел распечатку моей небольшой процедуры сборки. Я публикую его здесь, чтобы посмотреть, сможет ли кто-нибудь понять, почему он работает, и поэтому он навсегда останется где-то в цифровой форме...
$0300 AD 10 C0 LDA $C010 ; load accumulator with any-key-down flag
$0303 29 80 AND #$80 ; keep only high bit flag
$0305 0D 00 C0 ORA $C000 ; OR accumulate with keyboard soft switch
$0308 10 F9 BPL $0303 ; erm, I forget exactly which branch this is
$030A 09 80 ORA #$80 ; turn the high bit on
$030C 20 ED FD JSR $FDED ; print char in accumulator
$030F 4C 00 30 JMP $0300 ; start again.
Непонятно, почему это должно работать, но это работает. Или сделал. 25 лет назад.
person
stu
schedule
04.02.2009