Γεια χαρά!
Έπεσα πάνω στο Programming:Unlocking ASIC. Πολύ ωραίο πράγμα εκεί στις βελτιστοποιημένες ρουτίνες! ![]()
Και ορίστε η δική μου συνεισφορά στο θέμα.
Όπως αναφέρεται στο σχετικό νήμα του παλιού φόρουμ, είναι ευθύνη αυτού που καλεί τη ρουτίνα
να διαχειριστεί τα interrupts, οπότε όλα τα DI/EI φεύγουν! -2 bytes
Υπενθυμίζουμε ότι η πλήρης αλληλουχία ξεκλειδώματος του RMR2 που πρέπει να γραφτεί στη θύρα I/O #BCxx είναι:
NZB, #00,#FF,#77...#8A, STATE (#CD), EOK
NZB: Οποιαδήποτε τιμή εκτός από μηδέν.
STATE: Το #CD ξεκλειδώνει (οποιαδήποτε άλλη τιμή κλειδώνει).
EOK: Πρέπει να σταλεί για να βγει το ASIC από την αλληλουχία ξεκλειδώματος και να επιστρέψει στην επιλογή καταχωρητή CRTC I/O. Μπορεί να είναι οποιαδήποτε τιμή.
Η κλασική βελτιστοποιημένη ρουτίνα δεν εκμεταλλεύεται ορισμένες ιδιότητες της αλληλουχίας ξεκλειδώματος. Όπως:
- Βάζουμε τα δεδομένα της αλληλουχίας αμέσως μετά το τέλος της ρουτίνας, με ένα
RET, δηλαδή έναν opcode&C9, όχι μηδέν, χμμ… μου φαίνεται γιαNZB! : -1 byte - Γιατί να αποθηκεύσουμε την τιμή
EOKστα δεδομένα της αλληλουχίας; Δεν μας νοιάζει ποια τιμή είναι, θα στείλουμε ό,τι βρούμε: -1 byte
Αυτό μας δίνει μια ελαφρώς πιο συμπαγή έκδοση:
; Send a 17 bytes sequence to I/O port #BCxx to unlock RMR2
; register access. KISS approach using a table of raw values.
;
; Size: 28 bytes
; Time: 178 µs
;
; Output:
; BC=&BC00
; Trashes HL and Flags
rmr2_unlock:
ld bc,&BC00+17
ld hl,_rmr2_data_key
_rmr2_send_key inc b
outi
dec c
jr nz,_rmr2_send_key
_rmr2_data_key ret ; This opcode is also used as SYNC/NZB value (#C9)
db 0, &FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B,&15,&8A
_rmr2_data_lock db 205 ; 205 to Unlock, anything else to lock
; The routine will over-read one byte at this location
; to retrieve an EOK value, necessary for proper unlocking.
Και τώρα, στα 28 bytes, αυτή η απλή και φιλική ρουτίνα κάνει τις βελτιστοποιημένες να μοιάζουν με… Τέλος πάντων, δεν έχει σημασία. (σας αγαπάμε ακόμα!)
Αλλά η ρουτίνα επανυλοποίησης του LFSR από τον @Urusergi μου έβαλε ιδέες. Υπάρχουν τόοοσοι πολλοί τρόποι και κόλπα με bit για να υλοποιήσεις αυτό το μικρό LFSR, που μπορεί να υπάρχουν ακόμα πιο σύντομες παραλλαγές εκεί έξω…
…μερικές μέρες, κλάματα και αιμορραγίες από τη μύτη αργότερα: λοιπόν, όχι και τόσοι πολλοί όπως φαίνεται!
Βρήκα μόνο μία:
; Software re-implementation of the LFSR logic described in
; the Amstrad Patent (GB2243701A). It generates a 15 bytes
; sequence as verified by the ASIC to unlock RMR2 access.
;
; Designed by Urusergi
; Modified by Grim (shaving a single byte, pfew!)
;
; Size: 27 bytes
; Time: 389 µs
;
; Output:
; BC=&BCFF
; Trashes HL and AF
rmr2_unlock:
ld bc,&BCFF
out (c),c ; SYNC/NZB
out (c),0 ; SYNC/NUL
ld a,c
_rmr2_send_key
out (c),a
ld h,a
add hl,hl
rra
add hl,hl
ld l,a
xor h
and &F7
xor l
add a,h
and &88
xor l
cp c
jr nz,_rmr2_send_key
ret
Προσπάθησα να ξεφορτωθώ τον (χαριτωμένο) έλεγχο εξόδου cp c και να χρησιμοποιήσω κάποιο flag μετά το τελευταίο xor l, αλλά μέχρι στιγμής απέτυχα. Το cp c συνεχίζει να ζει! ![]()