diff --git a/README.md b/README.md index fb47d93..8ff180e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -# Orion BASIC v2.4 for Orion-128 computer +# Orion BASIC v2.4 для копьютера Orion-128 -Source codes of Orionsoft BASIC v2.4, for Orion-128 computer with MONITOR v2 (Intel i8080 and Zilog Z80 CPU, 128k RAM). +Исходные коды BASIC v2.4, разработанном компанией Orionsoft. Для работы интерпретатора необходим MONITOR v2 и ORDOS. +Это дизасм выполненный мной с помощью Ghidra, не оригинальные исходные коды. Оказалось, что этот вариант Бэйсика +не просто похож на MSX BASIC, как авторы писали в журнале Радио, а основан на кодах Microsoft BASIC-80. +Поэтому, я постарался сохранить наименование меток и имен переменных такими, как они представлены в исходных кодах, опубликованных Microsoft. -Application was loading from the RAM-drive at RAM address 0x0000. +Исходные коды в мнемониках Z80 для ассемблера Sjasmplus, но набор инструкций ограничен кодами для КР580ВМ80 (i8080). -## Compile +## Компиляция -To compile sources, use [sjasmplus Z80 assembler](https://github.com/z00m128/sjasmplus). +Для сборки исходных кодов используется [sjasmplus Z80 assembler](https://github.com/z00m128/sjasmplus). + + sjasmplus basic.asm diff --git a/README_en.md b/README_en.md new file mode 100644 index 0000000..fb47d93 --- /dev/null +++ b/README_en.md @@ -0,0 +1,10 @@ +# Orion BASIC v2.4 for Orion-128 computer + +Source codes of Orionsoft BASIC v2.4, for Orion-128 computer with MONITOR v2 (Intel i8080 and Zilog Z80 CPU, 128k RAM). + +Application was loading from the RAM-drive at RAM address 0x0000. + +## Compile + +To compile sources, use [sjasmplus Z80 assembler](https://github.com/z00m128/sjasmplus). + diff --git a/equates.inc b/equates.inc index a97520d..db2e426 100644 --- a/equates.inc +++ b/equates.inc @@ -9,7 +9,7 @@ ; ASCII control codes supported by MONITOR v2 ; -------------------------------------------------- ASCII_NUL EQU 0x00 ; NUL (null) -ASCII_EOT EQU 0x04 ; EOT (End of transmission) +;ASCII_EOT EQU 0x04 ; EOT (End of transmission) ASCII_BELL EQU 0x07 ; 7 ASCII_BS EQU 0x08 ; Move cursor left ASCII_TAB EQU 0x09 ; HT (Horizontal tab) @@ -30,9 +30,10 @@ ASCII_BKSL EQU 0x5C ; \ AP2_KEY EQU 0x1B ; AP2 key CTRL_C EQU 0x03 -KEY_LEFT EQU 0x19 +KEY_LEFT EQU 0x08 KEY_RIGHT EQU 0x18 KEY_UP EQU 0x19 +KEY_DOWN EQU 0x1A ; Move cursor down @@ -186,8 +187,8 @@ LSTOPK EQU 7 NUMLEV EQU 19 ; num safe of levels on stack STRSIZ EQU 4 NUMTMP EQU 3 -BUFLEN EQU 37 ; but 130 = 0x82 can be used - +BUFLEN EQU 37 ; length of buffer by definition, but 130 = 0x82 can be used +COLUMNS EQU 64 ; screen columns SCR_ADDR EQU 0xC000 SCR_WIDTH EQU 384 diff --git a/main.asm b/main.asm index 2321421..6f4d94e 100644 --- a/main.asm +++ b/main.asm @@ -5454,7 +5454,7 @@ EDIT1: INLED: LD A, ASCII_LF RST OUTDO - LD A, KEY_LEFT + LD A, ASCII_EOM ; RST OUTDO XOR A LD (BUF_POS+1), A @@ -5462,15 +5462,15 @@ INLED: LD (OUTFLG), A CALL LISPTR CALL LPTSTAT - CALL GET_BUF_LEN + CALL GET_BUFLEN LD A, B - CP 'A' - 1 + CP COLUMNS JP C, EISALP CP 0x80 - LD A, KEY_LEFT + LD A, ASCII_EOM ; JP C, EPRNTBL RST OUTDO - LD A, KEY_UP + LD A, ASCII_EOM EPRNTBL: RST OUTDO EISALP: @@ -5642,10 +5642,8 @@ ED_POSCUR: ED_KEYCR: POP HL PUSH AF - CALL GET_BUF_LEN - -ED_KEYCR_CHK_LEN: - LD A, 63 + CALL GET_BUFLEN + LD A, COLUMNS - 1 CP B JP NC, NONXLN LD A, ASCII_LF @@ -5658,17 +5656,21 @@ NONXLN: RET ; -------------------------------------------------- -GET_BUF_LEN: +; Get length of key buffer +; Out: B - length +; HL -> tail of buffer +; -------------------------------------------------- +GET_BUFLEN: LD HL, BUFMIN ; = ',' XOR A LD B, A -BUF_LEN_LOOP: +.LOOP: INC HL INC B XOR A OR (HL) - JP NZ, BUF_LEN_LOOP + JP NZ, .LOOP RET ; -------------------------------------------------- @@ -5752,7 +5754,7 @@ APFLAG EQU $+1 LD HL, APFLAG LD (HL), AP2_KEY CALL MON_KBRD - CP AP2_KEY ; First time AP2 key pressed? + CP AP2_KEY ; First time AP2 key pressed? JP Z, IS_AP2 ; Yes, "Shortcut" mode ON CALL ISCTLKEY JP Z, DOCTLKEY