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 call :tty_cls 255 rh 0 rl 'T' rh,rl call :tty_putch 255 rh 0 rl 'E' rh,rl call :tty_putch 255 rh 0 rl 'S' rh,rl call :tty_putch 255 rh 0 rl 'T' rh,rl call :tty_putch 255 rh 0 rl 255 rh 0 rl 10 rh,rl call :tty_putch //---setup & read header--- //header_version, header_flags_1 ::story_data rh 0 rl rh,rl(i) a rh,rl b ::header_version rh a rh,:header_version //initialize flags 1 0b00010000 a or b 0b11011111 a and b 0b10111111 a and b ::story_data rh 0 rl b rh,rl ::header_flags_1 rh b rh,:header_flags_1 //header_high_mem_start ::story_data rh 2 rl rh,rl(i) a rh,rl b ::header_high_mem_start rh :header_high_mem_start rl a rh,rl(i) b rh,rl //header_pc_init ::story_data rh 3 rl rh,rl(i) a rh,rl b ::header_pc_init rh :header_pc_init rl a rh,rl(i) b rh,rl //header_dict_loc ::story_data rh 4 rl rh,rl(i) a rh,rl b ::header_dict_loc rh :header_dict_loc rl a rh,rl(i) b rh,rl //header_obj_table_loc ::story_data rh 5 rl rh,rl(i) a rh,rl b ::header_obj_table_loc rh :header_obj_table_loc rl a rh,rl(i) b rh,rl //header_var_table_loc ::story_data rh 6 rl rh,rl(i) a rh,rl b ::header_var_table_loc rh :header_var_table_loc rl a rh,rl(i) b rh,rl //header_static_mem_start ::story_data rh 7 rl rh,rl(i) a rh,rl b ::header_static_mem_start rh :header_static_mem_start rl a rh,rl(i) b rh,rl //header_flags_2 ::story_data rh 8 rl rh,rl(i) a //initialize flags 2 0b11111110 b and a 0b11111101 b and a a rh,rl(i) ::header_flags_2 rh a rh,:header_flags_2 //header_abbr_table_loc ::story_data rh 12 rl rh,rl(i) a rh,rl b ::header_abbr_table_loc rh :header_abbr_table_loc rl a rh,rl(i) b rh,rl //header_file_len ::story_data rh 13 rl rh,rl(i) a rh,rl b ::header_file_len rh :header_file_len rl a rh,rl(i) b rh,rl //header_file_checksum ::story_data rh 14 rl rh,rl(i) a rh,rl b ::header_file_checksum rh :header_file_checksum rl a rh,rl(i) b rh,rl //some debug 255 rh 0 rl 'V' rh,rl call :tty_putch 255 rh 0 rl 0 rh,rl ::header_version rh rh,:header_version a 255 rh a rh,1 call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch 255 rh 0 rl 'C' rh,rl call :tty_putch ::header_file_checksum rh :header_file_checksum rl rh,rl(i) a rh,rl b 255 rh a rh,0 b rh,1 call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch //load pc ::header_pc_init rh :header_pc_init rl rh,rl(i) a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl //shift ::pc rh :pc rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::pcl rh and rh,:pcl 0b01111111 a and b rh,rl(i) a or rh,rl ::header_pc_init rh :header_pc_init rl rh,rl(i) b bsr b 0b01111111 a and a ::story_data b 0 flags add a ::pc rh :pc rl a rh,rl(i) ::pcl rh rh,:pcl b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:pcl //print old pc ::header_pc_init rh :header_pc_init rl rh,rl(i) a rh,rl b 255 rh a rh,0 b rh,1 call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch //print ::story_data 255 rh 0 rl ::story_data rh,rl 1 rl 0 rh,rl call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch //print new pc ::pc rh :pc rl rh,rl(i) a rh,rl b 255 rh a rh,0 b rh,1 call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch 255 rh 0 rl 10 rh,rl call :tty_putch .loopMain //---read opcode--- //clear opc data as needed //may leave some garbage in unused fields, but those will be ignored ::opc_operand_type0 rh :opc_operand_type0 rl 0b11 rh,rl ::opc_operand_type1 rh :opc_operand_type1 rl 0b11 rh,rl ::opc_operand_type2 rh :opc_operand_type2 rl 0b11 rh,rl ::opc_operand_type3 rh :opc_operand_type3 rl 0b11 rh,rl ::opc_operand_qty rh :opc_operand_qty rl 0 rh,rl //read byte into A register zreadbyte //store ::opc_opcode rh a rh,:opc_opcode //print it 255 rh 0 rl 0 rh,rl a rh,1 call :print_num 255 rh 0 rl 10 rh,rl call :tty_putch //retrieve ::opc_opcode rh rh,:opc_opcode a //decode 0b11000000 b and a branch :decode_form_var a=b 0b10000000 b branch :decode_form_short a=b branch :decode_form_long 1 .decode_form_var //0b11 //retrieve param types zreadbyte //shuffle around and store a b 0b11 a and a ::opc_operand_type3 rh a rh,:opc_operand_type3 bsr b bsr b 0b11 a and a ::opc_operand_type2 rh a rh,:opc_operand_type2 bsr b bsr b 0b11 a and a ::opc_operand_type1 rh a rh,:opc_operand_type1 bsr b bsr b 0b11 a and a ::opc_operand_type0 rh a rh,:opc_operand_type0 branch :decode_form_end 1 .decode_form_short //0b10 ::opc_opcode rh rh,:opc_opcode b bsr b bsr b bsr b bsr b 0b11 a and a ::opc_operand_type0 rh a rh,:opc_operand_type0 branch :decode_form_end 1 .decode_form_long //0b00 and 0b01 ::opc_opcode rh rh,:opc_opcode b bsr b bsr b bsr b bsr b bsr b bsr b 1 a and b 0 flags add a ::opc_operand_type0 rh a rh,:opc_operand_type0 ::opc_opcode rh rh,:opc_opcode b bsr b bsr b bsr b bsr b bsr b 1 a and b 0 flags add a ::opc_operand_type1 rh a rh,:opc_operand_type1 .decode_form_end ::opc_operand_type0 rh rh,:opc_operand_type0 a 0b11 b branch :decode_get_operands_end a=b 0b00 b branch :decode_get_op0_word a=b 0b01 b branch :decode_get_op0_byte a=b //must be 0b10 .decode_get_op0_var zreadbyte 255 rh a rh,0 call :get_var 255 rh rh,0 a ::opc_operands0 rh :opc_operands0 rl 0 rh,rl(i) a rh,rl branch :decode_get_op0_end 1 .decode_get_op0_word zreadbyte ::opc_operands0 rh :opc_operands0 rl a rh,rl(i) zreadbyte ::opc_operands0 rh :opc_operands0 rl a rh,rl branch :decode_get_op0_end 1 .decode_get_op0_byte zreadbyte ::opc_operands0 rh :opc_operands0 rl 0 rh,rl(i) a rh,rl .decode_get_op0_end ::opc_operand_qty rh :opc_operand_qty rl 1 rh,rl ::opc_operand_type1 rh rh,:opc_operand_type1 a 0b11 b branch :decode_get_operands_end a=b 0b00 b branch :decode_get_op1_word a=b 0b01 b branch :decode_get_op1_byte a=b //must be 0b10 .decode_get_op1_var zreadbyte 255 rh a rh,0 call :get_var 255 rh rh,0 a ::opc_operands1 rh :opc_operands1 rl 0 rh,rl(i) a rh,rl branch :decode_get_op1_end 1 .decode_get_op1_word zreadbyte ::opc_operands1 rh :opc_operands1 rl a rh,rl(i) zreadbyte ::opc_operands1 rh :opc_operands1 rl a rh,rl branch :decode_get_op1_end 1 .decode_get_op1_byte zreadbyte ::opc_operands1 rh :opc_operands1 rl 0 rh,rl(i) a rh,rl .decode_get_op1_end ::opc_operand_qty rh :opc_operand_qty rl 2 rh,rl ::opc_operand_type2 rh rh,:opc_operand_type2 a 0b11 b branch :decode_get_operands_end a=b 0b00 b branch :decode_get_op2_word a=b 0b01 b branch :decode_get_op2_byte a=b //must be 0b10 .decode_get_op2_var zreadbyte 255 rh a rh,0 call :get_var 255 rh rh,0 a ::opc_operands2 rh :opc_operands2 rl 0 rh,rl(i) a rh,rl branch :decode_get_op2_end 1 .decode_get_op2_word zreadbyte ::opc_operands2 rh :opc_operands2 rl a rh,rl(i) zreadbyte ::opc_operands2 rh :opc_operands2 rl a rh,rl branch :decode_get_op2_end 1 .decode_get_op2_byte zreadbyte ::opc_operands2 rh :opc_operands2 rl 0 rh,rl(i) a rh,rl .decode_get_op2_end ::opc_operand_qty rh :opc_operand_qty rl 3 rh,rl ::opc_operand_type3 rh rh,:opc_operand_type3 a 0b11 b branch :decode_get_operands_end a=b 0b00 b branch :decode_get_op3_word a=b 0b01 b branch :decode_get_op3_byte a=b //must be 0b10 .decode_get_op3_var zreadbyte 255 rh a rh,0 call :get_var 255 rh rh,0 a ::opc_operands3 rh :opc_operands3 rl 0 rh,rl(i) a rh,rl branch :decode_get_op3_end 1 .decode_get_op3_word zreadbyte ::opc_operands3 rh :opc_operands3 rl a rh,rl(i) zreadbyte ::opc_operands3 rh :opc_operands3 rl a rh,rl branch :decode_get_op3_end 1 .decode_get_op3_byte zreadbyte ::opc_operands3 rh :opc_operands3 rl 0 rh,rl(i) a rh,rl .decode_get_op3_end ::opc_operand_qty rh :opc_operand_qty rl 4 rh,rl .decode_get_operands_end //get store var, if applicable ::opc_opcode rh rh,:opc_opcode rl ::opcode_flags rh rh,rl a 0b10 b and a 0 b branch :decode_no_store a=b zreadbyte ::opc_store_var rh a rh,:opc_store_var .decode_no_store //get branch offset, if applicable ::opc_opcode rh rh,:opc_opcode rl ::opcode_flags rh rh,rl a 0b01 b and a 0 b branch :decode_no_branch a=b zreadbyte 0b10000000 b and b bsr b bsr b bsr b bsr b bsr b bsr b bsr b ::opc_branch_type rh b rh,:opc_branch_type 0b01000000 b ::temp rh a rh,:temp and a branch :decode_branch_1b a=b .decode_branch_2b ::temp rh rh,:temp a 0b00111111 b and b ::opc_branch_offset rh :opc_branch_offset rl b rh,rl(i) zreadbyte ::opc_branch_offset rh :opc_branch_offset rl a rh,rl branch :decode_no_branch 1 .decode_branch_1b ::temp rh rh,:temp a 0b00111111 b and b ::opc_branch_offset rh :opc_branch_offset rl 0 rh,rl(i) b rh,rl .decode_no_branch //opcode and other data has been processed (except for print string, if applicable) branch :loopMain 1 //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 //---BEGIN get_var--- .get_var 255 rh rh,0 a 255 rh 0 rl 0 rh,rl ret //---END get_var--- //---BEGIN print_num--- .print_num //high half is 255,0 255 rh rh,0 a ::print_num_hi rh a rh,:print_num_hi //low half is 255,1 255 rh rh,1 a ::print_num_lo rh a rh,:print_num_lo 255 rh 0 rl '#' rh,rl call :tty_putch //first hex digit ::print_num_hi rh rh,:print_num_hi b bsr b bsr b bsr b bsr b 15 a and b 255 rh 0 rl b rh,rl call :print_hex_digit //second hex digit ::print_num_hi rh rh,:print_num_hi b 15 a and b 255 rh 0 rl b rh,rl call :print_hex_digit //third hex digit ::print_num_lo rh rh,:print_num_lo b bsr b bsr b bsr b bsr b 15 a and b 255 rh 0 rl b rh,rl call :print_hex_digit //fourth hex digit ::print_num_lo rh rh,:print_num_lo b 15 a and b 255 rh 0 rl b rh,rl call :print_hex_digit ret //---END print_num--- //---BEGIN print_hex_digit--- .print_hex_digit 255 rh rh,0 a 9 b branch :print_hex_digit_letter a>b '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 3 //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