;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Attrib v1.0 for CrASH v1.1+, Ash v3.1+ ; (C) 1998 Wouter Demuynck (kadem@unicall.be) ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Started : June 26, 1998 ; Last update : October 17, 1998 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; History: ; 28/06/1998 - Attrib v0.1 ; -> Locking/Unlocking possible ; 29/06/1998 - Attrib v0.2 ; -> Attributes listed in program list ; -> Demo version released ; -> Char changer routine added / Unhiding now possible ; -> System Programs protected from changing ; -> Program Name Changer added ; 30/06/1998 - Attrib v0.3 ; -> Improved look and feel ; -> Corrected some small errors ; 30/06/1998 - Attrib v0.4 ; -> CrASH v1.3 Patch added ; -> TI-OS only hide added ; -> Added indicator for TI-OS hidden only ; 01/07/1998 - Attrib v0.9 ; -> Optimized (+200 bytes chopped off) ; -> Lite version added ; -> Program name shown in Program Menu ; 19/07/1998 - Attrib v0.91 ; -> 2nd + '0' now also works in edit mode (thanks to 82-VAR.TXT) ; -> Added about entry with author information ; -> Menu routine updated ; 19/07/1998 - Attrib v1.0 ; -> CrASH v1.5 Patch instead of CrASH v1.3 Patch ; -> Source included #include "crash82.inc" .db "Attrib 1.0",0 LASTVAT = $8D18 ; pointer to last entry of vat ENTRIES = APD_BUF ; number of entries set 7,(IY+$14) ; make sure menu text goes to GRAPH_MEM ld a,(INT_STATE) or a ;cp 0 jp nz,Error_Interrupt ld hl,Msg_Menutitle ld de,APD_BUF+1 ld bc,17+19 ;**; before : 17 (first entry added) ldir sbc hl,hl ; carry is zero (because of OR A), HL will be zero now ld (APD_BUF+630),hl ; put first address entry to $0000 MainStart: ld a,1 ;xor a ;**; start with one entry ! ld (ENTRIES),a call MakeProgramList MainLoop: ld hl,APD_BUF ld a,1 call Menu cp $FF ret z cp $FE ret z cp 1 ;**; jr z,AuthorScreen ;**; ;**; dec a ;**; ld (Selection+1),a cp 4 ;**; 3 before ; check if program 2 or 3 selected (# and !) jr c,DisplaySystem call ProgramLoop jr MainStart AuthorScreen: ld hl,InfoScreen_Author jr AuthorScreen2 DisplaySystem: ld hl,InfoScreen_SystemProgram AuthorScreen2: call InfoWaitStandardTitle jr MainLoop ProgramLoop: call GetAddress dec hl dec hl dec hl ld b,(hl) ld a,9 ; (instead of 8, will not mess up when program name is 8 chars) sub b ld c,a dec hl ld de,Menu_Data_ChangeProgramName call CopyNameLoop ld b,c ld a,$20 PJB_ProgramCopyLoop2: ld (de),a inc de djnz PJB_ProgramCopyLoop2 ld hl,MenuData_Program call Menu2 cp $FF ret z cp $FE ret z dec a ;back (cp 1) ret z dec a ; change name (cp 2) jp z,EditProgName dec a ;hide (Crash/TI-OS) (cp 3) jr z,HideUnHide dec a ; lock / Unlock (cp 4) jr z,LockUnlock dec a ;hide (TI-OS only) (cp 5) jr z,HideUnHideTIOSOnly dec a ; patch crash 1.5 (cp 6) jr nz,ProgramLoop PatchCrash: ld a,(CRASH_VER) cp $15 jr nz,PatchError ld hl,$8EE3 ld a,(hl) cp $41 jr nz,PatchError dec (hl) ; put $40 into ($8EE3) ld hl,InfoScreen_PatchSuccessfull jr PatchDone PatchError: ld hl,InfoScreen_PatchNotSuccessfull PatchDone: call InfoWaitStandardTitle jr ProgramLoop HideUnHide: call GetAddress dec hl dec hl dec hl dec hl ld a,(hl) cp 65 jr c,UnHideTheProgram HideTheProgram: ld (hl),'9' ld hl,InfoScreen_Hide call InfoWaitStandardTitle jr ProgramLoop UnHideTheProgram: ld (_Change_LadieDadie+1),hl ld (hl),'A' ld hl,InfoScreen_EditText call Info ; show info/no title/no wait ld hl,Msg_GiveFirstChar call D_ZT_STR_Shortcut UnHideLoop: _Change_LadieDadie: ld hl,$ABCD ; will change ld bc,$0806 call ChangeChar cp $FF ; enter pressed jp z,ProgramLoop jr UnHideLoop HideUnHideTIOSOnly: call GetAddress dec hl dec hl dec hl dec hl ld a,(hl) cp 65 jr c,UnHideTheProgram ld (hl),$40 ld hl,InfoScreen_HideCrash call InfoWaitStandardTitle jp ProgramLoop LockUnlock: call GetAddress ld a,(hl) cp 5 jr z,NotLocked Locked: dec (hl) ; (hl) goes from $06 to $05 ld hl,InfoScreen_Unlocked jr LockUnlock_Done NotLocked: inc (hl) ; (hl) goes from $05 to $06 ld hl,InfoScreen_Locked LockUnlock_Done: call InfoWaitStandardTitle jp ProgramLoop EditProgName: ld hl,InfoScreen_EditText call Info ; show info/no title/no wait ld hl,Msg_EditProgName call D_ZT_STR_Shortcut call GetAddress dec hl dec hl dec hl ld a,(hl) ; name length ld (_Change_CheckLength+1),a dec hl push af \ PUSH hl ;----------------------- ld b,a ld de,TEXT_MEM call CopyNameLoop xor a ld (de),a ld bc,$0406 ;** ld (CURSOR_POS),bc ld hl,TEXT_MEM push hl \ call D_ZT_STR_Shortcut \ pop hl CPN_ChangeLoop: PUSH BC \ PUSH HL call ChangeChar ld bc,(_Change_CursorPos+1) inc c ld (CURSOR_POS),bc PUSH AF ld a,$20 ; space call TR_CHARPUT_Shortcut POP AF POP HL \ POP BC cp $FF ; enter jr z,CPN_Done cp $FD ; left jr z,CPN_ToLeft CPN_ToRight: ; if not $FF or $FD, it's automatically $FE _Change_CheckLength ld a,0 add a,3 ;** (4-1) cp b ; b = selected char jr z,CPN_ChangeLoop inc b inc hl jr CPN_ChangeLoop CPN_ToLeft: ld a,4 ;** cp b ; b = selected char jr z,CPN_ChangeLoop dec b dec hl jr CPN_ChangeLoop CPN_Done: ; write inverse copy ;----------------------- POP HL \ POP AF ld b,a ld de,TEXT_MEM CPN_ProgramCopyLoop2 : ld a,(de) ld (hl),a inc de dec hl djnz CPN_ProgramCopyLoop2 jp ProgramLoop ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; GetAddress ; purpose: gets the address of the VAT ENTRY ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ GetAddress: Selection: ld a,1 ;will change ld hl,APD_BUF+628 ld de,2 ld b,a Calculate_Address_Loop: add hl,de djnz Calculate_Address_Loop jp LD_HL_MHL ; call and ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; MakeProgramList ; purpose : makes a list with the program names from APD_BUF+18 on ; and a list with their according VAT_Addressed from ; APD_BUF+630 on (max 68 programs) ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MakeProgramList: ld hl,APD_BUF+18+19 ;**; +19 added ld (_Change_ProgramPointer+1),hl ld hl,APD_BUF+630+2 ;**; +2 added ld (_Change_AddressPointer+1),hl ld hl,VAT_START ; pointer to the start of the VAT MPL_Loop: ld a,(ENTRIES) ; check if max. nr of entries reached cp 68 ret z ld de,(LASTVAT) ; check if this is last entry push hl call CP_HL_DE pop hl jr z,MPL_LastEntry jr c,MPL_LastEntry ld a,(hl) ; check if program and $0F sub 5 ; cp 5 call z,MPL_Program dec a ; cp 6 call z,MPL_Program MPL_Next: ld de,-6 add hl,de jr MPL_Loop MPL_LastEntry: ld a,(hl) ; check if program and $0F cp 6 jr z,MPL_Program cp 5 ret nz MPL_Program: push af \ push hl ld d,h \ ld e,l _Change_AddressPointer: ld hl,$ABCD ; will change ld (hl),e inc hl ld (hl),d inc hl ld (_Change_AddressPointer+1),hl pop hl \ push hl dec hl ;-> Addr1 dec hl ;-> Addr2 dec hl ;-> name size ld b,(hl) ld c,b dec hl ;-> first char of name _Change_ProgramPointer: ld de,$ABCD ; will change call CopyNameLoop xor a ld (de),a inc de ld h,d \ ld l,e ld (_Change_ProgramPointer+1),hl ld hl,ENTRIES inc (hl) pop hl ld a,c ; name length sub 2 ; a=a-2 Jp M,Minus ; if result is negative, we have to add ld e,a ld d,0 or a ; reset carry sbc hl,de pop af ret Minus: neg ; to get the positive equivalent ld e,a ld d,0 add hl,de pop af ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Copies b bytes from hl (stored backwars) to de ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ CopyNameLoop: ld a,(hl) ld (de),a inc de dec hl djnz CopyNameLoop ret ;Þ E N D ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÞÜÜÜÜÜÜÜÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Fill Graph_Mem with $00 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Clear_GRAPH_MEM: push hl \ push de ld hl,GRAPH_MEM ld de,GRAPH_MEM+1 ld bc,767 ld (hl),0 ldir pop de \ pop hl ret ;Þ E N D ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÞÜÜÜÜÜÜÜÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Menu Subroutine v1.2 by Wouter Demuynck (kadem@unicall.be) ; [ THIS ROUTINE HAS BEEN CHANGED FOR ATTRIB !! ] ; [ FOR THE ORIGINAL ROUTINE, SEE MENUROUT.ZIP AVAILABLE ] ; [ AT WWW.TICALC.ORG (TI82 ROUTINES) AND ON MY HOMEPAGE ] ; [ HTTP://UC2.UNICALL.BE/KADEM/TI82/ ] ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Menu2: xor a Menu: ld (_Change_Switch+1),a push hl ld hl,APD_BUF+628 ld (_Change_Address+1),hl pop hl ; make sure menu text goes to GRAPH_MEM ; set 7,(IY+$14) ; get number of entries and initiate selected choice ld d,(hl) ; d contains number of entries, e will contain number ; of chosen entry inc hl ; HL points to title address ld e,1 ; to say that the first choice is selected, E=1 ; save title addr for later use ld (_Menu_Change1+1),hl ; first screen option selected ! ld a,e ; ld a,1 ld (_Menu_Change2+1),a ; jump there to make hl point to first entry ld b,e ; ld b,1 jp Menu_OneLevelDown ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; show 9 entries on screen without destroying hl Menu_ShowEntries: ; Clear Graph_Mem call Clear_GRAPH_MEM push hl \ push de ld e,1 ; to check if we reached last entry to show (if <9) ld bc,$0201 ld (CURSOR_X),bc ld b,9 ; 9 progs to show \MenuShow9Entries_Loop: ld a,(CURSOR_Y) add a,$06 ld (CURSOR_Y),a ld a,1 ld (CURSOR_X),a call D_ZM_STR_Shortcut ; show title _Change_Switch: ld a,1 or a jr z,NoHidThingies ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ push hl \ push af ld a,70 ld (CURSOR_X),a _Change_Address ld hl,$ABCD ; Will change CALL LD_HL_MHL ; hl = address of VAT entry ld a,h ;**; or l ;**; if HL=0000 (first entry), don't show stuff jr z,Dontshowfirstone ;**; ld a,(hl) PUSH AF dec hl ; -> addr 1 dec hl ; -> addr 2 dec hl ; -> name length dec hl ; -> first char ld a,(hl) cp 65 jr c,WriteHidden ld hl,MsgNotHidden jr WriteItHidden WriteHidden: cp $40 jr z,WriteTIOShiddenOnly ld hl,MsgHidden jr WriteItHidden WriteTIOShiddenOnly: ld hl,MsgHiddenTIOS WriteItHidden: call D_ZM_STR_Shortcut ld a,85 ld (CURSOR_X),a POP AF and $0F cp 5 jr z,WriteNotProtected ld hl,MsgProtected jr WriteItProtected WriteNotProtected: ld hl,MsgNotProtected WriteItProtected: call D_ZM_STR_Shortcut Dontshowfirstone: ld hl,(_Change_Address+1) inc hl inc hl ld (_Change_Address+1),hl pop af \ pop hl ;/////////////////////////////// ;/////////////////////////////// NoHidThingies: ld a,e cp d ; last entry just shown ? jr z,Menu_EndShowEntries inc e djnz MenuShow9Entries_Loop Menu_EndShowEntries: ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\< ld de,-18 ld hl,(_Change_Address+1) add hl,de ld (_Change_Address+1),hl ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\< pop de \ pop hl Menu_OK: call Menu_Invert call CR_GRBCopy push hl ld hl,0 ld (CURSOR_POS),hl _Menu_Change1: ld hl,$ABCD ; will change! (title addr) call D_ZT_STR_Shortcut ; show title pop hl Menu_WaitKey: push hl \ push de call CR_KHAND pop de \ pop hl sub 3 ; cp K_UP (3) jr z,Menu_UpKeyPressed dec a ; cp K_DOWN (4) jr z,Menu_DownKeyPressed cp 2 ;cp K_CLEAR (6) jr z,Menu_ClearPressed cp 66 ;cp K_MODE (70) jr z,Menu_ModePressed cp 60 ;cp K_QUIT (64) jr z,Menu_ModePressed dec a ;cp K_ENTER (5) jr nz,Menu_WaitKey ld a,e ; return value of selected item in a ret Menu_ModePressed: ld a,$FE ret Menu_ClearPressed: ld a,$FF ret Menu_UpKeyPressed: ld a,e dec a ; are we on first entry ? jr z,Menu_WaitKey dec e ; yes there is a previous choice, select it call Menu_Invert ;ld a,(_Menu_Change2+1) dec a ; first entry on screen ? jr nz,Menu_VerticalChange ; no? -> don't scrol data Menu_OneLevelUp: ;inc b xor a cpdr cpdr inc hl inc hl ;\\\\\\\\\\\\\\\\\\\\\\\\\ push hl ld hl,(_Change_Address+1) dec hl dec hl jr Menu_OneLevelDown_Done Menu_DownKeyPressed: ld a,e cp d ; last entry jr z,Menu_WaitKey inc e ; yes there is a next choice, select is ! call Menu_Invert ;ld a,(_Menu_Change2+1) inc a cp 10 ; last entry on screen? jr nz,Menu_VerticalChange Menu_OneLevelDown: ;inc b ;ld bc,$00FF ; just to have a high number (b>$100) xor a cpir ; search for next zero byte and go 1 byte further ;\\\\\\\\\\\\\\\\\\\\\\\\\ push hl ld hl,(_Change_Address+1) inc hl inc hl Menu_OneLevelDown_Done: ld (_Change_Address+1),hl pop hl ;//////////////////////// jp Menu_ShowEntries Menu_VerticalChange: ld (_Menu_Change2+1),a jr Menu_OK ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Menu_Invert: push hl \ push de ld hl,GRAPH_MEM+24 ld de,12*6 _Menu_Change2: ld b,1 ; will contain number of screen entry to invert Menu_Invert_CalcAddr: add hl,de djnz Menu_Invert_CalcAddr ld b,12*7 Menu_Invert_Loop: ld a,(hl) xor $FF ld (hl),a inc hl djnz Menu_Invert_Loop pop de \ pop hl ld a,(_Menu_Change2+1) ; for later inc b ; for later ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; End of routine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Error_Interrupt: ld hl,InfoScreen_Error ; jp InfoWaitStandardTitle ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Info v0.1 by Wouter Demuynck (kadem@unicall.be) ; (http://uc2.unicall.be/kadem/ti82/) ; Input : HL -> address of data 'stream' ; Output : info placed on screen and wait for keypress ; Notes : Data format -> .db N ; Number of lines (without title/max 9) ; .db "Line 1",0 ;zero-terminated line string ; ... ; .db "Last Data Line (line N)",0 ; .db "Title",0 ;zero-terminated title string ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ InfoWaitStandardTitle: ;STNDRD TITLE ;WAIT ld de,InfoStillWait push de ld de,InfoStillStandardTitle push de Info: ;NO TITLE ;NO WAIT call Clear_GRAPH_MEM ; Clear Graph_Mem ld b,(hl) inc hl ld de,$0000 ld (CURSOR_POS),de ld de,$0201 ld (CURSOR_X),de Info_Loop: ld de,(CURSOR_X) ld e,$01 ld a,d \ add a,$06 \ ld d,a ld (CURSOR_X),de call D_ZM_STR_Shortcut djnz Info_Loop jp CR_GRBCopy ; call and ret InfoStillStandardTitle: ld hl,StandardInfoTitle InfoStillTitle: ; if a title D_ZT_STR_Shortcut: ROM_CALL(D_ZT_STR) ; print title ret InfoStillWait: jp CR_KHAND ; wait for key and return ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; End of routine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; TR_CHARPUT_Shortcut ; does a ROM_CALL(TR_CHARPUT) and returns ; D_ZM_STR_Shortcut ; does a ROM_CALL(D_ZM_STR) and returns ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ TR_CHARPUT_Shortcut: ROM_CALL(TR_CHARPUT) ret D_ZM_STR_Shortcut: ROM_CALL(D_ZM_STR) ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ChangeChar v0.11 by Wouter Demuynck (kadem@unicall.be) ; (http://uc2.unicall.be/kadem/ti82/) ; input : hl=Address of char, b=col, c=row ; output : (HL) changed ; A = $FF -> Enter pressed (or MODE/QUIT/CLEAR) ; $FE -> Right key pressed ; $FD -> Left key pressed ; Notes : ; Normal -> CAPS ; ALPHA + Char -> small chars ; 2ND + Number -> Number ; Up/Down -> Change byte (+$01 or -$01) ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ChangeChar: ld (_Change_CursorPos+1),BC ld (_Change_CharAddress+1),HL inc c ld (CURSOR_POS),bc ld a,$06 call TR_CHARPUT_Shortcut ChangeChar_Loop: _Change_CursorPos ld bc,$ABCD ; will change ld (CURSOR_POS),bc _Change_CharAddress ld hl,$ABCD ; will change ld a,(hl) PUSH HL call TR_CHARPUT_Shortcut CALL CR_KHAND POP HL cp K_QUIT jr z,CC_ENTERPRESSED cp K_CLEAR jr z,CC_ENTERPRESSED cp K_MODE jr z,CC_ENTERPRESSED cp K_ENTER jr z,CC_ENTERPRESSED cp K_LEFT jr z,CC_LEFTPRESSED cp K_RIGHT jr z,CC_RIGHTPRESSED cp K_UP jr z,CC_UP cp K_DOWN jr z,CC_DOWN CC_CHECKCHAR: ld hl,LetterTable ld bc,26+26+10 ; 42 letters to check CPIR ; do on in mem till (hl) = A(dec bc while doing this) jr nz,ChangeChar_Loop ld hl,(_Change_CharAddress+1) ld a,c cp 10 jr nc,CC_smallchar CC_NUMBER: ld a,'0' jr CC_CHANGEIT CC_smallchar: sub 10 ld c,a cp 26 jr nc,CC_BIGCHAR ld a,'a' jr CC_CHANGEIT CC_BIGCHAR: sub 26 ld c,a ld a,'A' CC_CHANGEIT: add a,c ld (hl),A ld bc,(_Change_CursorPos+1) ld (CURSOR_POS),bc call TR_CHARPUT_Shortcut CC_RIGHTPRESSED: ld a,$FE ret CC_UP: inc (hl) xor a or (hl) jr nz,ChangeChar_Loop CC_DOWN: dec (hl) xor a cp (hl) jr nz,ChangeChar_Loop jr CC_UP CC_ENTERPRESSED: ld a,$FF ret CC_LEFTPRESSED: ld a,$FD ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; End of routine ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; LetterTable : all keycodes for letters and chars used by ChangeChar ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ LetterTable: ; big letters (26) .db K_2,K_1,K_STO ;ZYX .db K_MINUS,K_6,K_5,K_4,K_LN ;WVUTS .db K_TIMES,K_9,K_8,K_7,K_LOG ;RQPON .db K_DIV,K_RPAREN,K_LPAREN,K_COMMA,K_SQR ;MLKJI .db K_POWER,K_TAN,K_COS,K_SIN,K_INVERSE ;HGFED .db K_PRGM,K_MATRIX,K_MATH ;CBA ; small letters (26) .db K_Z,K_Y,K_X,K_W,K_V,K_U,K_T,K_S .db K_R,K_Q,K_P,K_O,K_N,K_M,K_L,K_K .db K_J,K_I,K_H,K_G,K_F,K_E,K_D,K_C .db K_B,K_A ; numbers (10) .db K_n,K_Vn1,K_Un1,K_L6 ; 9876 .db K_L5,K_L4,K_L3,K_L2,K_L1,143 ; 543210 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Program Data ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Msg_Menutitle: .db $05,$05," Attrib 1.0 ",$CF,$CF,0 .db "About this program",0 MenuData_Program: .db 6 .db $05,$05,$05," " Menu_Data_ChangeProgramName .db "12345678"," " ; program name will go here (leave extra space!!) .db $CF,$CF,$CF,0 .db "Back to main",0 Msg_EditProgName: .db "Change Name",0 .db "(Un)Hide TI-OS/CrASH",0 .db "(Un)Lock",0 .db "(Un)Hide TI-OS only",0 .db "Patch CrASH v1.5",0 InfoScreen_Hide: .db 2 .db "Program is now hidden!",0 .db "(Both TI-OS and CrASH)",0 InfoScreen_HideCrash: .db 2 .db "Program is now hidden!",0 .db "(TI-OS Only)",0 InfoScreen_Error: .db 2 .db "Error !",0 .db "Please disable interrupts",0 InfoScreen_Locked: .db 1 .db "Program is now locked",0 InfoScreen_Unlocked: .db 1 .db "Program is now unlocked",0 InfoScreen_SystemProgram: .db 3 .db "This is a system program",0 .db "You are not allowed to",0 .db "change it.",0 InfoScreen_Author: .db 8 .db "Attrib v1.0",0 .db "by Wouter Demuynck",0 .db "wouter.demuynck@",0 .db "student.kuleuven.ac.be",0 .db 0 .db "TI-82 ASM Corner",0 .db "http://uc2.unicall.be/",0 .db " kadem/ti82/",0 InfoScreen_EditText .db 4 .db "UP/DOWN -> change content",0 .db "LETTERS -> caps",0 .db "ALPHA+LETTERS -> no caps",0 .db "2ND+NUMBERS -> numbers",0 InfoScreen_PatchNotSuccessfull: .db 4 .db "Error while trying to apply",0 .db "patch. Possible causes :",0 .db "- CRASH v1.5 not installed",0 .db "- Patch already installed",0 InfoScreen_PatchSuccessfull: .db 1 .db "Patch successfully applied",0 StandardInfoTitle: .db $05,$05,$05,"Info",0 MsgHiddenTIOS: .db "T",0 MsgHidden: .db "H",0 MsgNotHidden: .db "NH",0 MsgProtected: .db "P",0 MsgNotProtected: .db "NP",0 Msg_GiveFirstChar: .db $05,"Give first char",0