Цитата Сообщение от Shaos Посмотреть сообщение
ну вот тут извините-подвинтесь - это таки фича, а не баг
если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом
Не, не так.
При вводе с клавиатуры - да, в некоторых случаях обработка буфера начинается после нажатия на Enter.

А заканчивать строку переводом строки при выводе ваще не обязательно. Как и файл не обязан заканчиваться переводом строки или символом ^Z (EOF) - в этом случае type/cat выводит его до физического конца.

А вот при выводе промпта ведут себя шелы действительно по-разному:
- либо делают CR-LF перед промптом как например cmd.exe в Win/MSDOS:
Код:
C:\WINDOWS\system32>echo HELLO
HELLO

C:\WINDOWS\system32>
- либо не делают ни CR ни LF перед промптом, как например bash:
Код:
[centos8@cc1 ~]$ echo hello
hello
[centos8@cc1 ~]$ echo -n hello
hello[centos8@cc1 ~]$
В обоих случаях, они текст не затирают. А если делать один CR (или как достигается такой эффект) - то текст будет затираться.

Как бы там ни было, я таки вставил в том "спорном" месте перевод строки LF (0Ah). И тут же наступил на еще одну мину: часть текста (одиночные символы) я выводил через BIOS (т.к. поначалу была мысль все сделать через BIOS), и оказалось, что BIOS код 0Ah как перевод строки не воспринимает, а выводит "рожицу". То, что в BIOS не работает базовое управление кареткой, конечно было сюрпризом. Ну то есть это управление как-то зачаточно работает (следующий символ же таки печатается правее предыдущего, а не долбит в то же место), но на этом и всё. И пришлось все символы выводить через BDOS.

- - - Добавлено - - -

На всякий случай размещу тут же свой hello.mac. Как иллюстрацию (на что ссылаться) и для шпаргалки таким же начинающим

Скрытый текст


Код:
.Z80
ASEG
ORG      0100h
WORKADDR EQU     08100h
STACK    equ     buffer+512

;EXE-file header:
HEADER:
        DB       'EXE'          ; EXE Signature
        DB       0              ; Version of EXE file
        DW       CODE-HEADER,0  ; Code offset (32bit)
        DW       0              ; Primary loader size or 0 (no primary loader)
        DW       0,0,0          ; Reserved
        DW       LOAD           ; Loading address
        DW       START          ; Starting address (register PC)
        DW       STACK          ; Stack address (register SP)
        DS       490,0          ; round to 512
CODE:

.phase  WORKADDR

LOAD:
START:  push    ix              ; IX=cmdline ptr (START-80h)
        ld      hl,cmdln
        call    puts
        pop     de              ; cmdline=<length>< line>0000h<self>
        push    de
        call    hexde           ; display cmdline address (hex)
        ld      a,':'
        call    putchar
        pop     hl              ; hl=cmdline ptr
        inc     hl              ; skip <length> byte
        call    puts            ; display cmdline content
        ld      hl,pages
        call    puts
        xor     a               ; 0000..3fff
        call    cpupage         ; FB:82         ; display default page,xframe
        ld      a,1             ; 4000..7fff
        call    cpupage         ; FF:A2
        ld      a,2             ; 8000..bfff
        call    cpupage         ; F6:C2
        ld      a,3             ; c000..ffff
        call    cpupage         ; FF:E2
;
        ld      b,4
        ld      hl,hmem0
        call    alloc           ; allocate next 4 pages for 64kb TPA (page0..3)
        jr      c,cerr
        ld      hl,npages
        call    puts
        ld      hl,page0
        call    showpg          ; display page0, page1
        ld      hl,page2
        call    showpg          ; display page2, page3
;
        ld      hl,msg
        call    puts
;
; get BIOS version
        ld      c,0efh
        ld      hl,buffer       ; ASCIIZ returned here
        push    hl
        call    sbios
        push    af
        call    nc,hexde        ; if no error, DE = BIOS version number0
        call    space
        pop     af
        pop     hl              ; hl=buffer
        push    af
        call    nc,puts         ; if no error
        pop     af
cerr:   ld      hl,err          ; if error
        call    c,puts
;
        ld      a,10
        call    putchar         ; LF to move shell prompt line down
        call    inkey
;
        ld      b,4
        ld      hl,hmem0
        call    free            ; free page0..3
        jp      exit
;
cpupage:call    getcpupage
        jr      c,cerr
        call    hexbc
space:  ld      a,' '
        jp      putchar
;
showpg: ld      d,(hl)
        inc     hl
        inc     hl
        ld      e,(hl)
        call    hexde           ; display pageX, pageX+1
        jp      space
