:ASM textmode MOV AX 0x03 # INT 0x10 # NEXT 0 VAR, textpageid 0 VAR, textpage :t page! dup textpageid ! 12 << textpage ! ; :ASM showpage POP AX MOV AH 0x05 # INT 0x10 # NEXT :ASM movecursor ( xy -- ) MOV BH textpageid @+ MOV AH 0x02 # POP DX INT 0x10 # NEXT :ASM cursorshape! ( shape -- ) POP CX MOV AH 0x01 # INT 0x10 # NEXT :t hidecursor 0x2607 cursorshape! ; :t showcursor 0x0607 cursorshape! ; 0x0f VAR, textpen 80 CONST pagew 25 CONST pageh 0xb800 CONST TEXTMEM : PREP-TEXTCOPY MOV ES t& TEXTMEM @+ MOV AH textpen @+ MOV DI textpage @+ ; :ASM fill-page ( char -- ) INT 3 # POP AX PREP-TEXTCOPY MOV CX pagew pageh * # REPZ STOSW NEXT 0 VAR, textpos :t textx textpos @ 1 >> pagew % ; :t texty textpos @ 1 >> pagew / ; :t textx! texty pagew 1 << * + textpos ! ; :t texty! pagew 1 << * textx + textpos ! ; :t nextline texty 1+ pagew 1 << * textpos ! ; : PREP-TEXTCOPY-XY PREP-TEXTCOPY ADD DI textpos @+ ; :ASM draw-text ( s -- ) MOV BX SI POP SI PREP-TEXTCOPY-XY L: draw-next-char LODSB OR AL AL JZ 0 @> STOSW JMP draw-next-char 0 <: SUB DI textpage @+ MOV textpos @+ DI MOV SI BX NEXT