Products > Programming
Project thread: 68xx analysis cont'd
(1/1)
metertech58761:
Rather than continue to dribble threads on this ongoing bit of code analysis, I'll try to keep it all in one thread going forward?
; Read 4044 latch (bit 0-2: pulse streams 0-2; bit 3: Ext. Input 3; bit 4-6: don't care; bit 7: Ext. Input 5)
LDAA extInput
TAB
ANDB #$08 ; evaluate External Input 3 bit
BNE app_997 ; Set inp3Flag if bit is 0
INCB ; byte-saving equivalent of LDAB #$01
STAB inp3Flag
app_997 ANDA #$07 ; now we look at KYZ0 - KYZ2 data
TAB
EORA NVR_03
STAB NVR_03
ANDA NVR_03
; Initialization routine sets NVR_03 to 7
; NVR_03 is just a placeholder until role is identified - then it will get a proper mnemonic
ANDA #$07
LDAB #$03
PSHX
LDX #kyz0Pulse
app_9A8 BITA #$01
BEQ app_9AF
JSR sub_60A
app_9AF ABX ; advance to kyz1Pulse (and kyz2Pulse if needed)
ASRA
BNE app_9A8
PULX ; restore index to $0C00
; app continues
; Check 24-bit value to ensure it hasn't exceeded 9,999,999 (and reset if so)
sub_60A PSHA
PSHB
LDD $01,X ; increment value by one
ADDD #$0001
STD $01,X
LDAA $00,X ; Was the maximum exceeded?
ADCA #$00
CMPA #$98
BNE sub_62A
CMPB #$80
BNE sub_62A
LDAB $01,X
CMPB #$96
BNE sub_62A
CLRA
STAA $02,X ; Zero out 24-bit value
STAA $01,X
sub_62A STAA $00,X ; Jumping here ensures upper byte was properly incremented
PULB
PULA
RTS
Here's what I think the above code does - correct me if I'm wrong?
After reading the latch at extInput, bit 3 is evaluated if 0, inp3Flag is set to 1 (it gets cleared elsewhere, and is only used once as a yes/no flag)
Then the remaining 3 bits are evaluated to determine which input bits have changed state. What is the purpose of the successive operations on NVR_03?
The result of the operations then carries forward in AccA, AccB is set to a fixed value of 3, and the index is set to address NVR_8C (24-bit value).
Bit 1 is tested, and if found to be 0, the next step is skipped.
The subroutine is called, where the current 24-bit value is advanced by 1, and reset if it exceeds 9,999,999 counts.
The index is advanced by 3, pointing it to kyz1Pulse, and if needed, advanced once more, to kyz2Pulse (all 3 bytes each).
AccA is shifted and the process repeated until empty and Z flag trips. In this case, as I don't care about the sign bit, should LSR be used instead of ASR?
(edited to update after further understanding and adjusted code accordingly)
metertech58761:
Moving along...
LDAA NVR_4E
SUBA NVR_4D ; only other reference in code writes value $25 to this address
STAA NVR_4E
BPL nmi_0AF ; if this branch is taken, several counters etc. are skipped
ADDA NVR_4C ; only other reference in code writes value $5E to this address
STAA NVR_4E
In this code, these are the only instances where the address NVR_4E is used.
NVR_4C and NVR_4D get loaded at some point with the values indicated, but not right away when the unit is initialized.
Is this some kind of stand-alone counter? Or is it likely the now-missing second EPROM likely manipulates these addresses as well?
Navigation
[0] Message Index
Go to full version