6502 машинного языка + Apple] [+ ROM, 12 (11? 10? 9?) Байтов
CE 06 80 F0 01 A2 0B A9 00 4C 24 ED
Должен начинаться с $8000
. Вылетает на системный монитор, когда счет достигает 0.
C6 B6 F0 01 A2 0B A9 00 4C 24 ED
Должен начинаться с $B1
. Это экономит байт, так как я могу использовать (двухбайтовую) версию с нулевой страницей DEC
, но перезаписывает критическую процедуру Applesoft CHRGET
; вам нужно будет загрузить его и вызвать с монитора, а также использовать CTRL+ BReturnдля повторной инициализации BASIC, как только вы закончите. Не уверен, если это делает его недействительным или нет.
CE 06 80 F0 01 A2 0B 4C 26 ED
Должен начинаться с $8000
. Это не инициализирует $9E
, сохраняя два байта. Однако это означает, что вы не должны вызывать его с отрицательным адресом (или, если вы вызываете его с монитора, вы должны вызывать монитор с положительным адресом). Если вы это сделаете, Applesoft в CALL
рутина будет хранить FF
в $9E
, заставляя его , чтобы добавить 65280 на номер при печати. Опять же, не уверен, если это делает решение недействительным или нет.
C6 B6 F0 01 A2 0B 4C 26 ED
Должен начинаться с $B1
. Это комбинация двух вышеупомянутых программ, сохраняющая в общей сложности три байта; вам придется вызывать монитор с положительным адресом, загружать его и запускать оттуда, и использовать Ctrl+ BReturnдля повторной инициализации BASIC, как только вы закончите.
Обратите внимание, что эти программы только изменяют программу в памяти; Повторная загрузка программы с диска приведет к сбросу обратного отсчета. Это работает, потому что Apple] [(и] [+, // e и // c) не имеют никакой системы защиты памяти; программа (и ее самодиакции) останутся в памяти даже после ее выхода, поэтому вы можете продолжать запускать ее из памяти, пока не перезапишите эту память чем-то другим.
Пробный прогон
]BLOAD COUNT THEN BRK
]CALL 32768
10
]CALL 32768
9
]CALL 32768
8
]CALL 32768
7
]CALL 32768
6
]CALL 32768
5
]CALL 32768
4
]CALL 32768
3
]CALL 32768
2
]CALL 32768
1
]CALL 32768
8008- A=80 X=9D Y=00 P=36 S=EE
*
объяснение
DEC NUM+1 ; Decrement the LDX instruction's operand
BEQ NUM+1 ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM LDX #$0B ; Load the X register with 0x0A; the operand has already been decremented once
LDA #$00 ; Load the accumulator with 0
JMP $ED24 ; Jump to $ED24, an Applesoft ROM routine which prints A (high byte),X (low byte) in decimal
Объяснение 10-байтовой версии
DEC NUM+1 ; Decrement the LDX instruction's operand
BEQ NUM+1 ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM LDX #$0B ; Load the X register with 0x0A; the operand has already been decremented once
JMP $ED26 ; Jump to $ED26, which is two bytes into the Applesoft routine at $ED24. The two skipped bytes would store the accumulator in $9E
Варианты
Печатает ERR
и подает звуковой сигнал, когда счетчик достигает 0
Нормальный - 15 байт
CE 06 80 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF
Перезаписывает CHRGET
- 14 байтов
C6 B6 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF
Не инициализируется $9E
- 13 байт
CE 06 80 F0 05 A2 0B 4C 26 ED 4C 2D FF
Перезаписывает CHRGET
и не инициализирует $9E
- 12 байт
C6 B6 F0 05 A2 0B 4C 26 ED 4C 2D FF
Зависает при достижении 0
Нормальный - 12 байт
CE 06 80 F0 FE A2 0B A9 00 4C 24 ED
Перезаписывает CHRGET
- 11 байт
C6 B6 F0 FE A2 0B A9 00 4C 24 ED
Не инициализируется $9E
- 10 байт
CE 06 80 F0 FE A2 0B 4C 26 ED
Перезаписывает CHRGET
и не инициализирует $9E
- 9 байт
C6 B6 F0 FE A2 0B 4C 26 ED