В приведённом выше коде есть баг (!). Было:
Стало:Код:.globl _Input_keysAvailable _Input_keysAvailable: LD A,#0 ; Check overflow: CP #8 ; IF keysAvailable > 8 THEN keysAvailable := 8 END; ADC #0 LD (_Input_keysAvailable+1),A RET C JR _Input_keyOut
Баг связан с тем, что не было учтено влияние команды ADC #0 на флаг переноса, и процедура реагировала без переполнения буфера как на его переполнение.Код:.globl _Input_keysAvailable _Input_keysAvailable: LD A,#0 ; Check overflow: CP #KeyBufSize ; IF keysAvailable > 8 THEN keysAvailable := 8 END; JR NC,_Input_keyOut INC A LD (_Input_keysAvailable+1),A RET




Ответить с цитированием