;
alloc:  push    bc              ; reserve by 1 page, r.B times, i.e. B*16 kb
        push    hl
        call    getmem1
        pop     hl
        jr      c,retc
        ld      (hl),a          ; store segment handle
        inc     hl
        push    hl
        call    getpage         ; decode handle to phis. pageN
        pop     hl
retc:   pop     bc
        ret     c
        ld      (hl),a          ; store pageN
        inc     hl
        djnz    alloc
        ret
;
free:   push    bc
        ld      a,(hl)
        or      a
        push    hl
        call    nz,freemem
        pop     hl
        inc     hl
        inc     hl
        pop     bc
        djnz    free
        ret
;
INCLUDE funcs
;
hmem0:  db      0
page0:  db      0
hmem1:  db      0
page1:  db      0
hmem2:  db      0
page2:  db      0
hmem3:  db      0
page3:  db      0
err:    db      "Error",0dh,0ah,0
cmdln:  db      0dh,0ah,"CommandLine params: ",0
pages:  db      0dh,0ah,0ah,"CPU 16kb default RAM pages:xframe(0,1,2,3): ",0
npages: db      0dh,0ah,0ah,"CPU 16kb reserved RAM pages(0,1,2,3): ",0
msg:    db      0dh,0ah,0ah,"Hello, world!",0dh,0ah,0ah,"Press any key..."
crlf:   db      0dh,0ah,0
buffer:
.dephase

END
[свернуть]


- - - Добавлено - - -

Используемые функции funcs.mac:

Скрытый текст


Код:
; Console stdout
;
; Print symbol through BDOS
;Input:
;  A - symbol
;  C - 5Bh
;
putchar:ld      c,5bh
sbdos:  jp      10h             ; TODO: BDOS call wrapper
;
; Print symbol through BIOS without attributes and control codes
;   inp: A=symbol
;
putc:   ld      b,1             ; put one symbol
putb:   ld      c,82h           ; put <B> symbols
sbios:  jp      8               ; TODO: BIOS call wraper
;
; Prints string
;   inp: HL=stringz
;
puts:   ld      c,5ch
        jr      sbdos
;
; Wait keypress (BDOS). Returns: see scankey except ZF
;
inkey:  ld      c,30h
        jr      sbdos
;
; SCANKEY (BDOS). Check the console for a recent keystroke
; Input:  C = 31h
; Output:
;   ZF=1 if no inputs, ZF=0 if key pressed
;   A = symbol code (ASCII code)
;   D = key code
;   C = keyboard mode,bits: 7=RusLat, 3=NumLock, 2=ScrollLock, 1=Insert, 0=CapsLock
;   B = shifts state, bits: 7=LShift, 6=RShift, 5=Ctrl, 4=Alt, 3=LCtrl, 2=LAlt, 1=RCtrl, 0=RAlt
;
scankey:ld      c,31h
        jr      sbdos
;
; Exit program
exit:   ld      c,41h
        jr      sbdos
;
; Memory management routines
;
;0C6h (198) EMM_FN6 Detect ports for CPU memory frames
;input:
;  C=0C6h
;  A - number of CPU memory frame - 0,1,2 or 3
;output:
;  CF=0 - no errors:
;      C - 8 bit address of CPU frame port
;      B - physical number of memory page which set to CPU frame
;  CF=1 - error - incorrect number of CPU frame
;
getcpupage:
        ld      c,0C6h
        jr      sbios
;
;3Dh (61) GETMEM (Allocate a memory block)
;Input:
;B - size of requred memory block in 16K pages
;C - 3Dh
;Output:
;A - error code, if CF=1
;A - memory block handle, if CF=0
;
getmem1:ld      b,1
getmem: ld      c,3Dh
        jr      sbdos
;
;3Eh (62) FREEMEM (Deallocate a memory block that was previously allocated by GETMEM)
;Input:
;A - memory block handle
;C - 3Eh
;Output:
;A - error code, if CF=1
;
freemem:ld      c,3Eh
        jr      sbdos
;
;0C4h (196) EMM_FN4 Get physical page number from the memory block by logic number
;input:
;  C=0C4h
;  A - handle of memory block
;  B - logic page number
;output:
;  CF=0 - A - physical page number
;  CF=1 - error:
;      A=0 - incorrect memory handle
;      A=255 - incorrect logic number (too big)
;
getpage:ld      bc,0C4h
        jr      sbios
;
; MISC
;
; hex output
;   Inp: BC
;
hexbc:  ld      d,b
        ld      e,c
