//---basic2_vga.asm--- //updated to use VGA controller //TODO: POKE and PEEK //TODO: figure out subroutine issue with expression parser //TODO: PRINT w/o trailing newline //TODO: CLEAR, LIST //FIXME multibyte comparison (>, <, =) 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a //vga setup //x scroll register high 0b00001111 a a io2 3 //x scroll register low 0b11011001 a a io2 2 //y scroll register high 0 a a io2 5 //y scroll register low 0 a a io2 4 //load character set 0b10000000 a a io2 1 0 a a io2 0 0b00111100 io 0b01100110 io 0b01110110 io 0b01110110 io 0b00000110 io 0b01000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01110000 io 0b00011000 io 0b01111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b00111100 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00110110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b11111110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11000110 io 0b11010110 io 0b11111110 io 0b01111100 io 0b01101100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00110000 io 0b00011110 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01111110 io 0b00000000 io 0b00111100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00111100 io 0b00000000 io 0b00110000 io 0b01001000 io 0b00001100 io 0b00111110 io 0b00001100 io 0b01000110 io 0b00111111 io 0b00000000 io 0b00111100 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00111100 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00001000 io 0b00001100 io 0b11111110 io 0b11111110 io 0b00001100 io 0b00001000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b11111111 io 0b01100110 io 0b11111111 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00011000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00011000 io 0b00000000 io 0b01000110 io 0b01100110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01100110 io 0b01100010 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00111100 io 0b00011100 io 0b11100110 io 0b01100110 io 0b11111100 io 0b00000000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00011000 io 0b00110000 io 0b00000000 io 0b00001100 io 0b00011000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b11111111 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00001100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b11000000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01110110 io 0b01101110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00110000 io 0b00001100 io 0b00000110 io 0b01111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00111000 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100000 io 0b01110000 io 0b01111000 io 0b01100110 io 0b11111110 io 0b01100000 io 0b01100000 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00111110 io 0b01100000 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01111110 io 0b01100110 io 0b00110000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00001100 io 0b01110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b00001100 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00000000 io 0b01111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00001110 io 0b00011000 io 0b00110000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11111111 io 0b11111111 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00011110 io 0b00110110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00110110 io 0b00011110 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00000110 io 0b00011110 io 0b00000110 io 0b00000110 io 0b01111110 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00000110 io 0b00011110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b01110110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b01111000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110110 io 0b00011100 io 0b00000000 io 0b01100110 io 0b00110110 io 0b00011110 io 0b00001110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b01111110 io 0b00000000 io 0b11000110 io 0b11101110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b11000110 io 0b11000110 io 0b00000000 io 0b01100110 io 0b01101110 io 0b01111110 io 0b01111110 io 0b01110110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b01110000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00111100 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b11000110 io 0b11000110 io 0b11000110 io 0b11010110 io 0b11111110 io 0b11101110 io 0b11000110 io 0b00000000 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b01111110 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b01111110 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b11111111 io 0b11111111 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000011 io 0b00000011 io 0b00001100 io 0b00001100 io 0b00000011 io 0b00000011 io 0b00001100 io 0b00001100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b11001100 io 0b11001100 io 0b00110011 io 0b00110011 io 0b11001100 io 0b11001100 io 0b00110011 io 0b00110011 io 0b11001100 io 0b10011001 io 0b00110011 io 0b01100110 io 0b11001100 io 0b10011001 io 0b00110011 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01110000 io 0b00011000 io 0b01111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b00111100 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00110110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b11111110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11000110 io 0b11010110 io 0b11111110 io 0b01111100 io 0b01101100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00110000 io 0b00011110 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01111110 io 0b00000000 io 0b00111100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00111100 io 0b00000000 io 0b00110000 io 0b01001000 io 0b00001100 io 0b00111110 io 0b00001100 io 0b01000110 io 0b00111111 io 0b00000000 io 0b00111100 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io //setup subroutine call stack 254 rh 0 rl 0 rh,rl ::exec_loop rh :exec_loop rl 0 rh,rl ::expr_stack_frame rh 0 rl 0 rh,rl call :tty_cls 255 rh 0 rl 'B' rh,rl call :tty_putch 255 rh 0 rl 'A' rh,rl call :tty_putch 255 rh 0 rl 'S' rh,rl call :tty_putch 255 rh 0 rl 'I' rh,rl call :tty_putch 255 rh 0 rl 'C' rh,rl call :tty_putch 255 rh 0 rl 32 rh,rl call :tty_putch 255 rh 0 rl 'V' rh,rl call :tty_putch 255 rh 0 rl '2' rh,rl call :tty_putch 255 rh 0 rl 10 rh,rl call :tty_putch .loopMain //get input call :tty_get_line ::getline_buf_index rh rh,:getline_buf_index rl ::tty_getline_buf rh 0 rh,rl //output a newline 255 rh 0 rl 10 rh,rl call :tty_putch //-------------------- //tokenize line ::curs rh :curs rl 0 rh,rl //output length ::tokenize_len rh :tokenize_len rl 0 rh,rl .tokenize_loop //get current char ::curs rh rh,:curs rl ::tty_getline_buf rh rh,rl a ::ch rh a rh,:ch //get next char ::curs rh rh,:curs a 1 b 0 flags add rl ::tty_getline_buf rh rh,rl a ::ch2 rh a rh,:ch2 //get 3rd char ::curs rh rh,:curs a 2 b 0 flags add rl ::tty_getline_buf rh rh,rl a ::ch3 rh a rh,:ch3 //if it's nul ::ch rh rh,:ch a 0 b branch :tokenize_quit a=b //if it's a letter ::ch rh rh,:ch a 96 b ::temp rh a>b rh,:temp 123 b ab rh,:temp 123 b ab rh,:temp 123 b ab rh,:temp 58 b ab rh,:temp 58 b ab rh,:temp 123 b ab //find next line // get addr of current line 255 rh 0 rl 0 rh,rl ::curr_line rh rh,:curr_line a 255 rh a rh,1 call :line_to_addr .exec_l_search // loop until the next valid line // add 64 0 flags ::store_target_lo rh rh,:store_target_lo a 64 b add rh,:store_target_lo ::store_target_hi rh rh,:store_target_hi a 0 b add rh,:store_target_hi // increment curr_line ::curr_line rh rh,:curr_line a 0 flags 1 b add rh,:curr_line // check if out-of-bounds //FIXME FIXME ::store_target_hi rh rh,:store_target_hi a 128 b and a 0 b branch :exec_l_search_end a>b // check if line is valid ::store_target_lo rh rh,:store_target_lo a ::store_target_hi rh rh,:store_target_hi b b rh a rl rh,rl a 0 b branch :exec_l_search a=b .exec_l_search_found branch :exec_l_fin 1 .exec_l_search_end ::exec_loop rh :exec_loop rl 0 rh,rl branch :exec_no_exec_loop 1 //done .exec_l_has_goto ::goto_line rh :goto_line rl rh,rl a 0 rh,rl ::curr_line rh a rh,:curr_line //load curr_line 255 rh 0 rl 0 rh,rl ::curr_line rh rh,:curr_line a 255 rh a rh,1 call :line_to_addr .exec_l_fin //copy 64 bytes 0 flags 0 a .exec_store_copy_loop ::store_target_lo rh rh,:store_target_lo b add rl ::store_target_hi rh rh,:store_target_hi rh rh,rl b a rl ::basic_line_buf rh b rh,rl 1 b add a 64 b branch :exec_store_copy_loop ab ')' b branch :basic_expr_rparen a=b '(' b branch :basic_expr_lparen a=b //number? 47 b ::temp rh a>b rh,:temp 58 b ab rh,:temp 123 b a' b branch :expr_op_gt a=b '|' b branch :expr_op_or a=b '&' b branch :expr_op_and a=b '^' b branch :expr_op_xor a=b '/' b branch :expr_op_divide a=b //TODO multiply? branch :expr_error 1 .expr_op_add 0 flags ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a add rh,:expr_out_lo ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a add rh,:expr_out_hi branch :expr_op_end 1 .expr_op_sub //two's comp on expr_temp 0 flags ::expr_temp_lo rh rh,:expr_temp_lo a 255 b xor a 1 b add rh,:expr_temp_lo ::expr_temp_hi rh rh,:expr_temp_hi a 255 b xor a 0 b add rh,:expr_temp_hi //add 0 flags ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a add rh,:expr_out_lo ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a add rh,:expr_out_hi branch :expr_op_end 1 .expr_op_lt 0 flags ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a branch :expr_op_lt_comp_low a=b ab a 1 b and rh,:expr_out_lo ::expr_out_hi rh :expr_out_hi rl 0 rh,rl branch :expr_op_end 1 //if high byte == high byte, compare low byte .expr_op_gt_comp_low ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a a>b a 1 b and rh,:expr_out_lo ::expr_out_hi rh :expr_out_hi rl 0 rh,rl branch :expr_op_end 1 .expr_op_or 0 flags ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a or rh,:expr_out_lo ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a or rh,:expr_out_hi branch :expr_op_end 1 .expr_op_and 0 flags ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a and rh,:expr_out_lo ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a and rh,:expr_out_hi branch :expr_op_end 1 .expr_op_xor 0 flags ::expr_temp_lo rh rh,:expr_temp_lo b ::expr_out_lo rh rh,:expr_out_lo a xor rh,:expr_out_lo ::expr_temp_hi rh rh,:expr_temp_hi b ::expr_out_hi rh rh,:expr_out_hi a xor rh,:expr_out_hi branch :expr_op_end 1 .expr_op_divide //FIXME - this only divides by 2 ::expr_out_hi rh rh,:expr_out_hi b bsr rh,:expr_out_hi 1 a and a 0 flags a b add a a b add a a b add a a b add a a b add a a b add a a b add a ::expr_out_lo rh rh,:expr_out_lo b bsr b or rh,:expr_out_lo branch :expr_op_end 1 .expr_op_end //increment expr_sidx by 2 (op + val) ::expr_sidx rh rh,:expr_sidx a 0 flags 2 b add rh,:expr_sidx //loop de loop branch :basic_expr_eloop 1 .basic_expr_eloop_end //pop stack frame ::expr_stack_frame_len rh rh,:expr_stack_frame_len a 0 flags 255 b add a a rl ::expr_stack_frame rh rh,rl b ::expr_stack_len rh b rh,:expr_stack_len ::expr_stack_frame_len rh a rh,:expr_stack_frame_len //TODO 0 flags //high half is 255,0 ::expr_out_hi rh rh,:expr_out_hi a 255 rh a rh,0 //low half is 255,1 ::expr_out_lo rh rh,:expr_out_lo a 255 rh a rh,1 //call :print_num ret .expr_error 255 rh 0 rl '#' rh,rl call :tty_putch 255 rh 0 rl '$' rh,rl call :tty_putch //TODO: jump to interactive mode? 255 rh 0 rl 0 rh,rl 255 rh 1 rl 0 rh,rl ret //---END basic_expr--- //---BEGIN basic_clear--- .basic_clear //clear basic_prgm (32k bytes) ::temp rh :temp rl ::basic_prgm rh,rl 0 flags ::basic_prgm a 128 b ::ch rh add rh,:ch .clear_pre_loop_outer 0 a ::temp rh rh,:temp rh .clear_pre_loop_inner a rl 0 rh,rl 0 flags 64 b add a 0 b branch :clear_pre_loop_inner_end a=b branch :clear_pre_loop_inner 1 .clear_pre_loop_inner_end ::temp rh rh,:temp a 0 flags 1 b add a a rh,:temp ::ch rh rh,:ch b branch :clear_pre_loop_outer ab rh,:temp 58 b ab '0' b 0 flags add a 255 rh a rh,0 call :tty_putch ret .print_hex_digit_letter 55 b 0 flags add a 255 rh a rh,0 call :tty_putch ret //---END print_hex_digit--- //---BEGIN tty_get_line--- .tty_get_line ::getline_buf_index rh :getline_buf_index rl 0 rh,rl .tty_get_line_loop call :tty_cursor_flash_on .loopInput io a 1 0b10000000 b and a branch :kbdReady a=b branch :loopInput 1 .kbdReady call :tty_cursor_flash_off //wait for data wait 2 //3 for 7.8 kHz, 7 for 16.3 kHz io a 2 io a 4 0xF0 b a=b b io a 2 branch :breakCode b //io a 2 0xF0 b branch :tty_get_line_loop a=b branch :haveCode 1 //check for shift .breakCode //io a 2 0x12 b //scancode for LSHIFT a=b a 255 b xor a ::tty_get_line_loop iph :tty_get_line_loop ipl a branch //LSHIFT release detected ::shift rh :shift rl 0 rh,rl branch :tty_get_line_loop 1 //have scancode .haveCode //save data ::scancode rh :scancode rl a rh,rl //check for backspace 0x66 b branch :tty_get_line_backspace a=b 0x12 b //scancode for lshift a=b a 255 b xor a ::noLSHIFT iph :noLSHIFT ipl a branch //LSHIFT press detected ::shift rh :shift rl 1 rh,rl branch :tty_get_line_loop 1 .noLSHIFT //check shift state ::shift rh :shift rl rh,rl a 1 b branch :lookup_has_shift a=b ::scancode rh :scancode rl rh,rl a ::lookup_lower rh branch :lookup_end 1 .lookup_has_shift ::scancode rh :scancode rl rh,rl a ::lookup_upper rh .lookup_end //decode data a rl rh,rl a //store 255 rh a rh,0 //if newline, ret 10 b branch :tty_get_line_end a=b ::getline_buf_index rh :getline_buf_index rl rh,rl b ::tty_getline_buf rh b rl a rh,rl 1 a ::getline_buf_index rh :getline_buf_index rl 0 flags add rh,rl call :tty_putch branch :tty_get_line_loop 1 .tty_get_line_backspace //backspace ::getline_buf_index rh rh,:getline_buf_index a 0 b branch :tty_get_line_loop a=b //decrement 255 b 0 flags add rh,:getline_buf_index call :tty_backspace branch :tty_get_line_loop 1 .tty_get_line_end ret //---END tty_get_line--- //---BEGIN tty_putch .tty_putch ::tty_xpos rh rh,:tty_xpos a a b 0 flags add a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 255 rh rh,0 a 10 b branch :tty_putch_newline a=b //0b00001111 io //load data 255 rh rh,0 io //0b10000000 b //or io 0b00001111 io //increment x ::tty_xpos rh rh,:tty_xpos a 1 b 0 flags add a a rh,:tty_xpos 80 b branch :tty_putch_end ab ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add a //bsl 3 a b 0 flags add a a b 0 flags add a a b 0 flags add a //y scroll register low a io2 4 ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add b //bsr 5 bsr b bsr b bsr b bsr b bsr b //y scroll register low b io2 5 .tty_putch_end ret //---END tty_putch--- //---BEGIN tty_backspace--- .tty_backspace ::tty_xpos rh rh,:tty_xpos a 0 b branch :tty_backspace_end a=b //decrement 255 b 0 flags add a a rh,:tty_xpos //clear char cell a b 0 flags add io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io 0 io .tty_backspace_end ret //---END tty_backspace--- //---BEGIN tty_cursor_flash_on--- .tty_cursor_flash_on //on ::tty_xpos rh rh,:tty_xpos a a b 0 flags add a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io 0b11101110 io ret //---END tty_cursor_flash_on--- //---BEGIN tty_cursor_flash_off--- .tty_cursor_flash_off //off ::tty_xpos rh rh,:tty_xpos a a b 0 flags add a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io 0 io ret //---END tty_cursor_flash_off--- //---BEGIN tty_cls--- .tty_cls ::tty_xpos rh :tty_xpos rl 0 rh,rl ::tty_ypos rh :tty_ypos rl 0 rh,rl ::tty_scroll_enable rh :tty_scroll_enable rl 0 rh,rl //y scroll register high 0 a a io2 5 //y scroll register low 0 a a io2 4 0 a a io2 1 .tty_cls_loop 0 a a io2 0 1 a 1 b .tty_cls_loop_sub 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 flags add a branch :tty_cls_loop_sub a>b ::tty_ypos rh rh,:tty_ypos a 15 b 0 flags add a a rh,:tty_ypos 127 b and io2 1 60 b branch :tty_cls_loop a