writeBuffer: ;in a = char ld (lastkey), a ;zodat je bij edit van een andere grootte char de rest van buffer niet raar ziet worden(hij cleared gwon hele scherm) push af ld a, (bfLength) ld hl, (bfIX) cp l jr z, nietclear b_call (_clrlcdfull) nietclear: pop af bit insert, (iy + shiftflags) jr z, endInsert push af call blink ld a, (bfLength) ld hl, (bfIX) cp l jr z, notInsertLastChar inc a ld (bfLength), a dec a sub l ld b, 0 ld c, a;bc = l - ix ld d, 0 ld a, (bfLength) dec a ld e, a ld hl, buffer add hl, de;hl = l + buffer ld d, h ld e, l;de = l + buffer dec hl;hl = de - 1 lddr b_call (_clrlcdfull) notInsertLastChar: pop af endInsert: bit superScript, (IY + ShiftFlags);de '+' moet niet worden veranderd als het geen subscript of superscript is jr nz, a02 bit SubScript, (IY + ShiftFlags) jr nz, a02 jr writeBuffer_1 a02: cp $2d;'-' jr nz, a00 ld a, $8b a00: cp $2b;'+' jr nz, a01 ld a, $8a a01: bit superScript, (IY + ShiftFlags) jr z, writeBuffer_1 add a, 12 writeBuffer_1: ld hl, (bfIX) ld d, 0 ld e, l ld hl, buffer add hl, de ld (hl), a;write a naar buffer ld a, e inc a ld (bfIX), a ld de, (bfLength) cp e jr c, notLastChar jr z, notLastChar ld (bfLength), a notLastChar: ld a, (bfLength) cp 254;max length of buffer jr c, bflengthgood ld h, a ld a, (bfIX) cp h ld a, 3 jr nz, notlast ld (bfIX), a notlast: ld (bfLength), a bflengthgood: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dispBuffer: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set FracDrawLFont, (IY + FontFlags) ;op de plaats van de cursor zetten we een spatie, anders zien we bv bij Del 2 cursors(kan beter maar dan laten we de cursor knipperen, teveel moeite) ld hl, (blinkpenCol) ld (penCol), hl ld a, $20 b_call (_vPutMap) xor a ld (blinkCharBg), a;deze var wordt gereset zodat ie aant eind van buffer weet of hij de blinking pos al heeft gezet(of niet meer), volgens mij nu alleen om te kijken of de cursor op de eerste pagina staat ld hl, nr ld bc, 7 call clear ld a, (bf2ndpage) ld (nr), a ld h, a ld a, (prevNr) cp h jr z, goed ;call debuga ; ld b, h ;call debugb ld a, (inLoadMenu) or a jr nz, goed b_call (_clrlcdfull) ; call debuga goed: ld a, (nr) ld (prevNr), a ;CALL DEBUGA dispNext: ld a, (nr) inc a ld (nr), a dec a ld hl, (bfLength) cp l jr z, dispDone ld hl, buffer ld d, 0 ld e, a add hl, de ld a, (hl) cp $7b jr c, dispAlpha dispNum: cp $8c jr c, dispSub dispSuper: ld e, 1 sub 12 jr dispNowNum dispSub: ld e, 2 jr dispNowNum dispAlpha: ld e, 0 jr dispNow dispNowNum:;font code van + en - moeten goed gezet worden cp $8a jr nz, notPlus ld a, $2b notPlus: cp $8b jr nz, dispNow ld a, $2d dispNow: call dispChar jr dispNext dispDone: ;ret ld a, (bfIX) cp 255 jr z, inMenu ld a, $20;space voor de blinker call dispChar call blink inMenu: ret dispChar: push af;a zit char code in ld a, e or a jr z, dispCharAlpha cp 1 jr z, dispCharSuper cp 2 jr z, dispCharSub dispCharAlpha: ld b, 6 pop af push af cp $1c;-> jr z, spacing1 cp $2b;+ jr nz, geenSpacingNodig ld a, 2;spacing jr spacing spacing1: ld a, 4 spacing: ld d, 0 ld e, a add a, b ld b, a ld hl, (posDefault) add hl, de ld (posDefault), hl geenSpacingNodig: ld e, b;length ld hl, posDefault ld a, 3;vertical jr dispCharEnd dispCharSuper: ld a, 0 ld e, 4 ld hl, posSuper jr dispCharEnd dispCharSub: ld a, 7 ld e, 4 ld hl, posSub dispCharEnd: ld (posVertical), a ;ld a, e ;ld (posLength), a ld (posAtm), hl ld c, (hl) inc hl ld b, (hl);bc = pos ld h, b ld l, c;hl = pos push hl ld d, 0;de = length char add hl, de;hl = new pos ld b, h ld c, l;bc = new pos ld hl, (posAtm) ld a, c ld (hl), a ld a, b inc hl ld (hl), a;pos is geupdate ld a, (posVertical);wilt weten of t alpha of sub/super script is, vertical=3 betekent alpha cp 3 jr z, alphaChar res fracDrawLFont, (IY + FontFlags) ;posDefault = max(posSuper, posSub) ld hl, (posSuper) ld bc, (posSub) or a sbc hl, bc jr c, superBigger ld bc, (posSuper) superBigger: ld h, b ld l, c ld (posDefault), hl ; jr alphaCharEnd alphaChar: set fracDrawLFont, (IY + FontFlags) ld hl, (posDefault) ld (posSuper), hl ld (posSub), hl alphaCharEnd: pop hl ld d, 90 ;ld hl, 100 call hldivd ;poging om de atoms op eeen nieuwe regel goed uit te lijnen, twerkt opzich wel met 2 kleine bugs(als ie te ver weg is doet ie t aslnog niet, als je sub en super gebruikt zal de defaultpos twee keer kleine worden gemaakt) ;en tmoet natuurlijk gwon anders, de molecuul moet gwon helemaal op een nieuwe pagina ;slecht geprogrammeerd ;jr hoeftnietnaarlinks ld d, 4 ld e, a;backup ld a, (var+6) cp 3 jr nz, laatstecharissubofsuper inc d inc d laatstecharissubofsuper: ld a, e;restore cp d jr nc, hoeftnietnaarlinks push hl ld hl, (posDefault) ld d, 0 ld e, a or a sbc hl, de ld (posDefault), hl ld a, (posVertical) or a jr nz, alphasupersub1 ld hl, (posSuper) or a sbc hl, de ld (posSuper), hl jr alphasupersub2 alphasupersub1: cp 7 jr nz, alphasupersub2 ld hl, (posSub) or a sbc hl, de ld (posSub), hl alphasupersub2: ld a, (posVertical) cp 3 jr nz, nietnormalchar ld hl, (posDefault) ld (posSuper), hl ld (posSub), hl nietnormalchar: xor a pop hl hoeftnietnaarlinks: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld (penCol), a ld b, l ld a, (posVertical) nextRow: add a, 16 djnz nextRow ;voor bug in menu(cl002) ld b, a;backup ld a, (bfIX) cp 255 jr nz, notinmenu ld a, b cp 45 jr c, notinmenu pop af;junk ret notinmenu: ld a, b cp 52 jr nc, endofscreen ld (penRow), a pop af push af ld a, (nr) ld hl, (bfIX) dec a cp l jr nz, notBlinkingChar ;ld hl, (penCol) ;call debugHL ld hl, penCol ld de, blinkpenCol ld bc, 2 ldir pop af ld (blinkCharbg), a push af ld h, 0 ld l, a ld a, (IY + fontFlags) ld (blinkLfont), a ld h, 0 ld l, a ld a, (posVertical) ld (blinkChar), a notBlinkingChar: pop af b_call (_VPutMap) ;zodat ie weet welke char hij als laatst heeft gedisplayed ld a, (posVertical) ld (var+6), a;var+6 was nog niet in gebruik volgens mij ret endofscreen: ld a, (blinkCharBg) or a jr nz, dontgopage2 ld hl, posDefault ld bc, 5 call clear b_call (_clrlcdfull) ld a, (nr) dec a ld (nr), a ld (bf2ndpage), a ld (prevnr), a ld h, a ld a, (bfLength) cp h jr nz, notbug ld hl, $0300; als dit niet gebeurt dan zal als je hele scherm vol staat, je een leeg scherm zien met helemaal rechtonder de cursor, cursor moet links boven staan ld (blinkpenCol), hl notbug: dontgopage2: pop af ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; blink: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;descr display the cursor ;out FracDrawLFont, (IY + FontFlags) set when cursor is on sub/super script(otherwise reset) ld a, $e2 bit smallFont, (IY + ShiftFlags) jr z, blinkA add a, $01 blinkA: bit superScript, (IY + ShiftFlags) jr z, blinkB ld a, $ef blinkB: bit subScript, (IY + ShiftFlags) jr z, blinkC ld a, $f0 blinkC: bit other, (IY + ShiftFlags) jr z, blinkD ld a, $e0 blinkD: ld l, a ld a, (bfLength) ld h, a ld a, (bfIX) cp h ld a, l set FracDrawLFont, (IY + FontFlags) ld hl, (blinkpenCol) ld (penCol), hl ld h, a ld a, (blinklfont) bit fracdrawlfont, a ld a, h jr nz, lfont ld a, $e0 ;of; ;ld a, $06;cf ;set TextInverse, (IY + TextFlags) res FracDrawLFont, (IY + FontFlags) lfont: b_call (_vPutMap) res TextInverse, (IY + TextFlags) ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; font functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; resFont: ld a, (IY + ShiftFlags) and %10000111 ld (IY + ShiftFlags), a ;res tempState, (IY + asm_Flag1) ret toggleSmallFont: bit superScript, (IY + ShiftFlags) jr z,toggleSmallFontA res superScript, (IY + ShiftFlags) jr toggleSmallFontEnd toggleSmallFontA: bit subScript, (IY + ShiftFlags) jr z,toggleSmallFontB res subScript, (IY + ShiftFlags) jr toggleSmallFontEnd toggleSmallFontB: bit other, (IY + ShiftFlags) jr z,toggleSmallFontC res other, (IY + ShiftFlags) jr toggleSmallFontEnd toggleSmallFontC: bit smallFont, (IY + ShiftFlags) jr z, setSmallFont resSmallFont: res smallFont, (IY + ShiftFlags) jr toggleSmallFontEnd setSmallFont: set smallFont, (IY + ShiftFlags) toggleSmallFontEnd: call blink ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; buffer naar array ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; arSetup: ;in hl = start data ; bc = length data ld (arStart), hl dec hl ld (arPos), hl inc hl add hl, bc ld (arEnd), hl ret arGetNext: ;out a = byte ; z = set if end of array(a will also be set to 0 then) push hl push de ld hl, (arPos) inc hl ld (arPos), hl ld d, h ld e, l ld hl, (arEnd) cphlde;(cl006) jr nc, notpastendar call arBack jr endar notpastendar: jr nz, notendar endar: xor a or a jr argetnext_ notendar: ld a, 1 or a ld a, (de) argetnext_: pop de pop hl ret arBack: ; automatically never goes past start push hl push de push af ld hl, (arPos) dec hl ld (arPos), hl ld d, h ld e, l inc de ld hl, (arStart) cphlde jr c, arBack_ ld (arPos), hl arBack_: pop af pop de pop hl ret getNrOnArPos: ;out hl = nr on ar pos(subscript) push af push de push bc ld hl, (arPos) call bfint2bf2 call bf22c ld a, c or a jr nz, weleengetal ld c, 1 weleengetal: ld hl, stackTimes call stackGet;a=haakjes nummer, c=nummer na atoom ld d, 0 ld e, c call hlisaxde jp c, fatalOverflow pop bc pop de pop af ret getSuperNrOnArPos: ;out a = nr on ar pos(signed) push de push bc ;call arback ld hl, (arPos);(cl007) dec hl ld (arPos), hl call bfintsuper2bf2 push bc call bf22c ld a, c or a jr nz, weleengetal2 ld c, 1 weleengetal2: ld h, c;backup pop bc ld a, b or a jr z, pos xor a sub h ld h, a pos: ld a, h;restore pop bc pop de ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; buffer reading ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; bfFindNext: ;input staat allemaal in de variables bfpos, bfchar ;output a=gevonden char ; hl=pos gevonden char ;eerst gaan we kijken hoevaak de operatie nog kan worden herhaalt push de push bc ld hl, (bfpos) ld bc, buffer or a sbc hl, bc;hl = hoevaak ld a, l;h = alst goed is nul dus: l = hoevaak or a jr z, notfound1;stop als hij al bij begin buffer is add hl, bc;nu is hl weer (bfpos) ld b, a ld de, (bfchar);d = ene char, e = andere bfNext: dec hl ld a, (hl) cp d jr z, found1 cp e jr z, found1 djnz bfNext notfound1: xor a jr bfFindNext_ found1: ld (bfpos), hl;opslaan voor volgende keer bfFindNext_: pop bc pop de or a;z flag wordt gezet alvast ret bfint2bf2: ;in hl=pos van char voor getal ;del ? call strClear bfint2bf2loop: inc hl ld a, (hl) cp $8a jr nc, nietgoed;kan nog een super char zijn, dan stoppen we niet met lezen maar slaan hem over cp $7f jr c, helemaalnietgoed sub $80;a = getal van 0-10 call strWriteA jr bfint2bf2loop;(cl003) nietgoed: cp $99 jr nc, helemaalnietgoed jr bfint2bf2loop helemaalnietgoed: ret bfintsuper2bf2: ;out a = number ; b = pos(0)/neg(1) call strClear ld b, 0 bfintsuper2bf2loop: call argetnext cp $8c+12 jr nc, helemaalnietgoed2 cp $7f+12 jr c, nietgoed2;kan nog een sub char zijn, dan stoppen we niet met lezen maar slaan hem over sub $80+12;a = getal van 0-10 cp 10 jr c, nummer jr nz, eenmin ld b, 0 jr bfintsuper2bf2loop eenmin: ld b, 1 jr bfintsuper2bf2loop nummer: call strWriteA jr bfintsuper2bf2loop nietgoed2: cp $7f jr c, helemaalnietgoed2 jr bfintsuper2bf2loop helemaalnietgoed2: call arback ret bf22c: ;jr $ ld c, 0 bf22c_loop: call strReadA ret c ld d, a;backup ld a, c;load running total cp 26;gaat t nu keer 10 doen, dus zou dan 260 worden jp nc, fatalOverflow add a, a;a *= 10 add a, a;4xa add a, c;5xa add a, a;10xa add a, d;+new number jp c, fatalOverflow ld c, a jr bf22c_loop