;
;   Inp: DE
;
hexde:  ld      a,d
        call    houtF0
        ld      a,d
        call    hout0F
        ld      a,e
        call    houtF0
        ld      a,e
        jr      hout0F
;
houtF0: rrca
        rrca
        rrca
        rrca
hout0F: and     0fH
        add     a,'0'
        cp      '9'+1
        jr      c,hout
        add     a,7
hout:   push    de
        call    putchar
        pop     de
        ret
[свернуть]


- - - Добавлено - - -

Как видно из листинга, я использую пакет M80/L80 (классические от CP/M). Командник для сборки (собираю на Винде с этим эмулятором) asm.bat:

Скрытый текст


Код:
echo off
echo Compiling %1.MAC
cpm m80n %1,=%1
echo Linking %1.REL
cpm l80m %1,%1/n/e
echo Delete %1.REL
del %1.rel
del %1.exe
ren %1.com %1.exe
echo Completed %1.exe
echo on
[свернуть]


- - - Добавлено - - -

В листинге также присутствует резервирование 16к страниц (и отображение что выдала система).
Что интересного видно в этом процессе: системы выдает страницы от больших номеров к меньшим. В моем случае - F5..F2 (см. скриншот ниже). Насколько я понял, станицы F0..FF - это кэш. Т.е. тут по русскому народному принципу "кто раньше встал того и тапки" - "быструю память" получит тот процесс, который резервирует первым. Мораль: ресурсоёмкое надо планировать, и запускать первым. Т.к. требовать у системы конкретные страницы - нельзя, можно только просить (как тут уже кто-то схохмил).

- - - Добавлено - - -

Нажмите на изображение для увеличения. 

Название:	screenshot2.jpg 
Просмотров:	234 
Размер:	41.5 Кб 
ID:	76978Нажмите на изображение для увеличения. 

Название:	screenshot3.jpg 
Просмотров:	228 
Размер:	38.6 Кб 
ID:	76979

Еще из интересных "фич".
Я никак не использую управление атрибутами символов, прога работает так как ее выпульнул шелл.
Запускаю прогу 4 раза из тимплета ("стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер"). Два раза прога выводит текст белым по черному. И остальные разы эта же самая прога - зеленым по черному, "окрашиваясь в те цвета, в которые оно себя окрасило"(с)

Т.е. установку режимов похоже таки надо рекомендовать.
И возможно не только установку режимов, а похоже еще и контроль скролируемого, ибо тут явно что-то не то вырисовывается.

- - - Добавлено - - -

Цитата Сообщение от Sayman Посмотреть сообщение
страницу воткнуть можно 2мя способами - системный вызов (медленно) и "ручками" через порты (быстро) можно перед установкой нужной страницы, старое содержимое прочитать и запомнить. вообще, тпа тут такая штука, что если надо, то все 64кб тебе доступны. ведь выделенную страницу можно воткнуть в 0е окно. но, при выходе надо восстановить в ней системную страницу.
Медленно - это насколько медленно, и почему так считаешь? Если порядка пары сотен тактов, то это не страшно, КМК. Плата за системность (возможность правки логики в едином месте не меняя всех миллиардов спринтеровских программ). Врядли мне это понадобится делать интенсивно, так что если это не прямо ужас-ужас, то я голосую за функции BIOS/BDOS.

Цитата Сообщение от Sayman Посмотреть сообщение
по смещению -3 от комстроки есть ещё 3 переменные:
CMD line size(IX+0)
File handle for preloader(IX-3)
Memory handle(IX-2)
Level(IX-1)
А что здесь такое "Level" ?
А "File handle for preloader" означает ли что большой (очень) EXE-файл шеллом будет загружен не до конца (а насколько не до конца?) и некий встроенный в файл загрузчик его должен сам дозагрузить?

- - - Добавлено - - -

Вот еще такой момент.
Мне понравился хак ИванМака, когда чтобы вызвать BIOS, "накрытый" в окне 0000.3FFF другой страницей пользователя, в области 8h..0Eh кладется код "переключалки" и делая RST 8 в эту п\п, можно попадать в BIOS и обратно. Почему так же не сделано для BDOS (rst 10h)? Это архиудобно, КМК.

- - - Добавлено - - -

Вот оно:
Вызов BIOS из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна
располагаться такая программа:
Код:
        PUSH AF
        LD A,0
        OUT (07Ch),A    ; в этом месте вместо ОЗУ подключится ПЗУ биоса и
                        ; программа уйдет в него.
        POP AF          ; На эту команду происходит возврат при таком
                        ; вызове биоса.
        RET
; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить
; две команды XOR A и DI