diff options
-rw-r--r-- | asmmon.h | 446 | ||||
-rw-r--r-- | disasm.c | 6 | ||||
-rw-r--r-- | disasm.h | 3 | ||||
-rw-r--r-- | enums.h | 5 | ||||
-rw-r--r-- | opcode.h | 2 | ||||
-rw-r--r-- | programs/subasm.s | 76 | ||||
-rw-r--r-- | programs/subeditor.s | 241 | ||||
-rw-r--r-- | sux.c | 3 | ||||
-rw-r--r-- | tables.h | 5 | ||||
-rw-r--r-- | test/add-sub.s | 2 | ||||
-rw-r--r-- | test/fib2.s | 14 | ||||
-rw-r--r-- | test/hello-world.s | 22 | ||||
-rw-r--r-- | test/input-2.s | 412 | ||||
-rw-r--r-- | test/input-3.s | 900 | ||||
-rw-r--r-- | test/input.s | 338 | ||||
-rw-r--r-- | test/subroutine.s | 4 | ||||
-rw-r--r-- | test/test.s | 17 |
17 files changed, 414 insertions, 2082 deletions
@@ -138,82 +138,80 @@ static const uint8_t opcodes[OPNUM][9] = { [11] = {0x19, 0x3D, 0xFF, 0xFF, 0x85, 0xFF, 0xFF, 0x4C, 0xFF}, [12] = {0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, [13] = {0xFF, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0xF5}, - [14] = {0xFF, 0x1E, 0xFF, 0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF}, - [15] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xFF}, - [16] = {0x21, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24, 0xFF}, - [17] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x22}, - [18] = {0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [19] = {0x29, 0x4D, 0xFF, 0xFF, 0xB5, 0xFF, 0xFF, 0x3C, 0xFF}, - [20] = {0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [21] = {0xFF, 0x2E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0xFF}, - [22] = {0x31, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x34, 0xFF}, - [23] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x32}, - [24] = {0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [25] = {0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [26] = {0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF}, - [27] = {0x41, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xFF}, - [28] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x42}, - [29] = {0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [30] = {0x4A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [31] = {0xFF, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0xFF}, - [32] = {0x51, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0xFF}, - [33] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52}, - [34] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x58}, - [35] = {0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [36] = {0xFF, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0xFF}, - [37] = {0x61, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0xFF}, - [38] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62}, - [39] = {0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [40] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A}, - [41] = {0xFF, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0xFF}, - [42] = {0x71, 0x76, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0xFF}, - [43] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x72}, - [44] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78}, - [45] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7A}, - [46] = {0xFF, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF}, - [47] = {0x81, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xFF}, - [48] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82}, - [49] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88}, - [50] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A}, - [51] = {0xFF, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xFF}, - [52] = {0x91, 0x96, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xFF}, - [53] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92}, - [54] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98}, - [55] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A}, - [56] = {0xFF, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0xFF}, - [57] = {0xA1, 0xA6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0xFF}, - [58] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2}, - [59] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8}, - [60] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA}, - [61] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE}, - [62] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0}, - [63] = {0xB1, 0xB6, 0xFF, 0xFF, 0x25, 0x7D, 0x7C, 0xB4, 0xFF}, - [64] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2}, - [65] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8}, - [66] = {0xB9, 0xBD, 0xFF, 0xC9, 0x95, 0xFF, 0xFF, 0xBC, 0xFF}, - [67] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA}, - [68] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0}, - [69] = {0xC1, 0xC6, 0x79, 0x39, 0x05, 0x5D, 0x5C, 0xC4, 0xFF}, - [70] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5}, - [71] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8}, - [72] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA}, - [73] = {0xFF, 0xCD, 0x89, 0x49, 0x15, 0x6D, 0x6C, 0xCC, 0xFF}, - [74] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0}, - [75] = {0xD1, 0xD6, 0x99, 0x59, 0x35, 0x8D, 0x8C, 0xD4, 0xFF}, - [76] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5}, - [77] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8}, - [78] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA}, - [79] = {0xFF, 0xDD, 0xA9, 0x69, 0x45, 0x9D, 0x9C, 0xDC, 0xFF}, - [80] = {0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - [81] = {0xE1, 0xE6, 0xE9, 0xFF, 0x65, 0xFF, 0xFF, 0xE4, 0xFF}, - [82] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8}, - [83] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA}, - [84] = {0xFF, 0xED, 0xF9, 0xFF, 0x75, 0xFF, 0xFF, 0xEC, 0xFF}, - [85] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE}, - [86] = {0xF1, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF}, - [87] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2}, - [88] = {0xFF, 0xFD, 0xFF, 0xD9, 0xA5, 0xFF, 0xFF, 0xFC, 0xFF}, - [89] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE} + [14] = {0xFF, 0x1E, 0xFF, 0xFF, 0xBE, 0xFF, 0xFF, 0x20, 0xFF}, + [15] = {0x21, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x24, 0xFF}, + [16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x22}, + [17] = {0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [18] = {0x29, 0x4D, 0xFF, 0xFF, 0xB5, 0xFF, 0xFF, 0x3C, 0xFF}, + [19] = {0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [20] = {0xFF, 0x2E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0xFF}, + [21] = {0x31, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x34, 0xFF}, + [22] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x32}, + [23] = {0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [24] = {0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [25] = {0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF}, + [26] = {0x41, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xFF}, + [27] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x42}, + [28] = {0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [29] = {0x4A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [30] = {0xFF, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0xFF}, + [31] = {0x51, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0xFF}, + [32] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52}, + [33] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x58}, + [34] = {0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [35] = {0xFF, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0xFF}, + [36] = {0x61, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0xFF}, + [37] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x62}, + [38] = {0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [39] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A}, + [40] = {0xFF, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0xFF}, + [41] = {0x71, 0x76, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0xFF}, + [42] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x72}, + [43] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78}, + [44] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7A}, + [45] = {0xFF, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF}, + [46] = {0x81, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xFF}, + [47] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82}, + [48] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88}, + [49] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A}, + [50] = {0xFF, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xFF}, + [51] = {0x91, 0x96, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0xFF}, + [52] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92}, + [53] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98}, + [54] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A}, + [55] = {0xFF, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0xFF}, + [56] = {0xA1, 0xA6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0xFF}, + [57] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2}, + [58] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8}, + [59] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA}, + [60] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE}, + [61] = {0xB1, 0xB6, 0xFF, 0xFF, 0x25, 0x7D, 0x7C, 0xB4, 0xFF}, + [62] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2}, + [63] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8}, + [64] = {0xB9, 0xBD, 0xFF, 0xC9, 0x95, 0xFF, 0xFF, 0xBC, 0xFF}, + [65] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA}, + [66] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0}, + [67] = {0xC1, 0xC6, 0x79, 0x39, 0x05, 0x5D, 0x5C, 0xC4, 0xFF}, + [68] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5}, + [69] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8}, + [70] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA}, + [71] = {0xFF, 0xCD, 0x89, 0x49, 0x15, 0x6D, 0x6C, 0xCC, 0xFF}, + [72] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0}, + [73] = {0xD1, 0xD6, 0x99, 0x59, 0x35, 0x8D, 0x8C, 0xD4, 0xFF}, + [74] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5}, + [75] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8}, + [76] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA}, + [77] = {0xFF, 0xDD, 0xA9, 0x69, 0x45, 0x9D, 0x9C, 0xDC, 0xFF}, + [78] = {0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + [79] = {0xE1, 0xE6, 0xE9, 0xFF, 0x65, 0xFF, 0xFF, 0xE4, 0xFF}, + [80] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8}, + [81] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA}, + [82] = {0xFF, 0xED, 0xF9, 0xFF, 0x75, 0xFF, 0xFF, 0xEC, 0xFF}, + [83] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE}, + [84] = {0xF1, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF}, + [85] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2}, + [86] = {0xFF, 0xFD, 0xFF, 0xD9, 0xA5, 0xFF, 0xFF, 0xFC, 0xFF}, + [87] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE} }; static const char *dir_t[6] = { @@ -278,81 +276,79 @@ static const char *mne[OPNUM] = { [12] = "PLB", [13] = "INC", [14] = "JSR", - [15] = "JSL", - [16] = "AND", - [17] = "ABA", - [18] = "PLP", - [19] = "CPX", - [20] = "PHY", - [21] = "BPO", - [22] = "ORA", - [23] = "OAB", - [24] = "STT", - [25] = "PLY", - [26] = "BNG", - [27] = "XOR", - [28] = "XAB", - [29] = "PHA", - [30] = "PHX", - [31] = "BCS", - [32] = "LSL", - [33] = "LLB", - [34] = "CLC", - [35] = "PLX", - [36] = "BCC", - [37] = "LSR", - [38] = "LRB", - [39] = "PLA", - [40] = "TAB", - [41] = "BEQ", - [42] = "ROL", - [43] = "RLB", - [44] = "SEC", - [45] = "TBA", - [46] = "BNE", - [47] = "ROR", - [48] = "RRB", - [49] = "DEY", - [50] = "TAY", - [51] = "BVS", - [52] = "MUL", - [53] = "MAB", - [54] = "CLI", - [55] = "TYA", - [56] = "BVC", - [57] = "DIV", - [58] = "DAB", - [59] = "INY", - [60] = "TAX", - [61] = "RTS", - [62] = "RTL", - [63] = "CMP", - [64] = "CAB", - [65] = "SEI", - [66] = "LDX", - [67] = "TXA", - [68] = "RTI", - [69] = "LDA", - [70] = "DEX", - [71] = "CLV", - [72] = "TYX", - [73] = "STA", - [74] = "TSX", - [75] = "LDB", - [76] = "INX", - [77] = "WAI", - [78] = "TXY", - [79] = "STB", - [80] = "TXS", - [81] = "LDY", - [82] = "BRK", - [83] = "NOP", - [84] = "STY", - [85] = "DEB", - [86] = "ASR", - [87] = "ARB", - [88] = "STX", - [89] = "INB" + [15] = "AND", + [16] = "ABA", + [17] = "PLP", + [18] = "CPX", + [19] = "PHY", + [20] = "BPO", + [21] = "ORA", + [22] = "OAB", + [23] = "STT", + [24] = "PLY", + [25] = "BNG", + [26] = "XOR", + [27] = "XAB", + [28] = "PHA", + [29] = "PHX", + [30] = "BCS", + [31] = "LSL", + [32] = "LLB", + [33] = "CLC", + [34] = "PLX", + [35] = "BCC", + [36] = "LSR", + [37] = "LRB", + [38] = "PLA", + [39] = "TAB", + [40] = "BEQ", + [41] = "ROL", + [42] = "RLB", + [43] = "SEC", + [44] = "TBA", + [45] = "BNE", + [46] = "ROR", + [47] = "RRB", + [48] = "DEY", + [49] = "TAY", + [50] = "BVS", + [51] = "MUL", + [52] = "MAB", + [53] = "CLI", + [54] = "TYA", + [55] = "BVC", + [56] = "DIV", + [57] = "DAB", + [58] = "INY", + [59] = "TAX", + [60] = "RTS", + [61] = "CMP", + [62] = "CAB", + [63] = "SEI", + [64] = "LDX", + [65] = "TXA", + [66] = "RTI", + [67] = "LDA", + [68] = "DEX", + [69] = "CLV", + [70] = "TYX", + [71] = "STA", + [72] = "TSX", + [73] = "LDB", + [74] = "INX", + [75] = "WAI", + [76] = "TXY", + [77] = "STB", + [78] = "TXS", + [79] = "LDY", + [80] = "BRK", + [81] = "NOP", + [82] = "STY", + [83] = "DEB", + [84] = "ASR", + [85] = "ARB", + [86] = "STX", + [87] = "INB" }; static const char *instdesc[OPNUM] = { @@ -371,81 +367,79 @@ static const char *instdesc[OPNUM] = { [12] = "PuLl the number of bytes specified, from the stack, to the B register.", [13] = "INCrement accumulator, or memory.", [14] = "Jump to a SubRoutine.", - [15] = "Jump to a Subroutine, Long address.", - [16] = "Bitwise AND accumulator, with operand.", - [17] = "Bitwise AND Accumulator, with B.", - [18] = "PuLl the number of bytes specified, from the stack, to the Processor status register.", - [19] = "ComPare the X register, with operand.", - [20] = "PusH the number of bytes specified, from the Y register to the stack.", - [21] = "Branch if POsitive.", - [22] = "Bitwise OR Accumulator, with operand.", - [23] = "Bitwise OR Accumulator, with B.", - [24] = "STart a Thread.", - [25] = "PuLl the number of bytes specified, from the stack, to the Y register.", - [26] = "Branch if NeGative.", - [27] = "Bitwise XOR Accumulator, with operand.", - [28] = "Bitwise XOR Accumulator, with B.", - [29] = "PusH the number of bytes specified, from the Accumulator to the stack.", - [30] = "PusH the number of bytes specified, from the X register to the stack.", - [31] = "Branch if the Carry flag is Set.", - [32] = "Logical Shift Left accumulator, with operand.", - [33] = "Logical Shift Left accumulator, with B.", - [34] = "CLear the Carry flag.", - [35] = "PuLl the number of bytes specified, from the stack, to the X register.", - [36] = "Branch if the Carry flag has been Cleared.", - [37] = "Logical Shift Right accumulator, with operand.", - [38] = "Logical Shift Right accumulator, with B.", - [39] = "PuLl the number of bytes specified, from the stack, to the Accumulator.", - [40] = "Transfer the value from the Accumulator, to the B register.", - [41] = "Branch if EQual (the zero flag has been set).", - [42] = "ROtate Left accumulator, with operand.", - [43] = "Rotate Left accumulator, with B.", - [44] = "SEt the Carry flag.", - [45] = "Transfer the value from the Y register, to the Accumulator.", - [46] = "Branch if Not Equal (the zero flag has been cleared)", - [47] = "ROtate Right accumulator, with operand.", - [48] = "Rotate Right accumulator, with B.", - [49] = "DEcrement the Y register.", - [50] = "Transfer the value from the Accumulator, to the Y register.", - [51] = "Branch if the oVerflow flag is Set.", - [52] = "MULtiply accumulator, with operand.", - [53] = "Multiply Accumulator, with B.", - [54] = "CLear the Interrupt flag.", - [55] = "Transfer the value from the Y register, to the Accumulator.", - [56] = "Branch if the oVerflow flag has been Cleared.", - [57] = "DIVide accumulator, with operand, and put the remainder into the B register.", - [58] = "Divide Accumulator, with B, and put the remainder into the X register.", - [59] = "INcrement the Y register.", - [60] = "Transfer the value from the Accumulator, to the X register.", - [61] = "ReTurn from a Subroutine.", - [62] = "ReTurn from subroutine, Long address.", - [63] = "CoMPare acumulator, with operand.", - [64] = "Compare Accumulator, with B.", - [65] = "SEt the Interrupt flag.", - [66] = "LoaD the value from the operand, to the X register.", - [67] = "Transfer the value from the X register, to the Accumulator.", - [68] = "ReTurn from an Interrupt.", - [69] = "LoaD the value from the operand, to the Accumulator.", - [70] = "DEcrement the X register.", - [71] = "CLear the oVerflow flag.", - [72] = "Transfer the value from the Y register, to the X register.", - [73] = "STore the value from the Accumulator, in memory.", - [74] = "Transfer the value from the Stack pointer, to the X register.", - [75] = "LoaD the value from the operand, to the B register.", - [76] = "INcrement the X register.", - [77] = "WAIt for an interrupt", - [78] = "Transfer the value from the X register, to the Y register.", - [79] = "STore the value from the B register, in memory.", - [80] = "Transfer the value from the X register, to the Stack pointer.", - [81] = "LoaD the value from the operand, to the Y register.", - [82] = "BReaKpoint", - [83] = "NO oPeration", - [84] = "STore the value from the Y register, in memory.", - [85] = "DEcrement the B register.", - [86] = "Arithmetic Shift Right accumulator, with operand.", - [87] = "Arithmetic shift Right accumulator, with B.", - [88] = "STore the value from the X register, in memory.", - [89] = "INcrement the B register." + [15] = "Bitwise AND accumulator, with operand.", + [16] = "Bitwise AND Accumulator, with B.", + [17] = "PuLl the number of bytes specified, from the stack, to the Processor status register.", + [18] = "ComPare the X register, with operand.", + [19] = "PusH the number of bytes specified, from the Y register to the stack.", + [20] = "Branch if POsitive.", + [21] = "Bitwise OR Accumulator, with operand.", + [22] = "Bitwise OR Accumulator, with B.", + [23] = "STart a Thread.", + [24] = "PuLl the number of bytes specified, from the stack, to the Y register.", + [25] = "Branch if NeGative.", + [26] = "Bitwise XOR Accumulator, with operand.", + [27] = "Bitwise XOR Accumulator, with B.", + [28] = "PusH the number of bytes specified, from the Accumulator to the stack.", + [29] = "PusH the number of bytes specified, from the X register to the stack.", + [30] = "Branch if the Carry flag is Set.", + [31] = "Logical Shift Left accumulator, with operand.", + [32] = "Logical Shift Left accumulator, with B.", + [33] = "CLear the Carry flag.", + [34] = "PuLl the number of bytes specified, from the stack, to the X register.", + [35] = "Branch if the Carry flag has been Cleared.", + [36] = "Logical Shift Right accumulator, with operand.", + [37] = "Logical Shift Right accumulator, with B.", + [38] = "PuLl the number of bytes specified, from the stack, to the Accumulator.", + [39] = "Transfer the value from the Accumulator, to the B register.", + [40] = "Branch if EQual (the zero flag has been set).", + [41] = "ROtate Left accumulator, with operand.", + [42] = "Rotate Left accumulator, with B.", + [43] = "SEt the Carry flag.", + [44] = "Transfer the value from the Y register, to the Accumulator.", + [45] = "Branch if Not Equal (the zero flag has been cleared)", + [46] = "ROtate Right accumulator, with operand.", + [47] = "Rotate Right accumulator, with B.", + [48] = "DEcrement the Y register.", + [49] = "Transfer the value from the Accumulator, to the Y register.", + [50] = "Branch if the oVerflow flag is Set.", + [51] = "MULtiply accumulator, with operand.", + [52] = "Multiply Accumulator, with B.", + [53] = "CLear the Interrupt flag.", + [54] = "Transfer the value from the Y register, to the Accumulator.", + [55] = "Branch if the oVerflow flag has been Cleared.", + [56] = "DIVide accumulator, with operand, and put the remainder into the B register.", + [57] = "Divide Accumulator, with B, and put the remainder into the X register.", + [58] = "INcrement the Y register.", + [59] = "Transfer the value from the Accumulator, to the X register.", + [60] = "ReTurn from a Subroutine.", + [61] = "CoMPare acumulator, with operand.", + [62] = "Compare Accumulator, with B.", + [63] = "SEt the Interrupt flag.", + [64] = "LoaD the value from the operand, to the X register.", + [65] = "Transfer the value from the X register, to the Accumulator.", + [66] = "ReTurn from an Interrupt.", + [67] = "LoaD the value from the operand, to the Accumulator.", + [68] = "DEcrement the X register.", + [69] = "CLear the oVerflow flag.", + [70] = "Transfer the value from the Y register, to the X register.", + [71] = "STore the value from the Accumulator, in memory.", + [72] = "Transfer the value from the Stack pointer, to the X register.", + [73] = "LoaD the value from the operand, to the B register.", + [74] = "INcrement the X register.", + [75] = "WAIt for an interrupt", + [76] = "Transfer the value from the X register, to the Y register.", + [77] = "STore the value from the B register, in memory.", + [78] = "Transfer the value from the X register, to the Stack pointer.", + [79] = "LoaD the value from the operand, to the Y register.", + [80] = "BReaKpoint", + [81] = "NO oPeration", + [82] = "STore the value from the Y register, in memory.", + [83] = "DEcrement the B register.", + [84] = "Arithmetic Shift Right accumulator, with operand.", + [85] = "Arithmetic shift Right accumulator, with B.", + [86] = "STore the value from the X register, in memory.", + [87] = "INcrement the B register." }; static const uint8_t bitsize[4] = { @@ -101,8 +101,8 @@ void disasm(struct sux *cpu, uint64_t *operands, uint8_t lines, uint8_t opcode, ptr.u8[6] = addr[adr+6]; ptr.u8[7] = addr[adr+7]; wprintw(scr, ", idx0: $%04"PRIX64, ptr.u64); if (address == CTRL_ADDR || addr[STEP_ADDR]) { - mvwprintw(scr, 29, 0, "address: $%04"PRIX64", scr_row: %02u, scr_col: %02u, scr_str: %02u, scr_end: %02u\r", address, addr[0], addr[1], addr[0x1C], addr[0x1D]); - adr = 0x300000; + mvwprintw(scr, 29, 0, "address: $%04"PRIX64", scr_row: %02u, scr_col: %02u, scr_str: %02u, scr_end: %02u\r", address, addr[0], addr[1], addr[0x22], addr[0x23]); + adr = 0x30000; wmove(scr, 32, 0); wprintw(scr, "bitabl: "); for (uint8_t i = 0; i < 16; i++) { @@ -114,7 +114,7 @@ void disasm(struct sux *cpu, uint64_t *operands, uint8_t lines, uint8_t opcode, line_idx = (i << 6) + (i << 4); for (uint8_t j = 0; j < 0x50; j++) { wprintw(scr, "%02X", addr[tmpad+j+line_idx]); - if ((addr[0]+addr[0x1C]) == i && addr[1] == j) { + if ((addr[0]+addr[0x22]) == i && addr[1] == j) { iscursor=1; getyx(scr,row, col); wmove(scr, ln++, 0); @@ -23,7 +23,7 @@ static const char *opname[0x100] = { [0x1C] = "INC a", [0x1D] = "INC zm", [0x1E] = "JSR zm", - [0x20] = "JSL a", + [0x20] = "JSR a", [0x21] = "AND #", [0x22] = "ABA", [0x24] = "AND a", @@ -131,7 +131,6 @@ static const char *opname[0x100] = { [0xAC] = "CPB iny", [0xAD] = "CPB inx", [0xAE] = "RTS", - [0xB0] = "RTL", [0xB1] = "CMP #", [0xB2] = "CAB", [0xB4] = "CMP a", @@ -23,8 +23,8 @@ enum base_isa { PLB = 0x1A, /* PuLl B register to stack. */ INC_AB = 0x1C, /* INC Absolute. */ INC_Z = 0x1D, /* INC Zero Matrix. */ - JSR = 0x1E, /* Jump to SubRoutine. */ - JSL = 0x20, /* Jump to Subroutine Long. */ + JSR_Z = 0x1E, /* Jump to SubRoutine. */ + JSR = 0x20, /* JSR Absolute. */ AND = 0x21, /* bitwise AND with accumulator. */ ABA = 0x22, /* bitwise And with Accumulator, and B register. */ AND_AB = 0x24, /* AND Absolute. */ @@ -132,7 +132,6 @@ enum base_isa { CPB_IY = 0xAC, /* CPB Indirect Indexed. */ CPB_IX = 0xAD, /* CPB Indexed Indirect. */ RTS = 0xAE, /* ReTurn from Subroutine. */ - RTL = 0xB0, /* ReTurn from subroutine Long. */ CMP = 0xB1, /* CoMPare accumulator. */ CAB = 0xB2, /* Compare Accumulator, and B. */ CMP_AB = 0xB4, /* CMP Absolute. */ @@ -10,7 +10,7 @@ #define getclk 0 #define keypoll 0 -#define OPNUM 90 +#define OPNUM 88 #define C (1 << 0) /* Carry flag. */ #define Z (1 << 1) /* Zero flag. */ diff --git a/programs/subasm.s b/programs/subasm.s index 350e105..e5d620f 100644 --- a/programs/subasm.s +++ b/programs/subasm.s @@ -65,8 +65,7 @@ mne: .byte "CPY", $19, $3D, $FF, $FF, $85, $FF, $FF, $4C, $FF .byte "PLB", $1A, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF .byte "INC", $FF, $1D, $FF, $FF, $FF, $FF, $FF, $1C, $F5 - .byte "JSR", $FF, $1E, $FF, $FF, $BE, $FF, $FF, $FF, $FF - .byte "JSL", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $20, $FF + .byte "JSR", $FF, $1E, $FF, $FF, $BE, $FF, $FF, $20, $FF .byte "AND", $21, $26, $FF, $FF, $FF, $FF, $FF, $24, $FF .byte "ABA", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $22 .byte "PLP", $28, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF @@ -113,7 +112,6 @@ mne: .byte "INY", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $A8 .byte "TAX", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $AA .byte "RTS", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $AE - .byte "RTL", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $B0 .byte "CMP", $B1, $B6, $FF, $FF, $25, $7D, $7C, $B4, $FF .byte "CAB", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $B2 .byte "SEI", $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $B8 @@ -214,22 +212,22 @@ fix_val: subasm: ldb #0 ; Set the first pointer lda.d #cmd_buf ; to the command buffer. - jsl set_ptr ; + jsr set_ptr ; tba ; Reset A. tax ; Reset X. - jsl chk_shcmd ; Did we get a shortend command? + jsr chk_shcmd ; Did we get a shortend command? bne parse_cmd ; Yes, so skip everything else. jmp subasm_end ; - jsl chk_cmd ; No, but did we get a full command? + jsr chk_cmd ; No, but did we get a full command? bne parse_cmd ; Yes, so skip everything else. - jsl lexer ; No, so start lexing this line. + jsr lexer ; No, so start lexing this line. subasm_end: - rtl ; End of subasm. + rts ; End of subasm. parse_cmd: ldb #1 ; Set the second pointer lda.d #cmd_srt ; to the command subroutine table. - jsl set_ptr ; + jsr set_ptr ; deb ; Reset B. tba ; Reset A. lda f ; Get the command ID. @@ -241,7 +239,7 @@ parse_cmd: lda.w (ptr2), y ; Get the command subroutine, from the command subroutine table. ply #2 ; Get back the screen buffer position. ldb #2 ; Save it in the third pointer. - jsl set_ptr ; + jsr set_ptr ; ldb #0 ; Reset B. jsr (ptr3) ; Run the command's subroutine. jmp subasm_end ; We are done. @@ -250,7 +248,7 @@ chk_shcmd: tba ; Reset A. inb ; Set the second pointer lda.w #sh_cmds ; to the shortend command table. - jsl set_ptr ; + jsr set_ptr ; deb ; Reset B. tba ; Reset A. phy #2 ; Preserve the screen buffer position. @@ -283,19 +281,19 @@ shcmd_fail: tax ; Reset X. shcmd_end: ply #2 ; Get back the screen buffer position. - rtl ; End of chk_shcmd. + rts ; End of chk_shcmd. print_hex: pha #8 ; Preserve the hex value. and #0 ; Reset A. ldb #1 ; Set the second pointer lda.w #hex_char ; to the start of hex character table. - jsl set_ptr ; + jsr set_ptr ; inb ; Set the third pointer lda.d #hex_str ; to the end of hex string buffer. clc ; Do a non carrying add. adc #$10 ; - jsl set_ptr ; + jsr set_ptr ; ldb #0 ; Reset B. pla #8 ; Get the hex value back. pnthex_lp: @@ -325,22 +323,22 @@ pnthex_lp4: beq pnthex_end ; Yes, so we're done. jmp pnthex_lp ; No, so keep printing more digits. pnthex_end: - rtl ; End of print_hex. + rts ; End of print_hex. charcpy: ldx idx3 ; Get the string index. sta strbuf, x ; Save it in the string buffer. inc idx3 ; Increment the string index. - rtl ; End of charcpy. + rts ; End of charcpy. print_hi: and #0 ; Reset A. sta idx3 ; Clear the string index. lda #'$' ; Print the hex delimiter. - jsl charcpy ; + jsr charcpy ; lda.q idx0 ; Get the masked address. ldx #$10 ; Set digit count to 16. - jsl print_hex ; Print the address. + jsr print_hex ; Print the address. lda.q hex_str ; Get the lower half of the string. sta.q strbuf+1 ; Save it in the string buffer. lda.q hex_str+8 ; Get the upper half of the string. @@ -348,10 +346,10 @@ print_hi: ldx #$11 ; Add 16 to the index. stx idx3 ; lda #':' ; Print a colon. - jsl charcpy ; + jsr charcpy ; lda # ' ' ; Print a space. - jsl charcpy ; - rtl ; End of print_hi. + jsr charcpy ; + rts ; End of print_hi. print_lo: lda #0 ; Reset A. @@ -359,11 +357,11 @@ print_lo: pntlo_lp: ldx #2 ; Set digit count to 2. pha #1 ; Preserve the nibble offset. - jsl print_hex ; Print the low nibble offset. + jsr print_hex ; Print the low nibble offset. lda.w (ptr3) ; Get the two digits. - jsl charcpy ; Copy the first digit. + jsr charcpy ; Copy the first digit. lsr #8 ; Copy the next digit. - jsl charcpy ; + jsr charcpy ; pla #1 ; Get the nibble offset back. inc ; Increment the offset. cmp #$10 ; Are we at the last offset? @@ -371,7 +369,7 @@ pntlo_lp: pntlo_lp1: pha #1 ; No, so preserve the nibble offset. lda #' ' ; Add a space to the string buffer. - jsl charcpy ; + jsr charcpy ; pla #1 ; Get the nibble offset back. jmp pntlo_lp ; Keep looping. pntlo_end: @@ -380,8 +378,8 @@ pntlo_end: sta strbuf, x ; tax ; Reset X. lda.d #strbuf ; Print the string buffer. - jsl print_str ; - rtl ; End of print_lo. + jsr print_str ; + rts ; End of print_lo. print_chunk: ldx #0 ; Reset X. @@ -391,16 +389,16 @@ pntchnk_lp: and #0 ; Reset A. ldx #2 ; Set the digit count to 2. lda (idx0), y ; Get the byte at that address. - jsl print_hex ; Print the byte. + jsr print_hex ; Print the byte. lda.w (ptr3) ; Get the two digits. - jsl charcpy ; Copy the first digit. + jsr charcpy ; Copy the first digit. lsr #8 ; Copy the next digit. - jsl charcpy ; + jsr charcpy ; iny ; Increment the byte index. cpy #$10 ; Have we read 16 bytes? beq pntchnk_end ; Yes, so we're done. lda #' ' ; No, so add a soace to the string buffer. - jsl charcpy ; + jsr charcpy ; jmp pntchnk_lp ; Keep looping. pntchnk_end: ply #2 ; Get the screen buffer index back. @@ -409,7 +407,7 @@ pntchnk_end: sta strbuf, x ; tax ; Reset X. sta idx3 ; Clear the string index. - rtl ; End of print_chunk. + rts ; End of print_chunk. viewmem: lda.q prg_cnt ; Get the program counter. @@ -418,18 +416,18 @@ viewmem: sta idx0 ; Overwrite the first byte, with the masked byte. lda #19 ; Move the cursor to the right, by 19 columns. sta scr_col ; - jsl update_pos ; - jsl print_lo ; Print the low nibble offsets. + jsr update_pos ; + jsr print_lo ; Print the low nibble offsets. ldx #0 ; Reset X. ldb #0 ; Reset B. stb idx1 ; Reset the byte count. vmem_lp0: lda #'\n' ; Print a newline. - jsl print_char ; - jsl print_hi ; Place the address in the string buffer. - jsl print_chunk ; Place the next 16 bytes in the string buffer. + jsr print_char ; + jsr print_hi ; Place the address in the string buffer. + jsr print_chunk ; Place the next 16 bytes in the string buffer. lda.d #strbuf ; Print the string buffer. - jsl print_str ; + jsr print_str ; inc idx1 ; Increment the chunk count. ldb idx1 ; Get the chunk count. cpb #$10 ; Did we print 16 chunks? @@ -442,7 +440,7 @@ vmem_lp0: jmp vmem_lp0 ; Keep looping. vmem_end: lda #'\n' ; Print a newline. - jsl print_char ; + jsr print_char ; and #0 ; Reset A. rts ; End of viewmem. diff --git a/programs/subeditor.s b/programs/subeditor.s index e344588..0a42c32 100644 --- a/programs/subeditor.s +++ b/programs/subeditor.s @@ -38,11 +38,6 @@ made: author: .byte "mr b0nk 500" -;sub_name: -; .byte "SuB Suite" -;sub_ver: -; .byte "0.9" - string2: .byte "You typed, " @@ -143,17 +138,17 @@ reset: lda.w #$1FFF ; Set the clear count to $1FFF. sta.w scr_ptr ; lda.d #buffer ; Set the array to be cleared to the screen buffer. - jsl clr_arr ; Clear the screen buffer. - jsl pnt_strt ; Print the starting message. + jsr clr_arr ; Clear the screen buffer. + jsr pnt_strt ; Print the starting message. jmp start ; Goto the start of the main program. clr_arr: phb #1 ; Preserve whatever was in B. ldb #0 ; Clear B. - jsl set_ptr ; Set the first pointer to the parameter. + jsr set_ptr ; Set the first pointer to the parameter. adc #8 ; Set the second pointer to the parameter, plus eight. inb ; Tell set_ptr to set the second pointer. - jsl set_ptr ; + jsr set_ptr ; deb ; Set B back to zero. tba ; clr_arr_st: @@ -175,26 +170,26 @@ clr_arr_st: clr_arr_end: ldy.w zero ; Set the index back to zero. plb #1 ; Get whatever was in the B register, back. - rtl ; End of clr_arr. + rts ; End of clr_arr. pnt_strt: lda.w #ed_name ; Print the name of the editor. - jsl print_str ; + jsr print_str ; lda.w #ver_str ; Print the version text. - jsl print_str ; + jsr print_str ; lda.w #ed_ver ; Print the version number. - jsl print_str ; + jsr print_str ; lda.w #ed_sver ; Print the sub version number. - jsl print_str ; + jsr print_str ; lda #'\n' ; Print a newline. - jsl print_char ; + jsr print_char ; lda.w #made ; Print the "Created by" text. - jsl print_str ; + jsr print_str ; lda.w #author ; Print the name of the author. - jsl print_str ; + jsr print_str ; lda #'\n' ; Print a newline. - jsl print_char ; - rtl ; End of pnt_strt. + jsr print_char ; + rts ; End of pnt_strt. start: lda #0 ; TODO: Update this for the Super VIA. @@ -205,7 +200,7 @@ start: lda.w #$3FF ; Set the clear count to $3FF. sta.w scr_ptr ; lda.d #cmd_buf ; Set the array to be cleared to the command buffer. - jsl clr_arr ; Clear the command buffer. + jsr clr_arr ; Clear the command buffer. ply #2 ; Get back the cursor index. and #0 ; Reset the Accumulator. sta end ; @@ -217,7 +212,7 @@ read: inc end ; Enable the dummy flag. lda status ; Did we get a key? beq read ; No, so try again. - jsl getchar ; Yes, and was it a newline? + jsr getchar ; Yes, and was it a newline? beq parse ; Yes, so start parsing the line. jmp read ; No, so keep looping. @@ -227,7 +222,7 @@ print_str: print_str2: lda.q end ; Get the parameter. ldb #0 ; Clear the B register. - jsl set_ptr ; Set the first pointer to the parameter. + jsr set_ptr ; Set the first pointer to the parameter. tba ; Clear the Accumulator. pntstr_lp: ldb #1 ; Enable replace mode. @@ -242,12 +237,12 @@ pntstr_lp: ply #2 ; Get the cursor index back. beq pntstr_end ; Yes, so we're done. inx ; No, so increment the string index. - jsl print_char ; Print the character. + jsr print_char ; Print the character. jmp pntstr_lp ; Keep looping. pntstr_end: ldb #0 ; Enable insert mode. stb b ; - rtl ; End of print_str. + rts ; End of print_str. getbit: clc ; Clear the carry flag. @@ -263,10 +258,10 @@ getbt1: pha #1 ; Save the parameter. ldb #1 ; Make sure that set_ptr sets the second pointer. lda.d #bitabl ; Set the second pointer to the linewrap table. - jsl set_ptr ; + jsr set_ptr ; lsr #$10 ; Clear the Accumulator. pla #1 ; Get the return byte back. - jsl bitpos ; Get the bit, and byte position. + jsr bitpos ; Get the bit, and byte position. phy #2 ; Save the screen index. txy ; Get the byte position. ldb (ptr2), y ; Get one byte of the wrap table. @@ -279,10 +274,10 @@ clrbit: pha #1 ; Save the parameter. ldb #1 ; Make sure that set_ptr sets the second pointer. lda.d #bitabl ; Set the second pointer to the linewrap table. - jsl set_ptr ; + jsr set_ptr ; and #0 ; Clear the Accumulator. pla #1 ; Get the return byte back. - jsl bitpos ; Get the bit, and byte position. + jsr bitpos ; Get the bit, and byte position. xor #$FF ; Invert the bitmask. phy #2 ; Save the screen index. txy ; Get the byte position. @@ -293,16 +288,16 @@ bitsav: ply #2 ; Get the screen index back. bitout: ldx bitmask ; Return the bitmask. - rtl ; We are done. + rts ; We are done. setbit: pha #1 ; Save the parameter. ldb #1 ; Make sure that set_ptr sets the second pointer. lda.d #bitabl ; Set the second pointer to the linewrap table. - jsl set_ptr ; + jsr set_ptr ; and #0 ; Clear the Accumulator. pla #1 ; Get the return byte back. - jsl bitpos ; Get the bit, and byte position. + jsr bitpos ; Get the bit, and byte position. phy #2 ; Save the screen index. txy ; Get the byte position. ldb (ptr2), y ; Get one byte of the wrap table. @@ -313,7 +308,7 @@ bitpos: pha #1 ; Save the parameter. ldb #0 ; Make sure that set_ptr sets the first pointer. lda.w #bits ; Set the first pointer to the bitmask table. - jsl set_ptr ; + jsr set_ptr ; and #0 ; Clear the Accumulator. pla #1 ; Get the parameter back. stx bitmask ; Make the line number the bitmask. @@ -329,7 +324,7 @@ bitpos: lsr #3 ; Get the byte position. tax ; Copy it into X. pla #1 ; Get back the bitmask. - rtl ; End of bitpos. + rts ; End of bitpos. getchar: lda kbd ; Get the character that was typed from the keyboard. @@ -340,14 +335,14 @@ getchar: phy #2 ; Save the cursor index. cmp #'\n' ; Was the character that was typed, a newline? bne getchar_pnt ; No, so just print the character. - jsl cmd_cpy ; Yes, so start copying the line to the command buffer. + jsr cmd_cpy ; Yes, so start copying the line to the command buffer. getchar_pnt: ply #2 ; Get back the cursor index. pla #1 ; Get back the character. ldb e ; Is the temporary row position non zero? bne reset_row ; Yes, so reset the row positon. getchar_pt1: - jsl print_char ; No, so print the character. + jsr print_char ; No, so print the character. lda a ; Get the return value. cmp #'\n' ; Is the return value, a newline? beq getchar_ln ; Yes, so return 0. @@ -369,13 +364,13 @@ getchar_ln: getchar_chr: lda #1 ; Return one. getchar_end: - rtl ; End of get char. + rts ; End of get char. cmd_cpy: lda scr_row ; Get the row position. sta scr_trow ; Save it for later. - jsl findend ; Find the end of the line. + jsr findend ; Find the end of the line. ldb scr_str ; Has the screen been scrolled? beq cmd_cpy3 ; No, so don't subtract the screen's starting point from the line number. cmd_cpy2: @@ -385,7 +380,7 @@ cmd_cpy2: cmd_cpy3: sta scr_row ; Set the row position to the end of the line. sta e ; Save it into the temporary row posiition. - jsl findst ; Find the start of the line. + jsr findst ; Find the start of the line. clc ; Clear the carry flag. lda scr_row ; Get the row position. adc scr_str ; Add it with the screen's starting row. @@ -394,10 +389,10 @@ cmd_cpy3: ldx.w #0 ; Reset the X register. ldb #0 ; Make sure that set_ptr sets the first pointer. lda.d #buffer ; Set the first pointer to the start of the screen buffer. - jsl set_ptr ; + jsr set_ptr ; inb ; Make sure that set_ptr sets the second pointer. lda.d #cmd_buf ; Set the second pointer to the start of the command buffer. - jsl set_ptr ; + jsr set_ptr ; deb ; Set B back to zero. tba ; Set the accumulator to zero. cmd_cpy_lp: @@ -431,14 +426,14 @@ cmd_cpy_nd0: ply #2 ; Get back the screen index. cmd_cpy_nd: tab ; The B register is zero, so clear the Accumulator. - rtl ; End of cmd_cpy. + rts ; End of cmd_cpy. findst: lda #0 ; Reset A. findst_lp: pha #1 ; Save the current line number. - jsl getbit ; Is this the start of the line? + jsr getbit ; Is this the start of the line? pla #1 ; Get the current line number back. bcc findst_done ; Yes, so we're done. inc ; No, so check the next physical line. @@ -448,14 +443,14 @@ findst_lp: inc scr_row ; Put the row postiion back to zero. findst_done: cmp #0 ; Update all the flags. - rtl ; End of findst. + rts ; End of findst. fndend: phb #1 ; Save the contents of the B register. ldb #0 ; Make sure that set_ptr sets the first pointer. lda.d #buffer ; Set the first pointer to the start of the screen buffer. - jsl set_ptr ; + jsr set_ptr ; tba ; Set the Accumulator to zero. plb #1 ; Restore the contents of the B register. phy #2 ; @@ -467,25 +462,25 @@ fndend_lp: fndend_done: sty.w scr_ptr3 ; ply #2 ; - rtl ; End of fndend. + rts ; End of fndend. findend: - jsl fndend ; + jsr fndend ; lda.w scr_ptr3 ; div #maxcol+1 ; - rtl ; + rts ; parse: lda #0 ; tax ; - jsl subasm ; + jsr subasm ; jmp start ; print_char: sta a ; Save the typed character for now. ldb #2 ; Make sure that set_ptr sets the third pointer. lda.d #buffer ; Set the third pointer to the start of the screen buffer. - jsl set_ptr ; + jsr set_ptr ; ldb #0 ; Set B to zero. tba ; Set the Accumulator to zero. lda a ; Get back the character. @@ -511,25 +506,25 @@ printc: lda b ; No, but was the flag set? bne printc_save ; Yes, so don't shift the line. sty.w scr_ptr ; No, so save the cursor index for later. - jsl fndend ; Find the end of the line. + jsr fndend ; Find the end of the line. jmp prntc_movln ; Start shifting the line right. prntc_updt: lda scr_col ; Save the current column position for later. sta scr_tcol ; prntc_updt2: - jsl findend ; Find the end of the line. + jsr findend ; Find the end of the line. sta e ; Use it for redrawing the line. sta scr_row ; Set the row position to to the end of the line. - jsl findst ; Find the start of the line. + jsr findst ; Find the start of the line. lda scr_row ; Get the start of the line. prntc_updt3: sta f ; Set the starting line, to the start of the line. - jsl rdrw_ln ; Redraw the line. + jsr rdrw_ln ; Redraw the line. lda scr_trow ; Get the real row position back. sta scr_row ; lda scr_tcol ; Get the real column position back. sta scr_col ; - jsl update_pos ; Update the cursor's position. + jsr update_pos ; Update the cursor's position. dec d ; jmp printc_sav1 ; prntc_movln: @@ -539,7 +534,7 @@ prntc_movln: dey ; ldb #1 ; stb d ; - jsl shftln ; + jsr shftln ; ldb #1 ; stb d ; lda a ; @@ -580,7 +575,7 @@ printc_scrl: clc ; lda #1 ; sta wrapped ; - jsl scrl_down ; + jsr scrl_down ; jmp printc_wrap ; printc_wrap: ldb #0 @@ -596,11 +591,11 @@ printc_wrp2: lda scr_row ; adc scr_str ; tax ; - jsl setbit ; + jsr setbit ; plx #2 ; - jsl update_pos ; + jsr update_pos ; printc_end: - rtl ; + rts ; nl: lda #0 ; Reset A. @@ -612,11 +607,11 @@ nl1: lda scr_row ; Get the row position. cmp #maxrow ; Are we at the bottom of the screen? bcc nl_inc ; No, so move down one line. - jsl scrl_down ; Yes, so scroll down one line. + jsr scrl_down ; Yes, so scroll down one line. jmp nl_end ; We are done. nl_inc: inc scr_row ; Move the cursor down by one line. - jsl update_pos ; Update the cursor's position. + jsr update_pos ; Update the cursor's position. nl_end: lda #'\n' ; Print the newline. sta a ; @@ -633,15 +628,15 @@ clr_scr: lda.w #$1FFF ; Set the clear count to $1FFF. sta.w scr_ptr ; lda.d #buffer ; Set the array to be cleared to the screen buffer. - jsl clr_arr ; Clear the screen buffer. + jsr clr_arr ; Clear the screen buffer. tay ; lda.w #$3FF ; Set the clear count to $3FF. sta.w scr_ptr ; lda.d #cmd_buf ; Set the array to be cleared to the command buffer. - jsl clr_arr ; Clear the screen buffer. + jsr clr_arr ; Clear the screen buffer. sta scr_col ; sta scr_row ; - jsl update_pos ; + jsr update_pos ; lda #$C ; sta scr ; jmp printc_end ; @@ -670,10 +665,10 @@ back: stb f ; lda scr_row ; Save the current row position for later. sta scr_trow ; - jsl findend ; Find the end of the line. + jsr findend ; Find the end of the line. sta scr_row ; Set our row position to the end of the line. back0: - jsl findst ; Does this line take up more than one real line? + jsr findst ; Does this line take up more than one real line? beq back1 ; No, so skip updating any other lines. bcs back_updt ; Yes, so update the other lines. lda scr_trow ; Get the real row position back. @@ -686,24 +681,24 @@ back1: iny ; Increment cursor index. ldb #0 ; Set shifting direction to left. stb d ; - jsl shftln ; Shift line back by one character. + jsr shftln ; Shift line back by one character. lda #$7F ; Print a backspace to the screen. sta scr ; lda e ; Are we updating more than one line? beq back3 ; No, so skip to the next step. back2: - jsl findend ; Yes, so find the end of the line. + jsr findend ; Yes, so find the end of the line. sta e ; Set the end parameter to it. lda scr_col ; Save the current column position for now. sta scr_tcol ; - jsl rdrw_ln ; Start redrawing the line. + jsr rdrw_ln ; Start redrawing the line. lda scr_tcol ; Get the real column position back. sta scr_col ; back3: lda scr_trow ; Get the real row position bac. sta scr_row ; dec scr_col ; Move the cursor back by one column, - jsl update_pos ; and update it's position. + jsr update_pos ; and update it's position. jmp printc_end ; We are done. back_updt: lda scr_row ; Set the line to start redrawing, to the start of the line. @@ -716,7 +711,7 @@ bs: beq back_wrap ; Yes, so check for a wrapped line. jmp back ; No, so add the backspace to the buffer. back_wrap: - jsl getbit ; Is this line, a wrapped line? + jsr getbit ; Is this line, a wrapped line? bcs back_wrap1 ; Yes, so check if the cursor is at the top. jmp printc_end ; No, so we're done. back_wrap1: @@ -729,7 +724,7 @@ back_wrap2: jmp printc_end ; No, so we're done. back_scrl: clc ; Clear the carry flag, so that we don't get odd behaviour. - jsl scrl_up ; Scroll up. + jsr scrl_up ; Scroll up. inc scr_row ; Move down by one row. backwrp: clc ; Clear the carry flag. @@ -740,7 +735,7 @@ backwrp2: dec scr_row ; Move up by one row. ldb #maxcol+1 ; Move the cursor to the absolute right of the screen. stb scr_col ; - jsl update_pos ; Update the cursor's position. + jsr update_pos ; Update the cursor's position. jmp back ; Delete the previous character. shftln: @@ -784,11 +779,11 @@ shftln_lp1: jmp shftln_lp1 ; Keep looping. shftln_wrap: tax ; Use the ending line as a parameter for setbit. - jsl setbit ; Set the wrap bit of the ending line. + jsr setbit ; Set the wrap bit of the ending line. jmp shftln_end2 ; We are done. shftln_wrp1: tax ; Use the ending line as a parameter for clrbit. - jsl clrbit ; Clear the wrap bit of the ending line. + jsr clrbit ; Clear the wrap bit of the ending line. jmp shftln_end2 ; We are done. shftln_end: lda (ptr3), y ; Is this character a null terminator? @@ -796,7 +791,7 @@ shftln_end: lda #$20 ; Yes, so convert it to a space for now. sta (ptr3), y ; shftln_nd0: - jsl findend ; Find the ending line. + jsr findend ; Find the ending line. sta d ; Save ending line for later. lda (ptr3), y ; Is this character a space? cmp #$20 ; @@ -810,7 +805,7 @@ shftln_nd1: bcs shftln_wrap ; Yes, so set the wrap bit. jmp shftln_end2 ; No, so we're done. shftln_end1: - jsl findend ; Find the ending line. + jsr findend ; Find the ending line. cpb #0 ; Is the remainder zero? beq shftln_nd2 ; Yes, so check if the ending line is greater than the starting line. jmp shftln_end2 ; No, so we're done. @@ -819,7 +814,7 @@ shftln_nd2: beq shftln_end2 ; No, so we're done. bcs shftln_wrp1 ; Yes, so clear the wrap bit. shftln_end2: - rtl ; End of shftln. + rts ; End of shftln. esc: lda status ; Get the next character. @@ -832,17 +827,17 @@ esc: sta c ; Store the escape code, until we need it. lda #0 ; Set the D pseudo register to zero. sta d ; - jsl isup ; Check if the user pressed up. + jsr isup ; Check if the user pressed up. lda d ; Did the user press up? bne esc_end ; Yes, so we're done. - jsl isdown ; No, so check if the user pressed down. + jsr isdown ; No, so check if the user pressed down. lda d ; Did the user press down? bne esc_end ; Yes, so we're done. lda #0 ; No, so check if the user pressed left. - jsl isleft ; + jsr isleft ; lda d ; Did the user press left? bne esc_end ; Yes, so we're done. - jsl isright ; No, so check if the user pressed right. + jsr isright ; No, so check if the user pressed right. esc_end: lda #0 ; Clear the D pseudo register. sta d ; @@ -857,10 +852,10 @@ shftesc: sta c ; Store the escape code, until we need it. lda #0 ; Use the D pseudo register as a skip flag. sta d ; - jsl isshftup ; Check if the user pressed shift+up. + jsr isshftup ; Check if the user pressed shift+up. lda d ; Was it successful? bne shftesc_end ; Yes, so we're done. - jsl isshftdown ; No, so check if the user pressed shift+down. + jsr isshftdown ; No, so check if the user pressed shift+down. shftesc_end: lda #0 ; Clear the D pseudo register. sta d ; @@ -880,11 +875,11 @@ isup_2: isup_scrl: lda scr_str ; Are we at the top of the screen buffer? beq isup_done ; Yes, so we're done. - jsl scrl_up ; No, so scroll up. + jsr scrl_up ; No, so scroll up. lda #1 ; Tell the escape routine that we were successful. sta d ; isup_done: - rtl ; End of isup. + rts ; End of isup. isdown: lda c ; Load the escape code into the accumulator. @@ -902,7 +897,7 @@ isdown_scrl: sta scr_trow ; lda scr_col ; Save the cursor's column number. sta scr_tcol ; - jsl scrl_down ; Scroll down. + jsr scrl_down ; Scroll down. lda scr_trow ; Load the cursor's row number. sta scr_row ; lda scr_tcol ; Load the cursor's column number. @@ -910,7 +905,7 @@ isdown_scrl: lda #1 ; Tell the escape routine that we were successful. sta d ; isdown_done: - rtl ; End of isdown. + rts ; End of isdown. isright: lda c ; Load the escape code into the accumulator. @@ -922,7 +917,7 @@ isright: jmp right ; No, so move the cursor right, like normal. isright_wrp: inc scr_row ; Move down a row. - jsl getbit ; Is the current line, a wrapped line? + jsr getbit ; Is the current line, a wrapped line? bcs wrap_inc ; Yes, so leave the cursor where it is. dec scr_row ; No, so move the cursor back up a row. jmp isright_dne ; We are done. @@ -931,7 +926,7 @@ isright_scr: beq isright_end ; Yes, so we're done. lda #1 ; No, so scroll down. sta wrapped ; Set the wrapped flag. - jsl scrl_down ; Scroll down. + jsr scrl_down ; Scroll down. jmp isright_end ; We are done. wrap_inc: lda #0 ; Set the cursor to the far left of the screen. @@ -944,11 +939,11 @@ wrap_inc: isright_end: dec scr_row ; Move back up a row. isright_nd2: - jsl update_pos ; Update the cursor position. + jsr update_pos ; Update the cursor position. isright_dne: lda #0 ; Unset the wrapped flag. sta wrapped ; - rtl ; End of isright. + rts ; End of isright. isleft: lda c ; Load the escape code into the accumulator. @@ -961,7 +956,7 @@ isleft: beq left ; Yes, so move the cursor left. jmp isleft_done ; No, so we're done. isleft_wrp: - jsl getbit ; Is the current line, a wrapped line? + jsr getbit ; Is the current line, a wrapped line? bcs wrap_dec ; Yes, so wrap back up a line. jmp isleft_done ; No, so we're done. wrap_dec: @@ -983,34 +978,34 @@ isleft_scrl: bne isleft_end ; Yes so we're done. lda scr_str ; No, but are we actually at the top of the screen buffer? beq isleft_done ; Yes, so we're done. - jsl scrl_up ; No, so scroll up. + jsr scrl_up ; No, so scroll up. jmp isleft_done ; We are done. isleft_end: - jsl update_pos ; Update the cursor position. + jsr update_pos ; Update the cursor position. isleft_done: lda #0 ; Unset the wrapped flag. sta wrapped ; - rtl ; End of isleft. + rts ; End of isleft. up: dec scr_row ; Move the cursor up a line. - jsl update_pos ; Update it's position. + jsr update_pos ; Update it's position. lda #1 ; Tell the escape routine that we succeded. sta d ; jmp isup_done ; We are done. down: inc scr_row ; Move the cursor down a line. - jsl update_pos ; Update it's position. + jsr update_pos ; Update it's position. lda #1 ; Tell the escape routine that we succeded. sta d ; jmp isdown_done ; We are done. right: inc scr_col ; Move the cursor right by one character. - jsl update_pos ; Update it's position. + jsr update_pos ; Update it's position. jmp isright_dne ; We are done. left: dec scr_col ; Move the cursor left a character. - jsl update_pos ; Update it's position. + jsr update_pos ; Update it's position. lda #1 ; Tell the escape routine that we succeded. sta d ; jmp isleft_done ; We are done @@ -1025,7 +1020,7 @@ isshftup: beq shftup_done ; jmp shftup ; shftup_done: - rtl ; + rts ; isshftdown: lda c ; Load the escape code back into the accumulator. @@ -1038,16 +1033,16 @@ isshftdown: bcs shftdn_done ; jmp shftdown ; shftdn_done: - rtl ; + rts ; shftup: - jsl scrl_up ; + jsr scrl_up ; lda #1 ; sta d ; jmp shftup_done ; shftdown: - jsl scrl_down ; + jsr scrl_down ; lda #1 ; sta d ; jmp shftdn_done ; @@ -1066,11 +1061,11 @@ update_pos: sta scr ; to the screen. lda #'[' ; Print '[' sta scr ; to the screen, and start the escape sequence. - jsl getrow ; Start printing the row number to the screen. - jsl getcol ; Start printing the column number to the screen. + jsr getrow ; Start printing the row number to the screen. + jsr getcol ; Start printing the column number to the screen. lda #'H' ; Print 'H' sta scr ; to the screen. - rtl ; End of update_pos. + rts ; End of update_pos. getrow: lda scr_row ; Get the cursor's y coordinate. @@ -1080,7 +1075,7 @@ getrow: tba ; Get the remainder. adc #'0' ; Convert it to ascii, and sta scr ; print to the screen. - rtl ; End of getrow. + rts ; End of getrow. getcol: lda #';' ; Print ';' @@ -1094,7 +1089,7 @@ getcol: clc adc #'0' ; Convert it to ascii, and sta scr ; print to the screen. - rtl ; End of getrow. + rts ; End of getrow. scrl_down: inc scr_str ; Increment the starting line of the screen. @@ -1110,7 +1105,7 @@ scrl_down: lda wrapped ; Was the wrapped flag set? beq scrldn_save ; Yes, so save the cursor position. scrldn1: - jsl rdrw_row ; Redraw this row. + jsr rdrw_row ; Redraw this row. lda wrapped ; Was the wrapped flag set? beq scrldn_load ; Yes, so load the previous cursor position back. jmp scrldn_end ; No, so we're done. @@ -1124,11 +1119,11 @@ scrldn_load: scrldn_end: pla #1 ; Get the cursor's previous line number back. sta scr_row ; - jsl update_pos ; Update the cursor's position. + jsr update_pos ; Update the cursor's position. lda #0 ; Clear the wrapped flag. sta wrapped ; scrldn_done: - rtl ; End of scrl_down. + rts ; End of scrl_down. scrl_up: dec scr_str ; @@ -1145,19 +1140,19 @@ scrl_up: pha #1 ; lda #0 ; sta scr_row ; - jsl rdrw_row ; + jsr rdrw_row ; pla #1 ; sta scr_col ; pla #1 ; sta scr_row ; - jsl update_pos ; + jsr update_pos ; scrlup_done: - rtl ; + rts ; rdrw_row: lda #0 ; sta scr_col ; - jsl update_pos ; + jsr update_pos ; rdrow_st: lda (ptr3), y ; beq rdrow_inc ; @@ -1180,9 +1175,9 @@ rdrow_skip: rdrow_end: lda #0 ; sta scr_col ; - jsl update_pos ; + jsr update_pos ; rdrow_done: - rtl ; + rts ; rdrw_ln: lda scr_row ; @@ -1191,14 +1186,14 @@ rdrw_ln: sta scr_row ; lda scr_col ; pha #1 ; - jsl update_pos ; + jsr update_pos ; rdrwln_lp: lda scr_row ; cmp e ; beq rdrwln_lp1 ; bcs rdrwln_done ; rdrwln_lp1: - jsl rdrw_row ; + jsr rdrw_row ; rdrwln_inc: inc scr_row ; jmp rdrwln_lp ; @@ -1207,11 +1202,11 @@ rdrwln_done: sta scr_col ; pla #1 ; sta scr_row ; - jsl update_pos ; + jsr update_pos ; lda #0 ; sta e ; sta f ; - rtl ; + rts ; set_ptr: cpb #1 ; Are we setting the second pointer? @@ -1230,7 +1225,7 @@ set_ptr3: stb.q ptr3 ; Reset the third pointer. sta.q ptr3 ; Set the third pointer. setptr_end: - rtl ; End of set_ptr. + rts ; End of set_ptr. ; Entry point for SuBAsm. parser: @@ -457,7 +457,7 @@ void *run(void *args) { break; case JSR_IN: /* JSR Indirect. */ case JSR: /* Jump to SubRoutine. */ - case JSL: /* Jump to Subroutine Long. */ + case JSR_Z: /* JSR Zero Matrix. */ value.u64 = cpu->pc[thread]; addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]-0] = value.u8[7]; addr[(cpu->stk_st[thread] << 16)+cpu->sp[thread]-1] = value.u8[6]; @@ -481,7 +481,6 @@ void *run(void *args) { cpu->sp[thread] += 1; cpu->ps.u8[thread] = addr[(cpu->stk_st[thread] << 16)+(cpu->sp[thread])]; /* Falls through. */ case RTS: /* ReTurn from Subroutine. */ - case RTL: /* ReTurn from subroutine Long. */ cpu->sp[thread] += 8; value.u8[0] = addr[(cpu->stk_st[thread] << 16)+(cpu->sp[thread]-7)]; value.u8[1] = addr[(cpu->stk_st[thread] << 16)+(cpu->sp[thread]-6)]; @@ -24,8 +24,8 @@ static const uint8_t optype[0x100] = { [PLB ] = IMM, [INC_AB ] = ABS, [INC_Z ] = ZM, - [JSR ] = ZM, - [JSL ] = ABS, + [JSR_Z ] = ZM, + [JSR ] = ABS, [AND ] = IMM, [ABA ] = IMPL, [AND_AB ] = ABS, @@ -133,7 +133,6 @@ static const uint8_t optype[0x100] = { [CPB_IY ] = INDY, [CPB_IX ] = INDX, [RTS ] = IMPL, - [RTL ] = IMPL, [CMP ] = IMM, [CAB ] = IMPL, [CMP_AB ] = ABS, diff --git a/test/add-sub.s b/test/add-sub.s index 694931d..3dfdca4 100644 --- a/test/add-sub.s +++ b/test/add-sub.s @@ -8,7 +8,7 @@ reset: cps ; Clear the processor status register. ldx.w #$FFFF ; Reset the stack pointer. txs ; - lsr #16 ; Reset A. + and #0 ; Reset A. tab ; Reset B. tax ; Reset X. up: diff --git a/test/fib2.s b/test/fib2.s index 59830a2..9bb2406 100644 --- a/test/fib2.s +++ b/test/fib2.s @@ -1,19 +1,9 @@ -; Variables for thread 0. -.org $1000 -x: - .qword 0 -y: - .qword 1 -z: - .qword 0 -zero: - .qword 0 .org 0 init: cps ; Clear the Processor Status register. start: - lsr #63 ; Reset the accumulator. + and #0 ; Reset the accumulator. tab ; tax ; tay ; @@ -30,4 +20,4 @@ fib: tay ; jmp fib ; No, so keep looping. a -done +d diff --git a/test/hello-world.s b/test/hello-world.s index 9138bc7..f3b540a 100644 --- a/test/hello-world.s +++ b/test/hello-world.s @@ -1,8 +1,12 @@ ; Hello world. ; Writen in Sux assembly by mr b0nk 500 <b0nk@b0nk.xyz> +status = $100 ; Status. +scr = $101 ; Screen output. + + ; Initialize, and declare variables. -.org $8000 +.org $A000 string: .byte "Hello, world!\n" @@ -12,7 +16,7 @@ buffer: ; Get CPU into a known state. -.org $0 +.org $8000 reset: cps ; Reset the processor status. ldx.w #$FFFF ; Set up the stack pointer. @@ -25,21 +29,22 @@ start: line_count: iny ; Increment the line count. - cpy #$32 - beq spin ; Have we printed 50 lines? - jmp start ; Keep looping until we have printed 50 lines. + cpy #50 ; Have we printed 50 lines? + beq disp ; Yes, so we're done. + jmp start ; No, so keep looping. ; Printing sub routine. print: lda string, x ; Get character at offset x. beq line_count ; Did we find a null terminator? - sta $C001 ; Print character. + sta scr ; Print character. inx ; Increment offset. jmp print ; Keep printing more characters. ; The other threads would clash, if we're running the same code. ; So, have them spin instead, please? -.org $1000 +disp: + lda status spin: nop nop @@ -58,5 +63,6 @@ spin: .qword spin .qword spin .qword spin -done +a +d diff --git a/test/input-2.s b/test/input-2.s deleted file mode 100644 index f5cb49e..0000000 --- a/test/input-2.s +++ /dev/null @@ -1,412 +0,0 @@ -; Testing input. -; -; Writen in Sux assembly by -; mr b0nk 500 <b0nk@b0nk.xyz> - -; Instruction mnemonics, -; and opcodes. -.org $1000 -tok: - .byte "dab" -msg: - .byte "oof, you divided a, and b on me.\n" - -; Input buffer. -.org $2000 -buffer: - -.org $2800 -cmd_buf: - -; Initalize some variables. -.org $0 -scr_row: - .byte $0 -scr_col: - .byte $0 -a: - .byte $0 -b: - .byte $0 -c: - .byte $0 -d: - .byte $0 -e: - .byte $0 -string: - .byte "Please, type something.\n" -string2: - .byte "You typed, " -end: - .byte $0 - -; String Pointer -ptr: - .qword buffer -cptr: - .qword cmd_buf -tptr: - .qword tok -mptr: - .qword msg - - -; Main program -.org $8000 -reset: - cps - ldx.w #$FFFF - txs - ldy #0 - lda #0 -clr_buf: - cpy.w #$7FF - beq start - sta (ptr), y - iny - jmp clr_buf - -start: - lda #0 - sta $C000 - tax ; Reset x. - tay ; Reset y. - jsl clr_cbuf - jmp print - -clr_cbuf: - cpy.w #$3FF - beq clr_cbuf_end - sta (cptr), y - iny - jmp clr_cbuf -clr_cbuf_end: - ldy #0 - rtl - -rset_a: - lda #1 -read: - lda $C000 ; Get control register. - beq rset_a ; Loop until we get a character. - jmp getchar ; We got a key. -sleep: - lda end - bne spin ; Are we done with getting input? - -print: - lda string, x ; Get character at offset x. - beq rset_a ; Did we find a null terminator? - sta $C001 ; Print character. - inx ; Increment offset. - cmp #$A - beq inc_row - inc scr_col - jmp print -inc_row: - lda #0 - sta scr_col - lda #$42 - sta c - jsl isdown - jmp print ; Keep printing more characters. - -getchar: - lda $C002 ; Get typed character. - cmp #$1B - beq esc - cmp #$A - beq nl ; Did the user type a newline? - cmp #8 - beq bs ; Did the user type a backspace? - cmp #$7F - beq bs ; Did the user type a backspace? -echo: - sta a - ldx scr_col - cpx #79 - bne echo_print -linewrap: - inc scr_row - ldx #0 - stx scr_col - lda scr_row - jsl update_pos -echo_print: - lda a - sta $C001 ; Echo typed character. - inc scr_col ; Increment the cursor's x coordinate. - sta (ptr), y ; Store typed character into the input buffer. - iny - jmp rset_a ; Start getting user input. - -esc: - lda $C000 ; Skip the '['. - lda $C000 ; Get the next character. - beq read ; We have an error, so discard it, and go back to getting user input. - lda $C002 ; Get the escape code. - sta c ; Store the escape code, until we need it. - jsl isup ; Check if the user pressed up. - lda d - bne esc_end - jsl isdown ; Check if the user pressed down. - lda d - bne esc_end - lda #0 - jsl isleft ; Check if the user pressed left. - lda d - bne esc_end - jsl isright ; Check if the user pressed right. -esc_end: - lda #0 - sta d - jmp rset_a ; Go back to getting user input. - -isup: - lda scr_row ; Is the cursor at the top of the screen? - beq isup_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$41 ; Did the user press the up arrow key? - beq up ; Yes, so move the cursor up. -isup_done: - rtl ; End of isup. - -isdown: - lda scr_row ; Start checking the y coordinate of the cursor. - cmp #23 ; Is the cursor at the bottom of the screen? - beq isdown_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$42 ; Did the user press the down arrow key? - beq down ; Yes, so move the cursor down. -isdown_done: - rtl ; End of isdown. - -isright: - lda scr_col ; Start checking the x coordinate of the cursor. - cmp #79 ; Is the cursor at the far right of the screen? - beq isright_end ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$43 ; Did the user press the right arrow key? - beq right ; Yes, so move the cursor right. -isright_end: - rtl ; End of isright. - -isleft: - lda scr_col ; Is the cursor at the far left of the screen? - beq isleft_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$44 ; Did the user press the left arrow key? - beq left ; Yes, so move the cursor left. -isleft_done: - rtl ; End of isleft. - -up: - dec scr_row - jsl update_pos - lda #1 - sta d - jmp isup_done -down: - inc scr_row - jsl update_pos - lda #1 - sta d - jmp isdown_done -right: - inc scr_col - jsl update_pos - jmp isright_end -left: - dec scr_col - jsl update_pos - lda #1 - sta d - jmp isleft_done - -update_pos: - lda #$1B ; Print an escape character - sta $C001 ; to the screen. - lda #$5B ; Print '[' - sta $C001 ; to the screen, and start the escape sequence. - jsl getrow ; Start printing the row number to the screen. - jsl getcol ; Start printing the column number to the screen. - lda #$48 ; Print 'H' - sta $C001 ; to the screen. - rtl ; End of update_pos. -getrow: - lda scr_row ; Get the cursor's y coordinate. - div #10 ; Divide A by 10. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. -getcol: - lda #$3B ; Print ';' - sta $C001 ; to the screen. - lda scr_col ; Get the cursor's x coordinate. - div #10 ; Divide A by 10. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. - -nl: - lda #0 - sta scr_col - sta (ptr), y ; Store said terminator into the input buffer. - lda #$42 - sta c - jsl isdown - ldy.w #0 ; Reset y, to print the result. - jsl dabbed - beq start - ldy #0 - jmp result - -back: - sta $C001 ; Print backspace. - lda #0 ; Put a null terminator, in place of the backspace. - sta (ptr), y ; Place it into the input buffer. - dey ; Decrement buffer offset. - dec scr_col - jmp read ; Get next character. - -bs: - cpy #0 ; Are we at the start of the buffer? - beq rset_a ; We are, so do not store the backspace into the buffer. - jmp back ; We are not, so add the backspace to the buffer. - -result: - ldx scr_col - cpx #79 - bne result_print -linewrap2: - inc scr_row - ldx #$0 - stx scr_col - jsl update_pos -result_print: - lda string2, y - beq rset_y ; Reset y, if we hit the null terminator. - sta $C001 ; Print 'You have typed, ' - inc scr_col ; Increment the cursor's x coordinate. - iny ; Increment offset. - jmp result ; Keep printing. - -rset_y: - ldy.w #0 ; Reset y. - ldx.w #0 ; Reset x. - lda.w #0 ; Reset a. - jmp print_buf ; Print the input buffer. -dabbed: - lda (ptr), y ; Get a character from the input buffer. - beq dab_nend ; Are we done with printing the buffer? - cmp (tptr), y - bcs dab_nend - beq chk_str - bcc dab_nend -chk_str: - iny - cpy #3 - bne dabbed - ldy #0 -pnt_msg: - ldx scr_col - cpx #79 - bne msg_pnt -linewrap3: - inc scr_row - ldx #0 - stx scr_col - jsl update_pos -msg_pnt: - lda (mptr), y ; Get a character from the input buffer. - beq dab_eqnd ; Are we done with printing the buffer? - sta $C001 ; Print said character. - inc scr_col ; Increment the cursor's x coordinate. - iny - jmp pnt_msg ; Keep printing the buffer. -dab_nend: - lda #1 - jmp dab_end -dab_eqnd: - lda #0 - jmp dab_end -dab_end: - rtl - - - -print_buf: - ldx scr_col - cpx #79 - bne buf_print -linewrap4: - inc scr_row - ldx #0 - stx scr_col - jsl update_pos -buf_print: - lda (ptr), y ; Get a character from the input buffer. - beq cmd_clr ; Are we done with printing the buffer? - sta $C001 ; Print said character. - inc scr_col ; Increment the cursor's x coordinate. - iny - jmp print_buf ; Keep printing the buffer. - -cmd_clr: - lda #0 - sta scr_col - lda #$42 - sta c - jsl isdown - jmp start - -scr_to_buf: - tax - mul #80 - adc scr_col - tay - txa - rtl - -spin: - nop - nop - nop - jmp spin - -.org $1000 -v -.org $1100 -v -.org $1200 -v -.org $8000 -v -.org $8100 -v -.org $8200 -v -.org $8300 -v -.org $FFC0 -.qword reset - -.org $FF50 -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.org $FF50 -v -done - diff --git a/test/input-3.s b/test/input-3.s deleted file mode 100644 index 35547a7..0000000 --- a/test/input-3.s +++ /dev/null @@ -1,900 +0,0 @@ -; Testing input. -; -; Writen in Sux assembly by -; mr b0nk 500 <b0nk@b0nk.xyz> - -; Instruction mnemonics, -; and opcodes. -.org $1000 -tok: - .byte "dab" -msg: - .byte "oof, you divided a, and b on me.\n" - -; Input buffer. -.org $2000 -buffer: - -.org $4000 -cmd_buf: - - -; Initalize some variables. -.org $0 -scr_row: - .byte $0 -scr_col: - .byte $0 -scr_trow: - .byte $0 -scr_tcol: - .byte $0 -scr_ptr: - .word $0 -a: - .byte $0 -b: - .byte $0 -c: - .byte $0 -d: - .byte $0 -e: - .byte $0 -f: - .byte $0 -string: - .byte "Please, type something.\n" -string2: - .byte "You typed, " -end: - .byte $0 -bits: - .byte $80 - .byte $40 - .byte $20 - .byte $10 - .byte $08 - .byte $04 - .byte $02 - .byte $01 -bitmask: - .byte $0 -bitabl: - .qword $0 - .qword $0 -scr_str: -.byte $0 -scr_end: -.byte $0 -wrapped: -.byte $0 - -; Pointers -ptr: - .qword buffer -cptr: - .qword cmd_buf -tptr: - .qword tok -mptr: - .qword msg - -; Main program -.org $8000 -reset: - cps - ldx.w #$FFFF - txs - ldy #0 - lda #23 - sta scr_end - lda #0 - sta scr_str - ldx #8 - sta.q bitabl - sta.q bitabl, x - tax - jsl clr_buf - jmp start -clr_buf: - lda #0 - cpy.w #$1FFF - beq clr_buf_end - sta (ptr), y - iny - jmp clr_buf -clr_buf_end: - ldy.w #0 - rtl - -start: - lda #0 - tax - sta $C000 - phy #2 - ldy.w #0 - jsl clr_cbuf - ply #2 - jmp print - -clr_cbuf: - cpy.w #$3FF - beq clr_cbuf_end - sta (cptr), y - iny - jmp clr_cbuf -clr_cbuf_end: - rtl - -pull_y: - ply #2 -rset_a: - lda #0 - sta $C000 - inc -read: - lda $C000 ; Get control register. - beq rset_a ; Loop until we get a character. - jsl getchar ; We got a key. - beq parse ; We got a newline, so start parsing the line. - jmp rset_a ; We didn't get a newline, so keep getting more characters. - -print: - phy #2 - txy - lda string, y ; Get character at offset x. - beq pull_y ; Did we find a null terminator? - ply #2 - inx - jsl print_char - jmp print - -getbit: - clc - lda scr_str - bne getbt0 - ldx scr_row - jmp getbt1 -getbt0: - lda scr_row - adc scr_str - tax -getbt1: - jsl bitpos - ldb bitabl, x - aba - cmp #1 - jmp bitout - -;putbit: -; ldx scr_row -;putbt1: -; bcc setbit - - -clrbit: - jsl bitpos - xor #$FF - ldb bitabl, x - aba -bitsav: - sta bitabl, x -bitout: - ldx bitmask - rtl - -setbit: - jsl bitpos - ldb bitabl, x - oab - jmp bitsav - -bitpos: - stx bitmask - txa - and #7 - tax - lda bits, x - pha #1 - lda bitmask - lsr #3 - tax - pla #1 - rtl - - -getchar: - lda $C002 ; Get typed character. - ldb #0 - stb e - pha #1 - phy #2 - cmp #10 - beq cmd_cpy -getchar_pnt: - ply #2 - pla #1 - ldb e - bne reset_row -getchar_pnt1: - jsl print_char - lda a - cmp #10 - beq getchar_line - jmp getchar_char -reset_row: - ldb e - stb scr_row - jmp getchar_pnt1 - - -cmd_cpy: - ldb scr_row - stb e - jsl findst - clc - lda scr_row - adc scr_str - mul #80 - tay - ldx.w #$0 -cmd_cpy_strt: - lda (ptr), y - beq getchar_pnt - phy #2 - txy - sta (cptr), y - inx - ply #2 - iny - jmp cmd_cpy_strt -getchar_line: - lda #0 - jmp getchar_end -getchar_char: - lda #1 -getchar_end: - rtl - -findst: - jsl getbit - bcc findst_done - dec scr_row - bpo findst - inc scr_row -findst_done: - rtl - -parse: - lda #0 - tax - jsl dabbed - beq start - lda #0 - tax - jmp result - -print_char: - sta a - cmp #$1B - beq esc - cmp #$A - beq nl ; Did the user type a newline? - cmp #$C - beq clr_scr - cmp #19 - beq en_step - cmp #18 - beq dis_step - cmp #8 - beq bs ; Did the user type a backspace? - cmp #$7F - beq bs ; Did the user type a backspace? - sta a -printc: - lda a - sta (ptr), y ; Store typed character into the input buffer. - inc scr_col ; Increment the cursor's x coordinate. - iny -printc_2: - ldb #1 - stb f - ldb scr_col - cpb #80 - bcs printc_4 -printc_3: - sta $C001 ; Echo typed character. - ldb f - beq printc_wrap - jmp printc_end -printc_4: - ldb scr_row - cpb #23 - bcs printc_scrl -printc_5: - ldb #0 - stb f - jmp printc_3 -printc_scrl: - sta $C001 ; Echo typed character. - clc - lda #1 - sta wrapped - jsl scrl_down -printc_wrap: - ldb #0 - stb scr_col - ldb scr_row - cpb #23 - bcs printc_wrap2 -printc_wrap1: - inc scr_row -printc_wrap2: - phx #2 - clc - lda scr_row - adc scr_str - tax - jsl setbit - plx #2 - jsl update_pos -printc_end: - rtl - -nl: - lda #0 - sta (ptr), y ; Store said terminator into the input buffer. - sta scr_col - lda scr_row - cmp #23 - bne nl_inc - jsl scrl_down - lda #10 - sta a - jmp printc_end -nl_inc: - inc scr_row - jsl update_pos - lda #10 - sta a - jmp printc_end - -clr_scr: - lda #23 - sta scr_end - lda #0 - sta scr_str - ldx #8 - sta.q bitabl - sta.q bitabl, x - tay - jsl clr_buf - sta scr_col - sta scr_row - jsl update_pos - lda #$C - sta $C001 - jmp printc_end - -en_step: - lda $C010 - beq step_en - jmp stp_end -step_en: - lda #1 - sta $C010 - jmp stp_end - -dis_step: - lda $C010 - bne step_dis - jmp stp_end -step_dis: - lda #0 - sta $C010 -stp_end: - jmp printc_end - -back: - lda #$7F - sta $C001 - dey ; Decrement buffer offset. - lda #0 ; Put a null terminator, in place of the backspace. - sta (ptr), y ; Place it into the input buffer. - dec scr_col - jsl update_pos - jmp printc_end ; Get next character. - -bs: - lda scr_col ; Are we at the start of the buffer? - beq back_wrap - jmp back ; We are not, so add the backspace to the buffer. -back_wrap: - jsl getbit - bcs back_wrap1 - jmp printc_end -back_wrap1: - lda scr_row - beq back_wrap2 - jmp backwrp -back_wrap2: - lda scr_str - bne back_scrl - jmp printc_end -back_scrl: - clc - jsl scrl_up - inc scr_row -backwrp: - clc - lda scr_row - adc scr_str - tax -backwrp2: - dec scr_row - jsl clrbit - ldb #80 - stb scr_col - jsl update_pos - jmp back - -esc: - lda $C000 ; Skip the '['. - lda $C002 - cmp #$1B - beq shftesc - lda $C000 ; Get the next character. - beq printc_end ; We have an error, so discard it, and go back to getting user input. - lda $C002 ; Get the escape code. - sta c ; Store the escape code, until we need it. - lda #0 - sta d - jsl isup ; Check if the user pressed up. - lda d - bne esc_end - jsl isdown ; Check if the user pressed down. - lda d - bne esc_end - lda #0 - jsl isleft ; Check if the user pressed left. - lda d - bne esc_end - jsl isright ; Check if the user pressed right. -esc_end: - lda #0 - sta d - jmp printc_end ; Go back to getting user input. - -shftesc: - lda $C000 ; Skip the '['. - lda $C000 ; Get the next character. - beq printc_end ; We have an error, so discard it, and go back to getting user input. - lda $C002 ; Get the escape code. - sta c ; Store the escape code, until we need it. - lda #0 - sta d - jsl isshftup ; Check if the user pressed shift+up. - lda d - bne shftesc_end - jsl isshftdown ; Check if the user pressed shift+down. -shftesc_end: - lda #0 - sta d - jmp printc_end ; Go back to getting user input. - -isup: - lda c ; No, so load the escape code back into the accumulator. - cmp #$41 ; Did the user press the up arrow key? - bne isup_done ; Yes, so return. - lda #1 - sta d - lda scr_row ; Is the cursor at the top of the screen? - beq isup_scrl ; Yes, so return. -isup_2: - lda c ; No, so load the escape code back into the accumulator. - cmp #$41 ; Did the user press the up arrow key? - beq up ; Yes, so move the cursor up. - jmp isup_done -isup_scrl: - lda scr_str - beq isup_done - jsl scrl_up -isup_done: - rtl ; End of isup. - -isdown: - lda c ; No, so load the escape code back into the accumulator. - cmp #$42 ; Did the user press the down arrow key? - bne isdown_done - lda scr_row ; Start checking the y coordinate of the cursor. - cmp #23 ; Is the cursor at the bottom of the screen? - beq isdown_scrl ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$42 ; Did the user press the down arrow key? - beq down ; Yes, so move the cursor down. - jmp isdown_done -isdown_scrl: - lda scr_row - sta scr_trow - lda scr_col - sta scr_tcol - jsl scrl_down - lda scr_trow - sta scr_row - lda scr_tcol - sta scr_col -isdown_done: - rtl ; End of isdown. - -isright: - lda c ; No, so load the escape code back into the accumulator. - cmp #$43 ; Did the user press the right arrow key? - bne isright_done - lda scr_col ; Start checking the x coordinate of the cursor. - cmp #79 ; Is the cursor at the far right of the screen? - beq isright_wrp ; Yes, so check if this is a wrapped line. - jmp right ; No, so move the cursor right, like normal. -isright_wrp: - inc scr_row - jsl getbit - bcs wrap_inc - dec scr_row - jmp isright_done -isright_scrl: - lda scr_str - beq isright_end - lda #1 - sta wrapped - jsl scrl_down - dec scr_row - jmp isright_end -wrap_inc: - lda #0 - sta scr_col - lda scr_row - cmp #23 - bcs isright_scrl -isright_end: - jsl update_pos -isright_done: - lda #0 - sta wrapped - rtl ; End of isright. - -isleft: - lda c - cmp #$43 - beq isleft_done - lda scr_col ; Is the cursor at the far left of the screen? - beq isleft_wrp ; Yes, so start checking if this is a wrapped line. - lda c ; No, so load the escape code back into the accumulator. - cmp #$44 ; Did the user press the left arrow key? - beq left ; Yes, so move the cursor left. - jmp isleft_done -isleft_wrp: - jsl getbit - bcs wrap_dec - jmp isleft_done -wrap_dec: - lda scr_row - beq wrap_dec1 - lda #1 - sta wrapped - dec scr_row -wrap_dec1: - lda #79 - sta scr_col - lda #1 - sta d - lda scr_row - beq isleft_scrl - jmp isleft_end -isleft_scrl: - lda wrapped - bne isleft_end - lda scr_str - beq isleft_done - jsl scrl_up - jmp isleft_done -isleft_end: - jsl update_pos -isleft_done: - lda #0 - sta wrapped - rtl ; End of isleft. - -up: - dec scr_row - jsl update_pos - lda #1 - sta d - jmp isup_done -down: - inc scr_row - jsl update_pos - lda #1 - sta d - jmp isdown_done -right: - inc scr_col - jsl update_pos - jmp isright_done -left: - dec scr_col - jsl update_pos - lda #1 - sta d - jmp isleft_done - -isshftup: - lda c ; Load the escape code back into the accumulator. - cmp #$41 ; Did the user press the up arrow key? - bne isshftup_done - lda #1 - sta d - lda scr_str - beq isshftup_done - jmp shftup -isshftup_done: - rtl - -isshftdown: - lda c ; Load the escape code back into the accumulator. - cmp #$42 ; Did the user press the down arrow key? - bne isshftdown_done - lda #1 - sta d - lda scr_end - cmp #71 - bcs isshftdown_done - jmp shftdown -isshftdown_done: - rtl - -shftup: - jsl scrl_up - lda #1 - sta d - jmp isshftup_done - -shftdown: - jsl scrl_down - lda #1 - sta d - jmp isshftdown_done - -update_pos: - ldb #1 - stb f - clc - lda scr_row - adc scr_str - clc - mul #80 - clc - adc scr_col - tay - lda #$1B ; Print an escape character - sta $C001 ; to the screen. - lda #$5B ; Print '[' - sta $C001 ; to the screen, and start the escape sequence. - jsl getrow ; Start printing the row number to the screen. - jsl getcol ; Start printing the column number to the screen. - lda #$48 ; Print 'H' - sta $C001 ; to the screen. - rtl ; End of update_pos. - -getrow: - lda scr_row ; Get the cursor's y coordinate. - div #10 ; Divide A by 10. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. - -getcol: - lda #$3B ; Print ';' - sta $C001 ; to the screen. - lda scr_col ; Get the cursor's x coordinate. - div #10 ; Divide A by 10. - clc - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - clc - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. - -scrl_down: - - inc scr_str - inc scr_end - lda #$1B ; Print an escape character - sta $C001 ; to the screen. - lda #$5B ; Print '[' - sta $C001 ; to the screen, and start the escape sequence. - lda #$54 ; Print 'T' - sta $C001 ; to the screen, and end the escape sequence. - lda wrapped - beq scrldn_save -scrldn1: - jsl rdrw_row - lda wrapped - beq scrldn_load - jmp scrldn_end -scrldn_save: - lda scr_row - pha #1 - lda scr_col - pha #1 - jmp scrldn1 -scrldn_load: - pla #1 - sta scr_col - pla #1 - sta scr_row - jsl update_pos -scrldn_end: - lda #0 - sta wrapped -scrldn_done: - rtl - -scrl_up: - dec scr_str - dec scr_end - lda #$1B ; Print an escape character - sta $C001 ; to the screen. - lda #$5B ; Print '[' - sta $C001 ; to the screen, and start the escape sequence. - lda #$53 ; Print 'S' - sta $C001 ; to the screen, and end the escape sequence. - lda scr_row - pha #1 - lda scr_col - pha #1 - lda #0 - sta scr_row - jsl rdrw_row - pla #1 - sta scr_col - pla #1 - sta scr_row - jsl update_pos -scrlup_done: - rtl - -rdrw_row: - lda #0 - sta scr_col - jsl update_pos -rdrow_st: - lda (ptr), y - beq rdrow_inc - sta $C001 -rdrow_inc: - inc scr_col - lda (ptr), y - beq rdrow_skip - iny -rdrow_inc1: - lda scr_col - cmp #80 - bcs rdrow_end - jmp rdrow_st -rdrow_skip: - jsl update_pos - jmp rdrow_inc1 -rdrow_end: - lda #0 - sta scr_col - jsl update_pos -rdrow_done: - rtl - - -;rdrw_scr: -; lda #$C -; sta $C001 -; lda scr_col -; sta scr_tcol -; lda scr_row -; sta scr_trow -; lda #0 -; sta scr_col -; sta scr_row -; phy #2 -; jsl update_pos -; ply #2 -; ldx scr_ptr -; phy #2 -; txy -; lda (ptr), y -; sta $C001 -; ply #2 -; rtl - -result: - phy #2 - txy - lda string2, y - beq rset_y ; Reset y, if we hit the null terminator. - ply #2 - jsl print_char ; Print 'You have typed, ' - inx - jmp result ; Keep printing. - -rset_y: - ply #2 - lda #0 ; Reset a. - tax ; Reset y. - jmp print_buf ; Print the input buffer. - -dabbed: - phy #2 - txy - lda (cptr), y ; Get a character from the input buffer. - beq dab_pend ; Are we done with printing the buffer? - cmp (tptr), y - bcc dab_pend - beq chk_str - bcs dab_pend -chk_str: - ply #2 - inx - cpx #3 - bne dabbed - ldx #0 -pnt_msg: - phy #2 - txy - lda (mptr), y ; Get a character from the input buffer. - beq dab_peqnd ; Are we done with printing the buffer? - ply #2 - jsl print_char - inx - jmp pnt_msg ; Keep printing the buffer. -dab_pend: - ply #2 - lda #1 - jmp dab_end -dab_peqnd: - ply #2 - lda #0 - jmp dab_end -dab_end: - rtl - -print_buf: - phy #2 - txy - lda (cptr), y ; Get a character from the input buffer. - beq cmd_clr ; Are we done with printing the buffer? - ply #2 - jsl print_char - inx - jmp print_buf ; Keep printing the buffer. - -cmd_clr: - ply #2 - lda #10 - jsl print_char - jmp start - -.org $FFC0 -.qword reset - -.org $FF50 -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -done - diff --git a/test/input.s b/test/input.s deleted file mode 100644 index a8b0830..0000000 --- a/test/input.s +++ /dev/null @@ -1,338 +0,0 @@ -; Testing input. -; -; Writen in Sux assembly by -; mr b0nk 500 <b0nk@b0nk.xyz> - - -; Input buffer. -.org $4000 -buffer: - -; Initalize some variables. -.org $0 -scr_row: - .byte $0 -scr_col: - .byte $0 -a: - .byte $0 -b: - .byte $0 -c: - .byte $0 -d: - .byte $0 -e: - .byte $0 -string: - .byte "Please, type something.\n" -string2: - .byte "You typed, " -end: - .byte $0 - -; String Pointer -ptr: - .qword buffer - -; Main program -.org $8000 -reset: - cps - ldx.w #$FFFF - txs - ldy #0 - lda #0 -clr_buf: - cpy.w #$FFF - beq start - sta (ptr), y - iny - jmp clr_buf - -start: - tax ; Reset x. - tay ; Reset y. - jmp print - -rset_a: - lda #1 - -read: - lda $C000 ; Get control register. - beq rset_a ; Loop until we get a character. - lda #0 - sta $C000 - jmp getchar ; We got a key. -sleep: - lda end - bne spin ; Are we done with getting input? - -print: - lda string, x ; Get character at offset x. - beq rset_a ; Did we find a null terminator? - sta $C001 ; Print character. - inx ; Increment offset. - cmp #$A - beq inc_row - inc scr_col - jmp print -inc_row: - inc scr_row - lda #0 - sta scr_col - jmp print ; Keep printing more characters. - -getchar: - lda $C002 ; Get typed character. - cmp #$1B - beq esc - cmp #$A - beq nl ; Did the user type a newline? - cmp #8 - beq bs ; Did the user type a backspace? - cmp #$7F - beq bs ; Did the user type a backspace? -echo: - sta a - ldx scr_col - cpx #79 - bne echo_print -linewrap: - inc scr_row - ldx #0 - stx scr_col - lda scr_row - jsl update_pos -echo_print: - lda a - sta $C001 ; Echo typed character. - inc scr_col ; Increment the cursor's x coordinate. - sta (ptr), y ; Store typed character into the input buffer. - iny - jmp rset_a ; Start getting user input. - -esc: - lda $C000 ; Skip the '['. - lda $C000 ; Get the next character. - beq read ; We have an error, so discard it, and go back to getting user input. - lda $C002 ; Get the escape code. - sta c ; Store the escape code, until we need it. - jsl isup ; Check if the user pressed up. - lda d - cmp #0 - bne esc_end - jsl isdown ; Check if the user pressed down. - lda d - cmp #0 - bne esc_end - lda #0 - jsl isleft ; Check if the user pressed left. - lda d - cmp #0 - bne esc_end - jsl isright ; Check if the user pressed right. -esc_end: - lda #0 - sta d - jmp rset_a ; Go back to getting user input. - -isup: - lda scr_row ; Is the cursor at the top of the screen? - beq isup_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$41 ; Did the user press the up arrow key? - beq up ; Yes, so move the cursor up. -isup_done: - rtl ; End of isup. - -isdown: - lda scr_row ; Start checking the y coordinate of the cursor. - cmp #23 ; Is the cursor at the bottom of the screen? - beq isdown_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$42 ; Did the user press the down arrow key? - beq down ; Yes, so move the cursor down. -isdown_done: - rtl ; End of isdown. - -isright: - lda scr_col ; Start checking the x coordinate of the cursor. - cmp #79 ; Is the cursor at the far right of the screen? - beq isright_end ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$43 ; Did the user press the right arrow key? - beq right ; Yes, so move the cursor right. -isright_end: - rtl ; End of isright. - -isleft: - lda scr_col ; Is the cursor at the far left of the screen? - beq isleft_done ; Yes, so return. - lda c ; No, so load the escape code back into the accumulator. - cmp #$44 ; Did the user press the left arrow key? - beq left ; Yes, so move the cursor left. -isleft_done: - rtl ; End of isleft. - -up: - dec scr_row - jsl update_pos - lda #1 - sta d - jmp isup_done -down: - inc scr_row - jsl update_pos - lda #1 - sta d - jmp isdown_done -right: - inc scr_col - jsl update_pos - jmp isright_end -left: - dec scr_col - jsl update_pos - lda #1 - sta d - jmp isleft_done - -update_pos: - lda #$1B ; Print an escape character - sta $C001 ; to the screen. - lda #$5B ; Print '[' - sta $C001 ; to the screen, and start the escape sequence. - jsl getrow ; Start printing the row number to the screen. - jsl getcol ; Start printing the column number to the screen. - lda #$48 ; Print 'H' - sta $C001 ; to the screen. - rtl ; End of update_pos. -getrow: - lda scr_row ; Get the cursor's y coordinate. - div #10 ; Divide A by 10. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. -getcol: - lda #$3B ; Print ';' - sta $C001 ; to the screen. - lda scr_col ; Get the cursor's x coordinate. - div #10 ; Divide A by 10. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - tba ; Get the remainder. - adc #$30 ; Convert it to ascii, and - sta $C001 ; print to the screen. - rtl ; End of getrow. - - -nl: - lda #$A - sta $C001 - inc scr_row - lda #0 ; Replace newline with a null terminator. - sta (ptr), y ; Store said terminator into the input buffer. - sta scr_col - ldy.w #0 ; Reset y, to print the result. - jmp result - -back: - sta $C001 ; Print backspace. - lda #0 ; Put a null terminator, in place of the backspace. - sta (ptr), y ; Place it into the input buffer. - dey ; Decrement buffer offset. - dec scr_col - jmp read ; Get next character. - -bs: - cpy #0 ; Are we at the start of the buffer? - beq rset_a ; We are, so do not store the backspace into the buffer. - jmp back ; We are not, so add the backspace to the buffer. - -result: - ldx scr_col - cpx #79 - bne result_print -linewrap2: - inc scr_row - ldx #$0 - stx scr_col - jsl update_pos -result_print: - lda string2, y - beq rset_y ; Reset y, if we hit the null terminator. - sta $C001 ; Print 'You have typed, ' - inc scr_col ; Increment the cursor's x coordinate. - iny ; Increment offset. - jmp result ; Keep printing. - - -rset_y: - ldy.w #0 ; Reset y. - jmp print_buf ; Print the input buffer. - -print_buf: - ldx scr_col - cpx #79 - bne buf_print -linewrap3: - inc scr_row - ldx #0 - stx scr_col - jsl update_pos -buf_print: - lda (ptr), y ; Get a character from the input buffer. - beq spin ; Are we done with printing the buffer? - sta $C001 ; Print said character. - inc scr_col ; Increment the cursor's x coordinate. - iny - jmp print_buf ; Keep printing the buffer. - -scr_to_buf: - tax - mul #80 - adc scr_col - tay - txa - rtl - -spin: - nop - nop - nop - jmp spin - -.org $1000 -v -.org $1100 -v -.org $1200 -v -.org $8000 -v -.org $8100 -v -.org $8200 -v -.org $8300 -v -.org $FFC0 -.qword reset - -.org $FF50 -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.qword spin -.org $FF50 -v -;done -q - diff --git a/test/subroutine.s b/test/subroutine.s index 7db1b87..d39fc15 100644 --- a/test/subroutine.s +++ b/test/subroutine.s @@ -24,7 +24,7 @@ start: ;stb $C010 ;deb bench: - jsl clr_buf + jsr clr_buf jmp bench clr_buf: @@ -39,7 +39,7 @@ clr_buf: jmp clr_buf ; Keep looping. clr_buf_end: tay ; Set the index back to zero. - rtl ; End of clr_buf. + rts ; End of clr_buf. ;.org $C010 ;.byte $1 diff --git a/test/test.s b/test/test.s index 7c36579..14b9798 100644 --- a/test/test.s +++ b/test/test.s @@ -2,12 +2,15 @@ ; ; Writen by mr b0nk 500 <b0nk@b0nk.xyz> .org $8000 -cps ; Clear the processor status register. -lda.w #$1000 ; Load 0x1000 into the accumulator. -rol #$1 ; Then rotate the accumulator left by 1 bit. -jmp $8005 ; And then loop. +entry: + cps ; Clear the processor status register. + lda.w #$1000 ; Load 0x1000 into the accumulator. +loop: + rol #$1 ; Then rotate the accumulator left by 1 bit. + jmp loop ; And then loop. -.org $FFC0 ; Reset vector. -.qword $8000 -done +.org $FFC0 ; Reset vector. +.qword entry +a +d |