clear: ;in hl = begin ram to clear ; bc = length push de push af ld d, h ld e, l inc de xor a ld (hl), a ldir pop af pop de ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; sring method ; ; gebruikt bij: lezen van sub/super script getallen uit buffer naar register ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; strClear:;zet de str op positie net na einde buffer push hl ld hl, buffer ld a, (bflength) ld b, 0 ld c, a add hl, bc inc hl ld (strWritePos), hl ld (strReadPos), hl pop hl ret strWriteA: ;in a push hl push de ld hl, (strWritePos) ld (hl), a inc hl ld (strWritePos), hl pop de pop hl ret strReadA: ;out a ;c set=endbuffer(a=junk) push hl push de ld hl, (strReadPos) ld de, (strWritePos) or a sbc hl, de add hl, de jr nc, strReadA_ ld a, (hl) inc hl ld (strReadPos), hl strReadA_: ccf pop de pop hl ret aisbxc: ld a, b or a ret z xor a aisbxc_loop: add a, c jp c, fataloverflow djnz aisbxc_loop ret hldivd: ; hl = hl ÷ d, a = remainder push bc xor a ; clear upper eight bits of ahl ld b, 16 ; sixteen bits in dividend hldivd_loop: add hl, hl ; do a sla hl rla ; this moves the upper bits of the dividend into a jr c, hldivd_overflow cp d ; check if we can subtract the divisor jr c, hldivd_skip ; carry means d > a hldivd_overflow: sub d ; do subtraction for real this time inc l ; set bit 0 of quotient hldivd_skip: djnz hldivd_loop pop bc ret hlisaxde: ;in a, de ;out hl = a x de ;flag c = overflow ;del b, de, a ld hl, 0 ld b, 8 hlisaxde_loop: ;rrca;kunnen we niet gebruiken omdat we moeten letten op overflow, we moeten bit 7 telkens nul maken srl a;wel 2x zo langzaam als rrca jr nc, hlisaxde_nul add hl, de ret c;overflow hlisaxde_nul: sla e rl d jr c, hlisaxde_checkoverflow; dit betekend dat het getal in de te groot is geworden, dit maakt niet uit als a toch nog alleen uit nullen bestaat djnz hlisaxde_loop ret;fine hlisaxde_checkoverflow: or a ret z;fine ccf ret;overflow hldivde: ;in hl,de ;out hl = hl / de ; de = remainder push bc push af;backup ld a, 16;16 bits ld b, d ld c, e ld d, h ld e, l ld hl, 0 hldivde_loop: sla e;shift DE to HL rl d rl l rl h or a;cp hl, de sbc hl, bc add hl, bc jr c, hldivde_skip;bc > hl sbc hl, bc inc de;set bit 0 hldivde_skip: dec a jr nz, hldivde_loop ex de, hl pop af pop bc;restore ret hlpowerb: ;in l, b ;out hl = l ^ b ;flag c = overflow ;del all ld a, b or a jr z, hlpowerbreturn1 dec b ret z;return just same number ld c, l ld h, 0 hlpowerb_loop: push bc ld d, h ld e, l ld a, c call hlisaxde pop bc ret c djnz hlpowerb_loop ret hlpowerbreturn1: ld hl, 1 ret hlx9: ;in hl ;out hl = hl x 9 ;del bc ld b, h ld c, l add hl, hl add hl, hl add hl, hl;x8 add hl, bc;x9 ret penNewLine: xor a ld (penCol), a ld a, (penRow) add a, 8 ld (penRow), a ret dex10 push hl ex de, hl add hl, hl;x2 ld d, h ld e, l add hl, hl;x4 add hl, hl;x8 add hl, de;x10 ex de, hl pop hl ret prevpage: ;del hl ;descr gaat naar laatste menu ld hl, (prevPagePointer) push hl ret vputc: ld a, (hl) inc hl or a ret z b_call (_vputmap) jr vputc