This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
mg_notes:iie_card:weird_stuff [2017/08/06 02:34] M.G. ↷ Page moved from _ns:weird_stuff to mg_notes:iie_card:weird_stuff |
mg_notes:iie_card:weird_stuff [2017/08/07 21:54] M.G. [Other Weird Instructions] |
||
---|---|---|---|
Line 10: | Line 10: | ||
.org $fbdd | .org $fbdd | ||
; this code replaces the .1 second delay | ; this code replaces the .1 second delay | ||
- | .byte $02 | + | .byte $02 ; two byte NOP in 65C02 |
- | .byte $01 | + | .byte $01 ; should be ignored by CPU |
rts | rts | ||
nop | nop | ||
Line 32: | Line 32: | ||
So this must be part of the magic that interfaces the card to the host Macintosh. How very very interesting. | So this must be part of the magic that interfaces the card to the host Macintosh. How very very interesting. | ||
+ | ===== Other Weird Instructions ===== | ||
+ | The preceding find led me to search through the monitor ROM to look for other unusual instruction sequences. | ||
+ | |||
+ | Here is what I found: | ||
+ | |||
+ | ^ In Routine ^ Address ^ Code ^ Function ^ | ||
+ | | PWRUP | $FAB4 | $02 $02 | Loads A reg with $Cn+1 where n = startup slot or $C8 if scan. | | ||
+ | | PWRUP | $FAC0 | $02 $03 | Displays "UNABLE TO BOOT FROM STARTUP SLOT" if A reg = $Cn-1 where n = startup slot or $c0 if scan. | | ||
+ | | APPLEII | $FB63 | $02 $04 | Display copyright message on screen, disappears if screen scrolls. | | ||
+ | | BELL1 | $FBDD | $02 $01 | Play system bell sound. | | ||
+ | | GETLN1 | $FD78 | $02 $06 | Key translation called right after rdchar. If A reg has <key>DELETE</key>, converts it to <key><-</key>. | | ||
+ | | | | $02 $05 | Not found in firmware, yet, but presumably this exists. | | ||
+ | |||
+ | |||
+ | ==== The Key Translation and the A register ==== | ||
+ | |||
+ | Get to the monitor in your %%//%%e Card and try this: | ||
+ | |||
+ | <code> | ||
+ | *! | ||
+ | !300:jsr fd35 | ||
+ | ! nop | ||
+ | ! nop | ||
+ | ! jmp fdda | ||
+ | ! | ||
+ | *300G | ||
+ | </code> | ||
+ | |||
+ | FD35 is the RDCHAR routine, FDDA is the print byte routine. This routine reads a keypress and outputs its hex code. Run it a few times to convince yourself there is no funny business. Run it a final time and press <key>DELETE</key>. | ||
+ | |||
+ | <code> | ||
+ | *300G | ||
+ | FF (appears after pressing delete) | ||
+ | * | ||
+ | </code> | ||
+ | |||
+ | FF is exactly what we expect to see with the Apple II delete key. | ||
+ | |||
+ | Now want to see something interesting? Change the NOPs to $02 $06 and run it again. Try a few keys, then try it with <key>DELETE</key>. | ||
+ | |||
+ | <code> | ||
+ | *303:02 06 | ||
+ | *300G | ||
+ | 88 (appears after pressing delete) | ||
+ | * | ||
+ | </code> | ||
+ | |||
+ | 88 is the code for the left arrow key. That's some serious magic, and in two bytes the Card converts <key>DELETE</key> to <key><-</key>. | ||
+ | |||
+ | ==== The Two-Byte Copyright ==== | ||
+ | |||
+ | Try this sequence of instructions: | ||
+ | |||
+ | <code> | ||
+ | ]HOME | ||
+ | ]CALL -151 | ||
+ | *300:02 04 60 | ||
+ | *300G | ||
+ | </code> | ||
+ | |||
+ | Hit the left arrow a bunch of times until the display scrolls. **POOF!** | ||
+ |