;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RomDump ; Dumpe la rom de la TI-83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; _clrLCDfull .equ 4755h _puts .equ 470Dh _putmap .equ 4701h _GetKey .equ 4CFEh _CreateProg .equ 448Ah ;;;;;;;; OP1 .equ 8039h CURROW .equ 800Ch textflags .equ 5 textInverse .equ 3 k2ndQuit .equ 40h kEnter .equ 5 kUp .equ 3 kDn .equ 4 kLt .equ 2 kRt .equ 1 ;;;;;;;; RomPage .equ 8266h ; 00..0Fh LineSel .equ 8267h ; 0 : page, 1 : go .ORG 9327h ; Initialise les variables utilisées XOR A LD (RomPage), A LD (LineSel), A ; Boucle : reaffiche tout ReDisp: ; Le titre CALL _clrLCDFull LD HL, 0 LD (CURROW), HL SET textInverse, (IY+textFlags) LD HL, txtTitle CALL _puts RES textInverse, (IY+textFlags) LD HL, 0101h LD (CURROW), HL LD HL, txtBy CALL _puts ; Affiche la page LD HL, 0404h LD (CURROW), HL LD A, 0 CALL DoInverse ; Inverse si selectionne LD HL, txtPage CALL _puts LD A, (RomPage) CALL DispNib DispGo: LD HL, 0406h LD (CURROW), HL LD A, 1 CALL DoInverse LD HL, txtGo CALL _puts KeyLoop: CALL _GetKey CP k2ndQuit RET Z ; Quit ==> Quitte ! CP kEnter JR NZ, NotEnter LD A, (LineSel) OR A JR Z, KeyLoop JR DoDump NotEnter: CP kUp JR NZ, NotUp XOR A LD (LineSel), A JP ReDisp NotUp: CP kDn JR NZ, NotDn LD A, 1 LD (LineSel), A JP ReDisp NotDn: CP kLt LD B, -1 JR Z, ChangePage CP kRt LD B, 1 JR Z, ChangePage JR KeyLoop ; si touche inconnue, continue la boucle ChangePage: LD A, (LineSel) OR A ; !=0 : Btn 'Dump It!' => ne fait rien JR NZ, KeyLoop LD A, (RomPage) ADD A, B AND 0Fh ; Page+ mod 16 LD (RomPage), A JP ReDisp DoDump: ; Cree le prog LD HL, ProgName LD BC, ProgName.Size LD DE, OP1 LDIR LD HL, 04000h ; Et oui, c'est grand une page CALL _CreateProg ;;;;; ;;;;; Penser a changer le type ! ;;;;; INC DE INC DE ; Saute la taille LD HL, 04000h ; dump la ROM 4000..7FFF LD BC, 04000h ; Attention : critique : si y'a un pb ici, tout plante DI LD A, (RomPage) ; Change de page AND 7 OR 088h OUT (2), A LD A, (RomPage) AND 8 SLA A OR 0C0h OUT (0), A CopyRom: LDIR ; Remet la bonne page LD A, 088h|4 OUT (2), A LD A, 0D0h OUT (0), A EI CALL _clrLCDFull LD HL, 0 LD (CURROW), HL LD HL, ProgName+1 CALL _puts LD HL, txtOk CALL _puts RET ;;;;;;;; ;;;;;;;; DoInverse: RES textInverse, (IY+textFlags) LD HL, LineSel CP (HL) RET NZ ; Si ce n'est pas la bonne ; ligne, quitte SET textInverse, (IY+textFlags) ; sinon, inverse RET DispNib: CP 10 JR C, Adeci ADD A, 'A'-'0'-10 Adeci: ADD A, '0' LD (ProgName+5), A CALL _putmap RET ;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;0123456789ABCDEF;;;;;;;; txtTitle: .byte "Rom Dumper v1.0",0 txtBy: .byte "By F. DHORDAIN",0 txtBase00: .byte "0000",0CEh,"3FFF",0 txtBase40: .byte "4000",0CEh,"7FFF",0 txtPage: .byte "Page ",0 txtGo: .byte "Dump It!",0 txtOK: .byte " is here",0 ProgName: .byte 5,"PAGE0",0 ProgName.Size .equ 1+5+1 ;;;;;;;; .END