diff --git a/.ilximrc b/.ilximrc index 7a5ca7e6345f05891b297cc53084fc7a842ed18a..885788996146f77d6b0e14eb7baba49ca04d55cf 100644 --- a/.ilximrc +++ b/.ilximrc @@ -1,6 +1,6 @@ [console] -mode=serial +mode=local port=/dev/modem bps=9600 parity=N diff --git a/console.bas b/console.bas index 164e5134dfea468ed190c2a2f9d41dbae435bd3e..8a1643fe5b93af8887d6cd7c7844b1357615d20b 100644 --- a/console.bas +++ b/console.bas @@ -2,11 +2,6 @@ ' console.bas ' -' -' need to redesign: -' I/O port should be used to read, but block waiting on single character. -' - #include "console.bi" #include "storage.bi" #include "bus.bi" @@ -30,7 +25,7 @@ sub console_attach() .dev_init = @console_init_local .dev_reset = @console_reset_local .dev_cycle = @console_cycle_local - .dev_input = @console_input + .dev_input = @console_input_local .dev_output = @console_output end with @@ -47,7 +42,7 @@ sub console_attach() .dev_init = @console_init_serial .dev_reset = @console_reset_serial .dev_cycle = @console_cycle_serial - .dev_input = @console_input + .dev_input = @console_input_serial .dev_output = @console_output end with @@ -66,11 +61,11 @@ sub console_attach() bus_attach 0, console_device -end sub +end sub ' console_attach() sub console_init_local() console_mutex = mutexcreate() -end sub +end sub ' console_init_local() sub console_init_serial() console_mutex = mutexcreate() @@ -90,17 +85,17 @@ sub console_init_serial() print #console_file_number, chr(27) & "[2J" -end sub +end sub ' console_init_serial() sub console_reset_local() -end sub +end sub ' console_reset_local() sub console_reset_serial() -end sub +end sub ' console_reset_serial() -function console_input(port_number as ushort) as ushort +function console_input_local(port_number as ushort) as ushort select case port_number case (console_io_base + 0) @@ -111,13 +106,34 @@ function console_input(port_number as ushort) as ushort return horizontal_offset case (console_io_base + 3) return vertical_offset - case (console_io_base + 4) - + case (console_io_base + 4) + console_refresh_local + return asc(input(1)) case else return 0 end select -end function +end function ' console_input_local() + +function console_input_serial(port_number as ushort) as ushort + + select case port_number + case (console_io_base + 0) + return cursor_enabled + case (console_io_base + 1) + return sleep_duration + case (console_io_base + 2) + return horizontal_offset + case (console_io_base + 3) + return vertical_offset + case (console_io_base + 4) + return asc(input(1, console_file_number)) + case else + return 0 + end select + +end function ' console_input_serial() + sub console_output(port_number as ushort, value as ushort) @@ -152,7 +168,7 @@ sub console_output(port_number as ushort, value as ushort) end select -end sub +end sub ' console_output() sub console_cycle_local(byval userdata as any ptr) @@ -250,4 +266,4 @@ sub console_refresh_serial() next i -end sub ' console_refresh_serial() \ No newline at end of file +end sub ' console_refresh_serial() diff --git a/console.bi b/console.bi index 51f54dfdb70cfe50e8ae5ba20e53decc0ed27e14..86d9e69421b2240b9689c9de6e0b2174b5480156 100644 --- a/console.bi +++ b/console.bi @@ -1,6 +1,4 @@ -' -' console.bi -' + ' ' I/O PORT USAGE @@ -19,7 +17,7 @@ ' 1: Read refresh sleep value (ms) ' 2: Read horizontal offset ' 3: Read vertical offset -' 4: Read one character from console +' 4: Read one character from console ' #define CONSOLE_PAGE &H0001 @@ -51,7 +49,8 @@ dim shared console_refresh as sub() declare sub console_attach() declare sub console_init_local() declare sub console_reset_local() -declare function console_input(port_number as ushort) as ushort +declare function console_input_local(port_number as ushort) as ushort +declare function console_input_serial(port_number as ushort) as ushort declare sub console_output(port_number as ushort, value as ushort) declare sub console_cycle_local(byval userdata as any ptr) @@ -59,4 +58,4 @@ declare sub console_init_serial() declare sub console_reset_serial() declare sub console_cycle_serial(byval userdata as any ptr) declare sub console_refresh_local() -declare sub console_refresh_serial() \ No newline at end of file +declare sub console_refresh_serial() diff --git a/cpu.bas b/cpu.bas index 13edcadf919af32ce0a98ba20d1dd9879f34a853..eedb2f10cf30dcabb9642ef5d37555c5e86b9eec 100644 --- a/cpu.bas +++ b/cpu.bas @@ -373,6 +373,7 @@ sub cpu_dump_state() print "" print "" print "Page Size:", PAGESIZE,"Page Count:",PAGECOUNT + print "Total Memory:",(PAGESIZE*PAGECOUNT)/1024;" Kb" print "" print "PC "; ilxi_pad_left(hex(x.pc),"0",4), "EC "; ilxi_pad_left(hex(x.ec),"0",4), "ES "; ilxi_pad_left(hex(x.es),"0",4), "CP "; ilxi_pad_left(hex(x.cp),"0",4), "DP "; ilxi_pad_left(hex(x.dp),"0",4) print "EP "; ilxi_pad_left(hex(x.ep),"0",4), "SP "; ilxi_pad_left(hex(x.sp),"0",4), "SO "; ilxi_pad_left(hex(x.so),"0",4), "FL "; ilxi_pad_left(hex(x.fl),"0",4), "SS "; ilxi_pad_left(hex(x.ss),"0",4) diff --git a/ilxi.bas b/ilxi.bas index 642e62d96c1fc3bd632fbe87629aaad2331a5acc..74ef90305a18c6a39df713e37263586bbc59aba7 100644 --- a/ilxi.bas +++ b/ilxi.bas @@ -266,11 +266,11 @@ sub cli() else cpu_set_flag FL_TRACE end If - Case "?" - print help_get_topic("ilxi.xmf", "index") - case "help" - print help_get_topic("ilxi.xmf", get_lexer_entry(1).strval) - case "ver" + case "?" + print help_get_topic("ilxi.xmf", "index") + case "help" + print help_get_topic("ilxi.xmf", get_lexer_entry(1).strval) + case "ver" print "ILXI 0.1" case "run" if cpu_get_flag(FL_HALT) = 0 then @@ -279,6 +279,8 @@ sub cli() else message_print "cli(): CPU is halted. Type 'reset' at the prompt before attempting 'run'." end if + case "clear", "cls" + cls case "reset" init_cpu case "exit", "quit" diff --git a/ilxi.xmf b/ilxi.xmf index 8c3f42871acdf9cf5cde3b7867086ab9fdad3a2e..44e129e3b51148cf969ca535bae8e65a3391865f 100644 --- a/ilxi.xmf +++ b/ilxi.xmf @@ -111,9 +111,9 @@ Details: pushb will push onto the stack, and update CPU registers accordingly. @pushw -pushb - push a WORD value onto the stack +pushw - push a WORD value onto the stack -Syntax: pushb +Syntax: pushw Details: @@ -215,4 +215,83 @@ Details: Exits the ILXI environment. @quit See help for "exit" +@registers +ILXI CPU Registers + +0 8 16 ++-----------------+ +| PC | PROGRAM COUNTER ++-----------------+ +| EC | ERROR CODE ++-----------------+ +| ES | ERROR SEVERITY ++-----------------+ +| FL | FLAGS ++-----------------+ +| CP | CODE PAGE ++-----------------+ +| DP | DATA PAGE ++-----------------+ +| EP | EXTRA PAGE ++-----------------+ +| SP | STACK PAGE ++-----------------+ +| SO | STACK OFFSET ++-----------------+ +| SS | SOURCE PAGE ++-----------------+ +| DS | DESTINATION PAGE ++-----------------+ +| SI | SOURCE INDEX ++-----------------+ +| DI | DESTINATION INDEX ++-----------------+ +| BP | BASE POINTER ++--------+--------+ +| LA | HA | GENERAL A +| GA | ++--------+--------+ +| LB | HB | GENERAL B +| GB | ++--------+--------+ +| LC | HC | GENERAL C +| GC | ++--------+--------+ +| LD | HD | GENERAL D +| GD | ++--------+--------+ +| LE | HE | GENERAL E +| GE | ++-----------------+ +| GF | GENERAL F ++-----------------+ +| GG | GENERAL G ++-----------------+ +| GH | GENERAL H ++-----------------+ +| GI | GENERAL I ++-----------------+ +| GJ | GENERAL J ++-----------------+ +| GK | GENERAL K ++-----------------+ +| GL | GENERAL L ++-----------------+ +| GM | GENERAL M ++-----------------+ +| GN | GENERAL N ++-----------------+ +| GO | GENERAL O ++-----------------+ +| GP | GENERAL P ++-----------------+ +@clear +clear - clear the screen + +Syntax: clear +Details: + +Clears the ILXI screen. +@cls +See help for "clear" diff --git a/input.xa b/input.xa new file mode 100644 index 0000000000000000000000000000000000000000..0164719ba211e4098b490cd79c5984800e4a41ec --- /dev/null +++ b/input.xa @@ -0,0 +1,63 @@ +; +; input.xa +; + + PROGRAM TITLE 'INPUT' + ORIGIN 0 + + EQU VID_PAGE 1 + EQU VID_BASE 0 + + EQU DSEG 0 + EQU SSEG 10 + + BRANCH WORD {__START} + + VAR ZSTRING PROMPT "ENTER A NUMBER: " + +LABEL __START + + COPY WORD %DP,{DSEG} + COPY WORD %SP,{SSEG} + COPY WORD %SS,%DP + COPY WORD %SI,{PROMPT} + SCALL WORD {__PROMPT} + + OUT WORD 0,1 + OUT WORD 1,1 + OUT WORD 2,0 + OUT WORD 3,0 + + COPY BYTE %LC,0 + +LABEL __LOOP + + IN WORD %GA,4 + HLT + + +LABEL __PROMPT + ;; + ;; PRESERVE REGISTERS + ;; + PUSH WORD %BP + COPY WORD %BP,%SO + + PUSH WORD %SS + PUSH WORD %DS + PUSH WORD %DI + + COPY WORD %DS,{VID_PAGE} + + CPSZ + + ;; + ;; RESTORE REGISTERS AND RETURN + ;; + POP WORD %DI + POP WORD %DS + POP WORD %SS + + POP WORD %BP + + SRET diff --git a/mkdisk b/mkdisk deleted file mode 100755 index 82298fd014dea62a4aa5832edc61f19048a4631f..0000000000000000000000000000000000000000 Binary files a/mkdisk and /dev/null differ diff --git a/xiasm.bas b/xiasm.bas index d1806dad4f5642c6652086490ff75a541eb22022..3643583ef0002ff87968bc08f12c6d04422eaaf8 100644 --- a/xiasm.bas +++ b/xiasm.bas @@ -21,6 +21,10 @@ sub main(args as string) arg_count = lex(args) + print "ILXI EXTERNAL ASSEMBLER V0.02 (C) COHERENT LOGIC DEVELOPMENT 2016" + print "" + print "" + for argi = 0 to arg_count - 1 do_asm get_lexer_entry(argi).strval, argi next argi @@ -38,7 +42,7 @@ sub do_asm(filename as string, argi as integer) if udidx > 0 then ' we have a need for a fix-up pass - print ">>> PASS 2 [INFO]: Attempting to resolve "; trim(str(udidx)); " symbol(s) left over from pass 1" + 'print ">>> PASS 2 [INFO]: Attempting to resolve "; trim(str(udidx)); " symbol(s) left over from pass 1" dim i as integer dim e as undef_entry @@ -54,10 +58,10 @@ sub do_asm(filename as string, argi as integer) f = lookup_symbol(e.e_key) if f.resolved = 0 then - print ">>> PASS 2 [FATAL]: Unresolved symbol "; e.e_key + print "FATAL UNRESOLVED SYMBOL "; e.e_key end else - print ">>> PASS 2 [INFO]: Resolved symbol "; e.e_key; " (symbol found at offset "; hex(f.offset); "h, inserted at fix-up offset "; hex(fixup_offset); "h)" + 'print ">>> PASS 2 [INFO]: Resolved symbol "; e.e_key; " (symbol found at offset "; hex(f.offset); "h, inserted at fix-up offset "; hex(fixup_offset); "h)" st_write_word argi, fixup_offset, f.offset end if @@ -69,7 +73,7 @@ sub do_asm(filename as string, argi as integer) st_save_page output_file_name, argi - print ">>> FILE OUTPUT [INFO]: Produced "; output_file_name; " from "; filename + print "GENERATED "; ucase(output_file_name); " FROM "; ucase(filename) end sub @@ -120,7 +124,9 @@ sub initial_pass(page_number as ushort) dim cur_arg as string dim t_sym as symtab_entry dim i as integer - + dim origin as integer + dim program_size as integer + origin = 0 cpu_state.ep = page_number @@ -140,7 +146,8 @@ sub initial_pass(page_number as ushort) else asm_offset = get_lexer_entry(1).intval end if - print ">>> PASS 1 [INFO]: Program ORIGIN set to offset "; hex(asm_offset) + 'print ">>> PASS 1 [INFO]: Program ORIGIN set to offset "; hex(asm_offset) + origin = asm_offset case "EQU" t_sym.e_key = get_lexer_entry(1).strval t_sym.e_class = SYMCLASS_EQU @@ -198,7 +205,7 @@ sub initial_pass(page_number as ushort) fixup_flag = 0 ts = expand_macros(input_lines(i)) - print ">>> PASS 1 [OUTPUT]: "; ilxi_pad_left(hex(asm_offset), "0", 4); ": "; ts + 'print ">>> PASS 1 [OUTPUT]: "; ilxi_pad_left(hex(asm_offset), "0", 4); ": "; ts asm_assemble ts asm_offset += 1 @@ -207,6 +214,9 @@ sub initial_pass(page_number as ushort) end select next i + program_size = asm_offset - origin + print "ASSEMBLED "; trim(str(program_size)); " BYTES" + end sub ' initial_pass() sub install_symbol(sym_entry as symtab_entry) @@ -272,14 +282,14 @@ function expand_macros(input_string as string) as string select case symbol.e_class case SYMCLASS_EQU if symbol.resolved = 0 then - print ">>> PASS 1 [FATAL]: Unresolved EQU symbol "; macro_name + print "FATAL UNRESOLVED EQU "; macro_name end end if b &= trim(symbol.strval) case SYMCLASS_VAR if symbol.resolved = 0 then - print ">>> PASS 1 [FATAL]: Unresolved VAR symbol "; macro_name + print "FATAL UNRESOLVED VAR "; macro_name end end if @@ -291,7 +301,7 @@ function expand_macros(input_string as string) as string ' resolution until next pass if not resolved ' if symbol.resolved = 0 then - print ">>> PASS 1 [INFO]: Deferring resolution of '"; macro_name; "' until next pass" + 'print ">>> PASS 1 [INFO]: Deferring resolution of '"; macro_name; "' until next pass" dim uent as undef_entry