#include "app.inc" ;zodat we een App kunnen maken ipv Prgm(dmv defpage() en validate()) #include "ti83plus.inc" ;hier staan voor alle woorden(in het donkerblauw) het bijbehorende getal ;wat macro's, 1 commando verbind je met meerdere andere commando's, zodat je die niet telkens hoeft in te typen ;bv: CPHLDE komt overeen met: ; OR A ; SBC HL, DE ; ADD HL, DE #define saveregs push af \ push hl \ push de \ push bc #define loadregs pop bc \ pop de \ pop hl \ pop af #define saveregsaf push hl \ push de \ push bc #define loadregsaf pop bc \ pop de \ pop hl #define cphlde or a \ sbc hl, de \ add hl, de #define cphlbc or a \ sbc hl, bc \ add hl, bc #define setf(xx) set xx, (iy + asm_flag1) #define resf(xx) res xx, (iy + asm_flag1) #define bitf(xx) bit xx, (iy + asm_flag1) ;'appBackUpScreen' en 'saveSScreen' zijn twee plekken in het RAM(768 bytes ieder) die de rekenmachine zelf niet gebruikt, dus die gebruiken wij ;hier staan allemaal variables die het programma gebruikt, en voor ieder een eigen plaats in het RAM ;let op: sommige gebruiken 1 byte, andere weer 256bytes(zoals 'buffer'), en sommige gebruiken dezelfde plaats in het RAM omdat ze niet tegelijk worden gebruikt ;UPDATE:savesscreen kan worden gedelete na APD dus alle longtime-vars in appbackupscreen ; buffer2 hoeft niet zo groot en kan in savess ; veelste veel vars op unieke plaatsen buffer = appBackUpScreen;256 buffer2 = appBackUpScreen+768-100;100;wordt gebruikt voor displayen messages, tijdelijk opslaan getallen string(bij equationread) menuStyle = appbackupscreen +768-100 menuItems = appbackupscreen +768-100+2;90 menuIndex = appbackupscreen +768-100+3 menuItemBegin = appbackupscreen +768-100+4 menuYstart = appbackupscreen +768-100+1 ;stackRoom = appBackUpScreen+766 bfIX = appBackUpScreen + 256;pos in the buffer ---LAAT DIT EERSTE BYTE ZIJN VAN AL DEZE VARS OVER DE BUFFER, IN KEYLOOP.Z80 bfLength = appbackupscreen + 256 + 11;length of buffer ;bf2Length = appbackupscreen + 256 + 17;length of buffer ---dit moet 2byte zijn, kan namelijk makkelijk de 255 overschrijden(gebruik wel andere var) bf2ndpage = appbackupscreen + 256 + 17;var die pos van buffer bijhoud bij welke die naar de volgende page switched nr = appbackupscreen + 256 + 1;what number hes displaying at dispBuffer prevNr = appbackupscreen + 256 + 133;voor bf2ndpage, dat ie weet wanneer gerefreshed moet worden inLoadMenu = appbackupscreen + 256 + 134;daar moet ie niet clrscreen doen bij bf2ndpage posDefault = appbackupscreen + 256 + 2;position of big font posSuper = appbackupscreen + 256 + 4;postition of super posSub = appbackupscreen + 256 + 6;sub posAtm = appbackupscreen + 256 + 8;just a var to backup the pos posVertical = appbackupscreen + 256 + 10;same blinkChar = appbackupscreen + 256 + 12;alpha, lower, super, sub, second, staat vertical offset in(dus 0=super,4=normal,7=sub) blinkCharBg = appbackupscreen + 256 + 13;the character behind the blinking cursor blinkpenCol = appbackupscreen + 256 + 14;pos of blinker blinkpenRow = appbackupscreen + 256 + 15 blinkLfont = appbackupscreen + 256 + 16;large or small font, in fracdrawlfont bit activeColumn = blinkChar sign = activeColumn + 1 addedInColumn = sign + 1 matRow = addedInColumn + 1 inHalf = matRow + 1 posorneg = appbackupscreen + 256 + 77;matrix.z80 var = appbackupscreen + 256 + 18;char die elke functie mag gebruiken var2 = appbackupscreen + 256 + 34 ;debugStack = appbackupscreen + 256 + 50 appvarstart = appbackupscreen + 256 + 121 arPos = appbackupscreen + 256 + 52 arStart = appbackupscreen + 256 + 54 arEnd = appbackupscreen + 256 + 56 tmp = appbackupscreen + 256 + 58 bb = appbackupscreen + 256 + 76 stackTimes = appbackupscreen + 256 + 89;stack met waardes van getal waarmee atomen moet worden verminigvuldigd als je niet naar de haakjes kijkt(voor elk haakje volgende waarde) stAtomNr = appbackupscreen + 256 + 95;stack with atom number stAtomQt = appbackupscreen + 256 + 101;stack with the quantity of the atom saved with the same index in stAtomNr stTblAtom = appbackupscreen + 256 + 108;used so we can save the stAtomNr and stAtomQt for each column in the matrix stTblAtomQt = appbackupscreen + 256 + 114 stTblAtomIx = stackTimes rij1en = appbackupscreen + 256 + 125;hoeveel rijen met 1en listLength = appbackupscreen + 256 + 128;hoeveel moleculen en antwoorden matDim = appbackupscreen + 256 + 107;height and width of Matrix A matSignChange = appbackupscreen + 256 + 120;place of ->(ab->a+b, matSignChange=1) prevPagePointer = appbackupscreen + 256 + 123 lastkey = appbackupscreen + 256 + 129 lkUp = 2 lkDown = 4 lkRight = 1 lkLeft = 3 lk2nd = 5 lkAlpha = 6 lkDel = 7 lastAction = appbackupscreen + 256 + 131 lastActionSet = appbackupscreen + 256 + 132 laSetSmall = 1 unarchived = appbackupscreen + 256 + 135;eiglijk maar 1 bit nodig ;volgende = appbackupscreen + 256 + 136 bfchar = appbackupscreen + 256 + 80 bfpos = appbackupscreen + 256 + 82 strWritePos = appbackupscreen + 256 + 84 strReadPos = appbackupscreen + 256 + 86 methode = appbackupscreen + 256 + 126;0 betekend dat we de vergelijking gaan oplossen, 1 betekend molmassa uirekenen(hebben we nodig zodat we geen verkeerde foutmeldignen gaan geven) ;methode1 chars(van molmassa.z80) methode1var = rij1en;hier zetten we xpos van de nummers die we displayen in activeRow = activeColumn;om te weten wanneer we xpos moeten veranderen ;methode2 chars(van zoekenintbl.z80) tblRow = appbackupscreen + 256 + 127;methode1var ; de hoeveelste row die is in tbl49(1,2 3,4 5,6) tblRowPos = tblRow + 1;2byte ; de pos in memory waar die row begint AtomMolecuulIx = tblRowPos + 2 ; de index in de stTblAtom(en stTblAtomQt) waar eerste atoom van molecuul staat tblRowLastFound = AtomMolecuulIx + 1 ; in welke row van tbl49 hij t laatste atom van t molecuul heeft gevonden(is 0 als ie nog geen atoms heeft gevonden) molecuulnietgevonden = tblRowLastFound + 1 ; 2 uses: 1= wanneer 1 atom van t molecuul niet gevonden is, wordt deze 1, dan weten we al dat hele molecuul niet kan worden gevonden ; DELETED 2= zodat ie t begin van volgende row kan vinden molecuulalgevonden = molecuulnietgevonden + 1 ; deze wordt 1 als er al een row gevonden is met dit molecuul, zodat we weten wanneer we "??" moeten printen(als helemaal niks gevonden wordt) searchmethod = molecuulalgevonden + 1 ; 0 = vind alleen of minstens alle atomen erin zitten ; 1 = vind alleen of minstens alle atomen erin zitten met minstens de quantity ; 2 = vind alleen als het hele molecuul overeenkomt(kijkt niet naar lading, wel bij redoxtabel) ;foundInLeftRow = 0;(IY + asm_Flag1) ; penColStart = searchmethod + 1 whichtbl = 0;(IY + asm_Flag1) stackNewPos = savesscreen + 766 stackEndPos = savesscreen + 764 stackEnd = savesscreen + 10 stackStartPos = stackNewPos - 3;op deze memory pos zit geen nummer, tis gwon een nummer waar de stack kan beginnen ;pointers ;;checkValidSolution ;matErows = var ;;matrix.z80 lastCol = var2 ;;global lastColLading = appbackupscreen + 256 + 130;zet in matrix.z80 nummer van de rij waar in de laatstecol lading voorkomt, wordt weer gebruikt in checkValidSolution.z80 ;pointers naar pointers ;de bits van (iy + fontflags) die we gebruiken voor verschillende standen van de cursor other = 3 smallFont = 4 subScript = 5 superScript = 6 insert = 7 ;tempState = 0;nieuw erbij gekomen, gebruik nu (IY + asm_Flag1) -- teveel werk, toch niet nodig maxAtoms = 10;maximum different atoms in one molecule defpage(0,"Balancer") ;BEGIN programma ld hl, stackEnd call stackInitialize;zodat we alle stack functies kunnen gebruiken ;call unarc;unarchive het bestand met alle opgeslagen vergelijkingen xor a ld (unarchived), a res AppTextSave, (IY + AppFlags) jp menu;ga naar menu ;EINDE PROGRAMMA _end: call arc;archive het bestand met alle opgeslagen vergelijkingen call resFont; alles zetten we weer goed, zodat we niet een raar scherm te zien krijgen als het programma eindigt ld hl, 0 ld (curRow), hl b_call (_ClrLCDFull) res fracdrawlfont, (iy + fontflags) b_jump (_JForceCmdNoChar);eindig het programma #include "F:\Asm\new\projects\atoms\menu.z80" ; alle functies die het menu gebruikt + het eerste menu #include "F:\Asm\new\projects\atoms\keyloop.z80" ; de loop die telkens wordt herhaald wanneer we een reactievergelijking invoeren met daaronder alle functies die worden gecalled wanneer er een bepaalde key wordt ingedrukt #include "F:\Asm\new\projects\atoms\buffer.z80" ; functies om naar de buffer(= de reeks van getallen waar de reactievergelijking instaat) te schrijven, de buffer en de cursor weer te geven, en wat functies om de cursor state te veranderen en buffer naar array te zetten #include "F:\Asm\new\projects\atoms\functions.z80" ; allemaal misc functies, ook veel reken functies(delen,keer) #include "F:\Asm\new\projects\atoms\menu2.z80" ; #include "F:\Asm\new\projects\atoms\equationRead.z80" ; #include "F:\Asm\new\projects\atoms\matrix.z80" #include "F:\Asm\new\projects\atoms\matrixMath.z80" #include "F:\Asm\new\projects\atoms\list.z80" #include "F:\Asm\new\projects\atoms\checkValidSolution.z80" #include "F:\Asm\new\projects\atoms\errors.z80" ; #include "F:\Asm\new\projects\atoms\load.z80" ; om de opgeslagen reactievergelijkingen te laden(je gaat hierheen als je in menu kiest voor Laad) ;#include "F:\Asm\new\projects\atoms\..\test\debug.z80" ; staan wat functies in die handig zijn bij het debuggen #include "F:\Asm\new\projects\atoms\atomsData.z80" ; alle atomen met hun massa + functie om van atoom naar atoomnr te gaan #include "F:\Asm\new\projects\atoms\stacks.z80" ; alle functies van de stack #include "F:\Asm\new\projects\atoms\convert.z80" ; om een nummer om te zetten in floating point nummer(kwam later achter dat het ook kon met setxxxxop2) #include "F:\Asm\new\projects\atoms\molmassa.z80" ; als je in het menu kiest voor molmassa #include "F:\Asm\new\projects\atoms\zoekenintbl.z80" #include "F:\Asm\new\projects\atoms\atomDetails.z80" ;wordt gebruikt bij het lezen van keypresses CharTable: .DB "WRMH", 0, 0, 0, 0 .DB "VQLG", 0, 0, 0 .DB "ZUPKFC", 0, 0 .DB "YTOJEB", 0, 0 .DB "XSNIDA" NumTable: .DB "+-", 0, 0, 0, 0, 0 .DB "-", $83, $86, $89, 0, 0, 0, 0, 0 .DB $82, $85, $88, 0, 0, 0, 0 .DB $80, $81, $84, $87 ;alle mogelijke foutmeldingen err: .db "ERROR: ",0 msgerrmem: .db "Not enough space",$f0,"to save the data.",0 nofilefound_msg: .db "No saved data",$f0,"found.",0 notfinishedmsg: .db "Doesnt work yet",0 atomnotfoundmsg: .db " Atom ",$27,"xx",$27," doesnt",$f0,"exists.",0 atomnotfoundmsg_: atomnotbothsides: .db " Atom ",$27,"xx",$27," not",$f0,"present on both sides",$f0,"of the ",$27,$1c,$27,".",0 atomnotbothsides_: errnoismsg: .db "Arrow ",$27,$1c,$27," not",$f0,"found.",$f0,$f0,"Use the ",$27,$56,$3d,$27," button to",$f0,"add one.",0 err2muchismsg: .db "Only one arrow",$f0,"allowed.",$f0,$f0,"Use the ",$27,"del",$27," button",$f0,"to remove one.",0 errbracketsmsg2: .db $f0,"Wrong number of brackets.",0 errbracketsmsg: .db "Brackets problem.",0 erroverflowmsg: .db "Overflow.",0 errunsolvablemsg: .db "No solution",$f0,"found.",$f0,$f0,$f0,"Probably because there",$f0,"are multiple separate",$f0,"reactions possible.",0 errunknownmsg: .db "Error occured.",0 errnotenoughrammsg: .db "Not enough ram.",0 errnotsolveablemsg: .db "Impossible",$f0,"reaction.",0 errwrong: .db "WARNING! This solution",$f0,"could be wrong.",0 ;alle normale berichten msgsaved: .db "Equation saved.",0 ;alle menu items item1: .db "NEW EQUATION",0 item2: .db "LOAD",0 item3: .db "EXIT",0 item4: .db "BALANCE EQUATION",0 item5: .db "OTHER FUNCTIONS",0 item6: .db "BACK",0 item7: .db "SAVE",0 item8: .db "EDIT",0 item9: .db "CALCULATE MOLAR MASSES",0 item10: .db "GET ACIDITY CONSTANTS",0 item11: .db "GET ELECTRODE POTENTIALS",0 item12: item13: ;.db "SHOW MOLECULES IN EQUATION",0 ;.db "EXACT SEARCH",0 .db "START SEARCH",0 item14: ;.db "SHOW ALSO GREATER MOLECULES WITH SAME AND MORE ATOMS",0 ;.db "INEXACT SEARCH",0 .db "SCAN BINAS",0 menutxt1: .db "Chemical Equation",$f6,"Balancer",0 menutxt3: .db "by",0 menutxt2: .db "RikSteenkamp@xs4all.nl",0 menutxt4: .db "Second option is useful if",$f0,"you got a binas and only",$f0,"a part of the molecule",0 ;.db "If you only have a part of",$f0,"the molecule use the",$f0,"optional search",0 ;namen van de matricen, lijsten en appvars matA: .db matobj, tvarmat, tmatA, 0 matB: .db matobj, tvarmat, tmatB, 0 matC: .db matobj, tvarmat, tmatC, 0 matD: .db matobj, tvarmat, tmatD, 0 matE: .db matobj, tvarmat, tmatE, 0 list1: .db listobj, tvarlst, ta, tt, to, tm, ts, 0 list6: .db RealObj, tVarLst, tL6, 0 appvar: .db appvarObj, "ATOMS001" ;misc zuur: .db " (A)",0 base: .db " (B)",0 ox: .db " (O)",0 red: .db " (R)",0 validate()