;Utility routines include "settings.inc" include "ti83plus.inc" include "equates.inc" SEGMENT Main GLOBALS ON INewLine: push af push de push bc push hl push ix B_CALL NewLine pop ix pop hl pop bc pop de pop af ret COMMENT ~ Unused stuff from testing MakeOffPageCall: push hl ld hl,mopcStart ld de,ramCode ld bc,mopcEnd-mopcStart ldir pop hl jp ramCode mopcStart: ld (83EBh),a in a,(6) push af ld a,(83EBh) out (6),a call doJump-mopcStart+ramCode pop bc ld a,b out (6),a ret doJump: jp (hl) mopcEnd: sDeviceDescriptor: DB 80h,06h,00h,01h,00h,00h,08h,00h ClearOutputBuffer: push hl ld hl,0 ld (9C2Bh),hl ld (9C2Dh),hl ld (9C2Fh),hl pop hl ret WaitTimer40ms: ld b,4 jr WaitTimerBms WaitTimer20ms: ld b,2 WaitTimerBms: push hl ld a,42h WaitTimer_sub: out (36h),a xor a out (37h),a ld a,b out (38h),a ld hl,0 $$: inc hl in a,(4) bit 7,a jr z,$B pop hl ret IsNAKOrStall: xor a out (8Eh),a in a,(91h) bit 4,a ret nz bit 2,a ret GetControlData8: ld hl,9C31h ld b,8 $$: in a,(0A0h) ld (hl),a inc hl djnz $B dec hl ld a,(hl) ld (9C7Ah),hl inc hl ret GetDeviceDescriptor: ld a,80h ld (9C29h),a ld a,6 ld (9C2Ah),a ld a,1 ld (9C2Ch),a call MySendControlData ld de,0FFFFh gddLoop1: dec de ld a,d or e scf ret z in a,(82h) and 1 jr z,gddLoop1 ld a,'Z' call IPutC call IsNAKOrStall scf ret nz ld a,'A' call IPutC ld a,20h out (91h),a ld de,0FFFFh gddLoop2: dec de ld a,d or e scf ret z in a,(82h) and 1 jr z,gddLoop2 call IsNAKOrStall scf ret nz ld a,'B' call IPutC call GetControlData8 xor a out (8Eh),a ld a,42h out (91h),a ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(82h) and 1 jr z,$B call IsNAKOrStall scf ret nz xor a ret MySendControlData: ld a,(9C75h) res 5,a ld (9C75h),a ld hl,9C29h ld b,8 $$: ld a,(hl) out (0A0h),a inc hl djnz $B xor a out (8Eh),a ld a,0Ah out (91h),a or a ret MyHostInit: in a,(4Ch) cp 5Ah ret z cp 1Ah ret z in a,(4Dh) bit 5,a jr z,$F ld a,10h out (57h),a $$: xor a out (4Ch),a ld a,1 out (5Bh),a xor a in a,(4Ch) ld a,2 out (54h),a ld a,20h out (4Ah),a call ScrewWithPowerPorts ld de,0FFFFh crazyLoopback: $$: dec de ld a,d or e scf ret z or a in a,(4Ch) bit 0,a jr nz,bizarreOutputs cp 12h jr z,$F cp 52h jr nz,$B $$: in a,(4Dh) bit 5,a jr z,tryNewCode call LotsOfStuff ret c ld a,90h out (57h),a jr $F tryNewCode: call NewCode $$: ld a,0FFh out (87h),a xor a out (92h),a in a,(87h) ld a,0Eh out (89h),a ld a,0A1h out (8Bh),a in a,(86h) ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(81h) and 40h jr z,$B ld a,55h in a,(8Fh) bit 2,a jr z,crazyLoopback call WaitForFrameCounter ret c set 0,(iy+41h) xor a out (5Bh),a call Port80h81hOutputs xor a ret bizarreOutputs: set 0,(iy+41h) ld a,1 out (5Ah),a in a,(5Ah) ld a,2 out (8Eh),a ld a,22h out (98h),a ld a,48h out (91h),a ld a,2 out (90h),a xor a out (87h),a out (89h),a out (8Bh),a out (5Bh),a ld a,10h out (92h),a in a,(92h) nop nop nop ld a,7 call IPutC xor a ret ScrewWithPowerPorts: xor a out (4Bh),a call Bit3Port3A jr z,$F ld a,20h out (4Bh),a $$: xor a out (54h),a ld b,1 call WaitTimerBms call Bit3Port3A jr z,$F ld a,44h out (54h),a $$: ld a,0C4h out (54h),a ret Port80h81hOutputs: ld a,8 out (81h),a ld a,37h in a,(81h) call WaitTimer20ms xor a out (81h),a call WaitTimer40ms xor a out (80h),a ret Bit3Port3A: in a,(3Ah) bit 3,a ret WaitForFrameCounter: ld b,5 frameCounterLoop: ld de,0FFFFh $$: dec de ld a,d or e jr z,expired in a,(8Ch) or a jr z,$B ret expired: djnz frameCounterLoop scf ret LotsOfStuff: in a,(4Dh) bit 5,a jr z,retZ ld a,(9C28h) cp 3 jr z,retZ call EvenMoreStuff ret c ld a,4 ld (9C28h),a xor a out (5Bh),a out (8Bh),a ld b,32h call WaitTimerBms ld a,3 out (8Fh),a in a,(8Fh) in a,(4Ch) ld a,0F7h out (8Bh),a ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(86h) bit 4,a jr z,$B call WaitTimer20ms in a,(81h) and 0F7h out (81h),a call Port80h81hOutputs retZ: in a,(8Fh) xor a ret EvenMoreStuff: call Bit3Port3A jr z,maybeBattsLow ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(4Dh) bit 6,a jr nz,$B ld a,27h out (50h),a in a,(3Ah) and 0FCh or 4 out (3Ah),a in a,(39h) or 7 out (39h),a in a,(4Fh) and 0BFh or 88h out (4Fh),a call WaitTimer20ms in a,(4Fh) and 37h out (4Fh),a in a,(3Ah) and 0F8h out (3Ah),a in a,(39h) or 7 out (39h),a ld a,8 out (4Ch),a ld a,1 out (8Fh),a ld b,2 emsLoop1: ld de,0FFFFh $$: dec de ld a,d or e jr z,expired2 in a,(4Dh) bit 6,a jr z,$B jr emsDone expired2: djnz emsLoop1 scf ret emsDone: in a,(39h) and 0F8h out (39h),a or a ret maybeBattsLow: ld a,8 out (4Ch),a ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(81h) bit 5,a jr nz,$B ld a,1 out (8Fh),a jr WaitTimer20ms NewCode: in a,(4Dh) bit 5,a ret nz call Bit3Port3A jr z,maybeBattsLow ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(4Dh) bit 6,a jr nz,$B in a,(3Ah) and 0FDh out (3Ah),a in a,(39h) or 2 out (39h),a ld a,8 out (4Ch),a ld a,1 out (8Fh),a ld de,0FFFFh $$: dec de ld a,d or e scf ret z in a,(4Dh) bit 6,a jr z,$B in a,(39h) and 0FDh out (39h),a ret ~ SoftKey: push hl ld bc,7 ld de,95*256+7 ld h,1 B_CALL ILine ld b,19 ld d,b ld e,0 B_CALL ILine ld b,38 ld d,b B_CALL ILine ld b,57 ld d,b B_CALL ILine ld b,76 ld d,b B_CALL ILine ld b,0 ld d,b B_CALL ILine ld b,95 ld d,b B_CALL ILine pop hl ld a,57 ld (penRow),a ld a,3 SoftKeyLoop: ld (penCol),a push af call vputstring pop af add a,19 cp 98 jr nz,SoftKeyLoop ret IPutS11: push hl ld b,11 $$: ld a,(hl) B_CALL PutC inc hl djnz $B pop hl ret ;Draws horizontal dotted line ;Input: bc = (x,y) coordinate of first point (lower left corner is (0,0)) ; e = column to stop at ;Output: line drawn FunkyLine: ld d,1 FunkyLine_Loop: B_CALL IPoint inc b inc b ld a,b cp e jp m,FunkyLine_Loop ret vputstring: ld a,(hl) inc hl or a ret z B_CALL VPutMap jr vputstring DispA: push hl ld c,-1 DispA_loop: inc c sub 10 jr nc,DispA_loop add a,10 push af ld a,c add a,'0' B_CALL VPutMap pop af add a,'0' B_CALL VPutMap pop hl ret IGetKey: push ix push bc push de push hl res onInterrupt,(iy+onFlags) B_CALL GetKey pop hl pop de pop bc pop ix ret IPutSUnicode: ;Display a unicode string descriptor ld b,(hl) inc hl inc hl dec b dec b $$: ld a,(hl) or a call nz,IPutC inc hl djnz $b ret PutSApp: IPutS: ld a,(hl) inc hl or a ret z call IPutC jr IPutS IPutC: push hl ;don't think these are necessary push bc B_CALL PutC pop bc pop hl ret Var TempNum,2 GetHexA: ;lets user input an 8 bit number in hexadecimal ;prompt is at currow,curcol ;number is returned in a set curAble,(iy+curFlags) ld b,2 ld hl,TempNum getnumhloop: call IGetKey cp 2 jp nz,gnhnotback ld a,b cp 2 jp z,gnhnotback ld a,' ' B_CALL PutMap ld hl,curCol dec (hl) jp GetHexA gnhnotback: sub 142 cp 10 jp c,gnhnumpressed sub 12 cp 6 jp c,gnhletpressed jp getnumhloop gnhnumpressed: ld (hl),a inc hl add a,48 call IPutC djnz getnumhloop jp gnhdone gnhletpressed: add a,10 ld (hl),a inc hl add a,55 call IPutC djnz getnumhloop gnhdone: dec hl ld b,(hl) dec hl ld a,(hl) rlca rlca rlca rlca or b res curAble,(iy+curFlags) ret DispHexHL: push af push bc push de push hl push ix ld a,h call DispHexA ld a,l call DispHexA pop ix pop hl pop de pop bc pop af ret DispHexA: push de push ix push af push hl push bc push af rrca rrca rrca rrca call dispha pop af call dispha pop bc pop hl pop af pop ix pop de ret dispha: and 15 cp 10 jp nc,dhlet add a,48 jp dispdh dhlet: add a,55 dispdh: call IPutC ret ;DialogBox ; Input ; (H,L) = (y,x) upper left ; (D,E) = (y,x) lower right ;H and l must be >= 1 ;D must be <= 62 ;E must be <= 93 ;Text inside the box must be displayed manually DialogBox: push hl push de dec h dec l inc d inc d inc e inc e B_CALL EraseRectBorder pop de pop hl push hl push de B_CALL DrawRectBorderClear pop de pop hl push hl push de inc d inc e B_CALL DrawRectBorder pop de pop hl ld a,h xor 63 ;Adjust for funny IPoint coordinates ld h,a ld a,d xor 63 ld b,l ld c,h ld d,0 B_CALL IPoint ;(b,c) = (x,y xor 63) - upper left ld b,e B_CALL IPoint inc b B_CALL IPoint dec c B_CALL IPoint ld c,a dec c B_CALL IPoint ld b,l B_CALL IPoint inc b B_CALL IPoint dec b inc c B_CALL IPoint ret VStrLen: ld b,0 VStrLen_Loop: ld a,(hl) or a ret z push hl ld h,0 ld l,a add hl,hl add hl,hl add hl,hl push bc B_CALL SFont_Len ld a,b pop bc pop hl inc hl add a,b ld b,a jr VStrLen_Loop fastCopy: di ld hl,plotsscreen ld b,64 ld a,07h out (10h),a ld a,80h-1 layerloop1: push bc ld b,0Ch inc a ld (OP1),a call lcddelay out (10h),a call lcddelay ld a,20h out (10h),a layerloop2: ld a,(hl) call lcddelay out (11h),a inc hl djnz layerloop2 pop bc ld a,(OP1) djnz layerloop1 ld a,5 call lcddelay out (10h),a ei ret lcddelay: push af lcddelayloop: in a,(2) and 2 jr z,lcddelayloop pop af ret fixVarNames: ;Converts TI-OS style variable name in OP1 to ASCIIZ ld a,(OP1) cp 01h ;list jr z,fixList cp 0Dh jr z,fixList cp 02h ;matrix jr z,fixMatrix cp 03h ;equation jr z,fixEquation cp 04h jr z,fixString cp 07h jr z,fixPicture cp 08h jr z,fixGDB ret fixList: ld a,(OP1+2) cp 10 jp p,fixNamedList add a,31h ld (OP1+2),a ld a,'L' ld (OP1+1),a ret fixNamedList: ld a,LlistL ld (OP1+1),a ret fixMatrix: ld a,(OP1+2) inc a ld hl,sMatrixTable-4 ld de,4 ld b,a f_m_1: add hl,de djnz f_m_1 ld de,OP1+1 ld bc,4 ldir ret sMatrixTable: DB 0C1h,"A",5Dh,0 DB 0C1h,"B",5Dh,0 DB 0C1h,"C",5Dh,0 DB 0C1h,"D",5Dh,0 DB 0C1h,"E",5Dh,0 DB 0C1h,"F",5Dh,0 DB 0C1h,"G",5Dh,0 DB 0C1h,"H",5Dh,0 DB 0C1h,"I",5Dh,0 DB 0C1h,"J",5Dh,0 fixPicture: ld a,(OP1+2) inc a ld hl,sPictureTable-5 ld de,5 ld b,a f_p_1: add hl,de djnz f_p_1 ld de,OP1+1 ld bc,5 ldir ret sPictureTable: DB "Pic1",0 DB "Pic2",0 DB "Pic3",0 DB "Pic4",0 DB "Pic5",0 DB "Pic6",0 DB "Pic7",0 DB "Pic8",0 DB "Pic9",0 DB "Pic0",0 fixGDB: ld a,(OP1+2) inc a ld hl,sGDBTable-5 ld de,5 ld b,a f_gdb_1: add hl,de djnz f_gdb_1 ld de,OP1+1 ld bc,5 ldir ret sGDBTable: DB "GDB1",0 DB "GDB2",0 DB "GDB3",0 DB "GDB4",0 DB "GDB5",0 DB "GDB6",0 DB "GDB7",0 DB "GDB8",0 DB "GDB9",0 DB "GDB0",0 fixEquation: ld a,(OP1+2) cp 7Fh jp p,fixEquation_s cp 3Fh jp p,fixEquation_r cp 1Fh jp p,fixEquation_l sub 10h ld hl,sEquTableY-3 inc a ld b,a ld de,3 fe_y_1: add hl,de djnz fe_y_1 ld de,OP1+1 ld bc,3 ldir ret sEquTableY: DB "Y",81h,0 DB "Y",82h,0 DB "Y",83h,0 DB "Y",84h,0 DB "Y",85h,0 DB "Y",86h,0 DB "Y",87h,0 DB "Y",88h,0 DB "Y",89h,0 DB "Y",80h,0 fixEquation_l: ld hl,sEquTableL-4 sub 20h inc a ld b,a ld de,4 fe_l_1: add hl,de djnz fe_l_1 ld de,OP1+1 ld bc,4 ldir ret sEquTableL: DB "X",81h,0Dh,0 DB "Y",81h,0Dh,0 DB "X",82h,0Dh,0 DB "Y",82h,0Dh,0 DB "X",83h,0Dh,0 DB "Y",83h,0Dh,0 DB "X",84h,0Dh,0 DB "Y",84h,0Dh,0 DB "X",85h,0Dh,0 DB "Y",85h,0Dh,0 DB "X",86h,0Dh,0 DB "Y",86h,0Dh,0 fixEquation_s: sub 80h add a,75h ld (OP1+1),a xor a ld (OP1+2),a ret fixEquation_r: ld hl,sEquTable-3 ld a,(OP1+2) sub 40h inc a ld b,a ld de,3 fe_r_1: add hl,de djnz fe_r_1 ld de,OP1+1 ld bc,3 ldir ret sEquTable: DB "r1",0 DB "r2",0 DB "r3",0 DB "r4",0 DB "r5",0 DB "r6",0 fixString: ld hl,sStrTable-5 ld a,(OP1+2) inc a ld b,a ld de,5 fs_1: add hl,de djnz fs_1 ld de,OP1+1 ld bc,5 ldir ret sStrTable: DB "Str1",0 DB "Str2",0 DB "Str3",0 DB "Str4",0 DB "Str5",0 DB "Str6",0 DB "Str7",0 DB "Str8",0 DB "Str9",0 DB "Str0",0 VEraseEOL: ld a,' ' B_CALL VPutMap ld a,(pencol) cp c jp m,VEraseEOL ret Traverse_symTable: ld hl,symTable inc a ld c,a tstBegin: push bc push hl ld bc,(pTemp) or a sbc hl,bc pop hl pop bc ret c jr nz,$F scf ret $$:ld a,(hl) and 1Fh ld b,a ld de,6 sbc hl,de ld e,3 cp AppVarObj jr z,tstMove1 cp ProgObj jr z,tstMove1 cp ProtProgObj jr z,tstMove1 cp TempProgObj jr z,tstMove1 cp 17h jr z,tstMove1 dec hl ld a,(hl) inc hl cp tVarLst jr nz,tstMove2 tstMove1: ld e,(hl) dec hl tstMove2: ld a,b ld b,e ld de,OP1 ld (de),a inc de tstCopy: ld a,(hl) ld (de),a inc de dec hl djnz tstCopy xor a ld (de),a ld a,(OP1) cp 17h jr z,$F cp ProgObj jr z,$F cp ProtProgObj jr z,$F cp AppVarObj jr z,$F or a jr z,tstReal jr tstContinue tstReal: ld a,(OP1+1) cp 5Ch jp p,tstBegin jr tstContinue $$:ld a,(OP1+1) cp 30h jp m,tstBegin tstContinue: ld a,(OP1) push hl call filterTypes pop hl jr c,tstBegin dec c jr nz,tstBegin ld hl,OP1 ld de,OP2 ld bc,11 ldir ret filterTypes: ld a,(OP1) ld b,a ld hl,bTypeTable filterTypesLoop: ld a,(hl) cp b ret z cp 0FFh jr z,$F inc hl jr filterTypesLoop $$:scf ret bTypeTable: DB 0,1,2,3,4,5,6,7,8,0Ch,0Dh,15h,0FFh cmpstr: ld a,(de) cp (hl) ret nz or a ret z inc de inc hl jr cmpstr cmpstrb: ld a,(de) cp (hl) ret nz inc de inc hl djnz cmpstrb xor a ret putsb: push bc push hl $$: ld a,(hl) B_CALL PutC inc hl djnz $B pop hl pop bc ret